11
35
28
初露锋芒
使用道具 举报
54
3755
3583
后起之秀
(vla-getentity util 'plineObj 'pickPt "\nSelect a polyline:\n")
(setq plineObj (vlax-ename->vla-object (entlast)))
15
687
169
中流砥柱
;; ALGEB-AREA;; Returns the algebraic area of the triangle defined by three 2d points;; the area is negative if points are clockwise(defun algeb-area (p1 p2 p3) (/ (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1)))(* (- (car p3) (car p1)) (- (cadr p2) (cadr p1))) ) 2.0 ));; TRIANGLE-CENTROID;; Returns the centroid of a triangle defined by 3 points(defun triangle-centroid (p1 p2 p3) (mapcar '(lambda (x1 x2 x3) (/ (+ x1 x2 x3) 3.0) ) p1 p2 p3 ));; POLYARC-CENTROID;; Returns a list which first item is the centroid of a 'polyarc';; and the second its algeraic area;;;; Arguments;; bu : polyarc bulge;; p1 : start point;; p2 : end point(defun polyarc-centroid (bu p1 p2 / ang rad cen area dist cg) (setq ang (* 2 (atan bu))rad (/ (distance p1 p2) (* 2 (sin ang)) )cen (polar p1 (+ (angle p1 p2) (- (/ pi 2) ang)) rad )area (/ (* rad rad (- (* 2 ang) (sin (* 2 ang)))) 2.0)dist (/ (expt (distance p1 p2) 3) (* 12 area))cg (polar cen (- (angle p1 p2) (/ pi 2)) dist ) ) (list cg area));; PLINE-CENTROID;; Returns the WCS coordinates of a lwpolyline centroid;;;; Argument;; pl : the lwpolyline ename(defun pline-centroid (pl / elst lst tot cen p0 area cen) (setq elst (entget pl)) (while (setq elst (member (assoc 10 elst) elst)) (setq lst (cons (cons (cdar elst) (cdr (assoc 42 elst))) lst) elst (cdr elst) ) ) (setq lst (reverse lst)tot 0.0cen '(0.0 0.0)p0 (caar lst) ) (if (/= 0 (cdar lst)) (setq p-c (polyarc-centroid (cdar lst) p0 (caadr lst)) cen (mapcar '(lambda (x) (* x (cadr p-c))) (car p-c)) tot (cadr p-c) ) ) (setq lst (cdr lst)) (if (equal (car (last lst)) p0 1e-9) (setq lst (reverse (cdr (reverse lst)))) ) (while (cadr lst) (setq area (algeb-area p0 (caar lst) (caadr lst)) cen (mapcar '(lambda (x1 x2) (+ x1 (* x2 area))) cen (triangle-centroid p0 (caar lst) (caadr lst)) ) tot (+ area tot) ) (if (/= 0 (cdar lst)) (setq p-c (polyarc-centroid (cdar lst) (caar lst) (caadr lst)) cen (mapcar '(lambda (x1 x2) (+ x1 (* x2 (cadr p-c)))) cen (car p-c) ) tot (+ tot (cadr p-c)) ) ) (setq lst (cdr lst)) ) (if (/= 0 (cdar lst)) (setq p-c (polyarc-centroid (cdar lst) (caar lst) p0) cen (mapcar '(lambda (x1 x2) (+ x1 (* x2 (cadr p-c)))) cen (car p-c) ) tot (+ tot (cadr p-c)) ) ) (trans (list (/ (car cen) tot) (/ (cadr cen) tot) (cdr (assoc 38 (entget pl))) )