@faicad/faijs 0.22.2 → 0.29.5
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/appearance.d.ts +138 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +230 -0
- package/dist/api/appearance.js.map +1 -0
- 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 +51 -3
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +6 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +7 -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/meta.d.ts +93 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +99 -0
- package/dist/api/meta.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/api/primitives.js +119 -4
- 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 +50 -26
- 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 +4 -2
- 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 +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +274 -30
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.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 +73 -2
- 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/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +2 -21
- package/dist/lang/metadata-extractor.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 +6 -7
- package/dist/lang/types.d.ts.map +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 +13 -0
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +38 -17
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +41 -6
- package/dist/mesh/primitives.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 +65 -7
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +738 -99
- 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/mesh/types.d.ts +38 -0
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- 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/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +36 -3
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +19 -14
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -32
- 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/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- 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 +108 -5
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +130 -3
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- 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 +19 -3
|
@@ -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"]}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mesh-solid — 网格实体(mesh solid)与其网格后端端口
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 名词边界(方案 §3.1):
|
|
6
|
+
* - **网格实体** = 由网格文件导入、经「规范化」得到的引擎实体。它是**近似拓扑**
|
|
7
|
+
* 的载体,不是精度链的一环;永不进 `brepChain.solidCache`。
|
|
8
|
+
* - **规范化** = `importIndexedMesh` → `weldShellsAndFaces(tol)` → `unifyFaces()`。
|
|
9
|
+
* **顺序不可交换**:先 `unifyFaces` 会把实体做坏(体积归零),防回归用例见
|
|
10
|
+
* `brepkit-kernel/mesh-solid-topology.test.ts`。
|
|
11
|
+
* - **网格后端** = 提供网格实体能力的引擎侧组件(本期即 brepkit 的网格用法)。
|
|
12
|
+
* 与 BREP 引擎**同名不同用**:可能同一个 wasm 实例,但走 mesh 语义路径。
|
|
13
|
+
*
|
|
14
|
+
* 本模块只依赖 L1(`engine/types`、`engine/primitives`)与拓扑构建器;后端实现
|
|
15
|
+
* 放在适配器侧(`brep/engine/adapters/brepkit`),因此本模块自身不含任何内核私有
|
|
16
|
+
* 调用——`MeshSolidKernelOps` 是内核私有原语的端口(L1 契约不含 weld/unify)。
|
|
17
|
+
*/
|
|
18
|
+
import type { BrepHandle, BrepMeshResult } from './engine/types.js';
|
|
19
|
+
import type { BrepEngineApi } from './engine/primitives.js';
|
|
20
|
+
import type { PartName } from '../identity.js';
|
|
21
|
+
import type { SelectorRuntimeData } from '../topology/build-selector-runtime.js';
|
|
22
|
+
/** 网格实体构建的输入网格(已按基准单位折算的坐标,与 `Shape` 同构)。 */
|
|
23
|
+
export interface MeshSolidInput {
|
|
24
|
+
positions: Float32Array;
|
|
25
|
+
indices: Uint32Array;
|
|
26
|
+
}
|
|
27
|
+
/** 规范化选项。 */
|
|
28
|
+
export interface MeshSolidNormalizeOptions {
|
|
29
|
+
/**
|
|
30
|
+
* 焊接容差(顶点/重复边缝合半径)。缺省由包围盒对角线定标
|
|
31
|
+
* (`max(1e-6, 对角线 × 1e-6)`)——**不得写死绝对值**:STL 无单位元数据,
|
|
32
|
+
* 同一文件既可能是 mm 也可能是 inch,绝对容差在两种尺度下必有一边失准。
|
|
33
|
+
*/
|
|
34
|
+
weldTolerance?: number;
|
|
35
|
+
/** 三角化参数(缺省与显示 mesh 一致:0.1 / 2π/32)。 */
|
|
36
|
+
linearDeflection?: number;
|
|
37
|
+
angularDeflection?: number;
|
|
38
|
+
}
|
|
39
|
+
/** 规范化结果:实体句柄 + 其三角化(显示 mesh 与拓扑 mesh 的唯一真源)。 */
|
|
40
|
+
export interface MeshSolidResult {
|
|
41
|
+
/** 规范化后的网格实体句柄。 */
|
|
42
|
+
readonly solid: BrepHandle;
|
|
43
|
+
/**
|
|
44
|
+
* 同一实体的三角化(含 faceGroups)。**显示 mesh 必须用这一份**——规则 1:
|
|
45
|
+
* 拓扑 faceRuns 所索引的三角形,必须就是用户看到的三角形。若显示仍用原始
|
|
46
|
+
* STL 顶点数组、拓扑用实体的重新三角化,两者三角形数/序不一致 → faceRuns 错位。
|
|
47
|
+
*/
|
|
48
|
+
readonly mesh: BrepMeshResult;
|
|
49
|
+
readonly faceCount: number;
|
|
50
|
+
readonly edgeCount: number;
|
|
51
|
+
readonly vertexCount: number;
|
|
52
|
+
/** 实际使用的焊接容差(诊断/复现用)。 */
|
|
53
|
+
readonly weldTolerance: number;
|
|
54
|
+
/** `unifyFaces` 合并掉的重复面数(0 = 共面面片未被合并,顶点未焊上)。 */
|
|
55
|
+
readonly mergedFaceCount: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 网格后端的**内核私有原语**(L1 `BrepEngineApi` 不含 weld/unify)。
|
|
59
|
+
*
|
|
60
|
+
* 由适配器(拥用内核闭包的一侧)实现;句柄一律是 faijs `BrepHandle`
|
|
61
|
+
* (适配器内部负责 `asNum()` 剥离标签),本模块不感知内核方言。
|
|
62
|
+
*/
|
|
63
|
+
export interface MeshSolidKernelOps {
|
|
64
|
+
/** 原始三角网格 → 逐三角形面的实体(内核自带顶点焊接)。 */
|
|
65
|
+
importMesh(positions: Float32Array, indices: Uint32Array): BrepHandle;
|
|
66
|
+
/** 面列表 → 缝合后的实体(重复边缝成共享边 → 真流形)。 */
|
|
67
|
+
weld(faces: BrepHandle[], tolerance: number): BrepHandle;
|
|
68
|
+
/** 共面区域合并(**原地修改**,返回合并掉的面数)。 */
|
|
69
|
+
unify(solid: BrepHandle): number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 网格后端端口:`load` 的 mesh 路径经它产出网格实体与近似拓扑。
|
|
73
|
+
*
|
|
74
|
+
* 生命周期:由宿主装配期注册进 mesh 引擎槽(`registerMeshEngine`),运行期只读。
|
|
75
|
+
*/
|
|
76
|
+
export interface MeshSolidBackend {
|
|
77
|
+
/** 后端 id(与 `defineOp.meshEngines` 的门禁名同源,如 `'brepkit'`)。 */
|
|
78
|
+
readonly id: string;
|
|
79
|
+
/** L1 契约面(拓扑查询 + 几何操作;brepkit 适配器已全实现)。 */
|
|
80
|
+
readonly kernel: BrepEngineApi;
|
|
81
|
+
/** 内核私有原语(weld/unify)。 */
|
|
82
|
+
readonly ops: MeshSolidKernelOps;
|
|
83
|
+
/**
|
|
84
|
+
* 规范化 + 三角化。**失败必须抛错**(带 part 名由调用方补),不静默降级。
|
|
85
|
+
* @param mesh - the source triangle mesh (base-unit coordinates).
|
|
86
|
+
* @param opts - optional weld tolerance / tessellation overrides.
|
|
87
|
+
* @returns the mesh solid with its tessellation.
|
|
88
|
+
*/
|
|
89
|
+
normalize(mesh: MeshSolidInput, opts?: MeshSolidNormalizeOptions): MeshSolidResult;
|
|
90
|
+
/**
|
|
91
|
+
* 已存在的网格实体 → 结果描述(三角化 + 计数)。Phase 2 的 mesh op 用它把
|
|
92
|
+
* 「内核操作产出的新实体」包成下一份网格零件(显示 mesh 与拓扑 mesh 同源)。
|
|
93
|
+
* @param solid - an existing mesh solid handle.
|
|
94
|
+
* @param opts - optional tessellation overrides.
|
|
95
|
+
* @returns the mesh solid result carrying the shared tessellation.
|
|
96
|
+
*/
|
|
97
|
+
describe(solid: BrepHandle, opts?: MeshSolidNormalizeOptions): MeshSolidResult;
|
|
98
|
+
/**
|
|
99
|
+
* 从网格实体结果构建近似拓扑数据(`SelectorRuntimeData`,可直接交 `setTopology`)。
|
|
100
|
+
* @param result - the mesh solid result (its tessellation indexes the topology).
|
|
101
|
+
* @returns the serializable selector runtime data.
|
|
102
|
+
*/
|
|
103
|
+
buildTopologyData(result: MeshSolidResult): SelectorRuntimeData;
|
|
104
|
+
/** 释放网格实体句柄。 */
|
|
105
|
+
release(solid: BrepHandle): void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 由包围盒对角线导出焊接容差(方案 §3.3)。
|
|
109
|
+
*
|
|
110
|
+
* 下限 1e-6 兜住退化 bbox(单点/零厚网格);上不封顶——超大模型需要更粗的
|
|
111
|
+
* 缝合半径才缝得上(float32 坐标的相对误差随尺度线性增长)。
|
|
112
|
+
*
|
|
113
|
+
* @param kernel - the L1 kernel API (bbox query only).
|
|
114
|
+
* @param shape - the raw imported shape.
|
|
115
|
+
* @returns the weld tolerance derived from the bounding-box diagonal.
|
|
116
|
+
*/
|
|
117
|
+
export declare function weldToleranceFor(kernel: BrepEngineApi, shape: BrepHandle): number;
|
|
118
|
+
/**
|
|
119
|
+
* 规范化:`importMesh` → `weld` → `unify`,再校验并三角化。
|
|
120
|
+
*
|
|
121
|
+
* 三条硬约束,都是 Phase 0 实测结论:
|
|
122
|
+
* 1. **顺序不可交换**——先 unify 再 weld 会得到体积归零的坏实体;
|
|
123
|
+
* 2. `unify` **原地修改**,返回值是合并面数,不是句柄;
|
|
124
|
+
* 3. 校验用 `isValid`(weld 后必须合法),不合法即抛错——开放/非流形网格必须
|
|
125
|
+
* 在导入处失败,不能静默退化成"无拓扑的裸网格"(那会让所有下游 mesh op
|
|
126
|
+
* 失去选择能力)。
|
|
127
|
+
*
|
|
128
|
+
* @param backend - the mesh backend providing ops + kernel.
|
|
129
|
+
* @param mesh - the source triangle mesh.
|
|
130
|
+
* @param opts - optional weld tolerance / tessellation overrides.
|
|
131
|
+
* @returns the normalized mesh solid, its tessellation, and element counts.
|
|
132
|
+
* @throws {Error} `E_MESH_SOLID_UNWELDABLE` when welding leaves an invalid solid.
|
|
133
|
+
*/
|
|
134
|
+
export declare function normalizeMeshSolid(backend: MeshSolidBackend, mesh: MeshSolidInput, opts?: MeshSolidNormalizeOptions): MeshSolidResult;
|
|
135
|
+
/**
|
|
136
|
+
* 已存在的网格实体 → 结果描述(三角化 + 计数)。
|
|
137
|
+
*
|
|
138
|
+
* Phase 2 的 mesh op 产出的新实体走这里:**一次**三角化同时喂显示与拓扑,
|
|
139
|
+
* 保证 `faceRuns` 与所见三角形一一对应(规则 1)。重复调 `describe` 会得到
|
|
140
|
+
* 另一份三角化结果——同一实体在同一参数下确定性一致,但仍应复用同一份结果。
|
|
141
|
+
*
|
|
142
|
+
* @param backend - the mesh backend.
|
|
143
|
+
* @param solid - an existing mesh solid handle.
|
|
144
|
+
* @param opts - optional tessellation overrides.
|
|
145
|
+
* @returns the mesh solid result carrying the shared tessellation.
|
|
146
|
+
*/
|
|
147
|
+
export declare function describeMeshSolid(backend: MeshSolidBackend, solid: BrepHandle, opts?: MeshSolidNormalizeOptions): MeshSolidResult;
|
|
148
|
+
/**
|
|
149
|
+
* 网格实体 → 近似拓扑数据(`SelectorRuntimeData`)。
|
|
150
|
+
*
|
|
151
|
+
* 复用 BREP 路径同源的 `buildTopologyFromMesh`(方案 §1.3 实测:产物与 BREP
|
|
152
|
+
* 路径同构——同样的 FaceRow/EdgeRow 字段、同样的 `faceStart/faceCount` 邻接)。
|
|
153
|
+
* **不引入第二套拓扑表示。**
|
|
154
|
+
*
|
|
155
|
+
* @param backend - the mesh backend (kernel + release).
|
|
156
|
+
* @param result - the normalized mesh solid result (carries the shared tessellation).
|
|
157
|
+
* @returns the serializable selector runtime data.
|
|
158
|
+
*/
|
|
159
|
+
export declare function buildMeshSolidTopology(backend: MeshSolidBackend, result: MeshSolidResult): SelectorRuntimeData;
|
|
160
|
+
/**
|
|
161
|
+
* 网格实体句柄注册表(`PartName → BrepHandle`)。
|
|
162
|
+
*
|
|
163
|
+
* 与 `brepChain.solidCache` 的差别:本表**永不**参与 BREP 精度链判定——
|
|
164
|
+
* 它存在只表示"该 part 是网格零件,携带近似拓扑"。释放语义与 solidCache 对齐:
|
|
165
|
+
* `set` 覆盖不释放(旧句柄可能仍被旧输出 Shape 引用),`delete`/`clear` 释放。
|
|
166
|
+
*/
|
|
167
|
+
export declare class MeshSolidRegistry {
|
|
168
|
+
private readonly handles;
|
|
169
|
+
private backendRef;
|
|
170
|
+
/**
|
|
171
|
+
* 装配/换装网格后端(宿主装配期;运行期只读语义)。
|
|
172
|
+
* @param backend - the mesh backend, or null to detach.
|
|
173
|
+
*/
|
|
174
|
+
setBackend(backend: MeshSolidBackend | null): void;
|
|
175
|
+
/**
|
|
176
|
+
* 当前网格后端(未装配则 null)。
|
|
177
|
+
* @returns the assembled mesh backend, or null.
|
|
178
|
+
*/
|
|
179
|
+
get backend(): MeshSolidBackend | null;
|
|
180
|
+
/**
|
|
181
|
+
* 登记某 part 的网格实体句柄(覆盖旧值,**不释放**旧句柄——与 solidCache 同语义)。
|
|
182
|
+
* @param part - the part name.
|
|
183
|
+
* @param solid - the mesh solid handle.
|
|
184
|
+
*/
|
|
185
|
+
set(part: PartName, solid: BrepHandle): void;
|
|
186
|
+
/**
|
|
187
|
+
* 读取某 part 的网格实体句柄。
|
|
188
|
+
* @param part - the part name.
|
|
189
|
+
* @returns the handle, or undefined.
|
|
190
|
+
*/
|
|
191
|
+
get(part: PartName): BrepHandle | undefined;
|
|
192
|
+
/**
|
|
193
|
+
* 该 part 是否携带网格实体。
|
|
194
|
+
* @param part - the part name.
|
|
195
|
+
* @returns true when a handle is registered.
|
|
196
|
+
*/
|
|
197
|
+
has(part: PartName): boolean;
|
|
198
|
+
/**
|
|
199
|
+
* 删除某 part 并释放其句柄(重放/失效路径)。
|
|
200
|
+
* @param part - the part name.
|
|
201
|
+
*/
|
|
202
|
+
delete(part: PartName): void;
|
|
203
|
+
/**
|
|
204
|
+
* 按 part 名列表批量删除(重放失效用)。
|
|
205
|
+
* @param parts - the part names to delete; unknown names are ignored.
|
|
206
|
+
*/
|
|
207
|
+
deleteMany(parts: Iterable<PartName>): void;
|
|
208
|
+
/** 释放全部句柄并清空(dispose)。 */
|
|
209
|
+
clear(): void;
|
|
210
|
+
/**
|
|
211
|
+
* 当前登记的全部 part 名(诊断/测试)。
|
|
212
|
+
* @returns the registered part names.
|
|
213
|
+
*/
|
|
214
|
+
keys(): PartName[];
|
|
215
|
+
/** 登记数量(诊断/测试)。 */
|
|
216
|
+
get size(): number;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=mesh-solid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-solid.d.ts","sourceRoot":"","sources":["../../src/brep/mesh-solid.ts"],"names":[],"mappings":"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"}
|