找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3529|回复: 4

[每日一码] Xrecord和XDATA区别

[复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2018-6-5 07:55:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
在书上抄了段,也是自动翻译的
;|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")

评分

参与人数 1D豆 +5 收起 理由
marting + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-6-5 12:14:39 | 显示全部楼层
很精彩
补充点
XDATA保存的数据类型有限,整数、字符串、点等,空间有限制,不能超过16K
XRECORD可以保存任意的数据类型,包括AcDbObject对象,另外的词典等等,没空间大小限制。
XRECORD是保存在对象的扩展词典下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 38个

财富等级: 招财进宝

发表于 2018-6-5 13:27:18 | 显示全部楼层
明白了,长知识,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

发表于 2018-6-6 00:03:18 | 显示全部楼层
学习一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 568个

财富等级: 财运亨通

发表于 2018-6-16 07:19:32 | 显示全部楼层
说得很详细了。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 22:46 , Processed in 0.308985 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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