@faicad/faijs 0.30.9 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/dist/api/align/index.d.ts +64 -0
  2. package/dist/api/align/index.d.ts.map +1 -0
  3. package/dist/api/align/index.js +101 -0
  4. package/dist/api/align/index.js.map +1 -0
  5. package/dist/api/api-namespace.d.ts +5 -4
  6. package/dist/api/api-namespace.d.ts.map +1 -1
  7. package/dist/api/api-namespace.js +36 -4
  8. package/dist/api/api-namespace.js.map +1 -1
  9. package/dist/api/boolean-op/index.d.ts +65 -0
  10. package/dist/api/boolean-op/index.d.ts.map +1 -0
  11. package/dist/api/boolean-op/index.js +113 -0
  12. package/dist/api/boolean-op/index.js.map +1 -0
  13. package/dist/api/boolean.d.ts.map +1 -1
  14. package/dist/api/boolean.js +15 -27
  15. package/dist/api/boolean.js.map +1 -1
  16. package/dist/api/brep-operations/healingFns.d.ts +13 -0
  17. package/dist/api/brep-operations/healingFns.d.ts.map +1 -1
  18. package/dist/api/brep-operations/healingFns.js +28 -1
  19. package/dist/api/brep-operations/healingFns.js.map +1 -1
  20. package/dist/api/brep-operations/topologyFns.d.ts +27 -6
  21. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -1
  22. package/dist/api/brep-operations/topologyFns.js +46 -22
  23. package/dist/api/brep-operations/topologyFns.js.map +1 -1
  24. package/dist/api/chamfer.d.ts +5 -4
  25. package/dist/api/chamfer.d.ts.map +1 -1
  26. package/dist/api/chamfer.js +12 -11
  27. package/dist/api/chamfer.js.map +1 -1
  28. package/dist/api/curve-sketch/index.d.ts.map +1 -1
  29. package/dist/api/curve-sketch/index.js +9 -3
  30. package/dist/api/curve-sketch/index.js.map +1 -1
  31. package/dist/api/draft.d.ts.map +1 -1
  32. package/dist/api/draft.js +1 -3
  33. package/dist/api/draft.js.map +1 -1
  34. package/dist/api/engrave.d.ts.map +1 -1
  35. package/dist/api/engrave.js +3 -13
  36. package/dist/api/engrave.js.map +1 -1
  37. package/dist/api/export-3mf.d.ts +73 -0
  38. package/dist/api/export-3mf.d.ts.map +1 -0
  39. package/dist/api/export-3mf.js +121 -0
  40. package/dist/api/export-3mf.js.map +1 -0
  41. package/dist/api/export-brep.d.ts +6 -0
  42. package/dist/api/export-brep.d.ts.map +1 -1
  43. package/dist/api/export-brep.js +11 -2
  44. package/dist/api/export-brep.js.map +1 -1
  45. package/dist/api/export-step.d.ts +67 -0
  46. package/dist/api/export-step.d.ts.map +1 -0
  47. package/dist/api/export-step.js +98 -0
  48. package/dist/api/export-step.js.map +1 -0
  49. package/dist/api/export-stl.d.ts +8 -0
  50. package/dist/api/export-stl.d.ts.map +1 -1
  51. package/dist/api/export-stl.js +23 -8
  52. package/dist/api/export-stl.js.map +1 -1
  53. package/dist/api/feature-repair.d.ts +1 -1
  54. package/dist/api/feature-repair.d.ts.map +1 -1
  55. package/dist/api/feature-repair.js +1 -7
  56. package/dist/api/feature-repair.js.map +1 -1
  57. package/dist/api/fillet-variable.d.ts.map +1 -1
  58. package/dist/api/fillet-variable.js +0 -1
  59. package/dist/api/fillet-variable.js.map +1 -1
  60. package/dist/api/fillet.d.ts +3 -3
  61. package/dist/api/fillet.d.ts.map +1 -1
  62. package/dist/api/fillet.js +3 -4
  63. package/dist/api/fillet.js.map +1 -1
  64. package/dist/api/generated/operations.js +6 -6
  65. package/dist/api/generated/operations.js.map +1 -1
  66. package/dist/api/generated/script-face-manifest.d.ts +1 -1
  67. package/dist/api/generated/script-face-manifest.js +3 -3
  68. package/dist/api/generated/script-face-manifest.js.map +1 -1
  69. package/dist/api/generated/script-face.d.ts +1 -1
  70. package/dist/api/generated/script-face.js +1 -1
  71. package/dist/api/generated/script-face.js.map +1 -1
  72. package/dist/api/generated/sketching.js +1 -1
  73. package/dist/api/generated/sketching.js.map +1 -1
  74. package/dist/api/generated/topology.js +10 -10
  75. package/dist/api/generated/topology.js.map +1 -1
  76. package/dist/api/helix.d.ts +1 -1
  77. package/dist/api/helix.js +1 -1
  78. package/dist/api/helix.js.map +1 -1
  79. package/dist/api/index.d.ts +4 -1
  80. package/dist/api/index.d.ts.map +1 -1
  81. package/dist/api/index.js +16 -4
  82. package/dist/api/index.js.map +1 -1
  83. package/dist/api/internal/compat-op.d.ts +6 -6
  84. package/dist/api/internal/compat-op.d.ts.map +1 -1
  85. package/dist/api/internal/compat-op.js +7 -9
  86. package/dist/api/internal/compat-op.js.map +1 -1
  87. package/dist/api/internal/export-members.d.ts +80 -0
  88. package/dist/api/internal/export-members.d.ts.map +1 -0
  89. package/dist/api/internal/export-members.js +104 -0
  90. package/dist/api/internal/export-members.js.map +1 -0
  91. package/dist/api/internal/l3-bridge.d.ts +17 -0
  92. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  93. package/dist/api/internal/l3-bridge.js +23 -1
  94. package/dist/api/internal/l3-bridge.js.map +1 -1
  95. package/dist/api/measure-query/index.d.ts +262 -0
  96. package/dist/api/measure-query/index.d.ts.map +1 -0
  97. package/dist/api/measure-query/index.js +390 -0
  98. package/dist/api/measure-query/index.js.map +1 -0
  99. package/dist/api/pattern.d.ts.map +1 -1
  100. package/dist/api/pattern.js +0 -3
  101. package/dist/api/pattern.js.map +1 -1
  102. package/dist/api/primitives.d.ts +6 -6
  103. package/dist/api/primitives.d.ts.map +1 -1
  104. package/dist/api/primitives.js +12 -11
  105. package/dist/api/primitives.js.map +1 -1
  106. package/dist/api/profile.d.ts.map +1 -1
  107. package/dist/api/profile.js +0 -1
  108. package/dist/api/profile.js.map +1 -1
  109. package/dist/api/punch-hole.d.ts.map +1 -1
  110. package/dist/api/punch-hole.js +0 -1
  111. package/dist/api/punch-hole.js.map +1 -1
  112. package/dist/api/replicate.d.ts +5 -7
  113. package/dist/api/replicate.d.ts.map +1 -1
  114. package/dist/api/replicate.js +18 -56
  115. package/dist/api/replicate.js.map +1 -1
  116. package/dist/api/section-by-plane.d.ts.map +1 -1
  117. package/dist/api/section-by-plane.js +0 -1
  118. package/dist/api/section-by-plane.js.map +1 -1
  119. package/dist/api/shell.d.ts +1 -1
  120. package/dist/api/shell.d.ts.map +1 -1
  121. package/dist/api/shell.js +11 -2
  122. package/dist/api/shell.js.map +1 -1
  123. package/dist/api/sketch-on-face.d.ts +3 -3
  124. package/dist/api/sketch-on-face.d.ts.map +1 -1
  125. package/dist/api/sketch-on-face.js +6 -4
  126. package/dist/api/sketch-on-face.js.map +1 -1
  127. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  128. package/dist/api/sketch-on-plane.js +0 -1
  129. package/dist/api/sketch-on-plane.js.map +1 -1
  130. package/dist/api/split-by-plane.d.ts.map +1 -1
  131. package/dist/api/split-by-plane.js +0 -1
  132. package/dist/api/split-by-plane.js.map +1 -1
  133. package/dist/api/split.d.ts +1 -1
  134. package/dist/api/split.js +1 -1
  135. package/dist/api/split.js.map +1 -1
  136. package/dist/api/surface/arg-spec.d.ts +3 -12
  137. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  138. package/dist/api/surface/arg-spec.js +19 -26
  139. package/dist/api/surface/arg-spec.js.map +1 -1
  140. package/dist/api/sweep.d.ts +15 -3
  141. package/dist/api/sweep.d.ts.map +1 -1
  142. package/dist/api/sweep.js +5 -3
  143. package/dist/api/sweep.js.map +1 -1
  144. package/dist/api/thicken.d.ts.map +1 -1
  145. package/dist/api/thicken.js +11 -2
  146. package/dist/api/thicken.js.map +1 -1
  147. package/dist/api/transform.d.ts +3 -3
  148. package/dist/api/transform.d.ts.map +1 -1
  149. package/dist/api/transform.js +47 -17
  150. package/dist/api/transform.js.map +1 -1
  151. package/dist/boolean/index.d.ts +23 -0
  152. package/dist/boolean/index.d.ts.map +1 -0
  153. package/dist/boolean/index.js +27 -0
  154. package/dist/boolean/index.js.map +1 -0
  155. package/dist/brep/brep-chain.d.ts +1 -19
  156. package/dist/brep/brep-chain.d.ts.map +1 -1
  157. package/dist/brep/brep-chain.js +0 -1
  158. package/dist/brep/brep-chain.js.map +1 -1
  159. package/dist/brep/brep-ops.d.ts +4 -1
  160. package/dist/brep/brep-ops.d.ts.map +1 -1
  161. package/dist/brep/brep-ops.js +9 -5
  162. package/dist/brep/brep-ops.js.map +1 -1
  163. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  164. package/dist/brep/engine/adapters/brep-mock.js +0 -3
  165. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  166. package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
  167. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  168. package/dist/brep/engine/adapters/brepkit.js +4 -98
  169. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  170. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  171. package/dist/brep/engine/adapters/occt.js +0 -144
  172. package/dist/brep/engine/adapters/occt.js.map +1 -1
  173. package/dist/brep/engine/native-history.d.ts +27 -0
  174. package/dist/brep/engine/native-history.d.ts.map +1 -0
  175. package/dist/brep/engine/native-history.js +54 -0
  176. package/dist/brep/engine/native-history.js.map +1 -0
  177. package/dist/brep/engine/registry.d.ts +2 -4
  178. package/dist/brep/engine/registry.d.ts.map +1 -1
  179. package/dist/brep/engine/registry.js +1 -1
  180. package/dist/brep/engine/registry.js.map +1 -1
  181. package/dist/brep/engine/types.d.ts +35 -77
  182. package/dist/brep/engine/types.d.ts.map +1 -1
  183. package/dist/brep/engine/types.js.map +1 -1
  184. package/dist/brep/export/export-model.d.ts +21 -0
  185. package/dist/brep/export/export-model.d.ts.map +1 -1
  186. package/dist/brep/export/export-model.js +171 -73
  187. package/dist/brep/export/export-model.js.map +1 -1
  188. package/dist/brep/export/step.d.ts +17 -1
  189. package/dist/brep/export/step.d.ts.map +1 -1
  190. package/dist/brep/export/step.js +133 -0
  191. package/dist/brep/export/step.js.map +1 -1
  192. package/dist/brep/export/stl.d.ts +22 -1
  193. package/dist/brep/export/stl.d.ts.map +1 -1
  194. package/dist/brep/export/stl.js +58 -10
  195. package/dist/brep/export/stl.js.map +1 -1
  196. package/dist/brep/export/transform12.d.ts +47 -0
  197. package/dist/brep/export/transform12.d.ts.map +1 -0
  198. package/dist/brep/export/transform12.js +87 -0
  199. package/dist/brep/export/transform12.js.map +1 -0
  200. package/dist/brep/face-evolution.d.ts +53 -0
  201. package/dist/brep/face-evolution.d.ts.map +1 -1
  202. package/dist/brep/face-evolution.js +65 -0
  203. package/dist/brep/face-evolution.js.map +1 -1
  204. package/dist/browser-host/index.d.ts +4 -1
  205. package/dist/browser-host/index.d.ts.map +1 -1
  206. package/dist/browser-host/index.js +7 -1
  207. package/dist/browser-host/index.js.map +1 -1
  208. package/dist/browser.d.ts +4 -8
  209. package/dist/browser.d.ts.map +1 -1
  210. package/dist/browser.js +4 -26
  211. package/dist/browser.js.map +1 -1
  212. package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
  213. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  214. package/dist/cad-runtime/backend-dispatch.js +22 -80
  215. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  216. package/dist/cad-runtime/content-key.d.ts +3 -3
  217. package/dist/cad-runtime/content-key.js +3 -3
  218. package/dist/cad-runtime/content-key.js.map +1 -1
  219. package/dist/cad-runtime/ports.d.ts +28 -0
  220. package/dist/cad-runtime/ports.d.ts.map +1 -1
  221. package/dist/cad-runtime/ports.js.map +1 -1
  222. package/dist/cad-runtime/runtime.d.ts +33 -12
  223. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  224. package/dist/cad-runtime/runtime.js +44 -48
  225. package/dist/cad-runtime/runtime.js.map +1 -1
  226. package/dist/define-op.d.ts +6 -11
  227. package/dist/define-op.d.ts.map +1 -1
  228. package/dist/define-op.js +3 -20
  229. package/dist/define-op.js.map +1 -1
  230. package/dist/env-agnostic.d.ts +2 -2
  231. package/dist/env-agnostic.d.ts.map +1 -1
  232. package/dist/env-agnostic.js +1 -1
  233. package/dist/env-agnostic.js.map +1 -1
  234. package/dist/index.d.ts +13 -64
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +17 -75
  237. package/dist/index.js.map +1 -1
  238. package/dist/lang/symbol-table.generated.d.ts +17 -0
  239. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  240. package/dist/lang/symbol-table.generated.js +17 -0
  241. package/dist/lang/symbol-table.generated.js.map +1 -1
  242. package/dist/mesh/index.d.ts +18 -23
  243. package/dist/mesh/index.d.ts.map +1 -1
  244. package/dist/mesh/index.js +18 -20
  245. package/dist/mesh/index.js.map +1 -1
  246. package/dist/mesh/io.d.ts +42 -14
  247. package/dist/mesh/io.d.ts.map +1 -1
  248. package/dist/mesh/io.js +77 -13
  249. package/dist/mesh/io.js.map +1 -1
  250. package/dist/mesh/threemf-loader.d.ts +38 -4
  251. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  252. package/dist/mesh/threemf-loader.js +115 -34
  253. package/dist/mesh/threemf-loader.js.map +1 -1
  254. package/dist/mesh/types.d.ts +30 -0
  255. package/dist/mesh/types.d.ts.map +1 -1
  256. package/dist/mesh/types.js.map +1 -1
  257. package/dist/node-host/execute-script.d.ts +2 -1
  258. package/dist/node-host/execute-script.d.ts.map +1 -1
  259. package/dist/node-host/execute-script.js +5 -4
  260. package/dist/node-host/execute-script.js.map +1 -1
  261. package/dist/node-host/index.d.ts +1 -0
  262. package/dist/node-host/index.d.ts.map +1 -1
  263. package/dist/node-host/index.js +4 -0
  264. package/dist/node-host/index.js.map +1 -1
  265. package/dist/primitives/index.d.ts +19 -0
  266. package/dist/primitives/index.d.ts.map +1 -0
  267. package/dist/primitives/index.js +21 -0
  268. package/dist/primitives/index.js.map +1 -0
  269. package/dist/runtime-state.d.ts +63 -29
  270. package/dist/runtime-state.d.ts.map +1 -1
  271. package/dist/runtime-state.js +57 -0
  272. package/dist/runtime-state.js.map +1 -1
  273. package/dist/sdf/index.d.ts +12 -0
  274. package/dist/sdf/index.d.ts.map +1 -0
  275. package/dist/sdf/index.js +13 -0
  276. package/dist/sdf/index.js.map +1 -0
  277. package/dist/sdk.d.ts +0 -1
  278. package/dist/sdk.d.ts.map +1 -1
  279. package/dist/sdk.js.map +1 -1
  280. package/dist/weapp.d.ts +2 -2
  281. package/dist/weapp.d.ts.map +1 -1
  282. package/dist/weapp.js +1 -1
  283. package/dist/weapp.js.map +1 -1
  284. package/package.json +276 -35
@@ -1 +1 @@
1
- {"version":3,"file":"occt.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * engine/adapters/occt — OCCT BREP 引擎适配器(槽位 1 的默认实现)\n *\n * 本文件是「occt 引擎实现」的注册入口:把 `createOcctPrimitives()`(occt-kernel/\n * occt-primitives.ts,L1 契约 `BrepEngineApi` 的 occt 显式实现)注册进引擎注册表。\n * 业务层(runtime/brep ops/api)只经注册表取引擎,不直接 import occt 初始化\n * 函数——引擎本体可整体替换(换一个适配器即换引擎)。\n *\n * Phase 3:\n * 本文件不再做任何猴子补丁(旧版在 occt-wasm 单例上覆写 pattern 三方法与 33 个\n * 登记方法——全部移入 `createOcctPrimitives` 的显式对象字面量)。occt-wasm 类型\n * 耦合只存在于 occt-kernel/(A1 允许的唯一耦合区);本文件不接触 occt-wasm 类型。\n *\n * 平台独有能力(loft 族、工具实体 section/split、L1 三员之外的 *WithHistory、\n * XCAF 等)不在 L1 契约里——平台代码经原生面 `getOcctKernel()`(D3)访问。\n */\n\nimport { registerBrepEngine, hasBrepEngine, isBrepEngineRegistered, type BrepEngine } from '../registry'\nimport type { BrepEvolutionKind, BrepMethodKind } from '../types'\nimport { createOcctPrimitives } from '../../../occt-kernel/occt-primitives'\n\n/** OCCT 引擎注册 id(默认 BREP 引擎;首个注册自动成为默认)。 */\nexport const OCCT_BREP_ENGINE_ID = 'occt'\n\n/**\n * OCCT 实际提供的 `*WithHistory` 核函数名(Phase 0.2:逐核函数如实声明)。\n *\n * 12 个全部由 `occt-wasm@5.6.0` 提供(`dist/index.d.ts` 的 `*WithHistory` 声明)。\n * L1 契约只含前三员 + filletWithHistory(双方都有对齐实现);其余 8 个是 occt\n * 平台面能力(brepkit 无对应 API),存在性由本能力表如实声明,op 侧用\n * `engines: ['occt']`(Phase 5 D11)表达平台归属。\n */\nconst OCCT_EVOLUTION_KINDS = [\n 'fuseWithHistory',\n 'cutWithHistory',\n 'intersectWithHistory',\n 'filletWithHistory',\n 'chamferWithHistory',\n 'translateWithHistory',\n 'rotateWithHistory',\n 'mirrorWithHistory',\n 'scaleWithHistory',\n 'shellWithHistory',\n 'offsetWithHistory',\n 'thickenWithHistory',\n] as const satisfies readonly BrepEvolutionKind[]\n\n/**\n * 非演化内核方法全集(BrepMethodKind)——逐核如实声明(Phase 1,P2 缺口补齐)。\n *\n * ⚠️ Phase 2 修正(能力声明=可执行语义):\n * - 保留 `gridPattern`:occt-wasm 无原生 gridPattern,但适配器有组合实现\n * (嵌套 linearPattern + fuseAll,见 occt-primitives.ts)——occt 下\n * gridPattern op 可执行,声明成立;\n * - 移除 `rectangularPattern`:occt-wasm 无此内核方法,旧 rectangularPattern\n * 是纯 JS 组合(compoundOpsFns.ts translate+fuseAll,不调内核)——无 op 依赖\n * 该能力名,声明即虚假(capability-map 实证 36 op 无一依赖)。\n */\nconst OCCT_METHOD_KINDS = [\n 'linearPattern',\n 'circularPattern',\n 'gridPattern',\n 'mirror',\n 'rotate',\n 'translate',\n 'scale',\n 'makeRectangle',\n 'shell',\n 'extrude',\n 'loft',\n 'loftAdvanced',\n 'section',\n 'sweepPipeShell',\n 'simplePipe',\n 'revolveVec',\n 'buildExtrusionLaw',\n 'fuse',\n 'cut',\n 'intersect',\n 'fuseAll',\n 'makeArcEdge',\n 'makeCircleEdge',\n 'makeBezierEdge',\n 'makeCylinder',\n 'makeEllipsoid',\n 'makeFace',\n 'makeFaceOnSurface',\n 'makeLineEdge',\n 'makeTorus',\n 'makeVertex',\n 'makeWire',\n 'makeWireFromMixed',\n 'buildEdgeOnSurface',\n 'addHolesInFace',\n 'buildTriFace',\n 'sew',\n 'sewAndSolidify',\n 'healFace',\n 'healSolid',\n 'healWire',\n 'fixShape',\n 'fixSelfIntersection',\n 'isValid',\n 'removeDegenerateEdges',\n 'simplify',\n 'split',\n 'curveParameters',\n 'curvePointAtParam',\n 'curveTangent',\n 'hullFromPoints',\n 'isNull',\n 'iterShapes',\n 'locate',\n 'shapeType',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n // Phase 5(D5):测量族能力名统一为 L1 中立名(getBoundingBox/getVolume/...)——\n // 旧面按上游旧命名(volume/area/length),core 能力表用 L1 中立名。\n 'getBoundingBox',\n 'getVolume',\n 'getSurfaceArea',\n 'getLength',\n 'getCenterOfMass',\n 'composeTransform',\n 'applyComposedTransformWithHistory',\n 'generalTransformNonOrthogonal',\n 'generalTransformWithHistory',\n 'importStl',\n 'createXCAFDocument',\n 'importXCAFFromSTEP',\n 'copyShape',\n 'dispose',\n 'downcast',\n 'hashCode',\n // chamfer/fillet 基础方法(directEdit 族逐核真名;occt-wasm 原生提供)\n 'chamfer',\n 'chamferDistAngle',\n 'fillet',\n 'filletVariable',\n // 2026-09-26 B 批:rotate/applyMatrix 从 engines:[occt] 降级为能力路由后,occt 侧须\n // 如实声明 transform(:228,BRepBuilderAPI_Transform 深拷贝,STEP-safe)/\n // generalTransform(:231,gp_GTrsf)——此前两方法在 primitives 上实现但未登记进能力表。\n 'transform',\n 'generalTransform',\n // 2026-09-26 C batch: section/drill/pocket/boss/mirrorJoin downgrade - OCCT already implements\n // sectionByPlane(:162)/makeCompound(:285)/located(:229)/getSubShapes(:314) but previously undeclared\n // (engines:[occt] bypassed the gate). Now declared honestly for capability routing.\n 'sectionByPlane',\n 'makeCompound',\n 'located',\n 'getSubShapes',\n] as const satisfies readonly BrepMethodKind[]\n\n/**\n * 装配 OCCT BREP 引擎(宿主启动时调用一次,幂等)。\n *\n * 预初始化 `createOcctPrimitives()`(内部 await initOcctWasm):wasm 加载完成后\n * 立即注册——保证注册返回后内核单例已就绪。幂等:已注册(含运行时默认装配或\n * 宿主先行注册)则跳过注册,仅确保 wasm 预初始化。\n */\nexport async function registerOcctBrepEngine(): Promise<void> {\n const primitives = await createOcctPrimitives()\n if (isBrepEngineRegistered(OCCT_BREP_ENGINE_ID)) return\n registerBrepEngine(OCCT_BREP_ENGINE_ID, async (): Promise<BrepEngine> => ({\n id: OCCT_BREP_ENGINE_ID,\n primitives,\n capabilities: {\n // 面演化:逐核函数名单(不是族级布尔——见 BrepEvolutionKind)。\n evolution: OCCT_EVOLUTION_KINDS,\n // 非演化内核方法:逐核如实声明(Phase 1,P2 缺口补齐;op 声明按此静态判定)。\n methods: OCCT_METHOD_KINDS,\n heal: true,\n directEdit: true,\n advSurface: true,\n assembly: true,\n // P7 并入(D4):OCCT 是精确 B-rep 内核——如实声明 L1 契约的能力字段。\n exact: true,\n brepExport: true,\n exactMeasurement: true,\n tessellationModel: 'extract-time',\n },\n }))\n // 2026-09-25 core-decouple Phase 2(§5.1):删除 occt-kernel-bridge 后,本注册\n // 流程只管 core 引擎注册表,不再向旧 kernel registry 注入——compat\n // 兼容面(compat op)由 Phase 3 逐批自有化替换;中间态下需要 compat 面的\n // 宿主/测试自行装配 registry。\n}\n\n/**\n * 内置默认 BREP 引擎装配(OCCT):宿主未注册任何引擎时的缺省值。\n *\n * OCCT 是 faijs 的默认 BREP 引擎——低频率、静态的替换:换引擎 = 宿主在\n * 装配期显式注册其它引擎(首个注册者为默认),或改本处默认。宿主无需为\n * 每次使用自行提供引擎;本函数幂等,已注册任何引擎则 no-op。\n */\nexport async function ensureOcctDefaultEngine(): Promise<void> {\n if (hasBrepEngine()) return\n await registerOcctBrepEngine()\n}\n"]}
1
+ {"version":3,"file":"occt.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,sBAAsB,EAAmB,MAAM,aAAa,CAAA;AACxG,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAE3E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,UAAU,GAAG,MAAM,oBAAoB,EAAE,CAAA;IAC/C,IAAI,sBAAsB,CAAC,mBAAmB,CAAC;QAAE,OAAM;IACvD,kBAAkB,CAAC,mBAAmB,EAAE,KAAK,IAAyB,EAAE,CAAC,CAAC;QACxE,EAAE,EAAE,mBAAmB;QACvB,UAAU;KACX,CAAC,CAAC,CAAA;IACH,qEAAqE;IACrE,kDAAkD;IAClD,mDAAmD;IACnD,sBAAsB;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,aAAa,EAAE;QAAE,OAAM;IAC3B,MAAM,sBAAsB,EAAE,CAAA;AAChC,CAAC","sourcesContent":["/**\r\n * engine/adapters/occt — OCCT BREP 引擎适配器(槽位 1 的默认实现)\r\n *\r\n * 本文件是「occt 引擎实现」的注册入口:把 `createOcctPrimitives()`(occt-kernel/\r\n * occt-primitives.ts,L1 契约 `BrepEngineApi` 的 occt 显式实现)注册进引擎注册表。\r\n * 业务层(runtime/brep ops/api)只经注册表取引擎,不直接 import occt 初始化\r\n * 函数——引擎本体可整体替换(换一个适配器即换引擎)。\r\n *\r\n * Phase 3:\r\n * 本文件不再做任何猴子补丁(旧版在 occt-wasm 单例上覆写 pattern 三方法与 33 个\r\n * 登记方法——全部移入 `createOcctPrimitives` 的显式对象字面量)。occt-wasm 类型\r\n * 耦合只存在于 occt-kernel/(A1 允许的唯一耦合区);本文件不接触 occt-wasm 类型。\r\n *\r\n * 平台独有能力(loft 族、工具实体 section/split、L1 三员之外的 *WithHistory、\r\n * XCAF 等)不在 L1 契约里——平台代码经原生面 `getOcctKernel()`(D3)访问。\r\n */\r\n\r\nimport { registerBrepEngine, hasBrepEngine, isBrepEngineRegistered, type BrepEngine } from '../registry'\r\nimport { createOcctPrimitives } from '../../../occt-kernel/occt-primitives'\r\n\r\n/** OCCT 引擎注册 id(默认 BREP 引擎;首个注册自动成为默认)。 */\r\nexport const OCCT_BREP_ENGINE_ID = 'occt'\r\n\r\n/**\r\n * 装配 OCCT BREP 引擎(宿主启动时调用一次,幂等)。\r\n *\r\n * 预初始化 `createOcctPrimitives()`(内部 await initOcctWasm):wasm 加载完成后\r\n * 立即注册——保证注册返回后内核单例已就绪。幂等:已注册(含运行时默认装配或\r\n * 宿主先行注册)则跳过注册,仅确保 wasm 预初始化。\r\n */\r\nexport async function registerOcctBrepEngine(): Promise<void> {\r\n const primitives = await createOcctPrimitives()\r\n if (isBrepEngineRegistered(OCCT_BREP_ENGINE_ID)) return\r\n registerBrepEngine(OCCT_BREP_ENGINE_ID, async (): Promise<BrepEngine> => ({\r\n id: OCCT_BREP_ENGINE_ID,\r\n primitives,\r\n }))\r\n // 2026-09-25 core-decouple Phase 2(§5.1):删除 occt-kernel-bridge 后,本注册\r\n // 流程只管 core 引擎注册表,不再向旧 kernel registry 注入——compat\r\n // 兼容面(compat op)由 Phase 3 逐批自有化替换;中间态下需要 compat 面的\r\n // 宿主/测试自行装配 registry。\r\n}\r\n\r\n/**\r\n * 内置默认 BREP 引擎装配(OCCT):宿主未注册任何引擎时的缺省值。\r\n *\r\n * OCCT 是 faijs 的默认 BREP 引擎——低频率、静态的替换:换引擎 = 宿主在\r\n * 装配期显式注册其它引擎(首个注册者为默认),或改本处默认。宿主无需为\r\n * 每次使用自行提供引擎;本函数幂等,已注册任何引擎则 no-op。\r\n */\r\nexport async function ensureOcctDefaultEngine(): Promise<void> {\r\n if (hasBrepEngine()) return\r\n await registerOcctBrepEngine()\r\n}\r\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * native-history — 引擎是否原生提供某个 `*WithHistory` 面演化核函数。
3
+ *
4
+ * op 实现体内选实现轨(调 `*WithHistory` 还是裸方法)时读这里:这是一条**引擎事实**,
5
+ * 与 op 无关,因此不挂在 op 声明上,也没有任何"能力表"参与——「引擎能不能做这件事」
6
+ * 由引擎身份静态决定,写代码的时刻就是常量。
7
+ *
8
+ * 两个真实引擎的事实(本模块是唯一归属,别处不再声明):
9
+ * - `occt`:12 个 `*WithHistory` 全有(`occt-wasm@5.6.0` 原生导出)。
10
+ * - `brepkit`:只有 `fuseWithHistory` / `cutWithHistory` / `filletWithHistory`
11
+ * (`brepkit-kernel/brepkitKernel.ts` 的面演化三员,其余为 `unsupported(...)` 桩)。
12
+ *
13
+ * 未知 / 未装配引擎(含测试替身 `brep_mock`)→ 一律 `false`:拿不到事实时按"没有"处理,
14
+ * 让 op 走裸方法轨(几何仍正确,只是不产面演化),绝不假设引擎有历史。
15
+ *
16
+ * 零重依赖:只读运行期装配配置(引擎 id),不 import 任何平台内核。
17
+ */
18
+ import type { BrepEvolutionKind } from './types.js';
19
+ /**
20
+ * 当前 BREP 引擎是否原生实现该 `*WithHistory`(静态;读引擎身份,不读任何声明表)。
21
+ *
22
+ * @param kind - the evolution kernel function name to test.
23
+ * @returns true when the current engine natively implements it; false otherwise
24
+ * (including when no engine is assembled / the engine is unknown).
25
+ */
26
+ export declare function hasNativeHistory(kind: BrepEvolutionKind): boolean;
27
+ //# sourceMappingURL=native-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-history.d.ts","sourceRoot":"","sources":["../../../src/brep/engine/native-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA2BhD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAGjE"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * native-history — 引擎是否原生提供某个 `*WithHistory` 面演化核函数。
3
+ *
4
+ * op 实现体内选实现轨(调 `*WithHistory` 还是裸方法)时读这里:这是一条**引擎事实**,
5
+ * 与 op 无关,因此不挂在 op 声明上,也没有任何"能力表"参与——「引擎能不能做这件事」
6
+ * 由引擎身份静态决定,写代码的时刻就是常量。
7
+ *
8
+ * 两个真实引擎的事实(本模块是唯一归属,别处不再声明):
9
+ * - `occt`:12 个 `*WithHistory` 全有(`occt-wasm@5.6.0` 原生导出)。
10
+ * - `brepkit`:只有 `fuseWithHistory` / `cutWithHistory` / `filletWithHistory`
11
+ * (`brepkit-kernel/brepkitKernel.ts` 的面演化三员,其余为 `unsupported(...)` 桩)。
12
+ *
13
+ * 未知 / 未装配引擎(含测试替身 `brep_mock`)→ 一律 `false`:拿不到事实时按"没有"处理,
14
+ * 让 op 走裸方法轨(几何仍正确,只是不产面演化),绝不假设引擎有历史。
15
+ *
16
+ * 零重依赖:只读运行期装配配置(引擎 id),不 import 任何平台内核。
17
+ */
18
+ import { getBackends } from '../../runtime-state.js';
19
+ /**
20
+ * 各引擎**原生提供**的面演化核函数(常量表,非运行时探测)。
21
+ *
22
+ * 为什么是常量而不是"探测实现面":所有适配器的 `*WithHistory` 成员都在 API 对象里
23
+ * **有函数**——没实现的也放一个 `unsupported(...)` 桩,故
24
+ * `typeof api.xWithHistory === 'function'` 恒为真,探测不出"真有还是桩"。
25
+ */
26
+ const NATIVE_HISTORY_BY_ENGINE = {
27
+ occt: [
28
+ 'fuseWithHistory',
29
+ 'cutWithHistory',
30
+ 'intersectWithHistory',
31
+ 'filletWithHistory',
32
+ 'chamferWithHistory',
33
+ 'translateWithHistory',
34
+ 'rotateWithHistory',
35
+ 'mirrorWithHistory',
36
+ 'scaleWithHistory',
37
+ 'shellWithHistory',
38
+ 'offsetWithHistory',
39
+ 'thickenWithHistory',
40
+ ],
41
+ brepkit: ['fuseWithHistory', 'cutWithHistory', 'filletWithHistory'],
42
+ };
43
+ /**
44
+ * 当前 BREP 引擎是否原生实现该 `*WithHistory`(静态;读引擎身份,不读任何声明表)。
45
+ *
46
+ * @param kind - the evolution kernel function name to test.
47
+ * @returns true when the current engine natively implements it; false otherwise
48
+ * (including when no engine is assembled / the engine is unknown).
49
+ */
50
+ export function hasNativeHistory(kind) {
51
+ const engineId = getBackends().config.brepEngineId;
52
+ return engineId != null && (NATIVE_HISTORY_BY_ENGINE[engineId]?.includes(kind) ?? false);
53
+ }
54
+ //# sourceMappingURL=native-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-history.js","sourceRoot":"","sources":["../../../src/brep/engine/native-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGjD;;;;;;GAMG;AACH,MAAM,wBAAwB,GAA2D;IACvF,IAAI,EAAE;QACJ,iBAAiB;QACjB,gBAAgB;QAChB,sBAAsB;QACtB,mBAAmB;QACnB,oBAAoB;QACpB,sBAAsB;QACtB,mBAAmB;QACnB,mBAAmB;QACnB,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,oBAAoB;KACrB;IACD,OAAO,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;CACpE,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuB;IACtD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAA;IAClD,OAAO,QAAQ,IAAI,IAAI,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAA;AAC1F,CAAC","sourcesContent":["/**\n * native-history — 引擎是否原生提供某个 `*WithHistory` 面演化核函数。\n *\n * op 实现体内选实现轨(调 `*WithHistory` 还是裸方法)时读这里:这是一条**引擎事实**,\n * 与 op 无关,因此不挂在 op 声明上,也没有任何\"能力表\"参与——「引擎能不能做这件事」\n * 由引擎身份静态决定,写代码的时刻就是常量。\n *\n * 两个真实引擎的事实(本模块是唯一归属,别处不再声明):\n * - `occt`:12 个 `*WithHistory` 全有(`occt-wasm@5.6.0` 原生导出)。\n * - `brepkit`:只有 `fuseWithHistory` / `cutWithHistory` / `filletWithHistory`\n * (`brepkit-kernel/brepkitKernel.ts` 的面演化三员,其余为 `unsupported(...)` 桩)。\n *\n * 未知 / 未装配引擎(含测试替身 `brep_mock`)→ 一律 `false`:拿不到事实时按\"没有\"处理,\n * 让 op 走裸方法轨(几何仍正确,只是不产面演化),绝不假设引擎有历史。\n *\n * 零重依赖:只读运行期装配配置(引擎 id),不 import 任何平台内核。\n */\n\nimport { getBackends } from '../../runtime-state'\nimport type { BrepEvolutionKind } from './types'\n\n/**\n * 各引擎**原生提供**的面演化核函数(常量表,非运行时探测)。\n *\n * 为什么是常量而不是\"探测实现面\":所有适配器的 `*WithHistory` 成员都在 API 对象里\n * **有函数**——没实现的也放一个 `unsupported(...)` 桩,故\n * `typeof api.xWithHistory === 'function'` 恒为真,探测不出\"真有还是桩\"。\n */\nconst NATIVE_HISTORY_BY_ENGINE: Readonly<Record<string, readonly BrepEvolutionKind[]>> = {\n occt: [\n 'fuseWithHistory',\n 'cutWithHistory',\n 'intersectWithHistory',\n 'filletWithHistory',\n 'chamferWithHistory',\n 'translateWithHistory',\n 'rotateWithHistory',\n 'mirrorWithHistory',\n 'scaleWithHistory',\n 'shellWithHistory',\n 'offsetWithHistory',\n 'thickenWithHistory',\n ],\n brepkit: ['fuseWithHistory', 'cutWithHistory', 'filletWithHistory'],\n}\n\n/**\n * 当前 BREP 引擎是否原生实现该 `*WithHistory`(静态;读引擎身份,不读任何声明表)。\n *\n * @param kind - the evolution kernel function name to test.\n * @returns true when the current engine natively implements it; false otherwise\n * (including when no engine is assembled / the engine is unknown).\n */\nexport function hasNativeHistory(kind: BrepEvolutionKind): boolean {\n const engineId = getBackends().config.brepEngineId\n return engineId != null && (NATIVE_HISTORY_BY_ENGINE[engineId]?.includes(kind) ?? false)\n}\n"]}
@@ -13,12 +13,10 @@
13
13
  * 装配完成后调用 freezeEngineRegistries() 冻结,冻结后任何注册尝试抛错(E2 验收)。
14
14
  */
15
15
  import type { BrepEngineApi } from './primitives.js';
16
- import type { BrepCapabilities } from './types.js';
17
- /** BREP 引擎实例(槽位 1):原语契约 + 可选能力声明。 */
16
+ /** BREP 引擎实例(槽位 1):原语契约。引擎能做什么由实现本身决定,没有能力声明面。 */
18
17
  export interface BrepEngine {
19
18
  readonly id: string;
20
19
  readonly primitives: BrepEngineApi;
21
- readonly capabilities?: BrepCapabilities;
22
20
  }
23
21
  /** BREP 引擎异步提供者(宿主装配时注册;引擎初始化完成后 resolve)。 */
24
22
  export type BrepEngineProvider = () => Promise<BrepEngine>;
@@ -58,7 +56,7 @@ export declare function registerMeshEngine(id: string, engine: MeshEngine): void
58
56
  */
59
57
  export declare function isMeshEngineRegistered(id: string): boolean;
60
58
  /**
61
- * Whether a default BREP engine is registered (none → mesh mode, equivalent to "no BREP capability").
59
+ * Whether a default BREP engine is registered (none → mesh mode, i.e. no BREP engine at all).
62
60
  * @returns true when a default BREP engine is registered.
63
61
  */
64
62
  export declare function hasBrepEngine(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/brep/engine/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAA;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAA;CACzC;AAED,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,eAAe,EAAE,gBAAgB,CAAA;CAC9D;AAWD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CASjF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CASvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcpE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAOrD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAErD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAOtD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/brep/engine/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAA;CACnC;AAED,8CAA8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,eAAe,EAAE,gBAAgB,CAAA;CAC9D;AAWD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CASjF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CASvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAcpE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAOrD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAErD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAErD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAOtD"}
@@ -67,7 +67,7 @@ export function isMeshEngineRegistered(id) {
67
67
  return meshEngines.has(id);
68
68
  }
69
69
  /**
70
- * Whether a default BREP engine is registered (none → mesh mode, equivalent to "no BREP capability").
70
+ * Whether a default BREP engine is registered (none → mesh mode, i.e. no BREP engine at all).
71
71
  * @returns true when a default BREP engine is registered.
72
72
  */
73
73
  export function hasBrepEngine() {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/brep/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * engine/registry — BREP / mesh 双槽位注册表(§6.2,R8 构建时切换)\n *\n *\n * 首个注册者为默认,但两张表、两套 getter——\n * 这是 R2(双槽位正交:mesh 引擎与 BREP 引擎独立注册、单独切换)的直接落地。\n *\n * BREP 槽以「异步 provider」注册:引擎可能需异步初始化(occt-wasm 加载、\n * 外部内核 wasm 下载等),provider 只解析一次,结果缓存。\n *\n * 注册只发生在宿主启动装配期(R8):构建时选定的适配器包在初始化时完成注册,\n * 之后注册表运行期只读。不提供运行时的 unregister / setDefault / 切换 API;\n * 装配完成后调用 freezeEngineRegistries() 冻结,冻结后任何注册尝试抛错(E2 验收)。\n */\n\nimport type { BrepEngineApi } from './primitives'\nimport type { BrepCapabilities } from './types'\n\n/** BREP 引擎实例(槽位 1):原语契约 + 可选能力声明。 */\nexport interface BrepEngine {\n readonly id: string\n readonly primitives: BrepEngineApi\n readonly capabilities?: BrepCapabilities\n}\n\n/** BREP 引擎异步提供者(宿主装配时注册;引擎初始化完成后 resolve)。 */\nexport type BrepEngineProvider = () => Promise<BrepEngine>\n\n/**\n * mesh 引擎实例(槽位 2)——与 BREP 槽完全独立(R2)。\n *\n * `meshSolid`:可选的**网格实体后端**(方案 2026-10-01 §3.3)。提供它的 mesh\n * 引擎才能把网格文件导入成\"网格实体 + 近似拓扑\"。缺省(未提供)= 该 mesh 后端\n * 只做裸网格布尔,`load` 的 mesh 路径保持\"裸网格、无拓扑\"的历史行为。\n */\nexport interface MeshEngine {\n readonly id: string\n readonly meshSolid?: import('../mesh-solid').MeshSolidBackend\n}\n\nconst brepEngineProviders = new Map<string, BrepEngineProvider>()\nconst brepEngineCache = new Map<string, BrepEngine>()\nlet defaultBrepId: string | null = null\n\nconst meshEngines = new Map<string, MeshEngine>()\nlet defaultMeshId: string | null = null\n\nlet frozen = false\n\n/**\n * 冻结注册表:宿主启动装配完成后调用(R8)。\n * 冻结后任何 registerBrepEngine / registerMeshEngine 尝试抛错。\n * 已解析的引擎实例仍可读取(运行期只读,不冻结读取)。\n */\nexport function freezeEngineRegistries(): void {\n frozen = true\n}\n\n/**\n * Register a BREP engine (slot 1). The first registrant automatically becomes the default.\n * @param id - the engine registration id.\n * @param provider - the async provider that resolves the engine instance.\n */\nexport function registerBrepEngine(id: string, provider: BrepEngineProvider): void {\n if (frozen) {\n throw new Error(`[engine/registry] registry frozen — cannot register BREP engine '${id}' after assembly (R8)`)\n }\n if (brepEngineProviders.has(id)) {\n throw new Error(`[engine/registry] BREP engine '${id}' already registered`)\n }\n brepEngineProviders.set(id, provider)\n if (defaultBrepId === null) defaultBrepId = id\n}\n\n/**\n * Register a mesh engine (slot 2). The first registrant automatically becomes the default.\n * @param id - the engine registration id.\n * @param engine - the engine instance to register.\n */\nexport function registerMeshEngine(id: string, engine: MeshEngine): void {\n if (frozen) {\n throw new Error(`[engine/registry] registry frozen — cannot register mesh engine '${id}' after assembly (R8)`)\n }\n if (meshEngines.has(id)) {\n throw new Error(`[engine/registry] mesh engine '${id}' already registered`)\n }\n meshEngines.set(id, engine)\n if (defaultMeshId === null) defaultMeshId = id\n}\n\n/**\n * Whether the given mesh engine is registered (used for idempotent adapter registration).\n * @param id - the mesh engine registration id to look up.\n * @returns true when the engine is registered.\n */\nexport function isMeshEngineRegistered(id: string): boolean {\n return meshEngines.has(id)\n}\n\n/**\n * Whether a default BREP engine is registered (none → mesh mode, equivalent to \"no BREP capability\").\n * @returns true when a default BREP engine is registered.\n */\nexport function hasBrepEngine(): boolean {\n return defaultBrepId !== null\n}\n\n/**\n * Whether the given BREP engine is registered (used for idempotent adapter registration).\n * @param id - the engine registration id to look up.\n * @returns true when the engine is registered.\n */\nexport function isBrepEngineRegistered(id: string): boolean {\n return brepEngineProviders.has(id)\n}\n\n/**\n * Resolve a BREP engine (asynchronously, resolving its provider; throws when not registered).\n * Omitting id uses the default (the first registrant).\n * @param id - optional engine registration id; defaults to the active engine.\n * @returns a Promise resolving to the BREP engine instance.\n */\nexport async function getBrepEngine(id?: string): Promise<BrepEngine> {\n const key = id ?? defaultBrepId\n if (key === null) {\n throw new Error('[engine/registry] no BREP engine registered — call registerBrepEngine() during host assembly (R8)')\n }\n const cached = brepEngineCache.get(key)\n if (cached) return cached\n const provider = brepEngineProviders.get(key)\n if (!provider) {\n throw new Error(`[engine/registry] BREP engine '${key}' not registered`)\n }\n const engine = await provider()\n brepEngineCache.set(key, engine)\n return engine\n}\n\n/**\n * Get a mesh engine (throws when not registered). Omitting id uses the default (the first registrant).\n * @param id - optional engine registration id; defaults to the active engine.\n * @returns the mesh engine instance.\n */\nexport function getMeshEngine(id?: string): MeshEngine {\n const key = id ?? defaultMeshId\n const engine = key === null ? undefined : meshEngines.get(key)\n if (!engine) {\n throw new Error(`[engine/registry] mesh engine '${key ?? '<none>'}' not registered`)\n }\n return engine\n}\n\n/**\n * The current default BREP engine id (null when none is registered).\n * @returns the active BREP engine id or null.\n */\nexport function getActiveBrepEngineId(): string | null {\n return defaultBrepId\n}\n\n/**\n * The current default mesh engine id (null when none is registered).\n * @returns the active mesh engine id or null.\n */\nexport function getActiveMeshEngineId(): string | null {\n return defaultMeshId\n}\n\n/**\n * 已装配的网格实体后端(方案 2026-10-01 §3.3)。\n *\n * 按**注册顺序**返回第一个声明了 `meshSolid` 的 mesh 引擎——不要求它就是\n * \"默认\" mesh 引擎(默认槽位今天无人注册,直接看默认槽会永远拿不到后端)。\n * 一个都没有 → `null`:这是宿主装配事实,不是错误。\n *\n * @returns the assembled mesh-solid backend, or null when none is available.\n */\nexport function getMeshSolidBackend(): import('../mesh-solid').MeshSolidBackend | null {\n for (const engine of meshEngines.values()) {\n if (engine.meshSolid) return engine.meshSolid\n }\n return null\n}\n\n/**\n * 仅测试用:重置注册表状态。\n *\n * R8 不提供运行期的 unregister / setDefault;此函数仅供 registry.test.ts\n * 重置模块级单例,不进入任何公共导出面(index/browser/node/sdk 均不 re-export)。\n */\nexport function __resetEngineRegistriesForTests(): void {\n brepEngineProviders.clear()\n brepEngineCache.clear()\n meshEngines.clear()\n defaultBrepId = null\n defaultMeshId = null\n frozen = false\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/brep/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * engine/registry — BREP / mesh 双槽位注册表(§6.2,R8 构建时切换)\n *\n *\n * 首个注册者为默认,但两张表、两套 getter——\n * 这是 R2(双槽位正交:mesh 引擎与 BREP 引擎独立注册、单独切换)的直接落地。\n *\n * BREP 槽以「异步 provider」注册:引擎可能需异步初始化(occt-wasm 加载、\n * 外部内核 wasm 下载等),provider 只解析一次,结果缓存。\n *\n * 注册只发生在宿主启动装配期(R8):构建时选定的适配器包在初始化时完成注册,\n * 之后注册表运行期只读。不提供运行时的 unregister / setDefault / 切换 API;\n * 装配完成后调用 freezeEngineRegistries() 冻结,冻结后任何注册尝试抛错(E2 验收)。\n */\n\nimport type { BrepEngineApi } from './primitives'\n\n/** BREP 引擎实例(槽位 1):原语契约。引擎能做什么由实现本身决定,没有能力声明面。 */\nexport interface BrepEngine {\n readonly id: string\n readonly primitives: BrepEngineApi\n}\n\n/** BREP 引擎异步提供者(宿主装配时注册;引擎初始化完成后 resolve)。 */\nexport type BrepEngineProvider = () => Promise<BrepEngine>\n\n/**\n * mesh 引擎实例(槽位 2)——与 BREP 槽完全独立(R2)。\n *\n * `meshSolid`:可选的**网格实体后端**(方案 2026-10-01 §3.3)。提供它的 mesh\n * 引擎才能把网格文件导入成\"网格实体 + 近似拓扑\"。缺省(未提供)= 该 mesh 后端\n * 只做裸网格布尔,`load` 的 mesh 路径保持\"裸网格、无拓扑\"的历史行为。\n */\nexport interface MeshEngine {\n readonly id: string\n readonly meshSolid?: import('../mesh-solid').MeshSolidBackend\n}\n\nconst brepEngineProviders = new Map<string, BrepEngineProvider>()\nconst brepEngineCache = new Map<string, BrepEngine>()\nlet defaultBrepId: string | null = null\n\nconst meshEngines = new Map<string, MeshEngine>()\nlet defaultMeshId: string | null = null\n\nlet frozen = false\n\n/**\n * 冻结注册表:宿主启动装配完成后调用(R8)。\n * 冻结后任何 registerBrepEngine / registerMeshEngine 尝试抛错。\n * 已解析的引擎实例仍可读取(运行期只读,不冻结读取)。\n */\nexport function freezeEngineRegistries(): void {\n frozen = true\n}\n\n/**\n * Register a BREP engine (slot 1). The first registrant automatically becomes the default.\n * @param id - the engine registration id.\n * @param provider - the async provider that resolves the engine instance.\n */\nexport function registerBrepEngine(id: string, provider: BrepEngineProvider): void {\n if (frozen) {\n throw new Error(`[engine/registry] registry frozen — cannot register BREP engine '${id}' after assembly (R8)`)\n }\n if (brepEngineProviders.has(id)) {\n throw new Error(`[engine/registry] BREP engine '${id}' already registered`)\n }\n brepEngineProviders.set(id, provider)\n if (defaultBrepId === null) defaultBrepId = id\n}\n\n/**\n * Register a mesh engine (slot 2). The first registrant automatically becomes the default.\n * @param id - the engine registration id.\n * @param engine - the engine instance to register.\n */\nexport function registerMeshEngine(id: string, engine: MeshEngine): void {\n if (frozen) {\n throw new Error(`[engine/registry] registry frozen — cannot register mesh engine '${id}' after assembly (R8)`)\n }\n if (meshEngines.has(id)) {\n throw new Error(`[engine/registry] mesh engine '${id}' already registered`)\n }\n meshEngines.set(id, engine)\n if (defaultMeshId === null) defaultMeshId = id\n}\n\n/**\n * Whether the given mesh engine is registered (used for idempotent adapter registration).\n * @param id - the mesh engine registration id to look up.\n * @returns true when the engine is registered.\n */\nexport function isMeshEngineRegistered(id: string): boolean {\n return meshEngines.has(id)\n}\n\n/**\n * Whether a default BREP engine is registered (none → mesh mode, i.e. no BREP engine at all).\n * @returns true when a default BREP engine is registered.\n */\nexport function hasBrepEngine(): boolean {\n return defaultBrepId !== null\n}\n\n/**\n * Whether the given BREP engine is registered (used for idempotent adapter registration).\n * @param id - the engine registration id to look up.\n * @returns true when the engine is registered.\n */\nexport function isBrepEngineRegistered(id: string): boolean {\n return brepEngineProviders.has(id)\n}\n\n/**\n * Resolve a BREP engine (asynchronously, resolving its provider; throws when not registered).\n * Omitting id uses the default (the first registrant).\n * @param id - optional engine registration id; defaults to the active engine.\n * @returns a Promise resolving to the BREP engine instance.\n */\nexport async function getBrepEngine(id?: string): Promise<BrepEngine> {\n const key = id ?? defaultBrepId\n if (key === null) {\n throw new Error('[engine/registry] no BREP engine registered — call registerBrepEngine() during host assembly (R8)')\n }\n const cached = brepEngineCache.get(key)\n if (cached) return cached\n const provider = brepEngineProviders.get(key)\n if (!provider) {\n throw new Error(`[engine/registry] BREP engine '${key}' not registered`)\n }\n const engine = await provider()\n brepEngineCache.set(key, engine)\n return engine\n}\n\n/**\n * Get a mesh engine (throws when not registered). Omitting id uses the default (the first registrant).\n * @param id - optional engine registration id; defaults to the active engine.\n * @returns the mesh engine instance.\n */\nexport function getMeshEngine(id?: string): MeshEngine {\n const key = id ?? defaultMeshId\n const engine = key === null ? undefined : meshEngines.get(key)\n if (!engine) {\n throw new Error(`[engine/registry] mesh engine '${key ?? '<none>'}' not registered`)\n }\n return engine\n}\n\n/**\n * The current default BREP engine id (null when none is registered).\n * @returns the active BREP engine id or null.\n */\nexport function getActiveBrepEngineId(): string | null {\n return defaultBrepId\n}\n\n/**\n * The current default mesh engine id (null when none is registered).\n * @returns the active mesh engine id or null.\n */\nexport function getActiveMeshEngineId(): string | null {\n return defaultMeshId\n}\n\n/**\n * 已装配的网格实体后端(方案 2026-10-01 §3.3)。\n *\n * 按**注册顺序**返回第一个声明了 `meshSolid` 的 mesh 引擎——不要求它就是\n * \"默认\" mesh 引擎(默认槽位今天无人注册,直接看默认槽会永远拿不到后端)。\n * 一个都没有 → `null`:这是宿主装配事实,不是错误。\n *\n * @returns the assembled mesh-solid backend, or null when none is available.\n */\nexport function getMeshSolidBackend(): import('../mesh-solid').MeshSolidBackend | null {\n for (const engine of meshEngines.values()) {\n if (engine.meshSolid) return engine.meshSolid\n }\n return null\n}\n\n/**\n * 仅测试用:重置注册表状态。\n *\n * R8 不提供运行期的 unregister / setDefault;此函数仅供 registry.test.ts\n * 重置模块级单例,不进入任何公共导出面(index/browser/node/sdk 均不 re-export)。\n */\nexport function __resetEngineRegistriesForTests(): void {\n brepEngineProviders.clear()\n brepEngineCache.clear()\n meshEngines.clear()\n defaultBrepId = null\n defaultMeshId = null\n frozen = false\n}\n"]}
@@ -180,102 +180,60 @@ export interface BrepUvBounds {
180
180
  }
181
181
  /** 子形状类型(getSubShapes / subShapeHashes 等)。 */
182
182
  export type BrepSubShapeType = 'vertex' | 'edge' | 'wire' | 'face' | 'shell' | 'solid';
183
+ /**
184
+ * XCAF label 句柄(`addShape` / `addChild` 的返回值,仅在所属文档内有效)。
185
+ */
186
+ export type BrepXcafLabel = number & {
187
+ readonly __brepXcafLabel: 'BrepXcafLabel';
188
+ };
183
189
  /**
184
190
  * XCAF 装配文档句柄(可选能力槽 AssemblyCapability 的文档形态)。
185
191
  *
186
192
  * 形态来自 occt-wasm XCAFDocumentImpl 的被调用子集(step.ts / occt-kernel 装配链)。
193
+ * `addChild` 支撑真装配写入(方案 2026-10-08 步骤 7 / P3):组件位姿经
194
+ * `location`(平移 + Euler 弧度)落到 XCAF location,导出为装配引用而非平级 PRODUCT。
187
195
  */
188
196
  export interface BrepXcafDocument {
197
+ /** 顶层 part / 装配 label。返回的 label 可作为 `addChild` 的父。 */
189
198
  addShape(shape: BrepHandle, opts?: {
190
199
  name?: string;
191
200
  color?: [number, number, number];
192
- }): void;
201
+ }): BrepXcafLabel;
202
+ /**
203
+ * 把 shape 作为 parent 的子组件加入(parent 是 part 时,首个 child 使其转为
204
+ * assembly:原几何移入 identity 首组件并携带 part 的名与色)。
205
+ */
206
+ addChild(parent: BrepXcafLabel, shape: BrepHandle, opts?: {
207
+ name?: string;
208
+ color?: [number, number, number];
209
+ /** 组件相对父的位姿:平移 + Euler 角(弧度)。⚠️ occt-wasm 当前只生效平移
210
+ * (旋转分量写出→回读恒 identity,step-export.test.ts P7 钉住)——旋转由
211
+ * 调用方烘进几何,wasm 修复后恢复 location 携带完整位姿。 */
212
+ location?: {
213
+ tx?: number;
214
+ ty?: number;
215
+ tz?: number;
216
+ rx?: number;
217
+ ry?: number;
218
+ rz?: number;
219
+ };
220
+ }): BrepXcafLabel;
193
221
  exportSTEP(): string;
194
222
  close(): void;
195
223
  }
196
224
  /**
197
- * 曲面细分精度控制模型(与 brepjs KernelCapabilities.tessellationModel 同构的中立镜像,
198
- * P7 并入;faijs 侧零内核依赖,不 import 外部子包——D8 反向只允许发生在 api/)。
225
+ * 面演化(`*WithHistory`)核函数名——与内核方法同名,**逐核函数**。
199
226
  *
200
- * - `'build-time'` — 网格在实体构造时固定(如 manifold 全局分段设置);质量参数须在构造前应用。
201
- * - `'extract-time'`— 形状是精确的,按需以每调用 deflection 细分(如 OCCT);质量是
202
- * `mesh()`/导出时的默认 deflection。
203
- * - `'none'` — 无细分控制(或非网格内核)。
204
- */
205
- export type BrepTessellationModel = 'build-time' | 'extract-time' | 'none';
206
- /**
207
- * 面演化(`*WithHistory`)核函数名——与内核方法同名,**逐核函数**声明。
208
- *
209
- * ⚠️ **为什么不能是一个布尔位**(2026-09-22 Phase 0.2):`evolution: true` 是**族级**声明。
210
- * 而「本内核提供面演化」这句话在建面上不成立——每个 `*WithHistory` 是一个独立核函数,
227
+ * ⚠️ **为什么不是一个布尔位**(2026-09-22 Phase 0.2,事实不变):家族化命名会**多报**。
228
+ * 「本内核提供面演化」这句话在建面上不成立——每个 `*WithHistory` 是一个独立核函数,
211
229
  * 内核可以只提供其中一部分。`brepkit` 就是活例:它提供 `fuse`/`cut`/`fillet`,
212
230
  * `chamfer`/`intersect`/`translate`/… 一律 `unsupported(...)`
213
231
  * (`brepkit-kernel/brepkitKernel.ts:220-537`)。
214
232
  *
215
- * 族级布尔的后果不是"少报"而是**多报**:`cad.intersect` 声明需要 `evolution`,
216
- * 在 `evolution: true` 下通过静态判定 → 落到运行时才撞 `unsupported('intersectWithHistory')`。
217
- * 这直接违反 AGENTS.md 红线「BREP 路径能否走由静态规则判定,禁止运行时回退」——
218
- * 静态判定之所以能成立,前提是引擎的能力声明**说的是逐核函数的实话**。
219
- *
220
- * ⇒ 引擎声明"我提供哪几个"(`BrepCapabilities.evolution`),op 声明"我要哪一个"
221
- * (`defineOp.capabilities`),两者**按名字求交集**(`cad-runtime/backend-dispatch.ts`)。
233
+ * 本类型是「面演化核函数有哪些」的**名字全集**,供 `hasNativeHistory`
234
+ * (`brep/engine/native-history.ts`)按引擎身份逐名回答"这个引擎原生有没有它"。
235
+ * 没有声明轴:op 不声明要哪个核函数,分派时也不查任何能力表。
222
236
  */
223
237
  export type BrepEvolutionKind = 'fuseWithHistory' | 'cutWithHistory' | 'intersectWithHistory' | 'filletWithHistory' | 'chamferWithHistory' | 'translateWithHistory' | 'rotateWithHistory' | 'mirrorWithHistory' | 'scaleWithHistory' | 'shellWithHistory' | 'offsetWithHistory' | 'thickenWithHistory';
224
- /**
225
- * 非演化内核方法真名(`*WithHistory` 之外的 `BrepEngineApi` 方法)。
226
- *
227
- * 与 `BrepEvolutionKind` 分名(P3 冲突消除):`'mirror'` 一个字符串不能同时表示
228
- * "提供 `mirrorWithHistory`"与"提供 `mirror`",两族必须互不共用字符串。
229
- * 语义与 evolution 相同——**逐核函数**声明:声明 = 实现(诚实原则),
230
- * 缺省/空 = 一个都不提供。
231
- *
232
- * 初始全集 = Phase 0 能力映射表(`api/surface/capability-map.json`)盘点的
233
- * compat op 依赖内核方法 + 方案初始项;Phase 3 全量收敛时按映射表滚动补全。
234
- */
235
- export type BrepMethodKind = 'linearPattern' | 'circularPattern' | 'gridPattern' | 'rectangularPattern' | 'mirror' | 'rotate' | 'translate' | 'scale' | 'chamfer' | 'chamferDistAngle' | 'fillet' | 'filletVariable' | 'makeRectangle' | 'shell' | 'extrude' | 'loft' | 'loftAdvanced' | 'section' | 'sweepPipeShell' | 'simplePipe' | 'revolveVec' | 'buildExtrusionLaw' | 'fuse' | 'cut' | 'intersect' | 'fuseAll' | 'makeArcEdge' | 'makeCircleEdge' | 'makeBezierEdge' | 'makeCylinder' | 'makeEllipsoid' | 'makeFace' | 'makeFaceOnSurface' | 'makeLineEdge' | 'makeTorus' | 'makeVertex' | 'makeWire' | 'makeWireFromMixed' | 'buildEdgeOnSurface' | 'addHolesInFace' | 'buildTriFace' | 'sew' | 'sewAndSolidify' | 'healFace' | 'healSolid' | 'healWire' | 'fixShape' | 'fixSelfIntersection' | 'isValid' | 'removeDegenerateEdges' | 'simplify' | 'split' | 'getBoundingBox' | 'getVolume' | 'getSurfaceArea' | 'getLength' | 'getCenterOfMass' | 'curveParameters' | 'curvePointAtParam' | 'curveTangent' | 'hullFromPoints' | 'isNull' | 'iterShapes' | 'locate' | 'shapeType' | 'surfaceCenterOfMass' | 'surfaceNormal' | 'surfaceType' | 'uvBounds' | 'composeTransform' | 'applyComposedTransformWithHistory' | 'generalTransformNonOrthogonal' | 'generalTransformWithHistory' | 'sectionByPlane' | 'makeCompound' | 'located' | 'getSubShapes' | 'transform' | 'generalTransform' | 'importStl' | 'createXCAFDocument' | 'importXCAFFromSTEP' | 'copyShape' | 'dispose' | 'downcast' | 'hashCode';
236
- /**
237
- * 可选能力槽声明(§7.5,Phase 1 钉死成员)。
238
- *
239
- * 缺失的能力 → 依赖它的功能静态降级走 mesh(§8.4),绝不伪造。
240
- *
241
- * P7 并入(D4):移植 brepjs `KernelCapabilities` 的数据字段(exact/brepExport/
242
- * exactMeasurement/tessellationModel)进本模型,由适配器在注册时如实声明;分派逻辑
243
- * (backend-dispatch 的 BrepCapabilityName 路由)不改——新字段是引擎本质描述,不是
244
- * 逐 op 路由键。
245
- *
246
- * 未并入 `disposalModel`(D5 决策,与旧 port 一致):faijs 的句柄释放由
247
- * `cad-runtime` 顶替释放统一编排(增量失败回滚前提),brepjs 的 DisposalScope/arena
248
- * 语义不强制统一,故不作为能力位记录。
249
- */
250
- export interface BrepCapabilities {
251
- /**
252
- * 面演化族:本引擎**实际提供**的 `*WithHistory` 核函数名(不是族级布尔,见
253
- * `BrepEvolutionKind`)。空数组 / 缺省 = 一个都不提供。
254
- */
255
- evolution?: readonly BrepEvolutionKind[];
256
- /**
257
- * 非演化内核方法族:本引擎**实际提供**的 `BrepEngineApi` 方法真名
258
- * (逐核声明,与 `evolution` 同语义;空数组 / 缺省 = 一个都不提供)。
259
- */
260
- methods?: readonly BrepMethodKind[];
261
- /** 修复族(healSolid/fixShape/fixFaceOrientations/...) */
262
- heal?: boolean;
263
- /** 直接编辑族(C1:moveFace/replaceFace/...) */
264
- directEdit?: boolean;
265
- /** 高级曲面族(C1:boundarySurface/fillSurface/...) */
266
- advSurface?: boolean;
267
- /** XCAF 装配族 */
268
- assembly?: boolean;
269
- /** mesh→BREP 提升(buildTriFace/sewAndSolidify) */
270
- meshLift?: boolean;
271
- /** 精确 B-rep 几何(vs mesh 近似)——brepjs KernelCapabilities.exact 并入 */
272
- exact?: boolean;
273
- /** 可序列化为 B-rep 交换格式(BREP/STEP)——brepjs brepExport 并入 */
274
- brepExport?: boolean;
275
- /** 体积/面积/长度匹配解析值(vs mesh 近似)——brepjs exactMeasurement 并入 */
276
- exactMeasurement?: boolean;
277
- /** 细分精度控制模型——brepjs tessellationModel 并入 */
278
- tessellationModel?: BrepTessellationModel;
279
- }
280
238
  export {};
281
239
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/brep/engine/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/brep/engine/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/brep/engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAU,CAAA;AAgCxE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA","sourcesContent":["/**\n * engine/types — BREP 引擎中立类型(零具体实现依赖,不 import 任何内核包)\n *\n *\n * 契约(对应 brepjs 的 KernelShape 约定):\n * - L1 及以上代码永远不对句柄调用任何方法,只把它传回产生它的那个引擎;\n * - 句柄不得跨引擎传递——跨引擎必须先经 mesh 层(§8.3 的结构保证)。\n * - OCCT 适配器的句柄运行时就是 number,加 brand 是零成本的类型层转换。\n */\n\n/**\n * BREP 引擎身份(D11-1,2026-09-24 narrowing plan)。\n *\n * 三个值来自三个已存在的引擎 id 常量(`OCCT_BREP_ENGINE_ID` / `BREPKIT_BREP_ENGINE_ID`\n * / `BREP_MOCK_ENGINE_ID`,各自适配器导出);本类型由常量数组推导,禁止裸 `string`。\n * 适配器常量用 `satisfies BrepEngineId` 收窄(typecheck 钉住集合一致)。\n *\n * 消费点:`defineOp` 的 `engines` 声明(平台 op 自证身份)、`dispatchPath` 的平台\n * 身份分支(D11-2)、`script-face-manifest` 的平台 op 标注(§3.8)。\n */\nexport const BREP_ENGINE_IDS = ['occt', 'brepkit', 'brep_mock'] as const\n\n/** BREP 引擎身份(固定三值联合;由 {@link BREP_ENGINE_IDS} 推导)。 */\nexport type BrepEngineId = (typeof BREP_ENGINE_IDS)[number]\n\ndeclare const BrepHandleBrand: unique symbol\n\n/**\n * BREP 实体句柄——不透明值。\n *\n * 与 occt-wasm 的 ShapeHandle 同构(number & brand)。OCCT 适配器\n * (occt-kernel/)内部以 `as unknown as` 双向转换,跨适配器边界零运行时成本。\n */\nexport type BrepHandle = number & { readonly [BrepHandleBrand]: never }\n\n/** 三维点/向量(与内核无关的中立形态)。 */\nexport interface BrepVec3 {\n x: number\n y: number\n z: number\n}\n\n/** 轴对齐包围盒。 */\nexport interface BrepBoundingBox {\n xmin: number\n ymin: number\n zmin: number\n xmax: number\n ymax: number\n zmax: number\n}\n\n/**\n * 面/边 hash 的上界(唯一真源)。\n *\n * 拓扑提取侧用 `kernel.hashCode(subShape, BREP_HASH_BOUND)` 查面/边,\n * 三角化/线框侧把 hash 写进 `faceGroups[·+2]` / `edgeGroups[·+2]`——\n * **两侧必须对同一上界取模**,否则查表恒 miss(实测 2026-10-01:\n * brepkit 适配器曾用 1e9、topologyExt 用 INT32_MAX → 面行 triangleCount 全 0)。\n * 值取自 OCCT `HASH_CODE_MAX` 惯例,也是 occt-wasm 的实际口径(实测一致)。\n */\nexport const BREP_HASH_BOUND = 2147483647\n\n/**\n * BRepMesh 三角化输出(镜像 occt-wasm Mesh 的中立形态)。\n *\n * ⚠️ 单位口径(L1 契约的一部分,实测钉死):\n * - `faceGroups` 三元组 = `[triStart, triCount, faceHash]`,前两元是**索引单位**\n * (3/三角形),不是三角形单位;\n * - `wireframe().edgeGroups` = `[pointStart, pointCount, edgeHash]`,前两元是\n * **浮点单位**(3/点)。\n * 修订任何一侧都要同步改另一侧与 brepkit 适配器(跨引擎一致性测试\n * `topology/face-group-units.test.ts` 钉住)。\n */\nexport interface BrepMeshResult {\n /** XYZ 交错顶点坐标,长度 = vertexCount * 3 */\n positions: Float32Array\n /** XYZ 交错顶点法线,长度 = vertexCount * 3 */\n normals: Float32Array\n /** 三角形索引 */\n indices: Uint32Array\n /** 顶点数(positions.length / 3) */\n vertexCount: number\n /** 三角形数(indices.length / 3) */\n triangleCount: number\n /** 面组:[triStart, triCount, faceHash] 三元组(meshShape 时存在) */\n faceGroups?: Int32Array\n /** 面组数(meshShape 时存在) */\n faceCount?: number\n}\n\n/** 三角化精度选项。 */\nexport interface BrepTessellateOptions {\n /** 最大弦偏差(mm),默认 0.1 */\n linearDeflection?: number\n /** 最大角偏差(弧度),默认 0.5 */\n angularDeflection?: number\n /** 按每条边长度相对解释 linearDeflection */\n relative?: boolean\n}\n\n/** 边折线数据(wireframe 输出)。 */\nexport interface BrepEdgeData {\n /** XYZ 交错边采样点 */\n points: Float32Array\n /** 每边分组:[pointStart, pointCount, edgeHash] 三元组;前两元为**浮点单位**(3/点)。 */\n edgeGroups: Int32Array\n /** points 中的浮点数总数(= XYZ 坐标数) */\n pointCount: number\n /** 不同边的数量 */\n edgeCount: number\n}\n\n/**\n * *WithHistory 面演化数据(modified/generated/deleted 用面 hash 编码)。\n *\n * ⚠️ **三个字段的编码不同,实测于 2026-09-22(`brep/engine/phase0-kernel-probes.test.ts`),\n * 与 occt-wasm 自己的文档(`dist/types.d.ts:227-231`)不符**:\n *\n * | 字段 | 实际编码 | 键/值语义 |\n * |---|---|---|\n * | `modified` | **分段** `[inHash, count, outHash…] × N` | 键 = 输入面 hash;值 = 该输入面在结果里的**后继**(可 1→N) |\n * | `generated` | **同构分段**,**键集与 `modified` 相同** | 值 = 该输入面派生出的**中间形**(实测结果里 0 存活) |\n * | `deleted` | **扁平** hash 数组 | 输入面中已不存在的面 |\n *\n * 「扁平数组」的读法会把 `generated` 的 count 字段当成 hash——\n * 实测 `cut` 的 `generated` 里真的含 `2`(一个 count),故该误读不会自己暴露。\n *\n * ⚠️ **未受影响的面有两种上报形态,两种都表示\"未变\"**:自映射(`i -> [i]`)。\n * 或者**整个不上报**(`fillet` 实测两者并存)。⇒ 读法必须是\n * `modified.get(h) ?? [h]`,不能只看\"是否出现在 `modified` 里\"。\n *\n * ⇒ 结果面的三种命运(判据见 `phase0-kernel-probes.test.ts`):\n * **原样幸存**(hash ∈ 输入 hash 集合,hash 逐字不变)/ **改型幸存**(在 `modified` 输出里)/\n * **新造**(两者皆非——这才是真正需要派生词汇命名的面,如 `fillet` 的过渡面)。\n */\nexport interface BrepEvolutionData {\n /** 结果句柄 */\n result: BrepHandle\n /** 分段:`[inHash, count, outHash…] × N`;值 = 该输入面的结果后继 */\n modified: number[]\n /** 分段(键集同 `modified`):该输入面派生的中间形 hash,实测结果里 0 存活 */\n generated: number[]\n /** 扁平:输入面中已不存在的面 hash */\n deleted: number[]\n}\n\n/** 曲线参数区间(与内核 curveParameters 返回同构:first/last)。 */\nexport interface BrepCurveParameters {\n first: number\n last: number\n}\n\n/**\n * NURBS control data of one edge's BASIS curve.\n *\n * ⚠️ This is the WHOLE basis curve, not the edge: an OCCT edge is often only a\n * sub-range of its curve, so `curveParameters(edge)` is the trim to apply on top\n * of this (`BRep_Tool::Curve` hands back both halves). Rebuilding an edge from\n * this data without honouring that trim produces a curve running past its\n * neighbour's start (measured 2026-09-29).\n *\n * `poles` is flat `[x,y,z, x,y,z, …]`; `weights` has one entry per pole (all 1\n * for a non-rational curve, and `rational` then says whether they mean anything);\n * `knots`/`multiplicities` are parallel arrays (expanded, the knot vector is\n * `knots[i]` repeated `multiplicities[i]` times and has `poles + degree + 1`\n * entries).\n */\nexport interface BrepNurbsCurveData {\n /** Polynomial degree. */\n degree: number\n /** True when `weights` are meaningful (a rational curve). */\n rational: boolean\n /** True for a periodic (closed, wrap-around) curve. */\n periodic: boolean\n /** Distinct knot values, parallel to `multiplicities`. */\n knots: number[]\n /** Multiplicity of each entry in `knots`. */\n multiplicities: number[]\n /** Flat control points: `[x, y, z, x, y, z, …]`. */\n poles: number[]\n /** One weight per control point. */\n weights: number[]\n}\n\n/** 曲面 UV 边界。 */\nexport interface BrepUvBounds {\n uMin: number\n uMax: number\n vMin: number\n vMax: number\n}\n\n/** 子形状类型(getSubShapes / subShapeHashes 等)。 */\nexport type BrepSubShapeType = 'vertex' | 'edge' | 'wire' | 'face' | 'shell' | 'solid'\n\n/**\n * XCAF 装配文档句柄(可选能力槽 AssemblyCapability 的文档形态)。\n *\n * 形态来自 occt-wasm XCAFDocumentImpl 的被调用子集(step.ts / occt-kernel 装配链)。\n */\nexport interface BrepXcafDocument {\n addShape(shape: BrepHandle, opts?: { name?: string; color?: [number, number, number] }): void\n exportSTEP(): string\n close(): void\n}\n\n/**\n * 曲面细分精度控制模型(与 brepjs KernelCapabilities.tessellationModel 同构的中立镜像,\n * P7 并入;faijs 侧零内核依赖,不 import 外部子包——D8 反向只允许发生在 api/)。\n *\n * - `'build-time'` — 网格在实体构造时固定(如 manifold 全局分段设置);质量参数须在构造前应用。\n * - `'extract-time'`— 形状是精确的,按需以每调用 deflection 细分(如 OCCT);质量是\n * `mesh()`/导出时的默认 deflection。\n * - `'none'` — 无细分控制(或非网格内核)。\n */\nexport type BrepTessellationModel = 'build-time' | 'extract-time' | 'none'\n\n/**\n * 面演化(`*WithHistory`)核函数名——与内核方法同名,**逐核函数**声明。\n *\n * ⚠️ **为什么不能是一个布尔位**(2026-09-22 Phase 0.2):`evolution: true` 是**族级**声明。\n * 而「本内核提供面演化」这句话在建面上不成立——每个 `*WithHistory` 是一个独立核函数,\n * 内核可以只提供其中一部分。`brepkit` 就是活例:它提供 `fuse`/`cut`/`fillet`,\n * `chamfer`/`intersect`/`translate`/… 一律 `unsupported(...)`\n * (`brepkit-kernel/brepkitKernel.ts:220-537`)。\n *\n * 族级布尔的后果不是\"少报\"而是**多报**:`cad.intersect` 声明需要 `evolution`,\n * 在 `evolution: true` 下通过静态判定 → 落到运行时才撞 `unsupported('intersectWithHistory')`。\n * 这直接违反 AGENTS.md 红线「BREP 路径能否走由静态规则判定,禁止运行时回退」——\n * 静态判定之所以能成立,前提是引擎的能力声明**说的是逐核函数的实话**。\n *\n * ⇒ 引擎声明\"我提供哪几个\"(`BrepCapabilities.evolution`),op 声明\"我要哪一个\"\n * (`defineOp.capabilities`),两者**按名字求交集**(`cad-runtime/backend-dispatch.ts`)。\n */\nexport type BrepEvolutionKind =\n // 布尔族\n | 'fuseWithHistory'\n | 'cutWithHistory'\n | 'intersectWithHistory'\n // 倒圆/倒角族\n | 'filletWithHistory'\n | 'chamferWithHistory'\n // 刚体变换族\n | 'translateWithHistory'\n | 'rotateWithHistory'\n | 'mirrorWithHistory'\n | 'scaleWithHistory'\n // 抽壳/偏置/加厚族\n | 'shellWithHistory'\n | 'offsetWithHistory'\n | 'thickenWithHistory'\n\n/**\n * 非演化内核方法真名(`*WithHistory` 之外的 `BrepEngineApi` 方法)。\n *\n * 与 `BrepEvolutionKind` 分名(P3 冲突消除):`'mirror'` 一个字符串不能同时表示\n * \"提供 `mirrorWithHistory`\"与\"提供 `mirror`\",两族必须互不共用字符串。\n * 语义与 evolution 相同——**逐核函数**声明:声明 = 实现(诚实原则),\n * 缺省/空 = 一个都不提供。\n *\n * 初始全集 = Phase 0 能力映射表(`api/surface/capability-map.json`)盘点的\n * compat op 依赖内核方法 + 方案初始项;Phase 3 全量收敛时按映射表滚动补全。\n */\nexport type BrepMethodKind =\n // pattern 族\n | 'linearPattern'\n | 'circularPattern'\n | 'gridPattern'\n | 'rectangularPattern'\n // 基础方法族(裸方法,无历史)\n | 'mirror'\n | 'rotate'\n | 'translate'\n | 'scale'\n // 倒角/圆角基础方法(directEdit 族下的逐核真名,Phase 2:chamfer op 能力声明\n // 精确到内核方法——brepkit 无 chamfer/chamferDistAngle,静态判定执行前报错)\n | 'chamfer'\n | 'chamferDistAngle'\n | 'fillet'\n | 'filletVariable'\n // 构形/拉伸/放样族\n | 'makeRectangle'\n | 'shell'\n | 'extrude'\n | 'loft'\n | 'loftAdvanced'\n | 'section'\n | 'sweepPipeShell'\n | 'simplePipe'\n | 'revolveVec'\n | 'buildExtrusionLaw'\n // 布尔/装配辅助(裸方法)\n | 'fuse'\n | 'cut'\n | 'intersect'\n | 'fuseAll'\n // 构造方法族\n | 'makeArcEdge'\n | 'makeCircleEdge'\n | 'makeBezierEdge'\n | 'makeCylinder'\n | 'makeEllipsoid'\n | 'makeFace'\n | 'makeFaceOnSurface'\n | 'makeLineEdge'\n | 'makeTorus'\n | 'makeVertex'\n | 'makeWire'\n | 'makeWireFromMixed'\n | 'buildEdgeOnSurface'\n | 'addHolesInFace'\n | 'buildTriFace'\n | 'sew'\n | 'sewAndSolidify'\n // 修复/校验族\n | 'healFace'\n | 'healSolid'\n | 'healWire'\n | 'fixShape'\n | 'fixSelfIntersection'\n | 'isValid'\n | 'removeDegenerateEdges'\n | 'simplify'\n | 'split'\n // 查询/测量族\n // ⚠️ 测量族能力名用 L1 中立名(D5,narrowing plan):`getBoundingBox` / `getVolume`\n // / `getSurfaceArea` / `getLength` / `getCenterOfMass` ——能力名 == BrepEngineApi 接口名,\n // 守卫「能力声明诚实」据此逐名断言适配器是 function。旧面自己的原生名\n // (boundingBox/volume/area/length)按其自身命名,\n // 不是能力名空间成员。\n | 'getBoundingBox'\n | 'getVolume'\n | 'getSurfaceArea'\n | 'getLength'\n | 'getCenterOfMass'\n | 'curveParameters'\n | 'curvePointAtParam'\n | 'curveTangent'\n | 'hullFromPoints'\n | 'isNull'\n | 'iterShapes'\n | 'locate'\n | 'shapeType'\n | 'surfaceCenterOfMass'\n | 'surfaceNormal'\n | 'surfaceType'\n | 'uvBounds'\n // 变换族(非演化真名)\n | 'composeTransform'\n | 'applyComposedTransformWithHistory'\n | 'generalTransformNonOrthogonal'\n | 'generalTransformWithHistory'\n // 2026-09-26 C batch: section/drill/pocket/boss/mirrorJoin downgrade wiring.\n | 'sectionByPlane'\n | 'makeCompound'\n | 'located'\n | 'getSubShapes'\n | 'transform'\n | 'generalTransform'\n // 交换/导入族\n | 'importStl'\n | 'createXCAFDocument'\n | 'importXCAFFromSTEP'\n // 生命周期辅助\n | 'copyShape'\n | 'dispose'\n | 'downcast'\n | 'hashCode'\n\n/**\n * 可选能力槽声明(§7.5,Phase 1 钉死成员)。\n *\n * 缺失的能力 → 依赖它的功能静态降级走 mesh(§8.4),绝不伪造。\n *\n * P7 并入(D4):移植 brepjs `KernelCapabilities` 的数据字段(exact/brepExport/\n * exactMeasurement/tessellationModel)进本模型,由适配器在注册时如实声明;分派逻辑\n * (backend-dispatch 的 BrepCapabilityName 路由)不改——新字段是引擎本质描述,不是\n * 逐 op 路由键。\n *\n * 未并入 `disposalModel`(D5 决策,与旧 port 一致):faijs 的句柄释放由\n * `cad-runtime` 顶替释放统一编排(增量失败回滚前提),brepjs 的 DisposalScope/arena\n * 语义不强制统一,故不作为能力位记录。\n */\nexport interface BrepCapabilities {\n /**\n * 面演化族:本引擎**实际提供**的 `*WithHistory` 核函数名(不是族级布尔,见\n * `BrepEvolutionKind`)。空数组 / 缺省 = 一个都不提供。\n */\n evolution?: readonly BrepEvolutionKind[]\n /**\n * 非演化内核方法族:本引擎**实际提供**的 `BrepEngineApi` 方法真名\n * (逐核声明,与 `evolution` 同语义;空数组 / 缺省 = 一个都不提供)。\n */\n methods?: readonly BrepMethodKind[]\n /** 修复族(healSolid/fixShape/fixFaceOrientations/...) */\n heal?: boolean\n /** 直接编辑族(C1:moveFace/replaceFace/...) */\n directEdit?: boolean\n /** 高级曲面族(C1:boundarySurface/fillSurface/...) */\n advSurface?: boolean\n /** XCAF 装配族 */\n assembly?: boolean\n /** mesh→BREP 提升(buildTriFace/sewAndSolidify) */\n meshLift?: boolean\n /** 精确 B-rep 几何(vs mesh 近似)——brepjs KernelCapabilities.exact 并入 */\n exact?: boolean\n /** 可序列化为 B-rep 交换格式(BREP/STEP)——brepjs brepExport 并入 */\n brepExport?: boolean\n /** 体积/面积/长度匹配解析值(vs mesh 近似)——brepjs exactMeasurement 并入 */\n exactMeasurement?: boolean\n /** 细分精度控制模型——brepjs tessellationModel 并入 */\n tessellationModel?: BrepTessellationModel\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/brep/engine/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAU,CAAA;AAgCxE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA","sourcesContent":["/**\n * engine/types — BREP 引擎中立类型(零具体实现依赖,不 import 任何内核包)\n *\n *\n * 契约(对应 brepjs 的 KernelShape 约定):\n * - L1 及以上代码永远不对句柄调用任何方法,只把它传回产生它的那个引擎;\n * - 句柄不得跨引擎传递——跨引擎必须先经 mesh 层(§8.3 的结构保证)。\n * - OCCT 适配器的句柄运行时就是 number,加 brand 是零成本的类型层转换。\n */\n\n/**\n * BREP 引擎身份(D11-1,2026-09-24 narrowing plan)。\n *\n * 三个值来自三个已存在的引擎 id 常量(`OCCT_BREP_ENGINE_ID` / `BREPKIT_BREP_ENGINE_ID`\n * / `BREP_MOCK_ENGINE_ID`,各自适配器导出);本类型由常量数组推导,禁止裸 `string`。\n * 适配器常量用 `satisfies BrepEngineId` 收窄(typecheck 钉住集合一致)。\n *\n * 消费点:`defineOp` 的 `engines` 声明(平台 op 自证身份)、`dispatchPath` 的平台\n * 身份分支(D11-2)、`script-face-manifest` 的平台 op 标注(§3.8)。\n */\nexport const BREP_ENGINE_IDS = ['occt', 'brepkit', 'brep_mock'] as const\n\n/** BREP 引擎身份(固定三值联合;由 {@link BREP_ENGINE_IDS} 推导)。 */\nexport type BrepEngineId = (typeof BREP_ENGINE_IDS)[number]\n\ndeclare const BrepHandleBrand: unique symbol\n\n/**\n * BREP 实体句柄——不透明值。\n *\n * 与 occt-wasm 的 ShapeHandle 同构(number & brand)。OCCT 适配器\n * (occt-kernel/)内部以 `as unknown as` 双向转换,跨适配器边界零运行时成本。\n */\nexport type BrepHandle = number & { readonly [BrepHandleBrand]: never }\n\n/** 三维点/向量(与内核无关的中立形态)。 */\nexport interface BrepVec3 {\n x: number\n y: number\n z: number\n}\n\n/** 轴对齐包围盒。 */\nexport interface BrepBoundingBox {\n xmin: number\n ymin: number\n zmin: number\n xmax: number\n ymax: number\n zmax: number\n}\n\n/**\n * 面/边 hash 的上界(唯一真源)。\n *\n * 拓扑提取侧用 `kernel.hashCode(subShape, BREP_HASH_BOUND)` 查面/边,\n * 三角化/线框侧把 hash 写进 `faceGroups[·+2]` / `edgeGroups[·+2]`——\n * **两侧必须对同一上界取模**,否则查表恒 miss(实测 2026-10-01:\n * brepkit 适配器曾用 1e9、topologyExt 用 INT32_MAX → 面行 triangleCount 全 0)。\n * 值取自 OCCT `HASH_CODE_MAX` 惯例,也是 occt-wasm 的实际口径(实测一致)。\n */\nexport const BREP_HASH_BOUND = 2147483647\n\n/**\n * BRepMesh 三角化输出(镜像 occt-wasm Mesh 的中立形态)。\n *\n * ⚠️ 单位口径(L1 契约的一部分,实测钉死):\n * - `faceGroups` 三元组 = `[triStart, triCount, faceHash]`,前两元是**索引单位**\n * (3/三角形),不是三角形单位;\n * - `wireframe().edgeGroups` = `[pointStart, pointCount, edgeHash]`,前两元是\n * **浮点单位**(3/点)。\n * 修订任何一侧都要同步改另一侧与 brepkit 适配器(跨引擎一致性测试\n * `topology/face-group-units.test.ts` 钉住)。\n */\nexport interface BrepMeshResult {\n /** XYZ 交错顶点坐标,长度 = vertexCount * 3 */\n positions: Float32Array\n /** XYZ 交错顶点法线,长度 = vertexCount * 3 */\n normals: Float32Array\n /** 三角形索引 */\n indices: Uint32Array\n /** 顶点数(positions.length / 3) */\n vertexCount: number\n /** 三角形数(indices.length / 3) */\n triangleCount: number\n /** 面组:[triStart, triCount, faceHash] 三元组(meshShape 时存在) */\n faceGroups?: Int32Array\n /** 面组数(meshShape 时存在) */\n faceCount?: number\n}\n\n/** 三角化精度选项。 */\nexport interface BrepTessellateOptions {\n /** 最大弦偏差(mm),默认 0.1 */\n linearDeflection?: number\n /** 最大角偏差(弧度),默认 0.5 */\n angularDeflection?: number\n /** 按每条边长度相对解释 linearDeflection */\n relative?: boolean\n}\n\n/** 边折线数据(wireframe 输出)。 */\nexport interface BrepEdgeData {\n /** XYZ 交错边采样点 */\n points: Float32Array\n /** 每边分组:[pointStart, pointCount, edgeHash] 三元组;前两元为**浮点单位**(3/点)。 */\n edgeGroups: Int32Array\n /** points 中的浮点数总数(= XYZ 坐标数) */\n pointCount: number\n /** 不同边的数量 */\n edgeCount: number\n}\n\n/**\n * *WithHistory 面演化数据(modified/generated/deleted 用面 hash 编码)。\n *\n * ⚠️ **三个字段的编码不同,实测于 2026-09-22(`brep/engine/phase0-kernel-probes.test.ts`),\n * 与 occt-wasm 自己的文档(`dist/types.d.ts:227-231`)不符**:\n *\n * | 字段 | 实际编码 | 键/值语义 |\n * |---|---|---|\n * | `modified` | **分段** `[inHash, count, outHash…] × N` | 键 = 输入面 hash;值 = 该输入面在结果里的**后继**(可 1→N) |\n * | `generated` | **同构分段**,**键集与 `modified` 相同** | 值 = 该输入面派生出的**中间形**(实测结果里 0 存活) |\n * | `deleted` | **扁平** hash 数组 | 输入面中已不存在的面 |\n *\n * 「扁平数组」的读法会把 `generated` 的 count 字段当成 hash——\n * 实测 `cut` 的 `generated` 里真的含 `2`(一个 count),故该误读不会自己暴露。\n *\n * ⚠️ **未受影响的面有两种上报形态,两种都表示\"未变\"**:自映射(`i -> [i]`)。\n * 或者**整个不上报**(`fillet` 实测两者并存)。⇒ 读法必须是\n * `modified.get(h) ?? [h]`,不能只看\"是否出现在 `modified` 里\"。\n *\n * ⇒ 结果面的三种命运(判据见 `phase0-kernel-probes.test.ts`):\n * **原样幸存**(hash ∈ 输入 hash 集合,hash 逐字不变)/ **改型幸存**(在 `modified` 输出里)/\n * **新造**(两者皆非——这才是真正需要派生词汇命名的面,如 `fillet` 的过渡面)。\n */\nexport interface BrepEvolutionData {\n /** 结果句柄 */\n result: BrepHandle\n /** 分段:`[inHash, count, outHash…] × N`;值 = 该输入面的结果后继 */\n modified: number[]\n /** 分段(键集同 `modified`):该输入面派生的中间形 hash,实测结果里 0 存活 */\n generated: number[]\n /** 扁平:输入面中已不存在的面 hash */\n deleted: number[]\n}\n\n/** 曲线参数区间(与内核 curveParameters 返回同构:first/last)。 */\nexport interface BrepCurveParameters {\n first: number\n last: number\n}\n\n/**\n * NURBS control data of one edge's BASIS curve.\n *\n * ⚠️ This is the WHOLE basis curve, not the edge: an OCCT edge is often only a\n * sub-range of its curve, so `curveParameters(edge)` is the trim to apply on top\n * of this (`BRep_Tool::Curve` hands back both halves). Rebuilding an edge from\n * this data without honouring that trim produces a curve running past its\n * neighbour's start (measured 2026-09-29).\n *\n * `poles` is flat `[x,y,z, x,y,z, …]`; `weights` has one entry per pole (all 1\n * for a non-rational curve, and `rational` then says whether they mean anything);\n * `knots`/`multiplicities` are parallel arrays (expanded, the knot vector is\n * `knots[i]` repeated `multiplicities[i]` times and has `poles + degree + 1`\n * entries).\n */\nexport interface BrepNurbsCurveData {\n /** Polynomial degree. */\n degree: number\n /** True when `weights` are meaningful (a rational curve). */\n rational: boolean\n /** True for a periodic (closed, wrap-around) curve. */\n periodic: boolean\n /** Distinct knot values, parallel to `multiplicities`. */\n knots: number[]\n /** Multiplicity of each entry in `knots`. */\n multiplicities: number[]\n /** Flat control points: `[x, y, z, x, y, z, …]`. */\n poles: number[]\n /** One weight per control point. */\n weights: number[]\n}\n\n/** 曲面 UV 边界。 */\nexport interface BrepUvBounds {\n uMin: number\n uMax: number\n vMin: number\n vMax: number\n}\n\n/** 子形状类型(getSubShapes / subShapeHashes 等)。 */\nexport type BrepSubShapeType = 'vertex' | 'edge' | 'wire' | 'face' | 'shell' | 'solid'\n\n/**\n * XCAF label 句柄(`addShape` / `addChild` 的返回值,仅在所属文档内有效)。\n */\nexport type BrepXcafLabel = number & { readonly __brepXcafLabel: 'BrepXcafLabel' }\n\n/**\n * XCAF 装配文档句柄(可选能力槽 AssemblyCapability 的文档形态)。\n *\n * 形态来自 occt-wasm XCAFDocumentImpl 的被调用子集(step.ts / occt-kernel 装配链)。\n * `addChild` 支撑真装配写入(方案 2026-10-08 步骤 7 / P3):组件位姿经\n * `location`(平移 + Euler 弧度)落到 XCAF location,导出为装配引用而非平级 PRODUCT。\n */\nexport interface BrepXcafDocument {\n /** 顶层 part / 装配 label。返回的 label 可作为 `addChild` 的父。 */\n addShape(shape: BrepHandle, opts?: { name?: string; color?: [number, number, number] }): BrepXcafLabel\n /**\n * 把 shape 作为 parent 的子组件加入(parent 是 part 时,首个 child 使其转为\n * assembly:原几何移入 identity 首组件并携带 part 的名与色)。\n */\n addChild(\n parent: BrepXcafLabel,\n shape: BrepHandle,\n opts?: {\n name?: string\n color?: [number, number, number]\n /** 组件相对父的位姿:平移 + Euler 角(弧度)。⚠️ occt-wasm 当前只生效平移\n * (旋转分量写出→回读恒 identity,step-export.test.ts P7 钉住)——旋转由\n * 调用方烘进几何,wasm 修复后恢复 location 携带完整位姿。 */\n location?: { tx?: number; ty?: number; tz?: number; rx?: number; ry?: number; rz?: number }\n },\n ): BrepXcafLabel\n exportSTEP(): string\n close(): void\n}\n\n/**\n * 面演化(`*WithHistory`)核函数名——与内核方法同名,**逐核函数**。\n *\n * ⚠️ **为什么不是一个布尔位**(2026-09-22 Phase 0.2,事实不变):家族化命名会**多报**。\n * 「本内核提供面演化」这句话在建面上不成立——每个 `*WithHistory` 是一个独立核函数,\n * 内核可以只提供其中一部分。`brepkit` 就是活例:它提供 `fuse`/`cut`/`fillet`,\n * `chamfer`/`intersect`/`translate`/… 一律 `unsupported(...)`\n * (`brepkit-kernel/brepkitKernel.ts:220-537`)。\n *\n * 本类型是「面演化核函数有哪些」的**名字全集**,供 `hasNativeHistory`\n * (`brep/engine/native-history.ts`)按引擎身份逐名回答\"这个引擎原生有没有它\"。\n * 没有声明轴:op 不声明要哪个核函数,分派时也不查任何能力表。\n */\nexport type BrepEvolutionKind =\n // 布尔族\n | 'fuseWithHistory'\n | 'cutWithHistory'\n | 'intersectWithHistory'\n // 倒圆/倒角族\n | 'filletWithHistory'\n | 'chamferWithHistory'\n // 刚体变换族\n | 'translateWithHistory'\n | 'rotateWithHistory'\n | 'mirrorWithHistory'\n | 'scaleWithHistory'\n // 抽壳/偏置/加厚族\n | 'shellWithHistory'\n | 'offsetWithHistory'\n | 'thickenWithHistory'\n"]}
@@ -14,6 +14,7 @@
14
14
  * 红线(§10.3 3a):绝不文本级改坐标 — 坐标只在几何层缩放,文本层只碰单位实体。
15
15
  */
16
16
  import { type UnitName } from '../../units.js';
17
+ import type { Vec3 } from '../../mesh/types.js';
17
18
  import type { BrepHandle } from '../engine/types.js';
18
19
  import type { PbrAppearance } from '../../api/appearance.js';
19
20
  import type { ShapeMeta, FileMeta } from '../../api/meta.js';
@@ -44,6 +45,25 @@ export interface ExportEntry {
44
45
  * `<object name/partnumber>` + `<metadatagroup>`;STEP 走 PRODUCT name(既有)。
45
46
  */
46
47
  meta?: ShapeMeta;
48
+ /**
49
+ * 装配子节点(方案 2026-10-08 §2.1 / 第 4 步):存在时本条目是装配容器,写出器据此
50
+ * 生成 3MF `<components>`(每个 child 一个 `<component objectid>`,子节点的 `transform`
51
+ * 写进 `<component transform>`);STL / STEP 分支忽略此字段或将其展平(逐层烘焙 /
52
+ * 逐实体通道,第 5、7 步)。
53
+ */
54
+ children?: ExportEntry[];
55
+ /**
56
+ * 本节点相对父的位姿(与 `Shape.transform` 同形态,方案 §2.1)。写出器消费:3MF 写
57
+ * `<component transform>`、STEP 写 XCAF location(第 7 步)、STL 顶点烘焙(第 5 步)。
58
+ */
59
+ transform?: {
60
+ translate?: Vec3;
61
+ rotate?: {
62
+ angle: number;
63
+ axis?: Vec3;
64
+ };
65
+ matrix?: number[];
66
+ };
47
67
  }
48
68
  /** Output formats supported by the unified {@link exportModel} entry. */
49
69
  export type ExportFormat = 'stl' | 'step' | '3mf';
@@ -86,6 +106,7 @@ export declare const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'mill
86
106
  * @returns 改写后的 STEP 文本。
87
107
  */
88
108
  export declare function rewriteFileMetaHeader(stepText: string, fileMeta: FileMeta): string;
109
+ export { transformToMatrix12 } from './transform12.js';
89
110
  /**
90
111
  * Synchronous twin of {@link exportModel} for hosts already holding a live
91
112
  * kernel (CLI, in-process consumers). Same invariants: declared unit ==
@@ -1 +1 @@
1
- {"version":3,"file":"export-model.d.ts","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAKjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzD,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAA;IACxD,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACnF;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAQ1H,CAAA;AAuED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA6ClF;AAsND;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,WAAW,CA6Db;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CA6EtB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,CAgBtG"}
1
+ {"version":3,"file":"export-model.d.ts","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzD,oDAAoD;AACpD,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAA;IACxD,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACnF;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,IAAI,CAAA;SAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAC7F;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAED,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAQ1H,CAAA;AA+ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA6ClF;AAuPD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAmDnD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,WAAW,CAmFb;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CAyEtB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,CAgBtG"}