找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2942|回复: 6

[教学] 玩转 XRecord

[复制链接]
发表于 2014-10-25 11:37:43 | 显示全部楼层 |阅读模式

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

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

×
XRecord 提供了比 XData 更灵活的数据存储
以下组码是所有 XRECORD 对象共有的组码。除此处所述的组码以外,另请参见常用对象组码。关于此表中使用的缩写和格式方面的信息,请参见本参考的格式惯例
XRECORD 组码
组码
说明
100
子类标记 (AcDbXrecord)
280
重复记录克隆标志(决定如何合并重复条目):
0 = 不适用
1 = 保留现有项
2 = 使用克隆
3 = <外部参照>$0$<名称>
4 = $0$<名称>
5 = 未损坏名称
1–369(5 和 105 除外)
这些值可由应用程序以任何方式使用
XRECORD 对象可用于存储和管理任意数据。它们由 DXF 组码和“普通对象”组码(即非扩展数据组码)构成,支持的范围为 1 到 369。此对象在概念上与扩展数据类似,但没有尺寸或次序的限制。
XRECORD 对象的工作方式使得在 R13c0 到 R13c3 版本之间不会发生冲突。但是,如果读入到 AutoCAD&#174; R13c4 之前的版本中,XRECORD 对象将消失。

获取 附着在 Dictionary 或 Object  上的 XRecord
  1. ;|
  2. 获取Xrecord
  3. obj --- all drawing object  or dictionary
  4. name -- appid string
  5. |;
  6. (defun Obj:GetXrecord (obj name / e dicts xd xt lst _getxrecord)
  7.   (defun _getxrecord (dc / xt xd)
  8.     (if        (= (vla-get-objectname dc) "AcDbXrecord")
  9.       (progn (vla-getxrecorddata dc 'xt 'xd)
  10.              (if (and xt xd)
  11.                (setq lst
  12.                       (cons
  13.                         (cons (vla-get-name dc)
  14.                               (mapcar
  15.                                 '(lambda (x y) (cons x y))
  16.                                 (safearray-value xt)
  17.                                 (mapcar 'variant-value (safearray-value xd))
  18.                               )
  19.                         )
  20.                         lst
  21.                       )
  22.                )
  23.                (setq lst (cons (vla-get-name dc) lst))
  24.              )
  25.       )
  26.     )
  27.   )
  28.   (if (= (vla-get-objectname obj) "AcDbDictionary")
  29.     (vlax-for dict obj (_getxrecord dict))
  30.     (if        (= (vla-get-hasExtensionDictionary obj) :vlax-true)
  31.       (progn (setq dicts (vla-GetExtensionDictionary obj))
  32.              (vlax-for dict dicts (_getxrecord dict))
  33.       )
  34.     )
  35.   )
  36.   (if (= name "*")
  37.     lst
  38.     (vl-remove-if-not
  39.       '(lambda (x) (= (strcase (car x)) (strcase name)))
  40.       lst
  41.     )
  42.   )
  43. )



评分

参与人数 1威望 +1 D豆 +3 贡献 +1 收起 理由
Highflybird + 1 + 3 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2014-10-25 19:37:52 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-25 19:39 编辑

设置 XRecord 和 Xdata 类似
单元素的用点对表, 点形式用表 如 ((1 . "adafd") (10 1.0 0.0 0.0) ....)
  1. ;|
  2. 设置 xrecord 追加型
  3. obj    --- all drawing object or dictionary
  4. name   --- string , key
  5. values --- data  表
  6. |;
  7. (defun Obj:SetXrecord (obj name        values / _setxrecord xlst xrec dicts xd
  8.                        xt)
  9.   (defun _setxrecord (obj lst)
  10.     (vla-setxrecorddata
  11.       obj
  12.       (list->vbarray (mapcar 'car lst) vlax-vbinteger)
  13.       (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)      
  14.     )
  15.   )
  16.   (if (= (vla-get-objectname obj) "AcDbDictionary")
  17.     (progn
  18.       (vlax-for        d obj
  19.         (if (and (= (vla-get-objectname d) "AcDbXrecord")
  20.                  (= (strcase (vla-get-name d)) (strcase name))
  21.             )
  22.           (setq xrec d)
  23.         )
  24.       )
  25.       (if xrec
  26.         (progn
  27.           (vla-getxrecorddata xrec 'xt 'xd)
  28.           (if xt
  29.             (_setxrecord
  30.               xrec
  31.               (append
  32.                 (mapcar        '(lambda (x y)
  33.                            (cons x y)
  34.                          )
  35.                         (safearray-value xt)
  36.                         (mapcar 'variant-value (safearray-value xd))
  37.                 )
  38.                 values
  39.               )
  40.             )
  41.             (_setxrecord xrec values)
  42.           )
  43.         )
  44.         (progn
  45.           (setq xrec (vla-addxrecord obj name))
  46.           (_setxrecord xrec values)
  47.         )
  48.       )
  49.     )
  50.     (if        (= (vla-get-hasExtensionDictionary obj) :vlax-true)
  51.       (progn
  52.         (setq dicts (vla-GetExtensionDictionary obj))
  53.         (vlax-for dict dicts
  54.           (if (and (= (vla-get-objectname dict) "AcDbXrecord")
  55.                    (= (strcase (vla-get-name dict)) (strcase name))
  56.               )
  57.             (setq xrec dict)
  58.           )
  59.         )
  60.         (if xrec
  61.           (progn
  62.             (vla-getxrecorddata xrec 'xt 'xd)
  63.             (_setxrecord
  64.               xrec
  65.               (append
  66.                 (mapcar        '(lambda (x y)
  67.                            (cons x y)
  68.                          )
  69.                         (safearray-value xt)
  70.                         (mapcar 'variant-value (safearray-value xd))
  71.                 )
  72.                 values
  73.               )
  74.             )
  75.           )
  76.         )
  77.       )
  78.       (progn
  79.         (setq dict (vla-getextensiondictionary obj)
  80.               xrec (vla-addxrecord dict name)
  81.         )
  82.         (_setxrecord xrec values)
  83.       )
  84.     )
  85.   )
  86. )



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

使用道具 举报

 楼主| 发表于 2014-10-25 19:41:11 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-26 20:13 编辑

删除 XRecord

  1. ;;删除 xrecord
  2. (defun obj:DeleteXrecord (obj name /)
  3.   (if (= (vla-get-objectname obj) "AcDbDictionary")
  4.     (vlax-for d        obj
  5.       (if (= (vla-get-objectname d) "AcDbXrecord")
  6.         (if (= name "*")
  7.           (vla-delete d)
  8.         )
  9.         (if (= (strcase (vla-get-name d)) (strcase name))
  10.           (vla-delete d)
  11.         )
  12.       )
  13.     )
  14.     (if        (vla-get-hasextensiondictionary obj)
  15.       (vlax-for        d (vla-getextensiondictionary obj)
  16.         (if (= (vla-get-objectname d) "AcDbXrecord")
  17.           (if (= name "*")
  18.             (vla-delete d)
  19.           )
  20.           (if (= (strcase (vla-get-name d)) (strcase name))
  21.             (vla-delete d)
  22.           )
  23.         )
  24.       )
  25.     )
  26.   )
  27. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-25 19:44:57 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-10-26 20:05 编辑

  1. ;|
  2. 替换指定值
  3. obj ----  dictionary or object
  4. name ---  string
  5. vars ---  list ((oldvalues1 newvalues1) (oldvalues2 newvalues2) ....)
  6. |;
  7. (defun OBJ:ReplaceXrecord (obj name vars / oldvars lst tf)
  8.   (if (setq lst (obj:getxrecord obj name))
  9.     (progn
  10.       (setq oldvars (mapcar 'car vars)
  11.             lst            (mapcar
  12.                       '(lambda (x / ll nx)
  13.                          (if (setq ll
  14.                                     (vl-member-if
  15.                                       '(lambda (a) (equal a x 1e-3))
  16.                                       oldvars
  17.                                     )
  18.                              )
  19.                            (progn
  20.                              (setq
  21.                                nx (cons (car x) (cadr (assoc (car ll) vars)))
  22.                                tf t
  23.                              )
  24.                              (setq vars (vl-remove (car ll) vars))
  25.                              nx
  26.                            )
  27.                            x
  28.                          )
  29.                        )
  30.                       lst
  31.                     )
  32.       )
  33.       (if tf
  34.         (obj:setxrecord obj name lst)
  35.       )
  36.       t
  37.     )
  38.   )
  39. )

点评

这个贴错了吧,和设置内容一样!  详情 回复 发表于 2014-10-25 21:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3913个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-10-25 21:47:37 来自手机 | 显示全部楼层
Free-Lancer 发表于 2014-10-25 19:44

这个贴错了吧,和设置内容一样!

点评

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

使用道具 举报

 楼主| 发表于 2014-10-26 20:11:53 | 显示全部楼层
iLisp 发表于 2014-10-25 21:47
这个贴错了吧,和设置内容一样!


3、4楼代码已更新
  1. ;|
  2. 移除指定数据的 Xrecord
  3. obj ---- dictionary or object
  4. name --- string
  5. vars --- list of values
  6. |;
  7. (defun Obj:RemoveXrecord (obj name vars / lst)
  8.   (if (setq lst (obj:getxrecord obj name))
  9.     (progn
  10.       (mapcar '(lambda (x / el)
  11.                  (if (setq el (vl-member-if
  12.                                 '(lambda (a) (equal (cdr a) x 1e-3))
  13.                                 lst
  14.                               )
  15.                      )
  16.                    (setq lst (vl-remove (car el) lst)
  17.                          tf  t
  18.                    )
  19.                  )
  20.                )
  21.               vars
  22.       )
  23.       (if tf
  24.         (obj:setxrecord obj name lst)
  25.       )
  26.       t
  27.     )
  28.   )
  29. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 11:10 , Processed in 0.194588 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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