明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3851|回复: 16

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

  [复制链接]
发表于 2011-6-27 20:37:53 | 显示全部楼层 |阅读模式
大家好,我想写一个获取纯属性的属性快的属性值,这个属性快通常是用来填写明细表的内容的。
比如我选择最下一排的属性快,我希望能得到这样的一个表:("ffff" "ssss" "tttt")
我的第一个程序是想用单纯的Lisp获取其属性值,如下:
  1. [/size]
  2. [size=12px](defun c:bte()[/size]
  3. [size=12px]   (setq ss (ssget '((0 . "INSERT") (66 . 1))))[/size]
  4. [size=12px]   ;获取属性快,这里假设我只选择到一个块,尽量简单点[/size]
  5. [size=12px]   (setq en (entget (ssname ss 0)))[/size]
  6. [size=12px]   (setq na (cdr (assoc 2 en)))[/size]
  7. [size=12px]   (setq blc (tblsearch "block" na))[/size]
  8. [size=12px]   (setq en_list (entget (cdr (assoc -2 blc))))[/size]
  9. [size=12px]   ;到这里我发觉我走不下去了[/size]
  10. [size=12px]   )[/size]
  11. [size=12px]

最后的en_list的值是一个不包含特性值的表,感觉没路了。
然后我又换了一种方法,用Vlisp,代码如下:
  1. [/size][/size]
  2. [size=12px](defun c:bte()[/size]
  3. [size=12px]   (vl-load-com)[/size]
  4. [size=12px]   (setq ss (ssget '((0 . "INSERT") (66 . 1))))[/size]
  5. [size=12px]   ;获取属性快,这里假设我只选择到一个块,尽量简单点[/size]
  6. [size=12px]   (setq en (vlax-ename->vla-object (ssname ss 0)))[/size]
  7. [size=12px]   (setq att (vla-GetAttributes en))[/size]
  8. [size=12px]   ;得到特性值,接下來转换[/size]
  9. [size=12px]   (setq ll (vlax-safearray->list (vlax-variant-value att)))[/size]
  10. [size=12px]   ; 我本以为可以获得一个正常的表,后来发现这个表不正常[/size]
  11. [size=12px]   )[/size]

  12. [size=12px]

最终还是没能如愿,得到的ll表是这样的:(#<VLA-OBJECT IAcadAttributeReference2 0b3ca084> #<VLA-OBJECT
IAcadAttributeReference2 0b3ca11c> #<VLA-OBJECT IAcadAttributeReference2
0b3ca1b4>)
此表的长度竟然为零。
希望大家帮帮忙。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-6-28 21:45:36 | 显示全部楼层
ent1只是一个线头,每循环一次变化一次。只有在组码0的内容为ATTRIB时才有组码1。
回复 支持 1 反对 0

使用道具 举报

发表于 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
    )
)
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-23 09:26:53 | 显示全部楼层
初学编程,此贴对vla-object对了解特性值提取非常有帮助
 楼主| 发表于 2011-6-27 20:40:04 | 显示全部楼层
不好意思,代码旁边类似“[size=12px]”的东东如何去掉啊,是怎么产生的?
 楼主| 发表于 2011-6-28 19:33:18 | 显示全部楼层
回复 if 的帖子

其实这样一段代码我已知道,只不过我不明白为什么我的方法不行。
你提供的是Vlisp的方法,请问能不能用lisp来实现呢,谢谢。
发表于 2011-6-28 21:21:55 | 显示全部楼层
 楼主| 发表于 2011-6-28 21:41:17 | 显示全部楼层
回复 ZZXXQQ 的帖子

版主的lisp确实实现了这个功能,但是我检查了一下变量“ent1”,发现这个变量没有组码1,而你的最后一个表达式:(WRITE-LINE (CDR (ASSOC 1 ENT1)))确实是输出了正确的结果,请版主再解释一下这个问题,谢谢!
 楼主| 发表于 2011-6-28 21:54:08 | 显示全部楼层
回复 ZZXXQQ 的帖子

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

谢谢版主!
发表于 2011-6-29 09:03:38 | 显示全部楼层
vlax-invoke 和 vlax-invoke-method 帮助确实没有说明其中的差别,
但事实上vlax-invoke-method 并不能 替代 vlax-invoke
也就是说没有假如没有 vlax-invoke,GetAttributes 方法就没有什么
实际意义了。。。
发表于 2011-6-30 22:16:35 | 显示全部楼层
我也在想用LISP怎么做BOM,不过还没有头绪.先来学习学习.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 16:23 , Processed in 0.183786 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表