Siemens NX(UG)Python 开发 – 图纸打印(研究中)

最近更新于 2025-11-06 21:59

环境

  • Windows 11 25H2
  • NX 2506
  • 内置 Python 3.12.8

实现

算是半成品,还没研究通透,不知道为啥设置的打印纸张大小和方向在实际打印中无效

import NXOpen
from NXOpen.Drawings import DraftingDrawingSheet

def getPrintFormatAndOrientation(sheet: DraftingDrawingSheet) -> tuple[NXOpen.PrintBuilder.PaperSize, NXOpen.PrintBuilder.OrientationOption]:
    """
    根据图纸尺寸判断打印所需的纸张大小和方向

    Args:
        sheet (DraftingDrawingSheet): 图纸对象

    Returns:
        str: tuple(PaperSize, Orientation)
    """
    length = sheet.Length
    height = sheet.Height
    units = sheet.Units

    # 如果是英制单位则将尺寸转为公制
    if units == DraftingDrawingSheet.Unit.Inches:
        length *= 25.4
        height *= 25.4

    # 判断纸张方向
    if height > length:
        orientation = NXOpen.PrintBuilder.OrientationOption.Portrait
    else:
        orientation = NXOpen.PrintBuilder.OrientationOption.Landscape

    # 判断纸张大小
    maxDim = max(length, height)
    minDim = min(length, height)
    if maxDim <= 297 and minDim <= 210:
        paperSize = NXOpen.PrintBuilder.PaperSize.A4
    else:
        paperSize = NXOpen.PrintBuilder.PaperSize.A3

    return paperSize, orientation

def printSheet(printBuilder: NXOpen.PrintBuilder, sheet: DraftingDrawingSheet, paperSize: NXOpen.PrintBuilder.PaperSize, orientation: NXOpen.PrintBuilder.OrientationOption, printerName: str, copies: int = 1):
    """
    打印图纸

    Args:
        printBuilder (NXOpen.PrintBuilder): 打印构建器
        sheet (DraftingDrawingSheet): 图纸对象
        paperSize (NXOpen.PrintBuilder.PaperSize): 纸张大小
        orientation (NXOpen.PrintBuilder.OrientationOption): 纸张方向
        printerName (str): 打印机名称
        copies (int, optional): 打印份数. 默认 1 份.
    """
    printBuilder.SourceBuilder.SetSheets([sheet])
    printBuilder.PrinterText = printerName
    printBuilder.Orientation = orientation
    printBuilder.Paper = paperSize
    printBuilder.Copies = copies
    printBuilder.Commit()

def printAllSheets(workPart: NXOpen.Part, lw: NXOpen.ListingWindow, printerName: str, copies: int = 1):
    """
    打印指定部件中的所有图纸页

    Args:
        workPart (NXOpen.Part): 部件对象
        lw (NXOpen.ListingWindow): 列表窗口对象
        printerName (str): 打印机名称
        copies (int, optional): 打印份数. 默认 1 份.

    Returns:
        bool: 打印是否成功
    """
    try:
        printBuilder = workPart.PlotManager.CreatePrintBuilder() # 创建打印构建器
        sheets = [sheet for sheet in workPart.DrawingSheets] # 获取所有图纸
        numberOfSheets = len(sheets)
        if numberOfSheets == 0:
            lw.WriteLine(f'{workPart.FullPath} 中没有图纸页')
            return None

        for i, sheet in enumerate(sheets):
            lw.WriteLine(f'正在提交打印任务: {workPart.FullPath} 中第 {i+1} 张图纸,共 {numberOfSheets} 张')
            paperSize, orientation = getPrintFormatAndOrientation(sheet)
            printSheet(printBuilder, sheet, paperSize, orientation, printerName, copies)
        printBuilder.Destroy()
    except Exception as e:
        lw.WriteLine(f'打印图纸集时发生错误: {e}')
        return False
    else:
        lw.WriteLine(f'提交打印任务完成')
        return True

def main():
    session = NXOpen.Session.GetSession()
    workPart = session.Parts.Work

    lw = session.ListingWindow
    lw.Open()

    printerName = 'Microsoft Print to PDF' # 填打印机的名称,这里填的是微软 PDF 虚拟打印机
    printAllSheets(workPart, lw, printerName)

if __name__ == '__main__':
    main()
Siemens NX(UG)Python 开发 – 图纸打印(研究中)
Scroll to top

目录

打开目录