from pathlib import Path from docx import Document from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Inches, Pt, RGBColor from build_cnc_first_integration_checklist import ( AMBER, BLACK, BLUE, GRAY, GREEN, LIGHT_BLUE, PALE_BLUE, WHITE, add_callout, add_text, keep_row_together, set_cell_margins, set_cell_shading, set_repeat_table_header, set_table_fixed_width, ) OUT = Path("/Users/jerry/linkhand/CadSet/docs/CNC机床系统对接资料与技术支持需求函.docx") def setup_document(): doc = Document() section = doc.sections[0] section.page_width = Inches(8.5) section.page_height = Inches(11) section.top_margin = Inches(0.7) section.bottom_margin = Inches(0.7) section.left_margin = Inches(0.72) section.right_margin = Inches(0.72) section.header_distance = Inches(0.3) section.footer_distance = Inches(0.3) normal = doc.styles["Normal"] normal.font.name = "Arial" normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial") normal.font.size = Pt(10.5) normal.font.color.rgb = RGBColor.from_string(BLACK) normal.paragraph_format.space_after = Pt(5) normal.paragraph_format.line_spacing = 1.12 for name, size, before, after in ( ("Heading 1", 16, 14, 7), ("Heading 2", 12.5, 10, 5), ("Heading 3", 11, 7, 3), ): style = doc.styles[name] style.font.name = "Arial" style._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial") style.font.size = Pt(size) style.font.bold = True style.font.color.rgb = RGBColor.from_string(BLUE) style.paragraph_format.space_before = Pt(before) style.paragraph_format.space_after = Pt(after) style.paragraph_format.keep_with_next = True for name in ("List Bullet", "List Number"): style = doc.styles[name] style.font.name = "Arial" style._element.rPr.rFonts.set(qn("w:eastAsia"), "Arial") style.font.size = Pt(10.5) hp = section.header.paragraphs[0] hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT add_text(hp, "CNC 机床系统对接|资料与技术支持需求函", size=8.5, color=GRAY) fp = section.footer.paragraphs[0] fp.alignment = WD_ALIGN_PARAGRAPH.CENTER add_text(fp, "请按实际设备型号填写;不适用项目请标注“不适用”", size=8, color=GRAY) return doc def formal_matrix(doc, headers, widths, rows, first_col_fill=None, sizes=None): table = doc.add_table(rows=1, cols=len(headers)) table.style = "Table Grid" set_table_fixed_width(table, widths) for idx, text in enumerate(headers): cell = table.rows[0].cells[idx] set_cell_shading(cell, BLUE) set_cell_margins(cell) cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER p = cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER add_text(p, text, size=9.2, bold=True, color=WHITE) set_repeat_table_header(table.rows[0]) for ridx, values in enumerate(rows): row = table.add_row() keep_row_together(row) for idx, value in enumerate(values): cell = row.cells[idx] set_cell_margins(cell, top=100, bottom=100) cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER if idx == 0 and first_col_fill: set_cell_shading(cell, first_col_fill) p = cell.paragraphs[0] p.alignment = WD_ALIGN_PARAGRAPH.CENTER if idx == 0 else WD_ALIGN_PARAGRAPH.LEFT size = sizes[idx] if sizes else 9.2 add_text(p, value, size=size, bold=(idx == 0)) return table def add_form_lines(doc, pairs): table = doc.add_table(rows=0, cols=2) table.style = "Table Grid" set_table_fixed_width(table, [3.25, 3.25]) for left, right in pairs: row = table.add_row() keep_row_together(row) for idx, value in enumerate((left, right)): cell = row.cells[idx] set_cell_margins(cell, top=120, bottom=120) add_text(cell.paragraphs[0], value, size=9.5) return table def build(): doc = setup_document() p = doc.add_paragraph() p.paragraph_format.space_before = Pt(12) p.paragraph_format.space_after = Pt(4) add_text(p, "CNC 机床系统对接", size=23, bold=True, color=BLUE) p = doc.add_paragraph() p.paragraph_format.space_after = Pt(12) add_text(p, "资料与技术支持需求函", size=20, bold=True, color=BLUE) doc.add_heading("一、需求目的", level=1) p = doc.add_paragraph() add_text( p, "为开展数字零件模型至 CNC 加工程序生成、程序传输、试切验证及加工状态采集等工作," "现请贵方协助确认实际机床和 CNC 控制系统配置,并提供本函所列技术资料、接口信息、" "验证样例及联合调试支持。", ) p = doc.add_paragraph() add_text( p, "本函中的通信产品和接口名称均为候选项,最终以实际机床型号、CNC 系统版本、已购选件、" "机床制造商配置及贵方书面确认为准。", color=GRAY, ) add_callout( doc, "回复方式", "请在对应表格中填写、勾选或标注“不支持/不适用/待确认”,并随回复附相关手册、" "安装包、许可证说明、样例文件和技术联系人信息。", PALE_BLUE, ) doc.add_heading("二、建议参与对接的技术人员", level=1) role_rows = [ ("机床制造商/集成商", "机械配置、轴与主轴、刀库/夹具、专用 M 代码、PLC/联锁、机床安全和现场调试。", "姓名:________ 电话:________"), ("三菱 CNC/代理商", "CNC 型号与版本、已购选件、通信软件、SDK、许可证、标准接口和版本兼容。", "姓名:________ 电话:________"), ("现场工艺/设备人员", "现用 CAM、后处理器、刀具、材料、装夹、坐标、切削参数和已验证程序。", "姓名:________ 电话:________"), ("网络/信息化人员", "工业网络、IP/端口、账号、证书、远程访问、日志和数据合规。", "姓名:________ 电话:________"), ] formal_matrix(doc, ["参与角色", "确认范围", "联系人"], [1.45, 3.70, 1.35], role_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("三、设备与 CNC 基础信息", level=1) equipment_rows = [ ("机床身份", "制造商、完整型号、序列号、出厂年份、设备编号", "____________________________", "铭牌及整机照片"), ("CNC 控制系统", "三菱 CNC 系列、完整型号、系统软件版本", "____________________________", "系统信息页面照片"), ("已安装选件", "高速加工、五轴、刀尖点控制、宏程序、通信等选件", "____________________________", "选件清单/参数页面"), ("机床类型", "车床/铣床/加工中心/车铣复合/磨床/专机", "____________________________", "设备规格书"), ("轴配置", "轴名称、正方向、行程、零点、软限位、旋转轴结构", "____________________________", "轴配置图"), ("主轴配置", "数量、方向、最高转速、功率/扭矩、锥度", "____________________________", "主轴规格"), ("刀库/刀塔", "类型、容量、刀位规则、刀具尺寸重量限制", "____________________________", "刀库规格"), ("辅助装置", "探针、自动对刀、第四/第五轴、尾座、卡盘、托盘等", "____________________________", "配置说明"), ] formal_matrix( doc, ["项目", "请确认内容", "贵方填写", "建议附件"], [1.15, 2.65, 1.55, 1.15], equipment_rows, first_col_fill=LIGHT_BLUE, sizes=[9.0, 8.8, 8.8, 8.5], ) doc.add_heading("四、请提供的技术资料", level=1) material_rows = [ ("P0", "CNC 与机床手册", "CNC 规格/编程/操作/连接设置手册;机床厂操作、维护及专用功能手册。", "□已附 □后补 □不适用"), ("P0", "代码和程序规则", "实际支持的 G/M/T/S/F 代码、自定义 M 代码、宏变量、固定循环、坐标系、刀补、换刀规则、程序格式限制。", "□已附 □后补 □不适用"), ("P0", "程序模板", "机床厂认可的程序开头、换刀段、工序切换、异常退出和结束模板。", "□已附 □后补 □不适用"), ("P0", "验证样例包", "至少 3~10 套已加工成功样例,每套对应 STEP/图纸、毛坯、材料、刀具、装夹、CAM、NC 和检测结果。", "数量:____套"), ("P0", "现用 CAM/后处理", "CAM 名称和版本、后处理器、后处理配置、程序头尾模板和典型仿真项目。", "□已附 □后补 □无"), ("P1", "刀具与刀柄", "真实刀具/刀柄清单、刀位号、刀补号、主要尺寸、寿命规则及 STEP/尺寸模型。", "□已附 □后补"), ("P1", "夹具与工作区", "工作台、卡盘、虎钳、软爪、尾座、旋转轴、探针和防护区域的模型或关键尺寸。", "□已附 □后补"), ("P1", "材料与工艺", "常用材料牌号、毛坯规格、余量、硬度/热处理、切削参数、冷却方式、公差和粗糙度。", "□已附 □后补"), ("P2", "数字机床", "机床三维模型、运动学、回转中心、碰撞体、软限位、CAM 机床仿真工程。", "□已附 □后补 □无"), ] formal_matrix(doc, ["优先级", "资料名称", "交付内容", "回复"], [0.70, 1.45, 3.30, 1.05], material_rows, first_col_fill=GREEN) doc.add_heading("五、程序传输与通信能力确认", level=1) interface_rows = [ ("加工程序传输", "NC Explorer", "□已安装 □可新增 □不支持 □待确认", "版本/许可证/手册/网络配置"), ("加工程序传输", "FTP、共享目录或机床厂文件服务", "□支持 □不支持 □待确认", "IP/端口/目录/账号/文件规则"), ("加工程序传输", "DNC/MDC/MES 平台", "□已有 □无 □待确认", "产品名称、版本、第三方接口"), ("加工程序传输", "RS-232C 或 USB", "□支持 □不支持", "传输设置与文件限制"), ("CNC 通信 SDK", "FCSB1224W000 开发包", "□已授权 □可采购 □不支持 □待确认", "SDK、手册、样例、兼容矩阵"), ("CNC 通信运行库", "FCSB1224W100", "□已授权 □可采购 □不支持 □待确认", "安装包、版本和部署许可"), ("只读数据采集", "MTConnect", "□已配置 □可新增 □不支持 □待确认", "适配器/Agent、数据项和端点"), ("只读数据采集", "OPC UA / NC Machine Tool Connector", "□已配置 □可新增 □不支持 □待确认", "服务器、节点表、证书、许可"), ("运行监控", "NC Monitor2 或现有监控平台", "□已有 □无 □待确认", "产品版本与开放接口"), ("PLC/设备访问", "SLMP 或机床厂专用接口", "□开放只读 □开放读写 □不开放 □待确认", "设备地址表、权限和联锁说明"), ("机床厂专用 API", "机床厂二次开发接口", "□有 □无 □待确认", "API 文档、SDK、样例和授权"), ] formal_matrix( doc, ["用途", "候选通道", "贵方确认", "请附资料"], [1.15, 1.80, 1.95, 1.60], interface_rows, first_col_fill=LIGHT_BLUE, sizes=[8.6, 8.6, 8.3, 8.3], ) doc.add_heading("六、接口交付要求", level=1) interface_delivery_rows = [ ("兼容性", "适用 CNC 型号、系统版本、所需硬件/选件、安装状态、许可证数量和有效期。", "____________________________"), ("开发资料", "API/协议手册、数据字典、错误码、示例程序、SDK/运行库安装包及版本说明。", "____________________________"), ("连接参数", "协议、IP、端口、账号/证书、读写权限、超时、并发、频率和文件大小限制。", "____________________________"), ("可靠性", "断线检测、重连、续传、重复提交处理、任务 ID、校验、回执和错误处理机制。", "____________________________"), ("时间与单位", "时区、时间同步、时间戳精度、字段单位、缩放系数和枚举值说明。", "____________________________"), ("版本支持", "SDK/协议与 CNC 兼容矩阵、升级策略、补丁和技术支持期限。", "____________________________"), ("日志审计", "连接、文件传输、调用方、操作时间、结果、配置修改及远程访问日志。", "____________________________"), ] formal_matrix(doc, ["项目", "交付要求", "贵方回复/附件"], [1.25, 3.85, 1.40], interface_delivery_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("七、状态数据项确认", level=1) p = doc.add_paragraph() add_text( p, "请针对可提供的数据项另附数据字典,并至少标明:接口来源、字段/节点地址、数据类型、单位、" "刷新周期、时间戳、枚举含义、无效值及报警条件。", color=GRAY, ) data_rows = [ ("设备状态", "设备 ID、型号/版本、在线/离线、采集状态、最后更新时间", "□可提供 □部分 □不支持"), ("运行状态", "自动/手动/MDI、运行/暂停/停止/报警/急停、循环启动、门和关键联锁", "□可提供 □部分 □不支持"), ("程序执行", "当前程序、子程序、行号/序列号、开始结束时间、循环时间、加工计数", "□可提供 □部分 □不支持"), ("轴与坐标", "机床/工件坐标、剩余移动、进给、倍率、轴负载、旋转轴角度", "□可提供 □部分 □不支持"), ("主轴", "实际/指令转速、倍率、负载、扭矩/功率、方向、状态、温度", "□可提供 □部分 □不支持"), ("刀具", "当前刀号、刀位、刀补、寿命、使用次数、刀具报警及刀具表更新", "□可提供 □部分 □不支持"), ("报警诊断", "报警号、等级、文本、发生/解除时间、历史、CNC 与机床 PLC 报警", "□可提供 □部分 □不支持"), ("加工质量", "完工状态、实际周期、测头/尺寸结果、报废返工原因", "□可提供 □部分 □不支持"), ("维护能耗", "运行时长、润滑/冷却、维护计数、能耗等设备已有数据", "□可提供 □部分 □不支持"), ] formal_matrix(doc, ["数据类别", "期望数据项", "贵方确认"], [1.20, 4.05, 1.25], data_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("八、网络与安全配合", level=1) security_rows = [ ("网络拓扑", "机床网段、工业交换机、防火墙/隔离区、可否新增工控机及跨网访问方式。", "□可提供 □待确认"), ("端口白名单", "协议、源/目的 IP、TCP/UDP 端口、连接方向和网络变更流程。", "□可提供 □待确认"), ("账号与证书", "角色权限、密码策略、证书签发/更新、密钥保存和账号停用流程。", "□可提供 □待确认"), ("远程支持", "VPN/堡垒机/厂商远程服务、审批、开放时间、审计和紧急断开。", "□允许 □不允许 □待确认"), ("备份恢复", "CNC 参数、PLC、刀补、宏变量和接口配置的备份、回退及恢复负责人。", "□可配合 □待确认"), ("数据合规", "可采集范围、保存期限、图纸/NC 程序保密等级、外发和云端限制。", "□可提供 □待确认"), ] formal_matrix(doc, ["项目", "请确认内容", "贵方回复"], [1.25, 4.00, 1.25], security_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("九、联合调试与验收支持", level=1) acceptance_rows = [ ("资料审查", "型号、手册、代码表、样例、接口和许可证资料齐全;共同确认未知项和责任人。", "□可配合"), ("离线验证", "使用验证样例生成 NC,完成 CAM/CNC 仿真和现场程序对比。", "□可配合 仿真环境:________"), ("程序传输", "验证上传、下载、覆盖保护、文件名、校验、断线重试和回执,不启动机床。", "□可配合"), ("空运行", "在机床锁定/抬刀/单段/低倍率条件下核对坐标、刀具、换刀、行程和安全位置。", "□可配合"), ("试切", "使用约定毛坯、刀具和装夹加工样件,记录周期、报警、刀具和检测结果。", "□可配合"), ("状态采集", "验证约定数据项、时间戳、连续采集、断线恢复和报警记录。", "□可配合"), ("试运行", "限定设备和零件范围运行,统计成功率、人工干预、报警和返工。", "□可配合"), ] formal_matrix(doc, ["阶段", "配合与验收内容", "贵方确认"], [1.10, 4.20, 1.20], acceptance_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("十、首批交付成果", level=1) deliverable_rows = [ ("P0", "设备接口基线表", "每台机床的完整型号、CNC 版本、轴/主轴/刀库、选件、程序传输、可用接口、网络和联系人。", "□可提供"), ("P0", "机床编程资料包", "CNC/机床手册、G/M 代码、专用 M 代码、程序模板、坐标/刀补/换刀规则。", "□可提供"), ("P0", "验证样例包", "3~10 套 STEP/图纸、毛坯、刀具、装夹、CAM、NC 和检测结果对应的完整样例。", "□可提供"), ("P1", "通信接口包", "SDK/运行库或协议、许可、样例、数据字典、节点/地址表、错误码和兼容矩阵。", "□可提供"), ("P1", "测试验收环境", "离线仿真或测试机、账号/目录、网络窗口、备份、现场人员及验收样件。", "□可提供"), ("P2", "数字机床资料包", "机床、刀具、刀柄、夹具和毛坯模型;运动学、软限位、碰撞体和 CAM 仿真工程。", "□可提供"), ] formal_matrix(doc, ["优先级", "成果名称", "内容", "确认"], [0.70, 1.45, 3.30, 1.05], deliverable_rows, first_col_fill=GREEN) doc.add_heading("十一、商务授权与支持信息", level=1) commercial_rows = [ ("软件与接口授权", "SDK、运行库、OPC UA/MTConnect、仿真软件、后处理器是否收费及授权方式", "____________________________"), ("现场服务", "现场调试服务内容、人员、预计工期及费用", "____________________________"), ("培训", "操作、编程、通信接口、备份恢复和安全联调培训", "____________________________"), ("维护支持", "服务时间、响应时限、升级路径、远程/现场支持和年度维护", "____________________________"), ("交付介质", "安装包、许可证、手册、样例代码、版本号、校验值和下载期限", "____________________________"), ] formal_matrix(doc, ["项目", "请确认内容", "贵方回复"], [1.35, 3.65, 1.50], commercial_rows, first_col_fill=LIGHT_BLUE) doc.add_heading("附:建议资料包目录", level=1) add_callout( doc, "建议压缩包结构", "01_设备铭牌与系统照片;02_机床与CNC手册;03_GM代码与机床专用说明;04_已验证样例;" "05_CAM与后处理;06_刀具夹具材料工艺;07_通信软件与接口文档;08_网络与测试环境;" "09_授权商务信息;10_联系人。", LIGHT_BLUE, ) OUT.parent.mkdir(parents=True, exist_ok=True) doc.save(OUT) print(OUT) if __name__ == "__main__": build()