# FreeCAD CAM Path 原生 Oracle 实施说明

更新时间：2026-08-07

这份说明覆盖浏览器 CAM 对标所需的三类原生证据：FreeCAD Path 算法回放、Qt CAM 工作台动态状态、以及 `Path::Feature` / `Path::FeaturePython` 的 FCStd 保存与恢复。当前 Web 编辑边界是经 FreeCAD 重开验证的原生 `Path::Feature` 命令资源子集；Python-backed 对象仍只读且不执行代码。

## 参考环境

- FreeCAD：1.1.1，源码提交 `0108fd4b4850cc46e625b60e53cea7a7bbe69f8d`
- 构建：`.cache/freecad/install-desktop/bin/FreeCAD`
- GUI：通过 `xvfb-run` 启动，`GuiUp=true`
- Qt：运行时采集为 6.8.2
- CAM 模块：`PathApp.so`、`PathGui.so`、`PathSimulator.so` 均来自桌面构建

## 已完成的原生证据

| 能力 | 证据 | 状态 |
| --- | --- | --- |
| 原生 Profile 算法 | `Mod/CAM/CAMTests/test_profile.fcstd`，真实 `Path.Op.Profile` 覆盖工具补偿和无补偿两种场景；每种生成 32 条命令，其中 20 条切削命令；命令按 0.01 mm 数值容差规范化并锁定 SHA-256 | verified-2-scenarios |
| 原生 Helix 算法 | `Mod/CAM/CAMTests/test_holes00.fcstd`，0.9 mm 刀具、9 个 base 子元素，覆盖 Inside/Outside 与 Climb/Conventional 四种组合；每种包含 1260 条原生 G2 或 G3 弧命令并验证 CW/CCW 方向 | verified-4-scenarios |
| Qt 动态 oracle | 激活 `CAMWorkbench`，读取 56 个实时 `CAM_*` 命令、QAction 文本/图标/快捷键/注册状态、菜单和工具栏；并通过真实 `setEdit()`、QDialogButtonBox OK/Cancel、14 个 Task 字段和关闭回放验证 Job/Profile Task 生命周期 | verified |
| 原生 Path FCStd | 创建 `Path::Feature` 与 `Path::FeaturePython`，保存、重开、修改路径和属性、再次保存并重开；`Path::PropertyPath`、5/6 条命令和标签均被 FreeCAD 恢复 | verified |
| Web Path 编辑与透明往返 | Facade 对 `Path::Feature` 解码/重写 `.nc` 资源；显式 `allowFeaturePython` 时也可对 `Path::FeaturePython` 只改 `.nc` 资源，追加命令后由 FreeCAD 重开验证 5→6 条；脚本和 XML 仍保持不执行/不改写 | verified-safe-resource-only-opt-in |

结构化结果在 [`config/freecad-cam-path-oracle.json`](../config/freecad-cam-path-oracle.json)。生成和校验脚本分别是 [`scripts/run-freecad-cam-path-oracle.ts`](../scripts/run-freecad-cam-path-oracle.ts)、[`scripts/freecad-cam-path-oracle.py`](../scripts/freecad-cam-path-oracle.py) 和 [`scripts/check-freecad-cam-path-oracle.mjs`](../scripts/check-freecad-cam-path-oracle.mjs)。

## 复跑和门禁

```bash
./npmw run probe:freecad-cam-path
./npmw run check:freecad-cam-path
./npmw run test:freecad-cam-path-report
```

`probe` 会在 `.cache/freecad/cam-path-oracle/` 生成源档案、变更档案和 Web 透明副本。报告中的 FCStd 完整性哈希是重开后 Path 对象语义哈希；运行时仍比较透明副本和源档案的完整字节。Profile 命令使用 0.01 mm 规范化，避免 OCCT 在 1e-6 mm 级别的浮点抖动造成假差异。连续两次完整 probe 的报告语义结果稳定。

## 任务安排

| 任务 | 交付物 | 当前状态 | 后续验收 |
| --- | --- | --- | --- |
| ORA-CAM-PATH-01 | Profile/Helix 等 Path 算法原生 fixture 与规范化黄金 | in_progress（Profile 2 场景 + Helix 4 场景） | 继续扩展 Drilling、Pocket、Surface 等工序的输入、失败和版本黄金 |
| ORA-CAM-PATH-02 | Qt 工作台命令、QAction、菜单、工具栏、选择上下文和 TaskPanel 生命周期采集器 | completed（56 命令 + Job/Profile 生命周期） | 扩展更多工序的字段/校验/焦点黄金 |
| ORA-CAM-PATH-03 | 原生 `Path::Feature` / `Path::FeaturePython` FCStd 双向保存恢复 | completed（native-native） | 增加 Job、ToolController、SetupSheet 和 Dress-up 对象 |
| ORA-CAM-PATH-04 | Web Facade `Path::PropertyPath` 结构化解码/编码与可编辑事务 | completed（Path::Feature + FeaturePython 安全资源 opt-in） | 扩展 Job/Operation 对象、属性/重算语义和 Undo/Redo；不宣称完整 operation-object 语义 |
| ORA-CAM-PATH-05 | FreeCAD Path 与 OpenCamLib/CAMotics 的连续差分 | pending | 版本锁定、同一 stock/tool/path 输入、体积/碰撞/时间差分 |

## 明确边界

当前 Web Facade 对 `Path::Feature` 提供结构化 `Path::PropertyPath` 解码/编码；对 `Path::FeaturePython` 只有显式 `allowFeaturePython: true` 才开放同样的资源级编辑。两者都只允许修改已有 native `.nc` 资源的命令列表，资源路径、版本和 Center 元数据保持不变；XML、脚本和 Python 代码从不执行或改写，编辑后由 FreeCAD 重开验证。算法 oracle 当前只覆盖 2 个 Profile 场景和 4 个 Helix 场景；完整 Path 操作对象、FeaturePython 属性/重算语义、其余工序算法、Undo/Redo 和全量 Qt Task 行为仍未达到 exact parity，整体报告的 `exactParityClaim=false`。
