自贡黄明儒 发表于 2022-9-21 21:17:21

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")

guosheyang 发表于 2022-9-21 21:59:36

感谢黄大师的共享!

liuhe 发表于 2022-9-22 08:38:15

哈哈是不是写一个lisp程序进去。每次打开自动生成临时lisp并且加载

20060510412 发表于 2022-9-22 09:17:55

请问这是什么书哦

zjy2999 发表于 2022-9-22 09:34:33

多谢分享!

ssyfeng 发表于 2022-9-22 14:28:17

这个不就是词典嘛

bingshan23 发表于 2023-6-15 16:29:15

感谢黄大师,数据交换用它正合适

weilu 发表于 2023-6-16 20:06:31

为什么很少有人讨论LDATA
页: [1]
查看完整版本: XRECORD XDATA