明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8535|回复: 18

[函数] 发几个操作XDATA的函数,操作XDATA不再害怕

  [复制链接]
发表于 2013-7-8 11:33:49 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2013-7-10 08:29 编辑

先发代码,求优化注释说明以后再补充

  1. (defun ace-reg-appid (name /)
  2.   (if (null (tblsearch "APPID" name))
  3.     (regapp name)
  4.   )
  5. )

  6. (defun ace-xdata-get (ename appid /)
  7.   (if (= "*" appid)
  8.     (cdr (assoc '-3 (entget ename (list appid))))
  9.     (cdr (assoc appid (cdr (assoc '-3 (entget ename (list appid))))))
  10.   )
  11. )

  12. (defun ace-xdata-set (ename appid data / code data-3 data-old data-app)
  13.   (setq        code         (entget ename (list "*"))
  14.         data-3         (assoc '-3 code)
  15.         data-app (append (list appid) data)
  16.   )

  17.   (if (null data-3)
  18.     ;; 不存在扩展数据时添加
  19.     (setq code (append code (list (list -3 data-app))))

  20.     (if        (setq data-old (assoc appid (cdr data-3)))
  21.       ;; 扩展数据中已存在APPID项, 仅在内容不同时才进行替换
  22.       (if (not (equal data-app data-old))
  23.         (setq code (subst (subst data-app data-old data-3) data-3 code))
  24.       )

  25.       ;; 在扩展数据中加入新项
  26.       (setq code (subst (append data-3 (list data-app)) data-3 code))
  27.     )
  28.   )

  29.   (entmod code)
  30. )


  31. (defun ace-xdata-remove        (ename appid / code data-3 data-old)
  32.   (setq        code   (entget ename (list "*"))
  33.         data-3 (assoc '-3 code)
  34.   )

  35.   (if (and data-3 (setq data-old (assoc appid (cdr data-3))))
  36.     (progn
  37.       (setq
  38.         code (subst (subst (list appid) data-old data-3) data-3 code)
  39.       )
  40.       (entmod code)
  41.     )
  42.   )
  43. )




Sample

_$ (ace-reg-appid "T1")
"T1"
_$ (ace-reg-appid "T2")
"T2"
_$ (ace-xdata-set (handent "1BB") "T1" '((1000 . "Text")(1000 . "More Text...")))
...
_$ (ace-xdata-get (handent "1BB") "T1")
((1000 . "Text") (1000 . "More Text..."))
_$ (ace-xdata-set (handent "1BB") "T2" '((1070 . 10)))
...
_$ (ace-xdata-get (handent "1BB") "T2")
((1070 . 10))
_$ (ace-xdata-get (handent "1BB") "*")
(("T1" (1000 . "Text") (1000 . "More Text...")) ("T2" (1070 . 10)))
_$ (ace-xdata-set (handent "1BB") "T2" '((1070 . 20)(1070 . 30)))
...
_$ (ace-xdata-get (handent "1BB") "T2")
((1070 . 20) (1070 . 30))
_$ (ace-xdata-remove (handent "1BB") "T2")
...
_$ (ace-xdata-get (handent "1BB") "*")
(("T1" (1000 . "Text") (1000 . "More Text...")))

评分

参与人数 1明经币 +2 收起 理由
Gu_xl + 2 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-12-9 01:08:53 | 显示全部楼层
本帖最后由 sfzyr 于 2024-12-9 01:13 编辑

1)当(null data-3)不存在扩展数据时添加:(setq code (append code (list (list -3 data-app)))),同时需要注册APPID.
2)扩展数据中已存在APPID项, 仅在内容不同时才进行替换,此时无需注册,但是:程序可能是刚刚运行了一次,导致图元存在了Xdata数据,还没有更新,再第二次运行时,就会出现,存在了,无需更新,所以,存在APPid,不代表已经注册,所以这个地方还是需要注册APPID
3);; 在扩展数据中加入新项:这个位置肯定判断APPID不存在,这时需要注册。
综上:APPID想要附着到图元,再entmod之前,一定要先注册appid,否则无法添加,这个一定要注意。测试过的一定知道。
所以,xdata-set中需要regapp 。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-16 10:49:37 | 显示全部楼层
我是在应用程序全局统一注册所有appid,具体操作时因为默认所有appid均已注册,故不再额外判断
回复 支持 反对

使用道具 举报

发表于 2023-5-7 19:36:46 | 显示全部楼层
请教一下楼主,用LDATA一样也能存储数据,而且读写更为简单,那么XDATA的优势是什么呢?
发表于 2013-7-8 11:38:08 | 显示全部楼层
顶一个,先收下,谢谢!
发表于 2013-7-8 11:38:52 | 显示全部楼层
顶一个,先收下,谢谢
发表于 2013-7-8 15:44:04 | 显示全部楼层
,收藏了
发表于 2013-7-8 15:48:45 | 显示全部楼层
做啥用的哈
发表于 2013-7-8 16:21:01 | 显示全部楼层
不错不错,正需要用到
发表于 2013-7-9 16:54:28 | 显示全部楼层
收藏了
发表于 2013-7-23 21:27:58 | 显示全部楼层
顶一个,先收下,谢谢
发表于 2015-6-4 11:41:17 | 显示全部楼层
正需要用到
发表于 2015-6-21 11:56:30 | 显示全部楼层
谢谢老大,不知道怎么用的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-23 10:46 , Processed in 0.199654 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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