chengx2000 发表于 2011-6-27 20:37:53

获取属性块得特性值,未能成功。

大家好,我想写一个获取纯属性的属性快的属性值,这个属性快通常是用来填写明细表的内容的。
比如我选择最下一排的属性快,我希望能得到这样的一个表:("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>)
此表的长度竟然为零。
希望大家帮帮忙。







ZZXXQQ 发表于 2011-6-28 21:45:36

ent1只是一个线头,每循环一次变化一次。只有在组码0的内容为ATTRIB时才有组码1。

if 发表于 2011-6-28 08:59:50

(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
    )
)

hh_lj007 发表于 2020-12-23 09:26:53

初学编程,此贴对vla-object对了解特性值提取非常有帮助

chengx2000 发表于 2011-6-27 20:40:04

不好意思,代码旁边类似“”的东东如何去掉啊,是怎么产生的?

chengx2000 发表于 2011-6-28 19:33:18

回复 if 的帖子

其实这样一段代码我已知道,只不过我不明白为什么我的方法不行。
你提供的是Vlisp的方法,请问能不能用lisp来实现呢,谢谢。

ZZXXQQ 发表于 2011-6-28 21:21:55

http://bbs.mjtd.com/thread-63918-1-5.html

chengx2000 发表于 2011-6-28 21:41:17

回复 ZZXXQQ 的帖子

版主的lisp确实实现了这个功能,但是我检查了一下变量“ent1”,发现这个变量没有组码1,而你的最后一个表达式:(WRITE-LINE (CDR (ASSOC 1 ENT1)))确实是输出了正确的结果,请版主再解释一下这个问题,谢谢!

chengx2000 发表于 2011-6-28 21:54:08

回复 ZZXXQQ 的帖子

“只有在组码0的内容为ATTRIB时才有组码1”

谢谢版主!

if 发表于 2011-6-29 09:03:38

vlax-invoke 和 vlax-invoke-method 帮助确实没有说明其中的差别,
但事实上vlax-invoke-method 并不能 替代 vlax-invoke
也就是说没有假如没有 vlax-invoke,GetAttributes 方法就没有什么
实际意义了。。。

neverstop 发表于 2011-6-30 22:16:35

我也在想用LISP怎么做BOM,不过还没有头绪.先来学习学习.
页: [1] 2
查看完整版本: 获取属性块得特性值,未能成功。