@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"occtKernel.js","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * occt-wasm 封装层 — 替代 occt-import-js\n *\n * 提供 STEP/BREP → Mesh 转换和 Mesh → STEP 导出能力。\n * 利用 occt-wasm 的 meshShape() 获取 faceGroups(面→三角形映射),\n * 利用 wireframe() 获取边折线数据,利用 edgeToFaceMap() 获取边→面关联。\n */\nimport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag } from 'occt-wasm'\n\nimport { getSolidColorsOrdered } from './stepColorParser'\nimport { SEWING_TOLERANCE } from '../tolerance'\nimport { computeEffectiveDeflection, type MeshDeflectionOptions } from '../brep/effective-deflection'\nimport { mm } from '../units'\n\n/** A single tessellated mesh produced by the OCCT kernel. */\nexport interface WasmTessellatedMesh {\n positions: Float32Array\n normals: Float32Array\n indices: Uint32Array\n}\n\n/** Result of importing a shape into the OCCT kernel. */\nexport interface WasmImportResult {\n shapeHandle: ShapeHandle\n meshes: WasmTessellatedMesh[]\n meshWithGroups: Mesh\n}\n\n// F5 设计意图说明:\n// OCCT WASM 内核是环境级单例,不是实例级。在整个浏览器页面/Node 进程中只应\n// 初始化一次;多个 CadRuntime 实例共享同一个 kernel 是正确的行为。\n//\n// 2026-09-26 跨实例共享(随 0.18.2 发布):\n// kernelInstance / initPromise / customInitFn 从\"模块级单例\"提升为挂在\n// globalThis 上的共享状态(与 runtime-state.ts 的 `__FAICAD_FAIJS_RUNTIME__`\n// 同款设计)。原因:CDN 装载的第三方库(sheetmetal/cq-compat/faijs-gears)\n// 在 jsDelivr +esm 打包时把 peer `@faicad/faijs` 外部化为**独立模块实例**\n// (根入口与 /api/ 子路径是不同 URL → 不同 bundle),模块级单例导致:\n// - 库实例的 occt 内核从未初始化 → `occt-wasm kernel not initialized`;\n// - 各实例持有不同内核 → 句柄不互通 → `meshShape: Invalid shape ID`。\n// 挂在 globalThis 后,任一实例 initOcctWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底(同 runtime-state 注释)。\n\nconst OCCT_KERNEL_KEY = '__FAICAD_FAIJS_OCCT_KERNEL__'\nconst OCCT_KERNEL_STATE_VERSION = 1\n\n/** occt 内核共享状态(跨 faijs 模块实例,浏览器/Node 双环境)。 */\ninterface OcctKernelSharedState {\n stateVersion: number\n kernelInstance: OcctKernel | null\n initPromise: Promise<OcctKernel> | null\n /** 浏览器 host 注入的 OCCT 初始化函数 */\n customInitFn: (() => Promise<OcctKernel>) | null\n}\n\n/**\n * 获取 occt 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 kernelInstance 导致内核各自\n * 初始化、句柄不互通(几何孤岛)。\n *\n * @returns the shared occt kernel state singleton.\n */\nfunction getOcctKernelSharedState(): OcctKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[OCCT_KERNEL_KEY] as OcctKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== OCCT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] occt kernel state version mismatch: loaded=${existing.stateVersion}, expected=${OCCT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: OcctKernelSharedState = {\n stateVersion: OCCT_KERNEL_STATE_VERSION,\n kernelInstance: null,\n initPromise: null,\n customInitFn: null,\n }\n g[OCCT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * Let the browser host inject the OCCT initialization function.\n *\n * The browser host calls this to register its own init logic (dev/prod/CDN/e2e\n * branches); faijs's initOcctWasm() prefers the injected function. 注入的挂点\n * 写入共享状态——任意 faijs 实例(含 CDN 外部化实例)调 initOcctWasm() 时\n * 都优先使用同一份宿主初始化函数。\n *\n * When nothing is injected, initOcctWasm() reads the WASM from node_modules in\n * a Node environment.\n *\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setOcctWasmInitFn(fn: (() => Promise<OcctKernel>) | null): void {\n const s = getOcctKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * Resolve the occt-wasm WASM file path (linker-agnostic).\n *\n * Walks the package exports (occt-wasm@5.6.0 exports \"./dist/occt-wasm.wasm\"),\n * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).\n * Replaces the old 4-level `..` path guessing + process.cwd() fallback.\n *\n * Lazy-fetches node:module (Node >= 20.16 process.getBuiltinModule): a static\n * `import { createRequire } from 'node:module'` must not be used — occtKernel is\n * on the browser build's (demo vite build) import chain, and a static node:*\n * import would be externalized and error. This function is only called in the\n * Node branch (initOcctWasm); it never runs in a browser environment.\n *\n * @returns the resolved WASM file path\n */\nexport function resolveOcctWasmPath(): string {\n const builtin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:module') as\n | { createRequire: (filename: string) => { resolve: (id: string) => string } }\n | undefined\n if (!builtin) {\n throw new Error('[faijs] resolveOcctWasmPath requires Node.js (process.getBuiltinModule)')\n }\n return builtin.createRequire(import.meta.url).resolve('occt-wasm/dist/occt-wasm.wasm')\n}\n\n/**\n * Initialize the occt-wasm kernel (singleton).\n *\n * - Node.js test environment: read the WASM file from node_modules, pass an ArrayBuffer.\n * - Development: direct ESM import, Vite resolves node_modules. The WASM file is loaded from public/wasm/occt-wasm.wasm.\n * - Production: dynamically import the whole module + WASM from a CDN.\n *\n * @returns the initialized raw OCCT kernel (native L2 face — NOT BrepEngineApi;\n * the L1 contract face is built separately by createOcctPrimitives()\n * in brep/engine/adapters/occt.ts as an explicit object literal).\n */\nexport async function initOcctWasm(): Promise<OcctKernel> {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) return s.kernelInstance\n if (s.initPromise) return s.initPromise\n\n s.initPromise = (async () => {\n // 优先使用浏览器 host 注入的初始化函数(共享挂点,跨实例生效)\n if (s.customInitFn) {\n s.kernelInstance = await s.customInitFn()\n return s.kernelInstance\n }\n\n // Node.js 环境:从 node_modules 读取 WASM 文件\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { OcctKernel: Ctor } = await import('occt-wasm')\n // 与 resolveOcctWasmPath 同款:经 process.getBuiltinModule 取 node:fs,\n // 不用 `await import('node:fs')`——后者会被 vite 打包器静态分析 externalize\n // 并在浏览器构建时报 \"node:fs has been externalized\" warning(本分支运行时\n // 不会在浏览器执行,但打包器仍会对动态 import 字符串告警)。\n const fsBuiltin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:fs') as\n | { readFileSync: (p: string) => Buffer }\n | undefined\n if (!fsBuiltin) {\n throw new Error('[faijs] occt-wasm init requires Node.js (process.getBuiltinModule)')\n }\n const wasmPath = resolveOcctWasmPath()\n const buf = fsBuiltin.readFileSync(wasmPath)\n const wasmBinary = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer\n s.kernelInstance = await Ctor.init({ wasm: wasmBinary })\n return s.kernelInstance\n }\n\n throw new Error('initOcctWasm: no init function set and not in Node environment. Call setOcctWasmInitFn() first.')\n })()\n\n return s.initPromise\n}\n\n/**\n * Get the initialized kernel instance (initOcctWasm must be called first).\n *\n * @returns the initialized OCCT kernel\n */\nexport function getKernel(): OcctKernel {\n const k = getOcctKernelSharedState().kernelInstance\n if (!k) throw new Error('occt-wasm kernel not initialized — call initOcctWasm() first')\n return k\n}\n\n/**\n * Native-face alias for getKernel() (plan D3 ②): symmetric with\n * getBrepkitKernel() on the brepkit side. Platform-specific code uses this\n * name; the original getKernel() stays for existing host code.\n */\nexport const getOcctKernel = getKernel\n\n/** Release the kernel instance (call when the app unloads). */\nexport function disposeOcctWasm(): void {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) {\n s.kernelInstance[Symbol.dispose]()\n s.kernelInstance = null\n s.initPromise = null\n }\n}\n\n/** Options controlling mesh deflection during tessellation. */\nexport type { MeshDeflectionOptions } from '../brep/effective-deflection'\n\n/**\n * Compute the effective linear deflection, applying relative scaling\n * exactly as OCCT does internally: `linDefl * bboxDiagonal` when relative=true.\n *\n * 实现已移到引擎中立的 `brep/effective-deflection.ts`(函数体只用\n * `getBoundingBox`,与 OCCT 无关)——此处 re-export 保持既有导入面零迁移。\n * 本模块内部仍要用它,故 import 后再 re-export(纯 re-export 不产生本地绑定)。\n *\n * @param kernel - the OCCT kernel\n * @param shape - the shape whose bounding box drives relative scaling\n * @param options - the requested deflection options\n * @returns the effective linear and angular deflection values\n */\nexport { computeEffectiveDeflection }\n\n/**\n * Import a STEP file to ShapeHandle + Mesh (including face groups).\n *\n * Uses meshShape() rather than tessellate(), so face-group data is available\n * (each face's triangle range [triStart, triCount, faceHash]).\n *\n * @param stepData - STEP file bytes\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importStepToMesh(\n stepData: ArrayBuffer | Uint8Array,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const ab = stepData instanceof Uint8Array ? stepData.buffer.slice(stepData.byteOffset, stepData.byteOffset + stepData.byteLength) as ArrayBuffer : stepData\n const shape = kernel.importStep(ab)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n// ── Assembly (XCAF) support ──\n\n/** A node in the XCAF assembly tree (mirrors the STEP_T occurrence concept). */\nexport interface AssemblyPartNode {\n /** Dotted path: 'o0', 'o0.o1', 'o0.o1.o2' — matches STEP_T occurrence path. */\n labelPath: string\n /** XCAF label name (falls back to labelPath if empty). */\n name: string\n /** True if this node is an assembly (has child components). */\n isAssembly: boolean\n /**\n * True when `isAssembly` was **synthesised by this reader**, not read from the\n * file: a single XCAF product holding a multi-solid compound gets split into\n * virtual children so each solid becomes its own scene node.\n *\n * The distinction matters to callers that must answer \"is this file really an\n * assembly?\" — e.g. `Assembly.importStep` parity, where upstream rejects a STEP\n * with no assembly structure (`shape_tool.IsAssembly_s` is false for such a\n * product). Without this flag a flat multi-solid STEP looks like an assembly.\n */\n syntheticGroup?: boolean\n /** True if this node is a component reference (leaf part with location). */\n isComponent: boolean\n /** Shape handle with location baked in (for components) or raw shape (for roots).\n * Caller must release this handle. Null for empty assembly labels. */\n shapeHandle: ShapeHandle | null\n /** Deduplication key for prototype shapes (same geometry = same key).\n * Only set for leaf (non-assembly) nodes. */\n prototypeKey: string | null\n /** RGB color [r,g,b] in 0..1 range, or null if no color. */\n color: [number, number, number] | null\n /** Child nodes (recursive). Empty for leaf parts. */\n children: AssemblyPartNode[]\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n\n/**\n * Import a STEP file via XCAF (STEPCAFControl_Reader), preserving the assembly\n * tree, names, colors, and per-component locations.\n *\n * Unlike `importStepToMesh` (which flattens via STEPControl_Reader.OneShape()),\n * this function returns the full assembly tree structure.\n *\n * The caller is responsible for releasing all shapeHandle values in the tree\n * (use `releaseAssemblyTree`).\n *\n * @param stepData - STEP file bytes\n * @returns the root assembly-part nodes\n */\nexport async function importAssemblyFromStep(\n stepData: ArrayBuffer | Uint8Array,\n): Promise<AssemblyPartNode[]> {\n const kernel = (await initOcctWasm()) as unknown as OcctKernel\n const stepText = stepData instanceof Uint8Array\n ? new TextDecoder().decode(stepData)\n : new TextDecoder().decode(new Uint8Array(stepData))\n\n // Parse sub-shape colors from STEP text (fallback for when XCAF label has no color).\n // STEP files from NX/SolidWorks often store colors as STYLED_ITEM on individual\n // solids rather than on XCAF labels, so getLabelInfo returns hasColor=false.\n const solidColors = getSolidColorsOrdered(stepText)\n\n // XCAFDocument.fromSTEP uses STEPCAFControl_Reader with color/name/layer modes\n const doc = kernel.importXCAFFromSTEP(stepText)\n try {\n const rootTags = doc.getRoots()\n const nodes: AssemblyPartNode[] = []\n const cursor = { idx: 0 }\n for (let i = 0; i < rootTags.length; i++) {\n nodes.push(walkLabel(kernel, doc, rootTags[i], `o${i}`, solidColors, cursor))\n }\n // P2 修复(2026-10-06):文档关闭前把全部 leaf shapeHandle 提升为独立副本。\n // getLabelInfo 返回的句柄生命周期绑定 XCAF 文档(doc.close() 释放文档资源),\n // 直接返回会让调用方拿到悬空句柄——BOP(common/cut 等)在 worker 环境内存\n // 复用后访问悬空句柄挂死(node 内存不复用侥幸通过;e2e/worker 必现)。\n // BRepBuilderAPI_Copy 深拷贝独立于文档,release 原句柄后副本生命周期由调用方\n // 掌控(releaseAssemblyTree / 各消费方的 release 路径)。\n for (const n of nodes) liftShapesFromDocument(kernel, n)\n return nodes\n } finally {\n doc.close()\n }\n}\n\n/** 递归把节点树中所有 leaf shapeHandle 从文档句柄提升为独立副本(P2,2026-10-06)。 */\nfunction liftShapesFromDocument(kernel: OcctKernel, node: AssemblyPartNode): void {\n if (node.shapeHandle) {\n const copied = kernel.copy(node.shapeHandle)\n kernel.release(node.shapeHandle)\n node.shapeHandle = copied\n }\n for (const child of node.children) liftShapesFromDocument(kernel, child)\n}\n\n/** Walk-context: tracks the current position in the solidColors array across\n * recursive walkLabel calls so that multi-solid compounds consume colors in order. */\ninterface WalkCtx {\n idx: number\n}\n\nfunction walkLabel(\n kernel: OcctKernel,\n doc: XCAFDocument,\n tag: LabelTag,\n path: string,\n solidColors: ([number, number, number] | null)[],\n ctx: WalkCtx,\n): AssemblyPartNode {\n const info: LabelInfo = doc.getLabelInfo(tag)\n const name = info.name || path\n const color = info.hasColor ? [info.color[0], info.color[1], info.color[2]] as [number, number, number] : null\n\n if (info.isAssembly) {\n const childTags = doc.getChildren(tag)\n const children: AssemblyPartNode[] = []\n for (let i = 0; i < childTags.length; i++) {\n children.push(walkLabel(kernel, doc, childTags[i], `${path}.o${i}`, solidColors, ctx))\n }\n // Assembly nodes have no shape of their own; release if one was returned\n if (info.shapeHandle) kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true,\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n\n // Leaf component — shapeHandle has location baked in (OCCT GetShape semantics)\n // Check if this is a compound with multiple solids — if so, split into\n // separate child nodes so each solid becomes its own mesh/scene-tree node.\n // This handles STEP files that have a single PRODUCT containing a compound\n // of multiple MANIFOLD_SOLID_BREP entities (common in NX/SolidWorks exports).\n if (info.shapeHandle) {\n const solids = kernel.getSubShapes(info.shapeHandle, 'solid')\n if (solids.length > 1) {\n // Multi-solid compound → split into virtual assembly children\n // Each child gets its own solid shapeHandle (already at correct location\n // because getSubShapes extracts from the located compound).\n const children: AssemblyPartNode[] = []\n for (let si = 0; si < solids.length; si++) {\n const childPath = `${path}.s${si}`\n const childName = `${name} [${si + 1}]`\n let childProtoKey: string | null\n try {\n childProtoKey = String(kernel.hashCode(solids[si], 2147483647))\n } catch {\n childProtoKey = null\n }\n // Use STEP-parsed color if label has no color (sub-shape level color)\n const childColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n children.push({\n labelPath: childPath,\n name: childName,\n isAssembly: false,\n isComponent: true,\n shapeHandle: solids[si],\n prototypeKey: childProtoKey,\n color: childColor,\n children: [],\n })\n }\n // Release the compound shape itself — children hold individual solids\n kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true, // mark as assembly so it becomes a group node\n syntheticGroup: true, // ...but it is NOT an assembly in the file\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n // Single solid (or non-solid) — release the extra sub-shape handles\n for (const s of solids) kernel.release(s)\n }\n\n let prototypeKey: string | null = null\n if (info.shapeHandle) {\n // Get un-located shape for dedup (located with identity = remove location)\n try {\n const unlocated = kernel.located(info.shapeHandle, IDENTITY_MATRIX)\n prototypeKey = String(kernel.hashCode(unlocated, 2147483647))\n kernel.release(unlocated)\n } catch {\n // Fallback: use shapeHandle hash directly (less accurate dedup)\n prototypeKey = String(kernel.hashCode(info.shapeHandle, 2147483647))\n }\n }\n\n // For single-solid leaf parts, also try STEP-parsed color as fallback\n const finalColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n\n return {\n labelPath: path,\n name,\n isAssembly: false,\n isComponent: info.isComponent,\n shapeHandle: info.shapeHandle,\n prototypeKey,\n color: finalColor,\n children: [],\n }\n}\n\n/** Recursively release all shapeHandle values in an assembly tree.\n *\n * @param kernel - the OCCT kernel used to release handles\n * @param nodes - the assembly tree nodes to release\n */\nexport function releaseAssemblyTree(kernel: OcctKernel, nodes: AssemblyPartNode[]): void {\n for (const node of nodes) {\n if (node.shapeHandle) kernel.release(node.shapeHandle)\n if (node.children.length > 0) releaseAssemblyTree(kernel, node.children)\n }\n}\n\n/** Collect all leaf (non-assembly) nodes from an assembly tree.\n *\n * @param nodes - the assembly tree nodes to traverse\n * @returns the collected leaf part nodes in depth-first order\n */\nexport function collectLeafParts(nodes: AssemblyPartNode[]): AssemblyPartNode[] {\n const leaves: AssemblyPartNode[] = []\n function walk(node: AssemblyPartNode) {\n if (node.isAssembly) {\n for (const child of node.children) walk(child)\n } else {\n leaves.push(node)\n }\n }\n for (const node of nodes) walk(node)\n return leaves\n}\n\n/**\n * Import BREP text to ShapeHandle + Mesh.\n *\n * @param brepData - BREP file content as a string\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importBrepToMesh(\n brepData: string,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const shape = kernel.fromBREP(brepData)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n/**\n * Mesh → STEP export: rebuild a STEP solid from a triangle mesh.\n * Follows the pattern from occt-wasm/examples/stl2step.mjs.\n *\n * @param positions - vertex array [x0,y0,z0, x1,y1,z1, ...]\n * @param indices - index array [i0,i1,i2, i3,i4,i5, ...]\n * @param tolerance - sewing tolerance in mm (default 0.01)\n * @returns the STEP file content string\n */\nexport function meshesToStep(\n positions: Float32Array,\n indices: Uint32Array,\n tolerance = SEWING_TOLERANCE.as(mm),\n): string {\n const kernel = getKernel()\n const faces: ShapeHandle[] = []\n let solid: ShapeHandle | null = null\n\n try {\n for (let i = 0; i < indices.length; i += 3) {\n const ia = indices[i] * 3\n const ib = indices[i + 1] * 3\n const ic = indices[i + 2] * 3\n const face = kernel.buildTriFace(\n { x: positions[ia], y: positions[ia + 1], z: positions[ia + 2] },\n { x: positions[ib], y: positions[ib + 1], z: positions[ib + 2] },\n { x: positions[ic], y: positions[ic + 1], z: positions[ic + 2] },\n )\n faces.push(face)\n }\n\n solid = kernel.sewAndSolidify(faces, tolerance)\n const unified = kernel.unifySameDomain(solid)\n kernel.release(solid)\n solid = unified\n return kernel.exportStep(solid)\n } finally {\n if (solid !== null) kernel.release(solid)\n for (const f of faces) kernel.release(f)\n }\n}\n\n/**\n * Release a shape handle.\n *\n * @param handle - the shape handle to release\n */\nexport function releaseShape(handle: ShapeHandle): void {\n const k = getOcctKernelSharedState().kernelInstance\n if (k) k.release(handle)\n}\n\n/** 导出类型供外部使用 */\nexport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag }\n"]}
|
|
1
|
+
{"version":3,"file":"occtKernel.js","sourceRoot":"","sources":["../../src/occt-kernel/occtKernel.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,0BAA0B,EAA8B,MAAM,8BAA8B,CAAA;AACrG,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAgB7B,aAAa;AACb,+CAA+C;AAC/C,6CAA6C;AAC7C,EAAE;AACF,iCAAiC;AACjC,4DAA4D;AAC5D,oEAAoE;AACpE,yDAAyD;AACzD,2DAA2D;AAC3D,+CAA+C;AAC/C,4DAA4D;AAC5D,uDAAuD;AACvD,sDAAsD;AACtD,2DAA2D;AAE3D,MAAM,eAAe,GAAG,8BAA8B,CAAA;AACtD,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAWnC;;;;;;;;GAQG;AACH,SAAS,wBAAwB;IAC/B,MAAM,CAAC,GAAG,UAAgD,CAAA;IAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,eAAe,CAAsC,CAAA;IACxE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,YAAY,KAAK,yBAAyB,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CACb,sDAAsD,QAAQ,CAAC,YAAY,cAAc,yBAAyB,EAAE,CACrH,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAA0B;QACrC,YAAY,EAAE,yBAAyB;QACvC,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;KACnB,CAAA;IACD,CAAC,CAAC,eAAe,CAAC,GAAG,OAAO,CAAA;IAC5B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAsC;IACtE,MAAM,CAAC,GAAG,wBAAwB,EAAE,CAAA;IACpC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAA;IACnB,mCAAmC;IACnC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;AACtB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAI,OAA0D,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAE/F,CAAA;IACb,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAA;AACxF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,GAAG,wBAAwB,EAAE,CAAA;IACpC,IAAI,CAAC,CAAC,cAAc;QAAE,OAAO,CAAC,CAAC,cAAc,CAAA;IAC7C,IAAI,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC,WAAW,CAAA;IAEvC,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QAC1B,oCAAoC;QACpC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,CAAC,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;YACzC,OAAO,CAAC,CAAC,cAAc,CAAA;QACzB,CAAC;QAED,uCAAuC;QACvC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC7D,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;YACtD,iEAAiE;YACjE,8DAA8D;YAC9D,2DAA2D;YAC3D,oCAAoC;YACpC,MAAM,SAAS,GAAI,OAA0D,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAE7F,CAAA;YACb,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;YACvF,CAAC;YACD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;YACtC,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAgB,CAAA;YACnG,CAAC,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;YACxD,OAAO,CAAC,CAAC,cAAc,CAAA;QACzB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAA;IACpH,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,CAAC,CAAC,WAAW,CAAA;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,wBAAwB,EAAE,CAAC,cAAc,CAAA;IACnD,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACvF,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAA;AAEtC,+DAA+D;AAC/D,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,wBAAwB,EAAE,CAAA;IACpC,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;QACrB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAClC,CAAC,CAAC,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;IACtB,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAA;AAErC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkC,EAClC,UAAkC;IAElC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAA;IACnC,MAAM,EAAE,GAAG,QAAQ,YAAY,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAgB,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC3J,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAEnC,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAE1H,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACF,cAAc,EAAE,IAAI;KACrB,CAAA;AACH,CAAC;AAqCD,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAE5D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAkC;IAElC,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,EAAE,CAA0B,CAAA;IAC9D,MAAM,QAAQ,GAAG,QAAQ,YAAY,UAAU;QAC7C,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEtD,qFAAqF;IACrF,gFAAgF;IAChF,6EAA6E;IAC7E,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAEnD,+EAA+E;IAC/E,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,MAAM,KAAK,GAAuB,EAAE,CAAA;QACpC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,uDAAuD;QACvD,wDAAwD;QACxD,kDAAkD;QAClD,6CAA6C;QAC7C,sDAAsD;QACtD,8CAA8C;QAC9C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACxD,OAAO,KAAK,CAAA;IACd,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,sBAAsB,CAAC,MAAkB,EAAE,IAAsB;IACxE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;QAAE,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC1E,CAAC;AAQD,SAAS,SAAS,CAChB,MAAkB,EAClB,GAAiB,EACjB,GAAa,EACb,IAAY,EACZ,WAAgD,EAChD,GAAY;IAEZ,MAAM,IAAI,GAAc,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAA;IAE9G,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAuB,EAAE,CAAA;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;QACxF,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,IAAI;YACJ,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,KAAK;YACL,QAAQ;SACT,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,uEAAuE;IACvE,2EAA2E;IAC3E,2EAA2E;IAC3E,8EAA8E;IAC9E,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,8DAA8D;YAC9D,yEAAyE;YACzE,4DAA4D;YAC5D,MAAM,QAAQ,GAAuB,EAAE,CAAA;YACvC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,EAAE,EAAE,CAAA;gBAClC,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,EAAE,GAAG,CAAC,GAAG,CAAA;gBACvC,IAAI,aAA4B,CAAA;gBAChC,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,aAAa,GAAG,IAAI,CAAA;gBACtB,CAAC;gBACD,sEAAsE;gBACtE,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAA;gBAC1D,GAAG,CAAC,GAAG,EAAE,CAAA;gBACT,QAAQ,CAAC,IAAI,CAAC;oBACZ,SAAS,EAAE,SAAS;oBACpB,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,KAAK;oBACjB,WAAW,EAAE,IAAI;oBACjB,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;oBACvB,YAAY,EAAE,aAAa;oBAC3B,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,EAAE;iBACb,CAAC,CAAA;YACJ,CAAC;YACD,sEAAsE;YACtE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAChC,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,IAAI;gBACJ,UAAU,EAAE,IAAI,EAAE,8CAA8C;gBAChE,cAAc,EAAE,IAAI,EAAE,2CAA2C;gBACjE,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,IAAI;gBAClB,KAAK;gBACL,QAAQ;aACT,CAAA;QACH,CAAC;QACD,oEAAoE;QACpE,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,YAAY,GAAkB,IAAI,CAAA;IACtC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,2EAA2E;QAC3E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;YACnE,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAA;YAC7D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAA;IAC1D,GAAG,CAAC,GAAG,EAAE,CAAA;IAET,OAAO;QACL,SAAS,EAAE,IAAI;QACf,IAAI;QACJ,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY;QACZ,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,EAAE;KACb,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB,EAAE,KAAyB;IAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,MAAM,GAAuB,EAAE,CAAA;IACrC,SAAS,IAAI,CAAC,IAAsB;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,UAAkC;IAElC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAEvC,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAE1H,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,CAAC;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACF,cAAc,EAAE,IAAI;KACrB,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAuB,EACvB,OAAoB,EACpB,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAuB,IAAI,CAAA;IAEpC,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACzB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAC9B,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAChE,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAChE,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CACjE,CAAA;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QAED,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACrB,KAAK,GAAG,OAAO,CAAA;QACf,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,MAAM,CAAC,GAAG,wBAAwB,EAAE,CAAC,cAAc,CAAA;IACnD,IAAI,CAAC;QAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAC1B,CAAC","sourcesContent":["/**\n * occt-wasm 封装层 — 替代 occt-import-js\n *\n * 提供 STEP/BREP → Mesh 转换和 Mesh → STEP 导出能力。\n * 利用 occt-wasm 的 meshShape() 获取 faceGroups(面→三角形映射),\n * 利用 wireframe() 获取边折线数据,利用 edgeToFaceMap() 获取边→面关联。\n */\nimport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag } from 'occt-wasm'\n\nimport { getSolidColorsOrdered } from './stepColorParser'\nimport { SEWING_TOLERANCE } from '../tolerance'\nimport { computeEffectiveDeflection, type MeshDeflectionOptions } from '../brep/effective-deflection'\nimport { mm } from '../units'\n\n/** A single tessellated mesh produced by the OCCT kernel. */\nexport interface WasmTessellatedMesh {\n positions: Float32Array\n normals: Float32Array\n indices: Uint32Array\n}\n\n/** Result of importing a shape into the OCCT kernel. */\nexport interface WasmImportResult {\n shapeHandle: ShapeHandle\n meshes: WasmTessellatedMesh[]\n meshWithGroups: Mesh\n}\n\n// F5 设计意图说明:\n// OCCT WASM 内核是环境级单例,不是实例级。在整个浏览器页面/Node 进程中只应\n// 初始化一次;多个 CadRuntime 实例共享同一个 kernel 是正确的行为。\n//\n// 2026-09-26 跨实例共享(随 0.18.2 发布):\n// kernelInstance / initPromise / customInitFn 从\"模块级单例\"提升为挂在\n// globalThis 上的共享状态(与 runtime-state.ts 的 `__FAICAD_FAIJS_RUNTIME__`\n// 同款设计)。原因:CDN 装载的第三方库(sheetmetal/cq-compat/faijs-gears)\n// 在 jsDelivr +esm 打包时把 peer `@faicad/faijs` 外部化为**独立模块实例**\n// (根入口与 /api/ 子路径是不同 URL → 不同 bundle),模块级单例导致:\n// - 库实例的 occt 内核从未初始化 → `occt-wasm kernel not initialized`;\n// - 各实例持有不同内核 → 句柄不互通 → `meshShape: Invalid shape ID`。\n// 挂在 globalThis 后,任一实例 initOcctWasm() 产出的内核全局可见,句柄互通。\n// 构建期去重(external / dedupe)仍是主手段,这里是兜底(同 runtime-state 注释)。\n\nconst OCCT_KERNEL_KEY = '__FAICAD_FAIJS_OCCT_KERNEL__'\nconst OCCT_KERNEL_STATE_VERSION = 1\n\n/** occt 内核共享状态(跨 faijs 模块实例,浏览器/Node 双环境)。 */\ninterface OcctKernelSharedState {\n stateVersion: number\n kernelInstance: OcctKernel | null\n initPromise: Promise<OcctKernel> | null\n /** 浏览器 host 注入的 OCCT 初始化函数 */\n customInitFn: (() => Promise<OcctKernel>) | null\n}\n\n/**\n * 获取 occt 内核共享状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 外部化一份)共享同一份内核状态——否则两份 kernelInstance 导致内核各自\n * 初始化、句柄不互通(几何孤岛)。\n *\n * @returns the shared occt kernel state singleton.\n */\nfunction getOcctKernelSharedState(): OcctKernelSharedState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[OCCT_KERNEL_KEY] as OcctKernelSharedState | undefined\n if (existing) {\n if (existing.stateVersion !== OCCT_KERNEL_STATE_VERSION) {\n throw new Error(\n `[faijs] occt kernel state version mismatch: loaded=${existing.stateVersion}, expected=${OCCT_KERNEL_STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: OcctKernelSharedState = {\n stateVersion: OCCT_KERNEL_STATE_VERSION,\n kernelInstance: null,\n initPromise: null,\n customInitFn: null,\n }\n g[OCCT_KERNEL_KEY] = created\n return created\n}\n\n/**\n * Let the browser host inject the OCCT initialization function.\n *\n * The browser host calls this to register its own init logic (dev/prod/CDN/e2e\n * branches); faijs's initOcctWasm() prefers the injected function. 注入的挂点\n * 写入共享状态——任意 faijs 实例(含 CDN 外部化实例)调 initOcctWasm() 时\n * 都优先使用同一份宿主初始化函数。\n *\n * When nothing is injected, initOcctWasm() reads the WASM from node_modules in\n * a Node environment.\n *\n * @param fn - the initialization function to use, or null to clear\n */\nexport function setOcctWasmInitFn(fn: (() => Promise<OcctKernel>) | null): void {\n const s = getOcctKernelSharedState()\n s.customInitFn = fn\n // 挂点变化后丢弃进行中的初始化(下一次 init 用新挂点重来)。\n s.initPromise = null\n}\n\n/**\n * Resolve the occt-wasm WASM file path (linker-agnostic).\n *\n * Walks the package exports (occt-wasm@5.6.0 exports \"./dist/occt-wasm.wasm\"),\n * independent of cwd / hoisting / pnpm|npm linker (verified pattern C).\n * Replaces the old 4-level `..` path guessing + process.cwd() fallback.\n *\n * Lazy-fetches node:module (Node >= 20.16 process.getBuiltinModule): a static\n * `import { createRequire } from 'node:module'` must not be used — occtKernel is\n * on the browser build's (demo vite build) import chain, and a static node:*\n * import would be externalized and error. This function is only called in the\n * Node branch (initOcctWasm); it never runs in a browser environment.\n *\n * @returns the resolved WASM file path\n */\nexport function resolveOcctWasmPath(): string {\n const builtin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:module') as\n | { createRequire: (filename: string) => { resolve: (id: string) => string } }\n | undefined\n if (!builtin) {\n throw new Error('[faijs] resolveOcctWasmPath requires Node.js (process.getBuiltinModule)')\n }\n return builtin.createRequire(import.meta.url).resolve('occt-wasm/dist/occt-wasm.wasm')\n}\n\n/**\n * Initialize the occt-wasm kernel (singleton).\n *\n * - Node.js test environment: read the WASM file from node_modules, pass an ArrayBuffer.\n * - Development: direct ESM import, Vite resolves node_modules. The WASM file is loaded from public/wasm/occt-wasm.wasm.\n * - Production: dynamically import the whole module + WASM from a CDN.\n *\n * @returns the initialized raw OCCT kernel (native L2 face — NOT BrepEngineApi;\n * the L1 contract face is built separately by createOcctPrimitives()\n * in brep/engine/adapters/occt.ts as an explicit object literal).\n */\nexport async function initOcctWasm(): Promise<OcctKernel> {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) return s.kernelInstance\n if (s.initPromise) return s.initPromise\n\n s.initPromise = (async () => {\n // 优先使用浏览器 host 注入的初始化函数(共享挂点,跨实例生效)\n if (s.customInitFn) {\n s.kernelInstance = await s.customInitFn()\n return s.kernelInstance\n }\n\n // Node.js 环境:从 node_modules 读取 WASM 文件\n if (typeof process !== 'undefined' && process.versions?.node) {\n const { OcctKernel: Ctor } = await import('occt-wasm')\n // 与 resolveOcctWasmPath 同款:经 process.getBuiltinModule 取 node:fs,\n // 不用 `await import('node:fs')`——后者会被 vite 打包器静态分析 externalize\n // 并在浏览器构建时报 \"node:fs has been externalized\" warning(本分支运行时\n // 不会在浏览器执行,但打包器仍会对动态 import 字符串告警)。\n const fsBuiltin = (process as { getBuiltinModule?: (id: string) => unknown }).getBuiltinModule?.('node:fs') as\n | { readFileSync: (p: string) => Buffer }\n | undefined\n if (!fsBuiltin) {\n throw new Error('[faijs] occt-wasm init requires Node.js (process.getBuiltinModule)')\n }\n const wasmPath = resolveOcctWasmPath()\n const buf = fsBuiltin.readFileSync(wasmPath)\n const wasmBinary = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer\n s.kernelInstance = await Ctor.init({ wasm: wasmBinary })\n return s.kernelInstance\n }\n\n throw new Error('initOcctWasm: no init function set and not in Node environment. Call setOcctWasmInitFn() first.')\n })()\n\n return s.initPromise\n}\n\n/**\n * Get the initialized kernel instance (initOcctWasm must be called first).\n *\n * @returns the initialized OCCT kernel\n */\nexport function getKernel(): OcctKernel {\n const k = getOcctKernelSharedState().kernelInstance\n if (!k) throw new Error('occt-wasm kernel not initialized — call initOcctWasm() first')\n return k\n}\n\n/**\n * Native-face alias for getKernel() (plan D3 ②): symmetric with\n * getBrepKitKernel() on the brepkit side. Platform-specific code uses this\n * name; the original getKernel() stays for existing host code.\n */\nexport const getOcctKernel = getKernel\n\n/** Release the kernel instance (call when the app unloads). */\nexport function disposeOcctWasm(): void {\n const s = getOcctKernelSharedState()\n if (s.kernelInstance) {\n s.kernelInstance[Symbol.dispose]()\n s.kernelInstance = null\n s.initPromise = null\n }\n}\n\n/** Options controlling mesh deflection during tessellation. */\nexport type { MeshDeflectionOptions } from '../brep/effective-deflection'\n\n/**\n * Compute the effective linear deflection, applying relative scaling\n * exactly as OCCT does internally: `linDefl * bboxDiagonal` when relative=true.\n *\n * 实现已移到引擎中立的 `brep/effective-deflection.ts`(函数体只用\n * `getBoundingBox`,与 OCCT 无关)——此处 re-export 保持既有导入面零迁移。\n * 本模块内部仍要用它,故 import 后再 re-export(纯 re-export 不产生本地绑定)。\n *\n * @param kernel - the OCCT kernel\n * @param shape - the shape whose bounding box drives relative scaling\n * @param options - the requested deflection options\n * @returns the effective linear and angular deflection values\n */\nexport { computeEffectiveDeflection }\n\n/**\n * Import a STEP file to ShapeHandle + Mesh (including face groups).\n *\n * Uses meshShape() rather than tessellate(), so face-group data is available\n * (each face's triangle range [triStart, triCount, faceHash]).\n *\n * @param stepData - STEP file bytes\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importStepToMesh(\n stepData: ArrayBuffer | Uint8Array,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const ab = stepData instanceof Uint8Array ? stepData.buffer.slice(stepData.byteOffset, stepData.byteOffset + stepData.byteLength) as ArrayBuffer : stepData\n const shape = kernel.importStep(ab)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n// ── Assembly (XCAF) support ──\n\n/** A node in the XCAF assembly tree (mirrors the STEP_T occurrence concept). */\nexport interface AssemblyPartNode {\n /** Dotted path: 'o0', 'o0.o1', 'o0.o1.o2' — matches STEP_T occurrence path. */\n labelPath: string\n /** XCAF label name (falls back to labelPath if empty). */\n name: string\n /** True if this node is an assembly (has child components). */\n isAssembly: boolean\n /**\n * True when `isAssembly` was **synthesised by this reader**, not read from the\n * file: a single XCAF product holding a multi-solid compound gets split into\n * virtual children so each solid becomes its own scene node.\n *\n * The distinction matters to callers that must answer \"is this file really an\n * assembly?\" — e.g. `Assembly.importStep` parity, where upstream rejects a STEP\n * with no assembly structure (`shape_tool.IsAssembly_s` is false for such a\n * product). Without this flag a flat multi-solid STEP looks like an assembly.\n */\n syntheticGroup?: boolean\n /** True if this node is a component reference (leaf part with location). */\n isComponent: boolean\n /** Shape handle with location baked in (for components) or raw shape (for roots).\n * Caller must release this handle. Null for empty assembly labels. */\n shapeHandle: ShapeHandle | null\n /** Deduplication key for prototype shapes (same geometry = same key).\n * Only set for leaf (non-assembly) nodes. */\n prototypeKey: string | null\n /** RGB color [r,g,b] in 0..1 range, or null if no color. */\n color: [number, number, number] | null\n /** Child nodes (recursive). Empty for leaf parts. */\n children: AssemblyPartNode[]\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n\n/**\n * Import a STEP file via XCAF (STEPCAFControl_Reader), preserving the assembly\n * tree, names, colors, and per-component locations.\n *\n * Unlike `importStepToMesh` (which flattens via STEPControl_Reader.OneShape()),\n * this function returns the full assembly tree structure.\n *\n * The caller is responsible for releasing all shapeHandle values in the tree\n * (use `releaseAssemblyTree`).\n *\n * @param stepData - STEP file bytes\n * @returns the root assembly-part nodes\n */\nexport async function importAssemblyFromStep(\n stepData: ArrayBuffer | Uint8Array,\n): Promise<AssemblyPartNode[]> {\n const kernel = (await initOcctWasm()) as unknown as OcctKernel\n const stepText = stepData instanceof Uint8Array\n ? new TextDecoder().decode(stepData)\n : new TextDecoder().decode(new Uint8Array(stepData))\n\n // Parse sub-shape colors from STEP text (fallback for when XCAF label has no color).\n // STEP files from NX/SolidWorks often store colors as STYLED_ITEM on individual\n // solids rather than on XCAF labels, so getLabelInfo returns hasColor=false.\n const solidColors = getSolidColorsOrdered(stepText)\n\n // XCAFDocument.fromSTEP uses STEPCAFControl_Reader with color/name/layer modes\n const doc = kernel.importXCAFFromSTEP(stepText)\n try {\n const rootTags = doc.getRoots()\n const nodes: AssemblyPartNode[] = []\n const cursor = { idx: 0 }\n for (let i = 0; i < rootTags.length; i++) {\n nodes.push(walkLabel(kernel, doc, rootTags[i], `o${i}`, solidColors, cursor))\n }\n // P2 修复(2026-10-06):文档关闭前把全部 leaf shapeHandle 提升为独立副本。\n // getLabelInfo 返回的句柄生命周期绑定 XCAF 文档(doc.close() 释放文档资源),\n // 直接返回会让调用方拿到悬空句柄——BOP(common/cut 等)在 worker 环境内存\n // 复用后访问悬空句柄挂死(node 内存不复用侥幸通过;e2e/worker 必现)。\n // BRepBuilderAPI_Copy 深拷贝独立于文档,release 原句柄后副本生命周期由调用方\n // 掌控(releaseAssemblyTree / 各消费方的 release 路径)。\n for (const n of nodes) liftShapesFromDocument(kernel, n)\n return nodes\n } finally {\n doc.close()\n }\n}\n\n/** 递归把节点树中所有 leaf shapeHandle 从文档句柄提升为独立副本(P2,2026-10-06)。 */\nfunction liftShapesFromDocument(kernel: OcctKernel, node: AssemblyPartNode): void {\n if (node.shapeHandle) {\n const copied = kernel.copy(node.shapeHandle)\n kernel.release(node.shapeHandle)\n node.shapeHandle = copied\n }\n for (const child of node.children) liftShapesFromDocument(kernel, child)\n}\n\n/** Walk-context: tracks the current position in the solidColors array across\n * recursive walkLabel calls so that multi-solid compounds consume colors in order. */\ninterface WalkCtx {\n idx: number\n}\n\nfunction walkLabel(\n kernel: OcctKernel,\n doc: XCAFDocument,\n tag: LabelTag,\n path: string,\n solidColors: ([number, number, number] | null)[],\n ctx: WalkCtx,\n): AssemblyPartNode {\n const info: LabelInfo = doc.getLabelInfo(tag)\n const name = info.name || path\n const color = info.hasColor ? [info.color[0], info.color[1], info.color[2]] as [number, number, number] : null\n\n if (info.isAssembly) {\n const childTags = doc.getChildren(tag)\n const children: AssemblyPartNode[] = []\n for (let i = 0; i < childTags.length; i++) {\n children.push(walkLabel(kernel, doc, childTags[i], `${path}.o${i}`, solidColors, ctx))\n }\n // Assembly nodes have no shape of their own; release if one was returned\n if (info.shapeHandle) kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true,\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n\n // Leaf component — shapeHandle has location baked in (OCCT GetShape semantics)\n // Check if this is a compound with multiple solids — if so, split into\n // separate child nodes so each solid becomes its own mesh/scene-tree node.\n // This handles STEP files that have a single PRODUCT containing a compound\n // of multiple MANIFOLD_SOLID_BREP entities (common in NX/SolidWorks exports).\n if (info.shapeHandle) {\n const solids = kernel.getSubShapes(info.shapeHandle, 'solid')\n if (solids.length > 1) {\n // Multi-solid compound → split into virtual assembly children\n // Each child gets its own solid shapeHandle (already at correct location\n // because getSubShapes extracts from the located compound).\n const children: AssemblyPartNode[] = []\n for (let si = 0; si < solids.length; si++) {\n const childPath = `${path}.s${si}`\n const childName = `${name} [${si + 1}]`\n let childProtoKey: string | null\n try {\n childProtoKey = String(kernel.hashCode(solids[si], 2147483647))\n } catch {\n childProtoKey = null\n }\n // Use STEP-parsed color if label has no color (sub-shape level color)\n const childColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n children.push({\n labelPath: childPath,\n name: childName,\n isAssembly: false,\n isComponent: true,\n shapeHandle: solids[si],\n prototypeKey: childProtoKey,\n color: childColor,\n children: [],\n })\n }\n // Release the compound shape itself — children hold individual solids\n kernel.release(info.shapeHandle)\n return {\n labelPath: path,\n name,\n isAssembly: true, // mark as assembly so it becomes a group node\n syntheticGroup: true, // ...but it is NOT an assembly in the file\n isComponent: false,\n shapeHandle: null,\n prototypeKey: null,\n color,\n children,\n }\n }\n // Single solid (or non-solid) — release the extra sub-shape handles\n for (const s of solids) kernel.release(s)\n }\n\n let prototypeKey: string | null = null\n if (info.shapeHandle) {\n // Get un-located shape for dedup (located with identity = remove location)\n try {\n const unlocated = kernel.located(info.shapeHandle, IDENTITY_MATRIX)\n prototypeKey = String(kernel.hashCode(unlocated, 2147483647))\n kernel.release(unlocated)\n } catch {\n // Fallback: use shapeHandle hash directly (less accurate dedup)\n prototypeKey = String(kernel.hashCode(info.shapeHandle, 2147483647))\n }\n }\n\n // For single-solid leaf parts, also try STEP-parsed color as fallback\n const finalColor = color ?? (solidColors[ctx.idx] ?? null)\n ctx.idx++\n\n return {\n labelPath: path,\n name,\n isAssembly: false,\n isComponent: info.isComponent,\n shapeHandle: info.shapeHandle,\n prototypeKey,\n color: finalColor,\n children: [],\n }\n}\n\n/** Recursively release all shapeHandle values in an assembly tree.\n *\n * @param kernel - the OCCT kernel used to release handles\n * @param nodes - the assembly tree nodes to release\n */\nexport function releaseAssemblyTree(kernel: OcctKernel, nodes: AssemblyPartNode[]): void {\n for (const node of nodes) {\n if (node.shapeHandle) kernel.release(node.shapeHandle)\n if (node.children.length > 0) releaseAssemblyTree(kernel, node.children)\n }\n}\n\n/** Collect all leaf (non-assembly) nodes from an assembly tree.\n *\n * @param nodes - the assembly tree nodes to traverse\n * @returns the collected leaf part nodes in depth-first order\n */\nexport function collectLeafParts(nodes: AssemblyPartNode[]): AssemblyPartNode[] {\n const leaves: AssemblyPartNode[] = []\n function walk(node: AssemblyPartNode) {\n if (node.isAssembly) {\n for (const child of node.children) walk(child)\n } else {\n leaves.push(node)\n }\n }\n for (const node of nodes) walk(node)\n return leaves\n}\n\n/**\n * Import BREP text to ShapeHandle + Mesh.\n *\n * @param brepData - BREP file content as a string\n * @param deflection - optional mesh deflection options\n * @returns the import result with shape handle and meshes\n */\nexport async function importBrepToMesh(\n brepData: string,\n deflection?: MeshDeflectionOptions,\n): Promise<WasmImportResult> {\n const kernel = await initOcctWasm()\n const shape = kernel.fromBREP(brepData)\n\n const eff = computeEffectiveDeflection(kernel, shape, deflection)\n const mesh = kernel.meshShape(shape, { linearDeflection: eff.linearDeflection, angularDeflection: eff.angularDeflection })\n\n return {\n shapeHandle: shape,\n meshes: [{\n positions: mesh.positions,\n normals: mesh.normals,\n indices: mesh.indices,\n }],\n meshWithGroups: mesh,\n }\n}\n\n/**\n * Mesh → STEP export: rebuild a STEP solid from a triangle mesh.\n * Follows the pattern from occt-wasm/examples/stl2step.mjs.\n *\n * @param positions - vertex array [x0,y0,z0, x1,y1,z1, ...]\n * @param indices - index array [i0,i1,i2, i3,i4,i5, ...]\n * @param tolerance - sewing tolerance in mm (default 0.01)\n * @returns the STEP file content string\n */\nexport function meshesToStep(\n positions: Float32Array,\n indices: Uint32Array,\n tolerance = SEWING_TOLERANCE.as(mm),\n): string {\n const kernel = getKernel()\n const faces: ShapeHandle[] = []\n let solid: ShapeHandle | null = null\n\n try {\n for (let i = 0; i < indices.length; i += 3) {\n const ia = indices[i] * 3\n const ib = indices[i + 1] * 3\n const ic = indices[i + 2] * 3\n const face = kernel.buildTriFace(\n { x: positions[ia], y: positions[ia + 1], z: positions[ia + 2] },\n { x: positions[ib], y: positions[ib + 1], z: positions[ib + 2] },\n { x: positions[ic], y: positions[ic + 1], z: positions[ic + 2] },\n )\n faces.push(face)\n }\n\n solid = kernel.sewAndSolidify(faces, tolerance)\n const unified = kernel.unifySameDomain(solid)\n kernel.release(solid)\n solid = unified\n return kernel.exportStep(solid)\n } finally {\n if (solid !== null) kernel.release(solid)\n for (const f of faces) kernel.release(f)\n }\n}\n\n/**\n * Release a shape handle.\n *\n * @param handle - the shape handle to release\n */\nexport function releaseShape(handle: ShapeHandle): void {\n const k = getOcctKernelSharedState().kernelInstance\n if (k) k.release(handle)\n}\n\n/** 导出类型供外部使用 */\nexport type { OcctKernel, ShapeHandle, Mesh, EdgeData, SurfaceKind, CurveKind, BoundingBox, Vec3, XCAFDocument, LabelInfo, LabelTag }\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brep-primitives.d.ts","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACX,KAAK,EACN,MAAM,eAAe,CAAA;AAItB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;IAC7C,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;CACrB,CAEA;
|
|
1
|
+
{"version":3,"file":"brep-primitives.d.ts","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACX,KAAK,EACN,MAAM,eAAe,CAAA;AAItB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;IAC7C,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;CACrB,CAEA;AAsLD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,KAAK,EAAE,UAAU,CAAA;IACjB,kCAAkC;IAClC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAA;CACvC;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAA;AA6BlG;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,EACtC,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC,qBAAqB,CAkCvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,KAAK,GACX,qBAAqB,CAIvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAA;CAAE,CAQ9C"}
|
|
@@ -48,23 +48,50 @@ function applyCenter(kernel, solid, center) {
|
|
|
48
48
|
* 用 OCCT 直接构造一个长方体 Solid(原 brepjs `box(width, depth, height,
|
|
49
49
|
* {at?, centered?})` 契约,§4.1 A 决策;与 mesh 路径逐点对齐)。
|
|
50
50
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
51
|
+
* 锚点(2026-10-16 与 cylinder/cone 统一为 BASE 语义):
|
|
52
|
+
* - 默认(无 at、无 centered):角点在原点,底面贴地(z∈[0,h]);
|
|
53
|
+
* - `centered:true`(无 at):居中到原点;
|
|
54
|
+
* - `at`:底面中心落在 at(BASE 语义,与 cylinder/cone 一致);
|
|
55
|
+
* 与 `centered:true` 同给时以 at 为中心。
|
|
56
|
+
* 等价写法:`box(w, d, h)` ≡ `box(w, d, h, { at: [w/2, d/2, 0] })`。
|
|
54
57
|
*/
|
|
55
58
|
function cubeToCadSolid(kernel, params) {
|
|
56
59
|
const w = params.width;
|
|
57
60
|
const d = params.depth;
|
|
58
61
|
const h = params.height;
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
// 底面中心的目标位置(BASE 锚点):
|
|
63
|
+
// - at 给定:at(at + centered 时再下移 h/2,使 at 成为中心);
|
|
64
|
+
// - 仅 centered:原点居中 → 底面中心 (0, 0, -h/2);
|
|
65
|
+
// - 默认:角点在原点 → 底面中心 (w/2, d/2, 0)。
|
|
66
|
+
let baseX;
|
|
67
|
+
let baseY;
|
|
68
|
+
let baseZ;
|
|
69
|
+
if (params.at !== undefined) {
|
|
70
|
+
baseX = params.at[0];
|
|
71
|
+
baseY = params.at[1];
|
|
72
|
+
baseZ = params.at[2] - (params.centered === true ? h / 2 : 0);
|
|
73
|
+
}
|
|
74
|
+
else if (params.centered === true) {
|
|
75
|
+
baseX = 0;
|
|
76
|
+
baseY = 0;
|
|
77
|
+
baseZ = -h / 2;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
baseX = w / 2;
|
|
81
|
+
baseY = d / 2;
|
|
82
|
+
baseZ = 0;
|
|
83
|
+
}
|
|
84
|
+
// 角点实体 (0,0,0)-(w,d,h),平移到「底面中心落在 (baseX, baseY, baseZ)」。
|
|
85
|
+
const solid = kernel.makeBoxFromCorners({ x: 0, y: 0, z: 0 }, { x: w, y: d, z: h });
|
|
86
|
+
const dx = baseX - w / 2;
|
|
87
|
+
const dy = baseY - d / 2;
|
|
88
|
+
const dz = baseZ;
|
|
89
|
+
if (dx !== 0 || dy !== 0 || dz !== 0) {
|
|
90
|
+
const translated = kernel.translate(solid, dx, dy, dz);
|
|
91
|
+
kernel.release(solid);
|
|
92
|
+
return translated;
|
|
93
|
+
}
|
|
94
|
+
return solid;
|
|
68
95
|
}
|
|
69
96
|
/**
|
|
70
97
|
* 用 OCCT 直接构造一个球体 Solid。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brep-primitives.js","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Primitive → CAD 实体转换。\n *\n * @platform occt — 本文件 import occt-kernel(meshReconstruct):primitive 直接\n * 构造路径绑定 occt 构造函数(makeBox/makeSphere/...),平台原生面调用;\n * 守卫 R1 豁免、R2 无 defineOp 不适用。\n *\n * 将本项目的各种 primitive(cube, sphere, cylinder, cone, wedge, screw)\n * 转换为 OCCT CAD 实体(Solid),并支持导出为 BREP 格式的 STEP 文件。\n *\n * 两条路径:\n *\n * 1. **直接构造路径**(primitive path):\n * 对于有 OCCT 直接对应的基本体(cube, sphere, cylinder, cone, wedge),\n * 直接调用 OCCT 构造函数(makeBox, makeSphere, makeCylinder, makeCone)\n * 或用 extrude 从 2D 轮廓构造(wedge)。\n * 产出精确 BREP——平面是 PLANE,圆柱面是 CYLINDRICAL_SURFACE,等。\n *\n * 2. **Mesh 重建路径**(mesh path):\n * 对于无 OCCT 直接对应的复杂形状(screw, text),从 mesh Shape\n * 提取三角网格,经 meshReconstruct.ts 的多阶段愈合管线重建为 Solid。\n * 产出仍为 BREP,但曲面由多个小三角平面近似(faceted)。在本项目里,默认brep模型不包含此类近似的到的模型。\n *\n * 坐标系:本项目 primitive 为 Z-up(经过 ROT_Y_TO_Z 旋转),\n * OCCT 默认也是 Z-up,因此直接对应,无需额外轴转换。\n */\n\n\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { PrimitiveType } from './types'\nimport { reconstructSolidFromMesh } from '../occt-kernel/meshReconstruct'\nimport type {\n BoxParams,\n SphereParams,\n CylinderParams,\n ConeParams,\n WedgeParams,\n Shape,\n} from '../mesh/types'\n\n// ─── 辅助:从 Shape 提取网格数据 ───\n\n/**\n * Extract positions + indices from a Shape for the mesh reconstruction path.\n *\n * @param shape - the source Shape.\n * @returns the extracted positions and indices arrays.\n */\nexport function extractMeshData(shape: Shape): {\n positions: Float32Array\n indices: Uint32Array\n} {\n return { positions: new Float32Array(shape.positions), indices: new Uint32Array(shape.indices) }\n}\n\n// ─── 直接构造路径 ───\n\n/** 应用 center 偏移到 OCCT solid(如果有 center 参数)。 */\nfunction applyCenter(kernel: BrepEngineApi, solid: BrepHandle, center?: [number, number, number]): BrepHandle {\n if (!center) return solid\n const translated = kernel.translate(solid, center[0], center[1], center[2])\n kernel.release(solid)\n return translated\n}\n\n/**\n * 用 OCCT 直接构造一个长方体 Solid(原 brepjs `box(width, depth, height,\n * {at?, centered?})` 契约,§4.1 A 决策;与 mesh 路径逐点对齐)。\n *\n * 几何语义与旧 `primitiveFns.box` 完全一致:\n * 默认 min 角点在原点;`centered:true`(无 at 时)居中到原点;`at` 为中心\n * 语义且优先于 `centered`。\n */\nfunction cubeToCadSolid(kernel: BrepEngineApi, params: BoxParams): BrepHandle {\n const w = params.width\n const d = params.depth\n const h = params.height\n // 原 brepjs box: center = at ?? (centered ? [0,0,0] : undefined);未给 center →\n // 构造角点实体不平移(这里统一中心构造 + 平移量,等价)。\n const center = params.at !== undefined\n ? params.at\n : params.centered\n ? ([0, 0, 0] as [number, number, number])\n : ([w / 2, d / 2, h / 2] as [number, number, number])\n const solid = kernel.makeBoxFromCorners(\n { x: -w / 2, y: -d / 2, z: -h / 2 },\n { x: w / 2, y: d / 2, z: h / 2 },\n )\n return applyCenter(kernel, solid, center)\n}\n\n/**\n * 用 OCCT 直接构造一个球体 Solid。\n *\n * 接收完整 SphereParams:radius 是球体半径,segments 不影响 BREP(仅影响 mesh 离散化)。\n */\nfunction sphereToCadSolid(kernel: BrepEngineApi, params: SphereParams): BrepHandle {\n const solid = kernel.makeSphere(params.radius)\n return applyCenter(kernel, solid, params.center)\n}\n\n/**\n * 用 OCCT 直接构造一个圆柱体 Solid(原 brepjs `cylinder(radius, height, {\n * at, centered })` 契约,§4.3 A 决策;与 mesh 路径逐点对齐)。\n *\n * 锚点同旧 `primitiveFns.cylinder`:`at` 是底面轴心(BASE)语义(默认\n * [0,0,0]),OCCT makeCylinder 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`\n * 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n */\nfunction cylinderToCadSolid(kernel: BrepEngineApi, params: CylinderParams): BrepHandle {\n const solid = kernel.makeCylinder(params.radius, params.height)\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n if (baseX !== 0 || baseY !== 0 || baseZ !== 0) {\n const translated = kernel.translate(solid, baseX, baseY, baseZ)\n kernel.release(solid)\n return translated\n }\n return solid\n}\n\n/**\n * 用 OCCT 直接构造一个圆锥体 Solid(原 brepjs `cone(bottomRadius, topRadius,\n * height, { at, centered })` 契约,§4.1 P 决策;与 mesh 路径逐点对齐)。\n *\n * 锚点同旧 `primitiveFns.cone`:`at` 是底面轴心(BASE)语义(默认\n * [0,0,0]),OCCT makeCone 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`\n * 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n */\nfunction coneToCadSolid(kernel: BrepEngineApi, params: ConeParams): BrepHandle {\n const solid = kernel.makeCone(params.radiusBottom, params.radiusTop, params.height)\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n if (baseX !== 0 || baseY !== 0 || baseZ !== 0) {\n const translated = kernel.translate(solid, baseX, baseY, baseZ)\n kernel.release(solid)\n return translated\n }\n return solid\n}\n\n/**\n * 用 OCCT 从 2D 梯形轮廓拉伸构造楔形体 Solid。\n *\n * 支持全参数(width/height/angle/length),向后兼容旧式 { size: number }。\n *\n * 参数(来自 WedgePanel.buildWedgeGeometry):\n * - 底边宽度 width(沿 Y)\n * - 高度 height(沿 Z)\n * - 底边与斜边的夹角 angleDeg\n * - 拉伸总长 length(沿 X,从 -length/2 到 +length/2)\n *\n * 构造步骤:\n * 1. 在 YZ 平面创建梯形 wire(4 个顶点,4 条边)\n * 2. 从 wire 创建 planar face\n * 3. 沿 X 轴拉伸\n * 4. 平移使 X 方向居中\n */\nfunction wedgeToCadSolid(kernel: BrepEngineApi, params: WedgeParams): BrepHandle {\n const width = params.width // 底边长度(沿 Y)\n const height = params.height // 梯形高(沿 Z)\n const angleDeg = params.angle // 底边与斜边的夹角\n const length = params.length // 拉伸总长(沿 X)\n const angleRad = (angleDeg * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n\n // 上边半宽 = 底边半宽 - 高 / tan(角度)\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n\n // 在 YZ 平面创建梯形 wire(X=0)。顶边塌缩(halfTopWidth≈0,斜坡已在宽度内到顶)\n // 时退化为三角棱柱——不能再保留零长顶边(两个重合顶点会让 OCCT makeLineEdge\n // 报 CONSTRUCTION_FAILED,即 P23 实测的 wedge 退化参数失败)。\n const edges: BrepHandle[] = []\n if (halfTopWidth > 1e-12) {\n // 梯形:底边 (±hw,0) + 上边 (±halfTopWidth,height)\n edges.push(\n kernel.makeLineEdge({ x: 0, y: -hw, z: 0 }, { x: 0, y: hw, z: 0 }),\n kernel.makeLineEdge({ x: 0, y: hw, z: 0 }, { x: 0, y: halfTopWidth, z: height }),\n kernel.makeLineEdge({ x: 0, y: halfTopWidth, z: height }, { x: 0, y: -halfTopWidth, z: height }),\n kernel.makeLineEdge({ x: 0, y: -halfTopWidth, z: height }, { x: 0, y: -hw, z: 0 }),\n )\n } else {\n // 三角棱柱:(−hw,0) → (hw,0) → (0,height)\n edges.push(\n kernel.makeLineEdge({ x: 0, y: -hw, z: 0 }, { x: 0, y: hw, z: 0 }),\n kernel.makeLineEdge({ x: 0, y: hw, z: 0 }, { x: 0, y: 0, z: height }),\n kernel.makeLineEdge({ x: 0, y: 0, z: height }, { x: 0, y: -hw, z: 0 }),\n )\n }\n\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 2 * halfExtrude, 0, 0)\n // 平移使 X 方向居中\n const centered = kernel.translate(extruded, -halfExtrude, 0, 0)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return applyCenter(kernel, centered, params.center)\n}\n\n// ─── 统一入口 ───\n\n/**\n * Conversion result: the CAD solid handle and the construction path used.\n */\nexport interface PrimitiveToBrepResult {\n /** CAD solid handle (the caller is responsible for releasing it). */\n solid: BrepHandle\n /** The construction path used. */\n path: 'primitive' | 'mesh'\n /** The primitive type. */\n type: PrimitiveType | 'screw' | 'text'\n}\n\n/** Union type of the primitive parameter objects. */\nexport type PrimitiveParams = BoxParams | SphereParams | CylinderParams | ConeParams | WedgeParams\n\n/**\n * 将旧的 size 数字转换为对应类型的完整 params(向后兼容)。\n *\n * - cube: { size: size }\n * - wedge: { width: size, height: size/2, angle: 60, length: 50 }\n * - sphere: { radius: size / 2 }\n * - cylinder: { radius: size / 2, height: size }\n * - cone: { radiusBottom: size / 2, radiusTop: 0, height: size }\n */\nfunction sizeToParams(type: PrimitiveType | 'screw' | 'text', size: number): PrimitiveParams {\n switch (type) {\n case 'cube':\n case 'box':\n return { width: size, depth: size, height: size }\n case 'sphere':\n return { radius: size / 2 }\n case 'cylinder':\n return { radius: size / 2, height: size }\n case 'cone':\n return { radiusBottom: size / 2, radiusTop: 0, height: size }\n case 'wedge':\n return { width: size, height: size / 2, angle: 60, length: 50 }\n default:\n throw new Error(`sizeToParams does not support primitive type \"${type}\" (use geometry data)`)\n }\n}\n\n/**\n * Convert a project primitive to an OCCT CAD solid.\n *\n * - cube, sphere, cylinder, cone, wedge: constructed directly with OCCT (exact BREP)\n * - screw, text: use the mesh reconstruction path (faceted BREP)\n *\n * @param kernel - the initialized OCCT kernel.\n * @param type - the primitive type.\n * @param params - a full parameter object (BoxParams etc.), or a size number (backwards-compatible, default 20mm).\n * @returns the CAD solid plus path information.\n */\nexport function primitiveToBrepSolid(\n kernel: BrepEngineApi,\n type: PrimitiveType | 'screw' | 'text',\n params?: PrimitiveParams | number,\n): PrimitiveToBrepResult {\n const fullParams = typeof params === 'number' || params === undefined\n ? sizeToParams(type, params ?? 20)\n : params\n\n switch (type) {\n case 'cube':\n case 'box':\n return { solid: cubeToCadSolid(kernel, fullParams as BoxParams), path: 'primitive', type }\n\n case 'sphere':\n return { solid: sphereToCadSolid(kernel, fullParams as SphereParams), path: 'primitive', type }\n\n case 'cylinder':\n return { solid: cylinderToCadSolid(kernel, fullParams as CylinderParams), path: 'primitive', type }\n\n case 'cone':\n return { solid: coneToCadSolid(kernel, fullParams as ConeParams), path: 'primitive', type }\n\n case 'wedge':\n return { solid: wedgeToCadSolid(kernel, fullParams as WedgeParams), path: 'primitive', type }\n\n case 'screw':\n case 'text': {\n // Mesh 重建路径:从 THREE.js 几何体提取网格数据\n // 对于 screw/text,调用方应使用 geometryToBrepSolid\n throw new Error(\n `${type} requires geometry data — use geometryToBrepSolid() instead`,\n )\n }\n\n default:\n throw new Error(`Unsupported primitive type: ${type}`)\n }\n}\n\n/**\n * Create a CAD solid from a Shape via the mesh reconstruction path.\n *\n * Suitable for complex shapes that cannot be constructed directly\n * (screw, text, SVG extrusion, etc.).\n *\n * @param kernel - the initialized OCCT kernel.\n * @param shape - the mesh Shape.\n * @returns the CAD solid plus path information.\n */\nexport function geometryToBrepSolid(\n kernel: BrepEngineApi,\n shape: Shape,\n): PrimitiveToBrepResult {\n const { positions, indices } = extractMeshData(shape)\n const solid = reconstructSolidFromMesh(kernel, positions, indices)\n return { solid, path: 'mesh', type: 'screw' }\n}\n\n/**\n * Export a CAD solid as a BREP-format STEP string.\n *\n * OCCT's exportStep produces a standard ISO-10303-21 STEP file using\n * ADVANCED_FACE with exact surfaces (PLANE, CYLINDRICAL_SURFACE, etc.)\n * rather than a faceted representation (POLYGONAL_FACE).\n *\n * @param kernel - the initialized OCCT kernel.\n * @param solid - the CAD solid handle.\n * @returns the STEP file content as a string.\n */\nexport function brepSolidToStep(kernel: BrepEngineApi, solid: BrepHandle): string {\n return kernel.exportStep(solid)\n}\n\n/**\n * Convenience method: convert a primitive directly to a STEP string.\n *\n * Internally calls primitiveToBrepSolid + brepSolidToStep and manages the\n * handle lifecycle automatically.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param type - the primitive type.\n * @param params - a full parameter object, or a size number (backwards-compatible, default 20mm).\n * @returns the STEP file content string plus the path used.\n */\nexport function primitiveToBrepStep(\n kernel: BrepEngineApi,\n type: PrimitiveType,\n params?: PrimitiveParams | number,\n): { step: string; path: 'primitive' | 'mesh' } {\n const result = primitiveToBrepSolid(kernel, type, params)\n try {\n const step = brepSolidToStep(kernel, result.solid)\n return { step, path: result.path }\n } finally {\n kernel.release(result.solid)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"brep-primitives.js","sourceRoot":"","sources":["../../src/primitives/brep-primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Primitive → CAD 实体转换。\n *\n * @platform occt — 本文件 import occt-kernel(meshReconstruct):primitive 直接\n * 构造路径绑定 occt 构造函数(makeBox/makeSphere/...),平台原生面调用;\n * 守卫 R1 豁免、R2 无 defineOp 不适用。\n *\n * 将本项目的各种 primitive(cube, sphere, cylinder, cone, wedge, screw)\n * 转换为 OCCT CAD 实体(Solid),并支持导出为 BREP 格式的 STEP 文件。\n *\n * 两条路径:\n *\n * 1. **直接构造路径**(primitive path):\n * 对于有 OCCT 直接对应的基本体(cube, sphere, cylinder, cone, wedge),\n * 直接调用 OCCT 构造函数(makeBox, makeSphere, makeCylinder, makeCone)\n * 或用 extrude 从 2D 轮廓构造(wedge)。\n * 产出精确 BREP——平面是 PLANE,圆柱面是 CYLINDRICAL_SURFACE,等。\n *\n * 2. **Mesh 重建路径**(mesh path):\n * 对于无 OCCT 直接对应的复杂形状(screw, text),从 mesh Shape\n * 提取三角网格,经 meshReconstruct.ts 的多阶段愈合管线重建为 Solid。\n * 产出仍为 BREP,但曲面由多个小三角平面近似(faceted)。在本项目里,默认brep模型不包含此类近似的到的模型。\n *\n * 坐标系:本项目 primitive 为 Z-up(经过 ROT_Y_TO_Z 旋转),\n * OCCT 默认也是 Z-up,因此直接对应,无需额外轴转换。\n */\n\n\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { PrimitiveType } from './types'\nimport { reconstructSolidFromMesh } from '../occt-kernel/meshReconstruct'\nimport type {\n BoxParams,\n SphereParams,\n CylinderParams,\n ConeParams,\n WedgeParams,\n Shape,\n} from '../mesh/types'\n\n// ─── 辅助:从 Shape 提取网格数据 ───\n\n/**\n * Extract positions + indices from a Shape for the mesh reconstruction path.\n *\n * @param shape - the source Shape.\n * @returns the extracted positions and indices arrays.\n */\nexport function extractMeshData(shape: Shape): {\n positions: Float32Array\n indices: Uint32Array\n} {\n return { positions: new Float32Array(shape.positions), indices: new Uint32Array(shape.indices) }\n}\n\n// ─── 直接构造路径 ───\n\n/** 应用 center 偏移到 OCCT solid(如果有 center 参数)。 */\nfunction applyCenter(kernel: BrepEngineApi, solid: BrepHandle, center?: [number, number, number]): BrepHandle {\n if (!center) return solid\n const translated = kernel.translate(solid, center[0], center[1], center[2])\n kernel.release(solid)\n return translated\n}\n\n/**\n * 用 OCCT 直接构造一个长方体 Solid(原 brepjs `box(width, depth, height,\n * {at?, centered?})` 契约,§4.1 A 决策;与 mesh 路径逐点对齐)。\n *\n * 锚点(2026-10-16 与 cylinder/cone 统一为 BASE 语义):\n * - 默认(无 at、无 centered):角点在原点,底面贴地(z∈[0,h]);\n * - `centered:true`(无 at):居中到原点;\n * - `at`:底面中心落在 at(BASE 语义,与 cylinder/cone 一致);\n * 与 `centered:true` 同给时以 at 为中心。\n * 等价写法:`box(w, d, h)` ≡ `box(w, d, h, { at: [w/2, d/2, 0] })`。\n */\nfunction cubeToCadSolid(kernel: BrepEngineApi, params: BoxParams): BrepHandle {\n const w = params.width\n const d = params.depth\n const h = params.height\n // 底面中心的目标位置(BASE 锚点):\n // - at 给定:at(at + centered 时再下移 h/2,使 at 成为中心);\n // - 仅 centered:原点居中 → 底面中心 (0, 0, -h/2);\n // - 默认:角点在原点 → 底面中心 (w/2, d/2, 0)。\n let baseX: number\n let baseY: number\n let baseZ: number\n if (params.at !== undefined) {\n baseX = params.at[0]\n baseY = params.at[1]\n baseZ = params.at[2] - (params.centered === true ? h / 2 : 0)\n } else if (params.centered === true) {\n baseX = 0\n baseY = 0\n baseZ = -h / 2\n } else {\n baseX = w / 2\n baseY = d / 2\n baseZ = 0\n }\n // 角点实体 (0,0,0)-(w,d,h),平移到「底面中心落在 (baseX, baseY, baseZ)」。\n const solid = kernel.makeBoxFromCorners(\n { x: 0, y: 0, z: 0 },\n { x: w, y: d, z: h },\n )\n const dx = baseX - w / 2\n const dy = baseY - d / 2\n const dz = baseZ\n if (dx !== 0 || dy !== 0 || dz !== 0) {\n const translated = kernel.translate(solid, dx, dy, dz)\n kernel.release(solid)\n return translated\n }\n return solid\n}\n\n/**\n * 用 OCCT 直接构造一个球体 Solid。\n *\n * 接收完整 SphereParams:radius 是球体半径,segments 不影响 BREP(仅影响 mesh 离散化)。\n */\nfunction sphereToCadSolid(kernel: BrepEngineApi, params: SphereParams): BrepHandle {\n const solid = kernel.makeSphere(params.radius)\n return applyCenter(kernel, solid, params.center)\n}\n\n/**\n * 用 OCCT 直接构造一个圆柱体 Solid(原 brepjs `cylinder(radius, height, {\n * at, centered })` 契约,§4.3 A 决策;与 mesh 路径逐点对齐)。\n *\n * 锚点同旧 `primitiveFns.cylinder`:`at` 是底面轴心(BASE)语义(默认\n * [0,0,0]),OCCT makeCylinder 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`\n * 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n */\nfunction cylinderToCadSolid(kernel: BrepEngineApi, params: CylinderParams): BrepHandle {\n const solid = kernel.makeCylinder(params.radius, params.height)\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n if (baseX !== 0 || baseY !== 0 || baseZ !== 0) {\n const translated = kernel.translate(solid, baseX, baseY, baseZ)\n kernel.release(solid)\n return translated\n }\n return solid\n}\n\n/**\n * 用 OCCT 直接构造一个圆锥体 Solid(原 brepjs `cone(bottomRadius, topRadius,\n * height, { at, centered })` 契约,§4.1 P 决策;与 mesh 路径逐点对齐)。\n *\n * 锚点同旧 `primitiveFns.cone`:`at` 是底面轴心(BASE)语义(默认\n * [0,0,0]),OCCT makeCone 原生从 z=0 沿 +Z 建高 → 无需重居中;`centered:true`\n * 指底面沿轴下移 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n */\nfunction coneToCadSolid(kernel: BrepEngineApi, params: ConeParams): BrepHandle {\n const solid = kernel.makeCone(params.radiusBottom, params.radiusTop, params.height)\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n if (baseX !== 0 || baseY !== 0 || baseZ !== 0) {\n const translated = kernel.translate(solid, baseX, baseY, baseZ)\n kernel.release(solid)\n return translated\n }\n return solid\n}\n\n/**\n * 用 OCCT 从 2D 梯形轮廓拉伸构造楔形体 Solid。\n *\n * 支持全参数(width/height/angle/length),向后兼容旧式 { size: number }。\n *\n * 参数(来自 WedgePanel.buildWedgeGeometry):\n * - 底边宽度 width(沿 Y)\n * - 高度 height(沿 Z)\n * - 底边与斜边的夹角 angleDeg\n * - 拉伸总长 length(沿 X,从 -length/2 到 +length/2)\n *\n * 构造步骤:\n * 1. 在 YZ 平面创建梯形 wire(4 个顶点,4 条边)\n * 2. 从 wire 创建 planar face\n * 3. 沿 X 轴拉伸\n * 4. 平移使 X 方向居中\n */\nfunction wedgeToCadSolid(kernel: BrepEngineApi, params: WedgeParams): BrepHandle {\n const width = params.width // 底边长度(沿 Y)\n const height = params.height // 梯形高(沿 Z)\n const angleDeg = params.angle // 底边与斜边的夹角\n const length = params.length // 拉伸总长(沿 X)\n const angleRad = (angleDeg * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n\n // 上边半宽 = 底边半宽 - 高 / tan(角度)\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n\n // 在 YZ 平面创建梯形 wire(X=0)。顶边塌缩(halfTopWidth≈0,斜坡已在宽度内到顶)\n // 时退化为三角棱柱——不能再保留零长顶边(两个重合顶点会让 OCCT makeLineEdge\n // 报 CONSTRUCTION_FAILED,即 P23 实测的 wedge 退化参数失败)。\n const edges: BrepHandle[] = []\n if (halfTopWidth > 1e-12) {\n // 梯形:底边 (±hw,0) + 上边 (±halfTopWidth,height)\n edges.push(\n kernel.makeLineEdge({ x: 0, y: -hw, z: 0 }, { x: 0, y: hw, z: 0 }),\n kernel.makeLineEdge({ x: 0, y: hw, z: 0 }, { x: 0, y: halfTopWidth, z: height }),\n kernel.makeLineEdge({ x: 0, y: halfTopWidth, z: height }, { x: 0, y: -halfTopWidth, z: height }),\n kernel.makeLineEdge({ x: 0, y: -halfTopWidth, z: height }, { x: 0, y: -hw, z: 0 }),\n )\n } else {\n // 三角棱柱:(−hw,0) → (hw,0) → (0,height)\n edges.push(\n kernel.makeLineEdge({ x: 0, y: -hw, z: 0 }, { x: 0, y: hw, z: 0 }),\n kernel.makeLineEdge({ x: 0, y: hw, z: 0 }, { x: 0, y: 0, z: height }),\n kernel.makeLineEdge({ x: 0, y: 0, z: height }, { x: 0, y: -hw, z: 0 }),\n )\n }\n\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 2 * halfExtrude, 0, 0)\n // 平移使 X 方向居中\n const centered = kernel.translate(extruded, -halfExtrude, 0, 0)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return applyCenter(kernel, centered, params.center)\n}\n\n// ─── 统一入口 ───\n\n/**\n * Conversion result: the CAD solid handle and the construction path used.\n */\nexport interface PrimitiveToBrepResult {\n /** CAD solid handle (the caller is responsible for releasing it). */\n solid: BrepHandle\n /** The construction path used. */\n path: 'primitive' | 'mesh'\n /** The primitive type. */\n type: PrimitiveType | 'screw' | 'text'\n}\n\n/** Union type of the primitive parameter objects. */\nexport type PrimitiveParams = BoxParams | SphereParams | CylinderParams | ConeParams | WedgeParams\n\n/**\n * 将旧的 size 数字转换为对应类型的完整 params(向后兼容)。\n *\n * - cube: { size: size }\n * - wedge: { width: size, height: size/2, angle: 60, length: 50 }\n * - sphere: { radius: size / 2 }\n * - cylinder: { radius: size / 2, height: size }\n * - cone: { radiusBottom: size / 2, radiusTop: 0, height: size }\n */\nfunction sizeToParams(type: PrimitiveType | 'screw' | 'text', size: number): PrimitiveParams {\n switch (type) {\n case 'cube':\n case 'box':\n return { width: size, depth: size, height: size }\n case 'sphere':\n return { radius: size / 2 }\n case 'cylinder':\n return { radius: size / 2, height: size }\n case 'cone':\n return { radiusBottom: size / 2, radiusTop: 0, height: size }\n case 'wedge':\n return { width: size, height: size / 2, angle: 60, length: 50 }\n default:\n throw new Error(`sizeToParams does not support primitive type \"${type}\" (use geometry data)`)\n }\n}\n\n/**\n * Convert a project primitive to an OCCT CAD solid.\n *\n * - cube, sphere, cylinder, cone, wedge: constructed directly with OCCT (exact BREP)\n * - screw, text: use the mesh reconstruction path (faceted BREP)\n *\n * @param kernel - the initialized OCCT kernel.\n * @param type - the primitive type.\n * @param params - a full parameter object (BoxParams etc.), or a size number (backwards-compatible, default 20mm).\n * @returns the CAD solid plus path information.\n */\nexport function primitiveToBrepSolid(\n kernel: BrepEngineApi,\n type: PrimitiveType | 'screw' | 'text',\n params?: PrimitiveParams | number,\n): PrimitiveToBrepResult {\n const fullParams = typeof params === 'number' || params === undefined\n ? sizeToParams(type, params ?? 20)\n : params\n\n switch (type) {\n case 'cube':\n case 'box':\n return { solid: cubeToCadSolid(kernel, fullParams as BoxParams), path: 'primitive', type }\n\n case 'sphere':\n return { solid: sphereToCadSolid(kernel, fullParams as SphereParams), path: 'primitive', type }\n\n case 'cylinder':\n return { solid: cylinderToCadSolid(kernel, fullParams as CylinderParams), path: 'primitive', type }\n\n case 'cone':\n return { solid: coneToCadSolid(kernel, fullParams as ConeParams), path: 'primitive', type }\n\n case 'wedge':\n return { solid: wedgeToCadSolid(kernel, fullParams as WedgeParams), path: 'primitive', type }\n\n case 'screw':\n case 'text': {\n // Mesh 重建路径:从 THREE.js 几何体提取网格数据\n // 对于 screw/text,调用方应使用 geometryToBrepSolid\n throw new Error(\n `${type} requires geometry data — use geometryToBrepSolid() instead`,\n )\n }\n\n default:\n throw new Error(`Unsupported primitive type: ${type}`)\n }\n}\n\n/**\n * Create a CAD solid from a Shape via the mesh reconstruction path.\n *\n * Suitable for complex shapes that cannot be constructed directly\n * (screw, text, SVG extrusion, etc.).\n *\n * @param kernel - the initialized OCCT kernel.\n * @param shape - the mesh Shape.\n * @returns the CAD solid plus path information.\n */\nexport function geometryToBrepSolid(\n kernel: BrepEngineApi,\n shape: Shape,\n): PrimitiveToBrepResult {\n const { positions, indices } = extractMeshData(shape)\n const solid = reconstructSolidFromMesh(kernel, positions, indices)\n return { solid, path: 'mesh', type: 'screw' }\n}\n\n/**\n * Export a CAD solid as a BREP-format STEP string.\n *\n * OCCT's exportStep produces a standard ISO-10303-21 STEP file using\n * ADVANCED_FACE with exact surfaces (PLANE, CYLINDRICAL_SURFACE, etc.)\n * rather than a faceted representation (POLYGONAL_FACE).\n *\n * @param kernel - the initialized OCCT kernel.\n * @param solid - the CAD solid handle.\n * @returns the STEP file content as a string.\n */\nexport function brepSolidToStep(kernel: BrepEngineApi, solid: BrepHandle): string {\n return kernel.exportStep(solid)\n}\n\n/**\n * Convenience method: convert a primitive directly to a STEP string.\n *\n * Internally calls primitiveToBrepSolid + brepSolidToStep and manages the\n * handle lifecycle automatically.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param type - the primitive type.\n * @param params - a full parameter object, or a size number (backwards-compatible, default 20mm).\n * @returns the STEP file content string plus the path used.\n */\nexport function primitiveToBrepStep(\n kernel: BrepEngineApi,\n type: PrimitiveType,\n params?: PrimitiveParams | number,\n): { step: string; path: 'primitive' | 'mesh' } {\n const result = primitiveToBrepSolid(kernel, type, params)\n try {\n const step = brepSolidToStep(kernel, result.solid)\n return { step, path: result.path }\n } finally {\n kernel.release(result.solid)\n }\n}\n"]}
|
package/dist/runtime-state.d.ts
CHANGED
|
@@ -64,8 +64,24 @@ export interface Backends {
|
|
|
64
64
|
*/
|
|
65
65
|
hostEnv?: RuntimeHostEnv;
|
|
66
66
|
};
|
|
67
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* 几何后端(**宿主装配槽**)。brep 引擎异步初始化 → 用 getter。
|
|
69
|
+
*
|
|
70
|
+
* ⚠️ **库代码与 op 代码一律不得直读 `kernel.brep`**:值是当前引擎的 `BrepEngineApi`
|
|
71
|
+
* 实例(由 `brep-chain.ts` 从 `engine.primitives` 写入)——中立代码经 `getBrepApi()`
|
|
72
|
+
* (`brep/handle-bridge.ts`,本文件是零依赖层,不能 import 它),平台代码经
|
|
73
|
+
* `getOcctKernel()` / `getBrepKitKernel()`。直读该槽位会拿到 `unknown` 并需要一次
|
|
74
|
+
* 断言,那正是「假装统一内核」事故的成因。
|
|
75
|
+
*
|
|
76
|
+
* 为什么本字段必须留在**公开类型**里(不能用 JSDoc 的内部标记 + stripInternal 隐藏):
|
|
77
|
+
* `Backends` 是宿主装配契约(公开的 `configureBackends` 的入参),宿主必须能给 `kernel`
|
|
78
|
+
* 赋值——一旦隐藏,连 core 自己的 `test/support/host-env.ts` 都得靠 `as unknown as`
|
|
79
|
+
* 才能调用公开 API。「库不得读」是**读侧**约束,由
|
|
80
|
+
* `scripts/check-lib-layering.mjs` 的 `raw-kernel-slot` 规则(禁 `getBackends`)在 CI
|
|
81
|
+
* 层强制——用类型隐藏来表达「禁止读」是错的工具(它同时禁掉了写)。
|
|
82
|
+
*/
|
|
68
83
|
readonly kernel: {
|
|
84
|
+
/** 当前引擎的 L1 契约面实例;库/op 代码请用 `getBrepApi()`(见本字段上方说明)。 */
|
|
69
85
|
readonly brep: unknown | null;
|
|
70
86
|
readonly csg: unknown | undefined;
|
|
71
87
|
readonly sdf: unknown | undefined;
|
|
@@ -328,6 +344,17 @@ export declare function configureBackends(backends: Backends): void;
|
|
|
328
344
|
* @returns the configured backend resources.
|
|
329
345
|
*/
|
|
330
346
|
export declare function getBackends(): Backends;
|
|
347
|
+
/**
|
|
348
|
+
* 当前**配置**的活动 BREP 引擎 id(宿主经 `configureBackends({ config: { brepEngineId } })`
|
|
349
|
+
* 声明)。库级引擎门禁用——它读的是宿主声明的活动引擎,而非注册表默认(注册表默认
|
|
350
|
+
* 是装配期第一个注册者,二者可能不同;见 `brep/engine/registry.ts` 的 `getActiveBrepEngineId`)。
|
|
351
|
+
*
|
|
352
|
+
* 这是库代码在不触碰裸槽位(`getBackends().kernel.brep` 被分层门禁禁止)的前提下,
|
|
353
|
+
* 唯一能拿到的「当前活动引擎」信息。未配置返回 `null`。
|
|
354
|
+
*
|
|
355
|
+
* @returns 活动引擎 id,或 `null`(未配置)。
|
|
356
|
+
*/
|
|
357
|
+
export declare function getConfiguredBrepEngineId(): string | null;
|
|
331
358
|
/**
|
|
332
359
|
* 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。
|
|
333
360
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAEzD,uCAAuC;AACvC,MAAM,WAAW,QAAQ;IACvB,yBAAyB;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,oBAAoB,CAAA;QAC1B,qDAAqD;QACrD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B;;;;WAIG;QACH,OAAO,CAAC,EAAE,cAAc,CAAA;KACzB,CAAA;IACD
|
|
1
|
+
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime-state.js
CHANGED
|
@@ -282,6 +282,19 @@ export function getBackends() {
|
|
|
282
282
|
}
|
|
283
283
|
return b;
|
|
284
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* 当前**配置**的活动 BREP 引擎 id(宿主经 `configureBackends({ config: { brepEngineId } })`
|
|
287
|
+
* 声明)。库级引擎门禁用——它读的是宿主声明的活动引擎,而非注册表默认(注册表默认
|
|
288
|
+
* 是装配期第一个注册者,二者可能不同;见 `brep/engine/registry.ts` 的 `getActiveBrepEngineId`)。
|
|
289
|
+
*
|
|
290
|
+
* 这是库代码在不触碰裸槽位(`getBackends().kernel.brep` 被分层门禁禁止)的前提下,
|
|
291
|
+
* 唯一能拿到的「当前活动引擎」信息。未配置返回 `null`。
|
|
292
|
+
*
|
|
293
|
+
* @returns 活动引擎 id,或 `null`(未配置)。
|
|
294
|
+
*/
|
|
295
|
+
export function getConfiguredBrepEngineId() {
|
|
296
|
+
return getBackends().config.brepEngineId ?? null;
|
|
297
|
+
}
|
|
285
298
|
// ── 当前执行语句(引擎内部状态)──
|
|
286
299
|
/**
|
|
287
300
|
* 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。
|
|
@@ -451,7 +464,7 @@ export function takePendingImportModels() {
|
|
|
451
464
|
return out;
|
|
452
465
|
}
|
|
453
466
|
// ── 网格实体登记(方案 2026-10-01 §3.3:load 的 mesh 路径产出网格实体 + 近似拓扑)──
|
|
454
|
-
// 与 pendingDetectedUnits 同模式:load op(在
|
|
467
|
+
// 与 pendingDetectedUnits 同模式:load op(在 core/src/extra)不能直接持有
|
|
455
468
|
// CadRuntime 实例,故把"规范化得到的句柄"与"近似拓扑数据"登记到这里,引擎在语句
|
|
456
469
|
// 执行后取走:句柄进 MeshSolidRegistry + 写 Shape 槽,拓扑进 topologyCache。
|
|
457
470
|
//
|