Aira CAD 底座复用、版本兼容与证据体系修正调查:OCAF、Replicad 与 TNaming 接入实测
主文档与完整目录。本分篇保留原调查日期的依据与实测记录;其中的当前状态、建议和授权仅属于历史快照,不是执行队列。
10. 浏览器本地底座:OCAF 与 Replicad 实测接入调查(2026-09-03)
Section titled “10. 浏览器本地底座:OCAF 与 Replicad 实测接入调查(2026-09-03)”用户要求立即调查“OCCT+OCAF、按需采用 Replicad,并重新判断文档、重建、命名机制复用”。
本轮基线为 HEAD 0372efe 加进行中的工作树;其他任务正在修改产品诊断与计划文件。
本轮仅增加研究与隔离实验材料,没有替换产品运行时、改动公开协议/历史数据、调用模型或提交。
10.1 结论与证据范围
Section titled “10.1 结论与证据范围”浏览器路线已从源码可行推进到真实 WASM 可执行。 使用项目锁定的 OCCT 8.0.1、TauCAD 镜像和 Emscripten 5.0.1 编译独立实验,在 Node 和 Codex 内置 Chromium 152 中实际运行 OCAF 文档、命名和 函数依赖更新。Replicad 锁定源码也已在 Node 的真实 WASM 中完成壳体/切孔/收边与失败重试。 实验源码、构建步骤和原始结果位于 实验材料。
这证明成熟机制可用,不证明整套产品替换已经等价:没有将 OCAF、Replicad 和 Aira 共同运行时链接为 同一个产物,没有完成 AMIR 连续编辑、历史兼容、取消、持久化失败与长期内存的替代对照。
| 决策 | 本轮建议 | 原因 |
|---|---|---|
| TNaming | 下一项底座实验优先有限接入真实 Feature Graph | 已证明唯一面更新、分裂结果和删除结果可在浏览器执行;与现有引用演化职责有实质交集 |
| Replicad | 先补同堆绑定并验证一个真实操作适配,合格后退役对应重复封装 | 组合建模已跑通;当前直接接入失败是具体绑定缺口,不能据此继续默认自研 |
| TFunction | 保留成熟增量更新候选,当前不替换小型执行器 | 已验证跳过无关函数,但仍需应用 driver、参数/结果 labels、变更标记和执行循环;净收益未证明 |
| OCAF 主文档 | 保留为完整架构选项;当前不切换 AMIR 权威 | 原生持久化和命令事务可用,但本次重开没有恢复 undo 栈,也不提供 Aira 的跨层原子提交 |
以上是底座复用调查结论,不改写现有原生 AI 连续建模计划的执行顺序。
10.2 已实际运行的 OCAF 能力
Section titled “10.2 已实际运行的 OCAF 能力”构建镜像锁定为 sha256:215198af0e2ca4c5f308e5540869f2419784dc290062d3eb03d34e4f22e0188c。
上游 build-wasm.sh 已启用 BUILD_MODULE_ApplicationFramework=ON;本地镜像确实包含
libTKLCAF.a、libTKCAF.a、libTKBin.a。因此不需要先重编整个 OCCT,实验直接链接已有静态库。
产品当前 graph runtime 实例未暴露 TDF/TDocStd/TNaming/TFunction;“没有绑定”与“无法在 WASM 运行”
是不同结论。
| 实验 | 实测结果 | 对 Aira 的含义 |
|---|---|---|
TDocStd_Document 命令事务 |
宽度 40→48 后 Abort 恢复 40;Commit 后 Undo/Redo 恢复 40/48 | 可复用内部可变文档回滚;原生 Commit 不是 IndexedDB 持久提交 |
BinDrivers::DefineFormat+TDocStd_Application::SaveAs/Open 的 seekable stream |
4,029 字节样本重开后标量为 48,B-rep 有 6 个面且 BRepCheck 有效,保存的选择可解出 1 个面 | 可用字节流适配浏览器存储,不要求桌面文件对话框;本轮仅内存流,没有测 IndexedDB/崩溃恢复 |
| 保存重开后的 undo | GetAvailableUndos() == 0 |
此实验的原生保存没有带回操作撤销栈;不能据持久化 API 就删除 Aira 的持久历史 |
| TNaming 唯一后继 | 修改盒子宽度 40→48,Solve == true,结果与新顶面 IsSame |
应用先提供了旧/新 primitive 顶面角色及 Modify 关系;不是 TNaming 自行推断角色 |
| TNaming 分裂 | 真实贯穿槽 Cut 将顶面分成两个,maker.Modified 提供两个后继;Solve == true,结果含 2 个面 |
成功不等于唯一;需要 cardinality/歧义检查,不能取第一个面 |
| TNaming 删除 | 记录原特征与顶面 Delete;Solve == true,结果为空 |
成功不等于目标存在;必须检查空结果并提供恢复入口 |
| TFunction | 三个倍增函数:初次执行 3 个,修改链首参数执行 2 个,无关分支跳过;无变更执行 0 个 | 原生依赖遍历和 MustExecute 可用;这是标量函数探针,不是复杂 CAD 增量性能证明 |
接口依据为锁定版本的 TNaming_Selector、 TNaming_Builder、 TFunction_Driver、 TFunction_IFunction、 TDocStd_Application; 框架定位见 OCCT 官方 OCAF 指南。
最终独立实验 WASM 为 7,698,865 bytes,gzip 2,880,690 bytes;浏览器该次模块初始化加五项实验约 78.7 ms,Node 约 215 ms。它包含实验用 Box/Cut 和持久化,并非向产品增加 OCAF 的包体差值; 单次数据不是启动基准、峰值内存或稳定时延保证。没有计算“现有 WASM+此大小”作为集成预算。
10.3 Replicad:实际重叠及第一处接入障碍
Section titled “10.3 Replicad:实际重叠及第一处接入障碍”本轮由锁定源码 90d176edde1cf3dec8db189d9228f34625ac84af(包内版本 1.0.1)打包高层库,
使用已安装的 replicad-opencascadejs@1.0.0;高层库仍未成为产品依赖。
连续脚本执行 makeBox → shell → makeCylinder → cut → chamfer,宽度分别取 40 和 48 mm。
两次结果均通过原生 BRepCheck;体积分别为 7093.867258771279 和 8145.8672587712845 mm³,
与该壳体、贯穿底孔和顶缘倒角的解析体积参考差约 2.73e-12 mm³。
两次都成功提取 612 个三角形、20 个面分组。
不存在的长度选择被圆角方法拒绝;源体积未变,随后在受支持竖边上的圆角重试有效。
这里的 40/48 是两次脚本完整重建,不是 Replicad 自带的持久特征图增量编辑,
也没有把当前 Aira 端到端样本完整移植过去;不能宣称 AMIR、语义引用和提交行为已经等价。
源码 shapes.ts 的网格数据来自 Float32 原生缓冲,最终返回 JS Array;不是直接返回 Float32Array,
也不能因 Array 元素是 JS number 就认为保留了原始 double 精度。
同一份高层库 setOC(Aira当前graph运行时) 后,makeBox 实际失败于:
Cannot call gp_Vec.XYZ due to unbound types: 6gp_XYZ。
下一步应先补 gp_XYZ 及该调用链需要的绑定、重新运行,不能假设只补这一项就足够。
当前 Aira graph WASM 为 13,940,096 bytes,Replicad npm baseline 为 22,970,161 bytes;这是两份不同
绑定集合的产物,不是采用高层 Replicad 必然增加约 9 MB。高层库支持 setOC 注入,生产应采用同一
实例;禁止把来自不同 WASM 堆的 TopoDS 句柄直接互传。
另一个可直接复用的能力是 Finder.find(shape, {unique:true}),上游已经检查结果数量,
不能把唯一性检查本身当成 Aira 独有需求;Aira 需要适配其错误与本项目作用域/历史语义。
但当前 fillet/chamfer/shell 的便利结果没有一并返回 maker history,而且部分临时对象依赖
GCWithScope/FinalizationRegistry;存在 .delete()/localGC() 并不证明所有失败分支及时释放。
本轮显式释放探针持有的对象,没有测完整内部临时对象泄漏或峰值内存。
10.4 替换落点和最小边界
Section titled “10.4 替换落点和最小边界”| 真实需求 / 当前实现 | 可复用设施 | 已证实差异与决定 |
|---|---|---|
跨操作传递面来源:exact-shape-history.ts、exact-finish-lineage.ts |
已接的 BRepTools_History;TNaming_Builder/Selector | 关系收集已经使用原生 history,不应再次“重构复用”同一部分。TNaming 可承担命名演化,但仍需生成器角色、Aira ID 投影和结果基数检查 |
图执行排序:exact-feature-graph.ts::orderNodes 与操作循环 |
TFunction_IFunction/Iterator/Logbook | 当前每次执行整个 materialized 节点集合;TFunction 可以筛选受影响函数。仍需维护参数/结果映射与几何/证据缓存;为了替代几十行排序而再建一套文档/driver,尚无收益证据 |
建模便利调用:profile-exact-fillet/chamfer/shell.ts 等 |
Replicad 对应操作、FaceFinder/EdgeFinder | 优先补绑定和 history/显式释放扩展。当前圆角禁止隐式切线链扩展,替代必须保留该接受域或明确新版本语义,不能默默放宽 |
可保存、可回退模型:共享 Exact Session、aira-store.ts |
TDocStd_Document、BinDrivers | OCAF 可序列化内部文档,但未提供现有 revision hash、expectedHead CAS、审阅授权、历史兼容和跨层提交边界;当前不删除这些保护 |
建议首先比较 AMIR 权威+内部 OCAF 命名状态。 保持现有 Interface、共享 Session 和 OCCT
操作入口,将 node/port/selection 映射到私有 label;用现有 maker history 输入 TNaming,结果投影回
原生查询协议。产品接受后应退役对应的重复命名解析,不保留两套长期等价的演化引擎。
不能承诺整个 exact-finish-lineage.ts 可直接删除:其生成面角色与对外来源仍需保留或迁移。
该方案有一个必须正面验证的风险:TNaming 的演化状态不一定能仅从当前参数重新生成。 需证明可以由权威 AMIR 的引用定义、已记录历史与操作历史重放恢复;若必须保存额外命名意图, 它就是模型信息,需要明确持久化/迁移语义,不能称为可随时删除的缓存。 当前原生 stream 保存能恢复 TNaming 选择,但不是“删除 OCAF 状态后仅凭 AMIR 重建”等价的证据。 如果长期维护这种投影比迁移更复杂,应回到“OCAF 为主文档、AMIR/Interface 作投影”的选项比较, 不能用现有代码量保护双重实现。
提交时同样只能有一个产品发布边界:原生文档命令先产生可丢弃的候选;共享 Core/存储确认持久提交
后才能更新用户 head。存储失败要恢复候选前状态;持久化成功而显示重放失败则恢复已提交 revision,
沿用 exact-commit-durability.ts 的区别,不把 OCAF Abort 当成已持久提交的撤销。
10.5 能进入实施的下一小步
Section titled “10.5 能进入实施的下一小步”历史建议,后续已执行调查并改变阶段;不是现行工作包。采用范围见实施计划 §6。
- 同堆绑定验证。 在独立实验产物补齐 Replicad 当前调用链绑定,保留已存在的原生 history、 验证与确定释放能力;不先引入第二份生产 WASM。完整跑过后列出真正能够退役的操作封装。
- 真实命名对照。 以现有壳体→切孔→收边链连接 TNaming,比较原路径与候选的唯一选择、 split/merge、目标删除和歧义;额外验证原生状态被清除后重开、显式重绑和失败回滚。 本轮只覆盖唯一/分裂/删除的独立探针,merge 与完整产品链尚未测。
- 根据净收益决定采用范围。 同一输入/历史下比较正确性、恢复信息、资源释放、包体、延迟和 可退役职责。TFunction 和完整 OCAF 文档迁移独立决策,不将三者捆绑成一次全面重写。
本轮调查已给出可执行证据、确切缺口和接入边界;产品运行时替换仍需按任务授权实施, 不能把上述隔离验证改记为 C1 完成或真实 AI 验收通过。
10.6 实施首批:真实 AMIR 冻结与共同图运行时对照
Section titled “10.6 实施首批:真实 AMIR 冻结与共同图运行时对照”§10.6–10.10 保留当时观测及决策过程;“暂缓”“下一步”不覆盖 §10.11 的后续采纳。
按后续已设定的实施目标 §6.0 开始有限适配。以下是新增证据,不改写 §10.1–10.5 独立调查的历史范围;默认产品替换仍未完成。
真实需求。 在产品创建的壳体→圆孔→指定单边倒角上验证成熟命名与操作封装,而非另建形似的盒子。 复用现有 shared Session 测试,在它完成 Candidate 原生两面交边、提交、40→48 改宽、重开/回退及 无效倒角拒绝后,导出实际 AMIR Revision、编译节点、选择定义和证据。冻结文件与相关源码/运行时摘要 在实验材料。 原内核定向 6 项和实际 Session 的 Chamfer 项均通过;Session 使用 fake-indexeddb,不计为 Chrome 验收。
冻结也暴露了一个现有样本差异:内核 enclosureInput 固定左下原点,产品创建器则固定矩形中心
(20,15)。产品宽度 40→48 时左右边界由 [0,40] 变为 [-4,44],孔中心仍为 (20,15),
因此孔中心距左边从 20 变为 24 mm;距下边维持 15 mm。这里记录的是当前行为,不能把它写成
“固定左边孔距已保持”,也不能静默改写历史参数解释。最终设计关系验收仍须明确所选基准与意图。
上游设施。 同一锁定 OCCT 8.0.1/TauCAD 构建,以现有图 manifest 为输入,追加私有
AiraNamingProbe 的 TNaming_Builder/Selector 调用;转发现有 BRepTools_History,没有重做关系收集。
Replicad 沿用 90d176ed… 的 setOC/cast/Shape3D.chamfer。图执行、选择解析和候选选择身份均消费
既有实现;候选图、TNaming 与 Replicad 的 native Shape 在同一个实例中传递。
已证实差异。 Replicad 的 cast 会提前读取 ReplicadShapeCaster.CompSolid,真实 Cut 的形体封装
又需要 TopoDS_Compound;只补 gp_XYZ 不够。隔离图构建最终额外导出 gp_XYZ、TopoDS_Solid、
TopoDS_CompSolid、TopoDS_Compound,并增加 CompSolid 薄 cast,不更换原生产 WASM。
| 同一冻结输入上的检查 | 结果及边界 |
|---|---|
| 原路径与候选完整图,宽 40/48 | 原生 BRepCheck 有效、13 面;体积分别为 7092.951332235383 / 8148.9513322353805 mm³,解析误差小于 1e-7 mm³;两份图产物的 B-rep hash 也相同 |
| Replicad 从实际 Cut 输出执行指定单边 Chamfer | 两组均通过,选中 1 边,体积符合相同解析值,源体几何签名未变;不代表 history、全部失败分支或内部临时对象确定释放已通过 |
| TNaming 40→48,选择上下文截止 Cut | Select/Solve 均为 true;结果与新目标边 IsSame,与旧边不同;未手工匹配旧/新 Cut 边,primitive 面角色由应用提供 |
| 同一 TNaming 对照包含下游 Chamfer 历史 | Select true、Solve false、结果为空;下游操作会消耗输入边,说明作用域必须明确,不能把所有历史无差别加入查询上下文 |
TNaming 探针先后修正了只转发面种子、未转发其边/顶点历史,以及把 source 的结果结构误当图节点、 未真正登记 primitive 面角色的接线错误。早期未恢复结果不能用于否定 TNaming;最终作用域内通过 也不能外推为任意分裂/合并、删除、持久重建或命名问题已解决。材料保留早期观测并注明适用范围。
隔离候选 WASM 为 14,174,223 bytes / gzip 4,949,604 bytes,比原共同图产物增加 234,127 / 69,216 bytes;包含本轮所有探针和补绑定,不能拆算成单独 TNaming 或 Replicad 成本。 沿用 64 MB 初始/512 MB 最大配置。JSON 中的初始化和重建时间是 Node 单次观测,候选额外保留 history 供观察;WASM buffer 容量不是活对象内存。本轮没有 Chrome 性能、长期内存或取消压力结论。
决定与边界。 首批对照后、按用户要求尽快判断,收敛为以下阶段性裁决;不把尚未测到的能力 宣称为失败,也不为了实现替换数量而强行接库。
| 候选 | 当前裁决 | 依据与重启/继续条件 |
|---|---|---|
| Replicad 替换当前 Chamfer | 暂缓生产接入,停止扩大该适配 | 几何已通过,但当前 Aira 已直接调用 OCCT 的 maker,并非自研倒角算法;Replicad 的便利调用尚不输出 maker history,临时对象还依赖 GCWithScope,内部选边遍历也不同于当前原生索引。必须保留的选择身份、切线传播限制、来源投影与提交保护不会因换库消失。尚未证明净维护收益;不先做一套扩展来制造采用理由 |
| TNaming | 真实命名对照后,暂缓当前旁挂方案 | 改宽和真实边分裂/恢复可执行;删除时必须检查 Solve 失败,不能使用残留旧边。清空 labels 后,本次接线仍需现有 AMIR 解析器初始化选择,未证明可退役该职责;详细证据及重启条件见 §10.7 |
| AMIR、图执行、Candidate、提交历史、AI 接口 | 本轮保留现有权威与共享路径 | 它们不等同于 TNaming 的拓扑演化历史,也不是 Replicad 的操作便利 API。完整 OCAF 文档/TFunction 属于另一项架构比较,不能因“我们写得多”直接推定全部重复 |
Replicad 的重启条件是出现当前薄封装确实缺少的具体消费者,或具备可实测的最小上游扩展,能在 保留 history/诊断/确定释放的同时退役实际职责;届时继续按直接调用→补绑定→薄适配→必要扩展比较。 这不是证明 Replicad 整体不适用,也没有完成其故障矩阵。TNaming 同样不预设最终采用。 默认接线、旧职责退役、故障矩阵及 Chrome 验收尚未完成,完整实施目标保持进行中。
10.7 TNaming:真实拓扑变化与可退役职责判断
Section titled “10.7 TNaming:真实拓扑变化与可退役职责判断”真实需求与上游。 延续 §10.6 的同堆 OCCT 8.0.1/TNaming,比较既有声明式两面交边和私有命名
状态在目标分裂、恢复及删除时的行为。naming-decision.mjs 从冻结 AMIR 派生未提交的几何候选,
仍走现有编译器、PlaneGCS、图执行、原生 history、拓扑索引与选择谓词,没有新增建模算法。
派生样本将主体改为对称拉伸:先用中心孔建立单边选择,再将圆孔移至 (0,0),工具对称拉伸 10 mm
形成边中段缺口;工具延长至 50 mm 则删除整条角边;撤去缺口恢复单边。派生输入及结果完整保存在
naming-decision-results.json。
这组是拓扑变化扩展,不改写冻结 40/48 输入,也不是 shared Session 提交或真实 Chrome 验收。
| 情形 | 现有选择规则 | TNaming 实测 | 产品含义 |
|---|---|---|---|
| 中心孔、单一角边 | 1 条 | 用其建立初始选择 | 当前声明式规则已满足该样本 |
| 角边中段被切去 | 2 条,唯一选择拒绝 | Solve true,返回相同 2 条边 | Solve 成功不等于可提交,必须保留基数与意图检查 |
| 撤去切口,2→1 恢复 | 1 条 | Solve true,返回同一条当前边 | 支持这组恢复;不是任意合并都可自动接受的证明 |
| 整条角边删除 | 0 条,唯一选择拒绝 | Solve false,但 NamedShape 仍含旧边 | 失败时必须拒绝残留结果;不能仅以非空判断成功 |
| 新建空命名文档,从当前 AMIR 重建 | 现有规则可再次找到 1 条 | 由该规则初始化后 Solve true | 可重建,但本接线仍依赖现有解析器;不能记为其职责已退役 |
已证实差异。 当前 AMIR 固化的是有 scope、lineage 精确匹配和基数限制的声明式选择定义;
n.finish.inputs.edges 中没有 TNaming 的持久选择表达式或选取时原生上下文。
exactGraphRevisionSelectionsV04 每次在实际上游图输出上读这些规则;matchExactEdgeRecords
主要匹配已有面绑定的拓扑邻接,并不是另一套完整 TNaming。来源收集也已使用 BRepTools_History。
本次旁挂 TNaming 能追踪这组变化,但需要 primitive 角色、作用域和 history 投影,清空状态后仍
使用现有匹配器初始化。尚未出现既保持公开规则含义、又可删除原解析职责的实际接线。
决定与边界。 暂缓当前 TNaming 历史旁挂方案,停止把该探针直接升级为默认产品。 这不否定 TNaming 的能力,也没有证明所有薄适配都不适用;结论只限当前旁挂架构及已测样本。 重启需满足以下一项:找到现有模型确实需要而当前规则不能表达的持久选择需求,并形成兼容方案; 或给出直接执行现有声明式规则的更小上游适配,实际退役旧职责,而不维护两份等价解析。 若采用原生选择表达式作为模型信息,必须明确持久化、版本及重绑含义;不能藏在可丢弃缓存中。
当前建议保留现有 AMIR 权威、直接 OCCT 薄封装与事务路径,将真实连续建模缺陷作为后续复用的 触发点。完整 OCAF 主文档迁移不能仅由上述探针推导为必要,也不在本轮自动执行范围内。 两候选均暂缓意味着“至少一项默认替换并退役”的目标仍未达成;不能改写验收口径或强行接库。
10.8 更小适配核对与待裁决的后续方向
Section titled “10.8 更小适配核对与待裁决的后续方向”为避免把旁挂方案的成本误当成 TNaming 全部方案的成本,进一步检查锁定源码中的更小入口:
| 上游入口 | 实际语义 | 与当前职责的关系 |
|---|---|---|
TNaming_Tool::CurrentShape |
LastModif 沿 IsModification() 的关系寻找当前形体;支持限定 Updated labels |
不是“所有 Generated/Modified 来源集合”的同义调用,不能直接替换现有 Shell/Boolean/Finish 的全部来源投影 |
TNaming_Tool::GeneratedShape、TNaming_NewShapeIterator |
查询指定命名记录中的生成关系或遍历后继 | 仍需把 maker history 写成命名记录,并维护应用角色及范围;相同原生关系已由当前 BRepTools_History 提供 |
当前 createExactShapeHistory |
在 maker 活着时创建 OCCT-owned history,借用回调访问结果并确定释放;保留 maker 的 IsDeleted 诊断 | 已属于直接复用成熟上游,不能把它当成自研几何历史算法再次“替换复用” |
依据:锁定 OCCT 的 TNaming_Tool.hxx/cxx、TNaming_NewShapeIterator.hxx;项目
exact-shape-history.ts、deriveExactBooleanFaces、deriveShellFaceLineage 和
deriveExactFinishFaceLineage。后几者还维护已发布的 origin 字符串、生成面角色、完整性及结果证据。
单独换一个遍历入口不等于退役这些产品语义,另建与它们等价的 labels 投影也不能算减少维护。
本项是源码语义核对,未新建候选、未测性能;不声称已穷尽所有适配方式。
当前可供用户裁决的建议(尚未改变活动目标): 将后续主线调整为真实连续建模的底座验证与修复, 保留已冻结样本和两项复用结果。先明确孔距基准的设计意图,验证改参、引用失效诊断、显式重绑、 失败/取消、保存重开及回退;对暴露的具体缺口按上游优先顺序选择实现。仅在候选能补齐该缺口或 实际减少职责时采用,不预设替换数量。已验证的契约、授权、事务和其他任务改动继续保留。
该建议改变 §6.0 的“至少一项默认替换”完成条件,已向用户提出,未经确认不写入现行目标。 当前默认替换仍为 0,§6.0 不算完成;用户的尽快判断要求不等于授权缩小完成条件、迁移主文档或提交。
10.9 用户纠偏:恢复成熟库与现有实现的择优比较
Section titled “10.9 用户纠偏:恢复成熟库与现有实现的择优比较”用户明确指出,本任务是在判断成熟库与自研实现哪个更好。此前从“旁挂接线未证明能退役职责” 转为“修复产品缺陷”的建议偏离任务;把“至少替换一项”作为比较成功条件同样预设了答案。 撤回这个方向建议。现有代码是待比较方案,不是不可调整的前提;接入成本只是总成本的一项, 不能只统计成熟方案的适配成本,却忽略继续维护自研、补齐能力和处理缺陷的成本。
| 比较维度 | 当前证据支持的结论 | 不能据此声称的结论 |
|---|---|---|
| 几何正确性 | 两条路径都使用 OCCT;冻结 40/48 单边 Chamfer 的有效性与解析量均通过 | Replicad 或 Aira 的整体几何能力更强 |
| 命名正确性 | 当前规则与 TNaming 在已测唯一、分裂、恢复样本上找到相同集合;删除均可按结果状态正确拒绝 | 自研命名已等价于 TNaming 的完整能力,或 TNaming 天然解决所有拓扑命名问题 |
| 释放和操作证据 | 当前封装有显式释放和 history 投影;受测 Replicad 便利方法存在需要核对/适配的输出与生命周期差异 | 最小上游扩展一定昂贵,或成熟库不值得采用;此前没有完成该扩展的成本实测 |
| 维护成本 | 已看到候选的绑定和接线成本;当前实现也承担来源角色、操作选项、失败清理与契约维护 | 代码已经写好所以保留更便宜;也不能只凭成熟库 API 更简洁判其总成本更低 |
| 运行成本 | 已有共同候选的包体增量和 Node 单次观测 | 单项库的独立成本、稳定时延、长期内存或浏览器优劣已经判定 |
当前结论:已测成功样本上未分出总体优劣,现有证据不足以认定自研更好。 此前“两项暂缓”仅表示当时尚未达到默认产品接入条件,不是最终择优结论;不以此结束比较。 下一份结论必须分别说明:成熟机制的优势、现有实现的优势、在相同外部需求下的最小适配成本、 继续自研的维护负担与缺失证据。先比较合理的复用架构,再判断接线;不能只把库套在所有旧层外面, 发现更复杂后就判成熟库失败。兼容/迁移成本如实计入,当前任务不自动执行破坏性迁移。
比较完成应给出有证据的逐职责建议,而非必然采用某库、必然保留自研或转为另一项修复任务。 保持现有模型权威、权限、历史数据和未提交改动;运行时替换按最终选型及授权另行推进。
10.10 快速横向选型:减少后续自研,分清运行性能证据
Section titled “10.10 快速横向选型:减少后续自研,分清运行性能证据”真实需求。 尽快判断哪些成熟实现值得复用,避免把未来的放样、扫掠、草图扩展、拓扑引用、 文档重算和格式支持逐项做成自维护机制。开发速度指交付相同能力需要承担的工作;运行速度指同任务 的初始化、计算、查询和恢复时延。下表是源码与已有实验支持的工程建议,没有虚构人日、代码节省 百分比或全库性能排行;不是默认产品替换已经完成。
先给判断:通用 CAD 能力的覆盖面,成熟底座明显比当前 Aira 丰富。 当前
exact-feature-graph.ts 支持六类操作:拉伸、旋转、差集、抽壳、圆角、倒角。它们的几何运算已经
调用 OCCT;我们的主要自维护量在操作接线、图/文档组织、选择及产品语义。Replicad/CadQuery 的
放样、扫掠等现成封装,是未来可避免重复建设的具体能力;不能只比较已经写好的一个 Chamfer。
上游设施、已证实差异及决定: 版本沿用 SOURCES.lock.json、安装包和 §8.1/§9;
build123d 是本次补查的官方在线文档候选,页面标识 0.11.2.dev272+g0f0e021b6,尚未锁定或实跑。
| 库 / 层次 | 能避免自己维护什么 | 相对现有实现的差异与成本 | 当前选择建议 |
|---|---|---|---|
| OCCT 8.0.1 / OpenCascade.js 绑定 | B-rep 建模、布尔、偏置/收边、原生历史、拓扑索引、网格化及 STEP 读写 | 已是 Aira 几何核心;绑定缺口与业务参数映射仍需处理 | 继续直接复用。 原生已有算法补绑定,不另写几何内核或标准格式算法 |
Replicad 90d176ed… |
浏览器建模便利层、曲线/轮廓构造、选面选边、放样/扫掠、测量与导出调用 | Sketch.loftWith/sweepSketch 等超出现行图操作;同堆真实 Chamfer 已通过。受测便利方法还缺 maker history 输出和确定释放适配;这些扩展的净成本尚未实测 |
浏览器高层建模的优先复用候选。 将新增操作与一组已有操作一起比较;允许小范围上游扩展,采用后退役等价封装,避免再写一套通用 Replicad |
| OCAF:TDocStd / TFunction / TNaming | 文档属性/持久化、命令撤销、依赖传播、重算组织、拓扑演化选择 | 文档/事务/依赖及命名已有真实 WASM 探针;仍需特征驱动、命名初始角色与作用域。当前旁挂样本不能证明整体替换收益,也不能证明自研优于原生框架 | 浏览器文档底座的优先比较方案。 以它实际承担文档/重算/命名职责为候选,AMIR 可作兼容投影;不要长期保留两套等价机制,也不要继续默认扩建自研通用框架 |
FreeCAD 1.1.3 / 145529fe… |
已组织好的参数对象、文档重算、事务和持久保存;TopoShape 有自身的 element map | 相比裸 OCAF,已有应用层组织。需原生执行环境、进程接口、模型映射及历史兼容;本次未运行完整替代。FreeCAD 的引用机制不能等同于 TNaming | 若允许本地/服务端进程,优先比较完整底座复用。 从覆盖职责看减少自研的潜力最大之一;属于替代文档路线,不与 OCAF 文档再叠一层 |
| CadQuery 2.7.0 | Python 参数建模、选择器、孔/放样/扫掠等操作、装配与导出便利层 | 锁定源码具备 Workplane 高层 API;依赖 cadquery-ocp>=7.8.1,<7.9,与当前 OCCT 8.0.1 WASM 不同。脚本参数化不自动提供 Aira 所需的持久特征事务 |
原生脚本建模优先基线。 可减少建模 API 自维护;不能因此宣称文档/历史职责全部被替代 |
| build123d,在线文档候选 | Python 的显式几何对象、Builder/代数式组合、选择、放样/扫掠及导出 | 与 CadQuery 同属 OCCT 高层 Python 路线,API 组织不同;未锁版本、未做同任务适配,不能说它更快或 AI 成功率更高 | CadQuery 的备选。 同一职责选择一个主要 API;目前先用已有锁定源码的 CadQuery 比较,理由是已有调查基础,不是已证明性能更优 |
| PlaneGCS 1.2.0 / GcsWrapper;ezpz 0.2.29 | 草图数值求解,以及上游已有的几何参数/约束映射、解回填和诊断接口 | 已采用 PlaneGCS;其 wrapper 还覆盖椭圆、样条等更多几何。既有 10-case 对照中 PlaneGCS 有精确 DOF/冗余候选,ezpz 的矛盾约束 IDs 更有用但不提供同等冗余诊断;双方仍需公开 ID、归一化和失败语义映射 | 继续以 PlaneGCS 为浏览器主选,优先核对 GcsWrapper 再补适配;不自写 solver。 ezpz 保留为备选,现有证据不支持仅为更少代码而换主 solver |
| Manifold 3.5.1 | 网格布尔、levelSet 等网格操作 | 当前 Mesh/普通 Field 路径已经调用;三角网格和精确 B-rep 的接受域不同,不能把其速度当作同精度 OCCT 的替代成绩 | 保留在网格职责。 不为精确机械建模额外扩大另一套权威表示 |
Fidget 1cef7e8… |
隐式表达式 tape、批量/区间/梯度求值及网格相关设施 | 与自写 Field evaluator 重叠;受查求值接口为 f32,与当前 binary64 及 certified 契约不等价,未测替代成本 | 仅在继续发展隐式建模时优先比较。 不自行扩建通用表达式编译器,也不为当前 B-rep 主线额外引入 |
| zip.js 2.9.0 / OCCT STEP / lib3mf 候选 | ZIP 结构和 CRC、STEP 读写、3MF 标准处理 | zip.js 已替换手写 ZIP,fflate 0.8.3 是独立测试对照;lib3mf 尚未选版/接入,ZIP 通过不等于 3MF 完整符合标准 | 格式设施用成熟实现。 保留 Aira 的资源预算、损失说明与授权;不继续扩写 ZIP/STEP/XML 标准机制 |
能力依据:OCCT OCAF 手册、
FreeCAD 锁定 Document API、
Replicad 官方定位、
CadQuery 官方定位、
build123d 官方文档。
本地核对入口:Replicad sketches/Sketch.ts、shapes.ts、export/assemblyExporter.ts;
CadQuery cq.py、setup.py;PlaneGCS sketch/gcs_wrapper.ts;Fidget eval/mod.rs。
ZIP 当前状态以重叠审计 §14及
packages/aira-3mf-export/src/zip.ts 为准,不重复登记成待替换工作。
求解器已有10-case 共同输入对照,
不能把它说成完全没有比较;其诊断结果也不构成当前大草图性能或全部约束类型的排名。
运行速度:已有数据只能支持局部结论。
| 对照 | 已有证据 | 现在可下的判断 |
|---|---|---|
| Aira 与 Replicad 的真实 40/48 单边倒角 | 同一候选 OCCT 实例内几何结果通过;尚无等价全流程的重复计时 | 复用高层 API 不等于换更快的几何算法。锁定 Replicad 的通用选边遍历值得优化,但不能据源码复杂度宣称整件更慢 |
| Aira 当前选择与 TNaming | 唯一/分裂/恢复集合相同,删除须正确检查失败;未测大图查询及重开时延 | 成熟命名的价值先是能力与维护职责,暂不能宣称速度领先;增量重算的收益须与应用驱动成本一起测 |
| 原图 WASM 与共同候选 | 候选增加 234,127 bytes,gzip 增加 69,216 bytes | 补绑定可共用运行时;该增量含全部探针,既不是某一个库的独立包体,也不是运行时延 |
| FreeCAD / CadQuery / build123d / ezpz / Fidget | 没有与现行 Aira 的同任务性能对照 | 速度未知。Python API 多数几何工作进入原生内核,不能按语言直接排快慢;Mesh/Field 也不能与 B-rep 混排 |
后续性能比较直接沿用现有冻结模型及探针:固定几何参数、容差、网格精度、接受域与失败处理, 区分冷启动和预热后重复操作,报告中位数及尾部时延;原生与浏览器分别报告,并计入进程/数据传输。 操作层与包含历史、验证、持久化的产品全流程分开计时,不能让裸建模调用与完整提交链直接竞争。 本轮不把单次 Node 观察升级为性能排行,也不另建性能治理平台。
减少未来代码的明确边界。 浏览器路线以 OCCT + PlaneGCS 为已用基础,新增高层操作先复用 Replicad;通用文档、重算和命名先比较 OCAF 承担职责的方案。允许原生宿主时,同时以 FreeCAD 完整底座检验是否能进一步减少 Aira 自维护层;仅需脚本建模则以 CadQuery 为基线、build123d 为备选。 这些是两类部署路线的择优建议,不是要求同时引入所有库。
Aira 应主要承担可发现、结构化的 AI 操作接口、设计意图与库参数的映射,以及产品权限、验证结果、 原子发布和既有历史的兼容。文档内部组织、撤销、重算、命名并非天然属于必须自研的产品差异;若由 成熟底座接管,就删除等价内部实现。相比继续逐项扩建通用 CAD 底座,这一复用优先方向已有足够的 能力证据支持;精确净代码节省、适配人日和最终运行性能仍待对应接线实测,不作百分比承诺。