@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.
- package/dist/api/align/index.d.ts +64 -0
- package/dist/api/align/index.d.ts.map +1 -0
- package/dist/api/align/index.js +101 -0
- package/dist/api/align/index.js.map +1 -0
- package/dist/api/api-namespace.d.ts +5 -4
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +36 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean-op/index.d.ts +65 -0
- package/dist/api/boolean-op/index.d.ts.map +1 -0
- package/dist/api/boolean-op/index.js +113 -0
- package/dist/api/boolean-op/index.js.map +1 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +15 -27
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-operations/healingFns.d.ts +13 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -1
- package/dist/api/brep-operations/healingFns.js +28 -1
- package/dist/api/brep-operations/healingFns.js.map +1 -1
- package/dist/api/brep-operations/topologyFns.d.ts +27 -6
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -1
- package/dist/api/brep-operations/topologyFns.js +46 -22
- package/dist/api/brep-operations/topologyFns.js.map +1 -1
- package/dist/api/chamfer.d.ts +5 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -11
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts.map +1 -1
- package/dist/api/curve-sketch/index.js +9 -3
- package/dist/api/curve-sketch/index.js.map +1 -1
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +1 -3
- package/dist/api/draft.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -13
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.d.ts +73 -0
- package/dist/api/export-3mf.d.ts.map +1 -0
- package/dist/api/export-3mf.js +121 -0
- package/dist/api/export-3mf.js.map +1 -0
- package/dist/api/export-brep.d.ts +6 -0
- package/dist/api/export-brep.d.ts.map +1 -1
- package/dist/api/export-brep.js +11 -2
- package/dist/api/export-brep.js.map +1 -1
- package/dist/api/export-step.d.ts +67 -0
- package/dist/api/export-step.d.ts.map +1 -0
- package/dist/api/export-step.js +98 -0
- package/dist/api/export-step.js.map +1 -0
- package/dist/api/export-stl.d.ts +8 -0
- package/dist/api/export-stl.d.ts.map +1 -1
- package/dist/api/export-stl.js +23 -8
- package/dist/api/export-stl.js.map +1 -1
- package/dist/api/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +1 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +0 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +3 -3
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +3 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/operations.js +6 -6
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +1 -1
- package/dist/api/generated/script-face-manifest.js +3 -3
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -1
- package/dist/api/generated/script-face.js +1 -1
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.js +10 -10
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/helix.d.ts +1 -1
- package/dist/api/helix.js +1 -1
- package/dist/api/helix.js.map +1 -1
- package/dist/api/index.d.ts +4 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +16 -4
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +6 -6
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +7 -9
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/export-members.d.ts +80 -0
- package/dist/api/internal/export-members.d.ts.map +1 -0
- package/dist/api/internal/export-members.js +104 -0
- package/dist/api/internal/export-members.js.map +1 -0
- package/dist/api/internal/l3-bridge.d.ts +17 -0
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +23 -1
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/measure-query/index.d.ts +262 -0
- package/dist/api/measure-query/index.d.ts.map +1 -0
- package/dist/api/measure-query/index.js +390 -0
- package/dist/api/measure-query/index.js.map +1 -0
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +0 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts +6 -6
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +12 -11
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +0 -1
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +0 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +5 -7
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +18 -56
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +0 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.d.ts +1 -1
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +11 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +3 -3
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +6 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +0 -1
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +0 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +3 -12
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +19 -26
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +15 -3
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +5 -3
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts.map +1 -1
- package/dist/api/thicken.js +11 -2
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +3 -3
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +47 -17
- package/dist/api/transform.js.map +1 -1
- package/dist/boolean/index.d.ts +23 -0
- package/dist/boolean/index.d.ts.map +1 -0
- package/dist/boolean/index.js +27 -0
- package/dist/boolean/index.js.map +1 -0
- package/dist/brep/brep-chain.d.ts +1 -19
- package/dist/brep/brep-chain.d.ts.map +1 -1
- package/dist/brep/brep-chain.js +0 -1
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +4 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +9 -5
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +0 -3
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +4 -98
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +0 -144
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/native-history.d.ts +27 -0
- package/dist/brep/engine/native-history.d.ts.map +1 -0
- package/dist/brep/engine/native-history.js +54 -0
- package/dist/brep/engine/native-history.js.map +1 -0
- package/dist/brep/engine/registry.d.ts +2 -4
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +35 -77
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +21 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +171 -73
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step.d.ts +17 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +133 -0
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/export/stl.d.ts +22 -1
- package/dist/brep/export/stl.d.ts.map +1 -1
- package/dist/brep/export/stl.js +58 -10
- package/dist/brep/export/stl.js.map +1 -1
- package/dist/brep/export/transform12.d.ts +47 -0
- package/dist/brep/export/transform12.d.ts.map +1 -0
- package/dist/brep/export/transform12.js +87 -0
- package/dist/brep/export/transform12.js.map +1 -0
- package/dist/brep/face-evolution.d.ts +53 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +65 -0
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/browser-host/index.d.ts +4 -1
- package/dist/browser-host/index.d.ts.map +1 -1
- package/dist/browser-host/index.js +7 -1
- package/dist/browser-host/index.js.map +1 -1
- package/dist/browser.d.ts +4 -8
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -26
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +22 -80
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/content-key.d.ts +3 -3
- package/dist/cad-runtime/content-key.js +3 -3
- package/dist/cad-runtime/content-key.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +28 -0
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +33 -12
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +44 -48
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +6 -11
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +3 -20
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +2 -2
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +1 -1
- package/dist/env-agnostic.js.map +1 -1
- package/dist/index.d.ts +13 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -75
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +17 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +17 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/index.d.ts +18 -23
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +18 -20
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +42 -14
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +77 -13
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +38 -4
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +115 -34
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +2 -1
- package/dist/node-host/execute-script.d.ts.map +1 -1
- package/dist/node-host/execute-script.js +5 -4
- package/dist/node-host/execute-script.js.map +1 -1
- package/dist/node-host/index.d.ts +1 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +4 -0
- package/dist/node-host/index.js.map +1 -1
- package/dist/primitives/index.d.ts +19 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +21 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/runtime-state.d.ts +63 -29
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +57 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdf/index.d.ts +12 -0
- package/dist/sdf/index.d.ts.map +1 -0
- package/dist/sdf/index.js +13 -0
- package/dist/sdf/index.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js.map +1 -1
- package/dist/weapp.d.ts +2 -2
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +276 -35
package/dist/browser.js
CHANGED
|
@@ -11,30 +11,21 @@
|
|
|
11
11
|
* - B 类 = cad-runtime/ + createBrowserPorts + 外部资源注入点 + 执行位置选项
|
|
12
12
|
* - C 类 = 执行产物类型(Shape + 拓扑数据类型 + buildSelectorRuntimeMaps)
|
|
13
13
|
* - D 类 = 辅助函数 + 预览 API(明确导出后使用)
|
|
14
|
-
*
|
|
15
|
-
* Phase 2 收尾完成:deprecated 区已删除。宿主如需执行/读取几何,一律走
|
|
16
|
-
* CadRuntime.execute / 高层 API(importStep/exportStep/ensureOcctKernel);
|
|
17
|
-
* 主线程 CSG/SDF 预览走 previewMeshIntersect / runSdfMain。
|
|
18
14
|
*/
|
|
19
|
-
// 共享面(env-agnostic:identity + runtime-state + lang
|
|
20
|
-
// 三处 umbrella(index/browser/weapp)统一 re-export,防漂移。
|
|
15
|
+
// 共享面(env-agnostic:identity + runtime-state + lang/*)
|
|
21
16
|
export * from './env-agnostic.js';
|
|
22
17
|
// ═══════════════════════════════════════════════════════════
|
|
23
18
|
// B 类:cad-runtime/ + createBrowserPorts + 外部资源注入点
|
|
24
19
|
// ═══════════════════════════════════════════════════════════
|
|
25
|
-
|
|
26
|
-
export { CadRuntime, createRuntime, AppendPrefixError } from './cad-runtime/createRuntimeWithCad.js';
|
|
20
|
+
export { CadRuntime, createRuntime, createBareRuntime, AppendPrefixError } from './cad-runtime/runtime.js';
|
|
27
21
|
export { createPreviewExec } from './cad-runtime/preview-exec.js';
|
|
28
22
|
// 外部资源注入点
|
|
29
23
|
export { setManifoldWasmUrl, getManifoldWasmUrl } from './mesh/manifold-loader.js';
|
|
30
24
|
export { setOcctWasmInitFn } from './occt-kernel/occtKernel.js';
|
|
31
|
-
// brepkit(weapp 专用 BREP 引擎)不在此导出——见 weapp.ts。
|
|
32
25
|
export { setFontLoader, getFontLoader, loadFont, ensureDefaultFont, ensureFont, getFont, clearFonts } from './brep/text/fontRegistry.js';
|
|
33
26
|
export { setKnurlTextureLoader } from './mesh/knurl/textureLoader.js';
|
|
34
27
|
// L3 Browser Host 工厂
|
|
35
28
|
export { createBrowserPorts } from './browser-host/index.js';
|
|
36
|
-
// D3-Browser(§9.4):CDN 通用 libLoader 工厂(a/b 混合)。**不**被 createBrowserPorts
|
|
37
|
-
// 默认装配——demo 的源码 alias HMR 路径必须零网络;CDN 装载由主机显式注入。
|
|
38
29
|
export { createBrowserLibLoader, DEFAULT_CDN_BASE } from './cad-runtime/browser-lib-loader.js';
|
|
39
30
|
export { BrowserEventSink } from './browser-host/browser-event-sink.js';
|
|
40
31
|
export { BrowserFontProvider } from './browser-host/browser-font-provider.js';
|
|
@@ -46,26 +37,17 @@ export { importStep, importStepMultiPart, exportStep, releaseSolid, ensureOcctKe
|
|
|
46
37
|
// ── BREP 引擎注册(宿主装配;引擎可切换——occt 只是默认实现) ──
|
|
47
38
|
export { registerOcctBrepEngine, OCCT_BREP_ENGINE_ID } from './brep/engine/adapters/occt.js';
|
|
48
39
|
export { registerBrepEngine, getBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries, registerMeshEngine, getMeshEngine, getActiveMeshEngineId, isMeshEngineRegistered, getMeshSolidBackend, } from './brep/engine/registry.js';
|
|
49
|
-
// 网格实体(近似拓扑的载体):端口 + 注册表 + 驱动。
|
|
50
|
-
// 注意:**brepkit 网格适配器不在 browser umbrella**——与 BREP 适配器同因
|
|
51
|
-
// (`brepkitWasm` 的 node 分支 `import('brepkit-wasm')` 会被 vite 静态解析,
|
|
52
|
-
// 该包在 web 侧不存在;见 entry-boundary.test.ts)。浏览器宿主需要网格实体时,
|
|
53
|
-
// 从根入口 `@faicad/faijs` 或 `weapp` 取 `ensureBrepkitMeshBackend`,或自备后端。
|
|
54
40
|
export { MeshSolidRegistry, normalizeMeshSolid, describeMeshSolid, buildMeshSolidTopology, weldToleranceFor } from './brep/mesh-solid.js';
|
|
55
41
|
export { assertShapeSlotExclusive } from './cad-runtime/backend-dispatch.js';
|
|
56
42
|
export { buildTopologyAdjacency } from './occt-kernel/topologyExt.js';
|
|
57
43
|
// keep-syntax(P7):宿主守卫——outputs 现含 compound,消费端须区分
|
|
58
44
|
export { isCompoundLike } from './shape.js';
|
|
59
45
|
export { isMeshShape } from './mesh/types.js';
|
|
60
|
-
// buildSelectorRuntimeMaps: C 类(从 SelectorRuntimeData 构建 SelectorRuntime Maps)
|
|
61
46
|
export { buildSelectorRuntimeMaps } from './topology/build-selector-runtime.js';
|
|
62
|
-
// 拓扑常量
|
|
63
47
|
export { TOPOLOGY_FACE_ID_NONE } from './topology/build-face-ids.js';
|
|
64
48
|
// ── TopoRef 命名层(§3.7/§3.8:命名属于核心公共能力,随 browser/node 走)──
|
|
65
49
|
export * from './topology/naming/index.js';
|
|
66
|
-
// D
|
|
67
|
-
// 注意:这些只在加载/创建时刻合法,变更后不重新生成
|
|
68
|
-
// BREP 真拓扑通过 CadRuntime.buildBrepTopology() 获取,不再直接导出 buildSolidTopologyRuntime
|
|
50
|
+
// D 类辅助:拓扑构建函数
|
|
69
51
|
export { buildSelectorRuntime, buildSelectorRuntimeData } from './topology/build-selector-runtime.js';
|
|
70
52
|
export { buildFaceIdsForPart } from './topology/build-face-ids.js';
|
|
71
53
|
// C 类辅助:面查询
|
|
@@ -79,10 +61,7 @@ export { loadSystemCjkFont, containsCjk, isCjkChar } from './primitives/text/cjk
|
|
|
79
61
|
// ═══════════════════════════════════════════════════════════
|
|
80
62
|
// D 类:辅助函数 + 预览 API
|
|
81
63
|
// ═══════════════════════════════════════════════════════════
|
|
82
|
-
// 预览 API
|
|
83
|
-
// B3 correction (2026-10-06): no `cad` / `meshCad` aggregate is exported from the library
|
|
84
|
-
// face; `cad` belongs to the script face (host-injected ops) — TS consumers import
|
|
85
|
-
// per-module from `@faicad/faijs/mesh/*`.
|
|
64
|
+
// 预览 API
|
|
86
65
|
export { deriveNormals } from './boolean/deriveNormals.js';
|
|
87
66
|
export { computeSection, buildExtrudedProfile } from './boolean/cross-section.js';
|
|
88
67
|
export { buildExtrudeParts, makeWorldPlane } from './boolean/extrude-helpers.js';
|
|
@@ -90,7 +69,6 @@ export { buildWedgeGeometry, buildDowelGeometry, buildStraightTenonGeometry, } f
|
|
|
90
69
|
export { geoToManifoldMesh, manifoldMeshToGeo } from './boolean/geo-convert.js';
|
|
91
70
|
export { manifoldToMeshData, weldPositionsWorker, dovetailBooleanSplit, dowelOrTenonBooleanSplit, chainBoolean, meshToManifold } from './boolean/csg-core.js';
|
|
92
71
|
export { previewMeshIntersect } from './boolean/manifold-preview.js';
|
|
93
|
-
// 宿主注入的 mesh 装饰几何(cad.engrave 的文字/SVG 几何链在 @faicad/faijs-extra)
|
|
94
72
|
export { setEngraveDecorationProvider, getEngraveDecorationProvider } from './mesh/decoration-provider.js';
|
|
95
73
|
export { runSdfInline } from './sdf/sdf-core.js';
|
|
96
74
|
export { runSdf as runSdfMain } from './sdf/sdf-runner.js';
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @faicad/faijs/browser — Browser-safe exports (F6: A/B/C/D 四类收敛)\n *\n * Excludes L3 Node Host modules (node-host/*) that depend on node:fs/node:path.\n * Use this entry point in browser/worker contexts to avoid pulling in Node.js code.\n *\n * For full exports (including Node.js), use @faicad/faijs instead.\n *\n * 导出分类(契约 §11 白名单四类):\n * - A 类 = lang/ 全部导出(脚本类型 + 构建辅助 + 接口约定类型 + 常量)\n * - B 类 = cad-runtime/ + createBrowserPorts + 外部资源注入点 + 执行位置选项\n * - C 类 = 执行产物类型(Shape + 拓扑数据类型 + buildSelectorRuntimeMaps)\n * - D 类 = 辅助函数 + 预览 API(明确导出后使用)\n *\n * Phase 2 收尾完成:deprecated 区已删除。宿主如需执行/读取几何,一律走\n * CadRuntime.execute / 高层 API(importStep/exportStep/ensureOcctKernel);\n * 主线程 CSG/SDF 预览走 previewMeshIntersect / runSdfMain。\n */\n\n// 共享面(env-agnostic:identity + runtime-state + lang/*)——手写清单已收敛,\n// 三处 umbrella(index/browser/weapp)统一 re-export,防漂移。\nexport * from './env-agnostic'\n\n// ═══════════════════════════════════════════════════════════\n// B 类:cad-runtime/ + createBrowserPorts + 外部资源注入点\n// ═══════════════════════════════════════════════════════════\n\n// D1(2026-09-19):浏览器入口同样自注册 cad(与 index.ts 同源包装,避免门面注入)。\nexport { CadRuntime, createRuntime, AppendPrefixError } from './cad-runtime/createRuntimeWithCad'\nexport { createPreviewExec } from './cad-runtime/preview-exec'\nexport type { PreviewExec } from './cad-runtime/preview-exec'\nexport type { ExecutionResult, ExecuteOptions, CheckResult, CheckError, PartTopology, TopologySource } from './cad-runtime/runtime'\nexport type {\n HostPorts,\n CsgBackend, SdfBackend, FontProvider, TextureSampler,\n AssetResolver, EventSink, ExecutionMode, LibLoader,\n MeshData, PlaneParams, SplitResult as CsgSplitResult,\n DovetailGrooveParams as PortDovetailGrooveParams,\n DowelSplitParams as PortDowelSplitParams,\n StraightTenonSplitParams as PortStraightTenonSplitParams,\n} from './cad-runtime/ports'\n\n// 外部资源注入点\nexport { setManifoldWasmUrl, getManifoldWasmUrl } from './mesh/manifold-loader'\nexport { setOcctWasmInitFn } from './occt-kernel/occtKernel'\n// brepkit(weapp 专用 BREP 引擎)不在此导出——见 weapp.ts。\nexport { setFontLoader, getFontLoader, loadFont, ensureDefaultFont, ensureFont, getFont, clearFonts } from './brep/text/fontRegistry'\nexport type { FontLoader } from './brep/text/fontRegistry'\nexport { setKnurlTextureLoader } from './mesh/knurl/textureLoader'\n\n// L3 Browser Host 工厂\nexport { createBrowserPorts } from './browser-host'\nexport type { CreateBrowserPortsOptions } from './browser-host'\n// D3-Browser(§9.4):CDN 通用 libLoader 工厂(a/b 混合)。**不**被 createBrowserPorts\n// 默认装配——demo 的源码 alias HMR 路径必须零网络;CDN 装载由主机显式注入。\nexport { createBrowserLibLoader, DEFAULT_CDN_BASE } from './cad-runtime/browser-lib-loader'\nexport type {\n BrowserLibLoader, BrowserLibMeta, CreateBrowserLibLoaderOptions,\n} from './cad-runtime/browser-lib-loader'\nexport { BrowserEventSink } from './browser-host/browser-event-sink'\nexport { BrowserFontProvider } from './browser-host/browser-font-provider'\nexport type { BrowserFontProviderOptions } from './browser-host/browser-font-provider'\nexport { FetchAssetResolver } from './browser-host/fetch-asset-resolver'\nexport type { FetchAssetResolverOptions } from './browser-host/fetch-asset-resolver'\nexport { WorkerCsgBackend } from './browser-host/worker-csg-backend'\nexport { WorkerSdfBackend } from './browser-host/worker-sdf-backend'\n\n// E12.2: OCCT 高层 API(B 类——宿主用这些替代底层 kernel 函数)\nexport { importStep, importStepMultiPart, exportStep, releaseSolid, ensureOcctKernel, disposeOcct, exportStepFromSolidsHighLevel } from './occt-kernel/highLevelApi'\nexport type { ImportStepResult, ImportStepPartResult, ExportStepOptions } from './occt-kernel/highLevelApi'\n// 高层 API 的类型签名依赖的 OCCT 句柄/内核类型(D 类,公共契约)\nexport type { OcctKernel, ShapeHandle, WasmTessellatedMesh, Mesh, MeshDeflectionOptions } from './occt-kernel/highLevelApi'\n\n// ── BREP 引擎注册(宿主装配;引擎可切换——occt 只是默认实现) ──\nexport { registerOcctBrepEngine, OCCT_BREP_ENGINE_ID } from './brep/engine/adapters/occt'\nexport {\n registerBrepEngine, getBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries,\n registerMeshEngine, getMeshEngine, getActiveMeshEngineId, isMeshEngineRegistered, getMeshSolidBackend,\n} from './brep/engine/registry'\nexport type { BrepEngine, BrepEngineProvider, MeshEngine } from './brep/engine/registry'\n// 网格实体(近似拓扑的载体):端口 + 注册表 + 驱动。\n// 注意:**brepkit 网格适配器不在 browser umbrella**——与 BREP 适配器同因\n// (`brepkitWasm` 的 node 分支 `import('brepkit-wasm')` 会被 vite 静态解析,\n// 该包在 web 侧不存在;见 entry-boundary.test.ts)。浏览器宿主需要网格实体时,\n// 从根入口 `@faicad/faijs` 或 `weapp` 取 `ensureBrepkitMeshBackend`,或自备后端。\nexport { MeshSolidRegistry, normalizeMeshSolid, describeMeshSolid, buildMeshSolidTopology, weldToleranceFor } from './brep/mesh-solid'\nexport type {\n MeshSolidBackend, MeshSolidResult, MeshSolidKernelOps, MeshSolidInput, MeshSolidNormalizeOptions,\n} from './brep/mesh-solid'\nexport { assertShapeSlotExclusive } from './cad-runtime/backend-dispatch'\nexport type { BrepEngineApi } from './brep/engine/primitives'\nexport type {\n BrepHandle, BrepMeshResult, BrepBoundingBox, BrepVec3, BrepCapabilities,\n BrepEvolutionData, BrepXcafDocument,\n} from './brep/engine/types'\nexport { buildTopologyAdjacency, type TopologyAdjacency } from './occt-kernel/topologyExt'\n\n// keep-syntax(P7):宿主守卫——outputs 现含 compound,消费端须区分\nexport { isCompoundLike } from './shape'\nexport { isMeshShape } from './mesh/types'\n\n// ═══════════════════════════════════════════════════════════\n// C 类:执行产物类型(Shape + 拓扑数据类型 + buildSelectorRuntimeMaps)\n// ═══════════════════════════════════════════════════════════\n\nexport type { Shape } from './mesh/types'\n\n// 拓扑数据类型\nexport type { SelectorRuntimeData } from './topology/build-selector-runtime'\nexport type {\n SelectorRuntime, SelectorBundle, SelectorManifest, SelectorBuffers,\n FaceRow, EdgeRow, Reference,\n BufferViewDescriptor, SelectorProxy,\n} from './topology/types'\n\n// buildSelectorRuntimeMaps: C 类(从 SelectorRuntimeData 构建 SelectorRuntime Maps)\nexport { buildSelectorRuntimeMaps } from './topology/build-selector-runtime'\n\n// 拓扑常量\nexport { TOPOLOGY_FACE_ID_NONE } from './topology/build-face-ids'\n\n// ── TopoRef 命名层(§3.7/§3.8:命名属于核心公共能力,随 browser/node 走)──\nexport * from './topology/naming'\n\n// D 类辅助:拓扑构建函数(宿主在加载时刻调用,构建 mesh/primitive 近似拓扑)\n// 注意:这些只在加载/创建时刻合法,变更后不重新生成\n// BREP 真拓扑通过 CadRuntime.buildBrepTopology() 获取,不再直接导出 buildSolidTopologyRuntime\nexport { buildSelectorRuntime, buildSelectorRuntimeData } from './topology/build-selector-runtime'\nexport { buildFaceIdsForPart } from './topology/build-face-ids'\nexport type { SolidTopologyResult } from './brep/brep-topology'\n\n// C 类辅助:面查询\nexport { faceAt } from './mesh/query'\nexport type {\n BoundingBox, FaceDescriptor,\n BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams,\n TextParams, SvgExtrudeParams, SdfParams,\n DrillParams, ExtrudeParams, EngraveParams, KnurlParams,\n SplitPlane, SplitResult,\n} from './mesh/types'\nexport { NRAD_DEFAULT, NRAD_MIN, NRAD_MAX, clampNRad } from './mesh/types'\n\n// SDF 类型\nexport type { SdfMeshData } from './sdf/sdf-runner'\nexport { SDF_TEMPLATES, DEFAULT_SDF_TEMPLATE } from './sdf/templates'\nexport type {\n SdfMeta, SdfBox, SdfParamDef, SdfTemplateCategory,\n SdfWorkerInput, SdfWorkerMessage,\n} from './sdf/types'\nexport { boxToTuple, parseParamDefs, defaultParamValues } from './sdf/types'\n\n// Primitive 类型\nexport type {\n PrimitiveType, PrimitiveParamsRecord, PrimitiveArgsRecord, PrimitiveMeta,\n} from './primitives/types'\nexport { nextPrimitiveColor } from './primitives/types'\nexport type { ScrewParams, ScrewSpec, ScrewSystem } from './primitives/screw/screw-db'\nexport { getScrewSpec, getScrewSpecs, threadToPitchMm, SCREW_HEAD_DIMS } from './primitives/screw/screw-db'\n// B 组(svg 挤出 / 3D 文字几何链)已随 @faicad/faijs-extra 迁出;留 core 的是\n// 零 three 的 CJK 字符判定与系统字体装载。\nexport type { CjkFontResult } from './primitives/text/cjk-font'\nexport { loadSystemCjkFont, containsCjk, isCjkChar } from './primitives/text/cjk-font'\n\n// Boolean/CSG 辅助类型\nexport type { ExtrudeParts, ExtrudeOffsetMode } from './boolean/extrude-helpers'\nexport type { JoineryMeshData } from './boolean/joinery-shapes'\nexport type {\n ManifoldMeshData, BooleanOperation,\n DovetailGrooveParams, DowelSplitParams, StraightTenonSplitParams,\n} from './boolean/geo-convert'\nexport type { TextureData } from './mesh/knurl/textureLoader'\nexport type { KnurlBounds } from './mesh/knurl/KnurlGenerator'\nexport type { DrillBrepParams, SplitBrepParams, SplitBrepResult, ExtrudeBrepParams } from './brep/brep-ops'\nexport type { PrimitiveToBrepResult, PrimitiveParams } from './primitives/brep-primitives'\n\n// ═══════════════════════════════════════════════════════════\n// D 类:辅助函数 + 预览 API\n// ═══════════════════════════════════════════════════════════\n\n// 预览 API(D 类——宿主用这些做交互预览,不提交几何)\n// B3 correction (2026-10-06): no `cad` / `meshCad` aggregate is exported from the library\n// face; `cad` belongs to the script face (host-injected ops) — TS consumers import\n// per-module from `@faicad/faijs/mesh/*`.\nexport { deriveNormals } from './boolean/deriveNormals'\nexport { computeSection, buildExtrudedProfile } from './boolean/cross-section'\nexport { buildExtrudeParts, makeWorldPlane } from './boolean/extrude-helpers'\nexport {\n buildWedgeGeometry, buildDowelGeometry, buildStraightTenonGeometry,\n} from './boolean/joinery-shapes'\nexport { geoToManifoldMesh, manifoldMeshToGeo } from './boolean/geo-convert'\nexport { manifoldToMeshData, weldPositionsWorker, dovetailBooleanSplit, dowelOrTenonBooleanSplit, chainBoolean, meshToManifold } from './boolean/csg-core'\nexport { previewMeshIntersect } from './boolean/manifold-preview'\nexport type { ManifoldMeshData as PreviewManifoldMeshData } from './boolean/manifold-preview'\n// 宿主注入的 mesh 装饰几何(cad.engrave 的文字/SVG 几何链在 @faicad/faijs-extra)\nexport { setEngraveDecorationProvider, getEngraveDecorationProvider } from './mesh/decoration-provider'\nexport type { EngraveDecorationProvider, EngraveDecorationParams } from './mesh/decoration-provider'\nexport { runSdfInline } from './sdf/sdf-core'\nexport { runSdf as runSdfMain } from './sdf/sdf-runner'\nexport type { SdfMeshData as PreviewSdfMesh } from './sdf/sdf-runner'\n\n// Knurl D 类\nexport { applyKnurlDisplacement, KNURL_DEFAULTS } from './mesh/knurl/KnurlGenerator'\nexport { subdivide } from './mesh/knurl/subdivision'\nexport { loadKnurlingTexture } from './mesh/knurl/textureLoader'\nexport { QuantizedPointMap, weldVertices } from './mesh/knurl/meshIndex'\nexport { computeUV, MODE_TRIPLANAR, getCubicBlendWeights, type MappingSettings } from './mesh/knurl/mapping'\nexport { applyDisplacement, type DisplacementSettings } from './mesh/knurl/displacement'\n\n// Primitive D 类(预览用)\nexport { mergeBufferGeometries, makePrimitiveGeo, DEFAULT_SIZE, applyPrimitiveOffset } from './primitives/mesh-primitives'\nexport { makeScrew } from './primitives/screw/screw'\nexport {\n extractMeshData, primitiveToBrepSolid, geometryToBrepSolid,\n brepSolidToStep, primitiveToBrepStep,\n} from './primitives/brep-primitives'\n\n// BREP 辅助(D 类)\nexport {\n solidToShape,\n translateBrep, rotateBrep, scaleBrep, applyTransformBrep,\n fuseBrep, cutBrep, commonBrep,\n drillBrep, splitBrep, extrudeBrep,\n loadBrep, loadBrepAssembly, matrixToArray,\n type LoadBrepAssemblyPart,\n} from './brep/brep-ops'\nexport { getSolidBoundingBox } from './brep/brep-utils'\nexport { buildStlBufferFromMesh } from './brep/export/stl'\nexport { exportStepFromSolid, exportStepFromSolids } from './brep/export/step'\nexport type { StepExportEntry } from './brep/export/step'\nexport { reconstructSolidFromMesh, meshToAsciiStl, cadShapeIsValid, meshToStepBrep } from './occt-kernel/meshReconstruct'\n\n// ── 导入模型结构(P0,方案 2026-10-06-step-3mf-multipart-import-plan.md §5.1)──\nexport type {\n ImportModel, ImportPart, ImportAssemblyNode, ImportBambuViews,\n} from './mesh/import-model'\n\n// ── L3 API 面(api/ 层)──\nexport * from './api'\n// Vec3 双源消歧:env-agnostic(lang/types)与 api(mesh/types)均有 Vec3,\n// 显式 re-export 定为 lang 版(与收敛前 browser.ts 的具名导出一致)。\nexport type { Vec3 } from './lang/types'\n"]}
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @faicad/faijs/browser — Browser-safe exports (F6: A/B/C/D 四类收敛)\n *\n * Excludes L3 Node Host modules (node-host/*) that depend on node:fs/node:path.\n * Use this entry point in browser/worker contexts to avoid pulling in Node.js code.\n *\n * For full exports (including Node.js), use @faicad/faijs instead.\n *\n * 导出分类(契约 §11 白名单四类):\n * - A 类 = lang/ 全部导出(脚本类型 + 构建辅助 + 接口约定类型 + 常量)\n * - B 类 = cad-runtime/ + createBrowserPorts + 外部资源注入点 + 执行位置选项\n * - C 类 = 执行产物类型(Shape + 拓扑数据类型 + buildSelectorRuntimeMaps)\n * - D 类 = 辅助函数 + 预览 API(明确导出后使用)\n */\n\n// 共享面(env-agnostic:identity + runtime-state + lang/*)\nexport * from './env-agnostic'\n\n// ═══════════════════════════════════════════════════════════\n// B 类:cad-runtime/ + createBrowserPorts + 外部资源注入点\n// ═══════════════════════════════════════════════════════════\n\nexport { CadRuntime, createRuntime, createBareRuntime, AppendPrefixError } from './cad-runtime/runtime'\nexport { createPreviewExec } from './cad-runtime/preview-exec'\nexport type { PreviewExec } from './cad-runtime/preview-exec'\nexport type { ExecutionResult, ExecuteOptions, CheckResult, CheckError, PartTopology, TopologySource } from './cad-runtime/runtime'\nexport type {\n HostPorts,\n CsgBackend, SdfBackend, FontProvider, TextureSampler,\n AssetResolver, EventSink, ExecutionMode, HostEnv, LibLoader,\n MeshData, PlaneParams, SplitResult as CsgSplitResult,\n DovetailGrooveParams as PortDovetailGrooveParams,\n DowelSplitParams as PortDowelSplitParams,\n StraightTenonSplitParams as PortStraightTenonSplitParams,\n} from './cad-runtime/ports'\n\n// 外部资源注入点\nexport { setManifoldWasmUrl, getManifoldWasmUrl } from './mesh/manifold-loader'\nexport { setOcctWasmInitFn } from './occt-kernel/occtKernel'\nexport { setFontLoader, getFontLoader, loadFont, ensureDefaultFont, ensureFont, getFont, clearFonts } from './brep/text/fontRegistry'\nexport type { FontLoader } from './brep/text/fontRegistry'\nexport { setKnurlTextureLoader } from './mesh/knurl/textureLoader'\n\n// L3 Browser Host 工厂\nexport { createBrowserPorts } from './browser-host'\nexport type { CreateBrowserPortsOptions } from './browser-host'\nexport { createBrowserLibLoader, DEFAULT_CDN_BASE } from './cad-runtime/browser-lib-loader'\nexport type {\n BrowserLibLoader, BrowserLibMeta, CreateBrowserLibLoaderOptions,\n} from './cad-runtime/browser-lib-loader'\nexport { BrowserEventSink } from './browser-host/browser-event-sink'\nexport { BrowserFontProvider } from './browser-host/browser-font-provider'\nexport type { BrowserFontProviderOptions } from './browser-host/browser-font-provider'\nexport { FetchAssetResolver } from './browser-host/fetch-asset-resolver'\nexport type { FetchAssetResolverOptions } from './browser-host/fetch-asset-resolver'\nexport { WorkerCsgBackend } from './browser-host/worker-csg-backend'\nexport { WorkerSdfBackend } from './browser-host/worker-sdf-backend'\n\n// E12.2: OCCT 高层 API(B 类——宿主用这些替代底层 kernel 函数)\nexport { importStep, importStepMultiPart, exportStep, releaseSolid, ensureOcctKernel, disposeOcct, exportStepFromSolidsHighLevel } from './occt-kernel/highLevelApi'\nexport type { ImportStepResult, ImportStepPartResult, ExportStepOptions } from './occt-kernel/highLevelApi'\nexport type { OcctKernel, ShapeHandle, WasmTessellatedMesh, Mesh, MeshDeflectionOptions } from './occt-kernel/highLevelApi'\n\n// ── BREP 引擎注册(宿主装配;引擎可切换——occt 只是默认实现) ──\nexport { registerOcctBrepEngine, OCCT_BREP_ENGINE_ID } from './brep/engine/adapters/occt'\nexport {\n registerBrepEngine, getBrepEngine, hasBrepEngine, getActiveBrepEngineId, freezeEngineRegistries,\n registerMeshEngine, getMeshEngine, getActiveMeshEngineId, isMeshEngineRegistered, getMeshSolidBackend,\n} from './brep/engine/registry'\nexport type { BrepEngine, BrepEngineProvider, MeshEngine } from './brep/engine/registry'\nexport { MeshSolidRegistry, normalizeMeshSolid, describeMeshSolid, buildMeshSolidTopology, weldToleranceFor } from './brep/mesh-solid'\nexport type {\n MeshSolidBackend, MeshSolidResult, MeshSolidKernelOps, MeshSolidInput, MeshSolidNormalizeOptions,\n} from './brep/mesh-solid'\nexport { assertShapeSlotExclusive } from './cad-runtime/backend-dispatch'\nexport type { BrepEngineApi } from './brep/engine/primitives'\nexport type {\n BrepHandle, BrepMeshResult, BrepBoundingBox, BrepVec3, BrepEvolutionKind,\n BrepEvolutionData, BrepXcafDocument,\n} from './brep/engine/types'\nexport { buildTopologyAdjacency, type TopologyAdjacency } from './occt-kernel/topologyExt'\n\n// keep-syntax(P7):宿主守卫——outputs 现含 compound,消费端须区分\nexport { isCompoundLike } from './shape'\nexport { isMeshShape } from './mesh/types'\n\n// ═══════════════════════════════════════════════════════════\n// C 类:执行产物类型(Shape + 拓扑数据类型 + buildSelectorRuntimeMaps)\n// ═══════════════════════════════════════════════════════════\n\nexport type { Shape } from './mesh/types'\n\n// 拓扑数据类型\nexport type { SelectorRuntimeData } from './topology/build-selector-runtime'\nexport type {\n SelectorRuntime, SelectorBundle, SelectorManifest, SelectorBuffers,\n FaceRow, EdgeRow, Reference,\n BufferViewDescriptor, SelectorProxy,\n} from './topology/types'\n\nexport { buildSelectorRuntimeMaps } from './topology/build-selector-runtime'\nexport { TOPOLOGY_FACE_ID_NONE } from './topology/build-face-ids'\n\n// ── TopoRef 命名层(§3.7/§3.8:命名属于核心公共能力,随 browser/node 走)──\nexport * from './topology/naming'\n\n// D 类辅助:拓扑构建函数\nexport { buildSelectorRuntime, buildSelectorRuntimeData } from './topology/build-selector-runtime'\nexport { buildFaceIdsForPart } from './topology/build-face-ids'\nexport type { SolidTopologyResult } from './brep/brep-topology'\n\n// C 类辅助:面查询\nexport { faceAt } from './mesh/query'\nexport type {\n BoundingBox, FaceDescriptor,\n BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams,\n TextParams, SvgExtrudeParams, SdfParams,\n DrillParams, ExtrudeParams, EngraveParams, KnurlParams,\n SplitPlane, SplitResult,\n} from './mesh/types'\nexport { NRAD_DEFAULT, NRAD_MIN, NRAD_MAX, clampNRad } from './mesh/types'\n\n// SDF 类型\nexport type { SdfMeshData } from './sdf/sdf-runner'\nexport { SDF_TEMPLATES, DEFAULT_SDF_TEMPLATE } from './sdf/templates'\nexport type {\n SdfMeta, SdfBox, SdfParamDef, SdfTemplateCategory,\n SdfWorkerInput, SdfWorkerMessage,\n} from './sdf/types'\nexport { boxToTuple, parseParamDefs, defaultParamValues } from './sdf/types'\n\n// Primitive 类型\nexport type {\n PrimitiveType, PrimitiveParamsRecord, PrimitiveArgsRecord, PrimitiveMeta,\n} from './primitives/types'\nexport { nextPrimitiveColor } from './primitives/types'\nexport type { ScrewParams, ScrewSpec, ScrewSystem } from './primitives/screw/screw-db'\nexport { getScrewSpec, getScrewSpecs, threadToPitchMm, SCREW_HEAD_DIMS } from './primitives/screw/screw-db'\nexport type { CjkFontResult } from './primitives/text/cjk-font'\nexport { loadSystemCjkFont, containsCjk, isCjkChar } from './primitives/text/cjk-font'\n\n// Boolean/CSG 辅助类型\nexport type { ExtrudeParts, ExtrudeOffsetMode } from './boolean/extrude-helpers'\nexport type { JoineryMeshData } from './boolean/joinery-shapes'\nexport type {\n ManifoldMeshData, BooleanOperation,\n DovetailGrooveParams, DowelSplitParams, StraightTenonSplitParams,\n} from './boolean/geo-convert'\nexport type { TextureData } from './mesh/knurl/textureLoader'\nexport type { KnurlBounds } from './mesh/knurl/KnurlGenerator'\nexport type { DrillBrepParams, SplitBrepParams, SplitBrepResult, ExtrudeBrepParams } from './brep/brep-ops'\nexport type { PrimitiveToBrepResult, PrimitiveParams } from './primitives/brep-primitives'\n\n// ── 导入模型结构(P0)──\nexport type {\n ImportModel, ImportPart, ImportAssemblyNode, ImportBambuViews,\n} from './mesh/import-model'\n\n// ═══════════════════════════════════════════════════════════\n// D 类:辅助函数 + 预览 API\n// ═══════════════════════════════════════════════════════════\n\n// 预览 API\nexport { deriveNormals } from './boolean/deriveNormals'\nexport { computeSection, buildExtrudedProfile } from './boolean/cross-section'\nexport { buildExtrudeParts, makeWorldPlane } from './boolean/extrude-helpers'\nexport {\n buildWedgeGeometry, buildDowelGeometry, buildStraightTenonGeometry,\n} from './boolean/joinery-shapes'\nexport { geoToManifoldMesh, manifoldMeshToGeo } from './boolean/geo-convert'\nexport { manifoldToMeshData, weldPositionsWorker, dovetailBooleanSplit, dowelOrTenonBooleanSplit, chainBoolean, meshToManifold } from './boolean/csg-core'\nexport { previewMeshIntersect } from './boolean/manifold-preview'\nexport type { ManifoldMeshData as PreviewManifoldMeshData } from './boolean/manifold-preview'\nexport { setEngraveDecorationProvider, getEngraveDecorationProvider } from './mesh/decoration-provider'\nexport type { EngraveDecorationProvider, EngraveDecorationParams } from './mesh/decoration-provider'\nexport { runSdfInline } from './sdf/sdf-core'\nexport { runSdf as runSdfMain } from './sdf/sdf-runner'\nexport type { SdfMeshData as PreviewSdfMesh } from './sdf/sdf-runner'\n\n// Knurl D 类\nexport { applyKnurlDisplacement, KNURL_DEFAULTS } from './mesh/knurl/KnurlGenerator'\nexport { subdivide } from './mesh/knurl/subdivision'\nexport { loadKnurlingTexture } from './mesh/knurl/textureLoader'\nexport { QuantizedPointMap, weldVertices } from './mesh/knurl/meshIndex'\nexport { computeUV, MODE_TRIPLANAR, getCubicBlendWeights, type MappingSettings } from './mesh/knurl/mapping'\nexport { applyDisplacement, type DisplacementSettings } from './mesh/knurl/displacement'\n\n// Primitive D 类(预览用)\nexport { mergeBufferGeometries, makePrimitiveGeo, DEFAULT_SIZE, applyPrimitiveOffset } from './primitives/mesh-primitives'\nexport { makeScrew } from './primitives/screw/screw'\nexport {\n extractMeshData, primitiveToBrepSolid, geometryToBrepSolid,\n brepSolidToStep, primitiveToBrepStep,\n} from './primitives/brep-primitives'\n\n// BREP 辅助(D 类)\nexport {\n solidToShape,\n translateBrep, rotateBrep, scaleBrep, applyTransformBrep,\n fuseBrep, cutBrep, commonBrep,\n drillBrep, splitBrep, extrudeBrep,\n loadBrep, loadBrepAssembly, matrixToArray,\n type LoadBrepAssemblyPart,\n} from './brep/brep-ops'\nexport { getSolidBoundingBox } from './brep/brep-utils'\nexport { buildStlBufferFromMesh } from './brep/export/stl'\nexport { exportStepFromSolid, exportStepFromSolids } from './brep/export/step'\nexport type { StepExportEntry } from './brep/export/step'\nexport { reconstructSolidFromMesh, meshToAsciiStl, cadShapeIsValid, meshToStepBrep } from './occt-kernel/meshReconstruct'\n\n// ── L3 API 面(api/ 层)──\nexport * from './api'\n// Vec3 双源消歧:env-agnostic(lang/types)与 api(mesh/types)均有 Vec3,\n// 显式 re-export 定为 lang 版(与收敛前 browser.ts 的具名导出一致)。\nexport type { Vec3 } from './lang/types'\n"]}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* 不依赖 cad-runtime 的任何其他模块,因此不构成循环。
|
|
14
14
|
* P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。
|
|
15
15
|
*/
|
|
16
|
-
import type { BrepEngineId
|
|
16
|
+
import type { BrepEngineId } from '../brep/engine/types.js';
|
|
17
17
|
import type { Shape } from '../mesh/types.js';
|
|
18
18
|
/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */
|
|
19
19
|
export type BrepPath = 'brep' | 'mesh';
|
|
@@ -33,46 +33,6 @@ export type BrepPath = 'brep' | 'mesh';
|
|
|
33
33
|
* @throws {Error} `E_SHAPE_SLOT_EXCLUSIVE` when a shape carries more than one chain identity.
|
|
34
34
|
*/
|
|
35
35
|
export declare function assertShapeSlotExclusive(inputs: readonly Shape[]): void;
|
|
36
|
-
/**
|
|
37
|
-
* 能力名:族级布尔位(`BrepCapabilities` 里类型为 boolean 的字段)**加上**逐核函数的
|
|
38
|
-
* 面演化名(`BrepEvolutionKind`,`evolution` 名单里的条目)。
|
|
39
|
-
*
|
|
40
|
-
* ⚠️ `'evolution'` 已从本联合中**移除**(2026-09-22 Phase 0.2):它曾是"面演化族"的
|
|
41
|
-
* 族级名,但族级声明会多报能力(内核可只提供部分 `*WithHistory`)→ 静态判定失效。
|
|
42
|
-
* op 现在必须声明**具体**要哪个核函数(如 `['cut']`),引擎声明**具体**提供哪些
|
|
43
|
-
* (`evolution: ['fuse','cut','fillet']`)。见 `brep/engine/types.ts` 的 `BrepEvolutionKind`。
|
|
44
|
-
*/
|
|
45
|
-
export type BrepCapabilityName = 'heal' | 'directEdit' | 'advSurface' | 'assembly' | 'meshLift' | BrepEvolutionKind | BrepMethodKind;
|
|
46
|
-
/**
|
|
47
|
-
* 引擎能力声明的宽松镜像(`runtime-state.Backends.config.brepCapabilities` 同构;
|
|
48
|
-
* 该模块须零依赖,故不复用 `BrepCapabilities`)。
|
|
49
|
-
*/
|
|
50
|
-
export interface EngineCapabilitiesLike {
|
|
51
|
-
/** 本引擎实际提供的 `*WithHistory` 核函数名。 */
|
|
52
|
-
evolution?: readonly string[];
|
|
53
|
-
/** 本引擎实际提供的非演化内核方法名(`BrepMethodKind`)。 */
|
|
54
|
-
methods?: readonly string[];
|
|
55
|
-
heal?: boolean;
|
|
56
|
-
directEdit?: boolean;
|
|
57
|
-
advSurface?: boolean;
|
|
58
|
-
assembly?: boolean;
|
|
59
|
-
meshLift?: boolean;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。
|
|
63
|
-
* @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。
|
|
64
|
-
* @returns 该引擎声明支持的 `BrepCapabilityName` 集合。
|
|
65
|
-
*/
|
|
66
|
-
export declare function engineCapabilitySet(caps: EngineCapabilitiesLike | undefined): ReadonlySet<string>;
|
|
67
|
-
/**
|
|
68
|
-
* 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。
|
|
69
|
-
*
|
|
70
|
-
* 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点
|
|
71
|
-
* 对"缺哪个能力"的判断必然一致——不会出现"defineOp 认为缺 evolution、dispatch 认为具备"。
|
|
72
|
-
* @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。
|
|
73
|
-
* @returns 第一个缺失的能力名,或 undefined。
|
|
74
|
-
*/
|
|
75
|
-
export declare function firstMissingCapability(declared: readonly BrepCapabilityName[] | undefined): BrepCapabilityName | undefined;
|
|
76
36
|
/**
|
|
77
37
|
* `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。
|
|
78
38
|
*
|
|
@@ -89,20 +49,17 @@ export declare const DEFAULT_MESH_ENGINES: readonly string[];
|
|
|
89
49
|
* undefined, fixed at defineOp construction — static).
|
|
90
50
|
* - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)
|
|
91
51
|
* throws `MeshUnsupportedError`.
|
|
92
|
-
* - `mode='brep'` → missing brep / input off chain /
|
|
93
|
-
* `BrepUnsupportedError`.
|
|
52
|
+
* - `mode='brep'` → missing brep / input off chain / engine not whitelisted
|
|
53
|
+
* throws `BrepUnsupportedError`.
|
|
94
54
|
* - `mode='auto'` → brep when brep exists and all inputs are on the chain;
|
|
95
|
-
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
96
|
-
*
|
|
55
|
+
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
56
|
+
* throws `MeshUnsupportedError` — no mesh to fall back to.
|
|
97
57
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* plus the engine's `evolution` list of `*WithHistory` kernel function names
|
|
104
|
-
* (Phase 0.2 — a family-level `evolution: true` would over-report, since a
|
|
105
|
-
* kernel may provide only a subset of the evolution family).
|
|
58
|
+
* Engine identity (`engines`, D11) is the **only** narrowing axis: a pure
|
|
59
|
+
* engine whitelist, checked before mode and chain. There is no capability
|
|
60
|
+
* declaration face — what a kernel can do is fixed in code at author time
|
|
61
|
+
* (the engine adapters and `brep/engine/native-history.ts`), not declared in
|
|
62
|
+
* op metadata and not looked up at dispatch.
|
|
106
63
|
*
|
|
107
64
|
* Red line unchanged: static dispatch, no runtime try-catch fallback. The
|
|
108
65
|
* decision happens before the implementation runs and is never revised after a
|
|
@@ -115,12 +72,10 @@ export declare const DEFAULT_MESH_ENGINES: readonly string[];
|
|
|
115
72
|
* @param impls - the operation's implementation set: `mesh`/`brep` presence
|
|
116
73
|
* (function reference or undefined; fixed at defineOp construction), plus the
|
|
117
74
|
* op `name` (error messages).
|
|
118
|
-
* @param requiredCapability - an optional capability the operation declares;
|
|
119
|
-
* a missing capability routes the dispatch.
|
|
120
75
|
* @param engines - the operation's platform declaration (D11): `engines` from
|
|
121
76
|
* the defineOp meta. Undefined/empty = neutral op (all engines). A platform op
|
|
122
|
-
* whose engines do not include the current engine is rejected before the
|
|
123
|
-
*
|
|
77
|
+
* whose engines do not include the current engine is rejected before the mode
|
|
78
|
+
* and chain routing (D11-2: engine mismatch precedes everything else).
|
|
124
79
|
* @returns the selected backend path: 'brep' or 'mesh'.
|
|
125
80
|
*/
|
|
126
81
|
export declare function dispatchPath(inputs: Shape[], impls: {
|
|
@@ -128,5 +83,5 @@ export declare function dispatchPath(inputs: Shape[], impls: {
|
|
|
128
83
|
brep?: unknown;
|
|
129
84
|
name?: string;
|
|
130
85
|
meshEngines?: readonly string[];
|
|
131
|
-
},
|
|
86
|
+
}, engines?: readonly BrepEngineId[]): BrepPath;
|
|
132
87
|
//# sourceMappingURL=backend-dispatch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-dispatch.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"backend-dispatch.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,IAAI,CAavE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAiB,CAAA;AA+DnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EACzF,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,GAChC,QAAQ,CASV"}
|
|
@@ -45,45 +45,6 @@ export function assertShapeSlotExclusive(inputs) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
/**
|
|
49
|
-
* 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。
|
|
50
|
-
* @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。
|
|
51
|
-
* @returns 该引擎声明支持的 `BrepCapabilityName` 集合。
|
|
52
|
-
*/
|
|
53
|
-
export function engineCapabilitySet(caps) {
|
|
54
|
-
const set = new Set();
|
|
55
|
-
if (!caps)
|
|
56
|
-
return set;
|
|
57
|
-
for (const kind of caps.evolution ?? [])
|
|
58
|
-
set.add(kind);
|
|
59
|
-
for (const method of caps.methods ?? [])
|
|
60
|
-
set.add(method);
|
|
61
|
-
if (caps.heal)
|
|
62
|
-
set.add('heal');
|
|
63
|
-
if (caps.directEdit)
|
|
64
|
-
set.add('directEdit');
|
|
65
|
-
if (caps.advSurface)
|
|
66
|
-
set.add('advSurface');
|
|
67
|
-
if (caps.assembly)
|
|
68
|
-
set.add('assembly');
|
|
69
|
-
if (caps.meshLift)
|
|
70
|
-
set.add('meshLift');
|
|
71
|
-
return set;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。
|
|
75
|
-
*
|
|
76
|
-
* 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点
|
|
77
|
-
* 对"缺哪个能力"的判断必然一致——不会出现"defineOp 认为缺 evolution、dispatch 认为具备"。
|
|
78
|
-
* @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。
|
|
79
|
-
* @returns 第一个缺失的能力名,或 undefined。
|
|
80
|
-
*/
|
|
81
|
-
export function firstMissingCapability(declared) {
|
|
82
|
-
if (!declared?.length)
|
|
83
|
-
return undefined;
|
|
84
|
-
const supported = engineCapabilitySet(getBackends().config.brepCapabilities);
|
|
85
|
-
return declared.find((cap) => !supported.has(cap));
|
|
86
|
-
}
|
|
87
48
|
/**
|
|
88
49
|
* `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。
|
|
89
50
|
*
|
|
@@ -153,20 +114,17 @@ function currentMeshBackendId() {
|
|
|
153
114
|
* undefined, fixed at defineOp construction — static).
|
|
154
115
|
* - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)
|
|
155
116
|
* throws `MeshUnsupportedError`.
|
|
156
|
-
* - `mode='brep'` → missing brep / input off chain /
|
|
157
|
-
* `BrepUnsupportedError`.
|
|
117
|
+
* - `mode='brep'` → missing brep / input off chain / engine not whitelisted
|
|
118
|
+
* throws `BrepUnsupportedError`.
|
|
158
119
|
* - `mode='auto'` → brep when brep exists and all inputs are on the chain;
|
|
159
|
-
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
160
|
-
*
|
|
120
|
+
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
121
|
+
* throws `MeshUnsupportedError` — no mesh to fall back to.
|
|
161
122
|
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* plus the engine's `evolution` list of `*WithHistory` kernel function names
|
|
168
|
-
* (Phase 0.2 — a family-level `evolution: true` would over-report, since a
|
|
169
|
-
* kernel may provide only a subset of the evolution family).
|
|
123
|
+
* Engine identity (`engines`, D11) is the **only** narrowing axis: a pure
|
|
124
|
+
* engine whitelist, checked before mode and chain. There is no capability
|
|
125
|
+
* declaration face — what a kernel can do is fixed in code at author time
|
|
126
|
+
* (the engine adapters and `brep/engine/native-history.ts`), not declared in
|
|
127
|
+
* op metadata and not looked up at dispatch.
|
|
170
128
|
*
|
|
171
129
|
* Red line unchanged: static dispatch, no runtime try-catch fallback. The
|
|
172
130
|
* decision happens before the implementation runs and is never revised after a
|
|
@@ -179,18 +137,16 @@ function currentMeshBackendId() {
|
|
|
179
137
|
* @param impls - the operation's implementation set: `mesh`/`brep` presence
|
|
180
138
|
* (function reference or undefined; fixed at defineOp construction), plus the
|
|
181
139
|
* op `name` (error messages).
|
|
182
|
-
* @param requiredCapability - an optional capability the operation declares;
|
|
183
|
-
* a missing capability routes the dispatch.
|
|
184
140
|
* @param engines - the operation's platform declaration (D11): `engines` from
|
|
185
141
|
* the defineOp meta. Undefined/empty = neutral op (all engines). A platform op
|
|
186
|
-
* whose engines do not include the current engine is rejected before the
|
|
187
|
-
*
|
|
142
|
+
* whose engines do not include the current engine is rejected before the mode
|
|
143
|
+
* and chain routing (D11-2: engine mismatch precedes everything else).
|
|
188
144
|
* @returns the selected backend path: 'brep' or 'mesh'.
|
|
189
145
|
*/
|
|
190
|
-
export function dispatchPath(inputs, impls,
|
|
191
|
-
//
|
|
146
|
+
export function dispatchPath(inputs, impls, engines) {
|
|
147
|
+
// 前置不变量:槽位互斥(缺陷即报错,先于任何模式/引擎判定)。
|
|
192
148
|
assertShapeSlotExclusive(inputs);
|
|
193
|
-
const path = decidePath(inputs, impls,
|
|
149
|
+
const path = decidePath(inputs, impls, engines);
|
|
194
150
|
// 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。
|
|
195
151
|
// 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的
|
|
196
152
|
// E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。
|
|
@@ -208,19 +164,18 @@ function allInputsOnBrepChain(inputs) {
|
|
|
208
164
|
return inputs.every((s) => (isCompoundLike(s) ? s.children.length > 0 && s.children.every(hasBrep) : hasBrep(s)));
|
|
209
165
|
}
|
|
210
166
|
/**
|
|
211
|
-
* The path decision itself (mode → engine identity →
|
|
167
|
+
* The path decision itself (mode → engine identity → chain).
|
|
212
168
|
*
|
|
213
169
|
* Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is
|
|
214
|
-
* known, without duplicating the
|
|
170
|
+
* known, without duplicating the mesh-returning branches. Behaviour is
|
|
215
171
|
* unchanged: every throw here is a "path not available" refusal.
|
|
216
172
|
*
|
|
217
173
|
* @param inputs - the shapes feeding the operation.
|
|
218
174
|
* @param impls - the op's implementation set (presence + name + meshEngines).
|
|
219
|
-
* @param requiredCapability - the capability the op declares, if any.
|
|
220
175
|
* @param engines - the op's BREP platform declaration (D11), if any.
|
|
221
176
|
* @returns the selected backend path.
|
|
222
177
|
*/
|
|
223
|
-
function decidePath(inputs, impls,
|
|
178
|
+
function decidePath(inputs, impls, engines) {
|
|
224
179
|
const { config } = getBackends();
|
|
225
180
|
if (config.mode === 'mesh') {
|
|
226
181
|
// D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走
|
|
@@ -231,12 +186,11 @@ function decidePath(inputs, impls, requiredCapability, engines) {
|
|
|
231
186
|
return 'mesh';
|
|
232
187
|
}
|
|
233
188
|
const currentStmt = getCurrentStmt();
|
|
234
|
-
// ── D11-2:
|
|
189
|
+
// ── D11-2: 平台身份判定,置于最前(引擎不匹配时没有别的可谈)──
|
|
235
190
|
//
|
|
236
191
|
// D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——
|
|
237
|
-
//
|
|
238
|
-
//
|
|
239
|
-
// 本豁免由 engine-switch-p5 测试钉住(mock 下平台 op 不拦截)。
|
|
192
|
+
// 它的职责是让编排链路(naming、Result 边界、多输出)能被测到;真实引擎下的身份
|
|
193
|
+
// 校验由 parity 测试与 engine-switch 测试覆盖。本豁免由 engine-switch-p5 测试钉住。
|
|
240
194
|
if (engines && engines.length > 0) {
|
|
241
195
|
const engineId = config.brepEngineId;
|
|
242
196
|
if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {
|
|
@@ -247,15 +201,13 @@ function decidePath(inputs, impls, requiredCapability, engines) {
|
|
|
247
201
|
// D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。
|
|
248
202
|
throw new BrepUnsupportedError(message, currentStmt);
|
|
249
203
|
}
|
|
250
|
-
// D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError
|
|
204
|
+
// D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError。
|
|
251
205
|
if (!impls.mesh) {
|
|
252
206
|
throw new MeshUnsupportedError(`E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`, currentStmt);
|
|
253
207
|
}
|
|
254
208
|
return 'mesh';
|
|
255
209
|
}
|
|
256
210
|
}
|
|
257
|
-
// 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。
|
|
258
|
-
const supported = engineCapabilitySet(config.brepCapabilities);
|
|
259
211
|
if (config.mode === 'brep') {
|
|
260
212
|
if (!impls.brep) {
|
|
261
213
|
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt);
|
|
@@ -263,19 +215,9 @@ function decidePath(inputs, impls, requiredCapability, engines) {
|
|
|
263
215
|
if (!allInputsOnBrepChain(inputs)) {
|
|
264
216
|
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt);
|
|
265
217
|
}
|
|
266
|
-
// 能力路由:brep 模式缺能力 → 明确报错,不静默回退
|
|
267
|
-
if (requiredCapability && !supported.has(requiredCapability)) {
|
|
268
|
-
throw new BrepUnsupportedError(`E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`, currentStmt);
|
|
269
|
-
}
|
|
270
218
|
return 'brep';
|
|
271
219
|
}
|
|
272
|
-
// auto
|
|
273
|
-
if (requiredCapability && !supported.has(requiredCapability)) {
|
|
274
|
-
if (!impls.mesh) {
|
|
275
|
-
throw new MeshUnsupportedError(`E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`, currentStmt);
|
|
276
|
-
}
|
|
277
|
-
return 'mesh';
|
|
278
|
-
}
|
|
220
|
+
// auto 模式:brep 实现 + 输入全在链上 → brep;否则 mesh。
|
|
279
221
|
if (impls.brep && allInputsOnBrepChain(inputs))
|
|
280
222
|
return 'brep';
|
|
281
223
|
if (!impls.mesh) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/api/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 api/ import。\n * 这是安全的——它只依赖 runtime-state / api/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep, hasMeshFace, hasMeshSolid, isCompoundLike } from '../shape'\nimport type { BrepEngineId, BrepEvolutionKind, BrepMethodKind } from '../brep/engine/types'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/**\n * Shape 身份槽互斥校验(方案 2026-10-01 §3.2):一个 Shape 只能携带**一种**链身份\n * ——BREP 精度链句柄 / 网格实体句柄 / 网格链面句柄,三者取一。\n *\n * 两人同时存在意味着\"这个零件既在精度链又在近似链上\"——后续无论按哪一侧分派\n * 都是错的(按 BREP 走 → 近似几何被当精确实体;按 mesh 走 → 精确句柄悬空)。\n * 这是设计缺陷而非可恢复状态,故在**分派之前**直接抛错,不给运行时\"选边站\"的\n * 机会(静态判定红线)。\n *\n * 三个写入点(`attachBrep` / `attachMeshSolid` / `attachMeshFace`)已经把互斥钉在\n * 写入侧;这里在分派前再兜一层,兜的是\"绕开构造器直接改 slot\"的路径。\n *\n * @param inputs - the shapes feeding the operation.\n * @throws {Error} `E_SHAPE_SLOT_EXCLUSIVE` when a shape carries more than one chain identity.\n */\nexport function assertShapeSlotExclusive(inputs: readonly Shape[]): void {\n for (const s of inputs) {\n const carriers: string[] = []\n if (hasBrep(s)) carriers.push('BREP')\n if (hasMeshSolid(s)) carriers.push('mesh solid')\n if (hasMeshFace(s)) carriers.push('mesh-chain face')\n if (carriers.length > 1) {\n throw new Error(\n `E_SHAPE_SLOT_EXCLUSIVE: input shape carries ${carriers.join(' and ')} handles — ` +\n 'a shape belongs to exactly one chain identity (precision, mesh solid, or mesh-chain face)',\n )\n }\n }\n}\n\n/**\n * 能力名:族级布尔位(`BrepCapabilities` 里类型为 boolean 的字段)**加上**逐核函数的\n * 面演化名(`BrepEvolutionKind`,`evolution` 名单里的条目)。\n *\n * ⚠️ `'evolution'` 已从本联合中**移除**(2026-09-22 Phase 0.2):它曾是\"面演化族\"的\n * 族级名,但族级声明会多报能力(内核可只提供部分 `*WithHistory`)→ 静态判定失效。\n * op 现在必须声明**具体**要哪个核函数(如 `['cut']`),引擎声明**具体**提供哪些\n * (`evolution: ['fuse','cut','fillet']`)。见 `brep/engine/types.ts` 的 `BrepEvolutionKind`。\n */\nexport type BrepCapabilityName =\n | 'heal'\n | 'directEdit'\n | 'advSurface'\n | 'assembly'\n | 'meshLift'\n | BrepEvolutionKind\n | BrepMethodKind\n\n/**\n * 引擎能力声明的宽松镜像(`runtime-state.Backends.config.brepCapabilities` 同构;\n * 该模块须零依赖,故不复用 `BrepCapabilities`)。\n */\nexport interface EngineCapabilitiesLike {\n /** 本引擎实际提供的 `*WithHistory` 核函数名。 */\n evolution?: readonly string[]\n /** 本引擎实际提供的非演化内核方法名(`BrepMethodKind`)。 */\n methods?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n}\n\n/**\n * 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。\n * @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。\n * @returns 该引擎声明支持的 `BrepCapabilityName` 集合。\n */\nexport function engineCapabilitySet(caps: EngineCapabilitiesLike | undefined): ReadonlySet<string> {\n const set = new Set<string>()\n if (!caps) return set\n for (const kind of caps.evolution ?? []) set.add(kind)\n for (const method of caps.methods ?? []) set.add(method)\n if (caps.heal) set.add('heal')\n if (caps.directEdit) set.add('directEdit')\n if (caps.advSurface) set.add('advSurface')\n if (caps.assembly) set.add('assembly')\n if (caps.meshLift) set.add('meshLift')\n return set\n}\n\n/**\n * 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。\n *\n * 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点\n * 对\"缺哪个能力\"的判断必然一致——不会出现\"defineOp 认为缺 evolution、dispatch 认为具备\"。\n * @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。\n * @returns 第一个缺失的能力名,或 undefined。\n */\nexport function firstMissingCapability(\n declared: readonly BrepCapabilityName[] | undefined,\n): BrepCapabilityName | undefined {\n if (!declared?.length) return undefined\n const supported = engineCapabilitySet(getBackends().config.brepCapabilities)\n return declared.find((cap) => !supported.has(cap))\n}\n\n/**\n * `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。\n *\n * 为什么缺省是\"只认识裸网格\"而不是\"全都能\":mesh 实现默认跑在 manifold 上,它拿不到\n * 网格实体句柄;给一个不声明 `meshEngines` 的 op 喂网格实体,唯一诚实的结局是**静态\n * 报错**,而不是在运行时挑一个能跑的后端(红线:无运行时回退)。\n */\nexport const DEFAULT_MESH_ENGINES: readonly string[] = ['manifold']\n\n/**\n * 网格链输入的静态门禁(方案 2026-10-01 §3.4 规则 1 / 规则 4)。\n *\n * \"网格链输入\"= 网格实体(`meshSolid`)或网格链面(`meshFace`)——两者都是近似链上的\n * 构造中几何,都要由**声明的**网格后端来读懂。\n *\n * 只在**已判定走 mesh 路径**时调用(brep 模式下网格实体的归宿是\n * `E_BREP_UNSUPPORTED`——网格零件按定义没有精度链,那条判定更贴切)。\n *\n * 两条不变量:\n * 1. **链不可混**:一次调用里要么全是网格链输入,要么都不是。网格链输入与 BREP 实体\n * (或裸网格)混在一起时,任一侧的结局都是隐式降级——走 manifold 会把网格实体的\n * 身份与近似拓扑静默丢掉,走网格后端则拿不到对侧实体的句柄。故直接报错。\n * 2. **后端必须声明接受**:当前装配的网格后端 id 必须出现在 op 的 `meshEngines` 里。\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (reads `meshEngines` / `name`).\n * @throws {Error} `E_MESH_SOLID_MIXED` when mesh-chain inputs are mixed with other geometry.\n * @throws {MeshUnsupportedError} `E_MESH_SOLID_UNSUPPORTED` when the mesh backend is not declared.\n */\nfunction assertMeshSolidInputs(\n inputs: readonly Shape[],\n impls: { meshEngines?: readonly string[]; name?: string },\n): void {\n let chainCount = 0\n for (const s of inputs) if (hasMeshSolid(s) || hasMeshFace(s)) chainCount++\n if (chainCount === 0) return\n\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n if (chainCount !== inputs.length) {\n throw new Error(\n `E_MESH_SOLID_MIXED: op${opLabel} got both mesh-chain geometry and other geometry ` +\n `(${chainCount}/${inputs.length} inputs are mesh solids or mesh-chain faces) — mesh-chain geometry ` +\n 'cannot take part in an operation whose other inputs are outside its chain (the result would silently drop one side)',\n )\n }\n\n const declared = impls.meshEngines ?? DEFAULT_MESH_ENGINES\n const current = currentMeshBackendId()\n if (current !== null && declared.includes(current)) return\n throw new MeshUnsupportedError(\n `E_MESH_SOLID_UNSUPPORTED: op${opLabel} cannot accept mesh-chain input — current mesh backend ` +\n `is ${current ?? '<none>'} but the op declares [${declared.join(', ')}]`,\n getCurrentStmt(),\n )\n}\n\n/**\n * 当前装配的网格后端 id(未装配 → null)。\n *\n * 读的是**已装配的后端对象自身**(`Backends.kernel.meshSolid`)而不是注册表的另一份\n * 快照——装配事实只有一个来源,门禁不可能与装配结果漂移。类型在本模块只当结构读\n * (`{ id?: string }`),因为它对 runtime-state 是 `unknown`(零依赖红线)。\n *\n * @returns the assembled mesh backend id, or null when none is assembled.\n */\nfunction currentMeshBackendId(): string | null {\n const backend = getBackends().kernel.meshSolid as { id?: unknown } | undefined\n return backend && typeof backend.id === 'string' ? backend.id : null\n}\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / missing capability throws\n * `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain (or\n * missing capability) throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Capability routing (requiredCapability): when the current engine (registry)\n * lacks a declared capability, brep mode throws a BrepUnsupportedError (an\n * explicit error, never a silent fallback) while auto mode statically degrades\n * to mesh (never fabricating a missing capability). The capability is matched\n * against the engine's declaration as a set of concrete names: family booleans\n * plus the engine's `evolution` list of `*WithHistory` kernel function names\n * (Phase 0.2 — a family-level `evolution: true` would over-report, since a\n * kernel may provide only a subset of the evolution family).\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction), plus the\n * op `name` (error messages).\n * @param requiredCapability - an optional capability the operation declares;\n * a missing capability routes the dispatch.\n * @param engines - the operation's platform declaration (D11): `engines` from\n * the defineOp meta. Undefined/empty = neutral op (all engines). A platform op\n * whose engines do not include the current engine is rejected before the\n * capability/mode routing (D11-2: engine mismatch precedes capability checks).\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n requiredCapability?: BrepCapabilityName,\n engines?: readonly BrepEngineId[],\n): BrepPath {\n // 前置不变量:槽位互斥(缺陷即报错,先于任何模式/能力判定)。\n assertShapeSlotExclusive(inputs)\n const path = decidePath(inputs, impls, requiredCapability, engines)\n // 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。\n // 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的\n // E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。\n if (path === 'mesh') assertMeshSolidInputs(inputs, impls)\n return path\n}\n\n/**\n * P2(2026-10-06-step-3mf-multipart-import-plan.md §7):多零件 load 的输出是\n * compound——输入「在 BREP 链上」判定对其展开:children 全部有 OCCT 句柄才\n * 算链上(消费 op 按 partIndex 解包出的目标成员才是真正被操作的对象)。\n * 空 children / 混合链按不在链上处理(静态判定,不运行时回退)。\n */\nfunction allInputsOnBrepChain(inputs: Shape[]): boolean {\n return inputs.every((s) => (isCompoundLike(s) ? s.children.length > 0 && s.children.every(hasBrep) : hasBrep(s)))\n}\n\n/**\n * The path decision itself (mode → engine identity → capability → chain).\n *\n * Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is\n * known, without duplicating the four mesh-returning branches. Behaviour is\n * unchanged: every throw here is a \"path not available\" refusal.\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (presence + name + meshEngines).\n * @param requiredCapability - the capability the op declares, if any.\n * @param engines - the op's BREP platform declaration (D11), if any.\n * @returns the selected backend path.\n */\nfunction decidePath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n requiredCapability?: BrepCapabilityName,\n engines?: readonly BrepEngineId[],\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n // D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走\n // mesh)。宿主强制 mesh 时不因平台身份报错。\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n\n // ── D11-2: 平台身份判定,置于最前(先于 mode/capabilities——引擎不匹配时谈能力没有意义)──\n //\n // D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——\n // 它的 capabilities 也是\"全给\",职责是让编排链路(naming、Result 边界、多输出)\n // 能被测到;真实引擎下的身份校验由 parity 测试与 engine-switch 测试覆盖。\n // 本豁免由 engine-switch-p5 测试钉住(mock 下平台 op 不拦截)。\n if (engines && engines.length > 0) {\n const engineId = config.brepEngineId\n if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n const current = engineId ?? '<none>'\n const message = `E_BREP_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current})`\n if (config.mode === 'brep') {\n // D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。\n throw new BrepUnsupportedError(message, currentStmt)\n }\n // D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError(与能力路由同构)。\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n }\n\n // 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。\n const supported = engineCapabilitySet(config.brepCapabilities)\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!allInputsOnBrepChain(inputs)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n // 能力路由:brep 模式缺能力 → 明确报错,不静默回退\n if (requiredCapability && !supported.has(requiredCapability)) {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`,\n currentStmt,\n )\n }\n return 'brep'\n }\n\n // auto 模式:能力路由(缺能力 → 静态降级走 mesh;brep-only 无 mesh 可降 → 明确报错)\n if (requiredCapability && !supported.has(requiredCapability)) {\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n\n if (impls.brep && allInputsOnBrepChain(inputs)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/api/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 api/ import。\n * 这是安全的——它只依赖 runtime-state / api/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep, hasMeshFace, hasMeshSolid, isCompoundLike } from '../shape'\nimport type { BrepEngineId } from '../brep/engine/types'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/**\n * Shape 身份槽互斥校验(方案 2026-10-01 §3.2):一个 Shape 只能携带**一种**链身份\n * ——BREP 精度链句柄 / 网格实体句柄 / 网格链面句柄,三者取一。\n *\n * 两人同时存在意味着\"这个零件既在精度链又在近似链上\"——后续无论按哪一侧分派\n * 都是错的(按 BREP 走 → 近似几何被当精确实体;按 mesh 走 → 精确句柄悬空)。\n * 这是设计缺陷而非可恢复状态,故在**分派之前**直接抛错,不给运行时\"选边站\"的\n * 机会(静态判定红线)。\n *\n * 三个写入点(`attachBrep` / `attachMeshSolid` / `attachMeshFace`)已经把互斥钉在\n * 写入侧;这里在分派前再兜一层,兜的是\"绕开构造器直接改 slot\"的路径。\n *\n * @param inputs - the shapes feeding the operation.\n * @throws {Error} `E_SHAPE_SLOT_EXCLUSIVE` when a shape carries more than one chain identity.\n */\nexport function assertShapeSlotExclusive(inputs: readonly Shape[]): void {\n for (const s of inputs) {\n const carriers: string[] = []\n if (hasBrep(s)) carriers.push('BREP')\n if (hasMeshSolid(s)) carriers.push('mesh solid')\n if (hasMeshFace(s)) carriers.push('mesh-chain face')\n if (carriers.length > 1) {\n throw new Error(\n `E_SHAPE_SLOT_EXCLUSIVE: input shape carries ${carriers.join(' and ')} handles — ` +\n 'a shape belongs to exactly one chain identity (precision, mesh solid, or mesh-chain face)',\n )\n }\n }\n}\n\n/**\n * `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。\n *\n * 为什么缺省是\"只认识裸网格\"而不是\"全都能\":mesh 实现默认跑在 manifold 上,它拿不到\n * 网格实体句柄;给一个不声明 `meshEngines` 的 op 喂网格实体,唯一诚实的结局是**静态\n * 报错**,而不是在运行时挑一个能跑的后端(红线:无运行时回退)。\n */\nexport const DEFAULT_MESH_ENGINES: readonly string[] = ['manifold']\n\n/**\n * 网格链输入的静态门禁(方案 2026-10-01 §3.4 规则 1 / 规则 4)。\n *\n * \"网格链输入\"= 网格实体(`meshSolid`)或网格链面(`meshFace`)——两者都是近似链上的\n * 构造中几何,都要由**声明的**网格后端来读懂。\n *\n * 只在**已判定走 mesh 路径**时调用(brep 模式下网格实体的归宿是\n * `E_BREP_UNSUPPORTED`——网格零件按定义没有精度链,那条判定更贴切)。\n *\n * 两条不变量:\n * 1. **链不可混**:一次调用里要么全是网格链输入,要么都不是。网格链输入与 BREP 实体\n * (或裸网格)混在一起时,任一侧的结局都是隐式降级——走 manifold 会把网格实体的\n * 身份与近似拓扑静默丢掉,走网格后端则拿不到对侧实体的句柄。故直接报错。\n * 2. **后端必须声明接受**:当前装配的网格后端 id 必须出现在 op 的 `meshEngines` 里。\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (reads `meshEngines` / `name`).\n * @throws {Error} `E_MESH_SOLID_MIXED` when mesh-chain inputs are mixed with other geometry.\n * @throws {MeshUnsupportedError} `E_MESH_SOLID_UNSUPPORTED` when the mesh backend is not declared.\n */\nfunction assertMeshSolidInputs(\n inputs: readonly Shape[],\n impls: { meshEngines?: readonly string[]; name?: string },\n): void {\n let chainCount = 0\n for (const s of inputs) if (hasMeshSolid(s) || hasMeshFace(s)) chainCount++\n if (chainCount === 0) return\n\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n if (chainCount !== inputs.length) {\n throw new Error(\n `E_MESH_SOLID_MIXED: op${opLabel} got both mesh-chain geometry and other geometry ` +\n `(${chainCount}/${inputs.length} inputs are mesh solids or mesh-chain faces) — mesh-chain geometry ` +\n 'cannot take part in an operation whose other inputs are outside its chain (the result would silently drop one side)',\n )\n }\n\n const declared = impls.meshEngines ?? DEFAULT_MESH_ENGINES\n const current = currentMeshBackendId()\n if (current !== null && declared.includes(current)) return\n throw new MeshUnsupportedError(\n `E_MESH_SOLID_UNSUPPORTED: op${opLabel} cannot accept mesh-chain input — current mesh backend ` +\n `is ${current ?? '<none>'} but the op declares [${declared.join(', ')}]`,\n getCurrentStmt(),\n )\n}\n\n/**\n * 当前装配的网格后端 id(未装配 → null)。\n *\n * 读的是**已装配的后端对象自身**(`Backends.kernel.meshSolid`)而不是注册表的另一份\n * 快照——装配事实只有一个来源,门禁不可能与装配结果漂移。类型在本模块只当结构读\n * (`{ id?: string }`),因为它对 runtime-state 是 `unknown`(零依赖红线)。\n *\n * @returns the assembled mesh backend id, or null when none is assembled.\n */\nfunction currentMeshBackendId(): string | null {\n const backend = getBackends().kernel.meshSolid as { id?: unknown } | undefined\n return backend && typeof backend.id === 'string' ? backend.id : null\n}\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / engine not whitelisted\n * throws `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain\n * throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Engine identity (`engines`, D11) is the **only** narrowing axis: a pure\n * engine whitelist, checked before mode and chain. There is no capability\n * declaration face — what a kernel can do is fixed in code at author time\n * (the engine adapters and `brep/engine/native-history.ts`), not declared in\n * op metadata and not looked up at dispatch.\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction), plus the\n * op `name` (error messages).\n * @param engines - the operation's platform declaration (D11): `engines` from\n * the defineOp meta. Undefined/empty = neutral op (all engines). A platform op\n * whose engines do not include the current engine is rejected before the mode\n * and chain routing (D11-2: engine mismatch precedes everything else).\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n engines?: readonly BrepEngineId[],\n): BrepPath {\n // 前置不变量:槽位互斥(缺陷即报错,先于任何模式/引擎判定)。\n assertShapeSlotExclusive(inputs)\n const path = decidePath(inputs, impls, engines)\n // 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。\n // 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的\n // E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。\n if (path === 'mesh') assertMeshSolidInputs(inputs, impls)\n return path\n}\n\n/**\n * P2(2026-10-06-step-3mf-multipart-import-plan.md §7):多零件 load 的输出是\n * compound——输入「在 BREP 链上」判定对其展开:children 全部有 OCCT 句柄才\n * 算链上(消费 op 按 partIndex 解包出的目标成员才是真正被操作的对象)。\n * 空 children / 混合链按不在链上处理(静态判定,不运行时回退)。\n */\nfunction allInputsOnBrepChain(inputs: Shape[]): boolean {\n return inputs.every((s) => (isCompoundLike(s) ? s.children.length > 0 && s.children.every(hasBrep) : hasBrep(s)))\n}\n\n/**\n * The path decision itself (mode → engine identity → chain).\n *\n * Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is\n * known, without duplicating the mesh-returning branches. Behaviour is\n * unchanged: every throw here is a \"path not available\" refusal.\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (presence + name + meshEngines).\n * @param engines - the op's BREP platform declaration (D11), if any.\n * @returns the selected backend path.\n */\nfunction decidePath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n engines?: readonly BrepEngineId[],\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n // D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走\n // mesh)。宿主强制 mesh 时不因平台身份报错。\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n\n // ── D11-2: 平台身份判定,置于最前(引擎不匹配时没有别的可谈)──\n //\n // D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——\n // 它的职责是让编排链路(naming、Result 边界、多输出)能被测到;真实引擎下的身份\n // 校验由 parity 测试与 engine-switch 测试覆盖。本豁免由 engine-switch-p5 测试钉住。\n if (engines && engines.length > 0) {\n const engineId = config.brepEngineId\n if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n const current = engineId ?? '<none>'\n const message = `E_BREP_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current})`\n if (config.mode === 'brep') {\n // D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。\n throw new BrepUnsupportedError(message, currentStmt)\n }\n // D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError。\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n }\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!allInputsOnBrepChain(inputs)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n return 'brep'\n }\n\n // auto 模式:brep 实现 + 输入全在链上 → brep;否则 mesh。\n if (impls.brep && allInputsOnBrepChain(inputs)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
export declare function computeContentKey(positions: Float32Array, indices: Uint32Array): string;
|
|
14
14
|
/**
|
|
15
15
|
* Compute a deterministic fingerprint for an arbitrary value, used by the
|
|
16
|
-
* incremental update gates (G6/G7
|
|
17
|
-
*
|
|
16
|
+
* incremental update gates (G6/G7) to detect whether params or libIds have
|
|
17
|
+
* changed since the last successful execution.
|
|
18
18
|
*
|
|
19
19
|
* Design constraints:
|
|
20
20
|
* - `undefined` and `null` are normalized to `null` (so "no params" and
|
|
@@ -23,7 +23,7 @@ export declare function computeContentKey(positions: Float32Array, indices: Uint
|
|
|
23
23
|
* - Circular references are detected and represented stably (no infinite loop).
|
|
24
24
|
* - Functions and Symbols have a deterministic degradation rule (type-tagged).
|
|
25
25
|
* - Arrays preserve element order (position-sensitive).
|
|
26
|
-
* @param value - the value to fingerprint (params / libIds
|
|
26
|
+
* @param value - the value to fingerprint (params / libIds).
|
|
27
27
|
* @returns a hex string fingerprint.
|
|
28
28
|
*/
|
|
29
29
|
export declare function stableFingerprint(value: unknown): string;
|
|
@@ -30,8 +30,8 @@ export function computeContentKey(positions, indices) {
|
|
|
30
30
|
// ── stableFingerprint (P0-3) ──
|
|
31
31
|
/**
|
|
32
32
|
* Compute a deterministic fingerprint for an arbitrary value, used by the
|
|
33
|
-
* incremental update gates (G6/G7
|
|
34
|
-
*
|
|
33
|
+
* incremental update gates (G6/G7) to detect whether params or libIds have
|
|
34
|
+
* changed since the last successful execution.
|
|
35
35
|
*
|
|
36
36
|
* Design constraints:
|
|
37
37
|
* - `undefined` and `null` are normalized to `null` (so "no params" and
|
|
@@ -40,7 +40,7 @@ export function computeContentKey(positions, indices) {
|
|
|
40
40
|
* - Circular references are detected and represented stably (no infinite loop).
|
|
41
41
|
* - Functions and Symbols have a deterministic degradation rule (type-tagged).
|
|
42
42
|
* - Arrays preserve element order (position-sensitive).
|
|
43
|
-
* @param value - the value to fingerprint (params / libIds
|
|
43
|
+
* @param value - the value to fingerprint (params / libIds).
|
|
44
44
|
* @returns a hex string fingerprint.
|
|
45
45
|
*/
|
|
46
46
|
export function stableFingerprint(value) {
|