Author Topic: splitconcavepolygon2convexpolygons-triangles  (Read 1272 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3293
  • Marko Ribar, architect
splitconcavepolygon2convexpolygons-triangles
« on: March 23, 2016, 03:05:26 PM »
This is looping infinitely... Comments are welcome and wise opinion...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:sconc2conv ( / LM:ConvexHull LM:Clockwise-p insidep nea process lw pl el ch pll ell chl eln plll elll pll3 ell3 en li1 li2 li3 f )
  2.   ;;splitconcavepolygon2convexpolygons-triangles
  3.  
  4.   ;; Convex Hull  -  Lee Mac
  5.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  6.  
  7.   (defun LM:ConvexHull ( lst / ch p0 )
  8.       (cond
  9.           (   (< (length lst) 4) lst)
  10.           (   (setq p0 (car lst))
  11.               (foreach p1 (cdr lst)
  12.                   (if (or (< (cadr p1) (cadr p0))
  13.                           (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  14.                       )
  15.                       (setq p0 p1)
  16.                   )
  17.               )
  18.               (setq lst (vl-remove p0 lst))
  19.               (setq lst (append (list p0) lst))
  20.               (setq lst
  21.                   (vl-sort lst
  22.                       (function
  23.                           (lambda ( a b / c d )
  24.                               (if (or (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8) (and (or (equal c 0.0 1e-8) (equal c (* 2 pi) 1e-8)) (or (equal d 0.0 1e-8) (equal d (* 2 pi) 1e-8))))
  25.                                   (< (distance (list (car p0) (cadr p0)) a) (distance (list (car p0) (cadr p0)) b))
  26.                                   (< c d)
  27.                               )
  28.                           )
  29.                       )
  30.                   )
  31.               )
  32.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  33.               (foreach pt (cdddr lst)
  34.                   (setq ch (cons pt ch))
  35.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt))
  36.                       (setq ch (cons pt (cddr ch)))
  37.                   )
  38.               )
  39.               (reverse ch)
  40.           )
  41.       )
  42.   )
  43.  
  44.   ;; Clockwise-p  -  Lee Mac
  45.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  46.  
  47.   (defun LM:Clockwise-p ( p1 p2 p3 )
  48.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  49.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  50.           )
  51.           1e-8
  52.       )
  53.   )
  54.  
  55.   (defun insidep ( pt entn / big flag obj1 obj2 obj3 p1 p2 small )
  56.     (vl-load-com)
  57.     (if (and pt entn)
  58.       (progn
  59.         (setq obj1 (vlax-ename->vla-object entn))
  60.         (setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
  61.               obj3 (car (vlax-invoke obj1 'Offset -0.001))
  62.         )
  63.         (if (> (vla-get-area obj2) (vla-get-area obj3))
  64.           (progn
  65.             (set 'big obj2)
  66.             (set 'small obj3)
  67.           )
  68.           (progn
  69.             (set 'big obj3)
  70.             (set 'small obj2)
  71.           )
  72.         )
  73.         (setq p1 (vlax-curve-getClosestPointTo big pt)
  74.               p2 (vlax-curve-getClosestPointTo small pt)
  75.         )
  76.         (if (> (distance pt p1) (distance pt p2))
  77.           (setq flag T)
  78.           (setq flag nil)
  79.         )
  80.         (mapcar (function (lambda (x)
  81.                             (progn
  82.                               (vla-delete x)
  83.                               (vlax-release-object x)
  84.                             )
  85.                           )
  86.                 )
  87.                 (list big small)
  88.         )
  89.         (if (equal (trans pt entn 0) (vlax-curve-getclosestpointto entn pt) 1e-6)
  90.           (setq flag T)
  91.         )
  92.       )
  93.     )
  94.     flag
  95.   )
  96.  
  97.   (defun nea ( p1 p2 )
  98.     (polar p1 (angle p1 p2) 1e-2)
  99.   )
  100.  
  101.   (defun process ( pll ell )
  102.     (setq plll nil eln nil chl t pl pll)
  103.     (while (or (< (length plll) 3) (not (vl-every '(lambda ( x ) (vl-position x chl)) plll)))
  104.       (setq p (car pll))
  105.       (setq plll (cons p plll))
  106.       (setq chl (LM:ConvexHull plll))
  107.       (setq pll (cdr pll))
  108.     )
  109.     (command "_.PLINE")
  110.     (foreach p plll
  111.       (command "_non" p)
  112.     )
  113.     (command "_C")
  114.     (setq elll (mapcar '(lambda ( a b ) (list a b)) plll (cdr (reverse (cons (car plll) (reverse plll))))))
  115.     (foreach e elll
  116.       (if (not (or (vl-position e ell) (vl-position e el) (vl-position e en) (vl-position (reverse e) ell) (vl-position (reverse e) el) (vl-position (reverse e) en)))
  117.         (setq eln (cons e eln) en (cons e en))
  118.       )
  119.     )
  120.     (if eln
  121.       (if (= (length eln) 1)
  122.         (progn
  123.           (setq pll3 (reverse (member (cadar eln) (reverse (member (caar eln) (append pl pl))))))
  124.           (if (/= (length pll3) (1- (length pl)))
  125.             (setq pll3 (reverse (member (caar eln) (reverse (member (cadar eln) (append pl pl))))))
  126.           )
  127.           (while
  128.             (or
  129.               (not (insidep (nea (car pll3) (cadr pll3)) lw)) (not (insidep (nea (cadr pll3) (car pll3)) lw))
  130.               (not (insidep (nea (cadr pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (cadr pll3)) lw))
  131.               (not (insidep (nea (car pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (car pll3)) lw))
  132.               (progn
  133.                 (setq li1 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (cadr pll3)))))
  134.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li1) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  135.                 (entdel li1)
  136.                 f
  137.               )
  138.               (progn
  139.                 (setq li2 (entmakex (list '(0 . "LINE") (cons 10 (cadr pll3)) (cons 11 (caddr pll3)))))
  140.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li2) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  141.                 (entdel li2)
  142.                 f
  143.               )
  144.               (progn
  145.                 (setq li3 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (caddr pll3)))))
  146.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li3) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  147.                 (entdel li3)
  148.                 f
  149.               )
  150.             )
  151.             (setq pll3 (cons (last pll3) (reverse (cdr (reverse pll3)))))
  152.           )
  153.           (setq ell3 (mapcar '(lambda ( a b ) (list a b)) pll (cdr (reverse (cons (car pll) (reverse pll))))))
  154.         )
  155.       )
  156.     )
  157.   )
  158.  
  159.   (setq lw (car (entsel "\nPick concave polygon LWPOLYLINE...")))
  160.   (while (not (and lw (= (cdr (assoc 0 (entget lw))) "LWPOLYLINE") (or (= (cdr (assoc 70 (entget lw))) 1) (= (cdr (assoc 70 (entget lw))) 129)) (vl-every 'zerop (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 42)) (entget lw))))))
  161.     (prompt "\nMissed or wrong entity picked... Pick concave polygon LWPOLYLINE again...")
  162.     (setq lw (car (entsel)))
  163.   )
  164.   (setq pl (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget lw))))
  165.   (setq el (mapcar '(lambda ( a b ) (list a b)) pl (cdr (reverse (cons (car pl) (reverse pl))))))
  166.   (setq ch (LM:ConvexHull pl))
  167.   (if (vl-every '(lambda ( x ) (vl-position x ch)) pl)
  168.     (prompt "\nPicked convex polygon...")
  169.     (progn
  170.       (setq pll pl ell el eln t)
  171.       (while eln
  172.         (if (and pll3 ell3)
  173.           (process pll3 ell3)
  174.           (process pll ell)
  175.         )
  176.       )
  177.     )
  178.   )
  179.   (princ)
  180. )
  181.  

Code - Auto/Visual Lisp: [Select]
  1. (defun c:poltriang ( / LM:ConvexHull LM:Clockwise-p insidep nea process lw pl el ch pll ell chl eln plll elll pll3 ell3 en li1 li2 li3 f )
  2.   ;;triangulate polygonal LWPOLYLINE
  3.  
  4.   ;; Convex Hull  -  Lee Mac
  5.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  6.  
  7.   (defun LM:ConvexHull ( lst / ch p0 )
  8.       (cond
  9.           (   (< (length lst) 4) lst)
  10.           (   (setq p0 (car lst))
  11.               (foreach p1 (cdr lst)
  12.                   (if (or (< (cadr p1) (cadr p0))
  13.                           (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  14.                       )
  15.                       (setq p0 p1)
  16.                   )
  17.               )
  18.               (setq lst (vl-remove p0 lst))
  19.               (setq lst (append (list p0) lst))
  20.               (setq lst
  21.                   (vl-sort lst
  22.                       (function
  23.                           (lambda ( a b / c d )
  24.                               (if (or (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8) (and (or (equal c 0.0 1e-8) (equal c (* 2 pi) 1e-8)) (or (equal d 0.0 1e-8) (equal d (* 2 pi) 1e-8))))
  25.                                   (< (distance (list (car p0) (cadr p0)) a) (distance (list (car p0) (cadr p0)) b))
  26.                                   (< c d)
  27.                               )
  28.                           )
  29.                       )
  30.                   )
  31.               )
  32.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  33.               (foreach pt (cdddr lst)
  34.                   (setq ch (cons pt ch))
  35.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt))
  36.                       (setq ch (cons pt (cddr ch)))
  37.                   )
  38.               )
  39.               (reverse ch)
  40.           )
  41.       )
  42.   )
  43.  
  44.   ;; Clockwise-p  -  Lee Mac
  45.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  46.  
  47.   (defun LM:Clockwise-p ( p1 p2 p3 )
  48.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  49.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  50.           )
  51.           1e-8
  52.       )
  53.   )
  54.  
  55.   (defun insidep ( pt entn / big flag obj1 obj2 obj3 p1 p2 small )
  56.     (vl-load-com)
  57.     (if (and pt entn)
  58.       (progn
  59.         (setq obj1 (vlax-ename->vla-object entn))
  60.         (setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
  61.               obj3 (car (vlax-invoke obj1 'Offset -0.001))
  62.         )
  63.         (if (> (vla-get-area obj2) (vla-get-area obj3))
  64.           (progn
  65.             (set 'big obj2)
  66.             (set 'small obj3)
  67.           )
  68.           (progn
  69.             (set 'big obj3)
  70.             (set 'small obj2)
  71.           )
  72.         )
  73.         (setq p1 (vlax-curve-getClosestPointTo big pt)
  74.               p2 (vlax-curve-getClosestPointTo small pt)
  75.         )
  76.         (if (> (distance pt p1) (distance pt p2))
  77.           (setq flag T)
  78.           (setq flag nil)
  79.         )
  80.         (mapcar (function (lambda (x)
  81.                             (progn
  82.                               (vla-delete x)
  83.                               (vlax-release-object x)
  84.                             )
  85.                           )
  86.                 )
  87.                 (list big small)
  88.         )
  89.         (if (equal (trans pt entn 0) (vlax-curve-getclosestpointto entn pt) 1e-6)
  90.           (setq flag T)
  91.         )
  92.       )
  93.     )
  94.     flag
  95.   )
  96.  
  97.   (defun nea ( p1 p2 )
  98.     (polar p1 (angle p1 p2) 1e-2)
  99.   )
  100.  
  101.   (defun process ( pll ell )
  102.     (setq plll nil eln nil chl t pl pll)
  103.     (while (or (< (length plll) 3) (not (vl-every '(lambda ( x ) (vl-position x chl)) plll)))
  104.       (setq p (car pll))
  105.       (setq plll (cons p plll))
  106.       (setq chl (LM:ConvexHull plll))
  107.       (setq pll (cdr pll))
  108.     )
  109.     (command "_.PLINE")
  110.     (foreach p plll
  111.       (command "_non" p)
  112.     )
  113.     (command "_C")
  114.     (setq elll (mapcar '(lambda ( a b ) (list a b)) plll (cdr (reverse (cons (car plll) (reverse plll))))))
  115.     (foreach e elll
  116.       (if (not (or (vl-position e ell) (vl-position e el) (vl-position e en) (vl-position (reverse e) ell) (vl-position (reverse e) el) (vl-position (reverse e) en)))
  117.         (setq eln (cons e eln) en (cons e en))
  118.       )
  119.     )
  120.     (if eln
  121.       (if (= (length eln) 1)
  122.         (progn
  123.           (setq pll3 (reverse (member (cadar eln) (reverse (member (caar eln) (append pl pl))))))
  124.           (if (/= (length pll3) (1- (length pl)))
  125.             (setq pll3 (reverse (member (caar eln) (reverse (member (cadar eln) (append pl pl))))))
  126.           )
  127.           (while
  128.             (or
  129.               (not (insidep (nea (car pll3) (cadr pll3)) lw)) (not (insidep (nea (cadr pll3) (car pll3)) lw))
  130.               (not (insidep (nea (cadr pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (cadr pll3)) lw))
  131.               (not (insidep (nea (car pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (car pll3)) lw))
  132.               (progn
  133.                 (setq li1 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (cadr pll3)))))
  134.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li1) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  135.                 (entdel li1)
  136.                 f
  137.               )
  138.               (progn
  139.                 (setq li2 (entmakex (list '(0 . "LINE") (cons 10 (cadr pll3)) (cons 11 (caddr pll3)))))
  140.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li2) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  141.                 (entdel li2)
  142.                 f
  143.               )
  144.               (progn
  145.                 (setq li3 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (caddr pll3)))))
  146.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li3) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  147.                 (entdel li3)
  148.                 f
  149.               )
  150.             )
  151.             (setq pll3 (cons (last pll3) (reverse (cdr (reverse pll3)))))
  152.           )
  153.           (setq ell3 (mapcar '(lambda ( a b ) (list a b)) pll (cdr (reverse (cons (car pll) (reverse pll))))))
  154.         )
  155.       )
  156.     )
  157.   )
  158.  
  159.   (setq lw (car (entsel "\nPick polygonal LWPOLYLINE...")))
  160.   (while (not (and lw (= (cdr (assoc 0 (entget lw))) "LWPOLYLINE") (or (= (cdr (assoc 70 (entget lw))) 1) (= (cdr (assoc 70 (entget lw))) 129)) (vl-every 'zerop (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 42)) (entget lw))))))
  161.     (prompt "\nMissed or wrong entity picked... Pick polygonal LWPOLYLINE again...")
  162.     (setq lw (car (entsel)))
  163.   )
  164.   (setq pl (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget lw))))
  165.   (setq el (mapcar '(lambda ( a b ) (list a b)) pl (cdr (reverse (cons (car pl) (reverse pl))))))
  166.   (setq ch (LM:ConvexHull pl))
  167.   (if (vl-every '(lambda ( x ) (vl-position x ch)) pl)
  168.     (foreach tr (mapcar '(lambda ( a b ) (list (car pl) a b)) (cdr pl) (cddr pl))
  169.       (command "_.PLINE")
  170.       (foreach p tr
  171.         (command "_non" p)
  172.       )
  173.       (command "_C")
  174.     )
  175.     (progn
  176.       (setq pll pl ell el eln t)
  177.       (while eln
  178.         (if (and pll3 ell3)
  179.           (process pll3 ell3)
  180.           (process pll ell)
  181.         )
  182.       )
  183.     )
  184.   )
  185.   (princ)
  186. )
  187.  

Thanks, M.R.
[EDIT : Updated code and it works...]
« Last Edit: June 19, 2019, 12:34:29 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3293
  • Marko Ribar, architect
Re: splitconcavepolygon2convexpolygons-triangles
« Reply #1 on: March 23, 2016, 06:17:00 PM »
Fixed code... You can test it and inform me if somethings wrong...

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

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3293
  • Marko Ribar, architect
Re: splitconcavepolygon2convexpolygons-triangles
« Reply #2 on: March 24, 2016, 11:27:00 AM »
As addition, here is my version of polygon centroid based on previously posted algorithm...

Code - Auto/Visual Lisp: [Select]
  1. (defun polygoncentroid ( lw / LM:ConvexHull LM:Clockwise-p insidep nea triangarea gravitycenttriang process p pl el ch pll ell chl eln plll elll pll3 ell3 en li1 li2 li3 f trl ar mx my )
  2.   ;;splitconcavepolygon2convexpolygons-triangles
  3.  
  4.   ;; Convex Hull  -  Lee Mac
  5.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  6.  
  7.   (defun LM:ConvexHull ( lst / ch p0 )
  8.       (cond
  9.           (   (< (length lst) 4) lst)
  10.           (   (setq p0 (car lst))
  11.               (foreach p1 (cdr lst)
  12.                   (if (or (< (cadr p1) (cadr p0))
  13.                           (and (= (cadr p1) (cadr p0)) (< (car p1) (car p0)))
  14.                       )
  15.                       (setq p0 p1)
  16.                   )
  17.               )
  18.               (setq lst (vl-remove p0 lst))
  19.               (setq lst (append (list p0) lst))
  20.               (setq lst
  21.                   (vl-sort lst
  22.                       (function
  23.                           (lambda ( a b / c d )
  24.                               (if (or (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8) (and (or (equal c 0.0 1e-8) (equal c (* 2 pi) 1e-8)) (or (equal d 0.0 1e-8) (equal d (* 2 pi) 1e-8))))
  25.                                   (< (distance (list (car p0) (cadr p0)) a) (distance (list (car p0) (cadr p0)) b))
  26.                                   (< c d)
  27.                               )
  28.                           )
  29.                       )
  30.                   )
  31.               )
  32.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  33.               (foreach pt (cdddr lst)
  34.                   (setq ch (cons pt ch))
  35.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt))
  36.                       (setq ch (cons pt (cddr ch)))
  37.                   )
  38.               )
  39.               (reverse ch)
  40.           )
  41.       )
  42.   )
  43.  
  44.   ;; Clockwise-p  -  Lee Mac
  45.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  46.  
  47.   (defun LM:Clockwise-p ( p1 p2 p3 )
  48.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  49.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  50.           )
  51.           1e-8
  52.       )
  53.   )
  54.  
  55.   (defun insidep ( pt entn / big flag obj1 obj2 obj3 p1 p2 small )
  56.     (vl-load-com)
  57.     (if (and pt entn)
  58.       (progn
  59.         (setq obj1 (vlax-ename->vla-object entn))
  60.         (setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
  61.               obj3 (car (vlax-invoke obj1 'Offset -0.001))
  62.         )
  63.         (if (> (vla-get-area obj2) (vla-get-area obj3))
  64.           (progn
  65.             (set 'big obj2)
  66.             (set 'small obj3)
  67.           )
  68.           (progn
  69.             (set 'big obj3)
  70.             (set 'small obj2)
  71.           )
  72.         )
  73.         (setq p1 (vlax-curve-getClosestPointTo big pt)
  74.               p2 (vlax-curve-getClosestPointTo small pt)
  75.         )
  76.         (if (> (distance pt p1) (distance pt p2))
  77.           (setq flag T)
  78.           (setq flag nil)
  79.         )
  80.         (mapcar (function (lambda (x)
  81.                             (progn
  82.                               (vla-delete x)
  83.                               (vlax-release-object x)
  84.                             )
  85.                           )
  86.                 )
  87.                 (list big small)
  88.         )
  89.         (if (equal (trans pt entn 0) (vlax-curve-getclosestpointto entn pt) 1e-6)
  90.           (setq flag T)
  91.         )
  92.       )
  93.     )
  94.     flag
  95.   )
  96.  
  97.   (defun nea ( p1 p2 )
  98.     (polar p1 (angle p1 p2) 1e-2)
  99.   )
  100.  
  101.   (defun triangarea ( p1 p2 p3 / unit mid v12 v13 v1 v21 v23 v2 c cz r ar )
  102.  
  103.     (defun unit ( v )
  104.       (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  105.     )
  106.  
  107.     (defun mid ( p1 p2 )
  108.       (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  109.     )
  110.  
  111.     (setq v12 (unit (mapcar '- p2 p1)))
  112.     (setq v13 (unit (mapcar '- p3 p1)))
  113.     (setq v1 (unit (mid v12 v13)))
  114.  
  115.     (setq v21 (mapcar '- v12))
  116.     (setq v23 (unit (mapcar '- p3 p2)))
  117.     (setq v2 (unit (mid v21 v23)))
  118.  
  119.     (setq c (inters p1 (mapcar '+ p1 v1) p2 (mapcar '+ p2 v2) nil))
  120.     (setq cz (trans c 0 v12))
  121.     (setq r (distance (mapcar '+ '(0.0 0.0) (trans p1 0 v12)) cz))
  122.  
  123.     (setq ar (* r 0.5 (+ (distance p1 p2) (distance p2 p3) (distance p3 p1))))
  124.  
  125.     ar
  126.   )
  127.  
  128.   (defun gravitycenttriang ( p1 p2 p3 / mid p12 p23 p31 c )
  129.  
  130.     (defun mid ( p1 p2 )
  131.       (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  132.     )
  133.  
  134.     (setq p12 (mid p1 p2))
  135.     (setq p23 (mid p2 p3))
  136.     (setq p31 (mid p3 p1))
  137.     (setq c (inters p12 p3 p1 p23))
  138.  
  139.     c
  140.  
  141.   )
  142.  
  143.   (defun process ( pll ell )
  144.     (setq plll nil eln nil chl t pl pll)
  145.     (while (or (< (length plll) 3) (not (vl-every '(lambda ( x ) (vl-position x chl)) plll)))
  146.       (setq p (car pll))
  147.       (setq plll (cons p plll))
  148.       (setq chl (LM:ConvexHull plll))
  149.       (setq pll (cdr pll))
  150.     )
  151.     (setq trl (cons plll trl))
  152.     (setq elll (mapcar '(lambda ( a b ) (list a b)) plll (cdr (reverse (cons (car plll) (reverse plll))))))
  153.     (foreach e elll
  154.       (if (not (or (vl-position e ell) (vl-position e el) (vl-position e en) (vl-position (reverse e) ell) (vl-position (reverse e) el) (vl-position (reverse e) en)))
  155.         (setq eln (cons e eln) en (cons e en))
  156.       )
  157.     )
  158.     (if eln
  159.       (if (= (length eln) 1)
  160.         (progn
  161.           (setq pll3 (reverse (member (cadar eln) (reverse (member (caar eln) (append pl pl))))))
  162.           (if (/= (length pll3) (1- (length pl)))
  163.             (setq pll3 (reverse (member (caar eln) (reverse (member (cadar eln) (append pl pl))))))
  164.           )
  165.           (while
  166.             (or
  167.               (not (insidep (nea (car pll3) (cadr pll3)) lw)) (not (insidep (nea (cadr pll3) (car pll3)) lw))
  168.               (not (insidep (nea (cadr pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (cadr pll3)) lw))
  169.               (not (insidep (nea (car pll3) (caddr pll3)) lw)) (not (insidep (nea (caddr pll3) (car pll3)) lw))
  170.               (progn
  171.                 (setq li1 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (cadr pll3)))))
  172.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li1) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  173.                 (entdel li1)
  174.                 f
  175.               )
  176.               (progn
  177.                 (setq li2 (entmakex (list '(0 . "LINE") (cons 10 (cadr pll3)) (cons 11 (caddr pll3)))))
  178.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li2) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  179.                 (entdel li2)
  180.                 f
  181.               )
  182.               (progn
  183.                 (setq li3 (entmakex (list '(0 . "LINE") (cons 10 (car pll3)) (cons 11 (caddr pll3)))))
  184.                 (setq f (> (length (vlax-invoke (vlax-ename->vla-object li3) 'intersectwith (vlax-ename->vla-object lw) acextendnone)) 6))
  185.                 (entdel li3)
  186.                 f
  187.               )
  188.             )
  189.             (setq pll3 (cons (last pll3) (reverse (cdr (reverse pll3)))))
  190.           )
  191.           (setq ell3 (mapcar '(lambda ( a b ) (list a b)) pll (cdr (reverse (cons (car pll) (reverse pll))))))
  192.         )
  193.       )
  194.     )
  195.   )
  196.  
  197.   (if (and lw (= (cdr (assoc 0 (entget lw))) "LWPOLYLINE") (or (= (cdr (assoc 70 (entget lw))) 1) (= (cdr (assoc 70 (entget lw))) 129)) (vl-every 'zerop (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 42)) (entget lw)))))
  198.     (progn
  199.       (setq pl (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget lw))))
  200.       (setq el (mapcar '(lambda ( a b ) (list a b)) pl (cdr (reverse (cons (car pl) (reverse pl))))))
  201.       (setq ch (LM:ConvexHull pl))
  202.       (if (vl-every '(lambda ( x ) (vl-position x ch)) pl)
  203.         (progn
  204.           (setq p (car pl))
  205.           (setq trl (mapcar '(lambda ( a b ) (list p a b)) (cdr pl) (cddr pl)))
  206.         )
  207.         (progn
  208.           (setq pll pl ell el eln t)
  209.           (while eln
  210.             (if (and pll3 ell3)
  211.               (process pll3 ell3)
  212.               (process pll ell)
  213.             )
  214.           )
  215.         )
  216.       )
  217.       (setq ar 0.0 mx 0.0 my 0.0)
  218.       (foreach tr trl
  219.         (setq ar (+ ar (triangarea (car tr) (cadr tr) (caddr tr))))
  220.         (setq mx (+ mx (* (triangarea (car tr) (cadr tr) (caddr tr)) (car (gravitycenttriang (car tr) (cadr tr) (caddr tr))))))
  221.         (setq my (+ my (* (triangarea (car tr) (cadr tr) (caddr tr)) (cadr (gravitycenttriang (car tr) (cadr tr) (caddr tr))))))
  222.       )
  223.       (list (/ mx ar) (/ my ar) 0.0)
  224.     )
  225.     (prompt "\nWrong entity supplied as function argument or nil argument... Please supply polygon LWPOLYLINE as argument next time...")
  226.   )
  227. )
  228.  

Test :
Code - Auto/Visual Lisp: [Select]
  1. (setq cent (polygoncentroid (car (entsel "\nPick polygonal LWPOLYLINE..."))))
  2.  

M.R.
P.S. My testing results are identical with AutoDesks (polygon -> region -> centroid), you can now check it...
« Last Edit: June 19, 2019, 12:35:04 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube