Author Topic: ==={Challenge}===Find the ridge lines of sloped roof  (Read 106270 times)

0 Members and 1 Guest are viewing this topic.

MSTG007

  • Gator
  • Posts: 2601
  • I can't remeber what I already asked! I need help!
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #165 on: September 25, 2018, 07:42:18 AM »
Nice Job!
Civil3D 2020

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #166 on: September 25, 2018, 07:48:36 AM »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #167 on: October 01, 2018, 09:05:00 AM »
Variations on the same theme... Basically 2droof-final-new.lsp is now the same as 2droof-final-n-m-loop.lsp... I named new lisps by iteration priorities - so n is first which means that it iterates firstly, then m, and last loop... Based on those 3 variable that iterate over and over until process is finished there are 6 combinations... Still I leaved 2droof-final-new.lsp, but now it firstly looks for best loop and then process only that loop... There is also 2droof-final-new-looplst.lsp that looks for all best loops and then process them all - like shorter version of 2droof-final-n-m-loop.lsp... Also I made modifications to 2droof-final-quick.lsp - now it expects correct input combination and reports solution success percentage... All in all main code is unchanged - it still can't solve roof-ultimate-test.dwg... I tested loop=42 which was found by 2droof-final-new.lsp as best and success percentage was only 90/102 found closed ridges boundaries, so it's almost no need for calculations - loop=1, errn=0, errm=0 is 89/102 success... I think based on picture chlh_jd posted that he has something better as my output isn't the same as his, but I think that some new replies won't happen unless there is good will from him as an author...
So long for now from me - everything is in *.lsp form and hopefully you can make mods if you find some lacks in my interventions...
Regards, M.R.
« Last Edit: October 02, 2018, 07:56:58 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

pedroantonio

  • Guest
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #168 on: October 01, 2018, 10:08:21 AM »
Hi ribarm. I think that your code for the roofs is perfect. No one will use it for something so complicated like your example.  :-D

Nice job

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #169 on: October 01, 2018, 10:40:58 AM »
I had some mistake in 2droof-final-new.lsp and 2droof-final-new-looplst.lsp, so I reattached *.zip in my previous post... Actually roof-ultimate-test.dwg was tested on 42 loop and it did find best of that loop and that is errn=8 and errm=0... When you test it with 2droof-final-quick.lsp and input those parameters, solution success should be 99/102 with some lines crossing... So routines are good I think now - I just moved one paragraph just after (if (<= errm nnn) (progn ...) ... ) to the end of that progn... I think that with that quick fix it should output result correctly...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #170 on: October 01, 2018, 11:06:48 AM »
No that quick fix was wrong... Reattached *.zip, I think that now it's all fine...

[EDIT : One more reattach... Sorry, lack of concentration...]
« Last Edit: October 01, 2018, 11:55:05 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

pedroantonio

  • Guest
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #171 on: October 01, 2018, 12:14:08 PM »
You have 9 lisp routins. What lisp is the best to use ?

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #172 on: October 01, 2018, 01:02:57 PM »
You have 9 lisp routins. What lisp is the best to use ?

If you don't have time, then this order :
1. 2droof-final-quick.lsp
2. 2droof-final-new.lsp
3. 2droof-final-new-looplst.lsp - I would still avoid 3. and 4. - it's time consuming...
4. 2droof-final-n-m-loop.lsp - you don't know correct combination of errn, errm, loop so you have to wait until you get it, or if not possible until you get best combination of elapsed time...
4-9. other lisps are just variations - you don't know combination so you practically can't figure out which one is the best to apply...

If reference polyline is too complex like roof-ultimate-test.dwg, after 1. and 2., the best is to use my roof-mr-3dlines-convex+concave.vlx posted earlier on page 11...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #173 on: October 02, 2018, 07:27:54 AM »
Reattached *.zip, found again some mistakes...

M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ahsattarian

  • Newt
  • Posts: 112
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #174 on: December 29, 2020, 01:58:06 PM »
This is Modified of the lisps   :

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #175 on: January 03, 2021, 03:40:20 PM »
Here is one version I wrote, but it's somewhat quirky... The main problem with this is that it's too slow, but I hope it's good for studying... We'll be grateful if someone could improve it...

Regards, all the best, M.R.

Code - Auto/Visual Lisp: [Select]
  1. (defun c:2droof ( / unique mid clockwise-p LM:Inside-p processpla distp2t removesingles findipinterschilds processtxtipl process lw ti n pl tl tlo pla plaa ipl ipll ipldtl ipldtlo ip p1p2 tt t1 t2 a f lil txtipl tll d al iplo p pal fff ipp lipl dd ippp ipo )
  2.  
  3.   (defun unique ( l )
  4.     (if l (cons (car l) (unique (vl-remove-if '(lambda ( x ) (equal x (car l) 1e-6)) l))))
  5.   )
  6.  
  7.   (defun mid ( p1 p2 )
  8.     (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  9.   )
  10.  
  11.   (defun clockwise-p ( p1 p2 p3 )
  12.     (minusp (sin (- (angle p1 p3) (angle p1 p2))))
  13.   )
  14.  
  15.   (defun LM:Inside-p ( pt ent / unit v^v _GroupByNum fd1 fd2 par lst nrm obj tmp )
  16.  
  17.     (vl-load-com)
  18.  
  19.     (defun unit ( v / d )
  20.       (if (not (equal (setq d (distance '(0.0 0.0 0.0) v)) 0.0 1e-8))
  21.         (mapcar '(lambda ( x ) (/ x d)) v)
  22.       )
  23.     )
  24.  
  25.     (defun v^v ( u v )
  26.       (list
  27.         (- (* (cadr u) (caddr v)) (* (caddr u) (cadr v)))
  28.         (- (* (caddr u) (car v)) (* (car u) (caddr v)))
  29.         (- (* (car u) (cadr v)) (* (cadr u) (car v)))
  30.       )
  31.     )
  32.  
  33.     (defun _GroupByNum ( l n / r )
  34.       (if l
  35.         (cons (reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r)) (_GroupByNum l n))
  36.       )
  37.     )
  38.  
  39.     (if (= (type ent) 'VLA-OBJECT)
  40.       (setq obj ent
  41.             ent (vlax-vla-object->ename ent))
  42.       (setq obj (vlax-ename->vla-object ent))
  43.     )
  44.  
  45.     (if (vlax-curve-isplanar ent)
  46.       (progn
  47.         (setq fd1 (vlax-curve-getfirstderiv ent (setq par (vlax-curve-getstartparam ent))))
  48.         (while (or (equal fd1 (setq fd2 (vlax-curve-getfirstderiv ent (setq par (+ par 0.001)))) 1e-3) (null (setq nrm (unit (v^v fd1 fd2))))))
  49.         (setq lst
  50.           (_GroupByNum
  51.             (vlax-invoke
  52.               (setq tmp
  53.                 (vlax-ename->vla-object
  54.                   (entmakex
  55.                     (list
  56.                       (cons 0 "RAY")
  57.                       (cons 100 "AcDbEntity")
  58.                       (cons 100 "AcDbRay")
  59.                       (cons 10 pt)
  60.                       (cons 11 (trans '(1. 0. 0.) nrm 0))
  61.                     )
  62.                   )
  63.                 )
  64.               )
  65.               'IntersectWith obj acextendnone
  66.             ) 3
  67.           )
  68.         )
  69.         (vla-delete tmp)
  70.         ;; gile:
  71.         (and
  72.           lst
  73.           (not (vlax-curve-getparamatpoint ent pt))
  74.           (= 1 (rem (length (vl-remove-if (function (lambda ( p / pa p- p+ p0 )
  75.                                                       (setq pa (vlax-curve-getparamatpoint ent p))
  76.                                                       (and (setq p- (cond ((setq p- (vlax-curve-getPointatParam ent (- pa 1e-8)))
  77.                                                                            (trans p- 0 nrm)
  78.                                                                           )
  79.                                                                           ((trans (vlax-curve-getPointatParam ent (- (vlax-curve-getEndParam ent) 1e-8)) 0 nrm)
  80.                                                                           )
  81.                                                                     )
  82.                                                            )
  83.                                                            (setq p+ (cond ((setq p+ (vlax-curve-getPointatParam ent (+ pa 1e-8)))
  84.                                                                            (trans p+ 0 nrm)
  85.                                                                           )
  86.                                                                           ((trans (vlax-curve-getPointatParam ent (+ (vlax-curve-getStartParam ent) 1e-8)) 0 nrm)
  87.                                                                           )
  88.                                                                     )
  89.                                                            )
  90.                                                            (setq p0 (trans pt 0 nrm))
  91.                                                            (<= 0 (* (sin (angle p0 p-)) (sin (angle p0 p+)))) ;; LM Mod
  92.                                                       )
  93.                                                     )
  94.                                           ) lst
  95.                             )
  96.                     ) 2
  97.                )
  98.           )
  99.         )
  100.       )
  101.     )
  102.   )
  103.  
  104.   (defun processpla ( pla / ipl pla1 pla2 )
  105.     (setq pla1 pla)
  106.     (foreach p1 pla1
  107.       (setq pla2 (vl-remove p1 pla1))
  108.       (foreach p2 pla2
  109.         (setq ipl (cons (inters (car p1) (polar (car p1) (cadr p1) 1.0) (car p2) (polar (car p2) (cadr p2) 1.0) nil) ipl))
  110.       )
  111.     )
  112.     (setq ipl (vl-remove-if-not '(lambda ( p ) (LM:Inside-p p lw)) (vl-remove nil ipl)))
  113.   )
  114.  
  115.   (defun distp2t ( p tt )
  116.     (distance p (inters p (polar p (+ (angle (car tt) (cadr tt)) (* 0.5 pi)) 1.0) (car tt) (cadr tt) nil))
  117.   )
  118.  
  119.   (defun removesingles ( l / a )
  120.     (while (setq a (vl-some '(lambda ( x ) (if (= (1- (length l)) (length (vl-remove-if '(lambda ( y ) (equal x y 1e-6)) l))) x)) l))
  121.       (setq l (vl-remove a l))
  122.     )
  123.     l
  124.   )
  125.  
  126.   (defun findipinterschilds ( ip pla / pla1 pla2 r )
  127.     (setq pla1 pla)
  128.     (foreach p1 pla1
  129.       (setq pla2 (vl-remove p1 pla1))
  130.       (foreach p2 pla2
  131.         (if (equal ip (inters (car p1) (polar (car p1) (cadr p1) 1e+99) (car p2) (polar (car p2) (cadr p2) 1e+99) t) 1e-6)
  132.           (setq r (list p1 p2))
  133.         )
  134.       )
  135.     )
  136.     r
  137.   )
  138.  
  139.   (defun processtxtipl ( tl / ipl tl1 tl2 )
  140.     (setq tl1 tl)
  141.     (foreach t1 tl1
  142.       (setq tl2 (vl-remove t1 tl1))
  143.       (foreach t2 tl2
  144.         (setq ipl (cons (inters (car t1) (polar (car t1) (angle (car t1) (cadr t1)) 1.0) (car t2) (polar (car t2) (angle (car t2) (cadr t2)) 1.0) nil) ipl))
  145.       )
  146.     )
  147.     (setq ipl (vl-remove nil ipl))
  148.   )
  149.  
  150.   (defun process nil
  151.     (setq d (car (cadr (car (vl-member-if '(lambda ( x ) (equal (car x) ip 1e-6)) ipldtl)))))
  152.     (if (null d)
  153.       (setq d (car (cadr (car (vl-member-if '(lambda ( x ) (equal (car x) ip 1e-6)) ipldtlo)))))
  154.     )
  155.     (if ip
  156.       (setq p1p2 (findipinterschilds ip pla))
  157.       (setq p1p2 nil)
  158.     )
  159.     (setq f nil)
  160.     (if p1p2
  161.       (progn
  162.         (setq tt (vl-some '(lambda ( x ) (if (and (assoc (car x) p1p2) (assoc (cadr x) p1p2)) (progn (setq f t) x))) tl))
  163.         (if (or (vl-some '(lambda ( x ) (equal (distance ip (car (car p1p2))) (+ (distance ip x) (distance x (car (car p1p2)))) 1e-6)) (vl-remove (car (car p1p2)) (vl-remove ip (mapcar 'car ipldtl)))) (vl-some '(lambda ( x ) (equal (distance ip (car (cadr p1p2))) (+ (distance ip x) (distance x (car (cadr p1p2)))) 1e-6)) (vl-remove (car (cadr p1p2)) (vl-remove ip (mapcar 'car ipldtl)))))
  164.           (setq f nil)
  165.         )
  166.       )
  167.     )
  168.   )
  169.  
  170.   (setq lw (car (entsel)))
  171.   (setq ti (car (_vl-times)))
  172.   (setq n (cdr (assoc 90 (entget lw))))
  173.   (setq pl (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget lw))))
  174.   (setq tl (mapcar '(lambda ( a b ) (list a b)) pl (append (cdr pl) (list (car pl)))))
  175.   (setq tlo tl)
  176.   (setq pla (mapcar '(lambda ( p mp ) (list p (angle p mp))) pl (mapcar '(lambda ( a b ) (if (clockwise-p (car a) (car b) (cadr b)) (mid (polar (cadr a) (angle (cadr a) (car a)) -1.0) (polar (car b) (angle (car b) (cadr b)) -1.0)) (mid (polar (cadr a) (angle (cadr a) (car a)) 1.0) (polar (car b) (angle (car b) (cadr b)) 1.0)))) (cons (last tl) tl) tl)))
  177.   (setq plaa pla)
  178.   (while (> n 0)
  179.     (if (null ipll)
  180.       (setq ipl (processpla plaa))
  181.       (setq ipl (processpla pla))
  182.     )
  183.     (if (equal ipl iplo 1e-6)
  184.       (setq n 0)
  185.     )
  186.     (if fff
  187.       (progn
  188.         (setq pl (mapcar 'car pla))
  189.         (foreach x pl
  190.           (setq lil (cons (list x ip) lil))
  191.         )
  192.         (setq n 0)
  193.       )
  194.       (progn
  195.         (if (null ipll)
  196.           (progn
  197.             (setq ipldtlo (mapcar '(lambda ( p ) (list p (vl-sort (mapcar '(lambda ( tt ) (distp2t p tt)) tlo) '<))) ipl))
  198.             (setq ipldtlo (mapcar '(lambda ( x ) (list (car x) (removesingles (cadr x)))) ipldtlo))
  199.             (setq ipldtlo (vl-remove-if '(lambda ( x ) (< (- (length (cadr x)) (length (vl-remove-if '(lambda ( y ) (equal y (car (cadr x)) 1e-6)) (cadr x)))) 3)) ipldtlo))
  200.           )
  201.           (progn
  202.             (setq ipldtl (mapcar '(lambda ( p ) (list p (vl-sort (mapcar '(lambda ( tt ) (distp2t p tt)) tlo) '<))) ipl))
  203.             (setq ipldtl (mapcar '(lambda ( x ) (list (car x) (removesingles (cadr x)))) ipldtl))
  204.             (setq ipldtl (vl-remove-if '(lambda ( x ) (< (- (length (cadr x)) (length (vl-remove-if '(lambda ( y ) (equal y (car (cadr x)) 1e-6)) (cadr x)))) 3)) ipldtl))
  205.             (if ipll
  206.               (setq ipldtl (unique (vl-remove-if '(lambda ( x ) (vl-member-if '(lambda ( y ) (equal (car x) y 1e-6)) ipll)) ipldtl)))
  207.             )
  208.           )
  209.         )
  210.         (setq ipldtlo (vl-remove-if '(lambda ( x ) (vl-position (car x) ipll)) ipldtlo))
  211.         (setq ip (car (car (vl-sort ipldtlo '(lambda ( a b ) (< (car (cadr a)) (car (cadr b))))))))
  212.         (setq ipldtlo (vl-remove-if '(lambda ( x ) (equal (car x) ip 1e-6)) ipldtlo))
  213.         (setq d (car (cadr (car (vl-member-if '(lambda ( x ) (equal (car x) ip 1e-6)) ipldtlo)))))
  214.         (setq ipp nil dd nil ipo nil)
  215.         (if (progn (process) (not f))
  216.           (if ipll
  217.             (progn
  218.               (setq ipo ip)
  219.               (foreach y (reverse pal)
  220.                 (setq ipp (cons (vl-remove-if-not '(lambda ( x ) (vl-some '(lambda ( a ) (or (equal (rem (+ a pi) (* 2 pi)) (angle (car y) x) 1e-6) (equal a (angle (car y) x) 1e-6))) (cadr y))) (mapcar 'car (vl-sort ipldtl '(lambda ( a b ) (> (car (cadr a)) (car (cadr b))))))) ipp))
  221.               )
  222.               (setq dd 1e+99)
  223.               (mapcar '(lambda ( x y ) (if x (mapcar '(lambda ( xx ) (if (and (< (distance xx y) dd) (not (vl-some '(lambda ( a ) (vl-some '(lambda ( b ) (equal (distance xx a) (+ (distance xx b) (distance b a)) 1e-6)) (vl-remove xx (vl-remove a (append (mapcar 'car pal) (mapcar 'car ipldtl)))))) (vl-remove xx (append (mapcar 'car pal) (mapcar 'car ipldtl)))))) (setq dd (distance xx y) ip xx))) x))) ipp (mapcar 'car pal))
  224.             )
  225.           )
  226.         )
  227.         (if (equal ip ipo 1e-6)
  228.           (progn
  229.             (setq dd 1e+99)
  230.             (mapcar '(lambda ( x y ) (if x (mapcar '(lambda ( xx ) (if (< (distance xx y) dd) (setq dd (distance xx y) ip xx))) x))) ipp (mapcar 'car pal))
  231.           )
  232.         )
  233.         (if (vl-every '(lambda ( x ) (equal ip (inters (car (car pla)) (polar (car (car pla)) (cadr (car pla)) 1.0) (car x) (polar (car x) (cadr x) 1.0) nil) 1e-6)) (cdr pla))
  234.           (setq fff t)
  235.         )
  236.         (setq al nil a nil)
  237.         (process)
  238.         (if (and tt f)
  239.           (progn
  240.             (setq tl (vl-remove tt tl))
  241.             (setq n (1- n))
  242.           )
  243.         )
  244.         (if f
  245.           (progn
  246.             (setq t1 (vl-some '(lambda ( x ) (if (or (assoc (car x) (list (car p1p2))) (assoc (cadr x) (list (car p1p2)))) x)) tl))
  247.             (setq t2 (vl-some '(lambda ( x ) (if (or (assoc (car x) (list (cadr p1p2))) (assoc (cadr x) (list (cadr p1p2)))) x)) tl))
  248.           )
  249.           (setq t1 nil t2 nil)
  250.         )
  251.         (if ip
  252.           (setq ipll (cons ip ipll))
  253.         )
  254.         (if (and t1 t2)
  255.           (progn
  256.             (setq a (angle (inters (car t1) (cadr t1) (car t2) (cadr t2) nil) ip))
  257.             (if a
  258.               (progn
  259.                 (setq pla (cons (list ip a) pla))
  260.                 (setq pla (vl-remove (car p1p2) pla) pla (vl-remove (cadr p1p2) pla))
  261.                 (setq lil (cons (list (car (car p1p2)) ip) lil))
  262.                 (setq lil (cons (list (car (cadr p1p2)) ip) lil))
  263.                 (setq pal (cons (list ip (list a)) pal))
  264.               )
  265.             )
  266.           )
  267.           (if (and ip (null fff))
  268.             (progn
  269.               (setq lil (cons (list (car (car p1p2)) ip) lil))
  270.               (setq lil (cons (list (car (cadr p1p2)) ip) lil))
  271.               (if (setq p (vl-some '(lambda ( x ) (if (vl-position x plaa) x)) p1p2))
  272.                 (progn
  273.                   (setq n (1- n))
  274.                   (setq tll (vl-remove-if-not '(lambda ( x ) (vl-some '(lambda ( y ) (vl-member-if '(lambda ( z ) (equal z p 1e-6)) y)) x)) tlo))
  275.                   (setq tll (car (vl-remove-if-not '(lambda ( x ) (and (vl-member-if '(lambda ( y ) (equal y (car x) 1e-6)) (vl-remove nil (mapcar 'car lil))) (vl-member-if '(lambda ( y ) (equal y (cadr x) 1e-6)) (vl-remove nil (mapcar 'car lil))))) tll)))
  276.                   (setq tl (vl-remove tll tl))
  277.                 )
  278.               )
  279.               (setq tll (vl-remove-if-not '(lambda ( x ) (equal d (distp2t ip x) 1e-6)) tl))
  280.               (setq txtipl (processtxtipl tll))
  281.               (setq txtipl (vl-remove-if '(lambda ( x ) (vl-member-if '(lambda ( y ) (equal x y 1e-6)) pl)) txtipl))
  282.               (setq al (mapcar '(lambda ( p ) (angle p ip)) txtipl))
  283.               (setq al (vl-remove-if '(lambda ( x ) (vl-member-if '(lambda ( y ) (equal x (cadr y) 1e-6)) p1p2)) al))
  284.               (setq al (unique al))
  285.               (if al
  286.                 (progn
  287.                   (setq pla (append pla (mapcar '(lambda ( a ) (list ip a)) al)))
  288.                   (setq pal (cons (list ip al) pal))
  289.                 )
  290.               )
  291.               (setq pla (vl-remove (car p1p2) pla) pla (vl-remove (cadr p1p2) pla))
  292.             )
  293.           )
  294.         )
  295.       )
  296.     )
  297.     (setq iplo ipl)
  298.   )
  299.   (setq lil (vl-remove-if '(lambda ( x ) (equal (car x) (cadr x) 1e-6)) lil))
  300.   (setq lil (unique lil))
  301.   (setq lil (vl-remove-if '(lambda ( x ) (vl-some '(lambda ( y ) (null y)) x)) lil))
  302.   (setq lipl (apply 'append lil))
  303.   (setq lipl (unique (vl-remove-if '(lambda ( x ) (or (= (length (vl-remove x lipl)) (1- (length lipl))) (= (length (vl-remove x lipl)) (- (length lipl) 3)))) lipl)))
  304.   (if lipl
  305.     (setq lil (cons (list (car lipl) (cadr lipl)) lil))
  306.   )
  307.   (foreach li lil
  308.     (entmake (list '(0 . "LINE") (cons 10 (car li)) (cons 11 (cadr li))))
  309.   )
  310.   (prompt "\nElapsed time : ") (princ (rtos (- (car (_vl-times)) ti) 2 20)) (prompt " milliseconds...")
  311.   (princ)
  312. )
  313.  
« Last Edit: January 06, 2021, 09:18:07 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #176 on: January 05, 2021, 12:46:02 PM »
I've revised the code a little, but I see that no one is interested... It can't operate with orthogonal shapes, which are typical roof solutions, but it can do simple random polygons - concave+convex... It is horribly slow and it is incorrect with complex shapes like roof-ultimate.dwg I posted... I tested it and with that, but it took almost 4 hours on my slow PC and solution is not even close to existing routine by ch_lhjd... So don't test it until you're 100% sure it's fine...
In my observations, the main problem is finding "ip" point - here is tricky part of the code :

Code: [Select]
...
        (setq ipp nil dd nil ipo nil)
        (if (progn (process) (not f))
          (if ipll
            (progn
              (setq ipo ip)
              (foreach y (reverse pal)
                (setq ipp (cons (vl-remove-if-not '(lambda ( x ) (vl-some '(lambda ( a ) (or (equal (rem (+ a pi) (* 2 pi)) (angle (car y) x) 1e-6) (equal a (angle (car y) x) 1e-6))) (cadr y))) (mapcar 'car (vl-sort ipldtl '(lambda ( a b ) (> (car (cadr a)) (car (cadr b))))))) ipp))
              )
              (setq dd 1e+99)
              (mapcar '(lambda ( x y ) (if x (mapcar '(lambda ( xx ) (if (and (< (distance xx y) dd) (not (vl-some '(lambda ( a ) (vl-some '(lambda ( b ) (equal (distance xx a) (+ (distance xx b) (distance b a)) 1e-6)) (vl-remove xx (vl-remove a (append (mapcar 'car pal) (mapcar 'car ipldtl)))))) (vl-remove xx (append (mapcar 'car pal) (mapcar 'car ipldtl)))))) (setq dd (distance xx y) ip xx))) x))) ipp (mapcar 'car pal))
            )
          )
        )
        ;;;;; This portion that follows is crucial, but I can't discover how to get correct ip from list ipp - it may be that some of points from ipp are good and some are bad... ;;;;;;
        (if (equal ip ipo 1e-6)
          (progn
            (setq dd 1e+99)
            (mapcar '(lambda ( x y ) (if x (mapcar '(lambda ( xx ) (if (< (distance xx y) dd) (setq dd (distance xx y) ip xx))) x))) ipp (mapcar 'car pal))
          )
        )
...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #177 on: January 05, 2021, 05:07:15 PM »
I've changed a code once again just a little, and perhaps this is better, but I doubt...

Code: [Select]
...
        (if (equal ip ipo 1e-6)
          (progn
            (setq ipp (apply 'append ipp))
            (setq ipp (mapcar '(lambda ( p ) (list p (findipinterschilds p pla))) ipp))
            (setq ip (car (car (vl-sort ipp '(lambda ( a b ) (< (+ (distance (car a) (car (mapcar 'car (cadr a)))) (distance (car a) (cadr (mapcar 'car (cadr a))))) (+ (distance (car b) (car (mapcar 'car (cadr b)))) (distance (car b) (cadr (mapcar 'car (cadr b)))))))))))
          )
        )
...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #178 on: January 06, 2021, 12:00:33 AM »
Here is how my ultimate-test looks like after almost 5 hours of calculations...
So advice, don't test it on complex samples until algorithm is fully correct...

M.R.

« Last Edit: January 06, 2021, 01:20:51 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3264
  • Marko Ribar, architect
Re: ==={Challenge}===Find the ridge lines of sloped roof
« Reply #179 on: January 06, 2021, 04:19:01 AM »
I've optimized my version and now it's faster, but not very... At least I did what was possible and I could do...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:2droof ( / unique mid clockwise-p LM:Inside-p processpla distp2t removesingles findipinterschilds processtxtipl process _vl-position car-sort car-vl-member-if lw ti n pl tl tlo pla plaa ipl ipll ipldtl ipldtlo ip p1p2 tt t1 t2 a f lil txtipl tll d al iplo p pal fff ipp lipl dd ippp ipo )
  2.  
  3.   (defun unique ( l )
  4.     (if l (cons (car l) (unique (vl-remove-if (function (lambda ( x ) (equal x (car l) 1e-6))) l))))
  5.   )
  6.  
  7.   (defun mid ( p1 p2 )
  8.     (mapcar (function (lambda ( a b ) (/ (+ a b) 2.0))) p1 p2)
  9.   )
  10.  
  11.   (defun clockwise-p ( p1 p2 p3 )
  12.     (minusp (sin (- (angle p1 p3) (angle p1 p2))))
  13.   )
  14.  
  15.   (defun LM:Inside-p ( pt ent / unit v^v _GroupByNum fd1 fd2 par lst nrm obj tmp )
  16.  
  17.     (vl-load-com)
  18.  
  19.     (defun unit ( v / d )
  20.       (if (not (equal (setq d (distance '(0.0 0.0 0.0) v)) 0.0 1e-8))
  21.         (mapcar (function (lambda ( x ) (/ x d))) v)
  22.       )
  23.     )
  24.  
  25.     (defun v^v ( u v )
  26.       (list
  27.         (- (* (cadr u) (caddr v)) (* (caddr u) (cadr v)))
  28.         (- (* (caddr u) (car v)) (* (car u) (caddr v)))
  29.         (- (* (car u) (cadr v)) (* (cadr u) (car v)))
  30.       )
  31.     )
  32.  
  33.     (defun _GroupByNum ( l n / r )
  34.       (if l
  35.         (cons (reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r)) (_GroupByNum l n))
  36.       )
  37.     )
  38.  
  39.     (if (= (type ent) 'VLA-OBJECT)
  40.       (setq obj ent
  41.             ent (vlax-vla-object->ename ent))
  42.       (setq obj (vlax-ename->vla-object ent))
  43.     )
  44.  
  45.     (if (vlax-curve-isplanar ent)
  46.       (progn
  47.         (setq fd1 (vlax-curve-getfirstderiv ent (setq par (vlax-curve-getstartparam ent))))
  48.         (while (or (equal fd1 (setq fd2 (vlax-curve-getfirstderiv ent (setq par (+ par 0.001)))) 1e-3) (null (setq nrm (unit (v^v fd1 fd2))))))
  49.         (setq lst
  50.           (_GroupByNum
  51.             (vlax-invoke
  52.               (setq tmp
  53.                 (vlax-ename->vla-object
  54.                   (entmakex
  55.                     (list
  56.                       (cons 0 "RAY")
  57.                       (cons 100 "AcDbEntity")
  58.                       (cons 100 "AcDbRay")
  59.                       (cons 10 pt)
  60.                       (cons 11 (trans '(1. 0. 0.) nrm 0))
  61.                     )
  62.                   )
  63.                 )
  64.               )
  65.               'IntersectWith obj acextendnone
  66.             ) 3
  67.           )
  68.         )
  69.         (vla-delete tmp)
  70.         ;; gile:
  71.         (and
  72.           lst
  73.           (not (vlax-curve-getparamatpoint ent pt))
  74.           (= 1 (rem (length (vl-remove-if (function (lambda ( p / pa p- p+ p0 )
  75.                                                       (setq pa (vlax-curve-getparamatpoint ent p))
  76.                                                       (and (setq p- (cond ((setq p- (vlax-curve-getPointatParam ent (- pa 1e-8)))
  77.                                                                            (trans p- 0 nrm)
  78.                                                                           )
  79.                                                                           ((trans (vlax-curve-getPointatParam ent (- (vlax-curve-getEndParam ent) 1e-8)) 0 nrm)
  80.                                                                           )
  81.                                                                     )
  82.                                                            )
  83.                                                            (setq p+ (cond ((setq p+ (vlax-curve-getPointatParam ent (+ pa 1e-8)))
  84.                                                                            (trans p+ 0 nrm)
  85.                                                                           )
  86.                                                                           ((trans (vlax-curve-getPointatParam ent (+ (vlax-curve-getStartParam ent) 1e-8)) 0 nrm)
  87.                                                                           )
  88.                                                                     )
  89.                                                            )
  90.                                                            (setq p0 (trans pt 0 nrm))
  91.                                                            (<= 0 (* (sin (angle p0 p-)) (sin (angle p0 p+)))) ;; LM Mod
  92.                                                       )
  93.                                                     )
  94.                                           ) lst
  95.                             )
  96.                     ) 2
  97.                )
  98.           )
  99.         )
  100.       )
  101.     )
  102.   )
  103.  
  104.   (defun processpla ( pla / ipl pla1 pla2 )
  105.     (setq pla1 pla)
  106.     (foreach p1 pla1
  107.       (setq pla2 (vl-remove p1 pla1))
  108.       (foreach p2 pla2
  109.         (setq ipl (cons (inters (car p1) (polar (car p1) (cadr p1) 1.0) (car p2) (polar (car p2) (cadr p2) 1.0) nil) ipl))
  110.       )
  111.     )
  112.     (setq ipl (vl-remove-if-not (function (lambda ( p ) (LM:Inside-p p lw))) (vl-remove nil ipl)))
  113.   )
  114.  
  115.   (defun distp2t ( p tt )
  116.     (distance p (inters p (polar p (+ (angle (car tt) (cadr tt)) (* 0.5 pi)) 1.0) (car tt) (cadr tt) nil))
  117.   )
  118.  
  119.   (defun removesingles ( l / a )
  120.     (while (setq a (vl-some (function (lambda ( x ) (if (= (1- (length l)) (length (vl-remove-if (function (lambda ( y ) (equal x y 1e-6))) l))) x))) l))
  121.       (setq l (vl-remove a l))
  122.     )
  123.     l
  124.   )
  125.  
  126.   (defun findipinterschilds ( ip pla / pla1 pla2 r )
  127.     (setq pla1 pla)
  128.     (foreach p1 pla1
  129.       (setq pla2 (vl-remove p1 pla1))
  130.       (foreach p2 pla2
  131.         (if (equal ip (inters (car p1) (polar (car p1) (cadr p1) 1e+99) (car p2) (polar (car p2) (cadr p2) 1e+99) t) 1e-6)
  132.           (setq r (list p1 p2))
  133.         )
  134.       )
  135.     )
  136.     r
  137.   )
  138.  
  139.   (defun processtxtipl ( tl / ipl tl1 tl2 )
  140.     (setq tl1 tl)
  141.     (foreach t1 tl1
  142.       (setq tl2 (vl-remove t1 tl1))
  143.       (foreach t2 tl2
  144.         (setq ipl (cons (inters (car t1) (polar (car t1) (angle (car t1) (cadr t1)) 1.0) (car t2) (polar (car t2) (angle (car t2) (cadr t2)) 1.0) nil) ipl))
  145.       )
  146.     )
  147.     (setq ipl (vl-remove nil ipl))
  148.   )
  149.  
  150.   (defun process nil
  151.     (setq d (car (cadr (car-vl-member-if (function (lambda ( x ) (equal (car x) ip 1e-6))) ipldtl))))
  152.     (if (null d)
  153.       (setq d (car (cadr (car-vl-member-if (function (lambda ( x ) (equal (car x) ip 1e-6))) ipldtlo))))
  154.     )
  155.     (if ip
  156.       (setq p1p2 (findipinterschilds ip pla))
  157.       (setq p1p2 nil)
  158.     )
  159.     (setq f nil)
  160.     (if p1p2
  161.       (progn
  162.         (setq tt (vl-some (function (lambda ( x ) (if (and (assoc (car x) p1p2) (assoc (cadr x) p1p2)) (progn (setq f t) x)))) tl))
  163.         (if (or (vl-some (function (lambda ( x ) (equal (distance ip (car (car p1p2))) (+ (distance ip x) (distance x (car (car p1p2)))) 1e-6))) (vl-remove-if (function (lambda ( x ) (equal x (car (car p1p2)) 1e-6))) (vl-remove-if (function (lambda ( x ) (equal x ip 1e-6))) (mapcar (function car) ipldtl)))) (vl-some (function (lambda ( x ) (equal (distance ip (car (cadr p1p2))) (+ (distance ip x) (distance x (car (cadr p1p2)))) 1e-6))) (vl-remove-if (function (lambda ( x ) (equal x (car (cadr p1p2)) 1e-6))) (vl-remove-if (function (lambda ( x ) (equal x ip 1e-6))) (mapcar (function car) ipldtl)))))
  164.           (setq f nil)
  165.         )
  166.       )
  167.     )
  168.   )
  169.  
  170.   (defun _vl-position ( e l tol / car-vl-member-if )
  171.     (defun car-vl-member-if ( f l / ff r )
  172.       (setq ff (function (lambda ( x ) (if (apply f (list x)) (setq r x)))))
  173.       (vl-some ff l)
  174.       r
  175.     )
  176.     (vl-position (car-vl-member-if (function (lambda ( x ) (equal e x tol))) l) l)
  177.   )
  178.  
  179.   (defun car-sort ( lst cmp / rtn )
  180.     (setq rtn (car lst))
  181.     (foreach itm (cdr lst)
  182.       (if (apply cmp (list itm rtn))
  183.         (setq rtn itm)
  184.       )
  185.     )
  186.     rtn
  187.   )
  188.  
  189.   (defun car-vl-member-if ( f l / ff r )
  190.     (setq ff (function (lambda ( x ) (if (apply f (list x)) (setq r x)))))
  191.     (vl-some ff l)
  192.     r
  193.   )
  194.  
  195.  
  196. ;;; main 2droof ;;;
  197.  
  198.   (setq lw (car (entsel "\nPick a closed polygon : ")))
  199.   (setq ti (car (_vl-times)))
  200.   (setq n (cdr (assoc 90 (entget lw))))
  201.   (setq pl (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  202.   (setq tl (mapcar (function (lambda ( a b ) (list a b))) pl (append (cdr pl) (list (car pl)))))
  203.   (setq tlo tl)
  204.   (setq pla (mapcar (function (lambda ( p mp ) (list p (angle p mp)))) pl (mapcar (function (lambda ( a b ) (if (clockwise-p (car a) (car b) (cadr b)) (mid (polar (cadr a) (angle (cadr a) (car a)) -1.0) (polar (car b) (angle (car b) (cadr b)) -1.0)) (mid (polar (cadr a) (angle (cadr a) (car a)) 1.0) (polar (car b) (angle (car b) (cadr b)) 1.0))))) (cons (last tl) tl) tl)))
  205.   (setq plaa pla)
  206.   (while (> n 0)
  207.     (if (null ipll)
  208.       (setq ipl (processpla plaa))
  209.       (setq ipl (processpla pla))
  210.     )
  211.     (if (equal ipl iplo 1e-6)
  212.       (setq n 0)
  213.     )
  214.     (if fff
  215.       (progn
  216.         (setq pl (mapcar (function car) pla))
  217.         (foreach x pl
  218.           (setq lil (cons (list x ip) lil))
  219.         )
  220.         (setq n 0)
  221.       )
  222.       (progn
  223.         (if (null ipll)
  224.           (progn
  225.             (setq ipldtlo (mapcar (function (lambda ( p ) (list p (vl-sort (mapcar (function (lambda ( tt ) (distp2t p tt))) tlo) (function <))))) ipl))
  226.             (setq ipldtlo (mapcar (function (lambda ( x ) (list (car x) (removesingles (cadr x))))) ipldtlo))
  227.             (setq ipldtlo (vl-remove-if (function (lambda ( x ) (< (- (length (cadr x)) (length (vl-remove-if (function (lambda ( y ) (equal y (car (cadr x)) 1e-6))) (cadr x)))) 3))) ipldtlo))
  228.           )
  229.           (progn
  230.             (setq ipldtl (mapcar (function (lambda ( p ) (list p (vl-sort (mapcar (function (lambda ( tt ) (distp2t p tt))) tlo) (function <))))) ipl))
  231.             (setq ipldtl (mapcar (function (lambda ( x ) (list (car x) (removesingles (cadr x))))) ipldtl))
  232.             (setq ipldtl (vl-remove-if (function (lambda ( x ) (< (- (length (cadr x)) (length (vl-remove-if (function (lambda ( y ) (equal y (car (cadr x)) 1e-6))) (cadr x)))) 3))) ipldtl))
  233.             (if ipll
  234.               (setq ipldtl (unique (vl-remove-if (function (lambda ( x ) (_vl-position (car x) ipll 1e-6))) ipldtl)))
  235.             )
  236.           )
  237.         )
  238.         (setq ipldtlo (vl-remove-if (function (lambda ( x ) (vl-position (car x) ipll))) ipldtlo))
  239.         (setq ip (car (car-sort ipldtlo (function (lambda ( a b ) (< (car (cadr a)) (car (cadr b))))))))
  240.         (setq ipldtlo (vl-remove-if (function (lambda ( x ) (equal (car x) ip 1e-6))) ipldtlo))
  241.         (setq d (car (cadr (car-vl-member-if (function (lambda ( x ) (equal (car x) ip 1e-6))) ipldtlo))))
  242.         (setq ipp nil dd nil ipo nil)
  243.         (if (progn (process) (not f))
  244.           (if ipll
  245.             (progn
  246.               (setq ipo ip)
  247.               (foreach y (reverse pal)
  248.                 (setq ipp (cons (vl-remove-if-not (function (lambda ( x ) (vl-some (function (lambda ( a ) (or (equal (rem (+ a pi) (* 2 pi)) (angle (car y) x) 1e-6) (equal a (angle (car y) x) 1e-6)))) (cadr y)))) (mapcar (function car) (vl-sort ipldtl (function (lambda ( a b ) (> (car (cadr a)) (car (cadr b)))))))) ipp))
  249.               )
  250.               (setq dd 1e+99)
  251.               (mapcar (function (lambda ( x y ) (if x (mapcar (function (lambda ( xx ) (if (and (< (distance xx y) dd) (not (vl-some (function (lambda ( a ) (vl-some (function (lambda ( b ) (equal (distance xx a) (+ (distance xx b) (distance b a)) 1e-6))) (vl-remove xx (vl-remove a (append (mapcar (function car) pal) (mapcar (function car) ipldtl))))))) (vl-remove xx (append (mapcar (function car) pal) (mapcar (function car) ipldtl)))))) (setq dd (distance xx y) ip xx)))) x)))) ipp (mapcar (function car) pal))
  252.             )
  253.           )
  254.         )
  255.         (if (equal ip ipo 1e-6)
  256.           (progn
  257.             (setq ipp (apply (function append) ipp))
  258.             (setq ipp (mapcar (function (lambda ( p ) (list p (findipinterschilds p pla)))) ipp))
  259.             (setq ip (car (car-sort ipp (function (lambda ( a b ) (< (+ (distance (car a) (car (mapcar (function car) (cadr a)))) (distance (car a) (cadr (mapcar (function car) (cadr a))))) (+ (distance (car b) (car (mapcar (function car) (cadr b)))) (distance (car b) (cadr (mapcar (function car) (cadr b)))))))))))
  260.           )
  261.         )
  262.         (if (vl-every (function (lambda ( x ) (equal ip (inters (car (car pla)) (polar (car (car pla)) (cadr (car pla)) 1.0) (car x) (polar (car x) (cadr x) 1.0) nil) 1e-6))) (cdr pla))
  263.           (setq fff t)
  264.         )
  265.         (setq al nil a nil)
  266.         (process)
  267.         (if (null p1p2)
  268.           (setq ip nil)
  269.         )
  270.         (if (and tt f)
  271.           (progn
  272.             (setq tl (vl-remove tt tl))
  273.             (setq n (1- n))
  274.           )
  275.         )
  276.         (if f
  277.           (progn
  278.             (setq t1 (vl-some (function (lambda ( x ) (if (or (assoc (car x) (list (car p1p2))) (assoc (cadr x) (list (car p1p2)))) x))) tl))
  279.             (setq t2 (vl-some (function (lambda ( x ) (if (or (assoc (car x) (list (cadr p1p2))) (assoc (cadr x) (list (cadr p1p2)))) x))) tl))
  280.           )
  281.           (setq t1 nil t2 nil)
  282.         )
  283.         (if ip
  284.           (setq ipll (cons ip ipll))
  285.         )
  286.         (if (and t1 t2 ip)
  287.           (progn
  288.             (setq a (angle (inters (car t1) (cadr t1) (car t2) (cadr t2) nil) ip))
  289.             (if a
  290.               (progn
  291.                 (setq pla (cons (list ip a) pla))
  292.                 (setq pla (vl-remove (car p1p2) pla) pla (vl-remove (cadr p1p2) pla))
  293.                 (setq lil (cons (list (car (car p1p2)) ip) lil))
  294.                 (setq lil (cons (list (car (cadr p1p2)) ip) lil))
  295.                 (setq pal (cons (list ip (list a)) pal))
  296.               )
  297.             )
  298.           )
  299.           (if (and ip (null fff))
  300.             (progn
  301.               (setq lil (cons (list (car (car p1p2)) ip) lil))
  302.               (setq lil (cons (list (car (cadr p1p2)) ip) lil))
  303.               (if (setq p (vl-some (function (lambda ( x ) (if (vl-position x plaa) x))) p1p2))
  304.                 (progn
  305.                   (setq n (1- n))
  306.                   (setq tll (vl-remove-if-not (function (lambda ( x ) (vl-some (function (lambda ( y ) (_vl-position p y 1e-6))) x))) tlo))
  307.                   (setq tll (car (vl-remove-if-not (function (lambda ( x ) (and (_vl-position (car x) (vl-remove nil (mapcar (function car) lil)) 1e-6) (_vl-position (cadr x) (vl-remove nil (mapcar (function car) lil)) 1e-6)))) tll)))
  308.                   (setq tl (vl-remove tll tl))
  309.                 )
  310.               )
  311.               (setq tll (vl-remove-if-not (function (lambda ( x ) (equal d (distp2t ip x) 1e-6))) tl))
  312.               (setq txtipl (processtxtipl tll))
  313.               (setq txtipl (vl-remove-if (function (lambda ( x ) (_vl-position x pl 1e-6))) txtipl))
  314.               (setq al (mapcar (function (lambda ( p ) (angle p ip))) txtipl))
  315.               (setq al (vl-remove-if (function (lambda ( x ) (_vl-position x (mapcar (function cadr) p1p2) 1e-6))) al))
  316.               (setq al (unique al))
  317.               (if al
  318.                 (progn
  319.                   (setq pla (append pla (mapcar (function (lambda ( a ) (list ip a))) al)))
  320.                   (setq pal (cons (list ip al) pal))
  321.                 )
  322.               )
  323.               (setq pla (vl-remove (car p1p2) pla) pla (vl-remove (cadr p1p2) pla))
  324.             )
  325.           )
  326.         )
  327.       )
  328.     )
  329.     (setq iplo ipl)
  330.   )
  331.   (setq lil (vl-remove-if (function (lambda ( x ) (equal (car x) (cadr x) 1e-6))) lil))
  332.   (setq lil (unique lil))
  333.   (setq lil (vl-remove-if (function (lambda ( x ) (vl-some (function (lambda ( y ) (null y))) x))) lil))
  334.   (setq lipl (apply (function append) lil))
  335.   (setq lipl (unique (vl-remove-if (function (lambda ( x ) (or (= (length (vl-remove x lipl)) (1- (length lipl))) (= (length (vl-remove x lipl)) (- (length lipl) 3))))) lipl)))
  336.   (if lipl
  337.     (setq lil (cons (list (car lipl) (cadr lipl)) lil))
  338.   )
  339.   (foreach li lil
  340.     (entmake (list '(0 . "LINE") (cons 10 (car li)) (cons 11 (cadr li))))
  341.   )
  342.   (prompt "\nElapsed time : ") (princ (rtos (- (car (_vl-times)) ti) 2 20)) (prompt " milliseconds...")
  343.   (princ)
  344. )
  345.  
« Last Edit: January 06, 2021, 09:14:08 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube