跳转到内容

Aira CAD 底座复用、版本兼容与证据体系修正调查:OCAF、Replicad 与 TNaming 接入实测

主文档与完整目录。本分篇保留原调查日期的依据与实测记录;其中的当前状态、建议和授权仅属于历史快照,不是执行队列。

10. 浏览器本地底座:OCAF 与 Replicad 实测接入调查(2026-09-03)

Section titled “10. 浏览器本地底座:OCAF 与 Replicad 实测接入调查(2026-09-03)”

用户要求立即调查“OCCT+OCAF、按需采用 Replicad,并重新判断文档、重建、命名机制复用”。 本轮基线为 HEAD 0372efe 加进行中的工作树;其他任务正在修改产品诊断与计划文件。 本轮仅增加研究与隔离实验材料,没有替换产品运行时、改动公开协议/历史数据、调用模型或提交。

浏览器路线已从源码可行推进到真实 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 连续建模计划的执行顺序。

构建镜像锁定为 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() 并不证明所有失败分支及时释放。 本轮显式释放探针持有的对象,没有测完整内部临时对象泄漏或峰值内存。

真实需求 / 当前实现 可复用设施 已证实差异与决定
跨操作传递面来源: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 当成已持久提交的撤销。

历史建议,后续已执行调查并改变阶段;不是现行工作包。采用范围见实施计划 §6。

  1. 同堆绑定验证。 在独立实验产物补齐 Replicad 当前调用链绑定,保留已存在的原生 history、 验证与确定释放能力;不先引入第二份生产 WASM。完整跑过后列出真正能够退役的操作封装。
  2. 真实命名对照。 以现有壳体→切孔→收边链连接 TNaming,比较原路径与候选的唯一选择、 split/merge、目标删除和歧义;额外验证原生状态被清除后重开、显式重绑和失败回滚。 本轮只覆盖唯一/分裂/删除的独立探针,merge 与完整产品链尚未测。
  3. 根据净收益决定采用范围。 同一输入/历史下比较正确性、恢复信息、资源释放、包体、延迟和 可退役职责。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 底座,这一复用优先方向已有足够的 能力证据支持;精确净代码节省、适配人日和最终运行性能仍待对应接线实测,不作百分比承诺。