明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4936|回复: 3

怎样使CAD实体具有用户自定义的属性?

[复制链接]
发表于 2005-2-17 08:12:00 | 显示全部楼层 |阅读模式
比如画一个圆,如何将用户自己的属性如该圆所代表的名称和圆连接起来,就象圆自身的半径一样?在今后的检索中可以查到该属性。


希望高手赐教

发表于 2005-2-21 21:39:00 | 显示全部楼层
对实体附加扩展数据XData
发表于 2005-2-22 15:13:00 | 显示全部楼层
有具体的类似的应用吗?或者给个例子。
发表于 2005-3-30 14:47:00 | 显示全部楼层
(AutoCAD 处理非图形数据的高招--图形词典
文::FAW/Autodesk CTC 陈伯雄 来源:http://xbb.myrice.com 时间:2003-5-21 14:49:53 点击:54
--------------------------------------------------------------------------------

一、概论 大家知道,图形数据库是AutoCAD在图形生成和编辑中使用的数据库。它存放的主要内容是所生成图形的几何信息和其它有关信息,以 *.DWG文件存盘。 这个数据库的结构允许用户建立自己的“非图形信息”数据,以便在一个DWG中封装尽可能完整的设计数据。比如标了一个粗糙度符号(图形信息),再组合上粗糙度的值(非图形信息)。想在将来从该图中顺畅的提取这类信息,供工艺设计之用,就必然有建立非图形数据的要求。类似的有:元件型号、地块面积等。 笔者认为,无论是对 AutoCAD,还是其他的 CAD 软件,都应当提出一个最基本的,也是最根本的要求:有能力独立建立设计信息数据库,如果你是个真正再进行设计的工程师,而不仅仅是个绘图员。 因此,对DWG的比较准确称呼应当是:设计信息数据库。 图形数据的建立是在绘图过程中,由 AutoCAD 按照你的操作,填充有关的数据库内容。可见,这些内容具体结果如何,与你的绘图过程有直接联系。所以,打印输出结果相同的图样,数据结构可能存在这种大的差别。如果你是个真正再进行设计的工程师,而不仅仅是个绘图员,这个差别对你来说将是十分重要的。从 CAD 本意来说,看起来正确的图形,并不一定具有正确的图形数据。 非图形数据是那些无法用图形表达的设计信息。例如:计算过程和结论、设计构思说明、局部结构特殊的工艺要求、泵阀的参数、甚至是从属于这个图形对象的应用程序等等。这种数据的建立,以前主要是用“属性”和“扩展的对象数据库”。但是,属性只能容纳字符类型数据,扩展的对象数据又有16K数据大小的限制,使用起来有一点不痛快,不能全面覆盖非图形数据的操做要求。另外,老的非图形数据处理功能,必须将这些数据关联到、甚至放置到某个图形对象上,不能对整个图形文件添加非图形数据,这也比较遗憾。 在 Visual LISP 中,新的“图形词典”功能,彻底解放了用户设计数据&#0;&#0;非图形数据的处理限制,是Autodesk在数据库结构上的有一个重大突破。图形词典*的主要特点是: 可用数据类型相当丰富,几乎所有的 AutoLISP 能处理的数据都可以使用。 相关程序编写相当简单,你怎么想,就怎么写。 数据量可以相当大。我曾经给一个圆附加了6兆大小的非图形数据。 可以与图档相关(附加到图档),也可以与某条图线相关(附加到对象上)。 在一个图档中,可以并存许多个图形词典,在一个图形词典中,可以有许多纪录。 非图形数据提取和定义简单明晰。  相关的函数有:(VLAX-LData-Put VLA对象 词典关键字 数据) 向指定的图形词典中加入用户数据。 (VLAX-LData-List VLA对象) 从指定的图形词典中列出用户数据。 (VLAX-LData-Get VLA对象 词典关键字 [默认数据] [独立变量]) 从图形词典中提取用户数据。 (VLAX-LData-Delete VLA对象 词典关键字 [独立变量]) 从图形词典中删除用户数据。 (VLAX-LData-Test 用户数据) 判断<用户数据>是否可以在图形词典中存取 二、基本的程序写法 ① 给整个图形添加或提取非图形数据 这样的数据保存在当前图形中,依附于当前图形文件,并随图保存。 典型程序描述如下: (VLAX-LData-Put "UserDict" "UKey1" ‘(1 2 3 4.5 "用户")) 其中: "UserDict" 字串确定了自定义图形字典的名称。 "UKey1" 字串确定了数据项的操作关键字 ‘(1 2 3 4.5 "用户") 是具体的数据 实际上,同一个图形词典中可以含有若干个具体数据,例如: (VLAX-LData-Put "UserDict" "UKey1" '(1 2 3 4.5 "用户")) (VLAX-LData-Put "UserDict" "UKey2" "字符数据类型") (VLAX-LData-Put "UserDict" "UKey3" 3.1415926) 提取这样的数据是相当简单的,只要知道了图形字典和数据的关键字即可: (SetQ udata1 (VLAX-LData-Get "UserDict" "UKey1") ② 给某个图形对象添加或提取非图形数据的方法 与上边的方法仅有一个不同:在图形词典名的位置,写上转换成VLA对象的对象名: (SetQ en (Car (EntSel "\n要加入用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (VLAX-LData-Put en "UKey2" "用户数据") (SetQ en (Car (EntSel "\n要提取用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) udata2 (VLAX-LData-Get en "UKey2") ) ③ 给某个图形对象添加或提取非图形数据的例程 (Defun C:TDPut () (SetQ en (Car (EntSel "\n要加入用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (VLAX-LData-Put en "UKey2" "用户数据2") ) (Defun C:TDGet () (SetQ en (Car (EntSel "\n要提取用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (SetQ udata2 (VLAX-LData-Get en "UKey2")) ) ④ 给一个图形对象添加 AutoLISP 表达式 给一个图形对象添加 AutoLISP 表达式,就是将这些表达式“附着”在指定的图形对象上,随对象保存。之后用简单的函数,就可以激活这些表达式,并且执行他们。 例如下面的例程: (Defun C:TDPut1 () (SetQ en (Car (EntSel "\n要加入应用程序(1)的图形对象: ")) en (VLAX-Ename->VLA-Object en) a (GetReal "\nReal: ") ) (VLAX-LData-Put en "UKey1" a) (VLAX-LData-Put en "UKey2" '(Alert (StrCat "这个数的平方=" (RToS (* a a)))) ) ) (Defun C:TDPut2 () (SetQ en (Car (EntSel "\n要加入应用程序(2)的图形对象: ")) en (VLAX-Ename->VLA-Object en) a (GetString "\nString: ") ) (VLAX-LData-Put en "UKey1" a) (VLAX-LData-Put en "UKey2" '(Alert (StrCat "附加说明: " a))) ) (Defun C:TDGet () (SetQ en (Car (EntSel "\n要运行应用程序的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (SetQ a (VLAX-LData-Get en "UKey1")) (Eval (VLAX-LData-Get en "UKey2")) ) 对不同的图形对象执行 C:TDPut1或C:TDPut2 函数,就可以将有关数据和程序表达式附着在对象上。在以后的使用中,只要用公用的 C:TDGet 函数指定这个对象,就能自动执行附着的程序表达式,从而产生不同的处理结果。 可见,这是 AutoLISP 表达式一种新的定义和保存模式。用一个公用的函数,可以激活不同对象上所附加的不同的表达式,完成不同的操作。在某种意义上讲,这样的程序运行结果,也是一种“对象反应器”,却没有对象反应器程序中的许多限制。同时,将应用程序“封装”在对象中,或者“封装”在图档中,无论如何是个有趣的、也是有实用价值的技术方法。 ⑤ 测试用户的数据是否可以在图形词典中存取 并不是所有的 AutoLISP 数据都可以被 VLAX-LData-xxx 函数操作的。应当使用 (VLAX-LData-Test) 函数,测试指定的数据是否可以放到图形词典中、或者添加给图形对象,并且能够被提取。(由于支持文档作者的失误,在 AutoCAD 2000 中这个函数的功能被描述成:“确定数据是否能越任务边界保存”,这是不准确的) 例如: (SetQ lin (EntMake '((0 . "LINE") (10 1 1 1) (11 20 20 20))) fnm (Open "mmm.out" "W") ) (Defun fun () (Alert "LData...") (List 1 2 3)) 这样,下列表达式将返回T: (VLAX-LData-Test 10)(VLAX-LData-Test 10.01) (VLAX-LData-Test 'fun) (VLAX-LData-Test "AutoCAD2000") (VLAX-LData-Test lin) (VLAX-LData-Test (list 1 "a" 'fun lin)) (VLAX-LData-Test (Cons 8 "Layer1"))  可见,大多数数据类型都可以在图形词典中使用,甚至是函数、对象数据表。但是,下列表达式将返回nil: (VLAX-LData-Test fun)(VLAX-LData-Test fnm)   因为,函数应当在它的名称前缀一个“’”,才能区别于变量名;而文件操作符不能在图形词典中使用。 三、在 AutoCAD R14 和 AutoCAD 2000 中应用的区别 Visual LISP 在 AutoCAD R14 中,是贴在 AutoCAD 上的一个程序包。图形词典函数属于 Visual LISP 的扩展函数,不是 AutoLISP 的标准函数,因此,原则上不能脱离 Visual LISP 使用这些函数,即使将程序编译成了 ARX/FAS/VLX。 实际上,我们可以用一套“特殊”的方法,在 AutoCAD R14 中使用这样的程序: 在 Visual LISP 中生成、调试成功有关程序。 将程序编译成 ARX,注意下面的事项: 成员文件中要包括 VLARTS.LSP 或者 VLRTS.LSP,这两个程序可以在 Visual LISP 的安装路径下找到。也可以不包括上述程序,而是在程序头部加入下面的描述: (Defun VL () (VL-Init)) 使编译参数: ARX with ActiveX Automation 有效。不要管在程序中是否真的用了 ActiveX。 在 AutoCAD R14 中用 ARXLoad 命令加载这个程序。 使用这个程序。 再次编译某程序,如果曾经加载过,先要用 ARXLoad 将这个ARX 程序卸载。  这个问题在 AutoCAD 2000 中已经圆满解决了,由于是真正嵌入了 Visual LISP,只要在程序中事先引用了 (VL-Load-Com) 函数,所有的扩展函数都能在 AutoCAD 下正确引用。本文中的例程,在 AutoCAD R14 中应当通过 Visual LISP 加载,而在 AutoCAD 2000 中就没有什么限制了。   四、应用实例 打开一个图形,自动装入这个图形自用的应用程序,就会最精确地实现 AutoCAD 的用户化和专业化。用图形词典就能顺利而简单地实现这个要求。由于 AutoCAD 2000 嵌入了 Visual LISP,可以顺利使用扩展函数,下面的程序在 AutoCAD 2000 中才能正确运行。 运行下面的程序,将专用应用程序作为图形词典数据添加到当前图中。 (VL-Load-Com) (Defun C:AppL () (SetQ apl '()) (While (SetQ apn (GetFileD "选定要加载的应用程序..." "" "lsp" 4)) (SetQ apl (Cons apn apl)) ) (VLAX-LData-Put "UserApp" "PName" (Reverse apl)) (Alert "当前的应用程序名已经纪录到图档之中\n可以存盘了...") (PrinC) ) 将这个图存盘 将下面的程序段,添加到 ACAD.LSP或者*.MNL中。 (VL-Load-Com)  (If (SetQ apl (VLAX-LData-Get "UserApp" "PName"))(ForEach apn apl (Load apn)) ) 这样,每当打开这个图形时,将会自动执行一次3〉中的表达式,搜索图形词典中的相关数据(UserApp 中的 Pname),并且分别加载这些程序。这样,专业设计图形就总是与它们的专业支持程序捆在一起,自动加载。 综上可见,VLAX-LData-xxx 族函数,是在向对象和图形文件添加自定义的属性。这说明Visual LISP也具有相当程度的ObjectARX编程能力。因此,AutoCAD用户现在可以充分利用 Visual LISP 开发相当完整和专业化设计功能相当强大的应用程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 14:45 , Processed in 0.172109 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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