429014673 发表于 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" )


(defun en-effname (ent)
(LM:al-effectivename ent)
)
(defun LM:al-effectivename (ent / blk rep)
(if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
    (if
      (and
      (setq rep
               (cdadr
               (assoc      -3
                        (entget
                        (cdr
                            (assoc 330
                                 (entget
                                     (tblobjname "block" blk)
                                 )
                            )
                        )
                        '("AcDbBlockRepBTag")
                        )
               )
               )
      )
      (setq rep (handent (cdr (assoc 1005 rep))))
      )
       (setq blk (cdr (assoc 2 (entget rep))))
    )
)
blk
)

(defun c:up (/ ss obj eff nl i)
(setq ss (ssget '((0 . "insert"))))
;;;(undobe)
(setq i 0)
(repeat (sslength ss)
(setq obj (ssname ss i))
(setq i (1+ i))
(setq eff (en-effname obj))
(if (and eff (not (member eff nl)))
   (progn
   (setq nl (cons eff nl))
   (command "-insert" (strcat eff "=" eff ".dwg"))
   (command)
   ;;;(prinx "\n更新:" eff)
   )
)
)
;;; (undo_e)
(princ "\n完成")
(prin1)
)


liuhe 发表于 2024-8-3 18:58:24

本帖最后由 liuhe 于 2024-8-3 19:04 编辑

有兴趣可以找我,我做过类似的图块更新统一。你需要考虑的是,属性块的属性怎么办

Lampard 发表于 2024-8-5 09:47:18

本帖最后由 Lampard 于 2024-8-5 09:48 编辑

1111111111

Lampard 发表于 2024-8-5 09:51:49

本帖最后由 Lampard 于 2024-8-5 09:55 编辑

lijiao 发表于 2024-8-3 06:26
最核心的原理已经给你了,你可以根据自己的实际情况进行编排,应该不难的
<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               
        )


kozmosovia 发表于 2024-8-5 10:26:36

动态块现在到处都是,不推荐这种更新方式,会将动态块的信息和数据搞乱丢失,得不偿失。还是老老实实用insert name=dwg方式更新。

lijiao 发表于 2024-8-5 15:03:16

Lampard 发表于 2024-8-5 09:51
谢谢大神的指导,基本功能都实现了。
横线位置还有两个问题,希望得到您的帮助。



感觉你的逻辑不是很清楚
第一,要弄清楚源文件和目标文件的关系,它们之间的关系怎么确认?比如有三个文件doc1,doc2,doc3,你怎么确定是doc1和doc2有关系,而不是doc1和doc3有关系,这种关系怎么建立,怎么保存,怎么撤销
第二,要弄清楚上下级的关系,doc1和doc2谁是父,谁是子?
第三,要弄清楚主动与被动的关系,是父去寻子还是子去找父?
第四,要弄清楚谁是权威,是父随子还是子随父?
只要把这几个问题搞清楚了,你的程序就好写了

panliang9 发表于 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,更新本图中的图块。






wharan 发表于 2024-8-6 13:21:00

使用外部参照,是最推荐最可靠的方法。只不过大多画图匠不会用外部引用

白山茶 发表于 2024-8-6 13:50:21

kozmosovia 发表于 2024-8-5 10:26
动态块现在到处都是,不推荐这种更新方式,会将动态块的信息和数据搞乱丢失,得不偿失。还是老老实实用inse ...

请问insert name=dwg方式是啥
页: 1 2 [3]
查看完整版本: 【有偿求助 100 CNY】图块跨图更新