轻尘 发表于 2023-8-4 10:44:45

有用本图的图块替换其他文件中同名块的插件吗?

如题,我的想法是先把本图的某些带关键字的图块写到临时文件夹,再插入到其他文件。更新块定义。但是不知如何操作

轻尘 发表于 2023-8-4 11:18:28

让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")
)
)

嘒彼小星 发表于 2023-8-6 17:48:39

设计中心这个功能好使。你这个代码的需求我写不上。设计中心 ctrl+2

轻尘 发表于 2023-8-7 10:12:10

嘒彼小星 发表于 2023-8-6 17:48
设计中心这个功能好使。你这个代码的需求我写不上。设计中心 ctrl+2

需要替换的图块比较多:(

轻尘 发表于 2023-8-11 15:59:43

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

轻尘 发表于 2023-8-11 16:01:56

大神们还有优化的空间吗?

kozmosovia 发表于 2023-8-11 16:46:38

想复杂了,直接把其他图插进来再WBLOCK出去覆盖就行了,同名图块会用本图的定义。

轻尘 发表于 2023-8-14 09:31:38

kozmosovia 发表于 2023-8-11 16:46
想复杂了,直接把其他图插进来再WBLOCK出去覆盖就行了,同名图块会用本图的定义。

好方法:lol
页: [1]
查看完整版本: 有用本图的图块替换其他文件中同名块的插件吗?