有用本图的图块替换其他文件中同名块的插件吗?
如题,我的想法是先把本图的某些带关键字的图块写到临时文件夹,再插入到其他文件。更新块定义。但是不知如何操作让newbing帮忙写了一段代码,将本图中的以'GPS'开头的块分别写到新文件中,新文件的文件名同块名,路径同本图一致。 代码运行时提示文件名无效,有大侠帮忙看下问题在哪儿吗?
代码如下:
(defun c:test1 (/ ss blkname blkpath)
(setq ss (ssget "_X" '((0 . "INSERT")(2 . "GPS*"))))
(repeat (setq i (sslength ss))
(setq blkname (cdr (assoc 2 (entget (ssname ss (setq i (1- i)))))))
(setq blkpath (strcat (getvar 'dwgprefix) blkname ".dwg"))
(command "_.-wblock" ss blkpath "" "0")
)
) 设计中心这个功能好使。你这个代码的需求我写不上。设计中心 ctrl+2 嘒彼小星 发表于 2023-8-6 17:48
设计中心这个功能好使。你这个代码的需求我写不上。设计中心 ctrl+2
需要替换的图块比较多:( 本帖最后由 轻尘 于 2023-8-15 11:31 编辑
用chatgpt写了两段代码,基本能实现在不同文件中批量替换同名块了。
1. 把本文件中的块名带“gps”的块保存到temp文件夹
(vl-load-com)
;; 定义一个函数,用于将指定名称的块保存到新文件
(defun wblock-gps-block (blkName / blkpath)
;; 执行 WBLOCK 命令
(setq blkpath (strcat (getvar 'dwgprefix) "TEMP\\" blkName ".dwg"))
(command "_wblock" blkpath "Y" blkName)
;; 输出提示信息
(princ (strcat "已将块保存到文件:" blkpath "\n"))
)
;; 定义一个函数,用于获取所有包含'gps'的块的名称
(defun get-gps-block-names (/ selSet ent obj blkName dynamicBlkName i blockNames)
;; 获取所有插入的块
(setq selSet (ssget "_X" '((0 . "INSERT")(2 . "`*U*,*gps-*"))))
;; 初始化块名称列表
(setq blockNames '())
;; 遍历所有插入的块
(if selSet
(progn
(setq i 0)
(repeat (sslength selSet)
;; 获取当前块的实体和对象
(setq ent (ssname selSet i))
(setq obj (vlax-ename->vla-object ent))
;; 判断当前块是否为动态块
(if (= (vla-get-IsDynamicBlock obj) :vlax-true)
;; 获取当前动态块的有效名称
(setq blkName (vla-get-EffectiveName obj))
;; 获取当前静态块的定义名称
(setq blkName (cdr (assoc 2 (entget ent))))
)
;; 将当前块名称添加到列表中(如果不存在)
(if (not (member blkName blockNames))
(setq blockNames (cons blkName blockNames))
)
;; 更新循环计数器
(setq i (1+ i))
)
)
)
;; 返回块名称列表
blockNames
)
;; 定义一个函数,用于将所有包含'gps'的块保存到新文件
(defun c:wblock-gps-blocks (/ blockNames)
;; 输出一个空行
(princ "\n")
;; 获取所有包含'gps'的块的名称
(setq blockNames (get-gps-block-names))
;; 判断是否存在包含'gps'的块
(if blockNames
;; 遍历所有包含'gps'的块的名称
(foreach blkName blockNames
;; 将当前块保存到新文件
(wblock-gps-block blkName)
)
;; 输出提示信息
(princ "未找到包含'gps'的块。\n")
)
;; 输出一个空行
(princ "\n")
)
;; 调用函数,将所有包含'gps'的块保存到新文件
(c:wblock-gps-blocks)
2. 将temp中的同名文件插入本图以替换块定义
(defun c:replace-wblock (/ ss blkname blkpath1 blkpath2)
注意:需要操作的多个文件需要在同一文件夹.
(setq current-folder (strcat (getvar 'dwgprefix) "TEMP\\")) ; 获取当前文件所在文件夹路径
(setq files (vl-directory-files current-folder "*.dwg" 1)) ; 获取temp子文件夹中的所有dwg文件名,并返回一个列表
(if files
(foreach file files ; 遍历每个文件名
(setq blkname (substr file 1 (- (strlen file) 4))) ; 假设块名在文件名中,去除扩展名
(setq blkpath1 (strcat (getvar 'dwgprefix) "TEMP\\" blkname ".dwg"))
(setq blkpath2 (strcat blkname "=" blkpath1)) ; 拼接插入选项
(command "-insert" blkpath2 "Y" nil)
)
)
)
(c:replace-wblock)
大神们还有优化的空间吗? 想复杂了,直接把其他图插进来再WBLOCK出去覆盖就行了,同名图块会用本图的定义。 kozmosovia 发表于 2023-8-11 16:46
想复杂了,直接把其他图插进来再WBLOCK出去覆盖就行了,同名图块会用本图的定义。
好方法:lol
页:
[1]