5.1 KiB
PartDesign 旋转交付与边特征阻塞
2026-09-09 15:45 更新:下文 Fillet/Chamfer 的历史边身份阻塞已经修复,11 项正式业务全部通过。根因为 StringHasher 首次插入误用非法 IndexedName 的数字后缀,导致首次与缓存命中返回不同身份。真实修复、当前证据、连续重算及持久化回归见 partdesign-edge-identity-fix.md;不要继续按下文历史状态领取这个已关闭问题。
2026-09-09 14:20。本轮承接已有 Body、约束草图、Pad/Pocket 文档链,新增 Revolution、Groove 的正式业务验收。Fillet、Chamfer 已接线且首次创建/参数编辑可运行,但基体长度变化后的边身份恢复失败,仍未完成。
已交付
- 同一
FreeCADWebPartDesignRuntimeProbe执行原生 Revolution/Groove,保持 Profile、Base、Body Tip、旋转角度、反向和 Body 原点轴引用。 - 实际页面支持创建、参数修改、草图修改后的关联重算、撤销重做、FCStd/OPFS 保存重开、继续编辑及删除。桌面 1440x1000、手机 390x844 的画布像素、截图和旋转交互检查通过。
- 四个特征源文件原来没有启用 WASM
-fexceptions。首次 Revolution 的“没有前置实体”原本由 C++ catch 正常处理,却在 WASM 越过了回退。按源文件补齐编译选项,未改写桌面特征算法,也未重编译 OCCT。 - 页面选择状态与网格上传分开,选择对象不再重复上传整个文档网格或强制重新适合视图。编辑仍通过现有 Worker 调用 native。
验收与耗时
正式报告:business-evidence/49fe8f53be6407b93665782d-20260909T061236810841.json。11 项中 9 项通过,其中 7 项为已有业务回归,新增通过 2 项;失败的 Fillet/Chamfer 保留原生错误与拓扑输出,不能算通过。
| 步骤 | 实测秒数 |
|---|---|
| 四个特征源文件编译,各自 | 4.839 / 4.884 / 4.905 / 5.500 |
| 文档适配源文件最后一次编译 | 9.028 |
| 模块最后一次链接 | 27.689 |
| public 同步 | 1.447 |
| 新业务共享 WASM 加载,一次 | 0.329 |
| Revolution 原生 / 浏览器业务组 | 0.804 / 8.135 |
| Groove 原生 / 浏览器业务组 | 2.707 / 11.855 |
| 正式 11 项混合验收 | 49.642 |
| 已通过两项证据复用 | 0.062 |
| 带互斥保护的未变化构建检查 | 0.105 |
编译可以并行,共享加载不可按每条报告重复相加。最初原生调用实测 Revolution 0.142 秒、Groove 0.347 秒、Fillet 0.266 秒、Chamfer 0.209 秒,只证明对应创建动作,不是完整业务验收。逐次动作及耗时在报告 nativeTiming 中。
本轮约 13:39 开始,14:20 收口记录;上述程序耗时不等于这段墙钟时间。主要开发耗时仍在边身份问题的定位、重复增量链接及相同模块竞争处理上,未能全部消除。成功结果先按混合报告保留,不让两个失败丢弃其余九项成果。
必须继续修复
最小复现已在 tools/partdesign-finishing-business-cases.mjs:矩形 4x8 -> Pad 长度 6 -> Edge1 的 Fillet/Chamfer -> Pad 长度 8。错误发生在依赖重算,不是输入缺失或 OCCT 并行等待。
- 旧引用示例为
;#5:1;:G;XTR;:H...:7,E.Edge1;重算后的基体对应映射变成#5;:G;XTR;:H...:7,E。原生DressUp::getContinuousEdges无法解析旧身份,返回Invalid edge link。 - 只更新变动 Profile/ReferenceAxis,避免无意义链接重写,没有解决这个首错;不能按“修改过代码”宣称解决。
- 已核对
Feature::onBeforeChange、GeoFeature::updateElementReference、PropertyLinkBase::_updateElementReference及TopoShape生成映射路径,但尚未确认更深层命名变化的根因。 trace: true在失败回滚前输出对象的原生边名称,最小输入、断言和数据随报告保留。失败事务回滚,不能通过替换编号或删断言假装依赖成功。- 下一轮直接使用这个复现和定位范围修复,不重做旋转、切槽、DXF、基础实体或 OCCT。
构建互斥
本轮链接收尾出现过不完整对象文件错误,后台同时领取同一个模块。为完成稳定构建,曾暂停该后台回合,之后已恢复全部相关进程。后续不能依靠反复暂停或重启解决竞争。
tools/web_build_lock.py 已接入 run_module_batch_pipeline.py 与 build_web_module_artifacts.py:按 CMake 构建目录加排他锁,等待单独记录,编译/链接子进程继承锁,阻止这两处入口互相覆盖。同一构建目录的其它模块也共享库和 Ninja 状态,不能只按目标名加锁。
人工构建使用相同入口:
python3 tools/web_build_lock.py -- cmake --build freecad-source/build-web/configure --target FreeCADWebPartDesignRuntimeProbe -j8
沿用已有 EM_CONFIG 等本地构建环境。锁不自动保护绕过入口的原始 cmake --build,也不代表同步发布已成为 JS/WASM/data 跨文件事务。现有暂存 WASM 校验和原子发布保留。
构建互斥及调度/优先级回归共 104 项 Python 测试通过;接口、Worker 路由、几何边界、产物发布共 23 项 Node 测试通过。TypeScript、增量发布构建及原生 diff 检查通过。