明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2388|回复: 13

[源码] 同步当前图形中选定块的定义,与指定的文件中的块定义相同

  [复制链接]
发表于 2018-5-3 17:37:35 | 显示全部楼层 |阅读模式
外部文件中的块定义更新了 ,比如其它专业进行了修改,让当前图形中的同名块定义同步更新一直是个麻烦的事情,虽然用设计中心可以解决,但毕竟操作起来比较麻烦。所以绕了个远路,自己动手编写专用代码。

dbx相关的知识学习了gu版的贴,改进了一下,成了dbx类。

暂不支持嵌套块。

  1. (vl-load-com)
  2. ;;; (p-dbx-open "D:\\Support\\Desktop\\drawing2.dwg")
  3. ;;;#<VLA-OBJECT IAxDbDocument 0bb21e70>
  4. (defun p-dbx-open (filename / acver dbx)
  5.   (setq        dbx (vla-getinterfaceobject
  6.               (vlax-get-acad-object)
  7.               (if (< (setq acver (atoi (getvar "ACADVER"))) 16)
  8.                 "ObjectDBX.AxDbDocument"
  9.                 (strcat "ObjectDBX.AxDbDocument." (itoa acver))
  10.               )
  11.             )
  12.   )
  13.   (if (vl-catch-all-error-p
  14.         (vl-catch-all-apply 'vla-open (list dbx filename))
  15.       )
  16.     (progn
  17.       (p-dbx-close dbx)
  18.       (setq dbx nil)
  19.     )
  20.   )
  21.   (list (cons "AxDbDocument" dbx) (cons "FileName" filename))
  22. )


  23. (defun p-dbx-close (dbx /)
  24.   (setq dbx (p-dbx-getdocument dbx))
  25.   (vl-catch-all-apply 'vla-close (list dbx))
  26.   (vlax-release-object dbx)
  27.   (setq dbx nil)
  28. )


  29. (defun p-dbx-getdocument (dbx /)
  30.   (p-cls-get dbx "AxDbDocument")
  31. )


  32. (defun p-dbx-getfilename (dbx /)
  33.   (p-cls-get dbx "FileName")
  34. )


  35. (defun p-dbx-save (dbx / dbxdoc filename)
  36.   (setq        filename (p-dbx-getfilename dbx)
  37.         dbxdoc         (p-dbx-getdocument dbx)
  38.   )
  39.   (vl-catch-all-apply 'vla-saveas (list dbxdoc filename))
  40. )


  41. (defun p-dbx-saveas (dbx filename / dbxdoc)
  42.   (setq dbxdoc (p-dbx-getdocument dbx))
  43.   (vl-catch-all-apply 'vla-saveas (list dbxdoc filename))
  44. )


  45. (defun p-collection->list (collection / rv)
  46.   (vlax-for item collection
  47.     (setq rv (cons item rv))
  48.   )
  49.   (reverse rv)
  50. )


  51. (defun p-oblist->var (lst)
  52.   (vlax-make-variant
  53.     (vlax-safearray-fill
  54.       (vlax-make-safearray
  55.         vlax-vbobject
  56.         (cons 0 (1- (length lst)))
  57.       )
  58.       lst
  59.     )
  60.   )
  61. )

  62. (defun c:tt (/ dbx dest en filename name ss)

  63.   (princ "\n选择要同步的块:")
  64.   (if (and (setq ss (ssget ":E:S" '((0 . "INSERT"))))
  65.            (setq filename (getfiled "选择源文件" "" "dwg" 0))
  66.       )
  67.     (progn
  68.       (setq en         (ssname ss 0)
  69.             name (p-dxf en 2)
  70.             dbx         (p-dbx-open filename)
  71.             dest (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) name)
  72.       )

  73.       (vlax-for        ob dest
  74.         (vla-delete ob)
  75.       )

  76.       (vla-copyobjects
  77.         (p-dbx-getdocument dbx)
  78.         (p-oblist->var
  79.           (p-collection->list (vla-item (vla-get-blocks (p-dbx-getdocument dbx)) name))
  80.         )
  81.         dest
  82.       )

  83.       (foreach en (p-ss->enames (ssget "X" (list '(0 . "INSERT") (cons 2 name))))
  84.         (entupd en)
  85.       )

  86.       (p-dbx-close dbx)
  87.       (princ "\n块已同步。")
  88.     )
  89.   )
  90.   (princ)
  91. )


  92. (defun p-cls-get (cls name / e)
  93.   (if (atom name)
  94.     (cdr (assoc name cls))
  95.     (mapcar '(lambda (e) (cdr (assoc e cls))) name)
  96.   )
  97. )

  98. (defun p-ss->enames (ss / en handles n)
  99.   (if ss
  100.     (progn
  101.       (repeat (setq n (sslength ss))
  102.         (setq en      (ssname ss (setq n (1- n)))
  103.               handles (cons en handles)
  104.         )
  105.       )
  106.     )
  107.   )
  108.   handles
  109. )

  110. (defun p-dxf (ename codes / dxf)
  111.   (setq dxf (entget ename))

  112.   (if (atom codes)
  113.     (p-cls-get dxf codes)
  114.     (progn
  115.       (setq dxf        (vl-remove-if
  116.                   '(lambda (e)
  117.                      (not (member (car e) codes))
  118.                    )
  119.                   dxf
  120.                 )
  121.       )
  122.       (mapcar 'cdr dxf)
  123.     )
  124.   )
  125. )

点评

非常实用,我直想解决而没解决的问题。  发表于 2018-5-4 20:16
很有用的功能,感谢分享,虽然我个人用不到,呵呵!  发表于 2018-5-4 15:53

评分

参与人数 4明经币 +3 金钱 +15 收起 理由
头大无恼 + 1 很给力!
xshrimp + 15 很给力!
ㄘ丶转裑ㄧ灬 + 1 很给力!
USER2128 + 1 很给力!

查看全部评分

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

本帖被以下淘专辑推荐:

  • · 学习|主题: 95, 订阅: 8
发表于 2018-5-4 08:18:54 | 显示全部楼层
本帖最后由 USER2128 于 2018-5-4 09:31 编辑

大师的这个功能太好了!一直一来都想着如何实现这个功能。
提供一个自编的函数供参考,看是否能用上
  1. ;;;------------------------------------------------------------
  2. ;;; BY USER2128(HLCAD).
  3. ;;; 列出图块名为blkname的所有块内块(嵌套块)名的集合:
  4. ;;; 集合中含blkname及所有块内块(嵌套块)名(不含无名块名及重复名)
  5. ;;; EX: (nst_BLKn_lst (cdr(assoc 2(entget(car(entsel))))))
  6. (defun nst_BLKn_lst (blkname / names cnt ent elst blkn)
  7.   (setq names nil)
  8.   (setq cnt 0)
  9.   (and (= (type blkname) 'STR)
  10.        (/= blkname "")
  11.        (tblsearch "BLOCK" blkname)
  12.        (setq names (list blkname))
  13.        )
  14.   (while (< cnt (length names))
  15.     (and (setq ent (tblsearch "BLOCK" (nth cnt names)))
  16.    (setq elst (entget (setq ent (cdr (assoc '-2 ent)))))
  17.    (while ent
  18.      (and (= "INSERT" (cdr (assoc '0 elst)))
  19.     (setq blkn  (cdr (assoc '2 elst)))
  20.     (or (member blkn names)
  21.         (setq names (append names (list blkn)))
  22.         ))
  23.      (and (setq ent (entnext ent))
  24.     (setq elst (entget ent))
  25.     )
  26.      ))
  27.     (setq cnt (1+ cnt))
  28.     )
  29.   (vl-remove-if '(lambda(x) (wcmatch x "`**")) names)
  30.   )
  31. ;;;------------------------------------------------------------



回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-7 16:56:46 | 显示全部楼层
如果只是为了更新块,应该通过脚本将重新插入块(同时从定义块),然后删除刚才插入的块就可以完成了,用excel相应的插入块命令放在脚本文件里批量执行即可。依稀记得以前做过类似的事情。
发表于 2018-5-3 17:48:11 | 显示全部楼层
这个功能太好了。
发表于 2018-5-3 18:41:36 | 显示全部楼层
这个必须给点赞,梦寐以求的功能。
以前只能用设计中心,或者插入块来解决,效率特别低。
 楼主| 发表于 2018-5-4 20:23:25 | 显示全部楼层
倘若有十万个对象的块只更新了一两个对象,现在会删除这十万个对象,再全部重新生成一遍,非常之不科学

暂时没有深入做下去是感觉应该先实现一个对象比较功能,只更新有修改的对象。
发表于 2018-5-7 09:46:05 | 显示全部楼层
好用的代码啊,学习了
发表于 2018-5-12 09:26:59 | 显示全部楼层
好用的代码啊,学习了
发表于 2018-5-12 15:20:11 | 显示全部楼层
学习了,实用啊
发表于 2022-5-17 20:56:07 | 显示全部楼层
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 10:26 , Processed in 0.203710 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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