Gotrekk 发表于 2022-7-5 18:20:34

动态块-属性

你好,
 
我有许多不同的块,具有不同的属性和自定义属性(旋转角度、位置1 X、位置1 Y等等)。
它们在属性名称和自定义属性名称之间都有完美的对应关系。
 
例如,如果我有一个具有自定义属性“rotation\u head”和“position\u head”的块,我将有两个属性,称为“rotation\u head”和“position\u head”。
 
我需要一个lisp,其中有两个函数在所有选定的不同块之间循环;其中一个功能是:
-对于每个选定的块,读取属性并设置自定义特性
而另一个将:
-对于每个选定的块,读取自定义特性并设置属性。
 
你认为这样的事情可能吗?
 
这种请求背后的原因是,我需要将形状文件导入和导出到autocad map,并且需要使用形状文件表设置块自定义特性。一
 
提前感谢您的任何想法/提示
当做
GTK公司

iconeo 发表于 2022-7-5 18:28:51

你可以从Google Lee Mac的动态块函数开始。

Hippe013 发表于 2022-7-5 18:34:38

你所描述的是可能的。可以发布包含块和形状文件的dwg吗?

Gotrekk 发表于 2022-7-5 18:39:59

@Hippe013,您可以找到附着的dwg和shp。
 
@iconeo,我找到了你提到的例程,但我想我是个新手,不会lisp,我自己也做不到
lisp_示例。拉链

Gotrekk 发表于 2022-7-5 18:42:58

慢速地慢速地到了那里,使用Mac Lee函数,我达到了这一点:
 

(defun c:testx1 ( / ent )

(if (setq ent (car (entsel "\nSelect Attributed Block: ")))
   (princ
        (LM:setdynpropvalue
                (vlax-ename->vla-object ent)
                "value_a"   ; custom_property
                (atof
                        (LM:GetAttributeValue
                                (vlax-ename->vla-object ent)
                                "value_a"
                        )
                )
        )
   )               
)
(princ)
)

 
这样,我就可以在选定的块上设置自定义属性“value\u a”和属性“value\u a”的值!
 
下一步是。。。如何选择多个不同的块并在其上运行相同的函数?
 
我试过:

(defun c:a1(/ ss i obj j k mt)
        (if (setq ss (ssget "_:L" '((0 . "INSERT") (66 . 1))))
                (repeat (setq i (sslength ss))
                        (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
                        (princ(LM:GetAttributeValue(obj) "Matricola"))
                )
)
   (princ)
)(vl-load-com)

但失败了。。。有什么提示吗?

Hippe013 发表于 2022-7-5 18:48:22

我对你的代码研究得不多。首先想到的是你是如何计算你的ss指数的。
 
也许是这样的。。。
 
(setq cnt 0)
(repeat (sslength ss)
(setq obj (vlax-ename->vla-object (ssname ss cnt)))
(princ (LM:GetAttributeValue obj "Matricola"))
(setq cnt (+ cnt 1))
)

Gotrekk 发表于 2022-7-5 18:53:28

 
我尝试了你的解决方案,我没有得到错误,但没有得到打印。。。我甚至试过了
(princ cnt)在重复中。。。但根本没有输出

Lee Mac 发表于 2022-7-5 19:00:25

看起来您正在使用my Get Attributes函数的Vanilla AutoLISP版本,因此,您应该为该函数提供块参照图元名称,而不是vla对象。
 
下面是一个简单的示例:
(defun c:a1 ( / ent idx sel val )
   (if (setq sel (ssget "_:L" '((0 . "INSERT") (66 . 1))))
       (repeat (setq idx (sslength sel))
         (setq ent (ssname sel (setq idx (1- idx))))
         (if (setq val (LM:getattributevalue ent "Matricola"))
               (princ (strcat "\n" val))
               (princ (strcat "\nAttribute tag \"Matricola\" not found in block " (cdr (assoc 2 (entget ent)))))
         )
       )
   )
   (princ)
)

Gotrekk 发表于 2022-7-5 19:00:46

 
首先,谢谢你的帮助!
使用你的函数,我仍然可以得到:
; 错误:错误的参数类型:VLA-OBJECT
命令:

Lee Mac 发表于 2022-7-5 19:08:40

您使用的LM:getattributevalue函数的版本是什么?
页: [1] 2
查看完整版本: 动态块-属性