AutlLisp版本:Visual LISP 2024 (zh)
扩展属性(XDATA)是图元中嵌入的为APP服务的数据。
本文初步讲解图元的扩展属性(XDATA)创建与查看及APP创建,分为以下3个部分:
仅对<图元名>进行 (entget) 无法查看扩展属性(XDATA):
代码块
ts
自动换行
复制代码
123
(entget (car(entsel)))
((-1 . <图元名: 1f4bf8b7b00>) (0 . "LWPOLYLINE") (330 . <图元名: 1f4c95a19f0>) (5 . "E68") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 420.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 420.0 297.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 0.0 297.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))
复制成功
想要查看扩展属性,需要在entget后附APP名称:
代码块
ts
自动换行
复制代码
123
(setq #epTEMP (entget (car(entsel)) (list "TestApp1" "TestApp2")))
((-1 . <图元名: 1f4bf8b7b00>) (0 . "LWPOLYLINE") (330 . <图元名: 1f4c95a19f0>) (5 . "E68") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 420.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 420.0 297.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 0.0 297.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0) (-3 ("TestApp1" (1040 . 1.25) (1000 . "string 1") (1071 . 111)) ("TestApp2" (1040 . 125.0) (1000 . "string 2") (1071 . 222))))
复制成功
其中,组码 -3 项即为扩展属性。若未查到扩展属性,则会返回 nil。
对其采用如下方法单独提取:
代码块
ts
自动换行
复制代码
123
(setq #eq1 (assoc -3 #epTEMP))
(-3 ("TestApp1" (1040 . 1.25) (1000 . "string 1") (1071 . 111)) ("TestApp2" (1040 . 125.0) (1000 . "string 2") (1071 . 222)))
复制成功
APPID为"ACAD34;时,表示AutoCAD默认自用的Application,常见于标注,对原始标注样式进行覆盖。
扩展属性是为APP服务的,在创建扩展属性图元前,要先创建APP。创建方法二选一:
1)regapp
2)entmake
代码块
ts
自动换行
复制代码
1234567891011
;APPID创建方法1
(regapp "TestApp1")
;APPID创建方法2
(setq #listAPP (list '(0 . "APPID")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbRegAppTableRecord") ;子类名称,固定
'(2 . "TestApp2") ;APP名称
'(70 . 0) ;flag:
)
)
(entmake #listAPP)
复制成功
AutoCAD中,APP属于Table Section,可以用(tblsearch)查看:
代码块
ts
自动换行
复制代码
12345678
(tblsearch "APPID" "TestApp1")
((0 . "APPID") (2 . "TestApp1") (70 . 0))
(tblsearch "APPID" "TestApp2")
((0 . "APPID") (2 . "TestApp2") (70 . 0))
复制成功
可见,两种方法创建的APP均可查到。
此外可以通过 (tblobjname) 获取APP的图元名:
代码块
ts
自动换行
复制代码
12345678
(tblobjname "APPID" "TestApp1")
<图元名: 1f4bf8b7a80>
(tblobjname "APPID" "TestApp2")
<图元名: 1f4bf8b7a90>
复制成功
确认APP存在后,即可在创建图元时嵌入该APP扩展属性。
图元属性中扩展属性的组码为 -3,后跟随列表元素(每个APP一个列表),列表元素的第一元素为APPID,后面元素为扩展属性,组码为1000-1071。
以创建带有扩展属性的矩形为例:
代码块
ts
自动换行
复制代码
123456789101112131415161718192021222324252627
;带有扩展属性(XDATA)的图元创建
(setq #listE (list '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(8 . "0") ;图层
'(100 . "AcDbPolyline")
'(90 . 4) ;点数
'(70 . 1) ;闭合性
'(43 . 0.0)
(list 10 0.0 0.0) ;点坐标
(list 10 420 0.0)
(list 10 420 297)
(list 10 0.0 297)
(list '-3 ;扩展属性
(list "TestApp1" ;APPID
'(1040 . 1.25) ;实型数
'(1000 . "string 1") ;字符串
'(1071 . 111) ;整型数
) ;l3
(list "TestApp2" ;APPID
'(1040 . 125)
'(1000 . "string 2") ;
'(1071 . 222)
) ;l3
) ;l2
) ;l1
) ;s
(setq #en1 (entmakex #listE))
复制成功
这样就创建了带有扩展属性的一个矩形,带有上节创建的两个APP的扩展数据。

根据DXF组码的规范,扩展数据的组码均为 1000~1071,每个组码有固定用途,可重复(1005不可),且顺序敏感,即数据顺序要与APP要求匹配。
【1000】字符串,最大长度255字节
【1001】字符串,APP名称,此项在DXF文件中标识APP,在AutoLISP环境不需要,且会被认为是新APP的开始,因此不要使用
【1002】字符串,控制字,与102类似,形如“{” “}”
【1003】扩展数据的图层名
【1004】二进制数据
【1005】转用于储存句柄,且会被当作软指针“soft-pointer handle”
【1010,1020,1030】三实型数,可以作为点坐标,AutoCAD不会篡改
【1011,1021,1031】三实型数,可以作为点坐标,世界坐标,与图元绑定,当旋转、缩放、镜像时会自动篡改,通过STRETCH命令可查看
【1040】实型数
【1041】距离,与父图元一同缩放
【1042】缩放因子,实型数,与父图元一同缩放,其与1041区别由APP定义
【1070】整型数,16位,带/不带符号
【1071】整型数,32位,带符号
四、其他
APP相关组码的含义

欢迎留言并发表您的见解!

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删