jan_ek Posted May 10, 2015 Share Posted May 10, 2015 How to get the center of gravity solids contained in the block. I used (vlax-safearray->list(vlax-variant-value(vla-get-centroid vlaobject))) Unfortunately, I do not know how to convert to global coordinate system Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted May 10, 2015 Share Posted May 10, 2015 Use gile's refgeom function to transform the point relative to the block reference geometry, for example: (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) Quote Link to comment Share on other sites More sharing options...
jan_ek Posted May 11, 2015 Author Share Posted May 11, 2015 This is a great function, thanks very much. function takes the center of gravity of the first solid block is there a way that no "union" to determine the center of gravity of the two\thre... solids ? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.