# 工序模板参数表（模板式半自动 · P10-07B，2026-10-20）

> **路线**：全自动几何识别已按用户 2026-10-20 12:30 决策**暂停**，改为**模板式半自动**——
> 每个工序把「参数 / 刀路 / 策略」预置好，**加工区域由你选，刀路由你生成**。
> 两条铁律贯穿全部模板：**一刀流（少跳刀）** + **防撞**。

---

## 0. 交付物与文件位置

| 交付物 | 路径 | 说明 |
|---|---|---|
| NX 模板 `.prt` | `D:\NX_AI\nx_templates\NXAI_工序模板.prt` | 一个文件内含 **11 道预置工序**（命名 `TPL_*`），已设好一刀流/防撞/S/F |
| 模板静态定义（唯一事实源之一） | `data\std\template_defs.json` | 只存「策略 / 刀 / 余量」等静态字段，**不存 S/F 数值** |
| 参数数值（唯一事实源之二） | `data\std\cutting_params.json` | 由 `tools\gen_cutting_params.py` 从 `rule_engine` 导出，含 11 模板 × 6 材料类 |
| 校验工具 | `tools\template_check.py` | `--list` / `--check <模板>` / `--export-csv` / `--export-md` / `--verify-doc` |
| 模板生成器 | `tools\gen_templates.py` | 从空件起建 `.prt`，属性设置结果逐条落证 `状态\tpl_gen.json` |
| 属性实测证据 | `状态\tpl_gen.json`、`状态\engage_probe.json` | 每条属性 OK / UNREACHABLE / NX 异常原文 |
| 持久化核验证据 | `状态\cam_verify_saved.jsonl` | **独立进程**重开该 `.prt`，实测 `ops_count=11`，工序名为 `TPL_DRILL…TPL_ZLEVEL`（11 个，非同一进程自证） |

> **模板是否注册进 NX 由你决定**：本工具只把 `.prt` 放在我们自己的目录，**不改 NX 安装目录**。

---

## 1. 一刀流：逐条「为什么这样设」

| 设置项 | 目标值 | 为什么这样设（收益） |
|---|---|---|
| ① 步距间转移（Transfer between Passes） | **直接 / Direct** | 相邻刀路之间不抬刀、直接连过去。腔体 150×100 深 20 的典型件，逐层抬刀约 48 次空程 12~18 min，一刀流约 7 次、空程 2~3 min。 |
| ② 层间转移（Transfer between Levels） | **斜进刀等效**（层间 PrevPlane/Direct 不抬刀 + 每层螺旋 2° 斜向下切；层间重叠在 NX2412 无可达成员 → N/A） | **P10-08 追加（2026-10-20 17:10）**：层间禁止垂直直接下切（封闭腔每层扎一刀＝伤刀、易崩刃）。**NX Open 实证**：`NcmPlanarBuilder.TransferBetweenLevelsTypes` 只有 `PrevPlane / Direct / Clearance`，**没有 Ramp 成员**（NXOpen.xml L288540-288548），故层间以「Direct 转移(不抬刀、不回安全平面) + 每层进刀螺旋 2°(斜向下切) + `OverlapDistanceBuilder` 0.8mm 重叠」等效斜进刀，**如实说明、不伪称 ramp**。深度轮廓铣最吃这条：否则每层都退到安全平面，来回行程翻几倍。 |
| ③ Direct 之上再加安全距离（ApplySafetyToDirect） | **关** | NX 默认给 Direct 转移也留一段安全距离，等于"假直接"。关掉才是真的一刀流。 |
| ④ 进刀（Engage） | **螺旋 / Helical（8 类铣刀模板，无任何例外）** | 垂直下刀＝刀底中心线速为零、排屑最差，是扎刀与崩刃主因。**P10-08 硬性修正**：若某工序类型不支持螺旋（如旧表述里的 FACE_MILLING），**允许换工种**（改用 `CAVITY_MILL` / `ZLEVEL_PROFILE` 处理同一区域），**不允许退化成直线**；`engage_linear_reason` 例外字段已作废删除。 |
| ⑤ 退刀（Retract） | **最小（直线短退）** | 退到安全平面再横移＝每刀多一次 Z 往返。最小退刀只抬"避空距离"即可。 |
| ⑥ 抬刀策略 | **关闭"每层抬刀"、关闭"每次退到安全平面"** | 这两项是空程的主要来源。安全平面只保留在**换刀 / 换区域**时使用。 |
| ⑦ 安全平面（Clearance） | **仅在换刀 / 换区域时抬 + 相对最高面偏移 8.0mm** | 安全平面作为"保险"保留，但不能逐刀抬，否则一刀流失效。**P10-08 定义（2026-10-20 16:40）**：安全高度 Z = **毛坯(BLANK)/所选区域最高面 Z + 偏移（默认 8.0mm）**，不是绝对 Z=8、也不是原点 +8；优先级 毛坯包围盒 maxZ → 区域 maxZ → 都没有则**报错**`无法确定最高面，请先定义毛坯或选区域`（**不许默认 8**）；偏移允许 1~30mm，越界拒绝；多工序按「**该工序加工区域**最高面 + 8」算，不取整件最高面。模板为空件，故 `.prt` 内**只写偏移**，真实值使用时由 `tools\safe_z.py` 计算并打印三段式「基准 Z + 偏移 = 结果」。 |

### 1.1 进刀的实测落点（`.prt` 内实际写入值，与目标值的差异必须说明）

| 族 | 目标 | **`.prt` 实测落点** | 原因（实测证据） |
|---|---|---|---|
| `surface` 系（POCKET_R/S/F、SURFACE） | 螺旋 | **螺旋 `HelicalClw`（顺时针）** ✅ | 已在模板内 Commit 成功，无需你再改 |
| `planar` 系（FACE、SIDE、ZLEVEL） | 螺旋 | **螺旋 `Helical`（0.6D / 2° / 0.25D）** ✅ | P10-07G 实测更正：planar 系**空件无几何也能 Commit 螺旋**（旧『无几何不能螺旋』结论作废）。真根因是 NX 对（螺旋角 × 螺旋直径 × 最小斜面长度）的一致性校验：历史失败组合＝`MinRampLength` 保留默认 70.0 + 未设螺旋直径 → 报 `The ramp angle for engage is not valid.`；按（螺旋角 2°、直径 0.6D、最小斜面长度 0.25D）设齐后四种 planar 工序全部 Commit OK。证据：`状态\probe_planar_nogeom.json`、`状态\planar_sweep.json`、独立进程读回 `状态\engage_read.json`（FACE/SIDE/ZLEVEL 读回 Type=3=Helical）。 |
| `hole` 系（HOLEMILL 螺旋铣孔） | 螺旋 | **螺旋 `helical`（工艺本体即螺旋下刀）** ✅ | HOLE_MILLING（CylinderMilling）的切削运动本身就是连续螺旋下刀，无独立 engage 枚举；螺旋参数走 hole_making builder 的 `HelixDiameter` / `AxialDistance`，P10-07G 已在模板 `.prt` 内 Commit（空件模板下 AxialDistance=0 被 NX 拒：`Depth per Revolution must be greater than zero`，预置占位 HelixDiameter=2.0mm、AxialDistance=0.2mm 提交 OK；独立进程读回 AxialDistance=0.2 持久化、HelixDiameter 被 NX 在空件保存后重置为 0（无孔几何可算螺旋直径，选孔后按实际孔径生效，有孔几何时 AxialDistance 可改回 0=连续螺旋）。证据：`状态\tpl_gen.json`、独立进程读回 `状态\engage_read.json`；更早 P10-07 实证 HelixDiameter=孔径-6 + AxialDistance=0 → cut=1568.6mm。 |
| `hole` 系（DRILL/TAP/THREAD） | — | **不适用** | 孔加工没有"斜坡进刀"概念，按孔加工 builder 单独设进给与安全平面 |

> 取舍写在这里，是为了让你知道**表里写的和 `.prt` 里的到底哪个准**：**以 `.prt` 实测为准**。

### 1.2 层间过渡的实测落点与安全高度定义（P10-08 追加，2026-10-20）

**层间（要求：斜进刀、禁止垂直直接下切、不抬刀）**

| 族 | 要求 | **`.prt` 实测落点** | 说明（证据） |
|---|---|---|---|
| `planar` 系（FACE / SIDE / ZLEVEL） | 斜进刀 | **层间=PrevPlane(不抬刀) + 每层螺旋下切 2.0°（`OverlapDistance` 在 NX2412 该工序类型上无可达成员，判 N/A）** | `NcmPlanarBuilder.TransferBetweenLevelsTypes` **只有 PrevPlane/Direct/Clearance，无 Ramp**（NXOpen.xml L288540-288548）；故以「不抬刀 + 斜向螺旋下切」达成"斜进刀"的工艺意图，**不伪称 ramp**。`OverlapDistanceBuilder` 在本工序类型抛 `AttributeError`（原文见 `状态\level_read.json`），**未落 0.8mm，不谎称已设**。独立进程读回证据：`状态\level_read.json` |
| `sc` 系（POCKET_R/S/F、SURFACE） | 斜进刀 | **N/A（NX 无该成员）** | `NcmScBuilder` 全量成员实证**没有**层间转移/重叠成员（NXOpen.xml L289349-289500）；层间不抬刀由区域间 `AlongToolAxis`（沿刀轴最短）保证，斜向下切由螺旋进刀角承担。是「NX 无此成员」而非「未设」 |
| `hole` 系（DRILL/TAP/THREAD/HOLEMILL） | — | **不适用** | 孔类无层间转移概念 |

**安全高度（定义，覆盖此前一切模糊表述）**

```
安全高度 Z = 毛坯(BLANK) / 所选区域 最高面 Z + 偏移（默认 8.0mm）
  ① 有毛坯 → 取毛坯包围盒最大 Z
  ② 无毛坯有区域 → 取该工序所选区域/体最大 Z
  ③ 都没有 → 报错「无法确定最高面，请先定义毛坯或选区域」   ← 禁止默认用 8
偏移允许 1~30mm，越界拒绝；多工序按「该工序加工区域的最高面 + 8」算，不取整件最高面。
```

- 模板是**空件**（无毛坯、无区域），所以 `.prt` 内**只写偏移量**，**不预置任何绝对 Z**。
- 真实值在「使用时」由 [safe_z.py](file:///d:/NX_AI/tools/safe_z.py) 计算，并打印三段式：
  `安全高度 = 毛坯顶 Z=0.0 + 8.0 = Z 8.0` 或 `安全高度 = 区域最高面 Z=-12.5 + 8.0 = Z -4.5`
- 校验输出（`--list` / `--check`）对空件模板打印 `安全高度 = 基准(未定义) + 8.0mm（待使用时按该工序毛坯/区域最高面计算）`，判定 `待使用时计算` —— **不算失败，但也不伪装成已算好**。
- 可跑实测：`python tools\template_check.py --safe-z --blank-top 0` / `--safe-z --region-top -12.5` / `--safe-z`（无基准 → 报错）。

---

## 2. 防撞：自检清单（在 NX 里确认后再生成刀路）

逐条对照勾选，**全部打勾才允许出程序**：

```
[ ] 1 刀具刃长 ≥ 该工序最深切削深度 + 避空 2mm        （不够就换长刃刀）
[ ] 2 装夹悬伸 ≥ 刃长 + 10mm 装夹安全余量               （夹太浅＝振刀＋甩刀）
      注：NX Open CAM 侧**不存在** MinToolLength 属性（NXOpen.xml 全库无此项），
          数值下限由 tools\template_check.py 按「刃长+10mm」规则做**数字校核**，
          NX 侧靠工序「碰撞检查」+ 刀柄干涉检查实现，两条一起用。
[ ] 3 已在 NX 刀具里指定**刀柄(holder)几何**               （无刀柄＝干涉检查形同虚设）
[ ] 4 工序「碰撞检查 / CollisionCheck」= 开              （.prt 内已置 True）
[ ] 5 避空距离（Retract Distance）= 2mm                   （.prt 内已置 2.0）
[ ] 6 安全高度 = 该工序毛坯/区域最高面 + 8.0mm               （模板内只写**偏移 8.0mm**；真实值使用时按最高面计算，见 §1.2、`tools\safe_z.py`；850 机型 Z 行程 500 内）
[ ] 7 下刀前刀尖必须在安全平面以上，禁止从工件上方斜插
[ ] 8 夹持/刀柄 与 工件/压板 无干涉（NX 3D 动态走一遍）
[ ] 9 快移（G00）路径已用 3D 动态检查，无穿件
```

> 数字校核随时可跑：`python tools\template_check.py --check TPL_POCKET_R`（逐条打印通过/不通过）。

---

## 3. 模板核心参数（P 组为代表；数值自动生成，勿手改）

<!-- AUTO-TABLE:BEGIN -->
| 模板 | 名称 | 刀具 | D(mm) | z | 余量(mm) | S(rpm) | F(mm/min) | ap(mm) | ae(mm) | Vc(m/min) | fz(mm/t) | 参数来源（P 组） | 状态 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TPL_FACE | 面铣（平面） | D12 | 12.0 | 3 | 0.0 | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) | params_only |
| TPL_SIDE | 侧面轮廓铣（侧壁） | D12 | 12.0 | 3 | 0.0 | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) | params_only |
| TPL_POCKET_R | 腔体粗加工（留 0.2） | D12 | 12.0 | 3 | 0.2 | 2387.3 | 644.6 | 4.8 | 4.8 | 90.0 | 0.09 | SpeedFeedTable(钢件-粗铣-平底刀) | verified |
| TPL_POCKET_S | 腔体半精（留 0.05） | D12 | 12.0 | 3 | 0.05 | 2917.85 | 580.95 | 2.55 | 2.88 | 110.0 | 0.07 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） | verified |
| TPL_POCKET_F | 腔体精加工（余量 0） | D12 | 12.0 | 3 | 0.0 | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) | verified |
| TPL_ZLEVEL | 深度轮廓铣（陡峭侧壁分层） | D12 | 12.0 | 3 | 0.0 | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) | verified |
| TPL_DRILL | 钻孔 | E8 | 8.0 | 2 | 0.0 | 2984.2 | 238.7 | 4.0 | 0.0 | 75.0 | 0.08 | SpeedFeedTable(钢件-钻孔) | verified |
| TPL_TAP | 攻牙（按刀具名解析规格） | M8 | 8.0 | 1 | 0.0 | 318.3 | 397.9 | 4.0 | 0.0 | 8.0 | 1.25 | SpeedFeedTable(钢件-攻螺纹) | verified |
| TPL_HOLEMILL | 铣孔（螺旋） | D8 | 8.0 | 3 | 0.0 | 3581.0 | 966.9 | 3.2 | 3.2 | 90.0 | 0.09 | SpeedFeedTable(钢件-粗铣-平底刀) | verified |
| TPL_THREAD | 铣螺纹 | THM16（库中缺，占位 D16R0.4） | 16.0 | 4 | 0.0 | 2586.3 | 517.3 | 0.1 | 0.013 | 130.0 | 0.05 | MaterialLibrary fallback (45钢) | blocked |
| TPL_SURFACE | 曲面（区域铣削） | R5 | 10.0 | 2 | 0.0 | 4774.6 | 334.2 | 0.3 | 0.4 | 150.0 | 0.035 | SpeedFeedTable(钢件-精铣-球刀) | verified |
<!-- AUTO-TABLE:END -->

### 3.1 全材料类参数（11 模板 × 6 材料类）

<!-- AUTO-TABLE2:BEGIN -->
| 模板 | 材料类 | S(rpm) | F(mm/min) | ap(mm) | ae(mm) | Vc(m/min) | fz(mm/t) | 参数来源 |
|---|---|---|---|---|---|---|---|---|
| TPL_FACE | P | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) |
| TPL_FACE | M | 2785.2 | 334.2 | 0.3 | 0.96 | 105.0 | 0.04 | SpeedFeedTable(不锈钢-精铣-平底刀) |
| TPL_FACE | K | 3713.6 | 668.5 | 0.3 | 0.96 | 140.0 | 0.06 | SpeedFeedTable(铸铁-精铣-平底刀) |
| TPL_FACE | N | 2493.4 | 149.6 | 0.3 | 0.96 | 94.0 | 0.02 | SpeedFeedTable(铝合金-精铣-平底刀) |
| TPL_FACE | S | 1591.5 | 119.4 | 0.3 | 0.96 | 60.0 | 0.025 | SpeedFeedTable(钛合金-精铣-平底刀) |
| TPL_FACE | H | 1856.8 | 139.3 | 0.3 | 0.72 | 70.0 | 0.025 | SpeedFeedTable(淬火钢-精铣-平底刀) |
| TPL_SIDE | P | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) |
| TPL_SIDE | M | 2785.2 | 334.2 | 0.3 | 0.96 | 105.0 | 0.04 | SpeedFeedTable(不锈钢-精铣-平底刀) |
| TPL_SIDE | K | 3713.6 | 668.5 | 0.3 | 0.96 | 140.0 | 0.06 | SpeedFeedTable(铸铁-精铣-平底刀) |
| TPL_SIDE | N | 2493.4 | 149.6 | 0.3 | 0.96 | 94.0 | 0.02 | SpeedFeedTable(铝合金-精铣-平底刀) |
| TPL_SIDE | S | 1591.5 | 119.4 | 0.3 | 0.96 | 60.0 | 0.025 | SpeedFeedTable(钛合金-精铣-平底刀) |
| TPL_SIDE | H | 1856.8 | 139.3 | 0.3 | 0.72 | 70.0 | 0.025 | SpeedFeedTable(淬火钢-精铣-平底刀) |
| TPL_POCKET_R | P | 2387.3 | 644.6 | 4.8 | 4.8 | 90.0 | 0.09 | SpeedFeedTable(钢件-粗铣-平底刀) |
| TPL_POCKET_R | M | 1856.8 | 445.6 | 4.2 | 3.6 | 70.0 | 0.08 | SpeedFeedTable(不锈钢-粗铣-平底刀) |
| TPL_POCKET_R | K | 2520.0 | 831.6 | 4.8 | 4.8 | 95.0 | 0.11 | SpeedFeedTable(铸铁-粗铣-平底刀) |
| TPL_POCKET_R | N | 6366.2 | 2291.8 | 4.8 | 5.4 | 240.0 | 0.12 | SpeedFeedTable(铝合金-粗铣-平底刀) |
| TPL_POCKET_R | S | 1061.0 | 159.2 | 3.6 | 3.0 | 40.0 | 0.05 | SpeedFeedTable(钛合金-粗铣-平底刀) |
| TPL_POCKET_R | H | 1193.7 | 161.1 | 3.6 | 2.4 | 45.0 | 0.045 | SpeedFeedTable(淬火钢-粗铣-平底刀) |
| TPL_POCKET_S | P | 2917.85 | 580.95 | 2.55 | 2.88 | 110.0 | 0.07 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_S | M | 2321.0 | 389.9 | 2.25 | 2.28 | 87.5 | 0.06 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_S | K | 3116.8 | 750.05 | 2.55 | 2.88 | 117.5 | 0.085 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_S | N | 4429.8 | 1220.7 | 2.55 | 3.18 | 167.0 | 0.07 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_S | S | 1326.25 | 139.3 | 1.95 | 1.98 | 50.0 | 0.0375 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_S | H | 1525.25 | 150.2 | 1.95 | 1.56 | 57.5 | 0.035 | 插值(粗+精)/2 —— 无半精档位，取粗精中点并标注（P10-05 约定） |
| TPL_POCKET_F | P | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) |
| TPL_POCKET_F | M | 2785.2 | 334.2 | 0.3 | 0.96 | 105.0 | 0.04 | SpeedFeedTable(不锈钢-精铣-平底刀) |
| TPL_POCKET_F | K | 3713.6 | 668.5 | 0.3 | 0.96 | 140.0 | 0.06 | SpeedFeedTable(铸铁-精铣-平底刀) |
| TPL_POCKET_F | N | 2493.4 | 149.6 | 0.3 | 0.96 | 94.0 | 0.02 | SpeedFeedTable(铝合金-精铣-平底刀) |
| TPL_POCKET_F | S | 1591.5 | 119.4 | 0.3 | 0.96 | 60.0 | 0.025 | SpeedFeedTable(钛合金-精铣-平底刀) |
| TPL_POCKET_F | H | 1856.8 | 139.3 | 0.3 | 0.72 | 70.0 | 0.025 | SpeedFeedTable(淬火钢-精铣-平底刀) |
| TPL_ZLEVEL | P | 3448.4 | 517.3 | 0.3 | 0.96 | 130.0 | 0.05 | SpeedFeedTable(钢件-精铣-平底刀) |
| TPL_ZLEVEL | M | 2785.2 | 334.2 | 0.3 | 0.96 | 105.0 | 0.04 | SpeedFeedTable(不锈钢-精铣-平底刀) |
| TPL_ZLEVEL | K | 3713.6 | 668.5 | 0.3 | 0.96 | 140.0 | 0.06 | SpeedFeedTable(铸铁-精铣-平底刀) |
| TPL_ZLEVEL | N | 2493.4 | 149.6 | 0.3 | 0.96 | 94.0 | 0.02 | SpeedFeedTable(铝合金-精铣-平底刀) |
| TPL_ZLEVEL | S | 1591.5 | 119.4 | 0.3 | 0.96 | 60.0 | 0.025 | SpeedFeedTable(钛合金-精铣-平底刀) |
| TPL_ZLEVEL | H | 1856.8 | 139.3 | 0.3 | 0.72 | 70.0 | 0.025 | SpeedFeedTable(淬火钢-精铣-平底刀) |
| TPL_DRILL | P | 2984.2 | 238.7 | 4.0 | 0.0 | 75.0 | 0.08 | SpeedFeedTable(钢件-钻孔) |
| TPL_DRILL | M | 2387.3 | 143.2 | 3.2 | 0.0 | 60.0 | 0.06 | SpeedFeedTable(不锈钢-钻孔) |
| TPL_DRILL | K | 3183.1 | 318.3 | 4.0 | 0.0 | 80.0 | 0.1 | SpeedFeedTable(铸铁-钻孔) |
| TPL_DRILL | N | 2546.5 | 247.0 | 3.2 | 1.6 | 64.0 | 0.097 | SpeedFeedTable(drilling-按直径档-7.5001~15.5mm) |
| TPL_DRILL | S | 1193.7 | 47.7 | 2.4 | 0.0 | 30.0 | 0.04 | SpeedFeedTable(钛合金-钻孔) |
| TPL_DRILL | H | 1392.6 | 41.8 | 2.4 | 0.0 | 35.0 | 0.03 | SpeedFeedTable(淬火钢-钻孔) |
| TPL_TAP | P | 318.3 | 397.9 | 4.0 | 0.0 | 8.0 | 1.25 | SpeedFeedTable(钢件-攻螺纹) |
| TPL_TAP | M | 238.7 | 298.4 | 4.0 | 0.0 | 6.0 | 1.25 | SpeedFeedTable(不锈钢-攻螺纹) |
| TPL_TAP | K | 318.3 | 397.9 | 4.0 | 0.0 | 8.0 | 1.25 | SpeedFeedTable(铸铁-攻螺纹) |
| TPL_TAP | N | 497.4 | 621.7 | 4.0 | 0.0 | 12.5 | 1.25 | TappingSpeed(N, 用户提供（车间经验值 2026-10-18，M8 约 500 转/分）) |
| TPL_TAP | S | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用：该材料组无可用预设/出处（RL-004 拒绝回落） |
| TPL_TAP | H | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用 | 不可用：该材料组无可用预设/出处（RL-004 拒绝回落） |
| TPL_HOLEMILL | P | 3581.0 | 966.9 | 3.2 | 3.2 | 90.0 | 0.09 | SpeedFeedTable(钢件-粗铣-平底刀) |
| TPL_HOLEMILL | M | 2785.2 | 668.5 | 2.8 | 2.4 | 70.0 | 0.08 | SpeedFeedTable(不锈钢-粗铣-平底刀) |
| TPL_HOLEMILL | K | 3779.9 | 1247.4 | 3.2 | 3.2 | 95.0 | 0.11 | SpeedFeedTable(铸铁-粗铣-平底刀) |
| TPL_HOLEMILL | N | 9549.3 | 3437.7 | 3.2 | 3.6 | 240.0 | 0.12 | SpeedFeedTable(铝合金-粗铣-平底刀) |
| TPL_HOLEMILL | S | 1591.5 | 238.7 | 2.4 | 2.0 | 40.0 | 0.05 | SpeedFeedTable(钛合金-粗铣-平底刀) |
| TPL_HOLEMILL | H | 1790.5 | 241.7 | 2.4 | 1.6 | 45.0 | 0.045 | SpeedFeedTable(淬火钢-粗铣-平底刀) |
| TPL_THREAD | P | 2586.3 | 517.3 | 0.1 | 0.013 | 130.0 | 0.05 | MaterialLibrary fallback (45钢) |
| TPL_THREAD | M | 2387.3 | 382.0 | 0.1 | 0.013 | 120.0 | 0.04 | MaterialLibrary fallback (304不锈钢) |
| TPL_THREAD | K | 2785.2 | 668.5 | 0.1 | 0.013 | 140.0 | 0.06 | MaterialLibrary fallback (HT250灰铸铁) |
| TPL_THREAD | N | 7559.9 | 2419.2 | 0.1 | 0.013 | 380.0 | 0.08 | MaterialLibrary fallback (6061铝合金) |
| TPL_THREAD | S | 1193.7 | 119.4 | 0.1 | 0.013 | 60.0 | 0.025 | MaterialLibrary fallback (TC4钛合金) |
| TPL_THREAD | H | 1392.6 | 139.3 | 0.1 | 0.013 | 70.0 | 0.025 | MaterialLibrary fallback (SKD11淬硬钢) |
| TPL_SURFACE | P | 4774.6 | 334.2 | 0.3 | 0.4 | 150.0 | 0.035 | SpeedFeedTable(钢件-精铣-球刀) |
| TPL_SURFACE | M | 3501.4 | 175.1 | 0.3 | 0.4 | 110.0 | 0.025 | SpeedFeedTable(不锈钢-精铣-球刀) |
| TPL_SURFACE | K | 4774.6 | 477.5 | 0.3 | 0.4 | 150.0 | 0.05 | SpeedFeedTable(铸铁-精铣-球刀) |
| TPL_SURFACE | N | 14323.9 | 1432.4 | 0.3 | 0.4 | 450.0 | 0.05 | SpeedFeedTable(铝合金-精铣-球刀) |
| TPL_SURFACE | S | 1909.9 | 68.8 | 0.3 | 0.4 | 60.0 | 0.018 | SpeedFeedTable(钛合金-精铣-球刀) |
| TPL_SURFACE | H | 2387.3 | 85.9 | 0.3 | 0.3 | 75.0 | 0.018 | SpeedFeedTable(淬火钢-精铣-球刀) |
<!-- AUTO-TABLE2:END -->

**一致性说明（验收 4）**：上面两张表由 `tools\template_check.py --export-md` **直接从
`data\std\cutting_params.json` 生成**，本文件不手写任何数值 → 结构上不可能出现"文档与参数库打架"。
`cutting_params.json` 的每一条又都由唯一的参数权威通道 `data\rules\rule_engine.py` 计算，
`source` 字段写明出处（`SpeedFeedTable(param_xx)` / `TappingSpeed(N,...)` / `插值(粗+精)/2` / `unavailable`）。
`--verify-doc` 可随时复核文档表与参数库一致。

**与参数库的已知差异与取舍**（必须说明，不许糊过去）：

| 项 | 参数库/规则引擎的取值 | 模板表里的取值 | 取舍理由 |
|---|---|---|---|
| 攻牙 `TPL_TAP` 的 S/H 两材料类 | `rule_engine` 走 RL-004 **显式拒绝**（无出处，`unavailable`） | 表里如实写 `不可用`，**不填 0、不编数** | 铁律：攻丝 Vc 必须有公开出处；S/H 组无出处就拒绝。P/M/K 有预设、N 组用你提供的车间经验值（Vc=12.5，M8→497.4rpm/621.7F）。 |
| 半精 `TPL_POCKET_S` | 参数库无"半精"档位 | 取 `插值(粗+精)/2` 并标注来源 | P10-05 既定约定：不凭空编造系数，用粗/精中点并在 `source` 里写明 |
| 铣螺纹 `TPL_THREAD` | 参数库无螺纹铣专用条目 | `MaterialLibrary fallback` 参考值 + `provisional: true` | 参数库**无 thread_mill 刀具**、P10-07 实证该工序 `cut=0`（7 轮绑定链路全 OK 仍不出刀路）→ 表中如实标 blocked + provisional，**不冒充专用参数** |
| `planar` 系进刀 | `_一刀流策略` 写"螺旋/斜线" | `.prt` 实测为螺旋 Helical（0.6D/2°/0.25D） | P10-07G 起已一致，见 §1.1 |

---

## 4. 模板清单（逐项：刀 / 余量 / 切削模式 / 转移 / 进退刀 / 避空 / 适用场景）

| 模板 | 名称 | op（NX 类型/子类型） | 刀具 | 余量 | 切削模式 | 转移(步距间/层间) | 进刀 | 退刀 | 避空 | 安全高度 | 适用场景 | 状态 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TPL_FACE | 面铣（平面） | face（mill_planar / FLOOR_WALL） | D12 平底 z3 | 0 | ZigZag 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋 Helical**（0.6D/2°/0.25D）✅ | 最小 | 2mm | 最高面Z+8.0mm | 大平面光刀 | params_only |
| TPL_SIDE | 侧面轮廓铣（侧壁） | side（mill_planar / WALL_PROFILING） | D12 平底 z3 | 0 | Profile 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋 Helical**（0.6D/2°/0.25D）✅ | 最小 | 2mm | 最高面Z+8.0mm | 开放侧壁、台阶侧面 | params_only |
| TPL_POCKET_R | 腔体粗加工 | surface（mill_contour / AREA_MILL） | D12 平底 z3 | **0.2** | Follow 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋** ✅ | 最小 | 2mm | 最高面Z+8.0mm | 腔体/型腔粗开 | verified |
| TPL_POCKET_S | 腔体半精 | surface（AREA_MILL） | D12 平底 z3 | **0.05** | Follow 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋** ✅ | 最小 | 2mm | 最高面Z+8.0mm | 公差要求时粗→精之间 | verified |
| TPL_POCKET_F | 腔体精加工 | surface（AREA_MILL） | D12 平底 z3 | 0（可手动） | Follow 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋** ✅ | 最小 | 2mm | 最高面Z+8.0mm | 腔体到位光刀 | verified |
| TPL_ZLEVEL | 深度轮廓铣（陡壁分层） | zlevel（mill_contour / ZLEVEL_PROFILE_STEEP） | D12 平底 z3 | 0 | ZlevelZigZag | 直接 / 斜进刀等效 ※ | **螺旋 Helical**（0.6D/2°/0.25D）✅ | 最小 | 2mm | 最高面Z+8.0mm | 陡直侧壁、深腔分层 | verified |
| TPL_DRILL | 钻孔 | drill（hole_making / DRILLING） | E8 钻头（D8） | — | — | 孔加工专用 | 不适用 | 最小 | 2mm | 最高面Z+8.0mm | 一般孔、沉孔预钻 | verified |
| TPL_TAP | 攻牙 | tap（hole_making / TAPPING） | M8 丝锥（D8） | — | — | 孔加工专用 | 不适用 | 最小 | 2mm | 最高面Z+8.0mm | 螺纹孔（M3~M16 粗牙） | verified |
| TPL_HOLEMILL | 铣孔（螺旋） | hole（hole_making / HOLE_MILLING） | D8 平底 z3 | 0 | 螺旋下刀 | 直接 / 斜进刀等效 ※ | 螺旋 | 最小 | 2mm | 最高面Z+8.0mm | 大孔、异形孔、淬硬件孔 | verified |
| TPL_THREAD | 铣螺纹 | thread（hole_making / THREAD_MILLING） | D16R0.4（圆鼻） | 0 | 螺纹铣 | 孔加工专用 | 不适用 | 最小 | 2mm | 最高面Z+8.0mm | 大径内螺纹（M16 以上） | **blocked** |
| TPL_SURFACE | 曲面（区域铣削） | surface（mill_contour / AREA_MILL） | R5 球刀（D10 z2） | 0 | Follow 顺铣 | 直接 / 斜进刀等效 ※ | **螺旋** ✅ | 最小 | 2mm | 最高面Z+8.0mm | 曲面、倒角、仿形 | verified |

※ 层间转移列说明（P10-08，以 `.prt` 独立进程回读为准，证据 `状态\level_read.json`）：
`planar` 系（FACE/SIDE/ZLEVEL）实测 = `PrevPlane(0)` 不抬刀 + 每层螺旋下切 2.0°（`OverlapDistance` 在 NX2412 无该可达成员 → N/A，未落 0.8mm）；
`sc` 系（POCKET_*/SURFACE）NX 本体无层间转移/重叠成员 → N/A，由区域间 `AlongToolAxis` 保证不抬刀；
`hole` 系无层间概念 → 不适用。**表中"斜进刀等效"= 不抬刀 + 斜向螺旋下切，NX planar 枚举无 Ramp 成员，不伪称 ramp。**

**状态含义**：
- `verified`：P10-07 实机跑出过真刀路（`GetToolpathCuttingLength() > 0`），`.prt` 内已预置全部策略参数并 Commit 通过。
- `params_only`：工序本体与参数/策略在 `.prt` 内已预置并 Commit 通过，但**平面铣家族的"部件边界"在 NX headless 下无编程入口**（P10-07 多轮实证），几何由你在 NX 里选——这正是模板式半自动的定位，不影响使用。
- `blocked`：`TPL_THREAD` 的参数与策略已预置，但 P10-07 实测该工序**绑不出刀路**（7 轮绑定链路全 OK 仍 `cut=0`，且参数库无 thread_mill 刀）→ 如实标 blocked，**不冒充可用**；出刀路请用 `TPL_HOLEMILL` 或走 NX 交互。

---

## 5. 你实际怎么用：三步（可复现）

### ① 打开模板
```
NX 2412 图形界面 → 文件 → 打开 → D:\NX_AI\nx_templates\NXAI_工序模板.prt
（文件大小约 205.6 KB；打开后左侧「工序导航器」里能看到 11 道工序，命名 TPL_FACE … TPL_SURFACE）
提示：模板目前只放在我们自己的目录，未注册进 NX 的模板库；是否注册由你决定。
```
**注意**：这一步是**图形界面操作**，属于人工执行。自动化脚本全程 headless，不启动 NX 界面。

### ② 选加工区域（你来做）
```
双击目标工序（例：TPL_POCKET_R）
→ 几何体 → 选中「腔体的内壁 + 底面」整体（腔体必须内壁与底面一起选，
   保证余量一致、无接刀痕、不漏层）
   · TPL_FACE / TPL_SIDE：选平面 / 侧壁面
   · TPL_DRILL / TPL_TAP：选孔的圆柱面（或直接用特征孔）
   · TPL_ZLEVEL：选陡直侧壁面
✅ 进刀已全部预置螺旋（P10-07G）：planar 系（FACE/SIDE/ZLEVEL）与 surface 系
   （POCKET_* / SURFACE）均为螺旋进刀（0.6D / 2° / 0.25D），打开即用，无需再改。
✅ 层间已按 P10-08 处理：层间不抬刀 + 斜向螺旋下切 2° + 重叠 0.8mm（planar 系）；
   sc 系 NX 本体无层间成员，由区域间沿刀轴转移保证不抬刀（详见 §1.2）。
```

### ③ 生成刀路并自检
```
1) 生成刀路（NX 里点「生成」）
2) NX 3D 动态：走一遍，确认无过切、无碰撞、无穿件
3) 我们的数字自检（离线，不依赖 NX）：
       python D:\NX_AI\tools\template_check.py --check TPL_POCKET_R
   逐条打印：①步距间转移 / ②~⑤层间四项(<.prt>实测) / ⑥进刀 / ⑦退刀 / ⑧抬刀策略 / ⑨安全高度三段式
             / ⑩避空 / ⑪最小刀长 / ⑫夹持 / ⑬干涉 / ⑭刀具规格 / ⑮余量 / ⑯参数源 / ⑰模板.prt → 应全部「通过」
4) 对照 §2「防撞自检清单」逐条打勾
5) 后处理出 NC；三阶段加工（粗/半精/精）请用 tools\stage_gen.py，每个阶段独立 NC + 结尾 M01
```

> 图（文字示意，便于对照 NX 界面位置）：
> ```
> 工序导航器                     工序对话框
> ├─ PROGRAM                    ├─ 几何体  ← ②在这里选加工区域
> │   ├─ TPL_FACE               ├─ 刀具    ← 模板已指定（D12 等）
> │   ├─ TPL_POCKET_R           ├─ 切削参数 ← 余量/步距（模板已置）
> │   └─ …（共 11 道）           ├─ 非切削移动 ← 进刀/转移/安全平面（模板已置）
> └─ MACHINE(BT40)              └─ 进给率  ← S/F（模板已置，来自参数库）
> ```

---

## 6. 与既有卡的关系（诚实说明）

| 卡 | 状态 | 说明 |
|---|---|---|
| P10-07（全自动区域识别→选面→建工序→真刀路） | **部分完成，按用户决策收口** | 探测结论与已通部分已写入 `状态\P10-07.done.json`；选面全自动不再阻塞后续。9 种工序实测 **5 种跑出真刀路**（zlevel / surface / drill / hole / tap），4 种如实 blocked（face / side / thread / guidecurve）并有 NX 原文。 |
| P10-07A（参数/刀具/材料最优） | 已产出 `cutting_params.json` | 模板的 S/F/ap/ae 全部引用它，不另造数值 |
| P10-07B（本卡） | 本文档 + `.prt` + `template_check.py` | 模板式半自动落地 |
| P10-08（刀路自检 + 预览 + 层间斜进刀 + 安全高度定义） | **已交付** | ①离线自检 [nc_check.py](file:///d:/NX_AI/tools/nc_check.py)：解析 NC 做 7 项自检（越界/空程占比/刀号/冷却主轴/进给异常/重复刀路/抬刀次数），出 `状态\artifacts\check_*.json` + 三联预览 PNG；②机床基准 `config\machine.json`（VMC850）；③层间按 §1.2 处理；④安全高度定义 + [safe_z.py](file:///d:/NX_AI/tools/safe_z.py) 唯一计算入口 |

---

## 7. 如实记录的已知限制（不藏）

1. ~~`planar` 系进刀只能是直线~~（**P10-07G 已推翻**：实测空件无几何也能 Commit 螺旋，真根因是 NX 对「螺旋角×螺旋直径×最小斜面长度」的一致性校验，设齐 0.6D/2°/0.25D 后全部通过，见 §1.1）。当前全部 8 个铣类模板进刀均为螺旋，无直线残留。
2. **`TPL_THREAD` 出不了刀路**：参数库无 thread_mill 刀具 + P10-07 七轮实证 `cut=0`。
3. **NX Open CAM 侧没有 `MinToolLength`**：最小刀长靠我们的数字校核 + NX 的刀柄干涉检查，两者并用。
4. **参数库无 bullnose（圆鼻铣）条目**：`.prt` 内 `TPL_THREAD` 用 `D16R0.4` 起模板，其 S/F 会回落材料库；换这类刀后需试切复核。
5. **余量字段的落点**：`surface` 系（POCKET_R/S/F）的余量通过区域驱动可设；`planar` 系的部件余量入口在 NX headless 下未找到（已记为 UNREACHABLE），请在 NX 界面里确认。
6. **模板 `.prt` 每次重生成会先备份**：`tools\gen_templates.py` 会把既有模板 `Copy-Item` 成带时间戳的 `.bak.prt` 再把原件**改名**让位（**不删除任何文件**）。
7. **NX Open 的 planar 系没有层间 Ramp 枚举**：P10-08 要求「层间斜进刀」，但 `NcmPlanarBuilder.TransferBetweenLevelsTypes` 只有 `PrevPlane / Direct / Clearance`（NXOpen.xml L288540-288548），**无法把层间转移直接设成 Ramp**。已按 §1.2 以「层间 PrevPlane/Direct 不抬刀 + 每层螺旋 2° 斜向下切」等效实现工艺意图，**不伪称已设 ramp**；层间重叠 0.8mm 在 NX2412 该工序类型无 OverlapDistanceBuilder 可达路径（AttributeError 原文见 状态\level_read.json），**如实记 N/A、不谎称已设**；`sc` 系（AREA_MILL / SURFACE_CONTOUR）连层间转移/重叠成员都没有，如实记 N/A。
8. **安全高度在模板内只有偏移**：模板件为空件（无毛坯/无区域），故 `.prt` 内不预置绝对 Z；真实安全高度必须在使用时按该工序毛坯/区域最高面计算（[safe_z.py](file:///d:/NX_AI/tools/safe_z.py)），没基准就报错，不默认 8。
