﻿P10-06 材料分族 + 按族匹配 S/F/ap/ae

## 用户需求（2026-10-20 01:05）
「材料要区分一下、不锈钢、铝件、模具钢等差别不大的归为一类，查网上数据，
好匹配转速、进给、AP 和 AE」

## 现有基础
`data\rules\rule_engine.py` 已有 SpeedFeedTable；`data\std\tapping_speed.json` 已有攻牙
N 组 vc=12.5 m/min（用户车间值，**不要覆盖**）。
评测 21/21 依赖现有材料键的具体数值 —— **本卡只允许"新增族 + 映射"，不得改动现有材料键的既有数值**，
否则 run_eval 会红。改完必须复跑评测证明 21/21 不变。

## 一、材料分族（把差别不大的合并）
在 `data\std\material_families.json` 新建，字段：
family_key / 显示名 / ISO 组 / 包含材料（含别名）/ 硬度区间 / Vc范围 / fz范围 /
ap 系数（×D）/ ae 系数（×D）/ 备注。内容如下（数值为刀具厂商样本的**参考区间**）：

```json
{
  "AL":  {"name":"铝及铝合金","iso":"N","materials":["6061","6063","7075","5052","5083","LY12","ADC12"],
          "hardness":"HB 60-120","vc":[200,500],"fz":[0.05,0.12],"ap_D":[1.0,2.0],"ae_D":[0.3,0.6],
          "note":"易粘刀，务必大流量冷却；7075 取区间中上"},
  "ST":  {"name":"普通碳钢/软态模具钢","iso":"P","materials":["45#","Q235","S50C","P20","718","738","2738","1045","S136(退火)"],
          "hardness":"HB 150-250","vc":[100,180],"fz":[0.05,0.10],"ap_D":[0.8,1.0],"ae_D":[0.3,0.5]},
  "STH": {"name":"预硬模具钢","iso":"P","materials":["NAK80","718H","738H","2316","2738H","P20H","S136H"],
          "hardness":"HB 260-330","vc":[70,120],"fz":[0.03,0.08],"ap_D":[0.5,1.0],"ae_D":[0.2,0.4],
          "note":"预硬状态，ap 不要照搬软钢"},
  "SS":  {"name":"不锈钢","iso":"M","materials":["304","316","316L","321","201","17-4PH(固溶)"],
          "hardness":"HB 150-220","vc":[40,120],"fz":[0.03,0.08],"ap_D":[0.5,1.0],"ae_D":[0.2,0.4],
          "note":"加工硬化，禁止小进给停留刮擦；304 常用 vc 60-90"},
  "HRC": {"name":"淬硬钢","iso":"H","materials":["SKD11","DC53","CR12MoV","SKD61(淬火)","HRC45-62"],
          "hardness":"HRC 45-62","vc":[30,80],"fz":[0.02,0.05],"ap_D":[0.1,0.3],"ae_D":[0.05,0.15],
          "note":"硬铣，小 ap 小 ae，多用球刀/圆鼻刀"},
  "CI":  {"name":"铸铁","iso":"K","materials":["HT250","HT300","QT600","GG25"],
          "hardness":"HB 180-260","vc":[100,200],"fz":[0.05,0.12],"ap_D":[1.0,1.5],"ae_D":[0.3,0.5],
          "note":"干切或微量冷却，注意粉尘"},
  "TI":  {"name":"钛/高温合金","iso":"S","materials":["TC4","Ti-6Al-4V","GH4169","Inconel718"],
          "hardness":"HB 300-400","vc":[30,60],"fz":[0.02,0.05],"ap_D":[0.3,0.8],"ae_D":[0.1,0.25],
          "note":"低转速大进给，严禁高速轻载"}
}
```

## 二、计算规则（写进 rule_engine，新增通道，不替换旧通道）
```
rpm  = 1000 * Vc / (π * D)          Vc 取族区间内与材料硬度对应值（线性插值）
F    = rpm * fz * z * 有效齿系数      z = 刃数（刀具库取），无则按 4 齿估算并标注
ap   = ap_D_low * D（粗）/ 精加工按阶段系数缩小
ae   = ae_D_low * D（粗）
```
- 族内材料用"硬度归一化位置"在区间内插值：硬度越低取 Vc 上限，越高取下限。
- `加工阶段` 与 P10-05 联动：
  粗加工 ap/ae 取族区间下限值（保守），半精取 0.4~0.6 倍，精加工 ae 取 0.05~0.1D（保光洁度）。
- 计算出的值若超出族区间 → 日志标 `[超出族区间]` 并给出建议，不静默采用。

## 三、工序单与工作台
- 工序单顶部显示 `材料：6061 → 族 AL（铝及铝合金）｜Vc 区间 200-500`，
  让人一眼看出"这组参数是按哪一族算的"。
- 工作台增加材料下拉（按族分组，如 "铝件 / 6061"），选族后自动带出建议 Vc 区间。
- 允许用户手动改 Vc/fz（走 overrides），改了之后**永久记忆**里带原因，下一次同类零件复用。

## 四、单位与来源必须写清
- 每个族在 JSON 里加 `"source":"刀具厂商样本参考区间（Tungaloy 立铣刀样本 / OSG、Ingersoll 切削数据手册）"`，
  并在 `docs\使用手册.md` 新增一节「材料分族与参数来源」贴出区间表。
- 明确声明：**区间是参考值，不替代试切**；首件必须空跑或小切深验证。

## 五、验收（必须实测证据）
1. `data\std\material_families.json` 实际内容（7 个族，含 source 字段）
2. 对同一零件的同一把 D12 刀，分别按 AL / ST / SS / HRC 四个族算出 S/F/ap/ae，
   贴出**四组数值对比表**，并说明是否符合族区间（用 rpm=1000Vc/πD、F=rpm·fz·z 手算核对至少两组）
3. 证明旧材料键数值未被改动：`run_eval` 21/21、漂移 0（贴出输出）
4. 证明 304 与 6061 给出**明显不同**的参数（不锈钢必须显著低于铝）
5. 门禁全绿：check_py_syntax 0 错误、所有 tests\test_*.py 通过
6. 新增 .py 必须有 `P2-02 控制台编码护栏` 中文原文

## 约束
- **不得改动现有材料键的既有数值**（评测基线依赖），只新增族与映射
- 不改 `data\std\tapping_speed.json` 的 N 组 12.5（用户车间值）
- 不改 NX 安装目录、cloud\、core\license.py、nx_post\
- 完成后写 `状态\P10-06.done.json`
