当前位置:首页>python>Python-CAD批量打印:仅作为其他自动化流程的一环

Python-CAD批量打印:仅作为其他自动化流程的一环

  • 2026-09-09 14:08:50
Python-CAD批量打印:仅作为其他自动化流程的一环

--------------------

 🙋‍♀️ 本期工具展示

有这么多图需要打印成不同的文件的时候

写了批量打印并链接打word方案更新

--------------------

 背景

市面上有批量打印插件,功能成熟,但问题在于——打印从来不是终点。实际工作流程是:改图 → 打印PDF → 把图纸插入方案文档 → 更新 → 输出新一版PDF。如果打印是孤立的,后续步骤还得手动做。

所以这套工具的核心不是“批量打印”这个功能,而是把CAD打印变成可编程的API,让它可以融入更大的自动化流程。

--------------------

🚀 批量打印的实现细节

2.1 连接CAD

CAD通过COM接口对外暴露编程能力。Python用win32com.client来调用。

import pythoncomimport win32com.clientdef connect_cad():    """连接ZWCAD"""    pythoncom.CoInitialize()    cad = win32com.client.Dispatch("ZWCAD.Application")    cad.Visible = True    return cad
关键点:CoInitialize()必须在每个使用COM的子线程中调用,否则报错“尚未调用CoInitialize”。

2.2 选择图框和文件名

用户的操作流程:先框选图框,再点选文件名文字。一组一组选,右键结束。

def collect_groups(doc):    """收集用户选择的分组"""    groups = []    while True:        # 1. 选择图框(INSERT类型)        sel_frames = doc.SelectionSets.Add("Frames")        sel_frames.SelectOnScreen([0], ["INSERT"])        if sel_frames.Count == 0:            break  # 右键结束        # 2. 选择文件名(TEXT或MTEXT)        sel_text = doc.SelectionSets.Add("Text")        sel_text.SelectOnScreen([0, 0], ["TEXT", "MTEXT"])        # 3. 提取文字作为文件名        text_obj = sel_text.Item(0)        if text_obj.ObjectName == "AcDbText":            raw_name = text_obj.TextString        else:            raw_name = text_obj.Text        # 清理非法字符        import re        filename = re.sub(r'[\\/*?:"<>|]', '', raw_name).strip()        # 4. 记录这一组        groups.append({            'frames': sel_frames,            'filename': f"{filename}.pdf"        })        sel_frames.Delete()        sel_text.Delete()    return groups

2.3 打印配置(重要坑点)

打印的核心是设置布局(Layout)的各项属性。

def print_frame(doc, min_point, max_point, output_path):    """打印单个图框到PDF"""    layout = doc.ActiveLayout    # 选择打印机    layout.ConfigName = "DWG to PDF.pc5"    # 设置纸张大小(这里有个坑)    # AutoCAD: "ISO A3 (420.00 x 297.00 mm)"    # 中望CAD: "ISO A3 (420.00 x 297.00 毫米)"    layout.CanonicalMediaName = "ISO A3 (420.00 x 297.00 毫米)"    layout.PaperUnits = 1  # 1=毫米    # 设置打印范围    min_x, min_y, _ = min_point    max_x, max_y, _ = max_point    layout.SetWindowToPlot(        win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (min_x, min_y, 0)),        win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (max_x, max_y, 0))    )    layout.PlotType = 4  # 窗口打印    layout.CenterPlot = True    # 关闭后台打印(重要!)    doc.SetVariable("BACKGROUNDPLOT", 0)    doc.SetVariable("FILEDIA", 0)    # 执行打印    doc.Plot.PlotToFile(output_path)

两个关键坑:

纸张名称:中望CAD用“毫米”,AutoCAD用“mm”。写错了不会报错,但打印出来永远是Letter尺寸。

后台打印:BACKGROUNDPLOT必须设为0。如果开着后台打印,PlotToFile会立即返回,但实际还没生成PDF,后续合并文件时会找不到。

2.4 合并PDF

每张图纸单独打印成临时PDF,最后用PyPDF2合并成一个文件。

import PyPDF2def merge_pdfs(pdf_list, output_path):    """合并多个PDF"""    writer = PyPDF2.PdfWriter()    for pdf_file in pdf_list:        reader = PyPDF2.PdfReader(pdf_file)        for page in reader.pages:            writer.add_page(page)    with open(output_path, 'wb') as f:        writer.write(f)

--------------------

🙋‍♀️ 作者:leilei

💫 碎碎念学习记录

📅 更新时间:2026年3月

最新文章

随机文章