基于Python批量运行AutoLISP的实现方案咨询
嘿,针对你想批量在DWG文件上运行AutoLISP的需求,结合你用的AutoCAD MEP 2018和Python 3.5,我给你整理了两种完全不需要第三方软件或C#的可行方案,都是用你手里的工具就能搞定:
方案一:纯AutoLISP实现批量操作
这个方案不需要依赖Python,直接在AutoCAD里就能跑,适合快速实现批量任务。你只需要把下面的批量处理LISP代码和你的业务LISP(就是你要运行的那个带保存的LISP)放在一起,加载到AutoCAD里就行:
(defun c:BatchRunLISP (/ folder dwgFiles dwgFile doc dwgPath) ; 弹出对话框让你选择存放DWG的目标文件夹 (setq folder (getfiled "选择DWG文件夹" "" "" 4)) (if folder (progn ; 遍历文件夹里所有DWG文件(包括子文件夹,最后一个参数1表示递归) (setq dwgFiles (vl-directory-files folder "*.dwg" 1)) (foreach dwgFile dwgFiles ; 拼接完整的文件路径 (setq dwgPath (strcat folder "\\" dwgFile)) ; 通过AutoCAD的COM接口打开DWG文件 (setq doc (vla-open (vla-get-documents (vlax-get-acad-object)) dwgPath)) (if doc (progn ; 这里替换成你要运行的LISP命令/函数名 ; 比如你的业务LISP入口是MyProcess,就写(command "_MyProcess") (command "_YOUR_LISP_FUNCTION_NAME") ; 如果你的业务LISP没有包含保存操作,就取消下面这句的注释 ; (command "_QSAVE") ; 关闭当前DWG文件 (vla-close doc) (princ (strcat "已处理: " dwgPath "\n")) ) (princ (strcat "无法打开文件: " dwgPath "\n")) ) ) (princ "\n批量处理全部完成!") ) (princ "未选择文件夹,操作已取消。") ) (princ) ; 避免返回多余值 )
使用步骤:
- 把这段代码复制到你的业务LISP文件末尾,或者单独存成一个
.lsp文件。 - 在AutoCAD MEP 2018里,输入
APPLOAD命令加载这个文件。 - 输入
BatchRunLISP命令,选择目标文件夹,等着自动处理就行。
注意:AutoCAD MEP 2018原生支持VLISP函数(代码里的
vl-directory-files、vla-*这些),所以不用担心兼容性问题。
方案二:用Python实现批量操作
既然你有Python基础,这个方案会更灵活,比如你可以轻松加日志、复杂的文件过滤逻辑,甚至后台运行AutoCAD。核心是通过Python的win32com.client调用AutoCAD的COM接口,步骤如下:
第一步:安装依赖
因为你用的是Python 3.5,要安装对应版本的pywin32(也就是win32com的依赖)。你可以找兼容Python 3.5的pywin32安装包(比如pywin32-223-cp35-none-win_amd64.whl,根据你的系统是32还是64位选择),用pip install完成安装。
第二步:编写Python代码
import win32com.client import os def batch_process_dwgs(target_folder, lisp_command): # 连接到AutoCAD MEP 2018,版本号21对应2018(2017是20,2019是22) try: acad = win32com.client.Dispatch("AutoCAD.Application.21") except Exception as e: print(f"无法连接到AutoCAD: {str(e)}") return # 设为False可以后台运行,调试时设True方便看操作过程 acad.Visible = True # 遍历目标文件夹里的所有DWG文件(包括子文件夹) for root, dirs, files in os.walk(target_folder): for filename in files: if filename.lower().endswith(".dwg"): dwg_full_path = os.path.join(root, filename) try: # 打开DWG文件 doc = acad.Documents.Open(dwg_full_path) print(f"正在处理: {dwg_full_path}") # 发送LISP命令给AutoCAD,注意要加换行符模拟回车 acad.ActiveDocument.SendCommand(f"{lisp_command}\n") # 如果你的业务LISP没包含保存,取消下面这句注释 # doc.Save() # 关闭文件 doc.Close() except Exception as e: print(f"处理文件失败 {dwg_full_path}: {str(e)}") # 可选:处理完后退出AutoCAD,注释掉就保留AutoCAD打开状态 # acad.Quit() print("\n所有文件处理完成!") # 主程序入口 if __name__ == "__main__": # 替换成你的DWG文件夹路径 DWG_FOLDER = r"C:\Your\Target\DWG\Folder" # 替换成你要运行的LISP命令/函数名 LISP_CMD = "YOUR_LISP_FUNCTION_NAME" batch_process_dwgs(DWG_FOLDER, LISP_CMD)
注意事项:
- 确保AutoCAD MEP 2018没有被其他进程占用,不然可能连接失败。
- 如果后台运行(
Visible=False),要确保你的LISP没有弹出交互对话框,不然会卡住。 - 版本号一定要对应:AutoCAD 2018的COM版本号是21,别写错了。
内容的提问来源于stack exchange,提问作者BIMperson




