明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2075|回复: 5

如何求得属性块的提示,组码3的值

[复制链接]
发表于 2005-5-22 13:10 | 显示全部楼层 |阅读模式
用(entget(car(nentsel)))可以获取图形中有属性块的数据,诸如:((-1 . <图元名: 7689d740>) (0 . "ATTRIB") (330 . <图元名: 7689d738>)
(5 . "9BD0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 2)
(6 . "Continuous") (100 . "AcDbText") (10 30687.5 490.116 0.0) (40 . 240.0) (1
. "G5700501-9-0") (50 . 0.0) (41 . 0.9) (51 . 0.0) (7 . "MXB") (71 . 0) (72 .
1) (11 31578.8 490.116 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 .
"CODE") (70 . 0) (73 . 0) (74 . 0))
在这里面有属性值:G5700501-9-0,属性名:CODE,却无法获得提示,即组码3的值。我知道可以通过块名(assoc 330(entget(car(nentsel))))遍历获取提示,可是无法将获得的提示值与开始所选择的实体一一对应。因为一个块中可能存在多个相同的attdef实体,也就是说组码2的值不惟一,所以不能以此为依据去比较attrib和attdef中的组码2的值来获得组码3的值。 望高手赐教!
发表于 2005-5-22 14:50 | 显示全部楼层
属性块和块是不同的,普通的块的INSERT对象完全是对BLOCK的引用,只要修改了BLOCK,INSERT也会跟着变,而属性块就不同了,属性块的图形部分同普通块是一样的,但是属性块中的属性不是BLOCK中的引用,而是每个INSERT对象有独立的ATTRIB对象,这些对象的默认值就是BLOCK中的ATTRIB,但你可以单独修改每个INSERT对象中的属性...


你要的3的的值要到BLOCK中的ATTRIB中去取,,,


提示:遍历块使用entnext函数......
 楼主| 发表于 2005-5-22 15:15 | 显示全部楼层
谢谢飞哥,不过我说的跟你不是一个意思。



我知道遍历块定义可以获得tag、prompt、value。我说的是,假如当前图形中有一属性块test,其有一属性attdef:tag为code,prompt为代号,value为G5700501-9-0。当用(entget(car(nentsel)))选取该attdef在图形中attrib(tag为code的字段)时,只能获得组码1和2的值,却无法获得组码3的值。然后用遍历块定义的方法,可以获得组码3的值,可是从这些值中怎样才能知道哪一个prompt是刚才选取的字段的prompt值?因为一个块中可以有多个tag相同的attdef,可是prompt值却可以不同。


我有一个最笨的方法:首先获得该attrib在插入的块引用中的顺序号X(可以用遍历insert的过程中比较句柄获得),然后再去遍历block定义,当顺序号等于X时,从该attdef中求得prompt值。


我希望能有一个更简洁的方法,比如说用ActiveX方法是否可以?
发表于 2005-5-22 15:40 | 显示全部楼层
你的这种用法本身就是不正确的,帮助中有这样一句话,"使用重复标记名更新属性将导致不可预料的结果",,,即使你使用顺序解决了这个问题,也很难保证以后的使用过程中不出现错误
 楼主| 发表于 2005-5-22 16:45 | 显示全部楼层
本帖最后由 作者 于 2005-5-22 20:14:47 编辑

所以请高手赐教啊,代码如下: ;;================选择属性块函数=======================
(defun ssgetTagBN (/ ED ES ;块图元表
PASS ;是否继续执行标志位
handel ;句柄
BlkRefEN ;块引用
BlkDefEN ;块定义
index Count ;attrib和attdef的顺序号
IsEqual tag tagprompt tagvalue
)
(while (null Pass)
(setq ESel (entsel "\n请选择要修改的块属性: "))
(cond
((null ESel)
(setq Pass 'T
BN nil
)
) ;end cond condiction 1
((= (type ESel) 'LIST) ;pick selection
(setq EL (car ESel)
ED (entget EL)
)
(if (= (dxf 0 ED) "INSERT")
(progn
(setq BN (dxf 2 ED)
dimscl (dxf 42 ED)
ESel (nentselp (cadr ESel))
EN (entget (car Esel))
)
(if (equal "ATTRIB" (dxf 0 EN))
(if (not (equal (length ESel) 4))
(progn
(setq TAG (dxf 2 EN)
Height (/ (dxf 40 EN) dimscl)
Width (dxf 41 EN)
txtStyle (dxf 7 EN)
TagValue (trim$ (dxf 1 EN))
handel (dxf 5 EN)
BlkRefEN (dxf 330 EN)
Pass 'T
) ;;以下代码段获取prompt
(setq index 0
BlkRefEN (entnext BlkRefEN)
)
;;求取attrib在insert中的顺序号
(while (and BlkRefEN
(/= "SEQEND"
(dxf 0 (setq ES (entget BlkRefEN)))
)
)
(setq BlkRefEN (entnext BlkRefEN))
(if IsEqual
(setq BlkRefEN nil) ;终止循环
(if (and (= "ATTRIB" (dxf 0 ES))
(= 0 (dxf 70 ES))
)
;;只选择可编辑属性
(progn
(setq Index (1+ Index))
(if (equal (dxf 5 ES) handel)
(setq IsEqual T
BlkRefEN nil
)
) ;end if
)
) ;end if
) ;end if
) ;end while
;; 遍历块定义,获取获取prompt
(setq count 0
BlkDefEN (tblobjname "block" BN)
BlkDefEN (entnext BlkDefEN)
)
(while BlkDefEN
(setq ES (entget BlkDefEN)
BlkDefEN (entnext BlkDefEN)
)
(if (< count index)
(if (and (= "ATTDEF" (dxf 0 ES))
(= 0 (dxf 70 ES))
)
(progn
;;只选择可编辑属性
(setq count (1+ count))
(if (and (= count index) (= TAG (dxf 2 ES)))
(setq TagPrompt (trim$ (dxf 3 ES))
BlkDefEN nil
)
)
)
)
) ;end if
) ;end while
) ;end progn
(prompt "\n您选择的是嵌套块!本程序不能修改此类型!")
) ;end if
(prompt "\n您选择的对象没有属性!")
) ;end if
) ;end progn
(prompt "\n您选择的不是块!")
) ;end if
) ;end cond condiction 2
) ;end cond
) ;end while
(list tag TagPrompt TagValue) ;返回值
) ;end defun
发表于 2005-5-23 08:38 | 显示全部楼层
最好的方法当然是不要使用相同的TAG了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 15:53 , Processed in 0.163781 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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