从MASSPROP中提取数据
我在这里和网上做了几次搜索,但没有找到解决方法。我还是autolisp程序的新手。基本上,我想做的是创建一个lisp例程,它允许我运行MASSPROP并将结果转储到文件中。当我读的时候。mpr文件我看到这个格式和我想存储在变量中的数据,以便我可以打印对象旁边的一个小值表,它们以红色突出显示:---------------- REGIONS ----------------
Area: 2.7587
Perimeter: 45.3718
Bounding box: X: 14.9715--17.4715
Y: 7.6293--15.6293
Centroid: X: 16.2215
Y: 11.6468
Moments of inertia: X: 394.2578
Y: 729.1778
Product of inertia:XY: 521.2024
Radii of gyration: X: 11.9546
Y: 16.2578
Principal moments and X-Y directions about centroid:
I: 20.0418 along
J: 3.2549 along
这将使我开始,我希望从那里采取定制。 因此,您不希望在中包含所有信息。mpr文件只是一个小节。
如果对象不是区域而是实体,该怎么办? 账单
可以从区域对象的相应Visual LISP ActiveX属性访问该数据(使用vlax dump对象查看哪些属性可用;结合Visual LISP IDE(VLIDE)帮助文档了解每个属性的信息);我还建议您在vlax get property/vla-*上使用未记录的vlax get函数,以避免将变体/安全数组转换为本机AutoLISP数据类型(例如列表)。
例子:
(defun c:test ( / e o f d l )
(if
(and
(setq e (car (entsel)))
(setq o (vlax-ename->vla-object e))
(eq "AcDbRegion" (vla-get-objectname o))
(setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
(setq d (open f "w"))
)
(progn
(princ
(strcat
"Area: "
(rtos (vlax-get o 'area))
"\nPerimeter: "
(rtos (vlax-get o 'perimeter))
"\nCentroid: "
(progn
(setq l (mapcar 'rtos (vlax-get o 'centroid)))
(strcat (car l) "," (cadr l))
)
"\nRadii of Gyration: "
(progn
(setq l (mapcar 'rtos (vlax-get o 'radiiofgyration)))
(strcat (car l) "," (cadr l))
)
)
d
)
(close d)
(startapp "notepad" f)
)
)
(princ)
)
(vl-load-com) (princ) 李,你确实是这段代码的大师,让它看起来很简单。我只能希望我在这方面至少有你一半的技能。这只是一个练习,我决定开始自学使用VLISP的一些更精细的方面。我主要从事门窗业务,我们经常使用和/或设计定制铝型材。通常需要具有这些形状的截面属性,并以良好的格式呈现它们。几年前,在第14版之前,我的一个体育朋友写了一个简单的LISP例程,它可以快速准备一个类似于我在附件中的表格。
这主要是在对象上运行MASSPROP命令时创建的mpr文件的全部内容。Wt/Ft条目是面积*1.18的计算。所有其他行都是与mpr文件相同的数据。边界很漂亮。哦,是的,它会在重心处画一个仰角符号。
如果我记得的话,旧的LISP文件将提示输入钢或铝,并将基于此计算每英尺的重量。我知道他的代码很简单,我希望我保存了一份。我记得唯一的一份是在一张5.1/4英寸的软盘上,这张软盘很久以前就被丢弃了。
更新:我找到了Wt/Ft部分,并将其写入文件中,尽管我需要找到一种方法将数字格式化为只有两位小数。
"Area: "
(rtos (vlax-get o 'area)) "Wt/Ft = " (rtos (* (vlax-get o 'area) 1.18))
我想我能解决这个问题。。。明天将进行更多练习。
截面属性。图纸 要使用qoute Lisp手册(rtos编号[模式[精度]]),请使用2表示模式和精度
如果按照上面的代码省略参数,则会使用更多LUNITS和LUPREC的值
希望这有帮助
是的,确实帮了不少忙。我用括号试了几次迭代,但最终得到了
(rtos (vlax-get o 'area)) "Wt/Ft = " (rtos (* (vlax-get o 'area) 1.18) 2 2)
它给了我想要的结果。另一块拼图被放置到位。我会继续努力,直到我把这个拿到我想要的地方。我的老朋友很早以前就为10版编写了这段代码,我想它在很多年前就已经去世了。我想我可以得到这个,然后它将再次属于我。
这个方块被添加了,我现在有了主要的时刻。还有几个步骤可以把重要的东西分配给变量,我想我已经做到了。。。大概
"\nPrincipal Moments: "
(progn
(setq l (mapcar 'rtos (vlax-get o 'principalmoments)))
(strcat (car l) "," (cadr l))
)
大家好,
我已经根据需要修改了上述lisp例程、质心(仅y)、面积和惯性矩。
但是我有很多区域,我需要为每个对象列出这些值。
有人能帮我吗?
(defun c:mpp ( / e o f d l )
(if
(and
(setq e (car (entsel)))
(setq o (vlax-ename->vla-object e))
(eq "AcDbRegion" (vla-get-objectname o))
(setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
(setq d (open f "w"))
)
(progn
(princ
(strcat
"Centroid: "
(progn
(setq l (mapcar 'rtos (vlax-get o 'centroid)))
(strcat (cadr l))
)
"\nArea: "
(rtos (vlax-get o 'area))
"\nMoments of inertia: "
(progn
(setq l (mapcar 'rtos (vlax-get o 'momentofinertia)))
(strcat (cadr l))
)
)
d
)
(close d)
(startapp "notepad" f)
)
)
(princ)
)
(vl-load-com) (princ) 这里的一个常见帖子是我想要不止一个,所以答案很简单,你需要用一个ssget替换entsel。
拾取对象或所有等,并使用重复查看选择集中的每个对象,将entsel替换为(ssname ss itemnum)。我没有发布答案的原因是我已经回答了,只要看看这里的任何lisp代码,你就会发现使用ssget和repeat的100个示例。
我认为,使用ssget而不是entsel在这种情况下是行不通的。因为列表应该按区域编号排序。我已经修改了可以执行的代码,但仍然无法获得列表:(
(defun c:mpp ( / e o f d l y A I)
(while
(and
(setq e (car (entsel)))
(setq o (vlax-ename->vla-object e))
(eq "AcDbRegion" (vla-get-objectname o))
(setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
(setq d (open f "w"))
)
(progn
(princ
(progn
(setq y (mapcar 'rtos (vlax-get o 'centroid)))
(setq A (rtos (vlax-get o 'area)))
(setq I (mapcar 'rtos (vlax-get o 'momentofinertia)))
(write-line (strcat (cadr y) " " A " " (cadr I)) d)
)
; d
)
(close d)
)
)
(princ)
)
(vl-load-com) (princ) 您需要一个双列表((“区域x”实体名称)(“区域x+1”实体名称)……)然后按区域编号对列表进行排序,然后通过其名称获取实体的属性。
页:
[1]
2