最近更新于 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 开发 – 图纸打印(研究中)
