XRECORD XDATA
我在书上用自动截图翻译了一段文字,有点意思;|AutoCAD提供了几种在非图形图形中存储信息的方法。
这可以包括各种数据类型,例如数字、文本等。其中两个最常见的是扩展实体数据( EED )和词典。最常见的
EED的形式是XDATA,它是所有图形实体以及许多图形实体的扩展
表对象,如图层和线型。这允许您存储隐藏的(非图形)这些实体或表对象内的信息并检索该信息必要时。
存储非图形信息的另一种形式是通过使用XRECORD对象。XRECORD对象是文档对象的一部分,允许您存储
字典集合中的字符串信息。
使用XDATA的优点是信息附加到特定实体或者桌子成员。使用XRECORD对象的优点是它们附加到文档本身,
而不是任何特定实体或表对象。此外,XDATA对可以存储在给定实体或表中的数据的大小有一定的限制成员。
XRECORD对象对数据存储没有任何大小限制,但它打开图形时,会影响DWG文件大小和内存要求。
使用XDATA
xdata可以附加到图形中的任何图形实体,也可以从图形中的任何图形实体检索
许多表格对象,例如图层、布局和线型。xdata划分信息按数据类型存储,所以您必须知道您想要的信息类型
无论何时将它附加到任何东西上,以及尝试检索它时,都要存储。为
例如,如果您将整数值附加到实体并尝试检索它,就好像它
如果是字符串值,将无法获得所需的结果。
使用XRECORD对象
XRECORD对象被维护为词典,这意味着它们具有唯一的名称并以该名称访问。它们附加到文档对象本身,而不是
任何图形对象或表,如Xdata。从中剥离xrecords绘图(如果将其保存回R12或经常转换为另一种CAD格式)不支持他们。
因为XRECORD对象附加到文档中,所以它们不会随意使用用户删除。例如,如果将XDATA附加到一个层,并且该层被清除,
然后XDATA也将发布。您可以将XDATA附加到图层“0”以防止然而,XDATA仍然对可存储的数据类型和数据大小施加限制。
只能创建、重命名或删除xrecords。没有直接的方法
修改它们。修改Xrecord的唯一方法是检索其内容,删除
从dictionary对象中创建Xrecord,并使用新数据重新创建新的Xrecord。这
以下功能演示如何使用标准AutoLISP执行此操作。|;
;|(defun Xrecord-Rebuild (name dat)
(Xrecord-Delete name)
(Xrecord-Add name dat)
)
(defun Xrecord-Get (name / xlist)
(if (setq xlist (dictsearch (namedobjdict) name))
(cdr (assoc 1 x1ist))
)
)
(defun Xrecord-Delete (name)
(dictremove (namedobjdict) name) ;remove from dictionary
)
(defun Xrecord-Add (name sdata / xrec xname)
(setq xrec (list
(cons 0 "XRECORD")
(cons 100 "2cDbXrecord")
(cons 1 sdata)
(cons 6 21)
)
)
(setq name (entmakex xrec)) ;rebuild xrecord
(dictadd (namedobjdict) name xname) ;return to dictionary
(princ)
)|;
;;;上述形式的问题在于它使用( entmake ),有时会导致
;;;AutoCAD与某些其他ActiveX函数混合时出现的问题。再来一杯
;;;适当的形式是ActiveX方法,如下例所示。
(vl-load-com)
(defun Xrecord-Rebuild (dict name data)
(Xrecord-Delete dict name)
(Xrecord-Add dict name data)
)
;;(Xrecord-Get "PERSONAL" "UserData")
(defun Xrecord-Get
(dict name / #DAT #TYP ACADAPP DCS DOC ODC ODE OUT XREC)
(setq acadapp (vlax-get-acad-object)
doc (vla-get-activedocument acadapp)
dcs (vla-get-dictionaries doc)
)
(cond
((setq odc (dsx-item dcs dict))
(cond
((setq xrec (dsx-item odc name))
(vla-getXrecordData xrec '#typ '#dat)
(setq #typ (vlax-safearray->list #typ)
#dat (vlax-safearray->list #dat)
)
(setq out (mapcar 'vlax-variant-value #dat))
(vlax-release-object dcs)
)
)
(vlax-release-object odc)
)
)
(vlax-release-object doc)
(vlax-release-object acadapp)
out
)
(defun Xrecord-Delete (dict name / ACADAPP DCS DOC ODC ODE XR)
(setq acadapp (vlax-get-acad-object)
doc (vla-get-activedocument acadapp)
)
(setq dcs (vla-get-dictionaries doc))
(cond
((setq odc (dsx-item dcs dict))
(cond
((setq xr (dsx-item odc name))
(vla-delete xr)
(vlax-release-object xr)
)
)
(vlax-release-object odc)
)
)
(vlax-release-object dcs)
(vlax-release-object doc)
(vlax-release-object acadapp)
)
(defun Xrecord-Add
(dict name data / #DAT ACADAPP DICTS DOC FTYP XREC)
(setq acadapp (vlax-get-acad-object)
doc (vla-get-activedocument acadapp)
dicts (vla-get-Dictionaries doc)
dict (vlax-invoke-method dicts "add" dict)
xrec (vla-AddXrecord dict name)
)
(if (not (listp data))
(setq data (list data))
) ;ensure list!
(vla-setXrecordData
xrec
(List->VariantArray (List->IntList data) 'vlax-vbInteger)
(List->VariantArray data 'vlax-vbVariant)
)
(vla-getXrecordData xrec 'ftyp '#dat)
(setq ftyp (vlax-safearray->list ftyp)
#dat (vlax-safearray->list #dat)
)
(vlax-release-object xrec)
(vlax-release-object dict)
(vlax-release-object dicts)
(vlax-release-object doc)
(vlax-release-object acadapp)
(mapcar 'vlax-variant-value #dat)
)
(defun List->VariantArray (lst datatype / arrayspace sArray)
(setq arraySpace
(Vlax-make-safearray
(eval datatype)
(cons 0 (1- (length lst)))
)
)
(setq sArray (vlax-safearray-fill arrayspace lst))
(vlax-make-variant sArray)
)
;;(List->IntList '('a 'b 'c))=>(1 2 3)
(defun List->IntList (lst / n)
(setq n 0)
(mapcar (function (lambda (x) (setq n (1+ n)))) lst)
)
(defun dsx-item (collection item / out)
(setq out (vl-catch-all-apply 'vla-item (list collection item)))
(if (not (vl-catch-all-error-p out))
out ;return object or nil
)
)
;;;那么,你能用Xrecords做什么呢?你想要什么都行。它们对以下方面非常有用
;;;将信息存储在不直接绑定到任何特定实体或表的图形中。
;;;如果您习惯于在Xdata中存储信息,您可能会意识到,如果实体
;;;或者删除表项,则Xdata将丢失。当然,您可以将Xdata附加到
;;;图层“0”等,所以不会被删除。但是,Xdata对以下方面施加了限制
;;;改为切换到Xrecords可能会减轻的内容。
;;应用示例
(setq username (getenv "username")) ;logged on user ID
(setq machine (getenv "computername")) ;NETBIOS computer name
;;(Xrecord-Rebuild "PERSONAL" "UserData" (list username machine))=>("DSTEIN1234"*W2K-1234")
;;(Xrecord-Get "PERSONAL" "UserData")=>("DSTEIN1234"*W2K-1234")
;;(Xrecord-Rebuild "PERSONAL""UserData" "1234")=>("1234") 感谢黄大师的共享! 哈哈是不是写一个lisp程序进去。每次打开自动生成临时lisp并且加载 请问这是什么书哦 多谢分享! 这个不就是词典嘛 感谢黄大师,数据交换用它正合适 为什么很少有人讨论LDATA
页:
[1]