You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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) ; 避免返回多余值
)

使用步骤:

  1. 把这段代码复制到你的业务LISP文件末尾,或者单独存成一个.lsp文件。
  2. 在AutoCAD MEP 2018里,输入APPLOAD命令加载这个文件。
  3. 输入BatchRunLISP命令,选择目标文件夹,等着自动处理就行。

注意:AutoCAD MEP 2018原生支持VLISP函数(代码里的vl-directory-filesvla-*这些),所以不用担心兼容性问题。

方案二:用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

火山引擎 最新活动