嗨jan_ek
微积分很简单。它只需要对每个对象的面积和从质心到轴的距离的乘积求和。
我不太明白的是“选定坐标系”。
这是我对这个问题的解释。
对象必须是当前UCS中的面域。
第一个点是坐标系的原点,第二个点是X方向。Y方向是Ox逆时针旋转90度。
在WCS和在xOy平面中旋转的任何UCS中工作良好。
- ;Static Moment
- ;Stefan M. - 07.08.2016
- (defun C:STM ( / rot a c e i o reg ss sx sy v x y u p)
- (defun rot (p u)
- (list
- (+ (* (car p) (cos u)) (* (cadr p) (sin u)))
- (- (* (cadr p) (cos u)) (* (car p) (sin u)))
- )
- )
-
- (if
- (and
- (setq ss (ssget '((0 . "REGION"))))
- (setq o (getpoint "\nSpecify coorditate system origin: "))
- (setq x (getpoint o "\nSpecify X direction: "))
- )
- (progn
- (setq u (angle o x)
- sx 0.0 sy 0.0
- reg (ssadd))
- (repeat (setq i (sslength ss))
- (setq e (ssname ss (setq i (1- i)))
- v (vlax-ename->vla-object e))
- (if
- (not
- (vl-catch-all-error-p
- (setq c
- (vl-catch-all-apply
- 'vlax-get
- (list v 'centroid)
- )
- )
- )
- )
- (setq a (vla-get-area v)
- p (rot (mapcar '- c o) u)
- sx (+ sx (* a (cadr p)))
- sy (+ sy (* a (car p)))
- )
- (ssadd e reg)
- )
- )
- (princ "\nSx = ") (princ (rtos sx 2 2))
- (princ "\nSy = ") (princ (rtos sy 2 2))
- (if
- (> (sslength reg) 0)
- (progn
- (princ "\nInvalid region(s) found")
- (sssetfirst nil reg)
- )
- )
- )
- )
- (princ)
- )
|