明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 947|回复: 9

[讨论] XRECORD XDATA

  [复制链接]
发表于 2022-9-21 21:17 | 显示全部楼层 |阅读模式
我在书上用自动截图翻译了一段文字,有点意思

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1金钱 +5 收起 理由
sy78wpl + 5 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2022-9-21 21:59 | 显示全部楼层
感谢黄大师的共享!
发表于 2022-9-22 08:38 | 显示全部楼层
哈哈  是不是写一个lisp程序进去。每次打开自动生成临时lisp并且加载

点评

应该不会,如果会的话,那比常规病毒厉害多了。  发表于 2022-9-22 09:05
发表于 2022-9-22 09:17 | 显示全部楼层
请问这是什么书哦

点评

忘了,以前搞的。  发表于 2022-9-22 13:05
发表于 2022-9-22 14:28 | 显示全部楼层
这个不就是词典嘛
发表于 2023-6-15 16:29 | 显示全部楼层
感谢黄大师,数据交换用它正合适
发表于 2023-6-16 20:06 | 显示全部楼层
为什么很少有人讨论LDATA
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-1 04:24 , Processed in 0.264760 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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