本帖最后由 作者 于 2005-11-8 22:54:33 编辑
把我的毕业论文贴上一段,希望对你有帮助
2.2.1 用户自定义数据的几种方法
如何保存、读取用户数据呢?如,当图中一条直线表示VRV空调系统一段冷媒管,如何将管径、负荷等数据附着在这条直线上?再如,图纸统计结果为:图中共有两套VRV系统,系统1负荷为20kW,系统2负荷为28kW,如何将这个结果存储到dwg文件中呢?
最原始的办法是建立图块,将用户数据作为属性赋予图块。但这种方法首先要将图形对象转化为图块,而且图块属性只支持字符类型数据,功能十分有限。
自AutoCAD R11以后,AutoCAD引入了扩展数据(Xdata)和扩展记录(Xrecord)的概念,扩展数据可以附着在任何图形对象上,AutoCAD只负责维护但不使用这些信息。但是扩展实体数据只能附着在图形对象上,并且AutoCAD分配给每个图形实体的扩展数据空间有最大为16K字节的限制。
Visual Lisp提供了新的“图形词典”功能,使我们可以使用更简单更强大的方法保存和读取用户自定义的非图形数据。与其他方法相比,图形词典具有以下优点:
1、可以将用户数据关联到某个图形对象上,也可以不与任何图形对象相关,只是存储到dwg文件中;
2、数据类型丰富,AutoLISP支持的数据类型几乎都可以使用;
3、没有16K的数据容量限制,而且在一个dwg文件中可以存在多个图形词典,在一个图形词典中可以有多条数据纪录;
4、图形词典功能概念容易理解,语法简单效率高
2.2.2 Visual LISP中图形词典的使用方法
相关的函数:
(vlax-ldata-put):向图形词典或VLA对象中加入用户数据
(vlax-ldata-get):从图形词典或VLA对象中提取用户数据
(vlax-ldata-delete):从图形词典或VLA对象中删除用户数据
(vlax-ldata-list):从图形词典或VLA对象中列出所有的用户数据
(vlax-ldata-test):判断用户数据是否可以在图形词典或VLA对象中存取
下面分别解释在dwg文件中及一个图形对象上如何存取用户数据。
1、将用户数据添加到dwg文件中,不依附于任何一个图形对象,随着文件一同保存。函数调用格式为:
(vlax-ldata-put dict key data)
其中:
dict:图形词典名称,由用户定义
key:关键字,由用户定义,用于检索与之对应的用户数据
data:用户数据
一个dwg文件中可以有多个不同名称的图形词典,同一个图形词典名称下可以含有若干条具体数据,每条数据由关键字和用户数据组成,同一个图形词典下关键字不能重复,通过关键字可以检索到相应的用户数据。
例:
(vlax-ldata-put "系统负荷" "系统1" 20)
(vlax-ldata-put "系统负荷" "系统2" 28)
提取这样的数据是相当简单的,只要知道了图形字典名称和用户数据对应的关键字即可,函数调用格式为:
(vlax-ldata-get dict key)
dict:图形词典名称,之前由用户定义
key:关键字,之前由用户定义,用于检索与之对应的用户数据
例:
(vlax-ldata-get "系统负荷" "系统1")
删除一条数据的函数调用格式为:
(vlax-ldata-delete dict key)
dict:图形词典名称,之前由用户定义
key:关键字,之前由用户定义,对应的数据及关键字本身将被一同删除
例:
(vlax-ldata-delete "系统负荷" "系统2")
2、向某个图形对象添加或提取非图形数据,数据“附着”在某个图形对象上,一旦该图形对象被删除则数据也就消失了。函数用法与将用户数据添加到dwg文件中不同的是,第一个参数用VLA对象名替代图形词典名称。函数调用格式为:
(vlax-ldata-put VLA-object key data)
VLA-object:VLA对象名称
其余参数同上,需要指出的是,VLA对象名称不同于AutoLisp中常用的“图形对象名称”,前者可以使用函数由后者转换而来,如:
(setq en_name (car (entsel "\n选择添加用户自定义数据的图元:")))
(setq VLA_name (vlax-ename->vla-object en))
选择图形文件中表示冷媒管的直线,获得它的VLA对象名称
例:
(vlax-ldata-put VLA_name "管径" "L9.52 G15.2")
(vlax-ldata-put VLA_name "负荷" 4.0)
将管径、负荷数据“附着”到图中直线上
读取数据的函数调用格式为:
(vlax-ldata-get VLA-object key data)
例:
(vlax-ldata-get VLA_name "管径")
从直线上获取与“管径”对应的数据
删除一条数据的函数调用格式为:
(vlax-ldata-delete VLA-object key)
例:
(vlax-ldata-delete VLA_name "负荷")
将“负荷”一项从直线上删除
by lazybones
2005.11 |