乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 70|回复: 10

[编程交流] 从MASSPROP中提取数据

[复制链接]

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 13:15:01 | 显示全部楼层 |阅读模式
我在这里和网上做了几次搜索,但没有找到解决方法。我还是autolisp程序的新手。基本上,我想做的是创建一个lisp例程,它允许我运行MASSPROP并将结果转储到文件中。当我读的时候。mpr文件我看到这个格式和我想存储在变量中的数据,以便我可以打印对象旁边的一个小值表,它们以红色突出显示:
 
  1. ----------------   REGIONS   ----------------
  2. [color=red]Area:                        2.7587[/color]
  3. [color=red]Perimeter:               45.3718[/color]
  4. Bounding box:         X: 14.9715  --  17.4715
  5.                              Y: 7.6293  --  15.6293
  6. [color=red]Centroid:                 X: 16.2215 [/color]
  7. [color=red]                              Y: 11.6468 [/color]
  8. Moments of inertia:   X: 394.2578  
  9.                               Y: 729.1778  
  10. Product of inertia:  XY: 521.2024  
  11. [color=red]Radii of gyration:    X: 11.9546 [/color]
  12. [color=red]                             Y: 16.2578[/color]
  13. Principal moments and X-Y directions about centroid:
  14.                      I: 20.0418 along [1.0000 0.0000]
  15.                      J: 3.2549 along [0.0000 1.0000]

 
这将使我开始,我希望从那里采取定制。
回复

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-5 13:23:17 | 显示全部楼层
因此,您不希望在中包含所有信息。mpr文件只是一个小节。
 
如果对象不是区域而是实体,该怎么办?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:32:13 | 显示全部楼层
账单
 
可以从区域对象的相应Visual LISP ActiveX属性访问该数据(使用vlax dump对象查看哪些属性可用;结合Visual LISP IDE(VLIDE)帮助文档了解每个属性的信息);我还建议您在vlax get property/vla-*上使用未记录的vlax get函数,以避免将变体/安全数组转换为本机AutoLISP数据类型(例如列表)。
 
例子:
 
  1. (defun c:test ( / e o f d l )
  2.    (if
  3.        (and
  4.            (setq e (car (entsel)))
  5.            (setq o (vlax-ename->vla-object e))
  6.            (eq "AcDbRegion" (vla-get-objectname o))
  7.            (setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
  8.            (setq d (open f "w"))
  9.        )
  10.        (progn
  11.            (princ
  12.                (strcat
  13.                    "Area: "
  14.                    (rtos (vlax-get o 'area))
  15.                    "\nPerimeter: "
  16.                    (rtos (vlax-get o 'perimeter))
  17.                    "\nCentroid: "
  18.                    (progn
  19.                        (setq l (mapcar 'rtos (vlax-get o 'centroid)))
  20.                        (strcat (car l) "," (cadr l))
  21.                    )
  22.                    "\nRadii of Gyration: "
  23.                    (progn
  24.                        (setq l (mapcar 'rtos (vlax-get o 'radiiofgyration)))
  25.                        (strcat (car l) "," (cadr l))
  26.                    )
  27.                )
  28.                d
  29.            )
  30.            (close d)
  31.            (startapp "notepad" f)
  32.        )
  33.    )
  34.    (princ)
  35. )
  36. (vl-load-com) (princ)
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 13:35:07 | 显示全部楼层
李,你确实是这段代码的大师,让它看起来很简单。我只能希望我在这方面至少有你一半的技能。这只是一个练习,我决定开始自学使用VLISP的一些更精细的方面。我主要从事门窗业务,我们经常使用和/或设计定制铝型材。通常需要具有这些形状的截面属性,并以良好的格式呈现它们。几年前,在第14版之前,我的一个体育朋友写了一个简单的LISP例程,它可以快速准备一个类似于我在附件中的表格。
 
这主要是在对象上运行MASSPROP命令时创建的mpr文件的全部内容。Wt/Ft条目是面积*1.18的计算。所有其他行都是与mpr文件相同的数据。边界很漂亮。哦,是的,它会在重心处画一个仰角符号。
 
如果我记得的话,旧的LISP文件将提示输入钢或铝,并将基于此计算每英尺的重量。我知道他的代码很简单,我希望我保存了一份。我记得唯一的一份是在一张5.1/4英寸的软盘上,这张软盘很久以前就被丢弃了。
 
更新:我找到了Wt/Ft部分,并将其写入文件中,尽管我需要找到一种方法将数字格式化为只有两位小数。
 
  1. "Area: "
  2.    (rtos (vlax-get o 'area)) "  Wt/Ft = " (rtos (* (vlax-get o 'area) 1.18))

 
我想我能解决这个问题。。。明天将进行更多练习。
截面属性。图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 13:39:42 | 显示全部楼层
要使用qoute Lisp手册(rtos编号[模式[精度]]),请使用2表示模式和精度
 
如果按照上面的代码省略参数,则会使用更多LUNITS和LUPREC的值
 
希望这有帮助
回复

使用道具 举报

180

主题

639

帖子

463

银币

中流砥柱

Rank: 25

铜币
897
发表于 2022-7-5 13:45:05 | 显示全部楼层
 
是的,确实帮了不少忙。我用括号试了几次迭代,但最终得到了
 
  1. (rtos (vlax-get o 'area)) "  Wt/Ft = " (rtos (* (vlax-get o 'area) 1.18) 2 2)

 
它给了我想要的结果。另一块拼图被放置到位。我会继续努力,直到我把这个拿到我想要的地方。我的老朋友很早以前就为10版编写了这段代码,我想它在很多年前就已经去世了。我想我可以得到这个,然后它将再次属于我。
 
这个方块被添加了,我现在有了主要的时刻。还有几个步骤可以把重要的东西分配给变量,我想我已经做到了。。。大概
 
  1. "\nPrincipal Moments: "
  2.      (progn
  3.          (setq l (mapcar 'rtos (vlax-get o 'principalmoments)))
  4.          (strcat (car l) "," (cadr l))
  5.      )
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 13:52:04 | 显示全部楼层
大家好,
我已经根据需要修改了上述lisp例程、质心(仅y)、面积和惯性矩。
但是我有很多区域,我需要为每个对象列出这些值。
有人能帮我吗?
  1. (defun c:mpp ( / e o f d l )
  2.    (if
  3.        (and
  4.            (setq e (car (entsel)))
  5.            (setq o (vlax-ename->vla-object e))
  6.            (eq "AcDbRegion" (vla-get-objectname o))
  7.            (setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
  8.            (setq d (open f "w"))
  9.        )
  10.        (progn
  11.            (princ
  12.                (strcat
  13.                    "Centroid: "
  14.                    (progn
  15.                        (setq l (mapcar 'rtos (vlax-get o 'centroid)))
  16.                        (strcat (cadr l))
  17.                    )
  18.                    "\nArea: "
  19.                    (rtos (vlax-get o 'area))
  20.            "\nMoments of inertia: "
  21.                    (progn
  22.                        (setq l (mapcar 'rtos (vlax-get o 'momentofinertia)))
  23.                        (strcat (cadr l))
  24.                    )
  25.                )
  26.                d
  27.            )
  28.            (close d)
  29.            (startapp "notepad" f)
  30.        )
  31.    )
  32.    (princ)
  33. )
  34. (vl-load-com) (princ)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:00:41 | 显示全部楼层
这里的一个常见帖子是我想要不止一个,所以答案很简单,你需要用一个ssget替换entsel。 
 
拾取对象或所有等,并使用重复查看选择集中的每个对象,将entsel替换为(ssname ss itemnum)。我没有发布答案的原因是我已经回答了,只要看看这里的任何lisp代码,你就会发现使用ssget和repeat的100个示例。
 
 
 
回复

使用道具 举报

2

主题

19

帖子

17

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 14:03:41 | 显示全部楼层
我认为,使用ssget而不是entsel在这种情况下是行不通的。因为列表应该按区域编号排序。我已经修改了可以执行的代码,但仍然无法获得列表:(
 
  1. (defun c:mpp ( / e o f d l y A I)
  2.    (while
  3.        (and
  4.            (setq e (car (entsel)))
  5.            (setq o (vlax-ename->vla-object e))
  6.            (eq "AcDbRegion" (vla-get-objectname o))
  7.            (setq f (vl-filename-mktemp nil (getvar 'dwgprefix) ".txt"))
  8.            (setq d (open f "w"))
  9.        )
  10.        (progn
  11.            (princ
  12.                    (progn
  13.                        (setq y (mapcar 'rtos (vlax-get o 'centroid)))
  14.                        (setq A (rtos (vlax-get o 'area)))
  15.                        (setq I (mapcar 'rtos (vlax-get o 'momentofinertia)))
  16.                        (write-line (strcat (cadr y) " " A " " (cadr I)) d)
  17.                )
  18.    ;            d
  19.            )
  20.            (close d)
  21.        )
  22.    )
  23.    (princ)
  24. )
  25. (vl-load-com) (princ)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 14:14:32 | 显示全部楼层
您需要一个双列表((“区域x”实体名称)(“区域x+1”实体名称)……)然后按区域编号对列表进行排序,然后通过其名称获取实体的属性。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 00:49 , Processed in 2.140755 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表