明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 807|回复: 9

字典操作

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2025-6-1 14:30 编辑

字典操作,一起测试
感谢石总帮助
  1. (defun $zi-dian-xie-ru$
  2.                         (ent          name           values   lst             /
  3.                          _setxrecord           alls            dict     dicts
  4.                          list->vbarray           news            obj             obj0
  5.                          olds          xd           xlst            xrec     xt
  6.                         )
  7.                                         ;字典写入
  8.                                         ;($zi-dian-xie-ru$(CAR (entsel))  "ZXCAD" '((1000 . "HELLO WORLD") (1070 . 1) (1040 . 1.0))nil)
  9.   (defun _setxrecord (obj lst)
  10.     (vla-setxrecorddata
  11.       obj
  12.       (list->vbarray (mapcar 'car lst) vlax-vbinteger)
  13.       (list->vbarray (mapcar 'cdr lst) vlax-vbvariant)
  14.     )
  15.   )
  16.   (defun list->vbarray (ptsList TYPE1 / arraySpace sArray)
  17.     (setq arraySpace
  18.            (vlax-make-safearray
  19.              TYPE1
  20.              (cons 0 (- (length ptsList) 1))
  21.            )
  22.     )
  23.     (setq sArray (vlax-safearray-fill arraySpace ptsList))
  24.     (vlax-make-variant sArray)
  25.   )
  26.   (if (and ent (= (type ent)) 'ename)
  27.     (setq obj0 (vlax-ename->vla-object ent))
  28.   )
  29.   (and obj0 (setq obj (VLA-GetExtensionDictionary obj0)))
  30.   (if (= (vla-get-objectname obj) "AcDbDictionary")
  31.     (progn
  32.       (vlax-for        d obj
  33.         (if (and (= (vla-get-objectname d) "AcDbXrecord")
  34.                  (= (strcase (vla-get-name d)) (strcase name))
  35.             )
  36.           (setq xrec d)
  37.         )
  38.       )
  39.       (if xrec
  40.         (progn
  41.           (vla-getxrecorddata xrec 'xt 'xd)
  42.           (if xt
  43.             (progn
  44.               (setq olds
  45.                      (mapcar 'cons
  46.                              (safearray-value xt)
  47.                              (mapcar 'variant-value (safearray-value xd))
  48.                      )
  49.               )
  50.               (setq
  51.                 alls (vl-remove nil (append olds values))
  52.               )
  53.               (cond
  54.                 ((vl-position (cdr (assoc "模式" lst)) (list "追加"))
  55.                  (setq news alls)
  56.                 )
  57.                 (t (setq news values))
  58.               )
  59.               (_setxrecord xrec news)
  60.             )
  61.             (_setxrecord xrec values)
  62.           )
  63.         )
  64.         (progn
  65.           (setq xrec (vla-addxrecord obj name))
  66.           (_setxrecord xrec values)
  67.         )
  68.       )
  69.     )
  70.     (if        (= (vla-get-hasExtensionDictionary obj) :vlax-true)
  71.       (progn
  72.         (setq dicts (vla-GetExtensionDictionary obj))
  73.         (vlax-for dict dicts
  74.           (if (and (= (vla-get-objectname dict) "AcDbXrecord")
  75.                    (= (strcase (vla-get-name dict)) (strcase name))
  76.               )
  77.             (setq xrec dict)
  78.           )
  79.         )
  80.         (if xrec
  81.           (progn
  82.             (vla-getxrecorddata xrec 'xt 'xd)
  83.             (_setxrecord
  84.               xrec
  85.               (append
  86.                 (mapcar        'cons
  87.                         (safearray-value xt)
  88.                         (mapcar 'variant-value (safearray-value xd))
  89.                 )
  90.                 values
  91.               )
  92.             )
  93.           )
  94.         )
  95.       )
  96.       (progn
  97.         (setq dict (vla-getextensiondictionary obj)
  98.               xrec (vla-addxrecord dict name)
  99.         )
  100.         (_setxrecord xrec values)
  101.       )
  102.     )
  103.   )
  104.   ($zi-dian-du-qu$ ent "*" nil)
  105. )
  106. (defun $zi-dian-du-qu$
  107.        (ent name lst / _getxrecord dicts e obj obj0 xd xt)
  108.                                         ;字典读取
  109.                                         ;($zi-dian-du-qu$(CAR (entsel))   "*"  nil)
  110.                                         ;($zi-dian-du-qu$(CAR (entsel))   "ZXCAD"  nil)
  111.   (defun _getxrecord (dc / xt xd)
  112.     (if        (= (vla-get-objectname dc) "AcDbXrecord")
  113.       (progn (vla-getxrecorddata dc 'xt 'xd)
  114.              (if (and xt xd)
  115.                (setq lst
  116.                       (cons
  117.                         (cons (vla-get-name dc)
  118.                               (mapcar
  119.                                 'cons
  120.                                 (safearray-value xt)
  121.                                 (mapcar 'variant-value (safearray-value xd))
  122.                               )
  123.                         )
  124.                         lst
  125.                       )
  126.                )
  127.                (setq lst (cons (vla-get-name dc) lst))
  128.              )
  129.       )
  130.     )
  131.   )
  132.   (if (and ent (= (type ent)) 'ename)
  133.     (setq obj0 (vlax-ename->vla-object ent))
  134.   )
  135.   (and obj0 (setq obj (VLA-GetExtensionDictionary obj0)))
  136.   (if (= (vla-get-objectname obj) "AcDbDictionary")
  137.     (vlax-for dict obj (_getxrecord dict))
  138.     (if        (= (vla-get-hasExtensionDictionary obj) :vlax-true)
  139.       (progn (setq dicts (vla-GetExtensionDictionary obj))
  140.              (vlax-for dict dicts (_getxrecord dict))
  141.       )
  142.     )
  143.   )
  144.   (if
  145.     (= name "*")
  146.      lst
  147.      (vl-remove-if-not
  148.        (function (lambda (x) (= (strcase (car x)) (strcase name))))
  149.        lst
  150.      )
  151.   )
  152. )
  153. (defun $zi-dian-shan-chu$
  154.        (ent name vars lst / E1 obj obj0 OLDS SS TF X)
  155.                                         ;字典删除
  156.                                         ;($zi-dian-shan-chu$(CAR (entsel))   "ZXCAD" '((1070 . 1) (1040 . 2.0))  nil)
  157.   (if (and ent (= (type ent)) 'ename)
  158.     (setq obj0 (vlax-ename->vla-object ent))
  159.   )
  160.   (and obj0 (setq obj (VLA-GetExtensionDictionary obj0)))
  161.   (if (setq OLDS ($zi-dian-du-qu$ ent name NIL))
  162.     (progn
  163.       (setq olds (cdr (assoc name OLDS)))
  164.       (COND
  165.         ((AND obj name vars)
  166.          (setq OLDS (vl-remove-if
  167.                       (function (lambda (a) (assoc (car a) vars)))
  168.                       OLDS
  169.                     )
  170.          )
  171.          (if OLDS
  172.            ($zi-dian-xie-ru$ ent name OLDS lst)
  173.          )
  174.         )
  175.         (T
  176.          (if (= (vla-get-objectname obj) "AcDbDictionary")
  177.            (vlax-for d obj
  178.              (if (= (vla-get-objectname d) "AcDbXrecord")
  179.                (if (= name "*")
  180.                  (vla-delete d)
  181.                )
  182.                (if (= (strcase (vla-get-name d)) (strcase name))
  183.                  (vla-delete d)
  184.                )
  185.              )
  186.            )
  187.            (if (vla-get-hasextensiondictionary obj)
  188.              (vlax-for d (vla-getextensiondictionary obj)
  189.                (if (= (vla-get-objectname d) "AcDbXrecord")
  190.                  (if (= name "*")
  191.                    (vla-delete d)
  192.                  )
  193.                  (if (= (strcase (vla-get-name d)) (strcase name))
  194.                    (vla-delete d)
  195.                  )
  196.                )
  197.              )
  198.            )
  199.          )
  200.         )
  201.       )
  202.       (setq OLDS ($zi-dian-du-qu$ ent name NIL))
  203.     )
  204.   )
  205.   OLDS
  206. )


评分

参与人数 2明经币 +2 收起 理由
kucha007 + 1 赞一个!
1028695446 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
强哥这么厉害吗,大佬你厉害还是强哥厉害.
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
大佬介绍下怎么使用呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
本帖最后由 dcl1214 于 2025-6-2 10:08 编辑

  1. (setq ent-text(car(entsel "请点击一个文字")))
  2. (setq ent-line(car(entsel "请点击一根直线")))
  3. (setq obj(vlax-ename->vla-object ent-text))
  4. (setq text-objid(vla-get-objectid obj));文字的objid
  5. (setq txt-jb(cdr(assoc 5(entget ent-text))));文字句柄
  6. ($zi-dian-xie-ru$ ent-line  "ZXCAD" (list(cons 330 txt-jb))nil);将文字的id写入到直线里面,当用户复制图纸的时候,绑定关系依然成立
  7. (cdr(assoc 330(cdr(assoc "ZXCAD"($zi-dian-du-qu$ (CAR (entsel))   "ZXCAD"  nil)))));读取看看

回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
(defun $objid>ent$ (objID / ent)
  (if objID
    (setq ent (vl-catch-all-apply
                'vlax-vla-object->ename
                (list
                  (vl-catch-all-apply
                    'vla-ObjectIdToObject
                    (list
                      (vla-get-activedocument (vlax-get-acad-object))
                      objID
                    )
                  )
                )
              )
    )
  )
  (if (vl-catch-all-error-p ent)
    (setq ent nil)
  )
  ent
)
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
大佬介绍下运用场景~
回复 支持 反对

使用道具 举报

发表于 前天 12:16 | 显示全部楼层

(cdr(assoc 330(cdr(assoc "ZXCAD"($zi-dian-du-qu$ (CAR (entsel))   "ZXCAD"  nil)))));读取看看
读取了,是个安全数组.vlax-safearray->list 解析了是个表.如何返回实体的objectID啊.
回复 支持 反对

使用道具 举报

发表于 昨天 08:59 | 显示全部楼层
就这么完事调试了可以啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-6 09:57 , Processed in 0.182660 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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