@faicad/faijs 0.33.2 → 0.35.8
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/api-namespace.d.ts +14 -14
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +40 -14
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +47 -6
- package/dist/api/appearance.d.ts.map +1 -1
- package/dist/api/appearance.js.map +1 -1
- package/dist/api/assembly/entities.js +14 -4
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/solve-tree.d.ts +1 -0
- package/dist/api/assembly/solve-tree.d.ts.map +1 -1
- package/dist/api/assembly/solve-tree.js +42 -17
- package/dist/api/assembly/solve-tree.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -0
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +130 -23
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
- package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
- package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +20 -2
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/chamfer.d.ts +7 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +57 -13
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/draft.d.ts +7 -4
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +11 -6
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.d.ts +4 -4
- package/dist/api/edge-ref.js +4 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/extrude.d.ts +10 -6
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +54 -26
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts +4 -4
- package/dist/api/face-ref.js +4 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +6 -3
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +12 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +6 -2
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +24 -6
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +7 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +92 -12
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/script-face-manifest.js +1 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/topology.js +1 -1
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/helix.d.ts +13 -13
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -24
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-brep.d.ts +10 -18
- package/dist/api/import-brep.d.ts.map +1 -1
- package/dist/api/import-brep.js +17 -25
- package/dist/api/import-brep.js.map +1 -1
- package/dist/api/import-step.d.ts +10 -15
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +24 -29
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.js +2 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/export-members.js.map +1 -1
- package/dist/api/loft-advanced.d.ts +4 -0
- package/dist/api/loft-advanced.d.ts.map +1 -1
- package/dist/api/loft-advanced.js +4 -0
- package/dist/api/loft-advanced.js.map +1 -1
- package/dist/api/loft.d.ts +5 -3
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +5 -3
- package/dist/api/loft.js.map +1 -1
- package/dist/api/meta.d.ts +42 -6
- package/dist/api/meta.d.ts.map +1 -1
- package/dist/api/meta.js.map +1 -1
- package/dist/api/primitives.d.ts +3 -2
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +3 -2
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/punch-hole.d.ts +5 -2
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +4 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +4 -5
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +4 -5
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/selectors-to-refs.d.ts +83 -0
- package/dist/api/selectors-to-refs.d.ts.map +1 -0
- package/dist/api/selectors-to-refs.js +211 -0
- package/dist/api/selectors-to-refs.js.map +1 -0
- package/dist/api/shell.d.ts +17 -8
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +45 -15
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +12 -6
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +31 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts +3 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +3 -0
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/sketch-on-surface.d.ts +4 -1
- package/dist/api/sketch-on-surface.d.ts.map +1 -1
- package/dist/api/sketch-on-surface.js +4 -1
- package/dist/api/sketch-on-surface.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +5 -6
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +24 -5
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +9 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/brep/brep-chain.js +2 -2
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +1 -1
- package/dist/brep/brep-ops.js +1 -1
- 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 +45 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +87 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +33 -7
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +47 -16
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +14 -15
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +35 -15
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/primitives-brep.js +2 -2
- package/dist/brep/primitives-brep.js.map +1 -1
- package/dist/brep/text/text-to-solid.d.ts +40 -3
- package/dist/brep/text/text-to-solid.d.ts.map +1 -1
- package/dist/brep/text/text-to-solid.js +104 -24
- package/dist/brep/text/text-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +328 -38
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +3 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +13 -9
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.js +6 -6
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
- package/dist/browser.d.ts +2 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -2
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +11 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +16 -8
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +62 -5
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +617 -42
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/closure.d.ts +3 -2
- package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
- package/dist/cad-runtime/interp/closure.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +9 -6
- package/dist/cad-runtime/interp/env.d.ts.map +1 -1
- package/dist/cad-runtime/interp/env.js +4 -2
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-decl.d.ts +121 -0
- package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
- package/dist/cad-runtime/lib-decl.js +100 -0
- package/dist/cad-runtime/lib-decl.js.map +1 -0
- package/dist/cad-runtime/ports.d.ts +12 -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 +59 -5
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +252 -20
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/extra/browser.d.ts +9 -0
- package/dist/extra/browser.d.ts.map +1 -0
- package/dist/extra/browser.js +9 -0
- package/dist/extra/browser.js.map +1 -0
- package/dist/extra/editor-ops.d.ts +22 -0
- package/dist/extra/editor-ops.d.ts.map +1 -0
- package/dist/extra/editor-ops.js +21 -0
- package/dist/extra/editor-ops.js.map +1 -0
- package/dist/extra/extras/svg-extrude.d.ts +45 -0
- package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
- package/dist/extra/extras/svg-extrude.js +110 -0
- package/dist/extra/extras/svg-extrude.js.map +1 -0
- package/dist/extra/extras/text-cjk.d.ts +36 -0
- package/dist/extra/extras/text-cjk.d.ts.map +1 -0
- package/dist/extra/extras/text-cjk.js +86 -0
- package/dist/extra/extras/text-cjk.js.map +1 -0
- package/dist/extra/extras/text-geometry.d.ts +69 -0
- package/dist/extra/extras/text-geometry.d.ts.map +1 -0
- package/dist/extra/extras/text-geometry.js +188 -0
- package/dist/extra/extras/text-geometry.js.map +1 -0
- package/dist/extra/index.d.ts +40 -0
- package/dist/extra/index.d.ts.map +1 -0
- package/dist/extra/index.js +40 -0
- package/dist/extra/index.js.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
- package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
- package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
- package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
- package/dist/extra/mesh/engrave-decoration.js +39 -0
- package/dist/extra/mesh/engrave-decoration.js.map +1 -0
- package/dist/extra/mesh/fai_drill.d.ts +21 -0
- package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
- package/dist/extra/mesh/fai_drill.js +89 -0
- package/dist/extra/mesh/fai_drill.js.map +1 -0
- package/dist/extra/mesh/fai_extrude.d.ts +24 -0
- package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
- package/dist/extra/mesh/fai_extrude.js +42 -0
- package/dist/extra/mesh/fai_extrude.js.map +1 -0
- package/dist/extra/mesh/fai_split.d.ts +164 -0
- package/dist/extra/mesh/fai_split.d.ts.map +1 -0
- package/dist/extra/mesh/fai_split.js +269 -0
- package/dist/extra/mesh/fai_split.js.map +1 -0
- package/dist/extra/mesh/primitives.d.ts +29 -0
- package/dist/extra/mesh/primitives.d.ts.map +1 -0
- package/dist/extra/mesh/primitives.js +41 -0
- package/dist/extra/mesh/primitives.js.map +1 -0
- package/dist/extra/op-names.d.ts +37 -0
- package/dist/extra/op-names.d.ts.map +1 -0
- package/dist/extra/op-names.js +46 -0
- package/dist/extra/op-names.js.map +1 -0
- package/dist/extra/ops/compound.d.ts +140 -0
- package/dist/extra/ops/compound.d.ts.map +1 -0
- package/dist/extra/ops/compound.js +167 -0
- package/dist/extra/ops/compound.js.map +1 -0
- package/dist/extra/ops/copy.d.ts +40 -0
- package/dist/extra/ops/copy.d.ts.map +1 -0
- package/dist/extra/ops/copy.js +83 -0
- package/dist/extra/ops/copy.js.map +1 -0
- package/dist/extra/ops/fai_drill.d.ts +51 -0
- package/dist/extra/ops/fai_drill.d.ts.map +1 -0
- package/dist/extra/ops/fai_drill.js +233 -0
- package/dist/extra/ops/fai_drill.js.map +1 -0
- package/dist/extra/ops/fai_extrude.d.ts +36 -0
- package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
- package/dist/extra/ops/fai_extrude.js +84 -0
- package/dist/extra/ops/fai_extrude.js.map +1 -0
- package/dist/extra/ops/fai_split.d.ts +46 -0
- package/dist/extra/ops/fai_split.d.ts.map +1 -0
- package/dist/extra/ops/fai_split.js +235 -0
- package/dist/extra/ops/fai_split.js.map +1 -0
- package/dist/extra/ops/load.d.ts +49 -0
- package/dist/extra/ops/load.d.ts.map +1 -0
- package/dist/extra/ops/load.js +423 -0
- package/dist/extra/ops/load.js.map +1 -0
- package/dist/extra/ops/svg-extrude.d.ts +32 -0
- package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
- package/dist/extra/ops/svg-extrude.js +74 -0
- package/dist/extra/ops/svg-extrude.js.map +1 -0
- package/dist/extra/ops/text.d.ts +34 -0
- package/dist/extra/ops/text.d.ts.map +1 -0
- package/dist/extra/ops/text.js +100 -0
- package/dist/extra/ops/text.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.d.ts +3 -3
- package/dist/lang/symbol-table.generated.d.ts +10 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +10 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +3 -3
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/math3d/index.d.ts +1 -1
- package/dist/math3d/index.js +1 -1
- package/dist/math3d/index.js.map +1 -1
- package/dist/mesh/engrave.d.ts +2 -3
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +4 -11
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +0 -2
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +0 -2
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/primitives.d.ts +7 -5
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +16 -9
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/types.d.ts +4 -3
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +11 -4
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +53 -28
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts.map +1 -1
- package/dist/node-host/execute-script.js +3 -4
- package/dist/node-host/execute-script.js.map +1 -1
- package/dist/node-host/lib-package-json.d.ts +36 -0
- package/dist/node-host/lib-package-json.d.ts.map +1 -0
- package/dist/node-host/lib-package-json.js +73 -0
- package/dist/node-host/lib-package-json.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +41 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.js +1 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/primitives/brep-primitives.d.ts.map +1 -1
- package/dist/primitives/brep-primitives.js +39 -12
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/runtime-state.d.ts +28 -1
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +14 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +11 -2
- package/dist/sdk.js.map +1 -1
- package/dist/sketch/bspline.d.ts +58 -0
- package/dist/sketch/bspline.d.ts.map +1 -0
- package/dist/sketch/bspline.js +104 -0
- package/dist/sketch/bspline.js.map +1 -0
- package/dist/sketch/canonical.d.ts +239 -0
- package/dist/sketch/canonical.d.ts.map +1 -0
- package/dist/sketch/canonical.js +17 -0
- package/dist/sketch/canonical.js.map +1 -0
- package/dist/sketch/contour.d.ts +43 -0
- package/dist/sketch/contour.d.ts.map +1 -0
- package/dist/sketch/contour.js +202 -0
- package/dist/sketch/contour.js.map +1 -0
- package/dist/sketch/dim-spec.d.ts +32 -0
- package/dist/sketch/dim-spec.d.ts.map +1 -0
- package/dist/sketch/dim-spec.js +112 -0
- package/dist/sketch/dim-spec.js.map +1 -0
- package/dist/sketch/faces.d.ts +45 -0
- package/dist/sketch/faces.d.ts.map +1 -0
- package/dist/sketch/faces.js +108 -0
- package/dist/sketch/faces.js.map +1 -0
- package/dist/sketch/fcstd-types.d.ts +194 -0
- package/dist/sketch/fcstd-types.d.ts.map +1 -0
- package/dist/sketch/fcstd-types.js +67 -0
- package/dist/sketch/fcstd-types.js.map +1 -0
- package/dist/sketch/index.d.ts +46 -0
- package/dist/sketch/index.d.ts.map +1 -0
- package/dist/sketch/index.js +39 -0
- package/dist/sketch/index.js.map +1 -0
- package/dist/sketch/node.d.ts +14 -0
- package/dist/sketch/node.d.ts.map +1 -0
- package/dist/sketch/node.js +43 -0
- package/dist/sketch/node.js.map +1 -0
- package/dist/sketch/op.d.ts +111 -0
- package/dist/sketch/op.d.ts.map +1 -0
- package/dist/sketch/op.js +185 -0
- package/dist/sketch/op.js.map +1 -0
- package/dist/sketch/planegcs-backend.d.ts +69 -0
- package/dist/sketch/planegcs-backend.d.ts.map +1 -0
- package/dist/sketch/planegcs-backend.js +812 -0
- package/dist/sketch/planegcs-backend.js.map +1 -0
- package/dist/sketch/project.d.ts +176 -0
- package/dist/sketch/project.d.ts.map +1 -0
- package/dist/sketch/project.js +656 -0
- package/dist/sketch/project.js.map +1 -0
- package/dist/sketch/shapes.d.ts +370 -0
- package/dist/sketch/shapes.d.ts.map +1 -0
- package/dist/sketch/shapes.js +959 -0
- package/dist/sketch/shapes.js.map +1 -0
- package/dist/sketch/solve.d.ts +21 -0
- package/dist/sketch/solve.d.ts.map +1 -0
- package/dist/sketch/solve.js +144 -0
- package/dist/sketch/solve.js.map +1 -0
- package/dist/sketch/solver-loader.d.ts +47 -0
- package/dist/sketch/solver-loader.d.ts.map +1 -0
- package/dist/sketch/solver-loader.js +77 -0
- package/dist/sketch/solver-loader.js.map +1 -0
- package/dist/sketch/solver.d.ts +63 -0
- package/dist/sketch/solver.d.ts.map +1 -0
- package/dist/sketch/solver.js +28 -0
- package/dist/sketch/solver.js.map +1 -0
- package/dist/sketch/verify.d.ts +53 -0
- package/dist/sketch/verify.d.ts.map +1 -0
- package/dist/sketch/verify.js +71 -0
- package/dist/sketch/verify.js.map +1 -0
- package/dist/topology/naming/geom-hint.d.ts +12 -0
- package/dist/topology/naming/geom-hint.d.ts.map +1 -1
- package/dist/topology/naming/geom-hint.js +1 -1
- package/dist/topology/naming/geom-hint.js.map +1 -1
- package/dist/topology/naming/lineage.d.ts +1 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js +37 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/topology/naming/resolve-face.d.ts +13 -2
- package/dist/topology/naming/resolve-face.d.ts.map +1 -1
- package/dist/topology/naming/resolve-face.js +18 -2
- package/dist/topology/naming/resolve-face.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +43 -11
|
@@ -67,18 +67,44 @@ export declare function hasBrepEngine(): boolean;
|
|
|
67
67
|
*/
|
|
68
68
|
export declare function isBrepEngineRegistered(id: string): boolean;
|
|
69
69
|
/**
|
|
70
|
-
* Resolve a BREP engine (asynchronously, resolving its provider; throws
|
|
71
|
-
*
|
|
72
|
-
*
|
|
70
|
+
* Resolve a **named** BREP engine (asynchronously, resolving its provider; throws
|
|
71
|
+
* when not registered). Assembly-time and diagnostic use only — library code must
|
|
72
|
+
* take the neutral surface via `getBrepApi()` or the platform face via
|
|
73
|
+
* `getOcctKernel()` / `getBrepKitKernel()`, never an engine by id.
|
|
74
|
+
*
|
|
75
|
+
* `id` is REQUIRED: this function means exactly one thing — "look up the engine
|
|
76
|
+
* registered under this id". Taking the current engine is a different intent and
|
|
77
|
+
* has its own exit, {@link getActiveBrepEngine} (symmetric with
|
|
78
|
+
* {@link getActiveBrepEngineId}).
|
|
79
|
+
*
|
|
80
|
+
* @param id - the engine registration id to resolve.
|
|
73
81
|
* @returns a Promise resolving to the BREP engine instance.
|
|
74
82
|
*/
|
|
75
|
-
export declare function getBrepEngine(id
|
|
83
|
+
export declare function getBrepEngine(id: string): Promise<BrepEngine>;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve the **current** BREP engine (the first registrant, R8).
|
|
86
|
+
*
|
|
87
|
+
* The single way to ask "which engine is this session running on": symmetric with
|
|
88
|
+
* {@link getActiveBrepEngineId}, which answers the same question with the id only.
|
|
89
|
+
*
|
|
90
|
+
* @returns a Promise resolving to the active BREP engine instance.
|
|
91
|
+
* @throws when no BREP engine is registered (mesh mode / host not assembled).
|
|
92
|
+
*/
|
|
93
|
+
export declare function getActiveBrepEngine(): Promise<BrepEngine>;
|
|
76
94
|
/**
|
|
77
|
-
* Get a mesh engine (throws when not registered).
|
|
78
|
-
*
|
|
95
|
+
* Get a **named** mesh engine (throws when not registered). Assembly-time and
|
|
96
|
+
* diagnostic use; `id` is required for the same reason as {@link getBrepEngine}
|
|
97
|
+
* — taking the current engine is {@link getActiveMeshEngine}'s job.
|
|
98
|
+
* @param id - the mesh engine registration id to resolve.
|
|
79
99
|
* @returns the mesh engine instance.
|
|
80
100
|
*/
|
|
81
|
-
export declare function getMeshEngine(id
|
|
101
|
+
export declare function getMeshEngine(id: string): MeshEngine;
|
|
102
|
+
/**
|
|
103
|
+
* Get the **current** mesh engine (the first registrant).
|
|
104
|
+
* @returns the active mesh engine instance.
|
|
105
|
+
* @throws when no mesh engine is registered.
|
|
106
|
+
*/
|
|
107
|
+
export declare function getActiveMeshEngine(): MeshEngine;
|
|
82
108
|
/**
|
|
83
109
|
* The current default BREP engine id (null when none is registered).
|
|
84
110
|
* @returns the active BREP engine id or null.
|
|
@@ -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;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
|
|
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;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAUnE;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAK/D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAMpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,CAKhD;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"}
|
|
@@ -82,40 +82,71 @@ export function isBrepEngineRegistered(id) {
|
|
|
82
82
|
return brepEngineProviders.has(id);
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
85
|
-
* Resolve a BREP engine (asynchronously, resolving its provider; throws
|
|
86
|
-
*
|
|
87
|
-
*
|
|
85
|
+
* Resolve a **named** BREP engine (asynchronously, resolving its provider; throws
|
|
86
|
+
* when not registered). Assembly-time and diagnostic use only — library code must
|
|
87
|
+
* take the neutral surface via `getBrepApi()` or the platform face via
|
|
88
|
+
* `getOcctKernel()` / `getBrepKitKernel()`, never an engine by id.
|
|
89
|
+
*
|
|
90
|
+
* `id` is REQUIRED: this function means exactly one thing — "look up the engine
|
|
91
|
+
* registered under this id". Taking the current engine is a different intent and
|
|
92
|
+
* has its own exit, {@link getActiveBrepEngine} (symmetric with
|
|
93
|
+
* {@link getActiveBrepEngineId}).
|
|
94
|
+
*
|
|
95
|
+
* @param id - the engine registration id to resolve.
|
|
88
96
|
* @returns a Promise resolving to the BREP engine instance.
|
|
89
97
|
*/
|
|
90
98
|
export async function getBrepEngine(id) {
|
|
91
|
-
const
|
|
92
|
-
if (key === null) {
|
|
93
|
-
throw new Error('[engine/registry] no BREP engine registered — call registerBrepEngine() during host assembly (R8)');
|
|
94
|
-
}
|
|
95
|
-
const cached = brepEngineCache.get(key);
|
|
99
|
+
const cached = brepEngineCache.get(id);
|
|
96
100
|
if (cached)
|
|
97
101
|
return cached;
|
|
98
|
-
const provider = brepEngineProviders.get(
|
|
102
|
+
const provider = brepEngineProviders.get(id);
|
|
99
103
|
if (!provider) {
|
|
100
|
-
throw new Error(`[engine/registry] BREP engine '${
|
|
104
|
+
throw new Error(`[engine/registry] BREP engine '${id}' not registered`);
|
|
101
105
|
}
|
|
102
106
|
const engine = await provider();
|
|
103
|
-
brepEngineCache.set(
|
|
107
|
+
brepEngineCache.set(id, engine);
|
|
104
108
|
return engine;
|
|
105
109
|
}
|
|
106
110
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
111
|
+
* Resolve the **current** BREP engine (the first registrant, R8).
|
|
112
|
+
*
|
|
113
|
+
* The single way to ask "which engine is this session running on": symmetric with
|
|
114
|
+
* {@link getActiveBrepEngineId}, which answers the same question with the id only.
|
|
115
|
+
*
|
|
116
|
+
* @returns a Promise resolving to the active BREP engine instance.
|
|
117
|
+
* @throws when no BREP engine is registered (mesh mode / host not assembled).
|
|
118
|
+
*/
|
|
119
|
+
export async function getActiveBrepEngine() {
|
|
120
|
+
if (defaultBrepId === null) {
|
|
121
|
+
throw new Error('[engine/registry] no BREP engine registered — call registerBrepEngine() during host assembly (R8)');
|
|
122
|
+
}
|
|
123
|
+
return getBrepEngine(defaultBrepId);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get a **named** mesh engine (throws when not registered). Assembly-time and
|
|
127
|
+
* diagnostic use; `id` is required for the same reason as {@link getBrepEngine}
|
|
128
|
+
* — taking the current engine is {@link getActiveMeshEngine}'s job.
|
|
129
|
+
* @param id - the mesh engine registration id to resolve.
|
|
109
130
|
* @returns the mesh engine instance.
|
|
110
131
|
*/
|
|
111
132
|
export function getMeshEngine(id) {
|
|
112
|
-
const
|
|
113
|
-
const engine = key === null ? undefined : meshEngines.get(key);
|
|
133
|
+
const engine = meshEngines.get(id);
|
|
114
134
|
if (!engine) {
|
|
115
|
-
throw new Error(`[engine/registry] mesh engine '${
|
|
135
|
+
throw new Error(`[engine/registry] mesh engine '${id}' not registered`);
|
|
116
136
|
}
|
|
117
137
|
return engine;
|
|
118
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the **current** mesh engine (the first registrant).
|
|
141
|
+
* @returns the active mesh engine instance.
|
|
142
|
+
* @throws when no mesh engine is registered.
|
|
143
|
+
*/
|
|
144
|
+
export function getActiveMeshEngine() {
|
|
145
|
+
if (defaultMeshId === null) {
|
|
146
|
+
throw new Error('[engine/registry] mesh engine \'<none>\' not registered');
|
|
147
|
+
}
|
|
148
|
+
return getMeshEngine(defaultMeshId);
|
|
149
|
+
}
|
|
119
150
|
/**
|
|
120
151
|
* The current default BREP engine id (null when none is registered).
|
|
121
152
|
* @returns the active BREP engine id or null.
|
|
@@ -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'\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"]}
|
|
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 **named** BREP engine (asynchronously, resolving its provider; throws\n * when not registered). Assembly-time and diagnostic use only — library code must\n * take the neutral surface via `getBrepApi()` or the platform face via\n * `getOcctKernel()` / `getBrepKitKernel()`, never an engine by id.\n *\n * `id` is REQUIRED: this function means exactly one thing — \"look up the engine\n * registered under this id\". Taking the current engine is a different intent and\n * has its own exit, {@link getActiveBrepEngine} (symmetric with\n * {@link getActiveBrepEngineId}).\n *\n * @param id - the engine registration id to resolve.\n * @returns a Promise resolving to the BREP engine instance.\n */\nexport async function getBrepEngine(id: string): Promise<BrepEngine> {\n const cached = brepEngineCache.get(id)\n if (cached) return cached\n const provider = brepEngineProviders.get(id)\n if (!provider) {\n throw new Error(`[engine/registry] BREP engine '${id}' not registered`)\n }\n const engine = await provider()\n brepEngineCache.set(id, engine)\n return engine\n}\n\n/**\n * Resolve the **current** BREP engine (the first registrant, R8).\n *\n * The single way to ask \"which engine is this session running on\": symmetric with\n * {@link getActiveBrepEngineId}, which answers the same question with the id only.\n *\n * @returns a Promise resolving to the active BREP engine instance.\n * @throws when no BREP engine is registered (mesh mode / host not assembled).\n */\nexport async function getActiveBrepEngine(): Promise<BrepEngine> {\n if (defaultBrepId === null) {\n throw new Error('[engine/registry] no BREP engine registered — call registerBrepEngine() during host assembly (R8)')\n }\n return getBrepEngine(defaultBrepId)\n}\n\n/**\n * Get a **named** mesh engine (throws when not registered). Assembly-time and\n * diagnostic use; `id` is required for the same reason as {@link getBrepEngine}\n * — taking the current engine is {@link getActiveMeshEngine}'s job.\n * @param id - the mesh engine registration id to resolve.\n * @returns the mesh engine instance.\n */\nexport function getMeshEngine(id: string): MeshEngine {\n const engine = meshEngines.get(id)\n if (!engine) {\n throw new Error(`[engine/registry] mesh engine '${id}' not registered`)\n }\n return engine\n}\n\n/**\n * Get the **current** mesh engine (the first registrant).\n * @returns the active mesh engine instance.\n * @throws when no mesh engine is registered.\n */\nexport function getActiveMeshEngine(): MeshEngine {\n if (defaultMeshId === null) {\n throw new Error('[engine/registry] mesh engine \\'<none>\\' not registered')\n }\n return getMeshEngine(defaultMeshId)\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"]}
|
|
@@ -13,24 +13,23 @@
|
|
|
13
13
|
import type { Shape } from '../mesh/types.js';
|
|
14
14
|
import { fromBrep } from '../shape.js';
|
|
15
15
|
import type { BrepEngineApi } from './engine/primitives.js';
|
|
16
|
-
/**
|
|
17
|
-
* Get the currently injected BREP kernel instance (untyped escape hatch).
|
|
18
|
-
* @deprecated D12: this exit predates the engine-neutral L1 surface and its name
|
|
19
|
-
* ("OCCT kernel") no longer matches what it returns — the current engine's raw
|
|
20
|
-
* kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,
|
|
21
|
-
* same file) for neutral ops; platform-only code (L2 face) should use
|
|
22
|
-
* `getOcctKernel()` (D3). Kept for compat-face bridging and existing tests.
|
|
23
|
-
* @returns the current BREP engine's kernel instance.
|
|
24
|
-
* @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.
|
|
25
|
-
*/
|
|
26
|
-
export declare function getKernel(): unknown;
|
|
27
16
|
/**
|
|
28
17
|
* Get the current BREP engine as the **L1 core surface** (`BrepEngineApi`).
|
|
29
18
|
*
|
|
30
|
-
*
|
|
31
|
-
* `getBackends().kernel.brep as BrepEngineApi`
|
|
32
|
-
*
|
|
33
|
-
*
|
|
19
|
+
* The one exit for neutral op code to reach the kernel: replaces the
|
|
20
|
+
* `getBackends().kernel.brep as BrepEngineApi` assertion at every call site.
|
|
21
|
+
*
|
|
22
|
+
* Why the `as` here is honest (and stays): this file is the L1 contract's
|
|
23
|
+
* registration point — `registerBrepEngine(id, provider)` is only ever handed a
|
|
24
|
+
* `BrepEngineApi` instance (`brep/engine/adapters/occt.ts` and `.../brepkit.ts`
|
|
25
|
+
* build theirs via `createOcctPrimitives()` / `createBrepkitPrimitives()`, both
|
|
26
|
+
* typed against `BrepEngineApi`), and `brep-chain.ts` stores exactly
|
|
27
|
+
* `engine.primitives` into the slot this reads. So the slot's value IS the L1
|
|
28
|
+
* surface; the cast removes the `unknown` the zero-dependency slot type must use.
|
|
29
|
+
* Platform-only code (whatever L1 does not expose) goes through
|
|
30
|
+
* `getOcctKernel()` / `getBrepKitKernel()` instead.
|
|
31
|
+
*
|
|
32
|
+
* The slot restriction above is pinned by `test/brep/l1-slot-provenance.test.ts`.
|
|
34
33
|
*
|
|
35
34
|
* @returns the current engine's L1 contract surface (`BrepEngineApi`) — typed, engine-neutral.
|
|
36
35
|
* @throws when no BREP engine is registered (uninitialized) — never silently returns null.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-bridge.d.ts","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"handle-bridge.d.ts","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAyCxD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,IAAI,aAAa,CAQ1C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAEhD;AAyBD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAW3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAGjG"}
|
|
@@ -12,36 +12,56 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { getBackends } from '../runtime-state.js';
|
|
14
14
|
import { fromBrep } from '../shape.js';
|
|
15
|
+
/** The slot value as stored by the runtime — `unknown` because the slot type is dependency-free. */
|
|
16
|
+
function rawKernelOrNull() {
|
|
17
|
+
return getBackends().kernel.brep;
|
|
18
|
+
}
|
|
15
19
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* The current engine's raw kernel instance (untyped) — **internal to this file**.
|
|
21
|
+
*
|
|
22
|
+
* This is NOT an exit. The "current engine's raw kernel" is whatever the current
|
|
23
|
+
* engine happens to be (occt today, brepkit in a weapp session) and carries no
|
|
24
|
+
* contract; the former exported `getKernel()` was deleted (2026-10-14) because its
|
|
25
|
+
* name claimed OCCT while its value was engine-dependent, colliding with
|
|
26
|
+
* `occt-kernel/occtKernel.ts`'s `getKernel()` (the real OCCT platform face). The
|
|
27
|
+
* error message below was engine-neutralised for the same reason.
|
|
28
|
+
*
|
|
29
|
+
* Only `meshHandle` uses it, to call the kernel's own `meshShape` — a kernel-level
|
|
30
|
+
* method every engine must have (it is what materialises a handle into a Shape).
|
|
31
|
+
*
|
|
22
32
|
* @returns the current BREP engine's kernel instance.
|
|
23
33
|
* @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.
|
|
24
34
|
*/
|
|
25
|
-
|
|
26
|
-
const kernel =
|
|
35
|
+
function requireRawKernel() {
|
|
36
|
+
const kernel = rawKernelOrNull();
|
|
27
37
|
if (!kernel) {
|
|
28
|
-
throw new Error('[faijs/bridge]
|
|
38
|
+
throw new Error('[faijs/bridge] BREP kernel not available: tessellating a handle requires an initialized kernel');
|
|
29
39
|
}
|
|
30
40
|
return kernel;
|
|
31
41
|
}
|
|
32
42
|
/**
|
|
33
43
|
* Get the current BREP engine as the **L1 core surface** (`BrepEngineApi`).
|
|
34
44
|
*
|
|
35
|
-
*
|
|
36
|
-
* `getBackends().kernel.brep as BrepEngineApi`
|
|
37
|
-
*
|
|
38
|
-
*
|
|
45
|
+
* The one exit for neutral op code to reach the kernel: replaces the
|
|
46
|
+
* `getBackends().kernel.brep as BrepEngineApi` assertion at every call site.
|
|
47
|
+
*
|
|
48
|
+
* Why the `as` here is honest (and stays): this file is the L1 contract's
|
|
49
|
+
* registration point — `registerBrepEngine(id, provider)` is only ever handed a
|
|
50
|
+
* `BrepEngineApi` instance (`brep/engine/adapters/occt.ts` and `.../brepkit.ts`
|
|
51
|
+
* build theirs via `createOcctPrimitives()` / `createBrepkitPrimitives()`, both
|
|
52
|
+
* typed against `BrepEngineApi`), and `brep-chain.ts` stores exactly
|
|
53
|
+
* `engine.primitives` into the slot this reads. So the slot's value IS the L1
|
|
54
|
+
* surface; the cast removes the `unknown` the zero-dependency slot type must use.
|
|
55
|
+
* Platform-only code (whatever L1 does not expose) goes through
|
|
56
|
+
* `getOcctKernel()` / `getBrepKitKernel()` instead.
|
|
57
|
+
*
|
|
58
|
+
* The slot restriction above is pinned by `test/brep/l1-slot-provenance.test.ts`.
|
|
39
59
|
*
|
|
40
60
|
* @returns the current engine's L1 contract surface (`BrepEngineApi`) — typed, engine-neutral.
|
|
41
61
|
* @throws when no BREP engine is registered (uninitialized) — never silently returns null.
|
|
42
62
|
*/
|
|
43
63
|
export function getBrepApi() {
|
|
44
|
-
const kernel =
|
|
64
|
+
const kernel = rawKernelOrNull();
|
|
45
65
|
if (!kernel) {
|
|
46
66
|
throw new Error('[faijs/bridge] BREP engine API not available: BREP operations require an initialized engine');
|
|
47
67
|
}
|
|
@@ -88,7 +108,7 @@ function requireHandle(handle, caller) {
|
|
|
88
108
|
*/
|
|
89
109
|
export function meshHandle(handle, opts) {
|
|
90
110
|
requireHandle(handle, 'meshHandle');
|
|
91
|
-
const kernel =
|
|
111
|
+
const kernel = requireRawKernel();
|
|
92
112
|
const mesh = kernel.meshShape(handle, {
|
|
93
113
|
linearDeflection: opts?.linearDeflection ?? 0.1,
|
|
94
114
|
angularDeflection: (2 * Math.PI) / Math.max(3, opts?.segments ?? 32),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC
|
|
1
|
+
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC,oGAAoG;AACpG,SAAS,eAAe;IACtB,OAAO,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;AAClC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;IACH,CAAC;IACD,OAAO,MAAuB,CAAA;AAChC,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAA8B,CAAC,UAAU,KAAK,IAAI,CAAA;AACnG,CAAC;AAED;0CAC0C;AAC1C,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,MAAc;IACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,yDAAyD;YAC/E,kCAAkC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,IAAI;YAC9E,wDAAwD,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAoB,CAAA;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,GAAG;QAC/C,iBAAiB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,OAAO;QACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAA4B,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * handle-bridge — OCCT 句柄 → faijs Shape 的 SDK 桥接(B1)\n *\n *\n * 第三方库要造 BREP 产物,需要\"OCCT handle → mesh\"。SDK 绝不能 import\n * heavy 几何库(会把它们拉进 SDK bundle,违反 `src/sdk.test.ts` 的零 heavy\n * 依赖守卫)。本文件在**新建的零依赖模块**中实现,直接调运行时注入的\n * `kernel.meshShape`。\n *\n * 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only\n * `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** 结构化内核接口(不 import occt-wasm,只做结构匹配,避免 heavy 依赖) */\ninterface MeshableKernel {\n meshShape(\n handle: unknown,\n opts: { linearDeflection: number; angularDeflection: number },\n ): { positions: ArrayLike<number>; indices: ArrayLike<number> }\n}\n\n/** The slot value as stored by the runtime — `unknown` because the slot type is dependency-free. */\nfunction rawKernelOrNull(): unknown {\n return getBackends().kernel.brep\n}\n\n/**\n * The current engine's raw kernel instance (untyped) — **internal to this file**.\n *\n * This is NOT an exit. The \"current engine's raw kernel\" is whatever the current\n * engine happens to be (occt today, brepkit in a weapp session) and carries no\n * contract; the former exported `getKernel()` was deleted (2026-10-14) because its\n * name claimed OCCT while its value was engine-dependent, colliding with\n * `occt-kernel/occtKernel.ts`'s `getKernel()` (the real OCCT platform face). The\n * error message below was engine-neutralised for the same reason.\n *\n * Only `meshHandle` uses it, to call the kernel's own `meshShape` — a kernel-level\n * method every engine must have (it is what materialises a handle into a Shape).\n *\n * @returns the current BREP engine's kernel instance.\n * @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.\n */\nfunction requireRawKernel(): unknown {\n const kernel = rawKernelOrNull()\n if (!kernel) {\n throw new Error(\n '[faijs/bridge] BREP kernel not available: tessellating a handle requires an initialized kernel',\n )\n }\n return kernel\n}\n\n/**\n * Get the current BREP engine as the **L1 core surface** (`BrepEngineApi`).\n *\n * The one exit for neutral op code to reach the kernel: replaces the\n * `getBackends().kernel.brep as BrepEngineApi` assertion at every call site.\n *\n * Why the `as` here is honest (and stays): this file is the L1 contract's\n * registration point — `registerBrepEngine(id, provider)` is only ever handed a\n * `BrepEngineApi` instance (`brep/engine/adapters/occt.ts` and `.../brepkit.ts`\n * build theirs via `createOcctPrimitives()` / `createBrepkitPrimitives()`, both\n * typed against `BrepEngineApi`), and `brep-chain.ts` stores exactly\n * `engine.primitives` into the slot this reads. So the slot's value IS the L1\n * surface; the cast removes the `unknown` the zero-dependency slot type must use.\n * Platform-only code (whatever L1 does not expose) goes through\n * `getOcctKernel()` / `getBrepKitKernel()` instead.\n *\n * The slot restriction above is pinned by `test/brep/l1-slot-provenance.test.ts`.\n *\n * @returns the current engine's L1 contract surface (`BrepEngineApi`) — typed, engine-neutral.\n * @throws when no BREP engine is registered (uninitialized) — never silently returns null.\n */\nexport function getBrepApi(): BrepEngineApi {\n const kernel = rawKernelOrNull()\n if (!kernel) {\n throw new Error(\n '[faijs/bridge] BREP engine API not available: BREP operations require an initialized engine',\n )\n }\n return kernel as BrepEngineApi\n}\n\n/**\n * Options controlling how a handle is tessellated.\n */\nexport interface MeshHandleOptions {\n /** linear deflection (mm), default 0.1 — matches the built-in ops (src/brep/brep-ops.ts:27). */\n linearDeflection?: number\n /** angular segment count, default 32 — angularDeflection = 2π / segments. */\n segments?: number\n}\n\n/**\n * OCC 句柄身份契约判别(单一真源)。\n *\n * occt-wasm 的 `handle()` 工厂(occtWasm helpers.ts:25)构造的句柄对象\n * 统一携带 `__occtWasm: true`。本叶子是 faijs 侧唯一允许的判据:\n * define-op 的 `wrapBrepOne` 用它区分\"几何句柄\"与\"纯数据记录\",本文件\n * `fromHandle`/`meshHandle` 入口用它做形态断言。禁止在其他文件硬编码\n * `'__occtWasm' in v` 字符串直查——句柄/数据判定的任何新消费点都必须引用本叶子。\n * @param v - 待判别的值。\n * @returns `true` 当且仅当 `v` 是携带 `__occtWasm: true` 标记的句柄对象。\n */\nexport function isOcctHandle(v: unknown): boolean {\n return typeof v === 'object' && v !== null && (v as { __occtWasm?: unknown }).__occtWasm === true\n}\n\n/** 合法句柄输入:branded numeric id(occt-wasm 的 `ShapeHandle` 运行时形态)或\n * `__occtWasm` 标记对象(`handle()` 工厂产物)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'number' || isOcctHandle(v)\n}\n\n/**\n * 入口形态断言:拒绝把纯数据记录当句柄三角化。\n * 纯数据记录(无 `__occtWasm` 标记的 plain object,如 sheetmetal part 数据)\n * 必须在 SDK 边界被显式拒绝(E_BAD_HANDLE),而不是在 kernel 深处以\n * `OcctError: meshShape: Invalid shape ID 0` 崩溃——define-op 的 wrapBrepOne\n * 已在第一道透传过滤,本断言是第二道防线(防未来未带标记的新句柄形态漏网)。\n */\nfunction requireHandle(handle: unknown, caller: string): void {\n if (!isHandleLike(handle)) {\n throw new Error(\n `[faijs/bridge] ${caller}: E_BAD_HANDLE: expected an OCCT handle (numeric id or ` +\n `__occtWasm-tagged object); got ${handle === null ? 'null' : typeof handle}. ` +\n `Plain data records must not be tessellated as handles.`,\n )\n }\n}\n\n/**\n * Tessellate an OCCT handle into a Shape (without registering a BREP slot).\n * @param handle - the OCCT solid handle to tessellate (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the tessellated Shape.\n */\nexport function meshHandle(handle: unknown, opts?: MeshHandleOptions): Shape {\n requireHandle(handle, 'meshHandle')\n const kernel = requireRawKernel() as MeshableKernel\n const mesh = kernel.meshShape(handle, {\n linearDeflection: opts?.linearDeflection ?? 0.1,\n angularDeflection: (2 * Math.PI) / Math.max(3, opts?.segments ?? 32),\n })\n return {\n positions: new Float32Array(mesh.positions as ArrayLike<number>),\n indices: new Uint32Array(mesh.indices as ArrayLike<number>),\n }\n}\n\n/**\n * Default path (recommended): tessellate + register the BREP slot in one step.\n * Equivalent to meshHandle(h) + fromBrep(sh, { solid: h }).\n * Library authors only fall back to the meshHandle + fromBrep combination when\n * they need custom tessellation precision.\n * @param handle - the OCCT solid handle to bridge (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the registered Shape, as returned by fromBrep.\n */\nexport function fromHandle(handle: unknown, opts?: MeshHandleOptions): ReturnType<typeof fromBrep> {\n requireHandle(handle, 'fromHandle')\n return fromBrep(meshHandle(handle, opts), { solid: handle })\n}\n"]}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
* 坐标系:Z-up、毫米,与 mesh 路径一致。
|
|
20
20
|
*/
|
|
21
|
-
import {
|
|
21
|
+
import { getActiveBrepEngine } from './engine/registry.js';
|
|
22
22
|
import { primitiveToBrepSolid } from '../primitives/brep-primitives.js';
|
|
23
23
|
import { clampNRad } from '../mesh/types.js';
|
|
24
24
|
import { DEFAULT_LINEAR_DEFLECTION } from '../tolerance.js';
|
|
@@ -45,7 +45,7 @@ function segmentsToAngularDeflection(segments) {
|
|
|
45
45
|
* @returns Shape(三角化 mesh,供显示用)
|
|
46
46
|
*/
|
|
47
47
|
async function brepToShape(type, params, segments) {
|
|
48
|
-
const kernel = (await
|
|
48
|
+
const kernel = (await getActiveBrepEngine()).primitives;
|
|
49
49
|
// 用升级后的 primitiveToBrepSolid 构造 OCCT 精确实体
|
|
50
50
|
const result = primitiveToBrepSolid(kernel, type, params);
|
|
51
51
|
const solid = result.solid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives-brep.js","sourceRoot":"","sources":["../../src/brep/primitives-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"primitives-brep.js","sourceRoot":"","sources":["../../src/brep/primitives-brep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAWpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAE7B,eAAe;AAEf;;;;;GAKG;AACH,SAAS,2BAA2B,CAAC,QAAiB;IACpD,MAAM,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAA,CAAC,wCAAwC;IACpE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,WAAW,CACxB,IAAuD,EACvD,MAA4E,EAC5E,QAAiB;IAEjB,MAAM,MAAM,GAAkB,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC,UAAU,CAAA;IAEtE,0CAA0C;IAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACzD,MAAM,KAAK,GAAe,MAAM,CAAC,KAAK,CAAA;IAEtC,IAAI,CAAC;QACH,cAAc;QACd,MAAM,iBAAiB,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;YACnC,gBAAgB,EAAE,yBAAyB,CAAC,EAAE,CAAC,EAAE,CAAC;YAClD,iBAAiB;SAClB,CAAC,CAAA;QAEF,0BAA0B;QAC1B,OAAO;YACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3C,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;SACvC,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,sBAAsB;AAEtB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAiB;IAC7C,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAoB;IACrD,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAsB;IACzD,OAAO,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AACjF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAkB;IACjD,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAmB;IACjD,OAAO,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC","sourcesContent":["/**\n * mesh BREP 基本体 API — 使用 OCCT 精确实体构造\n *\n * See docs/api-contract.md §8 (dual-path geometry contract: BREP / Mesh).\n *\n * 与 `primitives.ts`(mesh 路径)的对照:\n * - mesh 路径:THREE 参数几何 → geoToManifoldMesh → Shape(三角网格近似)\n * - BREP 路径:OCCT 精确实体 → meshShape 三角化 → Shape(显示用 mesh,但底层是精确 BREP)\n *\n * 两条路径返回的 Shape 都是 { positions, indices },显示管线一致。\n * 差异仅在:BREP 路径的 Shape 由 OCCT 精确实体三角化得到,曲面精度更高;\n * 且导出 STEP 时可短路为原生 ADVANCED_FACE(而非 faceted 重建)。\n *\n * segments 参数的处理:\n * - mesh 路径:segments 直接控制 THREE 几何体的分段数\n * - BREP 路径:segments 转换为 angularDeflection(≈2π/segments)控制 OCCT 三角化精度\n * BREP 实体本身是精确的,segments 只影响显示 mesh 的精度\n *\n * 坐标系:Z-up、毫米,与 mesh 路径一致。\n */\n\nimport { getActiveBrepEngine } from './engine/registry'\nimport { primitiveToBrepSolid } from '../primitives/brep-primitives'\nimport type { BrepHandle } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport type {\n Shape,\n BoxParams,\n SphereParams,\n CylinderParams,\n ConeParams,\n WedgeParams,\n} from '../mesh/types'\nimport { clampNRad } from '../mesh/types'\nimport { DEFAULT_LINEAR_DEFLECTION } from '../tolerance'\nimport { mm } from '../units'\n\n// ─── 内部工具 ───\n\n/**\n * 将 segments 数转换为 OCCT meshShape 的 angularDeflection。\n *\n * segments=32 → angularDeflection≈2π/32≈0.196 rad\n * segments 越大,三角化越精细。\n */\nfunction segmentsToAngularDeflection(segments?: number): number {\n const segs = segments ?? 64 // 缺省 64(= brepjs standard 等效,§5.0/§5.1)\n return (2 * Math.PI) / Math.max(3, segs)\n}\n\n/**\n * 用 OCCT 构造 BREP 实体并三角化为 Shape。\n *\n * 内部流程:注册表取当前 BREP 引擎 → primitiveToBrepSolid(引擎精确构造)→ meshShape → release → Shape\n *\n * @param type primitive 类型(cube/sphere/cylinder/cone/wedge)\n * @param params 完整参数对象\n * @param segments 可选分段数(影响三角化精度,不影响 BREP 实体精度)\n * @returns Shape(三角化 mesh,供显示用)\n */\nasync function brepToShape(\n type: 'cube' | 'sphere' | 'cylinder' | 'cone' | 'wedge',\n params: BoxParams | SphereParams | CylinderParams | ConeParams | WedgeParams,\n segments?: number,\n): Promise<Shape> {\n const kernel: BrepEngineApi = (await getActiveBrepEngine()).primitives\n\n // 用升级后的 primitiveToBrepSolid 构造 OCCT 精确实体\n const result = primitiveToBrepSolid(kernel, type, params)\n const solid: BrepHandle = result.solid\n\n try {\n // 三角化为显示 mesh\n const angularDeflection = segmentsToAngularDeflection(segments)\n const mesh = kernel.meshShape(solid, {\n linearDeflection: DEFAULT_LINEAR_DEFLECTION.as(mm),\n angularDeflection,\n })\n\n // 返回 Shape(与 mesh 路径格式一致)\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n } finally {\n kernel.release(solid)\n }\n}\n\n// ─── BREP 创建 API ───\n\n/**\n * Create a box with an OCCT exact solid and tessellate it into a Shape.\n * @param params - the box parameters.\n * @returns a Promise resolving to the tessellated Shape.\n */\nexport async function boxBrep(params: BoxParams): Promise<Shape> {\n return brepToShape('cube', params)\n}\n\n/**\n * Create a sphere with an OCCT exact solid and tessellate it into a Shape.\n * @param params - the sphere parameters.\n * @returns a Promise resolving to the tessellated Shape.\n */\nexport async function sphereBrep(params: SphereParams): Promise<Shape> {\nreturn brepToShape('sphere', params, clampNRad(params.nRad ?? params.segments))\n}\n\n/**\n * Create a cylinder with an OCCT exact solid and tessellate it into a Shape.\n * @param params - the cylinder parameters.\n * @returns a Promise resolving to the tessellated Shape.\n */\nexport async function cylinderBrep(params: CylinderParams): Promise<Shape> {\nreturn brepToShape('cylinder', params, clampNRad(params.nRad ?? params.segments))\n}\n\n/**\n * Create a cone with an OCCT exact solid and tessellate it into a Shape.\n * @param params - the cone parameters.\n * @returns a Promise resolving to the tessellated Shape.\n */\nexport async function coneBrep(params: ConeParams): Promise<Shape> {\nreturn brepToShape('cone', params, clampNRad(params.nRad ?? params.segments))\n}\n\n/**\n * Create a wedge with an OCCT exact solid and tessellate it into a Shape.\n * @param params - the wedge parameters.\n * @returns a Promise resolving to the tessellated Shape.\n */\nexport async function wedgeBrep(params: WedgeParams): Promise<Shape> {\n return brepToShape('wedge', params)\n}\n"]}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 与 brepjs 的差异:
|
|
8
8
|
* - brepjs 用 BlueprintSketcher 构造 wire → 本项目直接用 kernel.makeLineEdge / makeBezierEdge
|
|
9
|
-
* - brepjs 用 organiseBlueprints 处理孔洞 → 本项目用 makeFace
|
|
9
|
+
* - brepjs 用 organiseBlueprints 处理孔洞 → 本项目用 makeFace + addHolesInFace 构建
|
|
10
|
+
* (分类复用 `primitives/svg/svg-path.ts` 的共享 classifyNested,与 svg-to-solid 同源)
|
|
10
11
|
* - brepjs 用 sketchOnPlane → 本项目直接在 XY 平面构造然后按需变换
|
|
11
12
|
*
|
|
12
13
|
* opentype.js 路径命令 → OCCT edge 映射:
|
|
@@ -15,9 +16,40 @@
|
|
|
15
16
|
* - C (cubicBezier) → kernel.makeBezierEdge([p0, cp1, cp2, p1])
|
|
16
17
|
* - Q (quadraticBezier) → 转换为三次贝塞尔后用 makeBezierEdge
|
|
17
18
|
* - Z (closePath) → 闭合 wire
|
|
19
|
+
*
|
|
20
|
+
* 孔洞与组合(2026-10-13 修复,见 .agents/notes/ 对应 Agent Note):
|
|
21
|
+
* - 旧实现把每个闭合轮廓独立 makeFace+extrude 后**逐个 fuse**:带孔字符(如 'o')
|
|
22
|
+
* 的外轮廓体与内孔体被布尔并成一个实心体,孔被填实(与 mesh 路径的 evenodd
|
|
23
|
+
* 分类不一致);且 fuse 次数 = 轮廓数,'Hello' ≈ 8-12 次 OCCT 布尔是文字建模
|
|
24
|
+
* 10 秒级耗时的主因。
|
|
25
|
+
* - 新实现:轮廓按包含关系分组(外轮廓 + 其孔,复用 classifyNested)→ 每组
|
|
26
|
+
* makeFace(outer) + addHolesInFace(holes) 挖孔 → extrude;字符间互不重叠,
|
|
27
|
+
* **用 makeCompound 组合(零布尔成本)**,不再逐轮廓 fuse。
|
|
18
28
|
*/
|
|
19
29
|
import type { BrepHandle } from '../engine/types.js';
|
|
20
30
|
import type { BrepEngineApi } from '../engine/primitives.js';
|
|
31
|
+
import { type SvgPoint2 } from '../../primitives/svg/svg-path.js';
|
|
32
|
+
/**
|
|
33
|
+
* 将文字转换为 OCCT wire 数组(每个闭合轮廓一个 wire),并带各轮廓的
|
|
34
|
+
* 采样点集(供 classifyNested 做外轮廓/孔洞分类)。
|
|
35
|
+
*
|
|
36
|
+
* 采样点:L 端点、Q/C 按 CURVE_SAMPLES 段离散化 —— 与 mesh 路径
|
|
37
|
+
* `opentypePathToContours` 的曲线折线化同一用途(bbox/质心/射线判定精度足够)。
|
|
38
|
+
*
|
|
39
|
+
* @param kernel OCCT 内核
|
|
40
|
+
* @param text 文字字符串
|
|
41
|
+
* @param options 配置选项
|
|
42
|
+
* @returns 每个闭合轮廓的 { wire, points }(points 为 Y-up 采样点)
|
|
43
|
+
*/
|
|
44
|
+
export declare function textBlueprintsDetailed(kernel: BrepEngineApi, text: string, options?: {
|
|
45
|
+
startX?: number;
|
|
46
|
+
startY?: number;
|
|
47
|
+
fontSize?: number;
|
|
48
|
+
fontFamily?: string;
|
|
49
|
+
}): {
|
|
50
|
+
wire: BrepHandle;
|
|
51
|
+
points: SvgPoint2[];
|
|
52
|
+
}[];
|
|
21
53
|
/**
|
|
22
54
|
* 将文字转换为 OCCT wire 数组(每个闭合轮廓一个 wire)。
|
|
23
55
|
*
|
|
@@ -33,12 +65,17 @@ export declare function textBlueprints(kernel: BrepEngineApi, text: string, opti
|
|
|
33
65
|
fontFamily?: string;
|
|
34
66
|
}): BrepHandle[];
|
|
35
67
|
/**
|
|
36
|
-
* 将文字转换为 OCCT 3D solid(face → extrude →
|
|
68
|
+
* 将文字转换为 OCCT 3D solid(face → 挖孔 → extrude → compound)。
|
|
69
|
+
*
|
|
70
|
+
* 每个「外轮廓 + 其孔」分组生成一个空心 solid(makeFace + addHolesInFace);
|
|
71
|
+
* 分组之间(字符 / 互不重叠的独立轮廓,如 'i' 的点)**用 makeCompound 组合**,
|
|
72
|
+
* 不做布尔融合 —— 字符水平排列互不重叠,compound 语义正确且零布尔成本
|
|
73
|
+
* (旧实现逐个 fuse 是文字建模慢的根因,也是 'o' 孔被填实的成因)。
|
|
37
74
|
*
|
|
38
75
|
* @param kernel OCCT 内核
|
|
39
76
|
* @param text 文字字符串
|
|
40
77
|
* @param options 配置选项
|
|
41
|
-
* @returns BrepHandle
|
|
78
|
+
* @returns BrepHandle(单组时为 solid,多组时为 compound)
|
|
42
79
|
*/
|
|
43
80
|
export declare function textToSolid(kernel: BrepEngineApi, text: string, options: {
|
|
44
81
|
fontSize?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-to-solid.d.ts","sourceRoot":"","sources":["../../../src/brep/text/text-to-solid.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"text-to-solid.d.ts","sourceRoot":"","sources":["../../../src/brep/text/text-to-solid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIzD,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,+BAA+B,CAAA;AAuEtC;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACf,GACL;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,EAAE,CA6I7C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACf,GACL,UAAU,EAAE,CAEd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,GACA,UAAU,CAmDZ"}
|