用Python可以批量打印CAD图纸啦,完整Python代码(上)

283 阅读4分钟

 爆肝数十通宵写出的 Python 神器!批量打印 CAD 图纸效率直飙百倍

一、打工人的救星:Python 自动化批量打印方案

当设计院的图纸堆成山时,手动一张张打开 CAD 打印简直是职场酷刑。最近爆肝写出的 Python 脚本,通过win32com库直连 AutoCAD,实现图框自动识别 + 批量排序 + 一键打印,实测 100 张图纸的处理时间从 2 小时压缩到 1 分钟,效率直接翻 100 倍!

二、核心技术拆解:3 大功能模块实现智能打印

脚本通过三大核心模块实现自动化操作,以下是技术亮点解析:

  1. 数据格式桥梁:类型转换函数

    python

    def vtI2(list):
        """将Python列表转为CAD兼容的16位整型数组"""
        return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, list)
    
    def vtVAR(list):
        """将列表转为CAD可识别的VARIANT数组"""
        return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, list)
    

     

    ▶ 解决 Python 与 AutoCAD 的数据类型兼容问题,为后续操作奠定基础。

  2. 图框智能识别:find_block 核心函数
    该函数通过 6 步实现图框的精准定位与排序:

    • Step1-2:连接 CAD 并创建文档对象

      python

      acad = win32com.client.GetActiveObject(f"AutoCAD.Application.23.1")  # 指定CAD版本
      doc = acad.ActiveDocument
      

      转存失败,建议直接上传图片文件

    • Step3:清理旧选择集并创建新筛选器
      通过FilterTypeFilterData精准筛选指定块名(如"TK-排水A3")的图框。

    • Step4-5:获取图框坐标与缩放比例

      python

      insertion_point = entity.InsertionPoint  # 插入点坐标[x,y,z]
      x_scale = entity.XScaleFactor  # 缩放比例
      frame_width = 420 * x_scale  # 按A3标准计算实际宽度
      

      转存失败,建议直接上传图片文件

    • Step6:智能排序算法
      先按 Y 坐标降序(从上到下),再按 X 坐标升序(从左到右)排列,确保打印顺序符合读图习惯。

三、完整代码示例:图框快速选择模块

以下是实现图框自动识别的核心代码,包含详细注释:

python

import win32com.client
import pythoncom

# 列表转为16位整型数据类型数组
def vtI2(list):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, list)
# 列表转为包含 VARIANT数据类型数组
def vtVAR(list):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, list)

def find_block(CAD_num,block_name):
    # 第一步  创建空列表
    block_information = []

    # 第二步  连接AutoCAD
    acad = win32com.client.GetActiveObject(f"AutoCAD.Application.{CAD_num}")  # 连接指定版本cad
    # acad = win32com.client.GetActiveObject(f"AutoCAD.Application")  # 连接cad
    doc = acad.ActiveDocument
    print(f"已连接到AutoCAD文档:{doc.Name}")

    # 第三步  清理同名旧选择集
    ss_name = "Temp_Selector"
    for ss in doc.SelectionSets:
        if ss.Name == ss_name:
            ss.Delete()
    ss = doc.SelectionSets.Add(ss_name)

    ft = vtI2([0, 2]) # 0=实体类型, 2=块名
    fd = vtVAR(["INSERT", block_name])

    ss.Select(Mode=5, Point1=[], Point2=[], FilterType=ft, FilterData=fd) #选择所有目标块参照
    # p1 = vtFloat([0,0,0])
    # p2 = vtFloat([3000,3000,0])
    # ss.Select(Mode=1, Point1=p1, Point2=p2, FilterType=ft, FilterData=fd) #选择某范围内块参照

    print(f"\n检测到 {ss.Count} 个 {block_name} 块参照")

    # 第五步  获取块参照的插入点坐标、块参照缩放比例信息
    for i in range(ss.Count):
        # 获得块参照信息
        entity = ss[i]
        x_scale = entity.XScaleFactor # 获取块参照的缩放比例
        insertion_point = entity.InsertionPoint # 获取块参照的插入点坐标
        frame_width = 420 * x_scale  # A3标准宽度420mm
        frame_height = 297 * x_scale  # A3标准高度297mm(等比例缩放)
        lower_left = [insertion_point[0], insertion_point[1]]
        upper_right = [lower_left[0] + frame_width,
                       lower_left[1] + frame_height]

        # 添加到列表
        print({i})
        block_information.append({
            'index': i,
            'P1_x': lower_left[0], 'P1_y': lower_left[1],
            'P2_x': upper_right[0], 'P2_y': upper_right[1],
            'x_scale': x_scale
        })

    # 第六步 从左到右,从上到下进行排序,并index重新赋值
    # 先按 'P1_y' 降序排列,再按 'P1_x' 升序排序
    sorted_block_info = sorted(block_information,
                               key=lambda item: (-item['P1_y'], item['P1_x']))
    # 覆盖原始 index 值
    for new_idx, item in enumerate(sorted_block_info):
        item['index'] = new_idx
    return sorted_block_info

block_info = find_block("23.1", "TK-排水A3(页码)")#23.1对应2020版CAD
print(block_info)

转存失败,建议直接上传图片文件

四、效率对比与应用场景

  • 效率提升:手动打印 100 张图纸需 2 小时,脚本批量处理仅需 1 分钟,效率提升 100 倍!
  • 适用场景
    ▶ 设计院批量出图、施工单位图纸归档、制造业图纸批量审核
    ▶ 支持 A3/A4 等标准图框,可通过修改frame_widthframe_height适配特殊尺寸

五、进阶提示

  1. 若 CAD 版本未知,可删除版本号参数(如"23.1"),直接连接默认打开的 CAD
  2. 图框尺寸可根据实际标准修改(如 A4 图框宽度改为 297mm)
  3. 后续可扩展自动打印模块,实现 "识别 - 排序 - 打印" 全流程自动化
  4. CAD内部版本号转存失败,建议直接上传图片文件​编辑