明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 878|回复: 4

[提问] 反向替换块,替换以后会导致动态块丢失动态属性,求助!

[复制链接]
发表于 2020-1-15 10:20:52 | 显示全部楼层 |阅读模式
本帖最后由 andyzha 于 2020-1-15 10:22 编辑

初衷:经常使用块作图,但是一张图纸可能两个人在修改,两个人都修改了一部分块,想直接在自己的文件里把别人修改的块替换过来,论坛里的大佬提供了一个反向替换块的方案,很好用,但是还有有点bug,就是如果替换块中有动态块,直接导致动态块失效,动态属性用不了。求高手完善一下,不胜感激。

附上源码,供参考。

MM-替换同名块
(defun c:MM (/ DWGNAME      DBXDOC       ACVER
                     DBXMODELSPACE             BLOCKS
                     DOC          DBXBLOCKNAMES
                     OBJS
                     )
  (setq DwgName (GETFILED "选择引入图块的DWG文件" "" "dwg" 4))
  (if (and
        DwgName
        (not
          (equal
            (strcase DwgName)
            (strcase (strcat (getvar "dwgprefix") (getvar "dwgname")))
            )
          )
        )
    (progn
      (setq
        DBXDOC (vla-GetInterfaceObject
                 (vlax-get-acad-object)
                 (if (< (setq acVer (atoi (getvar "ACADVER"))) 16)
                   "ObjectDBX.AxDbDocument"
                   (strcat "ObjectDBX.AxDbDocument." (itoa acVer))
                   )
                 )
        )
      (vla-open DBXDOC DWGNAME)
      (setq DBXModelSpace (vla-get-ModelSpace DBXDOC))
      (setq blocks (vla-get-blocks
                     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
                     )
            )
      (vlax-for blk (vla-get-blocks DBXDOC)
        (if (not (or (eq :vlax-true (vla-get-isXRef blk))
                     (eq :vlax-true (vla-get-isLayout blk))
                     (= "*U" (substr (vla-get-name blk) 1 2))
                     (= "*D" (substr (vla-get-name blk) 1 2))
                     (= "*T" (substr (vla-get-name blk) 1 2))
                     )
                 )
          (setq dbxblocknames (cons (vla-get-name blk) dbxblocknames))
          )
        )
      (setq dbxblocknames
             (vl-remove-if-not
               '(lambda (x) (TBLSEARCH "BLOCK" x))
               dbxblocknames
               )
            )
      (if dbxblocknames
        (progn
          (foreach block dbxblocknames
            (vlax-for obj (vla-item blocks block)
              (vla-delete obj)
              )
            (setq objs nil)
            (vlax-invoke
              dbxDoc
              'CopyObjects
              (vlax-for a
                (vla-item (vla-get-blocks DBXDOC) block)
                (setq objs (cons a objs))
                )
              (vla-item blocks block)
              )
            )
          (vla-regen doc :vlax-true)
          (prompt (strcat "\n更新了" (itoa (length dbxblocknames)) "个图块!"))
          )
        (prompt "\n没有可更新的图块!")
        )
      (vlax-release-object DBXDOC)
      )
    )
  (princ)
)  

 楼主| 发表于 2020-1-15 16:45:04 | 显示全部楼层
这个是很多作图人的痛点,希望大神关注一下
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-21 07:29:15 | 显示全部楼层
我也一直在找关于动态块自定义属性
发表于 2020-7-10 23:52:28 | 显示全部楼层
这个代码运行不了啊
发表于 2025-1-14 18:39:46 来自手机 | 显示全部楼层
用ctrl+2就可以
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 18:57 , Processed in 0.196015 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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