找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1198|回复: 7

[求助] [求助]:一个困绕我很长时间的问题:如何清除一个实体的扩展数据?

[复制链接]
发表于 2002-4-15 21:10:24 | 显示全部楼层 |阅读模式

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

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

×
一个困绕我很长时间的问题:如何清除一个实体的扩展数据,请各位大虾帮忙。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-4-16 03:35:31 | 显示全部楼层

VBA解决方案

Sub test()
   Dim obj As Object
   Dim xtype(0) As Integer
   Dim xvalue(0) As Variant
   
   xtype(0) = 1001
   xvalue(0) = "MyApp" '这里是你用过的应用程序名称。
   
   ThisDrawing.Utility.GetEntity obj, pt, "Pick: "
   obj.SetXData xtype, xvalue
End Sub
                                                                                       沈阳杜冰
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-16 05:57:34 | 显示全部楼层

回复: [求助]:一个困绕我很长时间的问题:如何清除一个实体的扩展数据?

最初由 长清 发布
[B]一个困绕我很长时间的问题:如何清除一个实体的扩展数据,请各位大虾帮忙。 [/B]


下面是ARX和LISP的实现方法:


  1. void removeXdata()
  2. {
  3.     ads_name eNam;

  4. ads_point pt;

  5. int i = acedEntSel ("\nPick an object:", eNam, pt);



  6. if (RTNORM != i)

  7. {

  8. return;

  9. }

  10. AcDbObjectId ObjId;

  11. acdbGetObjectId(ObjId, eNam);

  12. AcDbEntity *pEnt;

  13. acdbOpenAcDbEntity(pEnt, ObjId, AcDb::kForWrite);

  14. resbuf *xdata = pEnt->xData(NULL);

  15. if (xdata)

  16. {

  17. xdata->rbnext = NULL;

  18. pEnt->setXData(xdata);

  19. acutRelRb(xdata);

  20. }

  21. pEnt->close();

  22. }
复制代码


下面是和上面等价的LISP实现:



  1. (defun c:DelXdata()
  2. (setq l (car (entsel "Pick object:")))
  3. (if l (progn
  4.      (redraw l 3)
  5.      (setq le (entget l '("*")) )
  6.      (setq xdata (assoc '-3 le))
  7.      (setq le
  8.            (subst (cons (car xdata) (list (list (car (car (cdr xdata))))))
  9. xdata le))
  10.      (entmod le)
  11.      (redraw l 4)
  12.      le
  13.     )
  14. )
  15. )


说明: 如果一个实体附着了多个应用程序名的扩展实体数据,把上面代码放到循环里面就可以了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-16 07:41:11 | 显示全部楼层
把在ARX论坛回答江南的帖子也贴到这里

先说下删除XDATA的原理,XDATA的组成是祖码-3开始,然后是子表,如:

'(-3 子表1 子表2 ...子表n)

每一个子表是一个应用程序名标识的一组扩展实体数据。

如:'("应用程序名1" ....数据)

清除一个应用程序名为标识的扩展实体数据,把应用程序名后面的数据项清除,只保留应用程序名,然后更新实体数据,那么ACAD就会把只有应用程序名而没有数据的“一组扩展实体数据”的删除了。

举例:
(-3 ("ABC" (1070 . 2) (1070 . 3))
("DEF" (1070 . 3))
)

上面-3是扩展数据开始,"ABC","DEF"是两个应用程序名标识的两组扩展实体数据。那么我们要删除"ABC"把上面的表中的ABC子表变成("ABC"),然后把上面的表entmod就可以了。

下面看看上面的代码:
(setq le
(subst (cons (car xdata) (list (list (car (car (cdr xdata))))))
xdata le))

这个的结果就是把扩展实体数据的第一个应用程序名标识的子表变成:
(-3 ("ABC")
("DEF" (1070 . 3))
)

然后(entmod le)就会更新实体的数据的,ABC扩展数据就没有了。

所以,上面的LISP的作用是把第一个扩展实体数据删除。

因此若要删除所有的扩展实体数据,循环执行下上面的代码部分就可以了。

另:若要删除“指定应用程序名”的扩展实体数据,按照上面的原理,把那个应用程序名标识的子表按照上面的方法仅仅留下名字,去除数据即可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-4-16 20:40:18 | 显示全部楼层
最初由 XDSoft 发布
[B]把在ARX论坛回答江南的帖子也贴到这里

先说下删除XDATA的原理,XDATA的组成是祖码-3开始,然后是子表,如:

'(-3 子表1 子表2 ...子表n)

每一个子表是一个应用程序名标识的一组扩展实体数据。

如:'(... [/B]


谢谢晓东的指点,谢谢杜冰,还如此详细,我学到这么多“新”东西!

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

使用道具 举报

发表于 2002-4-16 20:45:47 | 显示全部楼层
;;;直接重建对象不要xdata

  1. (defun C:XDATA1        (/ KEY SS SS1)
  2.   (while (= SS1 NIL)
  3.     (prompt "\n选择对象: ")
  4.     (setq SS1 (car (entsel)))
  5.     (if        (/= SS1 NIL)
  6.       (setq SS (assoc -3 (entget SS1 '("*"))))
  7.     )
  8.     (if        (= SS NIL)
  9.       (setq SS1 NIL)
  10.     )
  11.   )
  12.   (alert
  13.     (strcat "\n所选对象的延伸资料如下:\n" (vl-princ-to-string SS))
  14.   )
  15.   ;(if (/= (caadr SS) "ACAD");;;autocad本身的xdata不处理
  16.   ;  (progn
  17.       (initget "No Yes")
  18.       (setq KEY (getkword "\n要删除延伸资料No/<Yes>: "))
  19.       (if (= KEY NIL)
  20.         (setq KEY "Yes")
  21.       )
  22.       (if (= KEY "Yes")
  23.         (progn
  24.           (entmake (entget SS1))
  25.           (command "_.erase" SS1 "")
  26.         )
  27.       )
  28.    ;)
  29.   ;)
  30.   (princ)
  31. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-17 08:33:35 | 显示全部楼层
;(if (/= (caadr SS) "ACAD");;;autocad本身的xdata不处理
什么情况有 “autocad本身的xdata” ?举个例子

再,1。去除xdate直接把 '(-3 子表1 子表2 ...子表n) 删除?好不好? 即用(entget SS1)替代(entget SS1 '("*")) 后entmod 或者 erase原来物体后entmake
2。
结果就是把扩展实体数据的第一个应用程序名标识的子表变成:
(-3 ("ABC")
("DEF" (1070 . 3))
)

然后(entmod le)就会更新实体的数据的,ABC扩展数据就没有了。

是不是说只要 扩展数据里面 第一个标识的数据表清除,更新后所有的扩展数据(-3 。。。)都没有了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-17 11:16:51 | 显示全部楼层
要杀光最简单办法是提取entget,不加(list “×”),然后entmod就可。
如果只杀某种xdata,只好逐个比较了。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 14:50 , Processed in 0.396674 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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