找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5676|回复: 29

[研讨] 奇怪呀,这个图元对象的数据词典是怎么把1001组码添加上去的?

[复制链接]

已领礼包: 3个

财富等级: 恭喜发财

发表于 2013-10-24 20:46:33 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 xiao_longxin 于 2013-10-25 00:00 编辑

附件中的DWG文件中的一图元,可得到它的数据词典
((-1 . <图元名: 7ffff60e680>) (0 . "XRECORD") (5 . "2080") (102 .
"{ACAD_REACTORS") (330 . <图元名: 7ffff60c410>) (102 . "}") (330 . <图元名:
7ffff60c410>) (100 . "AcDbXrecord") (280 . 1) (1001 . "QLR_TDZH") (1000 . "土地证号")) )

但这不合规矩啊,XRECORD不是不支持1000以上的组码吗?搞得我想更新 (1000 . "土地证号") 为其它数据都不可以



实验数据1.rar

13.57 KB, 下载次数: 10, 下载积分: D豆 -1 , 活跃度 1

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

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 22:14:18 | 显示全部楼层
st788796 发表于 2013-10-24 21:47
你要把数据分析到底才能替换 , -3 下面还有多个 要 assoc ,在子表中修改,最后重新 赋 整个 -3 表

我指的不是XDATA,是LDATA,是指XRECORD,按XRECORD说明是不支持1-369以外的组码,但以上DWG文件中的XRECORD中就是包含了1001和1000,不知道是怎么生成出来的,结果我想更新也没法更新

点评

你怎么得到的 Ldata ? 命令: (vlax-ldata-list (car (entsel))) 选择对象: nil  详情 回复 发表于 2013-10-24 22:39
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 0 反对 1

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 20:59:28 | 显示全部楼层
传 DWG 测试

点评

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 21:36:23 | 显示全部楼层
数据样本                                      

实验数据1.rar

13.57 KB, 下载次数: 3, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 21:37:25 | 显示全部楼层

数据样本                           

实验数据1.rar

13.57 KB, 下载次数: 4, 下载积分: D豆 -1 , 活跃度 1

点评

你要把数据分析到底才能替换 , -3 下面还有多个 要 assoc ,在子表中修改,最后重新 赋 整个 -3 表  详情 回复 发表于 2013-10-24 21:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 21:47:57 | 显示全部楼层

你要把数据分析到底才能替换 , -3 下面还有多个 要 assoc ,在子表中修改,最后重新 赋 整个 -3 表
xdatag.jpg

点评

我指的不是XDATA,是LDATA,是指XRECORD,按XRECORD说明是不支持1-369以外的组码,但以上DWG文件中的XRECORD中就是包含了1001和1000,不知道是怎么生成出来的,结果我想更新也没法更新  详情 回复 发表于 2013-10-24 22:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 22:39:13 | 显示全部楼层
xiao_longxin 发表于 2013-10-24 22:14
我指的不是XDATA,是LDATA,是指XRECORD,按XRECORD说明是不支持1-369以外的组码,但以上DWG文件中的XRECORD ...

你怎么得到的 Ldata ?
命令: (vlax-ldata-list (car (entsel)))
选择对象: nil

点评

(defun c:tt (/ dicts DicObj RecObj xType xData e1) (setq e1 (ssget "x") e1 (ssname e1 0) ) (SETQ Edata (entget e1 '("*")) edata (cdr (member '(102 . "{ACAD_XDICTIONARY") Edata)) )  详情 回复 发表于 2013-10-24 22:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 22:45:33 | 显示全部楼层
st788796 发表于 2013-10-24 22:39
你怎么得到的 Ldata ?
命令: (vlax-ldata-list (car (entsel)))
选择对象: nil

(defun c:tt (/ dicts DicObj RecObj xType xData e1)
  (setq        e1 (ssget "x")
        e1 (ssname e1 0)
  )

  (SETQ        Edata (entget e1 '("*"))
        edata (cdr (member '(102 . "{ACAD_XDICTIONARY") Edata))
  )
  (if Edata
    (progn
      ;; 360 所有者词典的硬所有者 ID/句柄。
      ;; 在此不考虑出现多个360的情况,感觉这种情况不应该存在。
      (setq DEname (cdr (assoc '360 Edata))) ;_词典对象。

      (setq DEdata         (entget DEname) ;_词典数据。
            ;;条目名称SOUTHDIJI所对应的XRECORD对象
            XrEnameSouth (cdr
                           (assoc '360
                                  (cdr (member '(3 . "QLR_TDZH") DEdata))
                           )
                         )
      ) ;_ End setq
      (if XrEnameSouth
        (progn
          (print (setq XrEdataSouth (entget XrEnameSouth)))
          (entmod XrEdataSouth)

        )
      )

    ) ;_ End progn
  ) ;_ End if
)

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 22:57:45 | 显示全部楼层
xiao_longxin 发表于 2013-10-24 22:45
(defun c:tt (/ dicts DicObj RecObj xType xData e1)
  (setq        e1 (ssget "x")
        e1 (ssname e1 0)

你修改 XDATA 试试

点评

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 23:01:17 | 显示全部楼层

试过了,修改XDATA跟XRECORD没有关系

点评

1001 是不符合 Autocad 标准的 命令: _audit 是否更正检测到的任何错误?[是(Y)/否(N)] : y 核查表头 核查表 第 1 阶段图元核查 阶段 1 已核查 200 个对象 第 2 阶段图元核查 AcDbDictionary(D)  详情 回复 发表于 2013-10-24 23:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 23:06:15 | 显示全部楼层
xiao_longxin 发表于 2013-10-24 23:01
试过了,修改XDATA跟XRECORD没有关系

1001 是不符合 Autocad 标准的

命令: _audit
是否更正检测到的任何错误?[是(Y)/否(N)] <N>: y
核查表头
核查表
第 1 阶段图元核查
阶段 1 已核查 200     个对象
第 2 阶段图元核查
AcDbDictionary(D)        Owner Id Is Null               Fix it
AcDbDictionary(E)        Owner Id Is Null               Fix it
AcDbMlineStyle(1B)       Owner Id Is Null               Fix it
阶段 2 已核查 200     个对象
核查块
已核查 0       个块
正在核查 AcDsRecords
共发现 3 个错误,已修复 3 个
已删除 0 个对象


VBA 类名:
AcadXRecord
创建方法:
Dictionary.AddXRecord
访问途径:
Dictionary.Item

该对象在概念上与扩展数据(XData)类似,但没有尺寸或次序的限制。 与扩展数据(XData)不同,XRecord 可和小于1000的标准 AutoCAD 组码一起使用,它支持所有标准的 AutoCAD 组码。这意味着,除通常使用的数据类型之外,XRecord能够保存对象ID,从而它可以拥有包括其它 XRecords 在内的对象。 下列组码是所有XRecord对象所共有的: 100 子类标记(AcDbXrecord) 1-369 (除5和105之外)
这些值可由应用程序以任何方式使用

XRecord 对象直接保存在当前图形中,可以被其它ObjectARX和LISP程序直接访问到。因此,若你的应用程序中,数据安全性是一个重要问题时,在使用 XRecord 对象保存数据应该很小心。
注意 XRECORD 对象的工作方式使得在 R13c0 到 R13c3 版本之间不会发生冲突。但是,如果读入到 AutoCAD? R13c4 以前的版本中,XRECORD 对象则会消失。

点评

修复后查询到的XRECORD数据还是包含1001 1000组码,我就是不明白,这两组数据是怎么附上去.既然可以附上去,就可以用同样的方法修改更新  详情 回复 发表于 2013-10-24 23:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-24 23:13:48 | 显示全部楼层
st788796 发表于 2013-10-24 23:06
1001 是不符合 Autocad 标准的

命令: _audit

修复后查询到的XRECORD数据还是包含1001 1000组码,我就是不明白,这两组数据是怎么附上去.既然可以附上去,就可以用同样的方法修改更新

点评

懒得研究, Google 了几个代码 [*](defun dict-get (owner name / d) [*] (cond [*] ((not owner) (dict-get (namedobjdict) name)) [*] ((= (type owner) 'str) [*] (dict-get (dict  详情 回复 发表于 2013-10-24 23:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 23:22:52 | 显示全部楼层
本帖最后由 st788796 于 2013-10-24 23:24 编辑
xiao_longxin 发表于 2013-10-24 23:13
修复后查询到的XRECORD数据还是包含1001 1000组码,我就是不明白,这两组数据是怎么附上去.既然可以附上去, ...

懒得研究, Google 了几个代码
用 Google 搜索 GetXRecordData,很多现成代码的

  • (defun dict-get  (owner name / d)
  •   (cond
  •     ((not owner) (dict-get (namedobjdict) name))
  •     ((= (type owner) 'str)
  •      (dict-get (dict-get (namedobjdict) owner) name))
  •     ((= (type owner) 'ename) (dict-get (entget owner) name))
  •     ((not (listp owner)) nil)
  •     ((eq (cdr (assoc 0 owner)) "DICTIONARY")
  •      (cond ((dictsearch (cdar owner) name))
  •            ((and (setq d (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary"))))
  •                  (dictadd (cdar owner) name d))
  •             (entget d))))
  •     ((setq d (assoc 360 owner)) (dict-get (cdr d) name))
  •     ((and (setq d (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary"))))
  •           (entmod
  •             (append owner (list '(102 . "{ACAD_XDICTIONARY") (cons 360 d) '(102 . "}")))))
  •      (dict-get d name))))
  • (defun dict-get-xrecord  (owner name / d)
  •   (cond
  •     ((not owner) (dict-get-xrecord (namedobjdict) name))
  •     ((= (type owner) 'str)
  •      (dict-get-xrecord (dict-get (namedobjdict) owner) name))
  •     ((= (type owner) 'ename) (dict-get-xrecord (entget owner) name))
  •     ((not (listp owner)) nil)
  •     ((eq (cdr (assoc 0 owner)) "DICTIONARY")
  •      (cond ((dictsearch (cdar owner) name))
  •            ((and (setq d (entmakex '((0 . "XRECORD") (100 . "AcDbXrecord"))))
  •                  (dictadd (cdar owner) name d))
  •             (entget d))))
  •     ((setq d (assoc 360 owner)) (dict-get-xrecord (cdr d) name))
  •     ((and (setq d (entmakex '((0 . "DICTIONARY") (100 . "AcDbDictionary"))))
  •           (entmod
  •             (append owner (list '(102 . "{ACAD_XDICTIONARY") (cons 360 d) '(102 . "}")))))
  •      (dict-get-xrecord d name))))


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-24 23:23:30 | 显示全部楼层
  • (defun create-or-get-dict (location name / dict)
  •   ;; is it present?
  •   (if (not (setq dict (dictsearch location name)))
  •     ;;if not present then create a new one
  •     (progn
  •       (setq dict (entmakex '((0 . "DICTIONARY")(100 . "AcDbDictionary"))))
  •       ;;if succesfully created, add it to the location
  •       (if dict (setq dict (dictadd location name dict)))
  •     )
  •     ;;if present then just return its entity name
  •     (setq dict (cdr (assoc -1 dict)))
  •   )
  • )

  • (defun get-or-make-Xrecord (adict name / anXrec)
  •   (cond
  •     ((not (setq anXrec (dictsearch adict name)))
  •      ;;if name was not found then create it
  •      (setq anXrec (entmakex '((0 . "XRECORD")
  •                               (100 . "AcDbXrecord")
  •                              )
  •                   )
  •      )
  •      ;;if creation succeeded then add it to our dictionary
  •      (if anXrec
  •        (setq anXrec (dictadd adict name anXrec))
  •      )
  •     )
  •     ;;if it's already present then just return its entity name
  •     (setq
  •      anXrec
  •      (cdr (assoc -1 (dictsearch adict name)))
  •     )
  •   )
  • )

  • (defun add-to-Xrecord (xrec data)
  •   (entmod (append (entget xrec) (list->dxf-pairs data)))
  • )

  • (defun list->dxf-pairs (data)
  •   (mapcar (function (lambda (x) (cons (type->dxfcode (type x)) x))) data)
  • )



评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 热心帮忙奖!

查看全部评分

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2013-10-25 08:41:36 来自手机 | 显示全部楼层
别沉了            

点评

看这个 http://bbs.xdcad.net/forum.php?mod=viewthread&tid=671314&pid=3494184&page=1&extra=#pid3494184  详情 回复 发表于 2013-10-27 12:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 13:50 , Processed in 0.244748 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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