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方式是啥