﻿P10-02 增加六种常用工序：面铣 / 侧面 / 深度轮廓线 / 攻牙 / 铣孔 / 铣螺纹

## 现状
目前只有一种工序：`tools\cam_create_op.py` 用 hole_making + DRILLING 建钻孔。
用户要补齐加工中心的常用工序，且必须**真能生成刀路**，不接受"能建出来但没刀路"。

## 第一步：先探测 NX，别猜模板名（强制）
写一个 journal `tools\probe_op_templates.py`，在 NX 里枚举：
- `CAMOperationCollection.Create` 对以下子类型是否成功，以及需要哪些父对象：
  mill_planar / mill_contour / hole_making
- 具体 subtype 字符串（不同 NX 版本不同，必须实测）：
  面铣、平面铣/轮廓（侧面）、深度轮廓铣、钻孔、攻牙、铣孔(镗/螺旋)、铣螺纹
把结果写成 `状态\op_matrix.json`，字段：op_key、program_template、subtype、
需要的 tool 类型、需要的 geometry 类型、是否成功、失败原因。
**探测失败的项不要硬写成功**，如实记录，后续再换 subtype 重试。

## 第二步：实现统一入口
新建 `tools\cam_ops.py`（不要改坏现有的 cam_create_op.py，保留它）：
```
--part <prt> --op {face,side,zlevel,drill,tap,hole,thread}
--name <工序名> --tool <刀具名> --diameter <mm>
--depth <mm> --stepover <mm> --stepdown <mm> --pitch <螺距>
--save-as <输出副本> --generate
```
要求：
1. 父对象沿用已验证路径：PROGRAM 用 NCGroup(PROGRAM)、Method、WORKPIECE 作 geometry
   （详见 cam_create_op.py 里已经跑通的那套调用，别重新发明）
2. S / F 取自现有 `核心参数`（SpeedFeedTable + 材料），攻牙用 `data\std\tapping_speed.json`
   （N 组 vc=12.5 m/min 已确认），螺纹用 pitch 换算 F = 转速 × 螺距
3. 每道工序创建后必须调 `CAMSetup.GenerateToolPath([op])`，并校验刀路存在
   （不能只看工序建出来就算成功）
4. 成功的判定：工序数 +1、刀路非空、副本文件生成，三者都有才算 rc=0
5. 授权标签用 `operation`（离线允许），不要用 `cam_create` 之外的新标签

## 第三步：接入工作台
`app\NXAIStart.cs` 加一个「⑧ 批量常用工序」按钮：按顺序建
面铣 → 侧面 → 深度轮廓线 → 攻牙 → 铣孔 → 铣螺纹（每道一个副本或同一副本，你定，
但要写清楚），执行前弹确认框，执行中日志区实时输出每道的结果。

## 验收（必须实测证据）
1. `状态\op_matrix.json` 真实内容（哪些成功、哪些失败、失败原因）
2. 对 `C:\Users\Administrator\Desktop\数控加工教程\7-17\7-17.prt` 实跑一次，贴出：
   - 每道工序的 rc
   - 工序总数变化
   - 生成副本的路径与大小
   - 至少一道工序的刀路行数（证明真生成了刀路）
3. 攻牙工序要用到 tapping_speed.json 的 12.5 m/min，贴出实际 S/F 值
4. 门禁全绿：check_py_syntax 0 错误、run_eval 21/21、所有 tests\test_*.py 通过
5. 新增 .py 必须有 `P2-02 控制台编码护栏` 中文原文

## 约束
- 不改 `E:\Program Files\Siemens\NX*`
- 不改 cloud\ 与 core\license.py
- 不伪造刀路（宁可报失败，也不许写假的成功）
- 完成后写 `状态\P10-02.done.json`（status/verify/notes/files）

## 追加需求（用户补充，2026-10-19 23:20）
除上面六种，还要两种**曲面类**工序：

### 7) 曲面铣（曲面轮廓铣 / 区域铣削）
- 归类：mill_contour
- 候选 subtype：CONTOUR_AREA / AREA_MILLING / STREAMLINE（以第一步探测结果为准）
- 必须用到驱动方法（区域铣削/边界/流线），不能只建空工序
- 参数：--stepover（步距）、--stepdown、--tolerance（内外公差）
- 三轴即可，优先做

### 8) 引导曲线（Guided Curves）
- 归类：**多轴**（mill_multi_axis），subtype 候选：GUIDING_CURVES / VARIAXIAL_GUIDING_CURVE
- **这是多轴工序**，注意两点，必须如实报告：
  1. 多轴加工需要对应许可（NX 5 轴/多轴铣）。探测阶段先判断
     `CAMOperationCollection.Create` 对多轴 subtype 是否成功；
     失败时把 NX 的原始报错原文记进 op_matrix.json，不许吞掉
  2. 需要指定刀轴方向与引导曲线对（两条曲线），
     参数增加 --guide-curve-a / --guide-curve-b / --tool-axis（+Z / 指定矢量）
- 若许可或模型条件不具备：**明确输出"该工序不可用 + 原因"**，
  不要用三轴工序冒充，也不要在日志里写"成功"

### --op 取值最终清单
face, side, zlevel, drill, tap, hole, thread, surface, guidecurve

## 工序命名规范（用户定，2026-10-19 23:55，三张卡通用）
- 工序统一命名为 **A01、A02、A03 … A30**（两位数字，从 01 起按加工顺序递增）。
- 超过 30 道时继续 A31、A32…（两位不够就三位 A100，不截断、不重复）。
- 同一零件内**不许重名**；重新出单时按最新顺序重新编号。
- 命名与工序类型/刀具**解耦**：工序名只是编号，
  类型（面铣/钻孔/攻牙…）与刀具（D12/E8.5…）各自占列，不写进工序名。
- NX 里创建的工序名也用 A01…（Create 的 name 参数直接传它），
  不要用 NXAI_OP、roughing_1 这类临时名。
- 工序单表格「工序」列显示 A01…；工序类型放独立列（列名「类型」）。
- 「一键准备」按 A01…A30 顺序逐行建工序并生成刀路，日志逐行打印编号。
