Author Topic: ==={Challenge}=== Broken Pieces  (Read 18049 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #45 on: July 06, 2013, 11:26:15 AM »
Also, if I may put remark... Evgeniy and Lee's intervention to the code didn't include the case in witch plines are drawn in reverse direction, so if all distances and edges are different this should work in any situation :

Code - Auto/Visual Lisp: [Select]
  1. (defun c:jigsaw ( / LM:ListClockwise-p a a1 a2 b d e i l s v v1 x y )
  2.  
  3.     (vl-load-com)
  4.  
  5.     (defun LM:ListClockwise-p ( lst )
  6.       (minusp
  7.         (apply '+
  8.           (mapcar
  9.             (function
  10.               (lambda ( a b )
  11.                 (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  12.               )
  13.             ) lst (cons (last lst) lst)
  14.           )
  15.         )
  16.       )
  17.     )
  18.  
  19.     (if (setq s (ssget "_:L" '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))))
  20.        (progn
  21.            (repeat (setq i (sslength s))
  22.                (setq e (ssname s (setq i (1- i)))
  23.                      v (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e)))
  24.                )
  25.                (if (LM:ListClockwise-p v)
  26.                    (progn
  27.                       (command "_.reverse" e "")
  28.                       (setq v (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
  29.                    )
  30.                )
  31.                (setq l (cons (cons (vlax-ename->vla-object e) (mapcar 'list v (cons (last v) v))) l))
  32.            )
  33.            (setq a (list (car l))
  34.                  l (cdr l)
  35.            )
  36.            (while (and (setq b (car a)) l)
  37.                (setq v (mapcar '- (cadadr b) (caadr b)))
  38.                (foreach c l
  39.                    (if (setq d (car (vl-member-if '(lambda ( x ) (equal v (mapcar '- (car x) (cadr x)) 1e-6)) (cdr c))))
  40.                        (progn
  41.                            (setq a2 (assoc (car c) l)
  42.                                  v1 (mapcar '- (cadr d) (caadr b))
  43.                                  a1 (cons (cons (car c) (mapcar '(lambda ( x ) (mapcar '(lambda ( y ) (mapcar '- y v1)) x)) (vl-remove d (cdr a2)))) a1)
  44.                                   l (vl-remove a2 l)
  45.                            )
  46.                            (vla-move (car c) (vlax-3D-point (cadr d)) (vlax-3D-point (caadr b)))
  47.                        )
  48.                    )
  49.                )
  50.                (setq a (append (if (cddar a) (cons (cons (car a) (cddar a)) (cdr a)) (cdr a)) a1)
  51.                      a1 nil
  52.                )
  53.            )
  54.        )
  55.    )
  56.    (princ)
  57. )
  58.  

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

:)

M.R. on Youtube

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: ==={Challenge}=== Broken Pieces
« Reply #46 on: July 06, 2013, 12:51:31 PM »
There is no need to reverse & modify the source objects; this should suffice:

Code - Auto/Visual Lisp: [Select]
  1. (defun c:test ( / a a1 a2 b d e i l p s v w x y )
  2.     (if (setq s (ssget "_:L" '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))))
  3.         (progn
  4.             (repeat (setq i (sslength s))
  5.                 (setq e (ssname s (setq i (1- i)))
  6.                       v (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e)))
  7.                       l (cons (cons (vlax-ename->vla-object e) (mapcar 'list v (cons (last v) v))) l)
  8.                 )
  9.             )
  10.             (setq a (list (car l))
  11.                   l (cdr l)
  12.             )
  13.             (while (and (setq b (car a)) l)
  14.                 (setq v (mapcar '- (cadadr b) (caadr b)))
  15.                 (foreach c l
  16.                     (if (setq d
  17.                             (vl-member-if
  18.                                '(lambda ( x )
  19.                                     (cond ((equal v (mapcar '- (car x) (cadr x)) 1e-6) (setq p (cadr x)))
  20.                                           ((equal v (mapcar '- (cadr x) (car x)) 1e-6) (setq p (car  x)))
  21.                                     )
  22.                                 )
  23.                                 (cdr c)
  24.                             )
  25.                         )
  26.                         (progn
  27.                             (setq a2 (assoc (car c) l)
  28.                                    w (mapcar '- p (caadr b))
  29.                                   a1 (cons (cons (car c) (mapcar '(lambda ( x ) (mapcar '(lambda ( y ) (mapcar '- y w)) x)) (vl-remove d (cdr a2)))) a1)
  30.                                    l (vl-remove a2 l)
  31.                             )
  32.                             (vla-move (car c) (vlax-3D-point p) (vlax-3D-point (caadr b)))
  33.                         )
  34.                     )
  35.                 )
  36.                 (setq a (append (if (cddar a) (cons (cons (car a) (cddar a)) (cdr a)) (cdr a)) a1)
  37.                       a1 nil
  38.                 )
  39.             )
  40.         )
  41.     )
  42.     (princ)
  43. )

fixo

  • Guest
Re: ==={Challenge}=== Broken Pieces
« Reply #47 on: July 06, 2013, 01:17:02 PM »

The above will put together the shapes.-
Thanks LE, it's working good through A2010-14
with small changes per release
Regards,

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #48 on: July 06, 2013, 05:02:45 PM »
There is no need to reverse & modify the source objects; this should suffice:

Code - Auto/Visual Lisp: [Select]
  1. (defun c:test ( / a a1 a2 b d e i l p s v w x y )

Look Lee, I see that you really want to solve this code to be as short as possible, but test it on attached example... Your previous code was correct, only necessity was reversing of plines... In case CAD doesn't support (command "_.reverse"), Evgeniy solved this for LWPOLYLINE in sub-function (rlw)... Your new code fails here, and in case of preserving reversion, we can always build list of entities that were reversed and in the end reverse them back as they were before execution of routine...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:jigsaw ( / LM:ListClockwise-p rlw el a a1 a2 b d e i l s v v1 x y )
  2.  
  3.     (vl-load-com)
  4.  
  5.     (defun LM:ListClockwise-p ( lst )
  6.       (minusp
  7.         (apply '+
  8.           (mapcar
  9.             (function
  10.               (lambda ( a b )
  11.                 (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  12.               )
  13.             ) lst (cons (last lst) lst)
  14.           )
  15.         )
  16.       )
  17.     )
  18.  
  19.     (defun rlw ( LW / E X1 X2 X3 X4 X5 X6 )
  20.         ;; by ElpanovEvgeniy
  21.         ;; reverse lwpolyline
  22.         (if (= (cdr (assoc 0 (setq e (entget lw)))) "LWPOLYLINE")
  23.             (progn
  24.                 (foreach a1 e
  25.                     (cond ((= (car a1) 10) (setq x2 (cons a1 x2)))
  26.                           ((= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)))
  27.                           ((= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)))
  28.                           ((= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)))
  29.                           ((= (car a1) 210) (setq x6 (cons a1 x6)))
  30.                           (t (setq x1 (cons a1 x1)))
  31.                     )
  32.                 )
  33.                 (entmod
  34.                     (append
  35.                         (reverse x1)
  36.                             (append
  37.                                 (apply
  38.                                     (function append)
  39.                                         (apply
  40.                                             (function mapcar)
  41.                                                 (cons 'list
  42.                                                     (list x2
  43.                                                         (cdr (reverse (cons (car x3) (reverse x3))))
  44.                                                         (cdr (reverse (cons (car x4) (reverse x4))))
  45.                                                         (cdr (reverse (cons (car x5) (reverse x5))))
  46.                                                     )
  47.                                                 )
  48.                                         )
  49.                                 )
  50.                                 x6
  51.                             )
  52.                     )
  53.                 )
  54.                 (entupd lw)
  55.             )
  56.         )
  57.     )
  58.  
  59.     (if (setq s (ssget "_:L" '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))))
  60.         (progn
  61.             (repeat (setq i (sslength s))
  62.                 (setq e (ssname s (setq i (1- i)))
  63.                       v (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e)))
  64.                 )
  65.                 (if (LM:ListClockwise-p v)
  66.                     (progn
  67.                        (rlw e)
  68.                        (setq el (cons e el))
  69.                        (setq v (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
  70.                     )
  71.                 )
  72.                 (setq l (cons (cons (vlax-ename->vla-object e) (mapcar 'list v (cons (last v) v))) l))
  73.             )
  74.             (setq a (list (car l))
  75.                   l (cdr l)
  76.             )
  77.             (while (and (setq b (car a)) l)
  78.                 (setq v (mapcar '- (cadadr b) (caadr b)))
  79.                 (foreach c l
  80.                     (if (setq d (car (vl-member-if '(lambda ( x ) (equal v (mapcar '- (car x) (cadr x)) 1e-6)) (cdr c))))
  81.                         (progn
  82.                             (setq a2 (assoc (car c) l)
  83.                                   v1 (mapcar '- (cadr d) (caadr b))
  84.                                   a1 (cons (cons (car c) (mapcar '(lambda ( x ) (mapcar '(lambda ( y ) (mapcar '- y v1)) x)) (vl-remove d (cdr a2)))) a1)
  85.                                    l (vl-remove a2 l)
  86.                             )
  87.                             (vla-move (car c) (vlax-3D-point (cadr d)) (vlax-3D-point (caadr b)))
  88.                         )
  89.                     )
  90.                 )
  91.                 (setq a (append (if (cddar a) (cons (cons (car a) (cddar a)) (cdr a)) (cdr a)) a1)
  92.                       a1 nil
  93.                 )
  94.             )
  95.         )
  96.     )
  97.    
  98.     (foreach e el
  99.         (rlw e)
  100.     )
  101.    
  102.     (princ)
  103. )
  104.  

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

:)

M.R. on Youtube

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: ==={Challenge}=== Broken Pieces
« Reply #49 on: July 07, 2013, 06:39:05 AM »
The issue is due to multiple pieces having edges of the same length - this is an obvious restriction of the algorithm implemented in both Evgeniy's & my code and was stated earlier in the thread.

Even if all LWPolylines have the same direction, the method used by the program still has the potential to return incorrect results if more than two edges have the same 'edge' vector, hence your proposed modifcations will also fail for these cases.
« Last Edit: July 07, 2013, 06:43:55 AM by Lee Mac »

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #50 on: July 07, 2013, 08:51:47 AM »
The issue is due to multiple pieces having edges of the same length - this is an obvious restriction of the algorithm implemented in both Evgeniy's & my code and was stated earlier in the thread.

Even if all LWPolylines have the same direction, the method used by the program still has the potential to return incorrect results if more than two edges have the same 'edge' vector, hence your proposed modifcations will also fail for these cases.

I know limitations ab distances and equal vectors, but why then on my attached dwg, my version works fine, and your fails?
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #51 on: July 07, 2013, 09:03:11 AM »
The issue is due to multiple pieces having edges of the same length - this is an obvious restriction of the algorithm implemented in both Evgeniy's & my code and was stated earlier in the thread.

Even if all LWPolylines have the same direction, the method used by the program still has the potential to return incorrect results if more than two edges have the same 'edge' vector, hence your proposed modifcations will also fail for these cases.

I know limitations ab distances and equal vectors, but why then on my attached dwg, my version works fine, and your fails?

Yes, Lee, I suppose you're right... My example has 2 edges that are the same distance and angle as 2 edges of next two pieces and 2 edges of pieces that should compose rectangle with different pieces... So this is really bad example... Never mind, I suppose both versions should work in other situation where all edges are different...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

LE3

  • Guest
Re: ==={Challenge}=== Broken Pieces
« Reply #52 on: July 07, 2013, 03:17:19 PM »
Thanks LE, it's working good through A2010-14
with small changes per release
Regards,
I am glad you tried - Thanks Oleg !

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #53 on: February 13, 2023, 08:07:24 AM »
I want to revive this topic as I've coded something likewise jigsaw... Still, not 100% sure it would be bullet proof, but here is it...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:jigsaw-ortho ( / *error* listclockwise-p rlw jigsaw s ss i lws orth chk )
  2.  
  3.  
  4.   (defun *error* ( m )
  5.     (if (= 8 (logand 8 (getvar (quote undoctl))))
  6.       (if command-s
  7.         (command-s "_.UNDO" "_E")
  8.         (vl-cmdf "_.UNDO" "_E")
  9.       )
  10.     )
  11.     (if m
  12.       (prompt m)
  13.     )
  14.     (princ)
  15.   )
  16.  
  17.   (defun listclockwise-p ( lst )
  18.     ;; by Lee Mac
  19.     (minusp
  20.       (apply (function +)
  21.         (mapcar
  22.           (function (lambda ( a b )
  23.             (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  24.           ))
  25.           lst
  26.           (cons (last lst) lst)
  27.         )
  28.       )
  29.     )
  30.   )
  31.  
  32.   (defun rlw ( lw / e x1 x2 x3 x4 x5 x6 )
  33.     ;; by Elpanov Evgeniy
  34.     (if (= (cdr (assoc 0 (setq e (entget lw)))) "LWPOLYLINE")
  35.       (progn
  36.         (foreach a1 e
  37.           (cond
  38.             ( (= (car a1) 10) (setq x2 (cons a1 x2)) )
  39.             ( (= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)) )
  40.             ( (= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)) )
  41.             ( (= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)) )
  42.             ( (= (car a1) 210) (setq x6 (cons a1 x6)) )
  43.             ( t (setq x1 (cons a1 x1)) )
  44.           )
  45.         )
  46.         (entmod
  47.           (append
  48.             (reverse x1)
  49.             (append
  50.               (apply (function append)
  51.                 (apply (function mapcar)
  52.                   (cons (function list)
  53.                     (list
  54.                       x2
  55.                       (cdr (reverse (cons (car x3) (reverse x3))))
  56.                       (cdr (reverse (cons (car x4) (reverse x4))))
  57.                       (cdr (reverse (cons (car x5) (reverse x5))))
  58.                     )
  59.                   )
  60.                 )
  61.               )
  62.               x6
  63.             )
  64.           )
  65.         )
  66.         (entupd lw)
  67.       )
  68.     )
  69.   )
  70.  
  71.   (defun jigsaw ( lws orth chk / unique inspectlw process lw lww lwww lwso lwss lwd lwdd lwwd q f )
  72.  
  73.     (defun unique ( lwd )
  74.       (if lwd
  75.         (cons
  76.           (car lwd)
  77.           (unique
  78.             (vl-remove-if
  79.               (function (lambda ( x )
  80.                 (and
  81.                   (equal (distance (caar lwd) (caddar lwd)) (distance (car x) (caddr x)) 1e-6)
  82.                   (or
  83.                     (equal (cadar lwd) (cadr x) 1e-6)
  84.                     (equal (rem (+ (cadar lwd) pi pi) (+ pi pi)) (rem (+ (cadr x) pi) (+ pi pi)) 1e-6)
  85.                     (equal (rem (+ (cadar lwd) pi) (+ pi pi)) (rem (+ (cadr x) pi pi) (+ pi pi)) 1e-6)
  86.                   )
  87.                 )
  88.               ))
  89.               (cdr lwd)
  90.             )
  91.           )
  92.         )
  93.       )
  94.     )
  95.  
  96.     (defun inspectlw ( lw / lwx pts p0 angs edgs )
  97.       (setq lwx (entget lw))
  98.       (setq pts (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) lwx)))
  99.       (setq p0 (car pts))
  100.       (foreach p1 (cdr pts)
  101.         (if
  102.           (or
  103.             (< (cadr p1) (cadr p0))
  104.             (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  105.           )
  106.           (setq p0 p1)
  107.         )
  108.       )
  109.       (setq pts (append (member p0 pts) (reverse (cdr (member p0 (reverse pts))))))
  110.       (setq angs (mapcar (function (lambda ( a b ) (angle a b))) pts (append (cdr pts) (list (car pts)))))
  111.       (setq edgs (mapcar (function (lambda ( p1 a p2 ) (list p1 a p2))) pts angs (append (cdr pts) (list (car pts)))))
  112.     )
  113.  
  114.     (defun process ( lws n lwd orth chk )
  115.       (if (and (setq lw (car lws)) (not lwd))
  116.         (setq lws (cdr lws) lwd (inspectlw lw))
  117.       )
  118.       (while (> n 1)
  119.         (foreach lww lws
  120.           (if lww
  121.             (setq lwwd (inspectlw lww))
  122.           )
  123.           (vl-some
  124.             (function (lambda ( edg1 )
  125.               (vl-some
  126.                 (function (lambda ( edg2 )
  127.                   (if
  128.                     (and
  129.                       (equal (distance (car edg1) (caddr edg1)) (distance (car edg2) (caddr edg2)) 1e-6)
  130.                       (if (not orth)
  131.                         (if
  132.                           (and
  133.                             (not (equal (cadr edg1) 0.0 1e-6))
  134.                             (not (equal (cadr edg2) 0.0 1e-6))
  135.                             (not (equal (cadr edg1) (* 0.5 pi) 1e-6))
  136.                             (not (equal (cadr edg2) (* 0.5 pi) 1e-6))
  137.                             (not (equal (cadr edg1) pi 1e-6))
  138.                             (not (equal (cadr edg2) pi 1e-6))
  139.                             (not (equal (cadr edg1) (* 1.5 pi) 1e-6))
  140.                             (not (equal (cadr edg2) (* 1.5 pi) 1e-6))
  141.                             (not (equal (cadr edg1) (* 2.0 pi) 1e-6))
  142.                             (not (equal (cadr edg2) (* 2.0 pi) 1e-6))
  143.                           )
  144.                           t
  145.                         )
  146.                         (if chk
  147.                           (vl-some
  148.                             (function (lambda ( edg3 )
  149.                               (vl-some
  150.                                 (function (lambda ( edg4 )
  151.                                   (and
  152.                                     (equal (distance (car edg3) (caddr edg3)) (distance (car edg4) (caddr edg4)) 1e-6)
  153.                                     (or
  154.                                       (equal (cadr edg3) (cadr edg4) 1e-6)
  155.                                       (equal (rem (+ (cadr edg3) pi) (+ pi pi)) (rem (+ (cadr edg4) pi pi) (+ pi pi)) 1e-6)
  156.                                       (equal (rem (+ (cadr edg3) pi pi) (+ pi pi)) (rem (+ (cadr edg4) pi) (+ pi pi)) 1e-6)
  157.                                     )
  158.                                   )
  159.                                 ))
  160.                                 (vl-remove edg2 lwwd)
  161.                               )
  162.                             ))
  163.                             (vl-remove edg1 lwd)
  164.                           )
  165.                           t
  166.                         )
  167.                       )
  168.                       (or
  169.                         (equal (cadr edg1) (cadr edg2) 1e-6)
  170.                         (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  171.                         (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  172.                       )
  173.                     )
  174.                     (progn
  175.                       (setq lws (vl-remove lww lws) n (1- n))
  176.                       (if (and edg3 edg4)
  177.                         (cond
  178.                           ( (and (equal (cadr edg3) (cadr edg4) 1e-6) (equal (car edg1) (car edg3) 1e-6) (equal (car edg2) (car edg4) 1e-6))
  179.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (car edg4)) (vlax-3d-point (car edg3)))
  180.                             (foreach x lwwd
  181.                               (if (not (equal edg4 x 1e-6))
  182.                                 (progn
  183.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (car edg4)) (car x)) (car x) x))
  184.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (car edg4)) (caddr xx)) (caddr xx) xx))
  185.                                   (setq lwd (cons xx lwd))
  186.                                 )
  187.                               )
  188.                             )
  189.                             (setq lwd (vl-remove edg3 lwd))
  190.                             (setq lwd (unique lwd))
  191.                           )
  192.                           ( (and
  193.                               (or
  194.                                 (equal (rem (+ (cadr edg3) pi) (+ pi pi)) (rem (+ (cadr edg4) pi pi) (+ pi pi)) 1e-6)
  195.                                 (equal (rem (+ (cadr edg3) pi pi) (+ pi pi)) (rem (+ (cadr edg4) pi) (+ pi pi)) 1e-6)
  196.                               )
  197.                               (equal (car edg1) (car edg3) 1e-6)
  198.                               (equal (car edg2) (car edg4) 1e-6)
  199.                             )
  200.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (caddr edg4)) (vlax-3d-point (car edg3)))
  201.                             (foreach x lwwd
  202.                               (if (not (equal edg4 x 1e-6))
  203.                                 (progn
  204.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (caddr edg4)) (car x)) (car x) x))
  205.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (caddr edg4)) (caddr xx)) (caddr xx) xx))
  206.                                   (setq lwd (cons xx lwd))
  207.                                 )
  208.                               )
  209.                             )
  210.                             (setq lwd (vl-remove edg3 lwd))
  211.                             (setq lwd (unique lwd))
  212.                           )
  213.                         )
  214.                         (cond
  215.                           ( (equal (cadr edg1) (cadr edg2) 1e-6)
  216.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (car edg2)) (vlax-3d-point (car edg1)))
  217.                             (foreach x lwwd
  218.                               (if (not (equal edg2 x 1e-6))
  219.                                 (progn
  220.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (car x)) (car x) x))
  221.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (caddr xx)) (caddr xx) xx))
  222.                                   (setq lwd (cons xx lwd))
  223.                                 )
  224.                               )
  225.                             )
  226.                             (setq lwd (vl-remove edg1 lwd))
  227.                             (setq lwd (unique lwd))
  228.                           )
  229.                           ( (or
  230.                               (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  231.                               (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  232.                             )
  233.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (caddr edg2)) (vlax-3d-point (car edg1)))
  234.                             (foreach x lwwd
  235.                               (if (not (equal edg2 x 1e-6))
  236.                                 (progn
  237.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (car x)) (car x) x))
  238.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (caddr xx)) (caddr xx) xx))
  239.                                   (setq lwd (cons xx lwd))
  240.                                 )
  241.                               )
  242.                             )
  243.                             (setq lwd (vl-remove edg1 lwd))
  244.                             (setq lwd (unique lwd))
  245.                           )
  246.                         )
  247.                       )
  248.                     )
  249.                   )
  250.                 ))
  251.                 lwwd
  252.               )
  253.             ))
  254.             lwd
  255.           )
  256.         )
  257.       )
  258.       lwd
  259.     )
  260.  
  261.     (foreach lw lws
  262.       (if lw
  263.         (setq lwdd (inspectlw lw))
  264.       )
  265.       (cond
  266.         ( (and
  267.             orth
  268.             (vl-every
  269.               (function (lambda ( w )
  270.                 (or
  271.                   (equal (cadr w) 0.0 1e-6)
  272.                   (equal (cadr w) (* 0.5 pi) 1e-6)
  273.                   (equal (cadr w) pi 1e-6)
  274.                   (equal (cadr w) (* 1.5 pi) 1e-6)
  275.                   (equal (cadr w) (* 2 pi) 1e-6)
  276.                 )
  277.               ))
  278.               lwdd
  279.             )
  280.           )
  281.           (setq lws (vl-remove lw lws) lwso (cons lw lwso))
  282.         )
  283.         ( (and
  284.             (not orth)
  285.             (vl-every
  286.               (function (lambda ( w )
  287.                 (or
  288.                   (equal (cadr w) 0.0 1e-6)
  289.                   (equal (cadr w) (* 0.5 pi) 1e-6)
  290.                   (equal (cadr w) pi 1e-6)
  291.                   (equal (cadr w) (* 1.5 pi) 1e-6)
  292.                   (equal (cadr w) (* 2 pi) 1e-6)
  293.                 )
  294.               ))
  295.               lwdd
  296.             )
  297.           )
  298.           (setq lws (vl-remove lw lws))
  299.         )
  300.       )
  301.     )
  302.     (setq lwd (process lws (length lws) nil orth (not chk)))
  303.     (if orth
  304.       (progn
  305.         (setq lwd (process (list (setq q (car (vl-sort lwso (function (lambda ( a b ) (< (vlax-curve-getarea a) (vlax-curve-getarea b)))))))) 2 lwd orth (not chk)))
  306.         (setq lwso (vl-remove q lwso))
  307.         (while
  308.           (or
  309.             (setq lwww (vl-some (function (lambda ( z / xx ) (if (and (setq xx (vl-some (function (lambda ( a ) (vl-some (function (lambda ( x ) (if (equal (distance (car a) (caddr a)) (distance (car x) (caddr x)) 1e-6) (list x a)))) (apply (function append) (mapcar (function inspectlw) lws))))) (apply (function append) (mapcar (function inspectlw) lwso)))) (vl-some (function (lambda ( b ) (vl-some (function (lambda ( y ) (and (not (equal b (car xx) 1e-6)) (not (equal b (cadr xx) 1e-6)) (not (equal y (car xx) 1e-6)) (not (equal y (cadr xx) 1e-6)) (equal (distance (car b) (caddr b)) (distance (car y) (caddr y)) 1e-6)))) (apply (function append) (mapcar (function inspectlw) lws))))) (apply (function append) (mapcar (function inspectlw) lwso)))) z))) (mapcar (function inspectlw) lwso)))
  310.             (car lwso)
  311.           )
  312.           (if (cdr lwso)
  313.             (foreach w lwso
  314.               (if (equal (inspectlw w) lwww 1e-6)
  315.                 (progn
  316.                   (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget w))))
  317.                     (setq lwd (process (list w) 2 (if (not f) (progn (setq f t) (reverse lwd)) lwd) orth (not chk)))
  318.                     (setq lwd (process (list w) 2 lwd orth (not chk)))
  319.                   )
  320.                   (setq lwso (vl-remove w lwso))
  321.                 )
  322.               )
  323.             )
  324.             (progn
  325.               (process (list (car lwso)) 2 lwd orth chk)
  326.               (setq lwso nil)
  327.             )
  328.           )
  329.         )
  330.       )
  331.     )
  332.   )
  333.  
  334.   (if (= 8 (logand 8 (getvar (quote undoctl))))
  335.     (if command-s
  336.       (command-s "_.UNDO" "_E")
  337.       (vl-cmdf "_.UNDO" "_E")
  338.     )
  339.   )
  340.   (if command-s
  341.     (command-s "_.UNDO" "_M")
  342.     (vl-cmdf "_.UNDO" "_M")
  343.   )
  344.   (initget "Yes No")
  345.   (setq orth (cond ( (getkword "\nEnable ortho or not [Yes / No] <Yes> : ") ) ( "Yes" ) ))
  346.   (if (= orth "Yes")
  347.     (setq orth t)
  348.     (setq orth nil)
  349.   )
  350.   (initget "Yes No")
  351.   (setq chk (cond ( (getkword "\nChoose check for ortho - if it stals chose \"No\" next time [Yes / No] <Yes> : ") ) ( "Yes" ) ))
  352.   (if (= chk "Yes")
  353.     (setq chk t)
  354.     (setq chk nil)
  355.   )
  356.   (prompt "\nSelect polygons you want CW - non orthogonal <ENTER - CONTINUE> : ")
  357.   (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  358.     (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  359.       (if (not (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw)))))
  360.         (rlw lw)
  361.       )
  362.     )
  363.   )
  364.   (prompt "\nSelect polygons you want CCW - orthogonal <ENTER - CONTINUE> : ")
  365.   (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  366.     (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  367.       (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  368.         (rlw lw)
  369.       )
  370.     )
  371.   )
  372.   (prompt "\nSelect polygonal LWPOLYLINE(s) on unlocked Layer(s)...")
  373.   (if (setq ss (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  374.     (progn
  375.       (repeat (setq i (sslength ss))
  376.         (setq lws (cons (ssname ss (setq i (1- i))) lws))
  377.       )
  378.       (jigsaw lws orth chk)
  379.     )
  380.   )
  381.   (*error* nil)
  382. )
  383.  

I am waiting to see if we'll get some comment...
Regards, M.R.
« Last Edit: April 02, 2023, 01:36:16 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #54 on: March 30, 2023, 11:01:15 AM »
Can someone solve jigsaw for orthogonal pieces... I am attaching *.DWG for testing purposes... For now I've updated my last input, but nevertheless it is not working with orthogonal pieces - rectangles... I am waiting to see if someone will jump in...

Thanks, M.R.
« Last Edit: March 31, 2023, 04:13:04 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #55 on: April 01, 2023, 02:12:37 AM »
I've updated code from here : https://www.theswamp.org/index.php?topic=44783.msg613184#msg613184
But I still think that it's very hard to solve it correctly - added option for turning some polygons clockWise / Counterclockwise...

If you have a spare time, it's just for fun to check, as I think it can't be programmed well upon choosing various options...
« Last Edit: April 01, 2023, 03:59:21 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #56 on: April 01, 2023, 08:01:36 AM »
I've coded for that one example, but just for this case... Now how can we manage to find general solution, and this is 3 steps selection + twice ENTER...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:jigsaw-ortho ( / *error* listclockwise-p rlw jigsaw s ss i lws orth chk )
  2.  
  3.  
  4.   (defun *error* ( m )
  5.     (if (= 8 (logand 8 (getvar (quote undoctl))))
  6.       (if command-s
  7.         (command-s "_.UNDO" "_E")
  8.         (vl-cmdf "_.UNDO" "_E")
  9.       )
  10.     )
  11.     (if m
  12.       (prompt m)
  13.     )
  14.     (princ)
  15.   )
  16.  
  17.   (defun listclockwise-p ( lst )
  18.     ;; by Lee Mac
  19.     (minusp
  20.       (apply (function +)
  21.         (mapcar
  22.           (function (lambda ( a b )
  23.             (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  24.           ))
  25.           lst
  26.           (cons (last lst) lst)
  27.         )
  28.       )
  29.     )
  30.   )
  31.  
  32.   (defun rlw ( lw / e x1 x2 x3 x4 x5 x6 )
  33.     ;; by Elpanov Evgeniy
  34.     (if (= (cdr (assoc 0 (setq e (entget lw)))) "LWPOLYLINE")
  35.       (progn
  36.         (foreach a1 e
  37.           (cond
  38.             ( (= (car a1) 10) (setq x2 (cons a1 x2)) )
  39.             ( (= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)) )
  40.             ( (= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)) )
  41.             ( (= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)) )
  42.             ( (= (car a1) 210) (setq x6 (cons a1 x6)) )
  43.             ( t (setq x1 (cons a1 x1)) )
  44.           )
  45.         )
  46.         (entmod
  47.           (append
  48.             (reverse x1)
  49.             (append
  50.               (apply (function append)
  51.                 (apply (function mapcar)
  52.                   (cons (function list)
  53.                     (list
  54.                       x2
  55.                       (cdr (reverse (cons (car x3) (reverse x3))))
  56.                       (cdr (reverse (cons (car x4) (reverse x4))))
  57.                       (cdr (reverse (cons (car x5) (reverse x5))))
  58.                     )
  59.                   )
  60.                 )
  61.               )
  62.               x6
  63.             )
  64.           )
  65.         )
  66.         (entupd lw)
  67.       )
  68.     )
  69.   )
  70.  
  71.   (defun jigsaw ( lws orth chk / unique inspectlw process lw lww lwww lwso lwss lwd lwdd lwwd lwds q )
  72.  
  73.     (defun unique ( lwd )
  74.       (if lwd
  75.         (cons
  76.           (car lwd)
  77.           (unique
  78.             (vl-remove-if
  79.               (function (lambda ( x )
  80.                 (and
  81.                   (equal (distance (caar lwd) (caddar lwd)) (distance (car x) (caddr x)) 1e-6)
  82.                   (or
  83.                     (equal (cadar lwd) (cadr x) 1e-6)
  84.                     (equal (rem (+ (cadar lwd) pi pi) (+ pi pi)) (rem (+ (cadr x) pi) (+ pi pi)) 1e-6)
  85.                     (equal (rem (+ (cadar lwd) pi) (+ pi pi)) (rem (+ (cadr x) pi pi) (+ pi pi)) 1e-6)
  86.                   )
  87.                 )
  88.               ))
  89.               (cdr lwd)
  90.             )
  91.           )
  92.         )
  93.       )
  94.     )
  95.  
  96.     (defun inspectlw ( lw / lwx pts p0 angs edgs )
  97.       (setq lwx (entget lw))
  98.       (setq pts (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) lwx)))
  99.       (setq p0 (car pts))
  100.       (foreach p1 (cdr pts)
  101.         (if
  102.           (or
  103.             (< (cadr p1) (cadr p0))
  104.             (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  105.           )
  106.           (setq p0 p1)
  107.         )
  108.       )
  109.       (setq pts (append (member p0 pts) (reverse (cdr (member p0 (reverse pts))))))
  110.       (setq angs (mapcar (function (lambda ( a b ) (angle a b))) pts (append (cdr pts) (list (car pts)))))
  111.       (setq edgs (mapcar (function (lambda ( p1 a p2 ) (list p1 a p2))) pts angs (append (cdr pts) (list (car pts)))))
  112.     )
  113.  
  114.     (defun process ( lws n lwd orth chk )
  115.       (if (and (setq lw (car lws)) (not lwd))
  116.         (setq lws (cdr lws) lwd (inspectlw lw))
  117.       )
  118.       (while (> n 1)
  119.         (foreach lww lws
  120.           (if lww
  121.             (setq lwwd (inspectlw lww))
  122.           )
  123.           (vl-some
  124.             (function (lambda ( edg1 )
  125.               (vl-some
  126.                 (function (lambda ( edg2 )
  127.                   (if
  128.                     (and
  129.                       (equal (distance (car edg1) (caddr edg1)) (distance (car edg2) (caddr edg2)) 1e-6)
  130.                       (if (not orth)
  131.                         (if
  132.                           (and
  133.                             (not (equal (cadr edg1) 0.0 1e-6))
  134.                             (not (equal (cadr edg2) 0.0 1e-6))
  135.                             (not (equal (cadr edg1) (* 0.5 pi) 1e-6))
  136.                             (not (equal (cadr edg2) (* 0.5 pi) 1e-6))
  137.                             (not (equal (cadr edg1) pi 1e-6))
  138.                             (not (equal (cadr edg2) pi 1e-6))
  139.                             (not (equal (cadr edg1) (* 1.5 pi) 1e-6))
  140.                             (not (equal (cadr edg2) (* 1.5 pi) 1e-6))
  141.                             (not (equal (cadr edg1) (* 2.0 pi) 1e-6))
  142.                             (not (equal (cadr edg2) (* 2.0 pi) 1e-6))
  143.                           )
  144.                           t
  145.                         )
  146.                         (if chk
  147.                           (vl-some
  148.                             (function (lambda ( edg3 )
  149.                               (vl-some
  150.                                 (function (lambda ( edg4 )
  151.                                   (and
  152.                                     (equal (distance (car edg3) (caddr edg3)) (distance (car edg4) (caddr edg4)) 1e-6)
  153.                                     (or
  154.                                       (equal (cadr edg3) (cadr edg4) 1e-6)
  155.                                       (equal (rem (+ (cadr edg3) pi) (+ pi pi)) (rem (+ (cadr edg4) pi pi) (+ pi pi)) 1e-6)
  156.                                       (equal (rem (+ (cadr edg3) pi pi) (+ pi pi)) (rem (+ (cadr edg4) pi) (+ pi pi)) 1e-6)
  157.                                     )
  158.                                   )
  159.                                 ))
  160.                                 (vl-remove edg2 lwwd)
  161.                               )
  162.                             ))
  163.                             (vl-remove edg1 lwd)
  164.                           )
  165.                           t
  166.                         )
  167.                       )
  168.                       (or
  169.                         (equal (cadr edg1) (cadr edg2) 1e-6)
  170.                         (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  171.                         (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  172.                       )
  173.                     )
  174.                     (progn
  175.                       (setq lws (vl-remove lww lws) n (1- n))
  176.                       (if (and edg3 edg4)
  177.                         (cond
  178.                           ( (and (equal (cadr edg3) (cadr edg4) 1e-6) (equal (car edg1) (car edg3) 1e-6) (equal (car edg2) (car edg4) 1e-6))
  179.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (car edg4)) (vlax-3d-point (car edg3)))
  180.                             (foreach x lwwd
  181.                               (if (not (equal edg4 x 1e-6))
  182.                                 (progn
  183.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (car edg4)) (car x)) (car x) x))
  184.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (car edg4)) (caddr xx)) (caddr xx) xx))
  185.                                   (setq lwd (cons xx lwd))
  186.                                 )
  187.                               )
  188.                             )
  189.                             (setq lwd (vl-remove edg3 lwd))
  190.                             ;(setq lwd (unique lwd))
  191.                           )
  192.                           ( (and
  193.                               (or
  194.                                 (equal (rem (+ (cadr edg3) pi) (+ pi pi)) (rem (+ (cadr edg4) pi pi) (+ pi pi)) 1e-6)
  195.                                 (equal (rem (+ (cadr edg3) pi pi) (+ pi pi)) (rem (+ (cadr edg4) pi) (+ pi pi)) 1e-6)
  196.                               )
  197.                               (equal (car edg1) (car edg3) 1e-6)
  198.                               (equal (car edg2) (car edg4) 1e-6)
  199.                             )
  200.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (caddr edg4)) (vlax-3d-point (car edg3)))
  201.                             (foreach x lwwd
  202.                               (if (not (equal edg4 x 1e-6))
  203.                                 (progn
  204.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (caddr edg4)) (car x)) (car x) x))
  205.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg3) (caddr edg4)) (caddr xx)) (caddr xx) xx))
  206.                                   (setq lwd (cons xx lwd))
  207.                                 )
  208.                               )
  209.                             )
  210.                             (setq lwd (vl-remove edg3 lwd))
  211.                             ;(setq lwd (unique lwd))
  212.                           )
  213.                         )
  214.                         (cond
  215.                           ( (equal (cadr edg1) (cadr edg2) 1e-6)
  216.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (car edg2)) (vlax-3d-point (car edg1)))
  217.                             (foreach x lwwd
  218.                               (if (not (equal edg2 x 1e-6))
  219.                                 (progn
  220.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (car x)) (car x) x))
  221.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (caddr xx)) (caddr xx) xx))
  222.                                   (setq lwd (cons xx lwd))
  223.                                 )
  224.                               )
  225.                             )
  226.                             (setq lwd (vl-remove edg1 lwd))
  227.                             ;(setq lwd (unique lwd))
  228.                           )
  229.                           ( (or
  230.                               (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  231.                               (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  232.                             )
  233.                             (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (caddr edg2)) (vlax-3d-point (car edg1)))
  234.                             (foreach x lwwd
  235.                               (if (not (equal edg2 x 1e-6))
  236.                                 (progn
  237.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (car x)) (car x) x))
  238.                                   (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (caddr xx)) (caddr xx) xx))
  239.                                   (setq lwd (cons xx lwd))
  240.                                 )
  241.                               )
  242.                             )
  243.                             (setq lwd (vl-remove edg1 lwd))
  244.                             ;(setq lwd (unique lwd))
  245.                           )
  246.                         )
  247.                       )
  248.                     )
  249.                   )
  250.                 ))
  251.                 lwwd
  252.               )
  253.             ))
  254.             lwd
  255.           )
  256.         )
  257.       )
  258.       lwd
  259.     )
  260.  
  261.     (foreach lw lws
  262.       (if lw
  263.         (setq lwdd (inspectlw lw))
  264.       )
  265.       (cond
  266.         ( (and
  267.             orth
  268.             (vl-every
  269.               (function (lambda ( w )
  270.                 (or
  271.                   (equal (cadr w) 0.0 1e-6)
  272.                   (equal (cadr w) (* 0.5 pi) 1e-6)
  273.                   (equal (cadr w) pi 1e-6)
  274.                   (equal (cadr w) (* 1.5 pi) 1e-6)
  275.                   (equal (cadr w) (* 2 pi) 1e-6)
  276.                 )
  277.               ))
  278.               lwdd
  279.             )
  280.           )
  281.           (setq lws (vl-remove lw lws) lwso (cons lw lwso))
  282.         )
  283.         ( (and
  284.             (not orth)
  285.             (vl-every
  286.               (function (lambda ( w )
  287.                 (or
  288.                   (equal (cadr w) 0.0 1e-6)
  289.                   (equal (cadr w) (* 0.5 pi) 1e-6)
  290.                   (equal (cadr w) pi 1e-6)
  291.                   (equal (cadr w) (* 1.5 pi) 1e-6)
  292.                   (equal (cadr w) (* 2 pi) 1e-6)
  293.                 )
  294.               ))
  295.               lwdd
  296.             )
  297.           )
  298.           (setq lws (vl-remove lw lws))
  299.         )
  300.       )
  301.     )
  302.     (setq lwd (process lws (length lws) nil orth (not chk)))
  303.     (if orth
  304.       (progn
  305.         (setq lwd (process (list (setq q (car (vl-sort lwso (function (lambda ( a b ) (< (vlax-curve-getarea a) (vlax-curve-getarea b)))))))) 2 lwd orth (not chk)))
  306.         (setq lwds (caddr lwd))
  307.         (setq lwso (vl-remove q lwso))
  308.         (while
  309.           (or
  310.             (setq lwww (vl-some (function (lambda ( z / xx ) (if (and (setq xx (vl-some (function (lambda ( a ) (vl-some (function (lambda ( x ) (if (equal (distance (car a) (caddr a)) (distance (car x) (caddr x)) 1e-6) (list x a)))) (apply (function append) (mapcar (function inspectlw) lws))))) (apply (function append) (mapcar (function inspectlw) lwso)))) (vl-some (function (lambda ( b ) (vl-some (function (lambda ( y ) (and (not (equal b (car xx) 1e-6)) (not (equal b (cadr xx) 1e-6)) (not (equal y (car xx) 1e-6)) (not (equal y (cadr xx) 1e-6)) (equal (distance (car b) (caddr b)) (distance (car y) (caddr y)) 1e-6)))) (apply (function append) (mapcar (function inspectlw) lws))))) (apply (function append) (mapcar (function inspectlw) lwso)))) z))) (mapcar (function inspectlw) lwso)))
  311.             (car lwso)
  312.           )
  313.           (if (cdr lwso)
  314.             (foreach w lwso
  315.               (if (equal (inspectlw w) lwww 1e-6)
  316.                 (progn
  317.                   (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget w))))
  318.                     (setq lwd (process (list w) 2 (cons lwds lwd) orth (not chk)))
  319.                     (setq lwd (process (list w) 2 lwd orth (not chk)))
  320.                   )
  321.                   (setq lwso (vl-remove w lwso))
  322.                 )
  323.               )
  324.             )
  325.             (progn
  326.               (process (list (car lwso)) 2 lwd orth chk)
  327.               (setq lwso nil)
  328.             )
  329.           )
  330.         )
  331.       )
  332.     )
  333.   )
  334.  
  335.   (if (= 8 (logand 8 (getvar (quote undoctl))))
  336.     (if command-s
  337.       (command-s "_.UNDO" "_E")
  338.       (vl-cmdf "_.UNDO" "_E")
  339.     )
  340.   )
  341.   (if command-s
  342.     (command-s "_.UNDO" "_M")
  343.     (vl-cmdf "_.UNDO" "_M")
  344.   )
  345.   (initget "Yes No")
  346.   (setq orth (cond ( (getkword "\nEnable ortho or not [Yes / No] <Yes> : ") ) ( "Yes" ) ))
  347.   (if (= orth "Yes")
  348.     (setq orth t)
  349.     (setq orth nil)
  350.   )
  351.   (initget "Yes No")
  352.   (setq chk (cond ( (getkword "\nChoose check for ortho - if it stals choose \"No\" next time [Yes / No] <Yes> : ") ) ( "Yes" ) ))
  353.   (if (= chk "Yes")
  354.     (setq chk t)
  355.     (setq chk nil)
  356.   )
  357.   (prompt "\nSelect polygons you want CW - orthogonal - right side <ENTER - CONTINUE> : ")
  358.   (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  359.     (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  360.       (if (not (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw)))))
  361.         (rlw lw)
  362.       )
  363.     )
  364.   )
  365.   (prompt "\nSelect polygons you want CCW - non orthogonal + upper side orthogonal <ENTER - CONTINUE> : ")
  366.   (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  367.     (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  368.       (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  369.         (rlw lw)
  370.       )
  371.     )
  372.   )
  373.   (prompt "\nSelect polygonal LWPOLYLINE(s) on unlocked Layer(s)...")
  374.   (if (setq ss (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  375.     (progn
  376.       (repeat (setq i (sslength ss))
  377.         (setq lws (cons (ssname ss (setq i (1- i))) lws))
  378.       )
  379.       (jigsaw lws orth chk)
  380.     )
  381.   )
  382.   (*error* nil)
  383. )
  384.  

M.R.
« Last Edit: April 02, 2023, 01:35:47 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #57 on: April 01, 2023, 10:52:09 AM »
I am attaching relevant *.dwg for you to see how it is working... The code was altered many times, but now it's just the way it was thought to be...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:jigsaw-ortho ( / *error* listclockwise-p rlw bb jigsaw s ss i lws lwss orth base cent c lll qqq qqqlr qqqul ddd )
  2.  
  3.  
  4.   (defun *error* ( m )
  5.     (if (= 8 (logand 8 (getvar (quote undoctl))))
  6.       (if command-s
  7.         (command-s "_.UNDO" "_E")
  8.         (vl-cmdf "_.UNDO" "_E")
  9.       )
  10.     )
  11.     (if m
  12.       (prompt m)
  13.     )
  14.     (princ)
  15.   )
  16.  
  17.   (defun listclockwise-p ( lst )
  18.     ;; by Lee Mac
  19.     (minusp
  20.       (apply (function +)
  21.         (mapcar
  22.           (function (lambda ( a b )
  23.             (- (* (car b) (cadr a)) (* (car a) (cadr b)))
  24.           ))
  25.           lst
  26.           (cons (last lst) lst)
  27.         )
  28.       )
  29.     )
  30.   )
  31.  
  32.   (defun rlw ( lw / e x1 x2 x3 x4 x5 x6 )
  33.     ;; by Elpanov Evgeniy
  34.     (if (= (cdr (assoc 0 (setq e (entget lw)))) "LWPOLYLINE")
  35.       (progn
  36.         (foreach a1 e
  37.           (cond
  38.             ( (= (car a1) 10) (setq x2 (cons a1 x2)) )
  39.             ( (= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)) )
  40.             ( (= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)) )
  41.             ( (= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)) )
  42.             ( (= (car a1) 210) (setq x6 (cons a1 x6)) )
  43.             ( t (setq x1 (cons a1 x1)) )
  44.           )
  45.         )
  46.         (entmod
  47.           (append
  48.             (reverse x1)
  49.             (append
  50.               (apply (function append)
  51.                 (apply (function mapcar)
  52.                   (cons (function list)
  53.                     (list
  54.                       x2
  55.                       (cdr (reverse (cons (car x3) (reverse x3))))
  56.                       (cdr (reverse (cons (car x4) (reverse x4))))
  57.                       (cdr (reverse (cons (car x5) (reverse x5))))
  58.                     )
  59.                   )
  60.                 )
  61.               )
  62.               x6
  63.             )
  64.           )
  65.         )
  66.         (entupd lw)
  67.       )
  68.     )
  69.   )
  70.  
  71.   (defun bb ( ptlst )
  72.     (list
  73.       (list (apply (function min) (mapcar (function car) ptlst)) (apply (function min) (mapcar (function cadr) ptlst)))
  74.       (list (apply (function max) (mapcar (function car) ptlst)) (apply (function min) (mapcar (function cadr) ptlst)))
  75.       (list (apply (function max) (mapcar (function car) ptlst)) (apply (function max) (mapcar (function cadr) ptlst)))
  76.       (list (apply (function min) (mapcar (function car) ptlst)) (apply (function max) (mapcar (function cadr) ptlst)))
  77.     )
  78.   )
  79.  
  80.   (defun jigsaw ( lws orth / inspectlw process lw lww lwww lwso lwd lwdd lwwd lwds q )
  81.  
  82.     (defun inspectlw ( lw base / lwx pts p0 angs edgs )
  83.       (setq lwx (entget lw))
  84.       (setq pts (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) lwx)))
  85.       (setq p0 (car pts))
  86.       (foreach p1 (cdr pts)
  87.         (cond
  88.           ( (= base "ll")
  89.             (if
  90.               (or
  91.                 (< (cadr p1) (cadr p0))
  92.                 (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  93.               )
  94.               (setq p0 p1)
  95.             )
  96.           )
  97.           ( (= base "lr")
  98.             (if
  99.               (or
  100.                 (< (cadr p1) (cadr p0))
  101.                 (and (= (cadr p1) (cadr p0)) (> (car p1) (car p0)))
  102.               )
  103.               (setq p0 p1)
  104.             )
  105.           )
  106.           ( (= base "ur")
  107.             (if
  108.               (or
  109.                 (> (cadr p1) (cadr p0))
  110.                 (and (= (cadr p1) (cadr p0)) (> (car p1) (car p0)))
  111.               )
  112.               (setq p0 p1)
  113.             )
  114.           )
  115.           ( (= base "ul")
  116.             (if
  117.               (or
  118.                 (> (cadr p1) (cadr p0))
  119.                 (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  120.               )
  121.               (setq p0 p1)
  122.             )
  123.           )
  124.         )
  125.       )
  126.       (setq pts (append (member p0 pts) (reverse (cdr (member p0 (reverse pts))))))
  127.       (setq angs (mapcar (function (lambda ( a b ) (angle a b))) pts (append (cdr pts) (list (car pts)))))
  128.       (setq edgs (mapcar (function (lambda ( p1 a p2 ) (list p1 a p2))) pts angs (append (cdr pts) (list (car pts)))))
  129.     )
  130.  
  131.     (defun process ( lws n lwd )
  132.       (cond
  133.         ( (and (setq lw (if (= c "Yes") cent (if qqq (car qqq) (car lws)))) (not lwd))
  134.           (setq lws (vl-remove lw lws) lwd (inspectlw lw base))
  135.         )
  136.         ( (and lwd (= c "Yes"))
  137.           (setq lll (inspectlw cent base))
  138.           (setq lwd (append (inspectlw (rlw cent) base) (vl-remove-if (function (lambda ( x ) (vl-some (function (lambda ( y ) (equal x y 1e-6))) lll))) lwd)))
  139.         )
  140.       )
  141.       (while (> n 1)
  142.         (foreach lww lws
  143.           (if lww
  144.             (setq lwwd (inspectlw lww base))
  145.           )
  146.           (if ddd
  147.             (setq lwd (append ddd (vl-remove-if (function (lambda ( x ) (vl-some (function (lambda ( y ) (equal x y 1e-6))) ddd))) lwd)))
  148.           )
  149.           (vl-some
  150.             (function (lambda ( edg1 )
  151.               (vl-some
  152.                 (function (lambda ( edg2 )
  153.                   (if
  154.                     (and
  155.                       (equal (distance (car edg1) (caddr edg1)) (distance (car edg2) (caddr edg2)) 1e-6)
  156.                       (or
  157.                         (equal (cadr edg1) (cadr edg2) 1e-6)
  158.                         (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  159.                         (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  160.                       )
  161.                     )
  162.                     (progn
  163.                       (setq lws (vl-remove lww lws) n (1- n))
  164.                       (cond
  165.                         ( (equal (cadr edg1) (cadr edg2) 1e-6)
  166.                           (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (car edg2)) (vlax-3d-point (car edg1)))
  167.                           (foreach x lwwd
  168.                             (if (not (equal edg2 x 1e-6))
  169.                               (progn
  170.                                 (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (car x)) (car x) x))
  171.                                 (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (car edg2)) (caddr xx)) (caddr xx) xx))
  172.                                 (setq lwd (cons xx lwd))
  173.                               )
  174.                             )
  175.                           )
  176.                           (setq lwd (vl-remove edg1 lwd))
  177.                         )
  178.                         ( (or
  179.                             (equal (rem (+ (cadr edg1) pi) (+ pi pi)) (rem (+ (cadr edg2) pi pi) (+ pi pi)) 1e-6)
  180.                             (equal (rem (+ (cadr edg1) pi pi) (+ pi pi)) (rem (+ (cadr edg2) pi) (+ pi pi)) 1e-6)
  181.                           )
  182.                           (vla-move (vlax-ename->vla-object lww) (vlax-3d-point (caddr edg2)) (vlax-3d-point (car edg1)))
  183.                           (foreach x lwwd
  184.                             (if (not (equal edg2 x 1e-6))
  185.                               (progn
  186.                                 (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (car x)) (car x) x))
  187.                                 (setq xx (subst (mapcar (function +) (mapcar (function -) (car edg1) (caddr edg2)) (caddr xx)) (caddr xx) xx))
  188.                                 (setq lwd (cons xx lwd))
  189.                               )
  190.                             )
  191.                           )
  192.                           (setq lwd (vl-remove edg1 lwd))
  193.                         )
  194.                       )
  195.                     )
  196.                   )
  197.                 ))
  198.                 lwwd
  199.               )
  200.             ))
  201.             lwd
  202.           )
  203.         )
  204.       )
  205.       lwd
  206.     )
  207.  
  208.     (if (not orth)
  209.       (setq lwd (process lwss (length lwss) nil))
  210.       (progn
  211.         (if (> (length qqq) 1)
  212.           (setq ddd (process qqq (length qqq) nil))
  213.         )
  214.         (setq lwd (process qqqlr (length qqqlr) lwd))
  215.         (setq lwd (process qqqul (length qqqul) lwd))
  216.         (setq lwso (vl-remove-if (function (lambda ( x ) (vl-some (function (lambda ( y ) (eq x y))) (append qqq qqqlr qqqul)))) lwss))
  217.         (setq qqqbb (bb (apply (function append) (mapcar (function (lambda ( q ) (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget q))))) (append qqq qqqlr qqqul)))))
  218.         (setq centbb (bb (if (= c "Yes") (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget cent))) (apply (function append) (mapcar (function (lambda ( x ) (mapcar (function cdr) (vl-remove-if (function (lambda ( y ) (/= (car y) 10))) (entget x))))) qqq)))))
  219.         (foreach lw lwso
  220.           (setq lwbb (bb (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw)))))
  221.           (cond
  222.             ( (equal (distance (car qqqbb) (car centbb)) (distance (car lwbb) (caddr lwbb)) 1e-6)
  223.               (vla-move (vlax-ename->vla-object lw) (vlax-3d-point (caddr lwbb)) (vlax-3d-point (car centbb)))
  224.             )
  225.             ( (equal (distance (cadr qqqbb) (cadr centbb)) (distance (cadr lwbb) (cadddr lwbb)) 1e-6)
  226.               (vla-move (vlax-ename->vla-object lw) (vlax-3d-point (cadddr lwbb)) (vlax-3d-point (cadr centbb)))
  227.             )
  228.             ( (equal (distance (caddr qqqbb) (caddr centbb)) (distance (caddr lwbb) (car lwbb)) 1e-6)
  229.               (vla-move (vlax-ename->vla-object lw) (vlax-3d-point (car lwbb)) (vlax-3d-point (caddr centbb)))
  230.             )
  231.             ( (equal (distance (cadddr qqqbb) (cadddr centbb)) (distance (cadddr lwbb) (cadr lwbb)) 1e-6)
  232.               (vla-move (vlax-ename->vla-object lw) (vlax-3d-point (cadr lwbb)) (vlax-3d-point (cadddr centbb)))
  233.             )
  234.           )
  235.         )
  236.       )
  237.     )
  238.   )
  239.  
  240.   (if (= 8 (logand 8 (getvar (quote undoctl))))
  241.     (if command-s
  242.       (command-s "_.UNDO" "_E")
  243.       (vl-cmdf "_.UNDO" "_E")
  244.     )
  245.   )
  246.   (if command-s
  247.     (command-s "_.UNDO" "_M")
  248.     (vl-cmdf "_.UNDO" "_M")
  249.   )
  250.   (initget "Yes No")
  251.   (setq orth (cond ( (getkword "\nEnable orthogonal shapes for some pieces [Yes / No] <Yes> : ") ) ( "Yes" ) ))
  252.   (if (= orth "Yes")
  253.     (setq orth t)
  254.     (setq orth nil)
  255.   )
  256.   (if orth
  257.     (progn
  258.       (prompt "\nSelect polygons you want CCW - adjacent orthogonal sides (left and up ones) <ENTER - CONTINUE> : ")
  259.       (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  260.         (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  261.           (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  262.             (rlw lw)
  263.           )
  264.           (setq qqqul (cons lw qqqul))
  265.         )
  266.       )
  267.       (prompt "\nSelect polygons you want CW - adjacent orthogonal sides (right and down ones) <ENTER - CONTINUE> : ")
  268.       (if (setq s (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  269.         (foreach lw (vl-remove-if (function listp) (mapcar (function cadr) (ssnamex s)))
  270.           (if (not (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw)))))
  271.             (rlw lw)
  272.           )
  273.           (setq qqqlr (cons lw qqqlr))
  274.         )
  275.       )
  276.       (initget "Yes No")
  277.       (setq c (cond ( (getkword "\nDo you have central piece, or many central pieces [Yes / No] <Yes> : ") ) ( "Yes" )))
  278.       (if (= c "Yes")
  279.         (progn
  280.           (while (not (setq cent (car (entsel "\nPick central ortho piece..."))))
  281.             (prompt "\nMissed...")
  282.           )
  283.           (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget cent))))
  284.             (rlw cent)
  285.           )
  286.           (setq qqq (cons cent qqq))
  287.         )
  288.         (progn
  289.           (prompt "\nSelect central pieces non orthogonal...")
  290.           (if (setq ss (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  291.             (repeat (setq i (sslength ss))
  292.               (setq lw (ssname ss (setq i (1- i))))
  293.               (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  294.                 (rlw lw)
  295.               )
  296.               (setq qqq (cons lw qqq))
  297.             )
  298.           )
  299.         )
  300.       )
  301.     )
  302.   )
  303.   ;|
  304.   (initget 1 "ll lr ur ul")
  305.   (setq base (getkword "\nChoose basepoint orientation [ll / lr / ur / ul] : "))
  306.   |;
  307.   (setq base "ll")
  308.   (prompt "\nSelect polygonal LWPOLYLINE(s) on unlocked Layer(s)...")
  309.   (if (setq ss (ssget "_:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "<NOT") (cons -4 "<>") (cons 42 0.0) (cons -4 "NOT>"))))
  310.     (progn
  311.       (repeat (setq i (sslength ss))
  312.         (setq lws (cons (ssname ss (setq i (1- i))) lws))
  313.       )
  314.       (setq lwss lws)
  315.       (if (= c "Yes")
  316.         (progn
  317.           (setq lws (vl-remove cent lws))
  318.           (setq lws (cons cent lws))
  319.         )
  320.       )
  321.       (if (not orth)
  322.         (if (or (= base "ll") (= base "lr"))
  323.           (foreach lw lws
  324.             (if (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw))))
  325.               (rlw lw)
  326.             )
  327.           )
  328.           (foreach lw lws
  329.             (if (not (listclockwise-p (mapcar (function cdr) (vl-remove-if (function (lambda ( x ) (/= (car x) 10))) (entget lw)))))
  330.               (rlw lw)
  331.             )
  332.           )
  333.         )
  334.       )
  335.       (jigsaw lws orth)
  336.     )
  337.   )
  338.   (*error* nil)
  339. )
  340.  

M.R.
« Last Edit: April 12, 2023, 03:17:40 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #58 on: April 03, 2023, 08:31:47 AM »
I think that that's it...
Posted code worked in any case of jigsaw.dwg...
Updated code is here : https://www.theswamp.org/index.php?topic=44783.msg613820#msg613820

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

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: ==={Challenge}=== Broken Pieces
« Reply #59 on: April 03, 2023, 05:15:12 PM »
Just wanted to show how it's working...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube