明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6004|回复: 10

[灌水][原创]利用SCR和LSP实现目录下所有DWG文件批处理

    [复制链接]
发表于 2003-11-11 04:16:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-2-1 20:39:51 编辑

利用SCR和LSP实现目录下所有DWG文件批处理
  1. ;;;==================================================================
  2. ;;;生成脚本文件
  3. ;;;11/09/03  23:32:16创建
  4. ;;;12/10/03  4:07 上午修改
  5. ;;;陈钊
  6. ;;;FILENAME_SCR  生成的SCR文件名
  7. ;;;DIR    要处理的目录,指向要操作的目录
  8. ;;;FILES_TYPE  文件类型,文件通配符,选定目录下的文件类型进行操作
  9. ;;;SAVE_AX_YN  当前是否要存盘,逻辑变量
  10. ;;;SAVE_YN  过种中是否要存盘,逻辑变量
  11. ;;;PROGRAM_FILE  要加载的程序,可以是空的
  12. ;;;COMMAND_LIST  要加裁的命令
  13. ;;;RUN_YN  是否马上执行
  14. ;;;调用    (MAKE_SCR "E:/TEMP" "*.DWG" "INSERT.SCR" T(SAVE_YN) "E:/BAK.LSP" (C:BBB) T(RUN_YN))
  15. (DEFUN make_scr (dir files_type filename_scr save_ax_yn save_yn program_file command_list run_yn / fp_scr)
  16.        ;;检查AutoCAD 版本
  17.        (IF (/= "15.05s (LMS Tech)" (GETVAR "ACADVER"))
  18.                (*error* "本程序要使用到AutoCAD Map 2000i的功能,请使用AutoCAD Map 2000i处理。")
  19.        )
  20.        (VL-LOAD-COM)
  21.        ;;判断目录是否存在
  22.        (IF (VL-FILE-DIRECTORY-P dir)
  23.                (PROGN ;;目录名,加载程序名,运行命令名中的\全部转为/
  24.                              (SETQ dir (VL-STRING-TRANSLATE "\" "/" dir))
  25.                              (IF program_file
  26.                                      (IF (FINDFILE program_file)
  27.                                              (SETQ program_file (VL-STRING-TRANSLATE "\" "/" (FINDFILE program_file)))
  28.                                              (*error* (STRCAT "当前路径下找不到文件<" program_file ">."))
  29.                                      )
  30.                              )
  31.                              (SETQ command_list (VL-STRING-TRANSLATE "\" "/" command_list))
  32.                              (SETQ filename_scr (VL-STRING-TRANSLATE "\" "/" filename_scr))
  33.                              (IF (/= "/" (SUBSTR dir (STRLEN dir)))
  34.                                      (SETQ dir (STRCAT dir "/"))
  35.                              )                                                                   ;目录名最后必须以/结束
  36.                              ;;打开要生成的脚本文件
  37.                              (WHILE (NOT (SETQ fp_scr (OPEN filename_scr "W")))
  38.                                      (ALERT (STRCAT "不能打开文件<" filename_scr ">。"))
  39.                              )
  40.                              ;;处理当前文件
  41.                              (IF save_ax_yn
  42.                                      (WRITE-LINE "(command "qsave")" fp_scr)
  43.                              )
  44.                              (IF (FINDFILE "d:/bak.dwg")
  45.                                      (WRITE-LINE "(command "saveas" "r14" "d:/bak.dwg" "y")" fp_scr)
  46.                                      (WRITE-LINE "(command "saveas" "r14" "d:/bak.dwg")" fp_scr)
  47.                              )
  48.                              ;;检索选择目录下的文件
  49.                              (PRINC (STRCAT "\n\t在目录<" dir ">下的<" files_type ">文件有:"))
  50.                              (PRINC "\n\t------------------------------")
  51.                              (FOREACH filename (VL-DIRECTORY-FILES dir files_type 1)
  52.                                      (PRINC (STRCAT "\n\t" filename))
  53.                                      (WRITE-LINE "(COMMAND "ZOOM" "E")" fp_scr)
  54.                                      (WRITE-LINE (STRCAT "(COMMAND "OPEN" ""
  55.                                                                              (IF save_yn
  56.                                                                                      "N"
  57.                                                                                      "Y"
  58.                                                                              )
  59.                                                                              "" ""
  60.                                                                              dir
  61.                                                                              filename
  62.                                                                              "")"
  63.                                                              )
  64.                                                              fp_scr
  65.                                      )
  66.                                      (IF (AND (= 'str (TYPE program_file)) (< 0 (STRLEN program_file)))
  67.                                              (WRITE-LINE (STRCAT "(LOAD "" program_file "")") fp_scr)
  68.                                      )
  69.                                      (IF (AND (= 'str (TYPE command_list)) (< 0 (STRLEN command_list)))
  70.                                              (WRITE-LINE command_list fp_scr)
  71.                                      )
  72.                              )
  73.                              (PRINC "\n\t------------------------------")
  74.                              (IF save_yn
  75.                                      (WRITE-LINE "QSAVE" fp_scr)
  76.                              )
  77.                              (CLOSE fp_scr)
  78.                              (PRINC (STRCAT "\n\t已经输出脚本文件到\n\t<" filename_scr ">."))
  79.                              ;;是否要执行
  80.                              (IF run_yn
  81.                                      (PROGN (ALERT "\n\t确定后开始执行脚本...") (COMMAND "SCRIPT" filename_scr))
  82.                              )
  83.                )
  84.                (ALERT (STRCAT "目录<" dir ">不存在。"))
  85.        )
  86.        (PRINC)
  87. )
  88. ;;;==================================================================
  89. ;;;make_scr调用
  90. (DEFUN c:make_scr_file (/ command_string filename_lsp filename_scr file_types path shfolder)
  91.        (WHILE (NOT (SETQ shfolder (VLAX-INVOKE-METHOD (VLAX-CREATE-OBJECT "Shell.Application")
  92.                                                                                                      'browseforfolder
  93.                                                                                                      0
  94.                                                                                                      "选择要插入的目录:"
  95.                                                                                                      1
  96.                                                              )
  97.                                )
  98.                      )
  99.        )
  100.        (SETQ path (VLAX-GET-PROPERTY (VLAX-GET-PROPERTY shfolder 'self) 'path))
  101.        (IF (AND (/= "\" (SUBSTR path (STRLEN path))) (/= "/" (SUBSTR path (STRLEN path))))
  102.                (SETQ path (STRCAT path "/"))
  103.        )
  104.        ;;文件类型
  105.        (IF (= "" (SETQ file_types (GETSTRING "\n\t输入文件类型 <*.DWG>:")))
  106.                (SETQ file_types "*.DWG")
  107.        )
  108.        ;;SCR文件名
  109.        (IF (= "" (SETQ filename_scr (GETSTRING 1 (STRCAT "\n\t输入要生成的脚本文件名 <" path "SCR.SCR" ">:"))))
  110.                (SETQ filename_scr (STRCAT path "SCR.SCR"))
  111.        )
  112.        ;;LSP文件名
  113.        (SETQ filename_lsp (GETFILED "选择脚本要加载的程序:" (GETVAR "MENUNAME") "LSP" 0))
  114.        ;;执行的命令
  115.        (WHILE (= "" (SETQ command_string (GETSTRING 1 "\n\t输入要运行的命令行:"))))
  116.        ;;处理文件
  117.        (make_scr path
  118.                            file_types
  119.                            filename_scr
  120.                            (PROGN (INITGET "Yes No") (= "Yes" (GETKWORD "\n\t当前文件是否存盘? <No>:")))
  121.                            (PROGN (INITGET "Yes No") (= "Yes" (GETKWORD "\n\t脚本运行过程中打开文件是否存盘? <No>:")))
  122.                            filename_lsp
  123.                            command_string
  124.                            (PROGN (INITGET "Yes No") (= "Yes" (GETKWORD "\n\t是否马上执行? <No>:"))) ;马上执行
  125.        )
  126. )
  127. ;;;==================================================================
  128. (PRINC)


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-6-20 00:30:33 | 显示全部楼层
我也一直在用这种方法对某目录下的所有文件进行批量处理,,,,根据这几年的使用心得
有一个注意事项想跟大家共享交流一下

1. 执行完一个dwg文件,要转到  open   第二个文件的时候,,比较麻烦的问题是 acad 总是询问如何存盘的问题。我采用的解决方法是让文件 saveas 为某个特定的临时文件(先查找是否存在,有则覆盖)
2. 以上问题,2004版本以上比较稳定好用,,acad2002则不稳定问题比较多,,至今没找到原因。
回复 支持 1 反对 0

使用道具 举报

发表于 2003-11-11 16:07:00 | 显示全部楼层
大俠把用處寫出來嘛. 不然大家不是很明白你的意思了.
 楼主| 发表于 2003-11-16 21:54:00 | 显示全部楼层
要对同一目录下所有的图幅运行同一程序。

以前我的做法是写一个SCR,文件名用DOS命令DIR *.DWG/S/B >A.SCR 来获得,然后再修改它,插入(LOAD "程序"),再运行程序。

以上程序就是实现:
将选择文件所在目录下的所有DWG文件打开,并运行指定程序。
发表于 2003-11-29 11:41:00 | 显示全部楼层
正是我所需
发表于 2003-11-29 15:16:00 | 显示全部楼层
可以实现多文档相同的操作了。
发表于 2003-12-1 08:41:00 | 显示全部楼层
能在程序里用command命令吗?
发表于 2003-12-1 10:24:00 | 显示全部楼层
好东西鲜花一朵
 楼主| 发表于 2004-2-10 02:03:00 | 显示全部楼层
  1. (IF (NULL findfiles_in_dir)
  2.        (LOAD "findfiles_in_dir")
  3. )
  4. ;;;find_dir  搜索目录
  5. ;;;file_type  文件匹配符
  6. ;;;find_subdir  是否搜索子目录
  7. ;;;file_scr  脚本文件名
  8. ;;;commands  运行程序
  9. ;;;save_yn  是否保存文件
  10. ;;;run_yn  是否马上运行程序
  11. ;;;(make_scr_for_dir "E:/cz/2-03" "*.DWG" T "e:/scr.scr" "regen" nil nil)(DEFUN make_scr_for_dir (find_dir file_type find_subdir file_scr commands save_yn run_yn / files fp_scr)
  12.        ;;判断目录是否存在
  13.        (IF (VL-FILE-DIRECTORY-P find_dir)
  14.                (IF (SETQ files (findfiles_in_dir find_dir file_type find_subdir))
  15.                        (PROGN
  16.                                ;;打开要生成的脚本文件
  17.                                (IF (NOT (SETQ fp_scr (OPEN file_scr "W")))
  18.                                        (*error* (STRCAT "不能打开文件<" file_scr ">。"))
  19.                                )
  20.                                ;;生成脚本内容
  21.                                (PRINC (STRCAT "\n在目录<" find_dir ">下的<" file_type ">文件有:"))
  22.                                (PRINC "\n------------------------------")
  23.                                (FOREACH filename files
  24.                                        (PRINC (STRCAT "\n" filename))
  25.                                        (WRITE-LINE "ZOOM\nE" fp_scr) ;全屏
  26.                                        (IF save_yn
  27.                                                (WRITE-LINE (STRCAT "OPEN\nN\n" filename) fp_scr)
  28.                                                (WRITE-LINE (STRCAT "OPEN\nY\n" filename) fp_scr)
  29.                                        )                                                         ;打开文件
  30.                                        (WRITE-LINE commands fp_scr)   ;运行命令
  31.                                )
  32.                                (PRINC "\n------------------------------")
  33.                                (IF save_yn
  34.                                        (WRITE-LINE "QSAVE" fp_scr)
  35.                                )
  36.                                (CLOSE fp_scr)
  37.                                (PRINC (STRCAT "\n已经输出脚本文件到\n<" file_scr ">。"))
  38.                                ;;是否要执行
  39.                                (IF run_yn
  40.                                        (PROGN (ALERT "\n确定后开始执行脚本...") (COMMAND "SCRIPT" file_scr))
  41.                                )
  42.                        )
  43.                        (ALERT (STRCAT "目录<" find_dir ">不存在匹配<" file_type ">的文件。"))
  44.                )
  45.                (ALERT (STRCAT "目录<" find_dir ">不存在。"))
  46.        )
  47.        (PRINC)
  48. )
复制代码
函数findfiles_in_dir定义
发表于 2004-2-11 00:33:00 | 显示全部楼层
多谢!送你鲜花!
发表于 2013-6-19 16:37:45 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-6 14:33 , Processed in 0.206981 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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