明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: Lampard

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

[复制链接]
发表于 2024-8-3 08:04:03 | 显示全部楼层
同名块的操作,不用程序都可以更新,把B图所有图元复制到A图,这样B图的同名块就会与A图的一样了
发表于 2024-8-3 08:40:45 | 显示全部楼层
本帖最后由 菜卷鱼 于 2024-8-3 08:44 编辑

以下举例是同名块的更换,假如块名不同,你要改一下代码
先把A块Wblock写出到搜索路径,再运行UP程序
假如是属性块,更新完之后,记得attsync一下
核心代码其实就一句,就是  (command "-insert" (strcat eff "=" eff ".dwg"))
意思是  (command "-insert"  "图块A名 = 图块B名.dwg" )
  1. (defun en-effname (ent)
  2.   (LM:al-effectivename ent)
  3. )
  4. (defun LM:al-effectivename (ent / blk rep)
  5.   (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
  6.     (if
  7.       (and
  8.         (setq rep
  9.                (cdadr
  10.                  (assoc        -3
  11.                         (entget
  12.                           (cdr
  13.                             (assoc 330
  14.                                    (entget
  15.                                      (tblobjname "block" blk)
  16.                                    )
  17.                             )
  18.                           )
  19.                           '("AcDbBlockRepBTag")
  20.                         )
  21.                  )
  22.                )
  23.         )
  24.         (setq rep (handent (cdr (assoc 1005 rep))))
  25.       )
  26.        (setq blk (cdr (assoc 2 (entget rep))))
  27.     )
  28.   )
  29.   blk
  30. )

  31. (defun c:up (/ ss obj eff nl i)
  32. (setq ss (ssget '((0 . "insert"))))
  33. ;;;(undobe)
  34. (setq i 0)
  35. (repeat (sslength ss)
  36.   (setq obj (ssname ss i))
  37.   (setq i (1+ i))
  38.   (setq eff (en-effname obj))
  39.   (if (and eff (not (member eff nl)))
  40.    (progn
  41.    (setq nl (cons eff nl))
  42.    (command "-insert" (strcat eff "=" eff ".dwg"))
  43.    (command)
  44.    ;;;(prinx "\n更新:" eff)
  45.    )
  46.   )
  47. )
  48. ;;; (undo_e)
  49. (princ "\n完成")
  50. (prin1)
  51. )



发表于 2024-8-3 18:58:24 | 显示全部楼层
本帖最后由 liuhe 于 2024-8-3 19:04 编辑

有兴趣可以找我,我做过类似的图块更新统一。你需要考虑的是,属性块的属性怎么办
 楼主| 发表于 2024-8-5 09:47:18 | 显示全部楼层
本帖最后由 Lampard 于 2024-8-5 09:48 编辑

1111111111
 楼主| 发表于 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-5 10:26:36 | 显示全部楼层
动态块现在到处都是,不推荐这种更新方式,会将动态块的信息和数据搞乱丢失,得不偿失。还是老老实实用insert name=dwg方式更新。
发表于 2024-8-5 15:03:16 | 显示全部楼层
Lampard 发表于 2024-8-5 09:51
谢谢大神的指导,基本功能都实现了。
横线位置还有两个问题,希望得到您的帮助。

感觉你的逻辑不是很清楚
第一,要弄清楚源文件和目标文件的关系,它们之间的关系怎么确认?比如有三个文件doc1,doc2,doc3,你怎么确定是doc1和doc2有关系,而不是doc1和doc3有关系,这种关系怎么建立,怎么保存,怎么撤销
第二,要弄清楚上下级的关系,doc1和doc2谁是父,谁是子?
第三,要弄清楚主动与被动的关系,是父去寻子还是子去找父?
第四,要弄清楚谁是权威,是父随子还是子随父?
只要把这几个问题搞清楚了,你的程序就好写了
发表于 2024-8-6 11:43:08 | 显示全部楼层
本帖最后由 panliang9 于 2024-8-6 13:37 编辑

http://bbs.mjtd.com/thread-189708-1-1.html

在A图中输入GE,将本图暂存为一个文件,使用的时候需要自已更改一下文件的名称和位置,程序中的名称和位置为 D:\\投影图\\000.DWG
在B图中输入es,更新本图中的图块。






本帖子中包含更多资源

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

x
发表于 2024-8-6 13:21:00 | 显示全部楼层
使用外部参照,是最推荐最可靠的方法。只不过大多画图匠不会用外部引用

点评

主要是外部参照只能整体一起参照,如果能局部或者选其中部分参照,可能会更实用些。  发表于 2024-8-6 15:50
发表于 2024-8-6 13:50:21 来自手机 | 显示全部楼层
kozmosovia 发表于 2024-8-5 10:26
动态块现在到处都是,不推荐这种更新方式,会将动态块的信息和数据搞乱丢失,得不偿失。还是老老实实用inse ...

请问insert name=dwg方式是啥

点评

参看22楼  发表于 2024-8-6 14:56
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:46 , Processed in 0.181378 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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