﻿P10-01 工作台：零件数据过期治理（用户实测反馈）

## 背景（用户真实反馈，不是推测）
用户在工作台把零件换成 7-17.prt 后点「① 出工序单」，生成的工序单顶部仍显示
旧零件「后盖铝板-LQD80-镜像-175电机」。原因：出单命令固定传
`--facts 状态\_demo_facts.json`，而该 facts 是旧零件探测留下的缓存，
换零件后没有重新探测，单子内容与零件不符。
另外用户点「② 建刀具 / ③ 建程序组」无反应，实测原因是零件路径写成了
不存在的 `7-17-7-17.prt`（真实文件是 `7-17.prt`），代码在 File.Exists 处静默退出。
后处理时还撞上刀具号 T=0 被拦（刀具号未设置），说明缺少前置校验。

## 必须做的三件事

### 1) 新增「重新探测当前零件」能力
- 找到仓库里生成 `状态\_demo_facts.json` 的现有脚本（在 tools\ 下搜 facts 产出者），
  通过 `core\nx_launch.ps1 -Mode journal -Journal <该脚本>` 对**当前零件**重跑，
  参数名必须是 -Version -Mode -Journal -JournalArgs -LogDir -TimeoutSec（已核实）。
- 在工作台加按钮「④ 重新探测零件」（按钮编号顺延，不要撞已有 ①-⑦）。
- 探测完成后把 facts 的生成时间与零件全路径写进日志。
- 若找不到现成脚本，就新建 `tools\probe_part.py`，用 NXOpen 读出
  实体数 / 包围盒 / 特征数 / 材料，写成与现有 facts 相同的 JSON 结构。
  不允许伪造数据。

### 2) 出单前的过期检测（关键，防止再出错单）
- 读 `状态\_demo_facts.json` 里记录的零件名/路径，与工作台零件框比对。
- 不一致时**不要静默出单**：弹 YesNo 对话框
  「当前数据来自 <旧零件>，与所选零件不符。是否先重新探测？」
  选 Yes 就走第 1 步，选 No 才继续出单（并在日志里标注"使用过期数据"）。

### 3) 零件路径与刀具号的前置校验
- 零件路径不存在时，除了弹框，还要在**日志区写一行红字说明**
  「零件不存在：<路径>」，不能只在 MessageBox 里说（用户会以为是卡住）。
- 出程序前检查工序里刀具的 T 号：若为 0 或未设置，日志区提示
  「刀具 <名> 未设刀具号，后处理会出 T0，请先在 NX 刀具里填刀具号」。

## 验收（必须给证据，不接受自述）
1. `NXAI启动器.exe --selftest` 或等价的命令行自测：用**两个不同零件**的 facts，
   验证第 2 步的过期检测能正确触发（把实际输出贴进 verify）。
2. 工作台截图或日志片段，证明新按钮存在且能调用到探测脚本。
3. 门禁全绿：
   - `python D:\NX_AI\tools\check_py_syntax.py` 0 错误
   - `python D:\NX_AI\tests\run_eval.py` 21/21
   - 全部 `tests\test_*.py` 通过
4. 每加一个 .py 必须有 `P2-02 控制台编码护栏` 字面量（中文原文），否则测试会红。

## 约束
- 不要动 `D:\NX_AI\cloud\` 和 `core\license.py`。
- 不要动 `E:\Program Files\Siemens\NX*`（那是只读红线）。
- 不要改 `nx_post\` 下的后处理文件（已验证在 NX2412 上打不开，另行处理）。
- 完成后写 `D:\NX_AI\状态\P10-01.done.json`，字段：status=done、verify=实测证据全文、
  notes=改动文件清单、files=新/改的文件路径。

## 参考
- 工作台源码：`D:\NX_AI\app\NXAIStart.cs`（我的版本，含 ①-⑦ 按钮与日志区）
- 编译命令：csc /target:winexe /codepage:65001 /out:"D:\NX_AI\NXAI启动器.exe"
  /r:System.Windows.Forms.dll /r:System.Drawing.dll /r:System.Core.dll app\NXAIStart.cs
- 编译前先 `Get-Process NXAI启动器 | Stop-Process`，否则文件被占用
