neodesigner 发表于 2022-7-5 19:48:54

群o的重心

我是一名船设计师,经常需要计算多段线的总长度和重心(开放和闭合多段线)。
我在下面有一个片段来展示我当前使用的示例代码-这只适用于一组行-它不适用于多段线。
目前,每次我必须计算重心时,我必须复制多段线,分解它并选择线来计算重心。
 
逻辑如下-假设我们在多段线上有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"
                                        )

BlackBox 发表于 2022-7-5 21:19:00

欢迎来到CADTutor。
 
从另一种编程语言到LISP可能是一个不同的世界,但它最终只是一个不同的对象模型,有自己的对象、属性、方法和事件——可以说是一个词汇表。
 
为了简化编程工作,您可以使用一些Visual LISP(ActiveX)函数,特别是vlax Curve*函数来处理原始多段线,以便剔除所述多段线顶点的必要坐标。可以评估该坐标列表以获得重心。
 
如果你想节省一些时间,而不必自己开发,你可以下载Gile的定制OSNAP应用程序(早在+/-2009年发布的C插件?),它实现了一个新的CTR(质心)OSNAP。如果你找不到他公开发布的源代码,也无法自己编译,他还会销售一款Autodesk Exchange应用程序,这两款应用程序都提供了远不止这一项的功能。
 
同样值得注意的是,AutoCAD 2016最终通过一个新的GCE(几何中心)OSNAP添加了这一新功能,我亲切地将其称为Gilles Chanteau Emulator,因为它很相似,但与原来的稍有差距。哈哈
 
干杯
页: [1]
查看完整版本: 群o的重心