明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1912|回复: 13

[源码] 插入图块,同时更新图块(修正版)

[复制链接]
发表于 2019-12-3 15:43 | 显示全部楼层 |阅读模式
本帖最后由 stgpmin 于 2019-12-3 16:16 编辑

最近爬文寻找插入图块并更新块中块的方法,感谢Gu_xl大大的于2013年的源码提供。不过也许是CAD版本替换,导致程序运行失败
经过反覆debug,确认是标注的图块问题,因本人水平不高,只能先通过由标注的图块命名原则为字首“ _”,在图块名称中选择增加一行程序码,将标注图块筛选掉。若使用上有问题,可能是因为我使用繁体的关系,网友们可以自行修改掉这一行。
(=“ _”(substr(vla-get-name blk)1 1))
改善的,平时作业时图块命名就要避开以“ _”为字首。
另外因为本人使用上习惯将图块W出去,修改后再insert回来,所以增加了这个功能,能将欲插入的档案本身视为图块更新。
使用上要先拾取图档内欲更新的图块,此动作是为了快速获取图块名称,用substr指令应该也可以达成。
接着就是选择要插入的档案,若图块很多,会停止重新插入,然后就是插入图块,可以在选择插入点时按esc取消它,就完成更新图块的工作
再次感谢Gu_xl大大,解决我长久以来困扰的问题。这方式可以做为在多人协作时,不使用外部参考的解决方案。


  1. ;;插入圖塊,同時更新圖塊 By Gu_xl 2013.04.02
  2. (defun c:ibb (/  DWGNAME     DBXDOC       ACVER
  3.                      DBXMODELSPACE             BLOCKS
  4.                      DOC          DBXBLOCKNAMES
  5.                      OBJS
  6.                      )
  7.         ;;獲取圖塊名稱
  8.         (setq bss (entsel))
  9.         (setq eN1 (car bss))
  10.         (setq EN1_data (entget EN1))
  11.         (setq b_name (cdr (assoc 2 EN1_data)))
  12.          
  13.         ;;結束
  14.   (setq DwgName (GETFILED "選擇要插入的圖塊文件" "" "dwg" 4))
  15.   (setq dwgname2 (strcat b_name "=" dwgname))
  16.   (if (and
  17.         DwgName
  18.         (not
  19.           (equal
  20.             (strcase DwgName)
  21.             (strcase (strcat (getvar "dwgprefix") (getvar "dwgname")))
  22.             )
  23.           )
  24.         )
  25.     (progn
  26.       (setq
  27.         DBXDOC (vla-GetInterfaceObject
  28.                  (vlax-get-acad-object)
  29.                  (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
  30.                    "ObjectDBX.AxDbDocument"
  31.                    (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
  32.                    )
  33.                  )
  34.         )
  35.       (vla-open DBXDOC DWGNAME)
  36.       (setq DBXModelSpace (vla-get-ModelSpace DBXDOC))
  37.       (setq blocks (vla-get-blocks
  38.                      (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  39.                      )
  40.             )
  41.       (vlax-for blk (vla-get-blocks DBXDOC)
  42.         (if (not (or (eq :vlax-true (vla-get-isXRef blk))
  43.                      (eq :vlax-true (vla-get-isLayout blk))
  44.                      (= "*U" (substr (vla-get-name blk) 1 2))
  45.                      (= "*D" (substr (vla-get-name blk) 1 2))
  46.                      (= "*T" (substr (vla-get-name blk) 1 2))
  47.                      (= "_" (substr (vla-get-name blk) 1 1))
  48.                      )
  49.                  )
  50.           (setq dbxblocknames (cons (vla-get-name blk) dbxblocknames))
  51.           )
  52.         )
  53.       (setq dbxblocknames
  54.              (vl-remove-if-not '(lambda (x) (TBLSEARCH "BLOCK" x)) dbxblocknames)
  55.             )
  56.       (if dbxblocknames
  57.         (progn
  58.           (foreach block dbxblocknames
  59.             (vlax-for obj (vla-item blocks block)
  60.               (vla-delete obj)
  61.               )
  62.             (setq objs nil)
  63.             (vlax-invoke
  64.               dbxDoc
  65.               'CopyObjects
  66.               (vlax-for a
  67.                 (vla-item (vla-get-blocks DBXDOC) block)
  68.                 (setq objs (cons a objs))
  69.                 )
  70.               (vla-item blocks block)
  71.               )
  72.             )
  73.           (vla-regen doc :vlax-true)
  74.           (prompt (strcat "\n更新了" (itoa (length dbxblocknames)) "個圖塊!"))
  75.           )
  76.         (prompt "\n沒有可更新的圖塊!")
  77.         )
  78.       (vlax-release-object DBXDOC)
  79.       (command "insert" DwgName2)
  80.       (while (= 1 (logand (getvar 'cmdactive) 1))
  81.         (command pause)
  82.         )
  83.       )
  84.     )
  85.   (princ)
  86. )  





 楼主| 发表于 2019-12-4 16:49 | 显示全部楼层
CAD新军 发表于 2019-12-4 16:39
能不能给一下老大的原来的代码。我不是信不过你,我只是想先用老大的版本试试能不能用

OK的,連結在此,在3樓
http://bbs.mjtd.com/forum.php?mo ... 9132&fromuid=235946
  1. http://bbs.mjtd.com/forum.php?mod=redirect&goto=findpost&ptid=100770&pid=579132&fromuid=235946
复制代码

点评

谢谢  发表于 2019-12-4 17:46
 楼主| 发表于 2019-12-4 11:51 | 显示全部楼层
andyzha 发表于 2019-12-4 11:04
你的lisp是不是打开一个文件,选择特定要更新的同名块,然后选择更新源文件,实现更新现在打开的文件块文件 ...

對,但我的LISP在選擇特定要更新的塊時,不一定要同名,方便源文件在命名時可以標示時間或版次,該更新塊會更名為源文件檔名。至於塊中塊則會保持原本的塊名
发表于 2019-12-3 16:01 | 显示全部楼层
代码在哪儿呢?

这个其实是很多作图者的痛点,多人协作改图,局部更新,却需要全局汇总的时候都更新过来

G大很多年前的代码基本上解决的这个痛点,但是有个小小的遗憾,如果是动态块做的,更新以后,动态块的属性,例如拉伸,就失效了。

期待明经的哪个大神能完美的解决这个小遗憾了。
 楼主| 发表于 2019-12-3 16:15 | 显示全部楼层
andyzha 发表于 2019-12-3 16:01
代码在哪儿呢?

这个其实是很多作图者的痛点,多人协作改图,局部更新,却需要全局汇总的时候都更 ...

哈,奇怪,我使用代碼功能,結果代碼都不見了,我原本還把繁體字都轉成簡體字,這下子都沒有了,繁體字先頂著用。
发表于 2019-12-4 11:04 | 显示全部楼层
你的lisp是不是打开一个文件,选择特定要更新的同名块,然后选择更新源文件,实现更新现在打开的文件块文件的目的?
发表于 2019-12-4 16:39 | 显示全部楼层
能不能给一下老大的原来的代码。我不是信不过你,我只是想先用老大的版本试试能不能用
发表于 2023-7-13 09:44 | 显示全部楼层
请问,动态块无法更新,能有什么方法解决吗?
发表于 2023-9-9 11:20 | 显示全部楼层
这太厉害了,能更新块中的子块,找了这个功能很久了,感谢 感谢!
发表于 2023-10-16 23:46 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 20:04 , Processed in 0.616520 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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