获取属性块得特性值,未能成功。
大家好,我想写一个获取纯属性的属性快的属性值,这个属性快通常是用来填写明细表的内容的。比如我选择最下一排的属性快,我希望能得到这样的一个表:("ffff" "ssss" "tttt")
我的第一个程序是想用单纯的Lisp获取其属性值,如下:
(defun c:bte()
(setq ss (ssget '((0 . "INSERT") (66 . 1))))
;获取属性快,这里假设我只选择到一个块,尽量简单点
(setq en (entget (ssname ss 0)))
(setq na (cdr (assoc 2 en)))
(setq blc (tblsearch "block" na))
(setq en_list (entget (cdr (assoc -2 blc))))
;到这里我发觉我走不下去了
)
最后的en_list的值是一个不包含特性值的表,感觉没路了。
然后我又换了一种方法,用Vlisp,代码如下:
(defun c:bte()
(vl-load-com)
(setq ss (ssget '((0 . "INSERT") (66 . 1))))
;获取属性快,这里假设我只选择到一个块,尽量简单点
(setq en (vlax-ename->vla-object (ssname ss 0)))
(setq att (vla-GetAttributes en))
;得到特性值,接下來转换
(setq ll (vlax-safearray->list (vlax-variant-value att)))
; 我本以为可以获得一个正常的表,后来发现这个表不正常
)
最终还是没能如愿,得到的ll表是这样的:(#<VLA-OBJECT IAcadAttributeReference2 0b3ca084> #<VLA-OBJECT
IAcadAttributeReference2 0b3ca11c> #<VLA-OBJECT IAcadAttributeReference2
0b3ca1b4>)
此表的长度竟然为零。
希望大家帮帮忙。
ent1只是一个线头,每循环一次变化一次。只有在组码0的内容为ATTRIB时才有组码1。 (vl-load-com)
(defun c:bte ()
(setq ss (ssget '((0 . "INSERT") (66 . 1))))
(setq en (vlax-ename->vla-object (ssname ss 0)))
(setq att (vlax-invoke en 'GetAttributes))
(mapcar '(lambda (x)
(list (vla-get-tagString x)
(vla-get-textstring x)
))
att
)
) 初学编程,此贴对vla-object对了解特性值提取非常有帮助 不好意思,代码旁边类似“”的东东如何去掉啊,是怎么产生的? 回复 if 的帖子
其实这样一段代码我已知道,只不过我不明白为什么我的方法不行。
你提供的是Vlisp的方法,请问能不能用lisp来实现呢,谢谢。 http://bbs.mjtd.com/thread-63918-1-5.html 回复 ZZXXQQ 的帖子
版主的lisp确实实现了这个功能,但是我检查了一下变量“ent1”,发现这个变量没有组码1,而你的最后一个表达式:(WRITE-LINE (CDR (ASSOC 1 ENT1)))确实是输出了正确的结果,请版主再解释一下这个问题,谢谢! 回复 ZZXXQQ 的帖子
“只有在组码0的内容为ATTRIB时才有组码1”
谢谢版主! vlax-invoke 和 vlax-invoke-method 帮助确实没有说明其中的差别,
但事实上vlax-invoke-method 并不能 替代 vlax-invoke
也就是说没有假如没有 vlax-invoke,GetAttributes 方法就没有什么
实际意义了。。。 我也在想用LISP怎么做BOM,不过还没有头绪.先来学习学习.
页:
[1]
2