明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2365|回复: 9

[讨论] 不开图-文件夹批量替换字,看能不能再优化!

  [复制链接]
发表于 2015-8-7 16:35:53 | 显示全部楼层 |阅读模式
本帖最后由 spp_wall 于 2015-8-7 16:43 编辑

    通过论坛的整合了个批量替换字的,看代码有没问题
   现在是要自己改lisp里面的文字才能运行,看能不能优化下,在对话框上输入要替换的文字,因为毕竟每次修改代码比较麻烦!
;;; 说明:本程序批量将同一目录下多张dwg图纸目录的自动生成。使用前必须将本程
;;;       序加载到cad的启动组中。pccad用,其它图纸自己修改
;;;
;;; 使用:打开目录下任何一张图纸,命令行输入tzml,回车,弹出对话框,按“确
;;;       定”按钮即可。
;;;
;;; 作者:langjs     qq:59509100    命令:tzml      日期:2011年3月26日
;;; ======================================================================
;;; 主程序
;;; 编程思路:读取当前打开的图纸目录,得到当前目录下的所有图纸,生成批量处理scr脚本,执行脚本依次打开图纸读取标题栏属性块内的图
;;; 纸名称和图纸代号等信息存于临时txt文本内,最后读取txt内容并画出图纸目录。
(defun c:kx-pgdhz (/ bb dcl_pt file_list index_value path)
  (setvar "cmdecho" 0)
       
  (setq index_value (load_dialog "pgdhz.dcl")) ; 显示对话框plml.dcl
  (new_dialog "pgdhz" index_value "" dcl_pt)
  (setq path (getvar "DWGPREFIX"))     ; 读取当前图纸路径
  (set_tile "e01" path)                       ; 在对话框中显示路径
  (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  (show_list "e02" file_list)               ; 对话框中显示所有图纸的列表
  (action_tile "e03" " (setq dcl_pt (done_dialog 1))  ") ; 按钮执行生成.scr脚本子程序
  (setq bb (start_dialog))
  (if (= bb 1)
    (tzml01)                               ; 这个就是生成.scr脚本子程序
  )
  (princ)
)
;;; 显示对话框内列表内容
(defun show_list (key newlist)
  (start_list key)
  (mapcar
    'add_list
    newlist
  )
  (end_list)
)
;;; 生成.scr脚本子程序
(defun tzml01 (/ file file_list len lin m path)
  (setvar "cmdecho" 0)                       ; 关闭命令响应
  (setvar "filedia" 0)                       ; filedia 设置为 1,为脚本运行设置环境
  (vl-load-com)
  (setq path (getvar "DWGPREFIX"))     ; 读取当前图纸路径
  (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  (setq len (length file_list))
  (setq m 0)
  (setq file (open "c:\\批量改单行字.TXT" "w")) ; 生成一个临时txt用于存储图纸里边的信息
  (close file)
  (setq file (open "c:\\WINDOWS\\temp\\SCR.txt" "w")) ; 生成一个txt用来做脚本
  (write-line "qsave close" file)      ; 脚本里的内容:关闭当前图纸
  (repeat (- len 1)
    (setq lin (strcat "open " "\"" (strcat path (nth m file_list)) "\"" " kx-pl-gdhz" " qsave" " close")) ; 脚本里的内容:打开图纸执行KX-ml-kspp程序?
                                       ; 该图纸信息后关闭
    (write-line lin file)
    (setq m (+ m 1))
  )
  (setq lin (strcat "open " "\"" (strcat path (nth m file_list)) "\"" " kx-pl-gdhz" " qsave" " close"))
  (write-line lin file)
  ;(setq lin "new ")                       ; 脚本里的内容:新建一个空白图纸
  ;(write-line lin file)
  ;(write-line "ML_OK" file)               ; 脚本里的内容:执行ml_ok程序绘制图纸目录以及内容
  (close file)
  (vl-file-delete "C:/WINDOWS/temp/SCR.scr") ; 如果该目录下有早期留下的脚本就删除掉防止崇明覆盖不了
  (vl-file-rename "C:/WINDOWS/temp/SCR.txt" "C:/WINDOWS/temp/SCR.scr") ; 将刚才建的txt改为脚本
  (command "script" "C:/WINDOWS/temp/SCR.scr") ; 运行脚本用open依次打开图纸执行ml程序读取该图纸信息后关闭
  (setvar "filedia" 1)
  (setvar "cmdecho" 0)
  (princ)
)
;;; 读取该图纸信息子程序
(vl-load-com)

(defun strsplit        (string delimited / pos lst)
  (while (setq pos (vl-string-search delimited string))
    (setq lst         (cons (substr string 1 pos) lst)
                        string (substr string (+ pos 1 (strlen delimited)))
    )
  )
  (reverse (cons string lst))
)

(defun parse-filename ()
  (strsplit (vl-string-trim " \r\t\n" (vl-filename-base (getvar "DWGNAME"))) " ")
)



;;; 文本批量替换根据cabinsummer程序整理。
(defun c:kx-pl-gdhz (/ ct0 ct1 ct2 edata etext newch newtext oldch readch schct ssl sstxt subln txtln)
  (setvar "cmdecho" 0)
  (setq oldch "改字前"                   ; 要查找的文本内容,自己修改
        newch "改字后"               ; 要替换的文本内容,自己修改

  )
  (if (and
        (/= "" oldch)
        (/= oldch newch)
        (setq sstxt (ssget "x" '((0 . "*TEXT"))))
      )
    (progn
      (setq ssl (sslength sstxt)
            ct0 0
            ct1 0
            ct2 0
            subln (strlen oldch)
      )
      (while (< ct0 ssl)
        (setq edata (entget (ssname sstxt ct0))
              etext (cdr (assoc 1 edata))
              txtln (strlen etext)
              schct 1
              newtext ""
        )
        (while (<= schct txtln)
          (setq newtext (strcat newtext (if (= (setq readch (substr etext schct subln))
                                               oldch
                                            )
                                          (setq ct1 (1+ ct1)
                                                schct (+ schct subln)
                                                newch newch
                                          )
                                          (progn
                                            (setq schct (1+ schct))
                                            (substr readch 1 1)
                                          )
                                        )
                        )
          )
        )
        (if (/= etext newtext)
          (progn
            (entmod (subst
                      (cons 1 newtext)
                      (assoc 1 edata)
                      edata
                    )
            )
            (setq ct2 (1+ ct2))
          )
        )
        (setq ct0 (1+ ct0))
      )
    )
  )
  (princ)
)
  (princ)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-8-8 12:28:16 | 显示全部楼层
这个好像不错!!!怎么改?
发表于 2015-8-8 19:39:20 | 显示全部楼层
  1. ;;;            《图纸目录》v1.2
  2. ;;; ======================================================================
  3. ;;; 说明:本程序批量将同一目录下多张dwg图纸目录的自动生成。使用前必须将本程
  4. ;;;       序加载到cad的启动组中。pccad用,其它图纸自己修改
  5. ;;;
  6. ;;; 使用:打开目录下任何一张图纸,命令行输入tzml,回车,弹出对话框,按“确
  7. ;;;       定”按钮即可。
  8. ;;;
  9. ;;; 作者:langjs     qq:59509100    命令:tzml      日期:2011年3月26日
  10. ;;; ======================================================================
  11. ;;; 主程序
  12. ;;; 编程思路:读取当前打开的图纸目录,得到当前目录下的所有图纸,生成批量处理
  13. ;;;           scr脚本,执行脚本依次打开图纸读取标题栏属性块内的图纸名称和图
  14. ;;;           纸代号等信息存于临时txt文本内,最后读取txt内容并画出图纸目录。
  15. (defun c:kx-pgdhz (/ bb dcl_pt file_list index_value path)
  16. (setvar "CMDECHO" 0)
  17. (if (> (setq dcl_id (load_dialog "pgdhz.dcl")) 0) (progn ; 加载对话框plml.dcl
  18.   (if (new_dialog "pgdhz" dcl_id) (progn
  19.    (setq path (getvar "DWGPREFIX")) ; 读取当前图纸路径
  20.    (set_tile "e01" path)                         ; 在对话框中显示路径
  21.    (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  22.    (show_list "e02" file_list)            ; 对话框中显示所有图纸的列表
  23.    (action_tile "accept" "(readata)(done_dialog 1)") ; 按钮执行生成.scr脚本子程序
  24.    (action_tile "cancel" "(done_dialog 0)")
  25.    (setq bb (start_dialog))         ; 显示对话框plml.dcl
  26.   )
  27.    (princ "\n无法显示对话框!")
  28.   )
  29.   (unload_dialog dcl_id)
  30. )
  31.   (princ "\n无法加载对话框!")
  32. )
  33. (if (= bb 1) (tzml01))                               ; 这个就是生成.scr脚本子程序
  34. (princ)
  35. )
  36. (defun readata ()
  37. (setq oldch (get_tile "e03"))
  38. (setq newch (get_tile "e04"))
  39. )
  40. ;;; 显示对话框内列表内容
  41. (defun show_list (key newlist)
  42.   (start_list key)
  43.   (mapcar 'add_list newlist)
  44.   (end_list)
  45. )
  46. ;;; 生成.scr脚本子程序
  47. (defun tzml01 (/ file file_list len lin m path)
  48.   (setvar "cmdecho" 0)                       ; 关闭命令响应
  49.   (setvar "filedia" 0)                       ; filedia 设置为 1,为脚本运行设置环境
  50.   (vl-load-com)
  51.   (setq path (getvar "DWGPREFIX"))     ; 读取当前图纸路径
  52.   (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  53.   (setq len (length file_list))
  54.   (setq m 0)
  55.   (setq file (open "c:\\批量改单行字.TXT" "w")) ; 生成一个临时txt用于存储图纸里边的信息
  56.   (close file)
  57.   (setq file (open "c:\\WINDOWS\\temp\\SCR.txt" "w")) ; 生成一个txt用来做脚本
  58.   (write-line "qsave close" file)      ; 脚本里的内容:关闭当前图纸
  59.   (repeat (- len 1)
  60.     (setq lin (strcat "open "" (strcat path (nth m file_list)) "" kx-pl-gdhz qsave close")) ; 脚本里的内容:打开图纸执行KX-ml-kspp程序?
  61.                                        ; 该图纸信息后关闭
  62.     (write-line lin file)
  63.     (setq m (+ m 1))
  64.   )
  65.   (setq lin (strcat "open "" (strcat path (nth m file_list)) "" kx-pl-gdhz qsave close"))
  66.   (write-line lin file)
  67.   ;(setq lin "new ")                       ; 脚本里的内容:新建一个空白图纸
  68.   ;(write-line lin file)
  69.   ;(write-line "ML_OK" file)               ; 脚本里的内容:执行ml_ok程序绘制图纸目录以及内容
  70.   (close file)
  71.   (vl-file-delete "C:/WINDOWS/temp/SCR.scr") ; 如果该目录下有早期留下的脚本就删除掉防止崇明覆盖不了
  72.   (vl-file-rename "C:/WINDOWS/temp/SCR.txt" "C:/WINDOWS/temp/SCR.scr") ; 将刚才建的txt改为脚本
  73.   (command "script" "C:/WINDOWS/temp/SCR.scr") ; 运行脚本用open依次打开图纸执行ml程序读取该图纸信息后关闭
  74.   (setvar "filedia" 1)
  75.   (setvar "cmdecho" 0)
  76.   (princ)
  77. )
  78. ;;; 读取该图纸信息子程序
  79. (vl-load-com)
  80. (defun strsplit (string delimited / pos lst)
  81. (while (setq pos (vl-string-search delimited string))
  82.    (setq lst (cons (substr string 1 pos) lst)
  83.                         string (substr string (+ pos 1 (strlen delimited)))
  84.    )
  85. )
  86. (reverse (cons string lst))
  87. )
  88. (defun parse-filename ()
  89.   (strsplit (vl-string-trim " \r\t\n" (vl-filename-base (getvar "DWGNAME"))) " ")
  90. )
  91. ;;; 文本批量替换根据cabinsummer程序整理。
  92. (defun c:kx-pl-gdhz (/ ct0 ct1 ct2 edata etext newch newtext oldch readch schct ssl sstxt subln txtln)
  93. (setvar "cmdecho" 0)
  94. ; (setq oldch "改字前" ; 要查找的文本内容,自己修改
  95. ;       newch "改字后" ; 要替换的文本内容,自己修改
  96. ; )
  97. (if (and (/= "" oldch)
  98.           (/= oldch newch)
  99.           (setq sstxt (ssget "x" '((0 . "*TEXT"))))) (progn
  100.   (setq ssl (sslength sstxt)
  101.         ct0 0
  102.         subln (strlen oldch))
  103.   (repeat (setq i (sslength sstxt))
  104.    (setq edata (entget (ssname sstxt (setq i (1- i))))
  105.          etext (cdr (assoc 1 edata)))
  106.    (if (wcmatch etext (strcat "*" oldch "*")) (progn
  107.     (setq newtext (vl-string-translate oldch newch etext))
  108.     (entmod (subst (cons 1 newtext) (assoc 1 edata) edata))
  109.     (setq ct0 (1+ ct0))
  110.    ))
  111.   )
  112. ))
  113. (princ)
  114. )
  115. (princ)
  1. pgdhz:dialog{
  2. label="original:langjs  REVISE:KX";
  3. :column{
  4.   spacer_1;
  5.   :text{label="        《KX-批量改单行+属性文字(自己改代码)》 ";}
  6.   spacer_1;
  7.   :row{
  8.    spacer_1;
  9.    :edit_box{label="路径: ";key="e01";edit_width=50;}
  10.   }
  11.   spacer_1;
  12.   :list_box{key="e02";width=52;height=10;}
  13.   :boxed_row{
  14.    label="替换内容";
  15.    :edit_box{label="原内容";key="e03";edit_width=20;}
  16.    :edit_box{label="替换为";key="e04";edit_width=20;}
  17.   }
  18.   spacer_1;
  19.   :row{
  20.    spacer_1;
  21.    spacer_1;
  22.    spacer_1;
  23.    spacer_1;
  24.    spacer_1;
  25.    spacer_1;
  26.    :button{label="确定";key="accept";is_default=true;}
  27.    cancel_button;
  28.    spacer_1;
  29.    spacer_1;
  30.    spacer_1;
  31.    spacer_1;
  32.    spacer_1;
  33.    spacer_1;
  34.   }
  35. }
  36. }
 楼主| 发表于 2015-8-11 11:58:26 | 显示全部楼层
ZZXXQQ 发表于 2015-8-8 19:39

谢谢 ==看看
 楼主| 发表于 2015-8-12 16:16:38 | 显示全部楼层
ZZXXQQ 发表于 2015-8-8 19:39

对话框出来的,但是好像程序没有执行 没有替换文字

有空 帮忙看看 谢谢
发表于 2024-7-15 23:13:40 | 显示全部楼层
本帖最后由 h2295 于 2024-7-15 23:14 编辑

修改的代码,可以正常替换文字,但是还是不能实现不打开图纸替换,而是自动打开每张图进行替换后保存关闭,望大佬继续更新
  1. ;;;            《图纸目录》v1.3
  2. ;;; ======================================================================
  3. ;;; 说明:本程序批量将同一目录下多张dwg图纸目录的自动生成。使用前必须将本程
  4. ;;;       序加载到cad的启动组中。pccad用,其它图纸自己修改
  5. ;;;
  6. ;;; 使用:打开目录下任何一张图纸,命令行输入tzml,回车,弹出对话框,按“确
  7. ;;;       定”按钮即可。
  8. ;;;
  9. ;;; 作者:langjs     qq:59509100    命令:tzml      日期:2011年3月26日
  10. ;;; ======================================================================
  11. ;;; 主程序
  12. ;;; 编程思路:读取当前打开的图纸目录,得到当前目录下的所有图纸,生成批量处理
  13. ;;;           scr脚本,执行脚本依次打开图纸读取标题栏属性块内的图纸名称和图
  14. ;;;           纸代号等信息存于临时txt文本内,最后读取txt内容并画出图纸目录。
  15. (defun c:kx-pgdhz (/ bb dcl_pt file_list index_value path)
  16. (setvar "CMDECHO" 0)
  17. (if (> (setq dcl_id (load_dialog "D:\\work\\zbzh\\pgdhz.dcl")) 0) (progn ; 加载对话框plml.dcl
  18.   (if (new_dialog "pgdhz" dcl_id) (progn
  19.    (setq path (getvar "DWGPREFIX")) ; 读取当前图纸路径
  20.    (set_tile "e01" path)                         ; 在对话框中显示路径
  21.    (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  22.    (show_list "e02" file_list)            ; 对话框中显示所有图纸的列表

  23.    (action_tile "accept" "(readata) (done_dialog 1)"); 按钮执行生成.scr脚本子程序
  24.    (action_tile "cancel" "(done_dialog 0)")
  25.     (princ oldch)
  26.     (princ newch)
  27.    (setq bb (start_dialog))         ; 显示对话框plml.dcl
  28.   )
  29.    (princ "\n无法显示对话框!")
  30.   )
  31.   (unload_dialog dcl_id)
  32. )
  33.   (princ "\n无法加载对话框!")
  34. )
  35. (if (= bb 1) (tzml01))                               ; 这个就是生成.scr脚本子程序
  36. (princ)
  37. )
  38. (defun readata ()
  39. (setq oldch (get_tile "e03"))
  40. (setq newch (get_tile "e04"))
  41. )
  42. ;;; 显示对话框内列表内容
  43. (defun show_list (key newlist)
  44.   (start_list key)
  45.   (mapcar 'add_list newlist)
  46.   (end_list)
  47. )
  48. ;;; 生成.scr脚本子程序
  49. (defun tzml01 (/ file file_list len lin m path)
  50.   (setvar "cmdecho" 0)                       ; 关闭命令响应
  51.   (setvar "filedia" 0)                       ; filedia 设置为 1,为脚本运行设置环境
  52.   (vl-load-com)
  53.   (setq path (getvar "DWGPREFIX"))     ; 读取当前图纸路径
  54.   (setq file_list (vl-directory-files path "*.dwg")) ; 得到文件夹内所有图纸的列表
  55.   (setq len (length file_list))
  56.   (setq m 0)
  57.   (setq file (open "c:\\WINDOWS\\temp\\批量改单行字.TXT" "w")) ; 生成一个临时txt用于存储图纸里边的信息
  58.   (write-line oldch file)
  59.   (write-line newch file)
  60.   (close file)
  61.   (setq file (open "c:\\WINDOWS\\temp\\SCR.txt" "w")) ; 生成一个txt用来做脚本
  62.   (write-line "qsave close" file)      ; 脚本里的内容:关闭当前图纸
  63.   (repeat (- len 1)
  64.     ; (setq lin (strcat "open "" (strcat path (nth m file_list)) "" kx-pl-gdhz qsave close")) ; 脚本里的内容:打开图纸执行KX-ml-kspp程序?
  65.     (setq lin (strcat "open " """ (strcat path (nth m file_list)) """ " kx-pl-gdhz" " qsave" " close"))
  66.                                        ; 该图纸信息后关闭
  67.     (write-line lin file)
  68.     (setq m (+ m 1))
  69.   )
  70.   ; (setq lin (strcat "open "" (strcat path (nth m file_list)) "" kx-pl-gdhz qsave close"))
  71.    (setq lin (strcat "open " """ (strcat path (nth m file_list)) """ " kx-pl-gdhz" " qsave" " close"))
  72.   (write-line lin file)
  73.   ;(setq lin "new ")                       ; 脚本里的内容:新建一个空白图纸
  74.   ;(write-line lin file)
  75.   ;(write-line "ML_OK" file)               ; 脚本里的内容:执行ml_ok程序绘制图纸目录以及内容
  76.   (close file)
  77.   (vl-file-delete "c:\\WINDOWS\\temp\\SCR.scr") ; 如果该目录下有早期留下的脚本就删除掉防止崇明覆盖不了
  78.   (vl-file-rename "c:\\WINDOWS\\temp\\SCR.txt" "c:\\WINDOWS\\temp\\SCR.scr") ; 将刚才建的txt改为脚本
  79.   (command "script" "c:\\WINDOWS\\temp\\SCR.scr") ; 运行脚本用open依次打开图纸执行ml程序读取该图纸信息后关闭
  80.   (setvar "filedia" 1)
  81.   (setvar "cmdecho" 0)
  82.   (princ)
  83. )
  84. ;;; 读取该图纸信息子程序
  85. (vl-load-com)
  86. (defun strsplit (string delimited / pos lst)
  87. (while (setq pos (vl-string-search delimited string))
  88.    (setq lst (cons (substr string 1 pos) lst)
  89.                         string (substr string (+ pos 1 (strlen delimited)))
  90.    )
  91. )
  92. (reverse (cons string lst))
  93. )
  94. (defun parse-filename ()
  95.   (strsplit (vl-string-trim " \r\t\n" (vl-filename-base (getvar "DWGNAME"))) " ")
  96. )
  97. ;;; 文本批量替换根据cabinsummer程序整理。
  98. (defun c:kx-pl-gdhz (/ ct0 ct1 ct2 edata etext newch newtext oldch readch schct ssl sstxt subln txtln)
  99. (setvar "cmdecho" 0)
  100. (setq file (open "c:\\WINDOWS\\temp\\批量改单行字.TXT" "r"))
  101. (if file
  102.     (progn
  103. (setq oldch (read-line file) ; 要查找的文本内容,自己修改
  104.        newch (read-line file) ; 要替换的文本内容,自己修改
  105.   )))

  106. (if (and (/= "" oldch)
  107.           (/= oldch newch)
  108.           (setq sstxt (ssget "x" '((0 . "*TEXT"))))) (progn
  109.   ; (princ oldch)
  110.   ; (princ newch)
  111.   (setq ssl (sslength sstxt)
  112.         ct0 0
  113.         subln (strlen oldch))
  114.   (repeat (setq i (sslength sstxt))
  115.    (setq edata (entget (ssname sstxt (setq i (1- i))))
  116.          etext (cdr (assoc 1 edata)))
  117.    
  118.    (if (wcmatch etext (strcat "*" oldch "*")) (progn
  119.    
  120.     (princ oldch)
  121.     (princ newch)
  122.     (princ etext)
  123.     (setq newtext (vl-string-subst newch oldch etext))                                                
  124.     ; (setq newtext (vl-string-translate oldch newch etext))
  125.     (princ newtext)
  126.     (entmod (subst (cons 1 newtext) (assoc 1 edata) edata))
  127.     (setq ct0 (1+ ct0))
  128.    ))
  129.   )
  130. ))
  131. (princ)
  132. )
  133. (princ)


发表于 2024-10-24 01:42:24 | 显示全部楼层
h2295 发表于 2024-7-15 23:13
修改的代码,可以正常替换文字,但是还是不能实现不打开图纸替换,而是自动打开每张图进行替换后保存关闭, ...

感谢大侠分享,可惜不明白我实现不了
发表于 2024-10-24 06:20:18 | 显示全部楼层
厉害!感谢高手!
发表于 2024-10-28 23:27:54 | 显示全部楼层
'iMini迷你工具'有这个完美实施的功能!QQ群Mini迷你工具三482025963
发表于 2024-11-4 09:18:07 | 显示全部楼层
感谢大侠分享,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-21 01:32 , Processed in 0.198425 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表