jan_ek 发表于 2022-7-5 19:48:32

重心

如何获取块中包含的重心实体。
 
 
 
 
我用过
 
(vlax-safearray->list(vlax-variant-value(vla-get-centroid vlaobject)))
不幸的是,我不知道如何转换为全局坐标系

Lee Mac 发表于 2022-7-5 20:20:26

使用gile的refgeom函数相对于块参考几何图元变换点,例如:
(defun c:test ( / cen ent )
   (princ "\nSelect a block reference containing a solid: ")
   (if (setq ent (ssget "_+.:E:S" '((0 . "INSERT"))))
       (progn
         (setq ent (ssname ent 0))
         (vlax-for obj (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 2 (entget ent))))
               (if (vlax-property-available-p obj 'centroid)
                   (setq cen (vlax-get obj 'centroid))
               )
         )
         (if cen
               (entmake
                   (list
                      '(0 . "POINT")
                     (cons 10 (apply '(lambda ( m v ) (mapcar '+ (mxv m cen) v)) (refgeom ent)))
                   )
               )
               (princ "\nNo block components found with Centroid property.")
         )
       )
   )
   (princ)
)

;; RefGeom (gile)
;; Returns a list whose first item is a 3x3 transformation matrix and
;; second item the object insertion point in its parent (xref, block or space)

(defun refgeom ( ent / ang enx mat ocs )
   (setq enx (entget ent)
         ang (cdr (assoc 050 enx))
         ocs (cdr (assoc 210 enx))
   )
   (list
       (setq mat
         (mxm
               (mapcar '(lambda ( v ) (trans v 0 ocs t))
                  '(
                     (1.0 0.0 0.0)
                     (0.0 1.0 0.0)
                     (0.0 0.0 1.0)
                   )
               )
               (mxm
                   (list
                     (list (cos ang) (- (sin ang)) 0.0)
                     (list (sin ang) (cos ang)   0.0)
                      '(0.0 0.0 1.0)
                   )
                   (list
                     (list (cdr (assoc 41 enx)) 0.0 0.0)
                     (list 0.0 (cdr (assoc 42 enx)) 0.0)
                     (list 0.0 0.0 (cdr (assoc 43 enx)))
                   )
               )
         )
       )
       (mapcar '- (trans (cdr (assoc 10 enx)) ocs 0)
         (mxv mat (cdr (assoc 10 (tblsearch "block" (cdr (assoc 2 enx))))))
       )
   )
)

;; Matrix Transpose-Doug Wilson
;; Args: m - nxn matrix

(defun trp ( m )
   (apply 'mapcar (cons 'list m))
)

;; Matrix x Matrix-Vladimir Nesterovsky
;; Args: m,n - nxn matrices

(defun mxm ( m n )
   ((lambda ( a ) (mapcar '(lambda ( r ) (mxv a r)) m)) (trp n))
)

;; Matrix x Vector-Vladimir Nesterovsky
;; Args: m - nxn matrix, v - vector in R^n

(defun mxv ( m v )
   (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
)

(vl-load-com) (princ)

jan_ek 发表于 2022-7-5 20:54:23

这是一个很棒的功能,非常感谢。
 
 
函数取第一个实体块的重心
有没有一种方法,没有“联合”来确定两个物体的重心。。。固体?
页: [1]
查看完整版本: 重心