明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1667|回复: 31

[提问] 【有偿求助 100 CNY】图块跨图更新

[复制链接]
发表于 2024-8-2 14:28:53 | 显示全部楼层 |阅读模式
有多张图纸,如果把A图的一些块C1、C2、C3等做了调整,如何通过操作B图、把指定的块(单击B图的块或者从列表选取)定义更新到B图?
类似设计中心|块|重定义的功能。
发表于 2024-8-2 15:31:00 | 显示全部楼层
本帖最后由 1028695446 于 2024-8-2 15:37 编辑

我知道这个功能,只支持有名块和动态块,不支持纯无名块

操作是 在A图中带基点复制需要更新的图块(可以是图块中的图块,即嵌套块),然后更新到B块(图块重定义)

最终结果是你想要(即重定义B图中的图块)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 2 反对 0

使用道具 举报

发表于 2024-8-2 17:21:54 | 显示全部楼层
  1. (setq ss (ssget ":E:S" '((0 . "INSERT"))))          ;;;选择图块
  2. (setq ent (vlax-ename->vla-object (ssname ss 0)))   ;;;转换成VLA对象
  3. (setq blkname (vla-get-name ent))                   ;;;获取图块名
  4. (setq doc1 (vla-get-ActiveDocument (vlax-get-acad-object)))    ;;;获取当前文档
  5. (setq blk1 (vla-item (vla-get-blocks doc1) blkname))           ;;;获取当前图块定义blk1

  6. (setq doc2 (vla-item (vla-get-Documents (vlax-get-acad-object)) "Drawing2.dwg"))    ;;;获取需要更新的文档
  7. (setq blk2 (vla-item (vla-get-blocks doc2) blkname))           ;;;获取需要更新的图块定义blk2
  8. (vlax-for item blk2 (vla-delete item))                         ;;;删除图块定义blk2中的图元
  9. (setq listblk '())
  10. (vlax-for item blk1 (setq listblk (cons item listblk)))        ;;;把blk1中的图元列表
  11. (setq saf (vlax-make-safearray vlax-vbObject  (cons 0 (1- (length listblk)))))
  12. (vlax-safearray-fill saf listblk)                              ;;;把列表转成数组
  13. (vla-CopyObjects doc1 saf blk2)                                ;;;把数字复制到blk2中

  14. (vla-Regen doc2 acActiveViewport)                              ;;;刷新doc2
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-8-5 09:51:49 | 显示全部楼层
本帖最后由 Lampard 于 2024-8-5 09:55 编辑
lijiao 发表于 2024-8-3 06:26
最核心的原理已经给你了,你可以根据自己的实际情况进行编排,应该不难的
  1. <blockquote>(defun c:kgx ( / )
谢谢大神的指导,基本功能都实现了。
横线位置还有两个问题,希望得到您的帮助。




(defun c:kgx ( / )
    (princ "\n选择目标:")
        (setq ss (ssget)
                n (sslength ss)
                step 0)
        (repeat n
        (setq s (ssname ss step)
                         ent (entget s))
                (if (= "INSERT" (cdr (assoc 0 ent)))
        (progn               
               
                (setq ent (vlax-ename->vla-object (ssname ss step)))   ;;;转换成VLA对象
                (setq blkname (vla-get-name ent))                   ;;;获取图块名
                        (setq doc1 (vla-get-ActiveDocument (vlax-get-acad-object)))     ;;;获取当前文档
                (setq blk1 (vla-item (vla-get-blocks doc1) blkname))                         ;;;获取当前图块定义blk1
               
                ;;;______________________问题一________________________________________
                ;;;下面这里能否加一个判断,22.dwg里有blk1,再行后续操作,特别是进行下一句的删除blk1中的图元
                (vlax-for item blk1 (vla-delete item))                                                   ;;;删除图块定义blk1中的图元
        
                ;;;______________________问题二________________________________________
                ;;;这里能否交互选择文件或者下一行代码"22.dwg"如何带路径输入
                (setq doc2 (vla-item (vla-get-Documents (vlax-get-acad-object)) "22.dwg"));;;获取需要更新的文档
                (setq blk2 (vla-item (vla-get-blocks doc2) blkname))           ;;;获取需要更新的图块定义blk2
                (setq listblk '())
                (vlax-for item blk2 (setq listblk (cons item listblk)))        ;;;把blk1中的图元列表
                (setq saf (vlax-make-safearray vlax-vbObject  (cons 0 (1- (length listblk)))))
                (vlax-safearray-fill saf listblk)                              ;;;把列表转成数组
                (vla-CopyObjects doc2 saf blk1)                                ;;;把数字复制到blk1中


                ;(vla-Regen doc1 acActiveViewport)                              ;;;刷新doc1       
        (princ blkname)        (princ "已更新\n") (princ)
                ) ;progn 结束
                )  ;if 结束
            (setq step (1+ step))
         );repeat结束
    (vla-Regen doc1 acActiveViewport)                              ;;;刷新doc1               
        )


发表于 2024-8-2 14:46:36 | 显示全部楼层
用外部参照不就行了嘛
发表于 2024-8-2 15:05:14 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-8-2 15:07 编辑

用DBX就是了,先把需要更新的块复制进DBX,再插入B图,最后保存为B图
发表于 2024-8-2 15:11:51 | 显示全部楼层
ssyfeng 发表于 2024-8-2 14:46
用外部参照不就行了嘛

参照肯定不太行、比如说属性块就没法搞参照、他这个需求我之前也想弄了、不过lisp对跨文件操作貌似有限制、一跨文件就进行不了下一步操作了
 楼主| 发表于 2024-8-2 15:26:41 | 显示全部楼层
ssyfeng 发表于 2024-8-2 14:46
用外部参照不就行了嘛
谢谢提醒
模块化建筑,每层楼有十几种块,要参照内容太多了,用起来也不太方便

目前暂时用的外部参照,等这个功能需求解决了,就绑定进来按块处理。
 楼主| 发表于 2024-8-2 15:28:51 | 显示全部楼层
kozmosovia 发表于 2024-8-2 15:05
用DBX就是了,先把需要更新的块复制进DBX,再插入B图,最后保存为B图

简单的会自己写,您说的这个不会啊
发表于 2024-8-2 15:36:25 | 显示全部楼层
什么块需要经常修改的,如果是其它专业的底图,感觉就是用外部参照最好
 楼主| 发表于 2024-8-2 15:38:48 | 显示全部楼层
本帖最后由 Lampard 于 2024-8-2 15:40 编辑
ssyfeng 发表于 2024-8-2 15:36
什么块需要经常修改的,如果是其它专业的底图,感觉就是用外部参照最好

不是参其他专业的。一种比较复杂的模块化建筑,一个房间就是一个模块,刚好做成一个块;每层的房间类型比较多,过程中还有变异。
发表于 2024-8-2 15:43:44 | 显示全部楼层
可以研究一下DBX,不开图读取操作dwg文件,有一定限制,但是常规操作都支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:06 , Processed in 0.189668 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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