1. (defun $point->Polyline->reg->centroid$
  2.        (pts lst / centroid doc obj obj1 obj2 mp tmp)
  3.           ;坐标集求质心
  4.   (setq pts (vl-remove nil pts))
  5.   (setq  pts (mapcar (function (lambda (a) (list (car a) (cadr a))))
  6.         pts
  7.       )
  8.   )
  9.   (SETQ pts (APPLY 'APPEND pts))
  10.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  11.   (if (= (getvar 'ctab) "Model")
  12.     (setq mp (vla-get-modelSpace doc))
  13.     (setq mp (vla-get-paperSpace doc))
  14.   )
  15.   (and pts
  16.        (setq tmp (vl-catch-all-apply
  17.        'vlax-make-safearray
  18.        (LIST vlax-vbDouble
  19.        (cons 0 (- (length pts) 1))
  20.        )
  21.      )
  22.        )
  23.        (vl-catch-all-apply 'vlax-safearray-fill (LIST tmp pts))
  24.   )
  25.   (and doc
  26.        tmp
  27.        (setq
  28.    obj1
  29.     (vl-catch-all-apply
  30.       'vla-addLightweightPolyline
  31.       (LIST mp tmp)
  32.     )
  33.        )
  34.        (not (vl-catch-all-error-p obj1))
  35.        (progn (vl-catch-all-apply 'vla-Put-CLOSED (LIST obj1 1)) t)
  36.        (setq
  37.    OBJ2 (vl-catch-all-apply
  38.     'vla-addRegion
  39.     (list
  40.       mp
  41.       (vl-catch-all-apply
  42.         'vlax-make-variant
  43.         (list
  44.           (vl-catch-all-apply
  45.       'vlax-safearray-fill
  46.       (list
  47.         (vlax-make-safearray vlax-vbObject '(0 . 0))
  48.         (list obj1)
  49.       )
  50.           )
  51.         )
  52.       )
  53.     )
  54.         )
  55.        )
  56.        (not (vl-catch-all-error-p OBJ2))
  57.        (setq obj (car (vlax-safearray->list (vlax-variant-value obj2))))
  58.        (not (vl-catch-all-error-p obj))
  59.        (setq
  60.    centroid (vlax-safearray->list
  61.         (vlax-variant-value
  62.           (vla-get-Centroid
  63.       obj
  64.           )
  65.         )
  66.       )
  67.        )
  68.   )
  69.   (if (and obj (not (vl-catch-all-error-p obj)))
  70.     (vl-catch-all-apply 'vla-delete (list obj))
  71.   )
  72.   (if (and obj1 (not (vl-catch-all-error-p obj1)))
  73.     (vl-catch-all-apply 'vla-delete (list obj1))
  74.   )
  75.   centroid
  76. )
  77. ;调用示例
  78. (vl-cmdf "point"
  79.    ($points->Polyline>reg>centroid$
  80.      (list (getpoint)
  81.      (getpoint)
  82.      (getpoint)
  83.      (getpoint)
  84.      )
  85.      nil
  86.    )
  87. )



网友答: 本帖最后由 yanshengjiang 于 2025-8-25 12:31 编辑

  1. 虽然保证了在线内,但或许不是质心。
  2. (Defun c:tt()
  3.   (command "point" (CENpoint(car(entsel))) )
  4.   )
  5. (defun CENpoint(e / p POLY POLY_vl Dx Dy Lp List_vert_poly list_p_int P_center dist step1 step2 e1 makep LWPoly->List grid_1 Point_int grid+ Point_center)
  6.   (defun makep(pt)
  7.     (entmake(append(list'(0 . "LWPOLYLINE")'(100 . "AcDbEntity")'(100 . "AcDbPolyline")'(8 . "0")
  8.       (cons 90(length pt))'(70 . 1))(mapcar '(lambda (x)(cons 10 x))pt))))
  9.   (defun LWPoly->List(ent / der di1 di2 inc lst par rad )
  10.     (setq par 0)
  11.     (repeat(cdr(assoc 90(entget ent)))
  12.         (if (setq der(vlax-curve-getsecondderiv ent par))
  13.             (if (equal der '(0.0 0.0 0.0) 1e-8)
  14.                 (setq lst (cons (vlax-curve-getpointatparam ent par) lst))
  15.                 (if(setq rad (distance '(0.0 0.0) (vlax-curve-getfirstderiv ent par))
  16.        di1 (vlax-curve-getdistatparam ent par)
  17.        di2 (vlax-curve-getdistatparam ent (1+ par)))
  18.                     (progn
  19.                         (setq inc(/(- di2 di1)(1+(fix(* 25(/(- di2 di1)rad(+ pi pi)))))))
  20.                         (while (< di1 di2)
  21.                             (setq lst(cons (vlax-curve-getpointatdist ent di1)lst)
  22.                                   di1(+ di1 inc)))))))
  23.         (setq par(1+ par)))
  24.     lst)
  25.   (defun grid_1 (POLY_vl step1 / P1_ P2_ n P> )
  26.     (vla-getboundingbox POLY_vl 'p1 'p2)
  27.     (setq P1_ (vlax-safearray->list p1)
  28.     P2_ (vlax-safearray->list p2)
  29.     P1_ (list (car P1_) (cadr P1_))
  30.     P2_ (list (car P2_) (cadr P2_))n 0
  31.     Dx (/ (- (car P2_) (car P1_)) step1)
  32.     Dy (/ (- (cadr P2_) (cadr P1_)) step1)
  33.     P> P1_
  34.     Lp (list P1_))
  35.     (repeat (* (1+ step1) step1)
  36.         (setq P> (list (+ (car P>) Dx) (cadr P>))
  37.         Lp (cons P> Lp)n (1+ n))
  38.         (if (= n step1)
  39.             (setq n 0
  40.       P1_ (list (car P1_) (+ (cadr P1_) Dy))
  41.       P> P1_
  42.       Lp (cons P> Lp))))
  43.     (cdr Lp))
  44.   (defun Point_int ( Lp list_vert_poly / P_distant n Pr cont attr p# Pa Pa_ Pb )
  45.     (setq P_distant (list (car (getvar "extmax")) (* 2 (cadr (getvar "extmax"))))
  46.     list_p_int nil)
  47.     (foreach Pr Lp
  48.       (setq cont -1
  49.       attr 0
  50.       Pa (nth (setq cont (1+ cont)) list_vert_poly)
  51.       Pa_ Pa)
  52.         (repeat(length list_vert_poly)
  53.             (setq Pb (nth (setq cont (1+ cont)) list_vert_poly))
  54.             (if (= cont (length list_vert_poly)) (setq Pb Pa_))
  55.             (if(inters Pa Pb Pr P_distant)(setq attr (1+ attr)))
  56.             (setq Pa Pb))
  57.         (if(>(rem attr 2)0)(setq list_p_int(cons Pr list_p_int))))
  58.   list_p_int)
  59.   (defun grid+ (list_p_int / G+)
  60.     (setq G+(mapcar '(lambda ( x ) (list (+ (car x) (/ Dx 2)) (+ (cadr x) (/ Dy 2)))) list_p_int)
  61.     list_p_int(append G+ list_p_int)))
  62.   (defun Point_center (list_p_int / Pa n Pvic)
  63.     (setq Dist 0.0000001)
  64.     (setq P_center nil)
  65.     (foreach Pa list_p_int
  66.       (setq Pvic (vlax-curve-getClosestPointTo POLY_vl Pa))
  67.       (if(>(distance Pa Pvic)Dist)
  68.   (setq Dist(distance Pa Pvic)P_center Pa)))
  69.     P_center)
  70.   (if(equal(type e)'LIST)(progn(makep e)(setq e1(entlast)))(setq e1 e))
  71.   (setq step1 50)
  72.   (setq step2 25)
  73.   (setq POLY_vl (vlax-ename->vla-object e1))
  74.   (setq list_vert_poly (LWPoly->List e1))
  75.   (setq lp(grid_1 POLY_vl step1))
  76.   (setq list_p_int(grid+(Point_int lp list_vert_poly)))
  77.   (setq p(Point_center list_p_int))
  78.   (if (equal(type e)'LIST)(entdel e1))
  79.   p)




网友答:
kozmosovia 发表于 2025-8-24 09:08
几个command,5行代码就可以搞定的事,写那么长,真闲。但凡取个点集,计算凸壳再求质心,我都觉得这函数有 ...

凸壳求质心,CGAL就可以,我现在不想用CGAL了,试试lisp求质心到底什么情况

网友答: 本帖最后由 kozmosovia 于 2025-8-24 09:15 编辑

几个command,5行代码就可以搞定的事,写那么长,真闲。但凡取个点集,计算凸壳再求质心,我都觉得这函数有价值。

网友答: 本帖最后由 xyp1964 于 2025-8-24 16:30 编辑

参数 lst 跑哪里去了?
点集连线有可能自相交


网友答:
xyp1964 发表于 2025-8-24 16:16
参数 lst 跑哪里去了?

lst是属于【未来参数】

网友答: 这个容易出bug,自交的pl线,弄不出来面域

网友答:

网友答: 多段线质心和相对内部点



网友答: 如果要考虑线内和线外,CGAL是专门解决这个问题的
  • 上一篇:通用的对话框DCL赋值与取值函数
  • 下一篇:没有了