Files
FreeCADWasmDev/docs/current/FREECAD_WEB_MIGRATION_ANALYSIS.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

74 lines
3.8 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.
# FreeCAD 1.2 Web/WASM 技术基线
## 执行铁律
- 浏览器测试只执行 Google Chrome(桌面 Chrome 或 Chrome 移动设备仿真);Firefox、WebKit 和 Safari 不执行、不纳入当前矩阵、不作为发布阻断项。
- 既有 Firefox/WebKit/Safari 记录只作历史追溯,不能作为当前 Chrome 通过或失败的替代证据。
- 每个浏览器任务卡必须明确 Chrome 版本、运行模式、viewport 和证据文件;若 Chrome 不可用,任务应保留首个环境错误并停止,不切换到其他浏览器掩盖缺口。
> 稳定背景文档。执行者通常不需要通读本文件;先读当前任务卡和直接前置证据。
> 上下文预算与状态协议见 [`FREECAD_WEB_CONTEXT_PROTOCOL.md`](FREECAD_WEB_CONTEXT_PROTOCOL.md);当前续接见 [`FREECAD_WEB_HANDOFF.md`](FREECAD_WEB_HANDOFF.md)。
## 目标与边界
唯一产品基线是当前 checkout 的 FreeCAD 1.2,目标按源码完整对标,不以查看器或少量 Part 功能替代桌面能力。未实现能力保持 `pending`,只有 gate 能晋级里程碑。
必须满足:
1. 每个任务只关闭一个可观察合同,失败可从日志和产物续接。
2. 浏览器主线程只负责 UI/渲染,文档与几何运算在 Worker 串行执行。
3. FreeCAD Document 是权威状态,前端状态只保存投影。
4. FCStd 是主文档格式,OPFS/缓存不改变文件语义。
## 源码与依赖基线
| 项目 | 值 |
|---|---|
| 源码 | `FreeCAD/freecad-source` |
| revision | `4f4e9244e613ea2df06e70027074a562695048cb` |
| CMake | `1.2.0dev` |
| OCCT / Qt / Python / Coin3D | `7.6.3 / 5.15.13 / 3.12.3 / 4.0.2` |
| Emscripten | `3.1.6` |
| 依赖锁定 | `FreeCAD/FreeCADBaseLib/sources.lock.tsv` |
已验证:OCCT、QtCore/QtXml、CPython、PyCXX、XercesC、zlib、Boost 具备 WASM 静态产物;FreeCADBase/App/Part/PartDesign/Sketcher 核心归档可构建;STEP、Worker、Three.js、OPFS、网格缓存通过 P1;Part 类型和 Document 生命周期通过 P2.1/P2.2;FCStd、事务、Undo/Redo 和中断恢复通过 P2.3。
## 目标架构
```text
Browser UI (React/TypeScript + Three.js)
|
v
Typed FreeCADWebFacade messages
|
v
Dedicated Kernel Worker (Document actor -> C++/OCCT WASM)
|
v
OPFS (FCStd, imports, recovery, mesh cache)
```
- 一个文档只由一个 Worker 修改;消息按 request id 在单一队列顺序执行。
- C ABI 只暴露稳定句柄、值类型和错误字符串;JS 不持有原生指针。
- 网格使用 transferable typed arrays;B-Rep 和 Document 留在 Worker。
- 缓存失败不得阻断导入或重算。
## 构建与合同边界
`FREECAD_WEB` 是显式入口,桌面默认配置不变。最小闭包为 `FreeCADBase`、`FreeCADApp`、`Materials`、`Part`、`PartDesign`、`Sketcher`、`Import`、`Measure`。新增模块按“依赖 probe -> 静态注册 -> C ABI contract -> 浏览器 slice -> gate”进入。
运行时合同包括:C++/OCCT 异常固定错误返回、幂等初始化、整数句柄、稳定类型/属性校验、FCStd 临时文件校验后原子替换、导入参数与源文件 hash 绑定。P2 只提供 Document 生命周期所需的嵌入 Python;P4 才建立受限 Python Worker、静态工作台注册和插件包格式,不承诺 PySide/Pivy/桌面动态模块直接可用。
## 风险控制
| 风险 | 必须留下的证据 |
|---|---|
| Python/Qt 隐式依赖 | 链接与运行时 probe |
| 类型重复注册 | 幂等计数与多次调用 smoke |
| FCStd 损坏 | 保存、关闭、重开、对象/属性校验 |
| 拓扑漂移 | 稳定 id、子元素映射、回归模型 |
| 浏览器内存/卡顿 | 初始、增长、峰值、释放和 Worker 性能预算 |
| 工作台遗漏 | 源码生成的 P3 对标矩阵 |
历史调查和早期任务记录:`FreeCAD/docs/archive/`。