本帖最后由 轻尘 于 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)
|