@faicad/faijs 0.22.2 → 0.29.3
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/LICENSE +202 -28
- package/dist/api/api-namespace.d.ts +5 -5
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +4 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assert.d.ts +2 -2
- package/dist/api/assert.js +8 -8
- package/dist/api/assert.js.map +1 -1
- package/dist/api/asset.d.ts +1 -1
- package/dist/api/asset.js +2 -2
- package/dist/api/asset.js.map +1 -1
- package/dist/api/boolean.d.ts +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +128 -16
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts +14 -0
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/borrow-bridge.js +52 -0
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -0
- package/dist/api/cadquery-selectors/edge.d.ts +40 -0
- package/dist/api/cadquery-selectors/edge.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/edge.js +70 -0
- package/dist/api/cadquery-selectors/edge.js.map +1 -0
- package/dist/api/cadquery-selectors/entity.d.ts +121 -0
- package/dist/api/cadquery-selectors/entity.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/entity.js +167 -0
- package/dist/api/cadquery-selectors/entity.js.map +1 -0
- package/dist/api/cadquery-selectors/face.d.ts +33 -0
- package/dist/api/cadquery-selectors/face.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/face.js +353 -0
- package/dist/api/cadquery-selectors/face.js.map +1 -0
- package/dist/api/cadquery-selectors/grammar.d.ts +50 -0
- package/dist/api/cadquery-selectors/grammar.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/grammar.js +345 -0
- package/dist/api/cadquery-selectors/grammar.js.map +1 -0
- package/dist/api/cadquery-selectors/index.d.ts +18 -0
- package/dist/api/cadquery-selectors/index.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/index.js +17 -0
- package/dist/api/cadquery-selectors/index.js.map +1 -0
- package/dist/api/cadquery-selectors/predicates.d.ts +76 -0
- package/dist/api/cadquery-selectors/predicates.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/predicates.js +85 -0
- package/dist/api/cadquery-selectors/predicates.js.map +1 -0
- package/dist/api/cadquery-selectors/resolve.d.ts +41 -0
- package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/resolve.js +243 -0
- package/dist/api/cadquery-selectors/resolve.js.map +1 -0
- package/dist/api/cadquery-selectors/types.d.ts +96 -0
- package/dist/api/cadquery-selectors/types.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/types.js +11 -0
- package/dist/api/cadquery-selectors/types.js.map +1 -0
- package/dist/api/chamfer.d.ts +13 -5
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +63 -7
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +1 -1
- package/dist/api/compound-geom.js +1 -1
- package/dist/api/compound-geom.js.map +1 -1
- package/dist/api/draft.d.ts +1 -1
- package/dist/api/draft.js +1 -1
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.d.ts +1 -1
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +11 -3
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts +1 -1
- package/dist/api/engrave.js +7 -7
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts +6 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +59 -5
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts +1 -1
- package/dist/api/face-ref.js +1 -1
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.js +1 -1
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +1 -1
- package/dist/api/fillet-variable.js +1 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +28 -8
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +64 -9
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/geom.d.ts +1 -1
- package/dist/api/geom.js +1 -1
- package/dist/api/geom.js.map +1 -1
- package/dist/api/helix.d.ts +1 -1
- package/dist/api/helix.js +1 -1
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-brep.d.ts +20 -2
- package/dist/api/import-brep.d.ts.map +1 -1
- package/dist/api/import-brep.js +28 -3
- package/dist/api/import-brep.js.map +1 -1
- package/dist/api/import-step.d.ts +17 -2
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +23 -3
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +2 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +5 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.js +1 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/mesh-solid-op.d.ts +236 -0
- package/dist/api/internal/mesh-solid-op.d.ts.map +1 -0
- package/dist/api/internal/mesh-solid-op.js +352 -0
- package/dist/api/internal/mesh-solid-op.js.map +1 -0
- package/dist/api/internal/svg-asset-resolver.d.ts +1 -1
- package/dist/api/internal/svg-asset-resolver.js +1 -1
- package/dist/api/internal/svg-asset-resolver.js.map +1 -1
- package/dist/api/knurl.d.ts +1 -1
- package/dist/api/knurl.js +2 -2
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +1 -1
- package/dist/api/loft.js +1 -1
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +9 -5
- package/dist/api/measurement/index.d.ts.map +1 -1
- package/dist/api/measurement/index.js +47 -20
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/pattern.d.ts +5 -3
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +32 -4
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.d.ts +1 -1
- package/dist/api/place.js +1 -1
- package/dist/api/place.js.map +1 -1
- package/dist/api/primitives.d.ts +1 -1
- package/dist/api/primitives.js +2 -2
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts +39 -12
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +4 -4
- package/dist/api/profile.js.map +1 -1
- package/dist/api/reconcile.d.ts +1 -1
- package/dist/api/reconcile.js +1 -1
- package/dist/api/reconcile.js.map +1 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +122 -1
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.js +3 -3
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts +1 -1
- package/dist/api/sdf.js +2 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/section-by-plane.d.ts +1 -1
- package/dist/api/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +2 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.d.ts +11 -4
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +53 -7
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +41 -0
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +100 -1
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts +7 -5
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +6 -7
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/split-by-plane.d.ts +1 -1
- package/dist/api/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +2 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +2 -2
- package/dist/api/split.js.map +1 -1
- package/dist/api/sweep.d.ts +1 -1
- package/dist/api/sweep.js +1 -1
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/topo-resolve.d.ts +74 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +180 -2
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +5 -1
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +62 -11
- package/dist/api/transform.js.map +1 -1
- package/dist/api/wire.d.ts +1 -1
- package/dist/api/wire.js +1 -1
- package/dist/api/wire.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +9 -7
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +23 -24
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +5 -4
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +6 -5
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/effective-deflection.d.ts +35 -0
- package/dist/brep/effective-deflection.d.ts.map +1 -0
- package/dist/brep/effective-deflection.js +49 -0
- package/dist/brep/effective-deflection.js.map +1 -0
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +27 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +18 -0
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +46 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +3 -1
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +29 -7
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +24 -1
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +24 -0
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +54 -3
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js +10 -0
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +6 -5
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +1 -1
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +20 -1
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +1 -1
- package/dist/brep/handle-bridge.js +1 -1
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/mesh-solid.d.ts +218 -0
- package/dist/brep/mesh-solid.d.ts.map +1 -0
- package/dist/brep/mesh-solid.js +229 -0
- package/dist/brep/mesh-solid.js.map +1 -0
- package/dist/brep/text/fontRegistry.d.ts +32 -1
- package/dist/brep/text/fontRegistry.d.ts.map +1 -1
- package/dist/brep/text/fontRegistry.js +51 -1
- package/dist/brep/text/fontRegistry.js.map +1 -1
- package/dist/brep/text/text-to-solid.d.ts.map +1 -1
- package/dist/brep/text/text-to-solid.js +8 -3
- package/dist/brep/text/text-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +18 -2
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +449 -123
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +8 -0
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +10 -0
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/browser-host/browser-font-provider.d.ts +12 -0
- package/dist/browser-host/browser-font-provider.d.ts.map +1 -1
- package/dist/browser-host/browser-font-provider.js +25 -0
- package/dist/browser-host/browser-font-provider.js.map +1 -1
- package/dist/browser.d.ts +6 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +10 -3
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +28 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +119 -4
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +15 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +33 -1
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/preview-exec.d.ts +4 -4
- package/dist/cad-runtime/preview-exec.js +2 -2
- package/dist/cad-runtime/preview-exec.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +42 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +68 -5
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +15 -1
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +10 -1
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +2 -2
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +1 -1
- package/dist/env-agnostic.js.map +1 -1
- package/dist/geometry2d/adapt.d.ts +39 -4
- package/dist/geometry2d/adapt.d.ts.map +1 -1
- package/dist/geometry2d/adapt.js +14 -3
- package/dist/geometry2d/adapt.js.map +1 -1
- package/dist/geometry2d/blueprint.d.ts +2 -2
- package/dist/geometry2d/blueprint.js +2 -2
- package/dist/geometry2d/blueprint.js.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +18 -8
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.js +65 -12
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +17 -0
- package/dist/geometry2d/bridge/plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/plane.js +22 -0
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +25 -0
- package/dist/geometry2d/curve2d.d.ts.map +1 -1
- package/dist/geometry2d/curve2d.js +41 -5
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/io/bytes-node.d.ts +11 -0
- package/dist/io/bytes-node.d.ts.map +1 -0
- package/dist/io/bytes-node.js +28 -0
- package/dist/io/bytes-node.js.map +1 -0
- package/dist/io/bytes.d.ts +33 -0
- package/dist/io/bytes.d.ts.map +1 -0
- package/dist/io/bytes.js +41 -0
- package/dist/io/bytes.js.map +1 -0
- package/dist/io/fai-zip/container-read.d.ts +102 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -0
- package/dist/io/fai-zip/container-read.js +305 -0
- package/dist/io/fai-zip/container-read.js.map +1 -0
- package/dist/io/fai-zip/container-write.d.ts +70 -0
- package/dist/io/fai-zip/container-write.d.ts.map +1 -0
- package/dist/io/fai-zip/container-write.js +186 -0
- package/dist/io/fai-zip/container-write.js.map +1 -0
- package/dist/io/fai-zip/container.d.ts +107 -0
- package/dist/io/fai-zip/container.d.ts.map +1 -0
- package/dist/io/fai-zip/container.js +89 -0
- package/dist/io/fai-zip/container.js.map +1 -0
- package/dist/io/fai-zip/index.d.ts +18 -0
- package/dist/io/fai-zip/index.d.ts.map +1 -0
- package/dist/io/fai-zip/index.js +4 -0
- package/dist/io/fai-zip/index.js.map +1 -0
- package/dist/io/index.d.ts +10 -0
- package/dist/io/index.d.ts.map +1 -0
- package/dist/io/index.js +13 -0
- package/dist/io/index.js.map +1 -0
- package/dist/io/zip.d.ts +68 -0
- package/dist/io/zip.d.ts.map +1 -0
- package/dist/io/zip.js +147 -0
- package/dist/io/zip.js.map +1 -0
- package/dist/lang/code-to-args.d.ts +1 -1
- package/dist/lang/code-to-args.js +1 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/statement-summary.d.ts +1 -1
- package/dist/lang/statement-summary.js +1 -1
- package/dist/lang/statement-summary.js.map +1 -1
- package/dist/lang/types.d.ts +1 -1
- package/dist/lang/types.js +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/index.d.ts +2 -1
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +2 -1
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +7 -0
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +14 -17
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/reconcile.d.ts +1 -1
- package/dist/mesh/reconcile.js +1 -1
- package/dist/mesh/reconcile.js.map +1 -1
- package/dist/mesh/rigid-transform.d.ts +3 -3
- package/dist/mesh/rigid-transform.js +3 -3
- package/dist/mesh/rigid-transform.js.map +1 -1
- package/dist/mesh/stl-unit.d.ts +24 -0
- package/dist/mesh/stl-unit.d.ts.map +1 -0
- package/dist/mesh/stl-unit.js +17 -0
- package/dist/mesh/stl-unit.js.map +1 -0
- package/dist/mesh/threemf-bambu.d.ts +142 -0
- package/dist/mesh/threemf-bambu.d.ts.map +1 -0
- package/dist/mesh/threemf-bambu.js +334 -0
- package/dist/mesh/threemf-bambu.js.map +1 -0
- package/dist/mesh/threemf-loader.d.ts +42 -7
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +565 -100
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/threemf-view.d.ts +71 -0
- package/dist/mesh/threemf-view.d.ts.map +1 -0
- package/dist/mesh/threemf-view.js +100 -0
- package/dist/mesh/threemf-view.js.map +1 -0
- package/dist/node-host/cli.d.ts +44 -6
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +76 -26
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/font-family-index.d.ts +93 -0
- package/dist/node-host/font-family-index.d.ts.map +1 -0
- package/dist/node-host/font-family-index.js +273 -0
- package/dist/node-host/font-family-index.js.map +1 -0
- package/dist/node-host/fs-asset-resolver.d.ts +8 -3
- package/dist/node-host/fs-asset-resolver.d.ts.map +1 -1
- package/dist/node-host/fs-asset-resolver.js +13 -5
- package/dist/node-host/fs-asset-resolver.js.map +1 -1
- package/dist/node-host/index.d.ts +8 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +1 -0
- package/dist/node-host/index.js.map +1 -1
- package/dist/node-host/node-font-provider.d.ts +28 -0
- package/dist/node-host/node-font-provider.d.ts.map +1 -1
- package/dist/node-host/node-font-provider.js +49 -0
- package/dist/node-host/node-font-provider.js.map +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +35 -2
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +18 -13
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +18 -31
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepColorParser.d.ts +18 -0
- package/dist/occt-kernel/stepColorParser.d.ts.map +1 -1
- package/dist/occt-kernel/stepColorParser.js +38 -0
- package/dist/occt-kernel/stepColorParser.js.map +1 -1
- package/dist/occt-kernel/topologyExt.d.ts +1 -1
- package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
- package/dist/occt-kernel/topologyExt.js +4 -5
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +2 -15
- package/dist/primitives/text/cjk-font.d.ts.map +1 -1
- package/dist/primitives/text/cjk-font.js +13 -1
- package/dist/primitives/text/cjk-font.js.map +1 -1
- package/dist/runtime-state.d.ts +85 -9
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +72 -2
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +3 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +5 -5
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +97 -2
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +126 -1
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/lineage.d.ts +6 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js +8 -0
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/topology/naming/resolve-edge.d.ts +20 -1
- package/dist/topology/naming/resolve-edge.d.ts.map +1 -1
- package/dist/topology/naming/resolve-edge.js +54 -20
- package/dist/topology/naming/resolve-edge.js.map +1 -1
- package/dist/weapp.d.ts +6 -2
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +7 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +18 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-model.js","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * exportModel — 统一导出入口(unit-system §10.6 二 / R11 / 裁决 J)\n *\n * 单一真源:坐标单位换算与文件单位声明由**同一次换算**产出(§10.3 规则 3),\n * 声明与坐标必须同源。CLI(writeOutput)与宿主(3d_editor)共用本入口。\n *\n * 格式分派(§10.6 表):\n * - stl:坐标缩放到 unit 刻度,无声明(格式不支持)。\n * - step:预缩放 + 文本层只改写单位实体(§10.3 规则 3a;OCCT 恒写\n * SI_UNIT(.MILLI.,.METRE.),坐标预先缩放到目标刻度后声明必须跟上)。\n * - 3mf:坐标缩放到 unit 刻度 + <model unit> 与坐标同源;yard 不在 3MF\n * 枚举 → 成对回落到 mm(§10.3 规则 2)。\n *\n * 红线(§10.3 3a):绝不文本级改坐标 — 坐标只在几何层缩放,文本层只碰单位实体。\n */\n\nimport { buildStlBufferFromMesh } from './stl'\nimport { zipSync, strToU8 } from 'fflate'\nimport { UNIT_SCALE, type UnitName } from '../../units'\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getBrepApi } from '../handle-bridge'\nimport { exportStepFromSolids, type StepExportEntry } from './step'\nimport { detectStepUnit, STEP_UNIT_SCAN_PREFIX } from '../../mesh/io'\n\n/** 导出条目:一个 part 的几何来源。精确 BREP 与三角网格二选一,solid 优先。 */\nexport interface ExportEntry {\n /** 精确 BREP 句柄(来自 brep 链,导出 ADVANCED_FACE)。 */\n solid?: BrepHandle\n /** 三角网格(基准单位刻度;调用方只做世界变换烘焙,不做单位缩放)。 */\n mesh?: { positions: Float32Array; indices: Uint32Array }\n /** 实体名(写 STEP PRODUCT 名 / 3MF <object name>)。 */\n name?: string\n /** sRGB 0..1 颜色(STEP 走 XCAF COLOUR_RGB,3MF 走 basematerials)。 */\n color?: readonly [number, number, number]\n}\n\n/** Output formats supported by the unified {@link exportModel} entry. */\nexport type ExportFormat = 'stl' | 'step' | '3mf'\n\n/**\n * Options controlling {@link exportModel}/{@link exportModelSync} output\n * (unit-system §10.3): the declared target unit and optional 3MF print config.\n */\nexport interface ExportOptions {\n /**\n * 目标长度单位。缺省 'mm'。语义是「文件里声明的单位」——\n * 实现负责把坐标换算到该单位刻度并与声明成对写出(§10.3)。\n */\n unit?: UnitName\n /** 3MF 打印配置(可选,原样进 model 层)。 */\n printConfig?: unknown\n}\n\n/** UnitName → 3MF <model unit> 枚举全名(唯一真源;yard 无对应值)。 */\nexport const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter'>> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n micron: 'micron',\n inch: 'inch',\n foot: 'foot',\n // yard 无 3MF 枚举值 — 调用方必须先成对回落到 mm(§10.3 规则 2)。\n}\n\n/** 缩放 Float32 positions 到目标单位刻度(基准值 ÷ unitScale(unit))。 */\nfunction scalePositions(positions: Float32Array, scale: number): Float32Array {\n if (scale === 1) return positions\n const out = new Float32Array(positions.length)\n for (let i = 0; i < positions.length; i++) out[i] = positions[i] * scale\n return out\n}\n\n/** STEP 单位声明改写:SI_UNIT(.MILLI.,.METRE.) → 目标单位实体(只碰单位实体,红线)。 */\nfunction rewriteStepUnitEntities(stepText: string, unit: UnitName): string {\n // mm 是 OCCT 的原生写出形态,无需改写。\n if (unit === 'mm') return stepText\n\n // SI 面积/体积单位实体的前缀同样要跟着换(LENGTH/AREA/VOLUME 挂同一前缀链),\n // 但坐标已缩放 → 只需把 LENGTH 链上的前缀换掉;面积/体积单位在 STEP 里由\n // SI_UNIT 前缀 + 幂次表达,XCAF 写出的实体形态是 SI_UNIT(.MILLI.,.METRE.)\n // 挂在长度、平方与立方三条依赖链上。为保守起见只改写显式 LENGTH_UNIT 链上的\n // SI_UNIT —— 具体做法:全局替换 SI_UNIT 前缀(同一文件里坐标相关单位恒为\n // 长度链;角度 SI_UNIT(.RADIAN.) 不含 METRE 不会被命中)。\n let out = stepText\n\n if (unit === 'cm' || unit === 'm' || unit === 'micron') {\n const prefix = unit === 'cm' ? '.CENTI.' : unit === 'm' ? '$' : '.MICRO.'\n // OCCT 写出恒为 SI_UNIT(.MILLI.,.METRE.)(实测);$ 前缀形态(无前缀=米)\n // 在 OCCT 输出中不会出现,但容错处理(若上游将来变化)。\n out = out.replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/g,\n prefix === '$' ? 'SI_UNIT($,.METRE.)' : `SI_UNIT(${prefix},.METRE.)`)\n return out\n }\n\n // inch / foot:CONVERSION_BASED_UNIT 形态。需要注入换算因子实体并替换\n // LENGTH_UNIT 依赖。最简形态:把 SI_UNIT(.MILLI.,.METRE.) 替换为\n // CONVERSION_BASED_UNIT('INCH', #factor),并附加 MEASURE_WITH_UNIT 实体。\n // 实体编号:取文件内最大 #n + 1、+2(附加实体挂在文件尾部 DATA 段内合法)。\n const inchFactor = unit === 'inch' ? 25.4 : 304.8\n const name = unit === 'inch' ? 'INCH' : 'FOOT'\n\n // 1) 收集现有最大实体编号\n let maxId = 0\n for (const m of out.matchAll(/#(\\d+)\\s*=/g)) {\n const id = Number(m[1])\n if (id > maxId) maxId = id\n }\n const lenId = maxId + 1\n const convId = maxId + 2\n\n // 2) 找到 LENGTH_UNIT() 里挂 SI_UNIT 的实体行,替换为 CONVERSION_BASED_UNIT\n // 并把 SI_UNIT 挂到 LENGTH_MEASURE 上。OCCT 输出形态(实测):\n // #n=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n const siLine = out.match(/#(\\d+)\\s*=\\s*\\([^)]*SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)[^)]*\\)\\s*;/)\n if (!siLine) {\n throw new Error(`[export/step] no SI_UNIT(.MILLI.,.METRE.) entity found; cannot rewrite declaration to ${name}`)\n }\n\n // 3) 替换原 SI_UNIT 实体为 CONVERSION_BASED_UNIT,插入换算因子与基准米实体:\n // #si=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n // → #si=(LENGTH_UNIT()NAMED_UNIT(*)CONVERSION_BASED_UNIT('INCH',#conv));\n // #conv=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#len);\n // #len=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));\n out = out.replace(siLine[0], siLine[0].replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/, `CONVERSION_BASED_UNIT('${name}',#${convId})`))\n // 在 DATA 段结束前(ENDSEC;)插入新实体。\n const insert = [\n `#${convId}=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(${inchFactor}),#${lenId});`,\n `#${lenId}=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));`,\n ].join('\\n')\n out = out.replace(/ENDSEC\\s*;/, `${insert}\\nENDSEC;`)\n return out\n}\n\n/** 3MF写出:最小 ZIP 容器(deflate),落 3D/3dmodel.model + [Content_Types].xml + _rels。 */\nfunction build3mfBuffer(modelXml: string): ArrayBuffer {\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"/></Types>`\n const rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\"/></Relationships>`\n\n const zipped = zipSync({\n '[Content_Types].xml': strToU8(contentTypes),\n '_rels/.rels': strToU8(rels),\n '3D/3dmodel.model': strToU8(modelXml),\n })\n return zipped.buffer.slice(zipped.byteOffset, zipped.byteOffset + zipped.byteLength) as ArrayBuffer\n}\n\n/** 组 3MF <model> XML:单位声明与坐标由同一 scale 变量产出(同源,§10.3 规则 3)。 */\nfunction build3mfModelXml(entries: ExportEntry[], unit: UnitName, scale: number, printConfig?: unknown): string {\n const unitAttr = UNIT_NAME_TO_3MF[unit]\n if (!unitAttr) {\n // 调用方(exportModel)保证 unit 已成对回落;直接到这里 = 内部错误。\n throw new Error(`[export/3mf] unit ${unit} has no 3MF enum value`)\n }\n const objs: string[] = []\n const items: string[] = []\n entries.forEach((e, i) => {\n if (!e.mesh) return\n const pos = scalePositions(e.mesh.positions, scale)\n const verts: string[] = []\n for (let v = 0; v < pos.length; v += 3) {\n verts.push(`<vertex x=\"${pos[v]}\" y=\"${pos[v + 1]}\" z=\"${pos[v + 2]}\"/>`)\n }\n const tris: string[] = []\n for (let t = 0; t < e.mesh.indices.length; t += 3) {\n tris.push(`<triangle v1=\"${e.mesh.indices[t]}\" v2=\"${e.mesh.indices[t + 1]}\" v3=\"${e.mesh.indices[t + 2]}\"/>`)\n }\n const colorXml = e.color\n ? `<basematerials><base name=\"${e.name ?? 'p' + i}\" displaycolor=\"${hexColor(e.color)}\"/></basematerials>`\n : ''\n objs.push(`<object id=\"${i + 1}\" type=\"model\" name=\"${xmlAttr(e.name ?? `part${i + 1}`)}\">${colorXml}<mesh><vertices>${verts.join('')}</vertices><triangles>${tris.join('')}</triangles></mesh></object>`)\n items.push(`<item objectid=\"${i + 1}\"/>`)\n })\n const pc = printConfig ? `<metadata name=\"printConfig\">${xmlAttr(String(printConfig))}</metadata>` : ''\n return `<model unit=\"${unitAttr}\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">${pc}<resources>${objs.join('')}</resources><build>${items.join('')}</build></model>`\n}\n\nfunction xmlAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\nfunction hexColor(c: readonly [number, number, number]): string {\n const h = (v: number) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')\n return `#${h(c[0])}${h(c[1])}${h(c[2])}FF`\n}\n\n/**\n * Synchronous twin of {@link exportModel} for hosts already holding a live\n * kernel (CLI, in-process consumers). Same invariants: declared unit ==\n * written coordinate scale. Only 'stl' / 'step' (3mf is also sync but is\n * routed through the same code path below).\n *\n * @param entries - the shapes to export (BREP solids preferred, mesh fallback).\n * @param format - output format: 'stl' | 'step' | '3mf'.\n * @param opts - optional target unit and 3MF print config.\n * @returns the serialized file bytes (ArrayBuffer).\n */\nexport function exportModelSync(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): ArrayBuffer {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) unit = 'mm'\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n const bufs = entries.filter((e) => e.mesh).map((e) => ({ pos: scalePositions(e.mesh!.positions, scale), idx: e.mesh!.indices }))\n if (bufs.length === 0) throw new Error('[export/stl] no mesh entries')\n if (bufs.length === 1) return buildStlBufferFromMesh(bufs[0]!.pos, bufs[0]!.idx)\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n const kernel = getBrepApi()\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n let buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n if (unit !== 'mm') {\n const text = new TextDecoder().decode(new Uint8Array(buffer))\n buffer = new TextEncoder().encode(rewriteStepUnitEntities(text, unit)).buffer\n }\n return buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 统一导出入口:按 format 分派到各写出器。\n * **内部不变式:写出的坐标刻度 == 文件声明的单位。** 这是本 API 存在的唯一理由。\n * @param entries - 待导出的几何条目(BREP solid 优先,缺则走 mesh)。\n * @param format - 输出格式:'stl' | 'step' | '3mf'。\n * @param opts - 可选的目标单位与 3MF 打印配置。\n * @returns 文件字节\n * @throws 目标单位该格式不支持且无法回落时(不静默降级)\n */\nexport async function exportModel(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): Promise<ArrayBuffer> {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n\n // 3MF 枚举回落(§10.3 规则 2):yard 不在枚举 → 成对回落到 mm(坐标+声明)。\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) {\n unit = 'mm'\n }\n\n // scale = 基准值 → 目标单位刻度(fromBase(1, unit, 'length') 的表实现)。\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n // STL 无声明:坐标按 unit 刻度写出,调用方保证 unit 语义(当前文档单位)。\n const parts: ArrayBuffer[] = []\n for (const e of entries) {\n if (!e.mesh) continue // STL 只吃 mesh;solid 条目由宿主先三角化\n parts.push(buildStlBufferFromMesh(scalePositions(e.mesh.positions, scale), e.mesh.indices))\n }\n if (parts.length === 0) throw new Error('[export/stl] no mesh entries')\n if (parts.length === 1) return parts[0]!\n // 多 mesh:合并顶点后再写(binary STL 无对象概念,多实体合一个 soup)。\n const bufs = entries.filter((e) => e.mesh).map((e) => {\n const pos = scalePositions(e.mesh!.positions, scale)\n return { pos, idx: e.mesh!.indices }\n })\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n // 同一 scale 变量喂两类条目(§10.3 规则 7,修 E4):mesh 缩放 positions,\n // solid 用 owned copy 做 kernel.scale —— 不释放调用方缓存里的原句柄。\n const kernel = (await import('../handle-bridge')).getBrepApi() as BrepEngineApi\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n let buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换单位实体(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n if (unit !== 'mm') {\n const text = new TextDecoder().decode(new Uint8Array(buffer))\n const rewritten = rewriteStepUnitEntities(text, unit)\n buffer = new TextEncoder().encode(rewritten).buffer\n }\n return buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 导出后回读声明单位(自检与验收用;与 detectStepUnit 互为对偶)。\n * @param data - the exported file bytes (ArrayBuffer or decoded Uint8Array).\n * @param format - the format the bytes were produced in.\n * @returns the declared unit, or null when the format cannot declare one (STL)\n * or the declaration cannot be parsed.\n */\nexport function readDeclaredUnit(data: ArrayBuffer | Uint8Array, format: ExportFormat): UnitName | null {\n if (format === 'stl') return null\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n const text = new TextDecoder().decode(bytes).slice(0, STEP_UNIT_SCAN_PREFIX)\n\n if (format === '3mf') {\n const m = text.match(/<model[^>]*\\sunit=\"([^\"]+)\"/)\n if (!m) return null\n for (const [name, val] of Object.entries(UNIT_NAME_TO_3MF)) {\n if (val === m[1]) return name as UnitName\n }\n return null\n }\n\n // step\n return detectStepUnit(text)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"export-model.js","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAiB,MAAM,aAAa,CAAA;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAwB,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AA+BrE,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAkG;IAC7H,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,CAAC,EAAE,OAAO;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,+CAA+C;CAChD,CAAA;AAED,2DAA2D;AAC3D,SAAS,cAAc,CAAC,SAAuB,EAAE,KAAa;IAC5D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACjC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IACxE,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,gEAAgE;AAChE,SAAS,uBAAuB,CAAC,QAAgB,EAAE,IAAc;IAC/D,0BAA0B;IAC1B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAA;IAElC,oDAAoD;IACpD,+CAA+C;IAC/C,2DAA2D;IAC3D,8CAA8C;IAC9C,gDAAgD;IAChD,4CAA4C;IAC5C,IAAI,GAAG,GAAG,QAAQ,CAAA;IAElB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QACzE,uDAAuD;QACvD,iCAAiC;QACjC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gDAAgD,EAChE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,MAAM,WAAW,CAAC,CAAA;QACvE,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,qDAAqD;IACrD,qDAAqD;IACrD,mEAAmE;IACnE,+CAA+C;IAC/C,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAE9C,gBAAgB;IAChB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,EAAE,GAAG,KAAK;YAAE,KAAK,GAAG,EAAE,CAAA;IAC5B,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAA;IAExB,gEAAgE;IAChE,mDAAmD;IACnD,8DAA8D;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAA;IACxG,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,IAAI,EAAE,CAAC,CAAA;IAClH,CAAC;IAED,yDAAyD;IACzD,8DAA8D;IAC9D,yEAAyE;IACzE,+DAA+D;IAC/D,yDAAyD;IACzD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,+CAA+C,EAAE,0BAA0B,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,CAAA;IAC/I,6BAA6B;IAC7B,MAAM,MAAM,GAAG;QACb,IAAI,MAAM,4CAA4C,UAAU,MAAM,KAAK,IAAI;QAC/E,IAAI,KAAK,kDAAkD;KAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACZ,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,CAAA;IACrD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,YAAY,GAAG;wRACiQ,CAAA;IACtR,MAAM,IAAI,GAAG;6NAC8M,CAAA;IAE3N,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,qBAAqB,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;QAC7D,aAAa,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7C,kBAAkB,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;KACvD,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAgB,CAAA;AACrG,CAAC;AAED,8DAA8D;AAC9D,SAAS,gBAAgB,CAAC,OAAsB,EAAE,IAAc,EAAE,KAAa,EAAE,WAAqB;IACpG,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,8CAA8C;QAC9C,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,wBAAwB,CAAC,CAAA;IACpE,CAAC;IACD,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,OAAM;QACnB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACnD,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QAC3E,CAAC;QACD,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QAChH,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK;YACtB,CAAC,CAAC,8BAA8B,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC,mBAAmB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB;YAC1G,CAAC,CAAC,EAAE,CAAA;QACN,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,QAAQ,mBAAmB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAA;QAC1M,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IACF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,gCAAgC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IACvG,OAAO,gBAAgB,QAAQ,wFAAwF,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAA;AAC5M,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACrG,CAAC;AAED,SAAS,QAAQ,CAAC,CAAoC;IACpD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACpG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAsB,EACtB,MAAoB,EACpB,IAAoB;IAEpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE3E,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAA;IAC7B,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,CAAA;IAC5D,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAElC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAK,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAChI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;QACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAA;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9E,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAChD,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;YACzE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;YACxB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA;QACpB,CAAC;QACD,OAAO,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,YAAY,GAAiB,EAAE,CAAA;QACrC,MAAM,WAAW,GAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;gBACxJ,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;gBACjE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YACxI,CAAC;YACD,OAAO;gBACL,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5G,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxE,CAAA;QACH,CAAC,CAAC,CAAA;QACF,IAAI,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACtD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;YAC7D,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QAC/E,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAsB,EACtB,MAAoB,EACpB,IAAoB;IAEpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE3E,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAA;IAE7B,oDAAoD;IACpD,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IAED,0DAA0D;IAC1D,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAElC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,+CAA+C;QAC/C,MAAM,KAAK,GAAkB,EAAE,CAAA;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,SAAQ,CAAC,8BAA8B;YACpD,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAC7F,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;QACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAA;QACxC,gDAAgD;QAChD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACnD,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,IAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACpD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,IAAK,CAAC,OAAO,EAAE,CAAA;QACtC,CAAC,CAAC,CAAA;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9E,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAChD,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,GAAG,GAAG,CAAC,CAAA;QACX,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;YACzE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;YACxB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA;QACpB,CAAC;QACD,OAAO,sBAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,uDAAuD;QACvD,sDAAsD;QACtD,iCAAiC;QACjC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,EAAmB,CAAA;QAC/E,MAAM,YAAY,GAAiB,EAAE,CAAA;QACrC,MAAM,WAAW,GAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACvD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;gBACxJ,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;gBACjE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YACxI,CAAC;YACD,OAAO;gBACL,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5G,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxE,CAAA;QACH,CAAC,CAAC,CAAA;QACF,IAAI,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACtD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC5D,CAAC;QACD,sCAAsC;QACtC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;YAC7D,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACrD,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;QACrD,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA8B,EAAE,MAAoB;IACnF,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACjC,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAA;IAE5E,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACnD,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QACnB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3D,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAgB,CAAA;QAC3C,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;IACP,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC","sourcesContent":["/**\n * exportModel — 统一导出入口(unit-system §10.6 二 / R11 / 裁决 J)\n *\n * 单一真源:坐标单位换算与文件单位声明由**同一次换算**产出(§10.3 规则 3),\n * 声明与坐标必须同源。CLI(writeOutput)与宿主(3d_editor)共用本入口。\n *\n * 格式分派(§10.6 表):\n * - stl:坐标缩放到 unit 刻度,无声明(格式不支持)。\n * - step:预缩放 + 文本层只改写单位实体(§10.3 规则 3a;OCCT 恒写\n * SI_UNIT(.MILLI.,.METRE.),坐标预先缩放到目标刻度后声明必须跟上)。\n * - 3mf:坐标缩放到 unit 刻度 + <model unit> 与坐标同源;yard 不在 3MF\n * 枚举 → 成对回落到 mm(§10.3 规则 2)。\n *\n * 红线(§10.3 3a):绝不文本级改坐标 — 坐标只在几何层缩放,文本层只碰单位实体。\n */\n\nimport { buildStlBufferFromMesh } from './stl'\nimport { writeZipEntries } from '../../io/zip'\nimport { UNIT_SCALE, type UnitName } from '../../units'\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getBrepApi } from '../handle-bridge'\nimport { exportStepFromSolids, type StepExportEntry } from './step'\nimport { detectStepUnit, STEP_UNIT_SCAN_PREFIX } from '../../mesh/io'\n\n/** 导出条目:一个 part 的几何来源。精确 BREP 与三角网格二选一,solid 优先。 */\nexport interface ExportEntry {\n /** 精确 BREP 句柄(来自 brep 链,导出 ADVANCED_FACE)。 */\n solid?: BrepHandle\n /** 三角网格(基准单位刻度;调用方只做世界变换烘焙,不做单位缩放)。 */\n mesh?: { positions: Float32Array; indices: Uint32Array }\n /** 实体名(写 STEP PRODUCT 名 / 3MF <object name>)。 */\n name?: string\n /** sRGB 0..1 颜色(STEP 走 XCAF COLOUR_RGB,3MF 走 basematerials)。 */\n color?: readonly [number, number, number]\n}\n\n/** Output formats supported by the unified {@link exportModel} entry. */\nexport type ExportFormat = 'stl' | 'step' | '3mf'\n\n/**\n * Options controlling {@link exportModel}/{@link exportModelSync} output\n * (unit-system §10.3): the declared target unit and optional 3MF print config.\n */\nexport interface ExportOptions {\n /**\n * 目标长度单位。缺省 'mm'。语义是「文件里声明的单位」——\n * 实现负责把坐标换算到该单位刻度并与声明成对写出(§10.3)。\n */\n unit?: UnitName\n /** 3MF 打印配置(可选,原样进 model 层)。 */\n printConfig?: unknown\n}\n\n/** UnitName → 3MF <model unit> 枚举全名(唯一真源;yard 无对应值)。 */\nexport const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter'>> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n micron: 'micron',\n inch: 'inch',\n foot: 'foot',\n // yard 无 3MF 枚举值 — 调用方必须先成对回落到 mm(§10.3 规则 2)。\n}\n\n/** 缩放 Float32 positions 到目标单位刻度(基准值 ÷ unitScale(unit))。 */\nfunction scalePositions(positions: Float32Array, scale: number): Float32Array {\n if (scale === 1) return positions\n const out = new Float32Array(positions.length)\n for (let i = 0; i < positions.length; i++) out[i] = positions[i] * scale\n return out\n}\n\n/** STEP 单位声明改写:SI_UNIT(.MILLI.,.METRE.) → 目标单位实体(只碰单位实体,红线)。 */\nfunction rewriteStepUnitEntities(stepText: string, unit: UnitName): string {\n // mm 是 OCCT 的原生写出形态,无需改写。\n if (unit === 'mm') return stepText\n\n // SI 面积/体积单位实体的前缀同样要跟着换(LENGTH/AREA/VOLUME 挂同一前缀链),\n // 但坐标已缩放 → 只需把 LENGTH 链上的前缀换掉;面积/体积单位在 STEP 里由\n // SI_UNIT 前缀 + 幂次表达,XCAF 写出的实体形态是 SI_UNIT(.MILLI.,.METRE.)\n // 挂在长度、平方与立方三条依赖链上。为保守起见只改写显式 LENGTH_UNIT 链上的\n // SI_UNIT —— 具体做法:全局替换 SI_UNIT 前缀(同一文件里坐标相关单位恒为\n // 长度链;角度 SI_UNIT(.RADIAN.) 不含 METRE 不会被命中)。\n let out = stepText\n\n if (unit === 'cm' || unit === 'm' || unit === 'micron') {\n const prefix = unit === 'cm' ? '.CENTI.' : unit === 'm' ? '$' : '.MICRO.'\n // OCCT 写出恒为 SI_UNIT(.MILLI.,.METRE.)(实测);$ 前缀形态(无前缀=米)\n // 在 OCCT 输出中不会出现,但容错处理(若上游将来变化)。\n out = out.replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/g,\n prefix === '$' ? 'SI_UNIT($,.METRE.)' : `SI_UNIT(${prefix},.METRE.)`)\n return out\n }\n\n // inch / foot:CONVERSION_BASED_UNIT 形态。需要注入换算因子实体并替换\n // LENGTH_UNIT 依赖。最简形态:把 SI_UNIT(.MILLI.,.METRE.) 替换为\n // CONVERSION_BASED_UNIT('INCH', #factor),并附加 MEASURE_WITH_UNIT 实体。\n // 实体编号:取文件内最大 #n + 1、+2(附加实体挂在文件尾部 DATA 段内合法)。\n const inchFactor = unit === 'inch' ? 25.4 : 304.8\n const name = unit === 'inch' ? 'INCH' : 'FOOT'\n\n // 1) 收集现有最大实体编号\n let maxId = 0\n for (const m of out.matchAll(/#(\\d+)\\s*=/g)) {\n const id = Number(m[1])\n if (id > maxId) maxId = id\n }\n const lenId = maxId + 1\n const convId = maxId + 2\n\n // 2) 找到 LENGTH_UNIT() 里挂 SI_UNIT 的实体行,替换为 CONVERSION_BASED_UNIT\n // 并把 SI_UNIT 挂到 LENGTH_MEASURE 上。OCCT 输出形态(实测):\n // #n=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n const siLine = out.match(/#(\\d+)\\s*=\\s*\\([^)]*SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)[^)]*\\)\\s*;/)\n if (!siLine) {\n throw new Error(`[export/step] no SI_UNIT(.MILLI.,.METRE.) entity found; cannot rewrite declaration to ${name}`)\n }\n\n // 3) 替换原 SI_UNIT 实体为 CONVERSION_BASED_UNIT,插入换算因子与基准米实体:\n // #si=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n // → #si=(LENGTH_UNIT()NAMED_UNIT(*)CONVERSION_BASED_UNIT('INCH',#conv));\n // #conv=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#len);\n // #len=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));\n out = out.replace(siLine[0], siLine[0].replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/, `CONVERSION_BASED_UNIT('${name}',#${convId})`))\n // 在 DATA 段结束前(ENDSEC;)插入新实体。\n const insert = [\n `#${convId}=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(${inchFactor}),#${lenId});`,\n `#${lenId}=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));`,\n ].join('\\n')\n out = out.replace(/ENDSEC\\s*;/, `${insert}\\nENDSEC;`)\n return out\n}\n\n/** 3MF写出:最小 ZIP 容器(deflate),落 3D/3dmodel.model + [Content_Types].xml + _rels。 */\nfunction build3mfBuffer(modelXml: string): ArrayBuffer {\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"/></Types>`\n const rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\"/></Relationships>`\n\n const zipped = writeZipEntries({\n '[Content_Types].xml': new TextEncoder().encode(contentTypes),\n '_rels/.rels': new TextEncoder().encode(rels),\n '3D/3dmodel.model': new TextEncoder().encode(modelXml),\n })\n return zipped.buffer.slice(zipped.byteOffset, zipped.byteOffset + zipped.byteLength) as ArrayBuffer\n}\n\n/** 组 3MF <model> XML:单位声明与坐标由同一 scale 变量产出(同源,§10.3 规则 3)。 */\nfunction build3mfModelXml(entries: ExportEntry[], unit: UnitName, scale: number, printConfig?: unknown): string {\n const unitAttr = UNIT_NAME_TO_3MF[unit]\n if (!unitAttr) {\n // 调用方(exportModel)保证 unit 已成对回落;直接到这里 = 内部错误。\n throw new Error(`[export/3mf] unit ${unit} has no 3MF enum value`)\n }\n const objs: string[] = []\n const items: string[] = []\n entries.forEach((e, i) => {\n if (!e.mesh) return\n const pos = scalePositions(e.mesh.positions, scale)\n const verts: string[] = []\n for (let v = 0; v < pos.length; v += 3) {\n verts.push(`<vertex x=\"${pos[v]}\" y=\"${pos[v + 1]}\" z=\"${pos[v + 2]}\"/>`)\n }\n const tris: string[] = []\n for (let t = 0; t < e.mesh.indices.length; t += 3) {\n tris.push(`<triangle v1=\"${e.mesh.indices[t]}\" v2=\"${e.mesh.indices[t + 1]}\" v3=\"${e.mesh.indices[t + 2]}\"/>`)\n }\n const colorXml = e.color\n ? `<basematerials><base name=\"${e.name ?? 'p' + i}\" displaycolor=\"${hexColor(e.color)}\"/></basematerials>`\n : ''\n objs.push(`<object id=\"${i + 1}\" type=\"model\" name=\"${xmlAttr(e.name ?? `part${i + 1}`)}\">${colorXml}<mesh><vertices>${verts.join('')}</vertices><triangles>${tris.join('')}</triangles></mesh></object>`)\n items.push(`<item objectid=\"${i + 1}\"/>`)\n })\n const pc = printConfig ? `<metadata name=\"printConfig\">${xmlAttr(String(printConfig))}</metadata>` : ''\n return `<model unit=\"${unitAttr}\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">${pc}<resources>${objs.join('')}</resources><build>${items.join('')}</build></model>`\n}\n\nfunction xmlAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\nfunction hexColor(c: readonly [number, number, number]): string {\n const h = (v: number) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')\n return `#${h(c[0])}${h(c[1])}${h(c[2])}FF`\n}\n\n/**\n * Synchronous twin of {@link exportModel} for hosts already holding a live\n * kernel (CLI, in-process consumers). Same invariants: declared unit ==\n * written coordinate scale. Only 'stl' / 'step' (3mf is also sync but is\n * routed through the same code path below).\n *\n * @param entries - the shapes to export (BREP solids preferred, mesh fallback).\n * @param format - output format: 'stl' | 'step' | '3mf'.\n * @param opts - optional target unit and 3MF print config.\n * @returns the serialized file bytes (ArrayBuffer).\n */\nexport function exportModelSync(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): ArrayBuffer {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) unit = 'mm'\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n const bufs = entries.filter((e) => e.mesh).map((e) => ({ pos: scalePositions(e.mesh!.positions, scale), idx: e.mesh!.indices }))\n if (bufs.length === 0) throw new Error('[export/stl] no mesh entries')\n if (bufs.length === 1) return buildStlBufferFromMesh(bufs[0]!.pos, bufs[0]!.idx)\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n const kernel = getBrepApi()\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n let buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n if (unit !== 'mm') {\n const text = new TextDecoder().decode(new Uint8Array(buffer))\n buffer = new TextEncoder().encode(rewriteStepUnitEntities(text, unit)).buffer\n }\n return buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 统一导出入口:按 format 分派到各写出器。\n * **内部不变式:写出的坐标刻度 == 文件声明的单位。** 这是本 API 存在的唯一理由。\n * @param entries - 待导出的几何条目(BREP solid 优先,缺则走 mesh)。\n * @param format - 输出格式:'stl' | 'step' | '3mf'。\n * @param opts - 可选的目标单位与 3MF 打印配置。\n * @returns 文件字节\n * @throws 目标单位该格式不支持且无法回落时(不静默降级)\n */\nexport async function exportModel(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): Promise<ArrayBuffer> {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n\n // 3MF 枚举回落(§10.3 规则 2):yard 不在枚举 → 成对回落到 mm(坐标+声明)。\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) {\n unit = 'mm'\n }\n\n // scale = 基准值 → 目标单位刻度(fromBase(1, unit, 'length') 的表实现)。\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n // STL 无声明:坐标按 unit 刻度写出,调用方保证 unit 语义(当前文档单位)。\n const parts: ArrayBuffer[] = []\n for (const e of entries) {\n if (!e.mesh) continue // STL 只吃 mesh;solid 条目由宿主先三角化\n parts.push(buildStlBufferFromMesh(scalePositions(e.mesh.positions, scale), e.mesh.indices))\n }\n if (parts.length === 0) throw new Error('[export/stl] no mesh entries')\n if (parts.length === 1) return parts[0]!\n // 多 mesh:合并顶点后再写(binary STL 无对象概念,多实体合一个 soup)。\n const bufs = entries.filter((e) => e.mesh).map((e) => {\n const pos = scalePositions(e.mesh!.positions, scale)\n return { pos, idx: e.mesh!.indices }\n })\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n // 同一 scale 变量喂两类条目(§10.3 规则 7,修 E4):mesh 缩放 positions,\n // solid 用 owned copy 做 kernel.scale —— 不释放调用方缓存里的原句柄。\n // 先过门禁再取内核(同同步分支:拒绝理由与引擎装配状态无关)。\n const kernel = (await import('../handle-bridge')).getBrepApi() as BrepEngineApi\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n let buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换单位实体(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n if (unit !== 'mm') {\n const text = new TextDecoder().decode(new Uint8Array(buffer))\n const rewritten = rewriteStepUnitEntities(text, unit)\n buffer = new TextEncoder().encode(rewritten).buffer\n }\n return buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 导出后回读声明单位(自检与验收用;与 detectStepUnit 互为对偶)。\n * @param data - the exported file bytes (ArrayBuffer or decoded Uint8Array).\n * @param format - the format the bytes were produced in.\n * @returns the declared unit, or null when the format cannot declare one (STL)\n * or the declaration cannot be parsed.\n */\nexport function readDeclaredUnit(data: ArrayBuffer | Uint8Array, format: ExportFormat): UnitName | null {\n if (format === 'stl') return null\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n const text = new TextDecoder().decode(bytes).slice(0, STEP_UNIT_SCAN_PREFIX)\n\n if (format === '3mf') {\n const m = text.match(/<model[^>]*\\sunit=\"([^\"]+)\"/)\n if (!m) return null\n for (const [name, val] of Object.entries(UNIT_NAME_TO_3MF)) {\n if (val === m[1]) return name as UnitName\n }\n return null\n }\n\n // step\n return detectStepUnit(text)\n}\n"]}
|
|
@@ -168,7 +168,7 @@ export declare function scaleWithHashEvolution(kernel: BrepEngineApi, shape: Bre
|
|
|
168
168
|
evolution: HashEvolution;
|
|
169
169
|
};
|
|
170
170
|
/**
|
|
171
|
-
* 双输入布尔 + roleTable 合流组合封装(§3.4,
|
|
171
|
+
* 双输入布尔 + roleTable 合流组合封装(§3.4,api boolean 链式调用用)。
|
|
172
172
|
*
|
|
173
173
|
* 一次 *WithHistory 内核调用同时产出:
|
|
174
174
|
* - result:结果实体
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-evolution.d.ts","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"face-evolution.d.ts","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -231,7 +231,7 @@ export function scaleWithHashEvolution(kernel, shape, center, factor) {
|
|
|
231
231
|
return { result: evo.result, evolution: decodeHashEvolution(evo) };
|
|
232
232
|
}
|
|
233
233
|
/**
|
|
234
|
-
* 双输入布尔 + roleTable 合流组合封装(§3.4,
|
|
234
|
+
* 双输入布尔 + roleTable 合流组合封装(§3.4,api boolean 链式调用用)。
|
|
235
235
|
*
|
|
236
236
|
* 一次 *WithHistory 内核调用同时产出:
|
|
237
237
|
* - result:结果实体
|
|
@@ -266,6 +266,25 @@ export function booleanWithRoleTable(kernel, op, a, b, tableA, tableB, outStmt)
|
|
|
266
266
|
const hashesB = getFaceHashes(kernel, b);
|
|
267
267
|
const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB);
|
|
268
268
|
const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outStmt);
|
|
269
|
+
// G 组(2026-10-03,Flapper LHS 语料):fuse 的接缝面(两半挤出 union 时
|
|
270
|
+
// 共享平面被 BOP 重建的面)既不属于 A 也不属于 B 的血缘,merge 后无 role —
|
|
271
|
+
// 下游 edgeRef/fillet 查邻面时报 "no role lineage"(face-evolution 注释里
|
|
272
|
+
// 一直挂着的 "seam faces are a Phase 4+ concern" 正是本盲区)。把不属于任何
|
|
273
|
+
// 已知血缘的结果面登记为新 origin(本次语句)的 `seam` 角色——血缘真实
|
|
274
|
+
// (该面确实诞生于本次布尔),不是伪造映射。
|
|
275
|
+
if (op === 'fuse') {
|
|
276
|
+
const covered = new Set();
|
|
277
|
+
for (const roles of merged.values()) {
|
|
278
|
+
for (const hs of roles.values()) {
|
|
279
|
+
for (const h of hs)
|
|
280
|
+
covered.add(h);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const seamHashes = getFaceHashes(kernel, evo.result).filter((h) => !covered.has(h));
|
|
284
|
+
if (seamHashes.length > 0) {
|
|
285
|
+
merged.set(outStmt, new Map([['seam', seamHashes]]));
|
|
286
|
+
}
|
|
287
|
+
}
|
|
269
288
|
return { result: evo.result, faceEvolution, roleTable: merged };
|
|
270
289
|
}
|
|
271
290
|
/** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-evolution.js","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 面演化(face evolution)工具:hash 映射 ↔ ordinal 映射转换\n *\n * @platform occt — 本文件 import occt-kernel(translateWithHashEvolution /\n * scaleWithHashEvolution / directEditWithRoleTable(chamfer 分支) 走 occt-only\n * `*WithHistory` 原生面,D3)。文件级标注满足守卫①(平台 import 自证身份);\n * 文件内的**中立函数**(getFaceHashes/decodeEvolution/booleanWithRoleTable/\n * identityHashEvolution 等只用 L1 BrepEngineApi)不因标注改变函数级中立性——\n * 调用它们的**中立 op**(rotate_euler/scale3d/fillet/boolean 等)不声明 engines,\n * 运行时不拦截(与 replicate.ts 同口径)。\n *\n * See docs/api-contract.md §11 (topology contract) for face evolution context.\n *\n * occt-wasm 的 *WithHistory API 返回 BrepEvolutionData,其中 modified/generated\n * 用面 hash(内存指针哈希)编码。本模块将其解码为 ordinal 映射(面枚举序号),\n * 可安全持久化进 faijs 文本。\n *\n * 核心原理(分析文档 §4.4):\n * getSubShapes(shape,'face')[i] ↔ subShapeHashes(shape,'face',B)[i] 一一对应\n * 因此可以把 hash 映射无损转换为 ordinal 映射。\n */\n\nimport type { BrepHandle, BrepEvolutionData } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../occt-kernel/occtKernel'\n\n/** hash 上界(与 occt-wasm kernel.cpp 一致:`% 2147483647`) */\nexport const HASH_UPPER_BOUND = 2147483647\n\n/**\n * 面演化映射:输入面 ordinal → 输出面 ordinal 列表\n *\n * - 1→1:面被修改但未被切割(如面带孔仍是单面)\n * - 1→N:面被切割成多个面\n * - 不在 map 中:面未被修改或被删除\n */\nexport type FaceEvolution = Map<number, number[]>\n\n/**\n * Collect the hash list of all faces of a shape (via subShapeHashes; efficient, no handles allocated).\n * @param kernel - the OCCT kernel.\n * @param shape - the shape whose face hashes to collect.\n * @returns the array of face hashes.\n */\nexport function getFaceHashes(kernel: BrepEngineApi, shape: BrepHandle): number[] {\n return Array.from(kernel.subShapeHashes(shape, 'face', HASH_UPPER_BOUND))\n}\n\n/**\n * Collect the union of face hashes of two shapes (for WithHistory calls of binary boolean operations).\n *\n * Analysis doc §4.2: fuse/cut/intersect must pass subShapeHashes(A) ∪ subShapeHashes(B)\n * to track both inputs' face evolution.\n * @param kernel - the OCCT kernel.\n * @param shapeA - the first input shape.\n * @param shapeB - the second input shape.\n * @returns the union of the two shapes' face hashes.\n */\nexport function getUnionFaceHashes(\n kernel: BrepEngineApi,\n shapeA: BrepHandle,\n shapeB: BrepHandle,\n): number[] {\n const hashesA = getFaceHashes(kernel, shapeA)\n const hashesB = getFaceHashes(kernel, shapeB)\n return [...new Set([...hashesA, ...hashesB])]\n}\n\n/**\n * 解码 BrepEvolutionData 的 modified 数组为 ordinal 映射。\n *\n * modified 分段编码格式:[inputHash, count, outHash1, outHash2, ...] × N\n *\n * @param kernel the OCCT kernel.\n * @param evo the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape the input shape (for the input face hash → ordinal mapping).\n * @param resultShape the result shape (for the output face hash → ordinal mapping).\n * @returns the FaceEvolution: inOrdinal → outOrdinal[].\n */\nexport function decodeEvolution(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): FaceEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n\n // 构建 hash → ordinal 查找表\n const resultHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < resultHashes.length; i++) {\n resultHashToOrdinal.set(resultHashes[i], i)\n }\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n // 解码 modified 数组\n const evolution: FaceEvolution = new Map()\n const modified = evo.modified\n let idx = 0\n while (idx < modified.length) {\n const inHash = modified[idx]\n const count = modified[idx + 1]\n const outOrdinals: number[] = []\n for (let j = 0; j < count; j++) {\n const outHash = modified[idx + 2 + j]\n const outOrdinal = resultHashToOrdinal.get(outHash)\n if (outOrdinal !== undefined) {\n outOrdinals.push(outOrdinal)\n }\n }\n const inOrdinal = inputHashToOrdinal.get(inHash)\n if (inOrdinal !== undefined) {\n evolution.set(inOrdinal, outOrdinals)\n }\n idx += 2 + count\n }\n\n return evolution\n}\n\n\n/**\n * Hash 键面演化:输入面 hash → 输出面 hash 列表(1→多分裂时多个)。\n *\n * 与序号键 FaceEvolution 并列、同源(同一次 *WithHistory 打包结果解出),\n * 一个供 role 传播(hash 键)、一个供选择器/文本(序号键),零额外 wasm 调用。\n */\nexport interface HashEvolution {\n /** 输入面 hash → 输出面 hash 列表(1→多分裂时多个)。 */\n readonly modified: ReadonlyMap<number, readonly number[]>\n /** 输入面中已不存在的面 hash。 */\n readonly deleted: ReadonlySet<number>\n}\n\n/**\n * 把 BrepEvolutionData 解码为 hash 键演化(§2.4)。\n *\n * modified 分段编码格式:[inHash, count, outHash1, ...] × N —— 本身就是\n * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要\n * getSubShapes 逐句柄 hashCode,也不分配任何句柄。\n *\n * generated 刻意不进 role 传播。**实测依据(2026-09-22,`brep/engine/phase0-kernel-probes.test.ts`)**:\n * `generated` 与 `modified` **同构分段、键集相同**,其值是各输入面派生出的**中间形**——\n * `cut` 实测 12 个 hash、结果里 **0 个存活**(`fillet`/`fuse` 里整个桶为空)。\n * ⇒ 新造面**不能**由 `generated` 定位,只能由\"三类命运\"的补集判定\n * (既不在输入 hash 集合、也不在任何 `modified` 输出里),再交 `construct`/派生词汇命名。\n *\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @returns the hash-keyed evolution.\n */\nexport function decodeHashEvolution(evo: BrepEvolutionData): HashEvolution {\n const modified = new Map<number, number[]>()\n const m = evo.modified\n let idx = 0\n while (idx < m.length) {\n const inHash = m[idx]\n const count = m[idx + 1]\n const outHashes: number[] = []\n for (let j = 0; j < count; j++) {\n outHashes.push(m[idx + 2 + j])\n }\n modified.set(inHash, outHashes)\n idx += 2 + count\n }\n return { modified, deleted: new Set(evo.deleted) }\n}\n\n/**\n * 把一次双输入布尔(cut/fuse/intersect)的打包演化按「inHash 属于 A 还是 B」\n * 拆成 A、B 两张 hash 演化(§3.4 布尔合流,faijs 对 brepjs 的必要扩展)。\n *\n * 现有 *WithHistoryBrep 包装只用 getUnionFaceHashes 传入 A∪B 两边 hash、且只对\n * 基体 a 解码序号演化。本函数对同一份 evo 零额外内核调用:用 subShapeHashes(a)\n * / subShapeHashes(b) 两个集合判定每个 inHash 的归属,各自传播各自的 role 表。\n *\n * @param evo - the BrepEvolutionData (from a binary boolean *WithHistory API).\n * @param hashesA - the face hashes of input A (target), via subShapeHashes.\n * @param hashesB - the face hashes of input B (tool), via subShapeHashes.\n * @returns the A/B split hash evolutions (faces from neither input are dropped).\n */\nexport function splitHashEvolutionByOrigin(\n evo: BrepEvolutionData,\n hashesA: readonly number[],\n hashesB: readonly number[],\n): { a: HashEvolution; b: HashEvolution } {\n const raw = decodeHashEvolution(evo)\n const setA = new Set(hashesA)\n const setB = new Set(hashesB)\n\n const aModified = new Map<number, number[]>()\n const bModified = new Map<number, number[]>()\n for (const [inHash, outs] of raw.modified) {\n if (setA.has(inHash)) aModified.set(inHash, [...outs])\n else if (setB.has(inHash)) bModified.set(inHash, [...outs])\n }\n\n const aDeleted = new Set<number>()\n const bDeleted = new Set<number>()\n for (const h of raw.deleted) {\n if (setA.has(h)) aDeleted.add(h)\n else if (setB.has(h)) bDeleted.add(h)\n }\n\n return { a: { modified: aModified, deleted: aDeleted }, b: { modified: bModified, deleted: bDeleted } }\n}\n\n/**\n * 构造 hash 键恒等演化:输入第 i 面 hash → 输出第 i 面 hash(按枚举序号对齐)。\n *\n * ⚠️ **Phase 0.3 后本函数只用于「内核无 `*WithHistory` 可表达」的 4 个 op**:\n *\n * | op | 为什么不能走权威映射 |\n * |---|---|\n * | `rotate_euler` | 任意欧拉角 + pivot;内核只有**单轴** `rotateWithHistory` |\n * | `scale3d` | 非等比;`generalTransform` 无历史(`scaleWithHistory` 只收均匀 factor) |\n * | `copy` | 深拷贝;内核无 `copyWithHistory` |\n * | `place` | 任意矩阵 `located`;内核无对应历史 API |\n *\n * `translate` / `scale`(均匀)已改走权威映射(`translateWithHashEvolution` /\n * `scaleWithHashEvolution`),不再经过本函数。\n *\n * ⚠️ **本函数的正确性依赖一个曾经未被验证的假设**:刚体变换/深拷贝保持 OCCT 的\n * 面枚举序号。该假设现由 `brep/face-evolution.ordering.test.ts` 实测钉住。\n * 若该测试变红 ⇒ 本函数在这 4 个 op 上会产出**错误的身份映射**,\n * 必须为它们找别的权威来源,**不是**调松测试。\n *\n * @param kernel - the OCCT kernel.\n * @param inputShape - the input shape.\n * @param resultShape - the transformed/copied output shape.\n * @returns the hash identity evolution (modified: in[i] → [out[i]]).\n */\nexport function identityHashEvolution(\n kernel: BrepEngineApi,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): HashEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n const count = Math.min(inputHashes.length, resultHashes.length)\n const modified = new Map<number, number[]>()\n for (let i = 0; i < count; i++) {\n modified.set(inputHashes[i], [resultHashes[i]])\n }\n return { modified, deleted: new Set() }\n}\n\n/**\n * 平移 + **权威**面演化(Phase 0.3):走内核 `translateWithHistory`。\n *\n * 与 `identityHashEvolution` 的区别:这里的 `inHash → outHash[]` 是 OCCT 自己给的,\n * **不依赖**\"枚举序号在变换后保持\"这个此前从未验证的假设(分析文档 §7 第 6 项)。\n * 实测(`brep/engine/evolution-bindings.test.ts`):刚体变换的权威映射为\n * 1:1 全覆盖(`coveredInputs === 面数`、`deleted` 空、`generated` 空)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param d - the translation vector as [dx, dy, dz].\n * @returns the translated handle plus the authority hash evolution.\n */\nexport function translateWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n d: readonly [number, number, number],\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = getOcctKernel().translateWithHistory(shape as unknown as ShapeHandle, d[0], d[1], d[2], inputHashes, HASH_UPPER_BOUND) as unknown as BrepEvolutionData\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 均匀缩放 + **权威**面演化(Phase 0.3):走内核 `scaleWithHistory`。\n *\n * ⚠️ **仅均匀缩放**。非均匀缩放内核无 `*WithHistory`(`generalTransform` 无历史),\n * 故 `scale3d` 无法走本函数——它退回 `identityHashEvolution`,其\"面序保持\"假设\n * 由 `brep/face-evolution.ordering.test.ts` 钉住。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param center - the fixed point of the scaling (not scaled).\n * @param factor - the uniform scale factor.\n * @returns the scaled handle plus the authority hash evolution.\n */\nexport function scaleWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n center: readonly [number, number, number],\n factor: number,\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = getOcctKernel().scaleWithHistory(\n shape as unknown as ShapeHandle,\n { x: center[0], y: center[1], z: center[2] },\n factor,\n inputHashes,\n HASH_UPPER_BOUND,\n ) as unknown as BrepEvolutionData\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 双输入布尔 + roleTable 合流组合封装(§3.4,stdlib boolean 链式调用用)。\n *\n * 一次 *WithHistory 内核调用同时产出:\n * - result:结果实体\n * - faceEvolution:序号键演化(进 faceEvolutionCache,服务选择器/可视化)\n * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)\n *\n * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、\n * 实测 0 存活)。新 origin 一律是**本次语句的 StmtId**(Phase 1.6:不再用 LHS\n * 变量名——PartName 会被改名/复用,StmtId 全局唯一)。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').\n * @param a - the target shape.\n * @param b - the tool shape.\n * @param tableA - the target's role table.\n * @param tableB - the tool's role table.\n * @param outStmt - the boolean statement's StmtId (串形;新 origin for seam faces).\n * @returns the result handle, ordinal evolution and merged role table.\n */\nexport function booleanWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fuse' | 'cut' | 'intersect',\n a: BrepHandle,\n b: BrepHandle,\n tableA: ReadonlyMap<unknown, unknown>,\n tableB: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n let evo: BrepEvolutionData\n if (op === 'fuse') evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else if (op === 'cut') evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n\n // A/B 拆流 → 各自传播 → 合表(§3.4)\n const hashesA = getFaceHashes(kernel, a)\n const hashesB = getFaceHashes(kernel, b)\n const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB)\n const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outStmt)\n\n return { result: evo.result, faceEvolution, roleTable: merged }\n}\n\n/** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */\nfunction mergeRoleTablesLocal(\n tableA: ReadonlyMap<unknown, unknown>,\n evoA: HashEvolution,\n tableB: ReadonlyMap<unknown, unknown>,\n evoB: HashEvolution,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- retained for future boolean generated-face naming\n outPart: string,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, roles] of tableA) {\n result.set(origin, propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoA))\n }\n for (const [origin, roles] of tableB) {\n const existing = result.get(origin) as ReadonlyMap<string, readonly number[]> | undefined\n const advanced = propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoB)\n if (existing) {\n const merged = new Map<string, number[]>()\n for (const [role, hs] of existing) merged.set(role, [...hs])\n for (const [role, hs] of advanced) {\n const prev = merged.get(role)\n merged.set(role, prev ? [...new Set([...prev, ...hs])] : [...hs])\n }\n result.set(origin, merged)\n } else {\n result.set(origin, advanced)\n }\n }\n // 3.6: void outPart removed — boolean seam faces are handled by the \"three fates\"\n // analysis (§4.4): cut has 0 new faces (§7 item 7), fuse seam faces are a Phase 4+ concern.\n // outPart retained for future kernel/byAdjacency on boolean generated faces.\n return result\n}\n\n/** 单 origin 传播(结构等价于 naming/roles.propagateRoles,避免循环依赖)。 */\nfunction propagateOriginRoles(\n roles: ReadonlyMap<string, readonly number[]>,\n evolution: HashEvolution,\n): ReadonlyMap<string, readonly number[]> {\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors: number[] = []\n for (const hash of hashes) {\n if (evolution.deleted.has(hash)) continue\n const modified = evolution.modified.get(hash)\n const targets = modified !== undefined && modified.length > 0 ? modified : [hash]\n for (const h of targets) if (!successors.includes(h)) successors.push(h)\n }\n if (successors.length > 0) updated.set(role, successors)\n }\n return updated\n}\n\n/**\n * Decode a BrepEvolutionData deleted array into the ordinal list of deleted faces.\n * @param kernel - the OCCT kernel.\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape - the input shape (for the hash → ordinal mapping).\n * @returns the array of deleted face ordinals.\n */\nexport function decodeDeleted(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n): number[] {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n const deletedOrdinals: number[] = []\n for (const hash of evo.deleted) {\n const ordinal = inputHashToOrdinal.get(hash)\n if (ordinal !== undefined) {\n deletedOrdinals.push(ordinal)\n }\n }\n return deletedOrdinals\n}\n\n// ─── WithHistory 封装函数 ───\n\n/**\n * cutWithHistory 封装:执行切割并返回结果 + 面演化映射。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns { result: 结果 BrepHandle, faceEvolution: 面演化映射 }\n */\nexport function cutWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * fuseWithHistory wrapper: performs the fuse and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the base shape.\n * @param b - the tool shape to fuse into the base.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function fuseWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * intersectWithHistory wrapper: performs the intersection and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the first input shape.\n * @param b - the second input shape.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function intersectWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n// ─── 变换操作面演化 ───\n\n/**\n * 构造恒等面演化映射(用于 translate/rotate/scale 等不改变拓扑的操作)。\n *\n * 变换操作不改变面的数量和顺序,每个面 ordinal i → [i]。\n * 避免调用 *WithHistory API(rotate/scale 的 WithHistory 签名与现有 Euler/Vec3 参数不兼容)。\n *\n * @param kernel OCCT 内核\n * @param shape 输入形状(用于获取面数量)\n * @returns 恒等 FaceEvolution\n */\nexport function identityEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): FaceEvolution {\n const faceCount = getFaceHashes(kernel, shape).length\n const evolution: FaceEvolution = new Map()\n for (let i = 0; i < faceCount; i++) {\n evolution.set(i, [i])\n }\n return evolution\n}\n\n// ─── directEdit WithHistory 封装(fillet / chamfer:单输入) ───\n\n/**\n * 单输入 directEdit(fillet/chamfer)+ roleTable 传播封装。\n *\n * 与 `booleanWithRoleTable`(双输入)对应:单输入只有一张输入 role 表,\n * 一次 `*WithHistory` 内核调用产出结果 + 面演化,沿 hash 演化推进所有 origin。\n *\n * generated 刻意不进 role 传播(§1.3 事实:generated hash 指向中间形,\n * 实测 0 存活),过渡面的命名由 DerivedFaceTopoRef 在 M2 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the directEdit operation ('fillet' | 'chamfer').\n * @param solid - the input solid (single input, unlike boolean's a/b).\n * @param edgeHandles - the resolved Edge handles to fillet/chamfer.\n * @param radius - the fillet radius or chamfer distance (uniform only).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name (for new origin allocation).\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function directEditWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fillet' | 'chamfer',\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n let evo: BrepEvolutionData\n if (op === 'fillet') {\n evo = kernel.filletWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n } else {\n // chamferWithHistory 是 occt-only(L1 无)→ 平台面 getOcctKernel(D3)。\n // BrepHandle(branded number)与 occt-wasm ShapeHandle 运行时同构,品牌转换\n // 只发生在平台边界。\n evo = getOcctKernel().chamferWithHistory(\n solid as unknown as ShapeHandle,\n edgeHandles as unknown as ShapeHandle[],\n radius,\n inputHashes,\n HASH_UPPER_BOUND,\n ) as unknown as BrepEvolutionData\n }\n\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 3.4: generated face naming — transition faces are neither input faces nor\n // modified outputs (§4.4 \"三类命运\": 原样幸存 / 改型幸存 / 新造).\n // Role format: `gen:<op>:<i>` (i = enumeration order among generated faces).\n // String formatted directly (no import of role-name.ts — avoids circular dep).\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`gen:${op}:${i}`, [generatedHashes[i]!])\n }\n const roleTable = new Map(propagated)\n roleTable.set(outPart, genRoles)\n return { result: evo.result, faceEvolution, roleTable }\n }\n\n return { result: evo.result, faceEvolution, roleTable: propagated }\n}\n\n/**\n * 单输入 directEdit 的便捷别名:fillet。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param radius - the fillet radius (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function filletWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'fillet', solid, edgeHandles, radius, inputRoleTable, outPart)\n}\n\n/**\n * 单输入 directEdit 的便捷别名:chamfer。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param distance - the chamfer distance (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function chamferWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n distance: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'chamfer', solid, edgeHandles, distance, inputRoleTable, outPart)\n}\n\n/**\n * 钻孔 roleTable 传播:底孔(圆柱 cut)产生的新造面 = 孔壁,挂**消费它的那条语句**\n * 的 origin(§7.1:drill 的工具体是 op 内部临时件,无其他用户可见坐标可继承)。\n * 角色形态 `hole:<j>`(j = 新造面枚举序)。沿用 `directEditWithRoleTable` 的\n * 三类命运判定(原样幸存 / 改型幸存 / 新造),新造面才派生命名。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid (the drilled part).\n * @param toolSolid - the drill-bit tool solid (caller-built; released by caller).\n * @param inputRoleTable - the input's role table.\n * @param outStmt - the drilling statement's StmtId (origin for new faces).\n * @returns the result handle, ordinal evolution and role table with `hole:<j>`.\n */\nexport function drillBrepWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n toolSolid: BrepHandle,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n const evo = kernel.cutWithHistory(solid, toolSolid, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 三类命运判定:新造面 = 结果 − 输入 − 改型后继(§4.4)。\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n const roleTable = new Map(propagated)\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`hole:${i}`, [generatedHashes[i]!])\n }\n roleTable.set(outStmt, genRoles)\n }\n return { result: evo.result, faceEvolution, roleTable }\n}\n\n/** 单输入 roleTable 传播(结构等价于 naming/roles.propagateAllOrigins,避免循环依赖)。 */\nfunction propagateAllOriginsLocal(\n roles: ReadonlyMap<unknown, unknown>,\n evolution: HashEvolution,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, originRoles] of roles) {\n result.set(origin, propagateOriginRoles(originRoles as ReadonlyMap<string, readonly number[]>, evolution))\n }\n return result\n}\n"]}
|
|
1
|
+
{"version":3,"file":"face-evolution.js","sourceRoot":"","sources":["../../src/brep/face-evolution.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 面演化(face evolution)工具:hash 映射 ↔ ordinal 映射转换\n *\n * @platform occt — 本文件 import occt-kernel(translateWithHashEvolution /\n * scaleWithHashEvolution / directEditWithRoleTable(chamfer 分支) 走 occt-only\n * `*WithHistory` 原生面,D3)。文件级标注满足守卫①(平台 import 自证身份);\n * 文件内的**中立函数**(getFaceHashes/decodeEvolution/booleanWithRoleTable/\n * identityHashEvolution 等只用 L1 BrepEngineApi)不因标注改变函数级中立性——\n * 调用它们的**中立 op**(rotate_euler/scale3d/fillet/boolean 等)不声明 engines,\n * 运行时不拦截(与 replicate.ts 同口径)。\n *\n * See docs/api-contract.md §11 (topology contract) for face evolution context.\n *\n * occt-wasm 的 *WithHistory API 返回 BrepEvolutionData,其中 modified/generated\n * 用面 hash(内存指针哈希)编码。本模块将其解码为 ordinal 映射(面枚举序号),\n * 可安全持久化进 faijs 文本。\n *\n * 核心原理(分析文档 §4.4):\n * getSubShapes(shape,'face')[i] ↔ subShapeHashes(shape,'face',B)[i] 一一对应\n * 因此可以把 hash 映射无损转换为 ordinal 映射。\n */\n\nimport type { BrepHandle, BrepEvolutionData } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../occt-kernel/occtKernel'\n\n/** hash 上界(与 occt-wasm kernel.cpp 一致:`% 2147483647`) */\nexport const HASH_UPPER_BOUND = 2147483647\n\n/**\n * 面演化映射:输入面 ordinal → 输出面 ordinal 列表\n *\n * - 1→1:面被修改但未被切割(如面带孔仍是单面)\n * - 1→N:面被切割成多个面\n * - 不在 map 中:面未被修改或被删除\n */\nexport type FaceEvolution = Map<number, number[]>\n\n/**\n * Collect the hash list of all faces of a shape (via subShapeHashes; efficient, no handles allocated).\n * @param kernel - the OCCT kernel.\n * @param shape - the shape whose face hashes to collect.\n * @returns the array of face hashes.\n */\nexport function getFaceHashes(kernel: BrepEngineApi, shape: BrepHandle): number[] {\n return Array.from(kernel.subShapeHashes(shape, 'face', HASH_UPPER_BOUND))\n}\n\n/**\n * Collect the union of face hashes of two shapes (for WithHistory calls of binary boolean operations).\n *\n * Analysis doc §4.2: fuse/cut/intersect must pass subShapeHashes(A) ∪ subShapeHashes(B)\n * to track both inputs' face evolution.\n * @param kernel - the OCCT kernel.\n * @param shapeA - the first input shape.\n * @param shapeB - the second input shape.\n * @returns the union of the two shapes' face hashes.\n */\nexport function getUnionFaceHashes(\n kernel: BrepEngineApi,\n shapeA: BrepHandle,\n shapeB: BrepHandle,\n): number[] {\n const hashesA = getFaceHashes(kernel, shapeA)\n const hashesB = getFaceHashes(kernel, shapeB)\n return [...new Set([...hashesA, ...hashesB])]\n}\n\n/**\n * 解码 BrepEvolutionData 的 modified 数组为 ordinal 映射。\n *\n * modified 分段编码格式:[inputHash, count, outHash1, outHash2, ...] × N\n *\n * @param kernel the OCCT kernel.\n * @param evo the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape the input shape (for the input face hash → ordinal mapping).\n * @param resultShape the result shape (for the output face hash → ordinal mapping).\n * @returns the FaceEvolution: inOrdinal → outOrdinal[].\n */\nexport function decodeEvolution(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): FaceEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n\n // 构建 hash → ordinal 查找表\n const resultHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < resultHashes.length; i++) {\n resultHashToOrdinal.set(resultHashes[i], i)\n }\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n // 解码 modified 数组\n const evolution: FaceEvolution = new Map()\n const modified = evo.modified\n let idx = 0\n while (idx < modified.length) {\n const inHash = modified[idx]\n const count = modified[idx + 1]\n const outOrdinals: number[] = []\n for (let j = 0; j < count; j++) {\n const outHash = modified[idx + 2 + j]\n const outOrdinal = resultHashToOrdinal.get(outHash)\n if (outOrdinal !== undefined) {\n outOrdinals.push(outOrdinal)\n }\n }\n const inOrdinal = inputHashToOrdinal.get(inHash)\n if (inOrdinal !== undefined) {\n evolution.set(inOrdinal, outOrdinals)\n }\n idx += 2 + count\n }\n\n return evolution\n}\n\n\n/**\n * Hash 键面演化:输入面 hash → 输出面 hash 列表(1→多分裂时多个)。\n *\n * 与序号键 FaceEvolution 并列、同源(同一次 *WithHistory 打包结果解出),\n * 一个供 role 传播(hash 键)、一个供选择器/文本(序号键),零额外 wasm 调用。\n */\nexport interface HashEvolution {\n /** 输入面 hash → 输出面 hash 列表(1→多分裂时多个)。 */\n readonly modified: ReadonlyMap<number, readonly number[]>\n /** 输入面中已不存在的面 hash。 */\n readonly deleted: ReadonlySet<number>\n}\n\n/**\n * 把 BrepEvolutionData 解码为 hash 键演化(§2.4)。\n *\n * modified 分段编码格式:[inHash, count, outHash1, ...] × N —— 本身就是\n * hash→hash[] 的 1→多映射,直接按同一格式解出 hash 键版本,不需要\n * getSubShapes 逐句柄 hashCode,也不分配任何句柄。\n *\n * generated 刻意不进 role 传播。**实测依据(2026-09-22,`brep/engine/phase0-kernel-probes.test.ts`)**:\n * `generated` 与 `modified` **同构分段、键集相同**,其值是各输入面派生出的**中间形**——\n * `cut` 实测 12 个 hash、结果里 **0 个存活**(`fillet`/`fuse` 里整个桶为空)。\n * ⇒ 新造面**不能**由 `generated` 定位,只能由\"三类命运\"的补集判定\n * (既不在输入 hash 集合、也不在任何 `modified` 输出里),再交 `construct`/派生词汇命名。\n *\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @returns the hash-keyed evolution.\n */\nexport function decodeHashEvolution(evo: BrepEvolutionData): HashEvolution {\n const modified = new Map<number, number[]>()\n const m = evo.modified\n let idx = 0\n while (idx < m.length) {\n const inHash = m[idx]\n const count = m[idx + 1]\n const outHashes: number[] = []\n for (let j = 0; j < count; j++) {\n outHashes.push(m[idx + 2 + j])\n }\n modified.set(inHash, outHashes)\n idx += 2 + count\n }\n return { modified, deleted: new Set(evo.deleted) }\n}\n\n/**\n * 把一次双输入布尔(cut/fuse/intersect)的打包演化按「inHash 属于 A 还是 B」\n * 拆成 A、B 两张 hash 演化(§3.4 布尔合流,faijs 对 brepjs 的必要扩展)。\n *\n * 现有 *WithHistoryBrep 包装只用 getUnionFaceHashes 传入 A∪B 两边 hash、且只对\n * 基体 a 解码序号演化。本函数对同一份 evo 零额外内核调用:用 subShapeHashes(a)\n * / subShapeHashes(b) 两个集合判定每个 inHash 的归属,各自传播各自的 role 表。\n *\n * @param evo - the BrepEvolutionData (from a binary boolean *WithHistory API).\n * @param hashesA - the face hashes of input A (target), via subShapeHashes.\n * @param hashesB - the face hashes of input B (tool), via subShapeHashes.\n * @returns the A/B split hash evolutions (faces from neither input are dropped).\n */\nexport function splitHashEvolutionByOrigin(\n evo: BrepEvolutionData,\n hashesA: readonly number[],\n hashesB: readonly number[],\n): { a: HashEvolution; b: HashEvolution } {\n const raw = decodeHashEvolution(evo)\n const setA = new Set(hashesA)\n const setB = new Set(hashesB)\n\n const aModified = new Map<number, number[]>()\n const bModified = new Map<number, number[]>()\n for (const [inHash, outs] of raw.modified) {\n if (setA.has(inHash)) aModified.set(inHash, [...outs])\n else if (setB.has(inHash)) bModified.set(inHash, [...outs])\n }\n\n const aDeleted = new Set<number>()\n const bDeleted = new Set<number>()\n for (const h of raw.deleted) {\n if (setA.has(h)) aDeleted.add(h)\n else if (setB.has(h)) bDeleted.add(h)\n }\n\n return { a: { modified: aModified, deleted: aDeleted }, b: { modified: bModified, deleted: bDeleted } }\n}\n\n/**\n * 构造 hash 键恒等演化:输入第 i 面 hash → 输出第 i 面 hash(按枚举序号对齐)。\n *\n * ⚠️ **Phase 0.3 后本函数只用于「内核无 `*WithHistory` 可表达」的 4 个 op**:\n *\n * | op | 为什么不能走权威映射 |\n * |---|---|\n * | `rotate_euler` | 任意欧拉角 + pivot;内核只有**单轴** `rotateWithHistory` |\n * | `scale3d` | 非等比;`generalTransform` 无历史(`scaleWithHistory` 只收均匀 factor) |\n * | `copy` | 深拷贝;内核无 `copyWithHistory` |\n * | `place` | 任意矩阵 `located`;内核无对应历史 API |\n *\n * `translate` / `scale`(均匀)已改走权威映射(`translateWithHashEvolution` /\n * `scaleWithHashEvolution`),不再经过本函数。\n *\n * ⚠️ **本函数的正确性依赖一个曾经未被验证的假设**:刚体变换/深拷贝保持 OCCT 的\n * 面枚举序号。该假设现由 `brep/face-evolution.ordering.test.ts` 实测钉住。\n * 若该测试变红 ⇒ 本函数在这 4 个 op 上会产出**错误的身份映射**,\n * 必须为它们找别的权威来源,**不是**调松测试。\n *\n * @param kernel - the OCCT kernel.\n * @param inputShape - the input shape.\n * @param resultShape - the transformed/copied output shape.\n * @returns the hash identity evolution (modified: in[i] → [out[i]]).\n */\nexport function identityHashEvolution(\n kernel: BrepEngineApi,\n inputShape: BrepHandle,\n resultShape: BrepHandle,\n): HashEvolution {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const resultHashes = getFaceHashes(kernel, resultShape)\n const count = Math.min(inputHashes.length, resultHashes.length)\n const modified = new Map<number, number[]>()\n for (let i = 0; i < count; i++) {\n modified.set(inputHashes[i], [resultHashes[i]])\n }\n return { modified, deleted: new Set() }\n}\n\n/**\n * 平移 + **权威**面演化(Phase 0.3):走内核 `translateWithHistory`。\n *\n * 与 `identityHashEvolution` 的区别:这里的 `inHash → outHash[]` 是 OCCT 自己给的,\n * **不依赖**\"枚举序号在变换后保持\"这个此前从未验证的假设(分析文档 §7 第 6 项)。\n * 实测(`brep/engine/evolution-bindings.test.ts`):刚体变换的权威映射为\n * 1:1 全覆盖(`coveredInputs === 面数`、`deleted` 空、`generated` 空)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param d - the translation vector as [dx, dy, dz].\n * @returns the translated handle plus the authority hash evolution.\n */\nexport function translateWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n d: readonly [number, number, number],\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = getOcctKernel().translateWithHistory(shape as unknown as ShapeHandle, d[0], d[1], d[2], inputHashes, HASH_UPPER_BOUND) as unknown as BrepEvolutionData\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 均匀缩放 + **权威**面演化(Phase 0.3):走内核 `scaleWithHistory`。\n *\n * ⚠️ **仅均匀缩放**。非均匀缩放内核无 `*WithHistory`(`generalTransform` 无历史),\n * 故 `scale3d` 无法走本函数——它退回 `identityHashEvolution`,其\"面序保持\"假设\n * 由 `brep/face-evolution.ordering.test.ts` 钉住。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the input shape.\n * @param center - the fixed point of the scaling (not scaled).\n * @param factor - the uniform scale factor.\n * @returns the scaled handle plus the authority hash evolution.\n */\nexport function scaleWithHashEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n center: readonly [number, number, number],\n factor: number,\n): { result: BrepHandle; evolution: HashEvolution } {\n const inputHashes = getFaceHashes(kernel, shape)\n const evo = getOcctKernel().scaleWithHistory(\n shape as unknown as ShapeHandle,\n { x: center[0], y: center[1], z: center[2] },\n factor,\n inputHashes,\n HASH_UPPER_BOUND,\n ) as unknown as BrepEvolutionData\n return { result: evo.result, evolution: decodeHashEvolution(evo) }\n}\n\n/**\n * 双输入布尔 + roleTable 合流组合封装(§3.4,api boolean 链式调用用)。\n *\n * 一次 *WithHistory 内核调用同时产出:\n * - result:结果实体\n * - faceEvolution:序号键演化(进 faceEvolutionCache,服务选择器/可视化)\n * - roleTable:A/B 两侧 role 表各自传播后合并(进 roleTableCache,服务命名)\n *\n * 缝面(generated)刻意不进 role 传播(§1.3/R2:generated hash 指向中间形、\n * 实测 0 存活)。新 origin 一律是**本次语句的 StmtId**(Phase 1.6:不再用 LHS\n * 变量名——PartName 会被改名/复用,StmtId 全局唯一)。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the boolean operation ('fuse' | 'cut' | 'intersect').\n * @param a - the target shape.\n * @param b - the tool shape.\n * @param tableA - the target's role table.\n * @param tableB - the tool's role table.\n * @param outStmt - the boolean statement's StmtId (串形;新 origin for seam faces).\n * @returns the result handle, ordinal evolution and merged role table.\n */\nexport function booleanWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fuse' | 'cut' | 'intersect',\n a: BrepHandle,\n b: BrepHandle,\n tableA: ReadonlyMap<unknown, unknown>,\n tableB: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n let evo: BrepEvolutionData\n if (op === 'fuse') evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else if (op === 'cut') evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n else evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n\n // A/B 拆流 → 各自传播 → 合表(§3.4)\n const hashesA = getFaceHashes(kernel, a)\n const hashesB = getFaceHashes(kernel, b)\n const { a: evoA, b: evoB } = splitHashEvolutionByOrigin(evo, hashesA, hashesB)\n const merged = mergeRoleTablesLocal(tableA, evoA, tableB, evoB, outStmt)\n\n // G 组(2026-10-03,Flapper LHS 语料):fuse 的接缝面(两半挤出 union 时\n // 共享平面被 BOP 重建的面)既不属于 A 也不属于 B 的血缘,merge 后无 role —\n // 下游 edgeRef/fillet 查邻面时报 \"no role lineage\"(face-evolution 注释里\n // 一直挂着的 \"seam faces are a Phase 4+ concern\" 正是本盲区)。把不属于任何\n // 已知血缘的结果面登记为新 origin(本次语句)的 `seam` 角色——血缘真实\n // (该面确实诞生于本次布尔),不是伪造映射。\n if (op === 'fuse') {\n const covered = new Set<unknown>()\n for (const roles of merged.values()) {\n for (const hs of (roles as ReadonlyMap<string, readonly number[]>).values()) {\n for (const h of hs) covered.add(h)\n }\n }\n const seamHashes = getFaceHashes(kernel, evo.result).filter((h) => !covered.has(h))\n if (seamHashes.length > 0) {\n (merged as Map<unknown, unknown>).set(outStmt, new Map([['seam', seamHashes]]))\n }\n }\n\n return { result: evo.result, faceEvolution, roleTable: merged }\n}\n\n/** 合表(避免 naming/roles 循环依赖:本文件不 import naming,用结构等价实现)。 */\nfunction mergeRoleTablesLocal(\n tableA: ReadonlyMap<unknown, unknown>,\n evoA: HashEvolution,\n tableB: ReadonlyMap<unknown, unknown>,\n evoB: HashEvolution,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- retained for future boolean generated-face naming\n outPart: string,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, roles] of tableA) {\n result.set(origin, propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoA))\n }\n for (const [origin, roles] of tableB) {\n const existing = result.get(origin) as ReadonlyMap<string, readonly number[]> | undefined\n const advanced = propagateOriginRoles(roles as ReadonlyMap<string, readonly number[]>, evoB)\n if (existing) {\n const merged = new Map<string, number[]>()\n for (const [role, hs] of existing) merged.set(role, [...hs])\n for (const [role, hs] of advanced) {\n const prev = merged.get(role)\n merged.set(role, prev ? [...new Set([...prev, ...hs])] : [...hs])\n }\n result.set(origin, merged)\n } else {\n result.set(origin, advanced)\n }\n }\n // 3.6: void outPart removed — boolean seam faces are handled by the \"three fates\"\n // analysis (§4.4): cut has 0 new faces (§7 item 7), fuse seam faces are a Phase 4+ concern.\n // outPart retained for future kernel/byAdjacency on boolean generated faces.\n return result\n}\n\n/** 单 origin 传播(结构等价于 naming/roles.propagateRoles,避免循环依赖)。 */\nfunction propagateOriginRoles(\n roles: ReadonlyMap<string, readonly number[]>,\n evolution: HashEvolution,\n): ReadonlyMap<string, readonly number[]> {\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors: number[] = []\n for (const hash of hashes) {\n if (evolution.deleted.has(hash)) continue\n const modified = evolution.modified.get(hash)\n const targets = modified !== undefined && modified.length > 0 ? modified : [hash]\n for (const h of targets) if (!successors.includes(h)) successors.push(h)\n }\n if (successors.length > 0) updated.set(role, successors)\n }\n return updated\n}\n\n/**\n * Decode a BrepEvolutionData deleted array into the ordinal list of deleted faces.\n * @param kernel - the OCCT kernel.\n * @param evo - the BrepEvolutionData (from a *WithHistory API).\n * @param inputShape - the input shape (for the hash → ordinal mapping).\n * @returns the array of deleted face ordinals.\n */\nexport function decodeDeleted(\n kernel: BrepEngineApi,\n evo: BrepEvolutionData,\n inputShape: BrepHandle,\n): number[] {\n const inputHashes = getFaceHashes(kernel, inputShape)\n const inputHashToOrdinal = new Map<number, number>()\n for (let i = 0; i < inputHashes.length; i++) {\n inputHashToOrdinal.set(inputHashes[i], i)\n }\n\n const deletedOrdinals: number[] = []\n for (const hash of evo.deleted) {\n const ordinal = inputHashToOrdinal.get(hash)\n if (ordinal !== undefined) {\n deletedOrdinals.push(ordinal)\n }\n }\n return deletedOrdinals\n}\n\n// ─── WithHistory 封装函数 ───\n\n/**\n * cutWithHistory 封装:执行切割并返回结果 + 面演化映射。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns { result: 结果 BrepHandle, faceEvolution: 面演化映射 }\n */\nexport function cutWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.cutWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * fuseWithHistory wrapper: performs the fuse and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the base shape.\n * @param b - the tool shape to fuse into the base.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function fuseWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.fuseWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n/**\n * intersectWithHistory wrapper: performs the intersection and returns the result plus the face evolution mapping.\n * @param kernel - the OCCT kernel.\n * @param a - the first input shape.\n * @param b - the second input shape.\n * @returns the result BrepHandle plus the face evolution mapping.\n */\nexport function intersectWithHistoryBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): { result: BrepHandle; faceEvolution: FaceEvolution } {\n const inputHashes = getUnionFaceHashes(kernel, a, b)\n const evo = kernel.intersectWithHistory(a, b, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, a, evo.result)\n return { result: evo.result, faceEvolution }\n}\n\n// ─── 变换操作面演化 ───\n\n/**\n * 构造恒等面演化映射(用于 translate/rotate/scale 等不改变拓扑的操作)。\n *\n * 变换操作不改变面的数量和顺序,每个面 ordinal i → [i]。\n * 避免调用 *WithHistory API(rotate/scale 的 WithHistory 签名与现有 Euler/Vec3 参数不兼容)。\n *\n * @param kernel OCCT 内核\n * @param shape 输入形状(用于获取面数量)\n * @returns 恒等 FaceEvolution\n */\nexport function identityEvolution(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n): FaceEvolution {\n const faceCount = getFaceHashes(kernel, shape).length\n const evolution: FaceEvolution = new Map()\n for (let i = 0; i < faceCount; i++) {\n evolution.set(i, [i])\n }\n return evolution\n}\n\n// ─── directEdit WithHistory 封装(fillet / chamfer:单输入) ───\n\n/**\n * 单输入 directEdit(fillet/chamfer)+ roleTable 传播封装。\n *\n * 与 `booleanWithRoleTable`(双输入)对应:单输入只有一张输入 role 表,\n * 一次 `*WithHistory` 内核调用产出结果 + 面演化,沿 hash 演化推进所有 origin。\n *\n * generated 刻意不进 role 传播(§1.3 事实:generated hash 指向中间形,\n * 实测 0 存活),过渡面的命名由 DerivedFaceTopoRef 在 M2 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param op - the directEdit operation ('fillet' | 'chamfer').\n * @param solid - the input solid (single input, unlike boolean's a/b).\n * @param edgeHandles - the resolved Edge handles to fillet/chamfer.\n * @param radius - the fillet radius or chamfer distance (uniform only).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name (for new origin allocation).\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function directEditWithRoleTable(\n kernel: BrepEngineApi,\n op: 'fillet' | 'chamfer',\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n let evo: BrepEvolutionData\n if (op === 'fillet') {\n evo = kernel.filletWithHistory(solid, edgeHandles, radius, inputHashes, HASH_UPPER_BOUND)\n } else {\n // chamferWithHistory 是 occt-only(L1 无)→ 平台面 getOcctKernel(D3)。\n // BrepHandle(branded number)与 occt-wasm ShapeHandle 运行时同构,品牌转换\n // 只发生在平台边界。\n evo = getOcctKernel().chamferWithHistory(\n solid as unknown as ShapeHandle,\n edgeHandles as unknown as ShapeHandle[],\n radius,\n inputHashes,\n HASH_UPPER_BOUND,\n ) as unknown as BrepEvolutionData\n }\n\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 3.4: generated face naming — transition faces are neither input faces nor\n // modified outputs (§4.4 \"三类命运\": 原样幸存 / 改型幸存 / 新造).\n // Role format: `gen:<op>:<i>` (i = enumeration order among generated faces).\n // String formatted directly (no import of role-name.ts — avoids circular dep).\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`gen:${op}:${i}`, [generatedHashes[i]!])\n }\n const roleTable = new Map(propagated)\n roleTable.set(outPart, genRoles)\n return { result: evo.result, faceEvolution, roleTable }\n }\n\n return { result: evo.result, faceEvolution, roleTable: propagated }\n}\n\n/**\n * 单输入 directEdit 的便捷别名:fillet。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param radius - the fillet radius (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function filletWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n radius: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'fillet', solid, edgeHandles, radius, inputRoleTable, outPart)\n}\n\n/**\n * 单输入 directEdit 的便捷别名:chamfer。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid.\n * @param edgeHandles - the resolved Edge handles.\n * @param distance - the chamfer distance (uniform).\n * @param inputRoleTable - the input's role table.\n * @param outPart - the statement's LHS variable name.\n * @returns the result handle, ordinal evolution and propagated role table.\n */\nexport function chamferWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n edgeHandles: BrepHandle[],\n distance: number,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outPart: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n return directEditWithRoleTable(kernel, 'chamfer', solid, edgeHandles, distance, inputRoleTable, outPart)\n}\n\n/**\n * 钻孔 roleTable 传播:底孔(圆柱 cut)产生的新造面 = 孔壁,挂**消费它的那条语句**\n * 的 origin(§7.1:drill 的工具体是 op 内部临时件,无其他用户可见坐标可继承)。\n * 角色形态 `hole:<j>`(j = 新造面枚举序)。沿用 `directEditWithRoleTable` 的\n * 三类命运判定(原样幸存 / 改型幸存 / 新造),新造面才派生命名。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the input solid (the drilled part).\n * @param toolSolid - the drill-bit tool solid (caller-built; released by caller).\n * @param inputRoleTable - the input's role table.\n * @param outStmt - the drilling statement's StmtId (origin for new faces).\n * @returns the result handle, ordinal evolution and role table with `hole:<j>`.\n */\nexport function drillBrepWithRoleTable(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n toolSolid: BrepHandle,\n inputRoleTable: ReadonlyMap<unknown, unknown>,\n outStmt: string,\n): { result: BrepHandle; faceEvolution: FaceEvolution; roleTable: ReadonlyMap<unknown, unknown> } {\n const inputHashes = getFaceHashes(kernel, solid)\n const evo = kernel.cutWithHistory(solid, toolSolid, inputHashes, HASH_UPPER_BOUND)\n const faceEvolution = decodeEvolution(kernel, evo, solid, evo.result)\n const hashEvo = decodeHashEvolution(evo)\n const propagated = propagateAllOriginsLocal(inputRoleTable, hashEvo)\n\n // 三类命运判定:新造面 = 结果 − 输入 − 改型后继(§4.4)。\n const resultHashes = getFaceHashes(kernel, evo.result)\n const inputHashSet = new Set(inputHashes)\n const modifiedOutputHashes = new Set<number>()\n for (const outs of hashEvo.modified.values()) {\n for (const h of outs) modifiedOutputHashes.add(h)\n }\n const generatedHashes = resultHashes.filter(\n (h) => !inputHashSet.has(h) && !modifiedOutputHashes.has(h),\n )\n\n const roleTable = new Map(propagated)\n if (generatedHashes.length > 0) {\n const genRoles = new Map<string, number[]>()\n for (let i = 0; i < generatedHashes.length; i++) {\n genRoles.set(`hole:${i}`, [generatedHashes[i]!])\n }\n roleTable.set(outStmt, genRoles)\n }\n return { result: evo.result, faceEvolution, roleTable }\n}\n\n/** 单输入 roleTable 传播(结构等价于 naming/roles.propagateAllOrigins,避免循环依赖)。 */\nfunction propagateAllOriginsLocal(\n roles: ReadonlyMap<unknown, unknown>,\n evolution: HashEvolution,\n): ReadonlyMap<unknown, unknown> {\n const result = new Map<unknown, unknown>()\n for (const [origin, originRoles] of roles) {\n result.set(origin, propagateOriginRoles(originRoles as ReadonlyMap<string, readonly number[]>, evolution))\n }\n return result\n}\n"]}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的
|
|
8
8
|
* 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。
|
|
9
9
|
*
|
|
10
|
-
* 依赖约束(硬性):只允许 import `runtime-state`、`
|
|
10
|
+
* 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only
|
|
11
11
|
* `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。
|
|
12
12
|
*/
|
|
13
13
|
import type { Shape } from '../mesh/types.js';
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的
|
|
8
8
|
* 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。
|
|
9
9
|
*
|
|
10
|
-
* 依赖约束(硬性):只允许 import `runtime-state`、`
|
|
10
|
+
* 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only
|
|
11
11
|
* `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。
|
|
12
12
|
*/
|
|
13
13
|
import { getBackends } from '../runtime-state.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;IACH,CAAC;IACD,OAAO,MAAuB,CAAA;AAChC,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAA8B,CAAC,UAAU,KAAK,IAAI,CAAA;AACnG,CAAC;AAED;0CAC0C;AAC1C,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,MAAc;IACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,yDAAyD;YAC/E,kCAAkC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,IAAI;YAC9E,wDAAwD,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,SAAS,EAAoB,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,GAAG;QAC/C,iBAAiB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,OAAO;QACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAA4B,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * handle-bridge — OCCT 句柄 → faijs Shape 的 SDK 桥接(B1)\n *\n *\n * 第三方库要造 BREP 产物,需要\"OCCT handle → mesh\"。`src/brep/brep-ops.ts:17`\n * 有 `import * as THREE from 'three'`,SDK 绝不能 import 它(会把 three 拉进\n * SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的\n * 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。\n *\n * 依赖约束(硬性):只允许 import `runtime-state`、`
|
|
1
|
+
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;IACH,CAAC;IACD,OAAO,MAAuB,CAAA;AAChC,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAA8B,CAAC,UAAU,KAAK,IAAI,CAAA;AACnG,CAAC;AAED;0CAC0C;AAC1C,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,MAAc;IACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,yDAAyD;YAC/E,kCAAkC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,IAAI;YAC9E,wDAAwD,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,SAAS,EAAoB,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,GAAG;QAC/C,iBAAiB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,OAAO;QACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAA4B,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * handle-bridge — OCCT 句柄 → faijs Shape 的 SDK 桥接(B1)\n *\n *\n * 第三方库要造 BREP 产物,需要\"OCCT handle → mesh\"。`src/brep/brep-ops.ts:17`\n * 有 `import * as THREE from 'three'`,SDK 绝不能 import 它(会把 three 拉进\n * SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的\n * 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。\n *\n * 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only\n * `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** 结构化内核接口(不 import occt-wasm,只做结构匹配,避免 heavy 依赖) */\ninterface MeshableKernel {\n meshShape(\n handle: unknown,\n opts: { linearDeflection: number; angularDeflection: number },\n ): { positions: ArrayLike<number>; indices: ArrayLike<number> }\n}\n\n/**\n * Get the currently injected BREP kernel instance (untyped escape hatch).\n * @deprecated D12: this exit predates the engine-neutral L1 surface and its name\n * (\"OCCT kernel\") no longer matches what it returns — the current engine's raw\n * kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,\n * same file) for neutral ops; platform-only code (L2 face) should use\n * `getOcctKernel()` (D3). Kept for vendored-face bridging and existing tests.\n * @returns the current BREP engine's kernel instance.\n * @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.\n */\nexport function getKernel(): unknown {\n const kernel = getBackends().kernel.brep\n if (!kernel) {\n throw new Error('[faijs/bridge] OCCT kernel not available: BREP operations require an initialized kernel')\n }\n return kernel\n}\n\n/**\n * Get the current BREP engine as the **L1 core surface** (`BrepEngineApi`).\n *\n * 2026-09-24 narrowing plan(D12):中立 op 的取内核唯一出口——取代\n * `getBackends().kernel.brep as BrepEngineApi` 的逐点断言。本文件是 L1 契约\n * 的注册点(`registerBrepEngine` 注入的就是 `BrepEngineApi` 实例),此处断言\n * 诚实;平台面(L1 之外的 occt 独有能力)仍走 `getOcctKernel()`(D3)。\n *\n * @returns the current engine's L1 contract surface (`BrepEngineApi`) — typed, engine-neutral.\n * @throws when no BREP engine is registered (uninitialized) — never silently returns null.\n */\nexport function getBrepApi(): BrepEngineApi {\n const kernel = getBackends().kernel.brep\n if (!kernel) {\n throw new Error(\n '[faijs/bridge] BREP engine API not available: BREP operations require an initialized engine',\n )\n }\n return kernel as BrepEngineApi\n}\n\n/**\n * Options controlling how a handle is tessellated.\n */\nexport interface MeshHandleOptions {\n /** linear deflection (mm), default 0.1 — matches the built-in ops (src/brep/brep-ops.ts:27). */\n linearDeflection?: number\n /** angular segment count, default 32 — angularDeflection = 2π / segments. */\n segments?: number\n}\n\n/**\n * OCC 句柄身份契约判别(单一真源)。\n *\n * occt-wasm 的 `handle()` 工厂(vendored occtWasm helpers.ts:25)构造的句柄对象\n * 统一携带 `__occtWasm: true`。本叶子是 faijs 侧唯一允许的判据:\n * define-op 的 `wrapBrepOne` 用它区分\"几何句柄\"与\"纯数据记录\",本文件\n * `fromHandle`/`meshHandle` 入口用它做形态断言。禁止在其他文件硬编码\n * `'__occtWasm' in v` 字符串直查——句柄/数据判定的任何新消费点都必须引用本叶子。\n * @param v - 待判别的值。\n * @returns `true` 当且仅当 `v` 是携带 `__occtWasm: true` 标记的句柄对象。\n */\nexport function isOcctHandle(v: unknown): boolean {\n return typeof v === 'object' && v !== null && (v as { __occtWasm?: unknown }).__occtWasm === true\n}\n\n/** 合法句柄输入:branded numeric id(occt-wasm 的 `ShapeHandle` 运行时形态)或\n * `__occtWasm` 标记对象(`handle()` 工厂产物)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'number' || isOcctHandle(v)\n}\n\n/**\n * 入口形态断言:拒绝把纯数据记录当句柄三角化。\n * 纯数据记录(无 `__occtWasm` 标记的 plain object,如 sheetmetal part 数据)\n * 必须在 SDK 边界被显式拒绝(E_BAD_HANDLE),而不是在 kernel 深处以\n * `OcctError: meshShape: Invalid shape ID 0` 崩溃——define-op 的 wrapBrepOne\n * 已在第一道透传过滤,本断言是第二道防线(防未来未带标记的新句柄形态漏网)。\n */\nfunction requireHandle(handle: unknown, caller: string): void {\n if (!isHandleLike(handle)) {\n throw new Error(\n `[faijs/bridge] ${caller}: E_BAD_HANDLE: expected an OCCT handle (numeric id or ` +\n `__occtWasm-tagged object); got ${handle === null ? 'null' : typeof handle}. ` +\n `Plain data records must not be tessellated as handles.`,\n )\n }\n}\n\n/**\n * Tessellate an OCCT handle into a Shape (without registering a BREP slot).\n * @param handle - the OCCT solid handle to tessellate (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the tessellated Shape.\n */\nexport function meshHandle(handle: unknown, opts?: MeshHandleOptions): Shape {\n requireHandle(handle, 'meshHandle')\n const kernel = getKernel() as MeshableKernel\n const mesh = kernel.meshShape(handle, {\n linearDeflection: opts?.linearDeflection ?? 0.1,\n angularDeflection: (2 * Math.PI) / Math.max(3, opts?.segments ?? 32),\n })\n return {\n positions: new Float32Array(mesh.positions as ArrayLike<number>),\n indices: new Uint32Array(mesh.indices as ArrayLike<number>),\n }\n}\n\n/**\n * Default path (recommended): tessellate + register the BREP slot in one step.\n * Equivalent to meshHandle(h) + fromBrep(sh, { solid: h }).\n * Library authors only fall back to the meshHandle + fromBrep combination when\n * they need custom tessellation precision.\n * @param handle - the OCCT solid handle to bridge (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the registered Shape, as returned by fromBrep.\n */\nexport function fromHandle(handle: unknown, opts?: MeshHandleOptions): ReturnType<typeof fromBrep> {\n requireHandle(handle, 'fromHandle')\n return fromBrep(meshHandle(handle, opts), { solid: handle })\n}\n"]}
|