Bill Tillman 发表于 2022-7-5 13:15:01

从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

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

ReMark 发表于 2022-7-5 13:23:17

因此,您不希望在中包含所有信息。mpr文件只是一个小节。
 
如果对象不是区域而是实体,该怎么办?

Lee Mac 发表于 2022-7-5 13:32:13

账单
 
可以从区域对象的相应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)

Bill Tillman 发表于 2022-7-5 13:35:07

李,你确实是这段代码的大师,让它看起来很简单。我只能希望我在这方面至少有你一半的技能。这只是一个练习,我决定开始自学使用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))

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

BIGAL 发表于 2022-7-5 13:39:42

要使用qoute Lisp手册(rtos编号[模式[精度]]),请使用2表示模式和精度
 
如果按照上面的代码省略参数,则会使用更多LUNITS和LUPREC的值
 
希望这有帮助

Bill Tillman 发表于 2022-7-5 13:45:05

 
是的,确实帮了不少忙。我用括号试了几次迭代,但最终得到了
 
(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))
   )

bkartal16 发表于 2022-7-5 13:52:04

大家好,
我已经根据需要修改了上述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)

BIGAL 发表于 2022-7-5 14:00:41

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

bkartal16 发表于 2022-7-5 14:03:41

我认为,使用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)

BIGAL 发表于 2022-7-5 14:14:32

您需要一个双列表((“区域x”实体名称)(“区域x+1”实体名称)……)然后按区域编号对列表进行排序,然后通过其名称获取实体的属性。
页: [1] 2
查看完整版本: 从MASSPROP中提取数据