我是一名船设计师,经常需要计算多段线的总长度和重心(开放和闭合多段线)。
我在下面有一个片段来展示我当前使用的示例代码-这只适用于一组行-它不适用于多段线。
目前,每次我必须计算重心时,我必须复制多段线,分解它并选择线来计算重心。
逻辑如下-假设我们在多段线上有3段(A、B、C):
多段线的重心=(A的长度乘以A的质心+b的长度乘以b的质心+C的长度乘以C的质心)除以多段线的总长度
我对LISP不太熟悉&虽然我有一些其他编程语言的背景,但我发现编写代码相对困难,语法差别很大。
我发现了一个类似的代码(由AndreaAndreetti编写的TotalADD Total add&修改为下面的代码)。
如果我可以选择一组多段线(使用select Simular)并运行命令以在autocad中获得一个文本表,并为不同图层上的一组多段线计算CG和总长度,这将非常理想。
但我不确定如何实现这一点。你能帮忙吗?还是我要求的太多了?任何指导都将不胜感激。
- (if (eq (vla-get-objectname n) "AcDbLine")
- (progn
- (setq itemlinelength (+ itemlinelength (vla-get-length n)))
-
- (setq StartPoint(vlax-safearray->list
- (vlax-variant-value (vla-get-startpoint n))))
- (setq x1 (car Startpoint))
- (setq y1 (cadr Startpoint))
-
- (setq EndPoint(vlax-safearray->list
- (vlax-variant-value (vla-get-endpoint n))))
- (setq x2 (car endpoint))
- (setq y2 (cadr endpoint))
-
- (setq xmid (* (+ x1 x2) 0.5))
- (setq ymid (* (+ y1 y2) 0.5))
- (setq xmom (* xmid (vla-get-length n)))
- (setq ymom (* ymid (vla-get-length n)))
- (setq itemxmoment (+ itemxmoment xmom))
- (setq itemymoment (+ itemymoment ymom))
-
- )
- )
- (setq totxcg (/ itemxmoment itemlinelength))
- (setq totycg (/ itemymoment itemlinelength))
- (setq tlength (rtos itemlength 2 )
- (setq totxcg (rtos totxcg 2 )
- (setq totycg (rtos totycg 2 )
- (acet-ui-status (strcat "Length: " tlength "\n"
- "X CoG Pos: " totxcg "\n" "Y CoG Pos: " totycg "\n"
- )
|