明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1166|回复: 7

[源码] 添加扩展数据、获取扩展数据

  [复制链接]
发表于 2025-9-23 14:31:23 | 显示全部楼层 |阅读模式
  1. ;;说明:添加扩展数据
  2. ;;参数:e:可以为图元名也可以为有效的图元数据(entget en)
  3. ;;参数:xdatas:'(("south" "3000" "1112")("south1" "4000" "1112"))
  4. ;;返回:图元数据
  5. (defun lea-xadat-put (e xdatas / ty app)
  6.   (setq ty (type e)
  7.     app (mapcar 'car xdatas);每一个
  8.   )
  9.   ;  (vl-every 'regapp app);every需要所有项都是真,碰到nil就结束了 ,碰到已注册的就结束了
  10.   (foreach x app
  11.     (if  (= (tblsearch "appid" x) nil)
  12.       (regapp x);已注册的就不用注册了
  13.     )
  14.   )
  15.   (if (member ty '(ENAME list))
  16.     (entmod (append
  17.               (if (= ty 'ENAME)(entget e) e)
  18.               (list (cons -3
  19.                       (mapcar ' (lambda (x) (cons (car x)
  20.                                               (mapcar '(lambda (x)
  21.                                                          (cons
  22.                                                            (cond
  23.                                                              ((= (type x) 'str) 1000);字符串
  24.                                                              ((= (type x) 'real) 1040);实数
  25.                                                              (t 1070)
  26.                                                            )
  27.                                                            x
  28.                                                          )
  29.                                                        )                                                
  30.                                                 (cdr x)
  31.                                               )
  32.                                             )
  33.                                 )
  34.                         xdatas
  35.                       )
  36.                     )
  37.               )
  38.             )
  39.     )
  40.    
  41.   )
  42. )
  43. ;;说明:获取扩展数据
  44. ;;参数:en:图元名
  45. ;;返回:扩展数据列表(("south" "4000" "1112") ("south1" "4000" "11342"))
  46. (defun lea-xadat-get (en / lst)
  47.   (if (and (= (type en) 'ename)
  48.         (setq lst (cdr (assoc -3 (entget en '("*")))));(("south" (1000 . "4000") (1000 . "1112")) ("south1" (1000 . "4000") (1000 . "11342")))
  49.       )
  50.     (progn
  51.       (mapcar '(lambda (x)
  52.                  (mapcar '(lambda (x)
  53.                             (if (= (type x) 'list) (cdr x) x)
  54.                           )
  55.                    x
  56.                  )   
  57.                )
  58.         lst
  59.       )
  60.     )
  61.   )
  62. )


点评

赞  发表于 2025-9-23 16:47

评分

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

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2025-9-23 16:45:40 | 显示全部楼层
请问可以用于哪方面的应用?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-23 21:26:53 | 显示全部楼层
lxl304712346 发表于 2025-9-23 16:45
请问可以用于哪方面的应用?

可以将数据保存到图元里
回复 支持 反对

使用道具 举报

发表于 2025-9-23 23:05:47 | 显示全部楼层
lxl304712346 发表于 2025-9-23 16:45
请问可以用于哪方面的应用?

可以把数据存储里边,然后在用的时候提取出来,但是这个属性CAD绘图界面是不显示的,和字典的一样的。如果扩展数据多了,DWG文件会很大。
回复 支持 反对

使用道具 举报

发表于 2025-9-24 08:46:14 | 显示全部楼层
图元的分解和合并好像会影响扩展数据的跟随,不知道有什么好的解决方案吗
回复 支持 反对

使用道具 举报

发表于 2025-9-24 12:56:59 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

发表于 2025-9-24 19:12:30 | 显示全部楼层
本帖最后由 llsheng_73 于 2025-9-24 19:15 编辑

  1. (defun getxdata(e app n / b);|app为已注册应用名,""返回图元对象的所有应用名下的数据 ,n指定返回几项,可用于强行对齐字段,nil按实际项数返回|;
  2.      (if(and(or(=(type e)'vla-object)(setq e(vlax-ename->vla-object e)))
  3.             (not(VL-CATCH-ALL-ERROR-P(VL-CATCH-ALL-APPLY(function vla-getxdata)(list e app'b'b))))b)
  4.        (mapcar(function vlax-variant-value)(vlax-safearray->list b))
  5.        (progn(while(<(length b)n)(setq b(cons""b)))(cons app b))))
  6. (defun addxdatas(e doc app / apps xtype xapp);|doc,图元对象e所在文档对象,方便跨图操作或对DBX的图元对象进行处理,app(("app1" "value1""value2""value3")("app2")("app3" "a3v1""a3v2""a3v3""a3v4"))应用名后为该应用后要加入的数据,无数据的情况下去掉该应用的数据如("app2")|;
  7.   (setq apps(vlax-get-property doc 'RegisteredApplications))
  8.   (mapcar(function(lambda(x)(vlax-invoke-method apps 'add(car x))t))app)
  9.   (or(=(type e)'vla-object)(setq e(vlax-ename->vla-object e)))
  10.   (setq xtype(vlax-safearray-fill(vlax-make-safearray 2'(0 . 0))'(1001))xapp(vlax-make-safearray 12'(0 . 0)))
  11.   (vl-some(function(lambda(a / xtype n)
  12.                      (setq n(length a)xtype(cons 1001(mapcar(function(lambda(x)(cond((=(setq x(type x))'str)1000)((= x'int)1071)((= x'real)1040))))(cdr a))))
  13.                      (vlax-invoke-method e(function setxdata)(vlax-safearray-fill(vlax-make-safearray 2(cons 1 n))xtype)
  14.                        (vlax-safearray-fill(vlax-make-safearray 12(cons 1 n))a))))app))
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-10 04:03 , Processed in 0.171330 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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