Files
FreeCADWasmDev/docs/current/partdesign-edge-identity-fix.md
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

69 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 原生边身份解阻
16:20 续记:已进一步处理共用分发器造成的全量证据失效,以及复验中发现的 Sandbox 固定样例保存问题,见末节。PartDesign 当前刷新报告为 `business-evidence/49fe8f53be6407b93665782d-20260909T080123703164.json`,原始通过报告继续保留。
2026-09-09。上一轮 Fillet/Chamfer 的 `Invalid edge link` 已修复,PartDesign 11 项业务正式通过。此记录更新 `partdesign-finishing-delivery.md` 中的历史阻塞状态,不删除历史失败证据。
## 根因与修复
原始最小链是矩形草图 4x8 -> Pad 长度 6 -> Edge1 圆角或倒角 -> Pad 长度 8。草图顶点的名称是 `g1v1`、`g1v2` 等,并非 `IndexedName` 接受的纯字母前缀加数字格式。解析器判定名称无效后仍留下数字后缀。
`App::StringHasher::getID(MappedName, ...)` 首次插入无条件取 `indexed.getIndex()`,因此同一字符串首次返回 `#5:1`,缓存命中却返回 `#5`。几何没有丢失边,而是身份编码不一致,导致后续原生 DressUp 找不到原引用。
修复只在 `src/App/StringHasher.cpp` 明确管理经过验证的索引:有效 IndexedName 使用其索引,无效名称使用 0,显式的哈希前缀索引仍保留。没有清空映射、替换 Edge 编号、增加几何算法或重编译 OCCT。后台已有的前缀字节持有改动保留,前缀生命周期并不是本次确认的根因。
原生 trace 现在能展示边、顶点和有限字符串表信息;成功 snapshot 在 `trace: true` 时返回 mappedEdges。正式用例直接比较基体全部 12 条边在长度修改前后的身份,而非只比较体积。
## 真实验证
- 发布版 PartDesign 11 项全部通过:`business-evidence/49fe8f53be6407b93665782d-20260909T073459779307.json`,总耗时 77.311 秒。
- Fillet 与 Chamfer 的创建、尺寸修改、多边选择、错误回滚、基体长度联动、FCStd/OPFS 保存重开、继续编辑和删除均通过,桌面和手机画布像素、截图及旋转交互通过。
- `tools/test-partdesign-edge-identity.mjs` 额外改变基体长度 8/3.5/12/6,每步执行撤销和重做;再改变草图尺寸 5x9、3x6、4x8,最后保存重开并改长度 9。全部原生体积、约束自由度和边身份断言通过,6.119 秒退出。
- 补充回归起初断言已通过,但线程池驻留导致 30 秒超时。现在在独立 Node Worker 内运行真实 WASM,文档关闭后统一 terminate 测试 Worker,正常退出;没有用强制成功退出忽略断言。
- 19 项 Facade、发布及几何边界检查通过,5 项构建互斥检查通过。TypeScript、前端发布构建和原生 diff 检查通过。
- 增加两个 C++ StringHasher 单元用例,检查非法索引前缀重复编码和无索引哈希前缀。本机当前 CMake 测试树没有注册这些测试,`ctest -N -R StringHasher` 显示 0,因此没有把 C++ 单元测试计为已运行;上面的真实 WASM 业务和补充回归已执行。
## 耗时
| 步骤 | 秒 |
|---|---:|
| StringHasher 最后一次编译 | 5.626 |
| 文档诊断适配最后一次编译 | 9.385 |
| 模块最后一次链接 | 26.736 |
| 与后台构建互斥等待,一次 | 35.134 |
| 正式新业务组共享 WASM 加载,一次 | 0.353 |
| Chamfer 原生 / 浏览器业务组 | 3.755 / 11.888 |
| Fillet 原生 / 浏览器业务组 | 3.538 / 11.536 |
| 连续编辑、撤销重做、持久化专项回归 | 6.119 |
| 旧失败命令复用当前证据,各自 | 0.062 / 0.064 |
上述是实际程序步骤,不等于整轮开发时间,也不能重复累加共享加载。源码定位、诊断和编辑发生在 15:12 之后,正式报告生成于 15:34,补充回归和故障对账随后完成。本轮没有暂停后台,也没有重复构建 OCCT。
两条原始失败 `f66c8f92aa533df11704`、`8e0f8b40d1f786372d36` 已用原命令成功结果和现有故障关闭流程确认 resolved,历史错误保留。相同证据指纹有效时直接复用,不再重开这个已修问题。
## 续接边界
直接复用已完成的 PartDesign 文档、草图、Pad/Pocket、Revolution/Groove、Fillet/Chamfer。下一轮继续其它真实特征和文件业务。共用源码修复已经进入当前 PartDesign 产物;其它独立构建目录或模块按其实际受影响业务增量采用,未宣称所有 WASM 已重新链接。
旧版本已经写入错误映射的任意历史文件、任意拓扑改变后的自动修复不在本次证明范围内,不能按 Edge 编号自动重绑定。全项目仍以当前审计和故障对账为准,以上通过不代表整体移植完成。
## 避免全量失效
收口时后台修改 TechDraw 适配,但代码位于 `desktop-command-dispatcher.ts`,使所有模块旧指纹失效,进度曾短暂显示 0。没有删除功能,也没有修改通过标记掩盖失效。
已把 TechDraw 的参数准备、容器路由策略和 native 响应校验移到 `web/src/techdraw-desktop-adapter.ts`,共用分发器只调用模块适配。按原 AST 提取并保持原行为,五项适配/分发回归通过。TechDraw 文件继续纳入自身源码指纹,Web 界面也跟踪模块适配依赖;`tools/test_desktop_adapter_scope.py` 证明模块适配变化不影响无关 Part,真正的共用分发器变化仍使相关指纹失效,没有放宽有效证据规则。
直接批量复验 22 个模块的 95 项既有结果,进程耗时合计 181.933 秒,没有重做实现或重编译内核。Part 和 PartDesign 浏览器组占主要测试时间;TechDraw 在后台已经取得新证据,直接复用。Sandbox 保存发现实际失败后另行修复,未将失败算作成功。BIM/Start 在后台继续变更时,仅刷新对应模块的失效结果。
一项旧调度测试仍要求模块切换先插入历史对账,已更新为现行 `delivery-workflow-first-v3` 的业务优先预期;没有改变调度器回到旧顺序。15 项故障对账测试、10 项业务恢复测试、16 项验收优先级测试以及适配作用域测试通过。
## Sandbox 当前文档保存
复验暴露旧 `fc_web_sandbox_save_reopen` 只创建整数 42 的临时样例,且以“全局文档为空”判断资源释放,不能与保留用户文档的创建流程组合。旧入口保留作历史探针,不再用于业务完成证明。
新增同一现有 Sandbox WASM 中的 `sandbox.saveReopen` 当前文档分支,复用 FreeCAD FCStd 保存/恢复,保存多个对象及其实际整数值,恢复到独立命名文档。`sandbox-document-save-facade.ts` 做输入、结果身份和类型检查;创建、保存、继续编辑通过 `sandbox.worker.ts` 共享同一原生应用实例。无效路径等业务错误保留请求 ID,不清空健康 Worker。生成路由已同步。
验收使用 17、73、99、-2147483648 等值,多个源文档、两个对象、独立重开、修改后再保存、重复目标拒绝、无效输入恢复,并执行真实 Worker 消息处理器(仅加载边界注入公开 WASM)。两项 1.897 秒通过:`business-evidence/6f3f2a7c6162d761539896ea-20260909T081842690432.json`。路由检查使用 TypeScript AST 提取真实路由数据和函数,不依赖旧生成文件的字符串格式。
Sandbox 本轮只增量构建其已有模块,未新增 WASM 或重编译 OCCT;不宣称其浏览器 UI、OPFS 或混合非 Sandbox 对象已经验收。全项目在 16:20 的有效结果为 117/1504,Start 正由后台修改;后续以实时审计为准。