发几个操作XDATA的函数,操作XDATA不再害怕
本帖最后由 vectra 于 2013-7-10 08:29 编辑先发代码,求优化注释说明以后再补充
(defun ace-reg-appid (name /)
(if (null (tblsearch "APPID" name))
(regapp name)
)
)
(defun ace-xdata-get (ename appid /)
(if (= "*" appid)
(cdr (assoc '-3 (entget ename (list appid))))
(cdr (assoc appid (cdr (assoc '-3 (entget ename (list appid))))))
)
)
(defun ace-xdata-set (ename appid data / code data-3 data-old data-app)
(setq code (entget ename (list "*"))
data-3 (assoc '-3 code)
data-app (append (list appid) data)
)
(if (null data-3)
;; 不存在扩展数据时添加
(setq code (append code (list (list -3 data-app))))
(if (setq data-old (assoc appid (cdr data-3)))
;; 扩展数据中已存在APPID项, 仅在内容不同时才进行替换
(if (not (equal data-app data-old))
(setq code (subst (subst data-app data-old data-3) data-3 code))
)
;; 在扩展数据中加入新项
(setq code (subst (append data-3 (list data-app)) data-3 code))
)
)
(entmod code)
)
(defun ace-xdata-remove (ename appid / code data-3 data-old)
(setq code (entget ename (list "*"))
data-3 (assoc '-3 code)
)
(if (and data-3 (setq data-old (assoc appid (cdr data-3))))
(progn
(setq
code (subst (subst (list appid) data-old data-3) data-3 code)
)
(entmod code)
)
)
)
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...")))
本帖最后由 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 。
我是在应用程序全局统一注册所有appid,具体操作时因为默认所有appid均已注册,故不再额外判断 请教一下楼主,用LDATA一样也能存储数据,而且读写更为简单,那么XDATA的优势是什么呢? 顶一个,先收下,谢谢! 顶一个,先收下,谢谢 ,收藏了 做啥用的哈 不错不错,正需要用到 收藏了 顶一个,先收下,谢谢 正需要用到 谢谢老大,不知道怎么用的.
页:
[1]
2