@faicad/faijs 0.13.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/api-namespace.d.ts +7 -0
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +44 -17
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts +19 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +71 -12
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -8
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +45 -0
- package/dist/api/compound-geom.d.ts.map +1 -0
- package/dist/api/compound-geom.js +85 -0
- package/dist/api/compound-geom.js.map +1 -0
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +7 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +1 -0
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +131 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +7 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +6 -5
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/cad/script-face.d.ts +1 -1
- package/dist/api/generated/cad/script-face.d.ts.map +1 -1
- package/dist/api/generated/cad/script-face.js +1 -2
- package/dist/api/generated/cad/script-face.js.map +1 -1
- package/dist/api/generated/operations.js +16 -16
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +0 -2
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -7
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -4
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -56
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +19 -68
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/import-brep.d.ts +36 -0
- package/dist/api/import-brep.d.ts.map +1 -0
- package/dist/api/import-brep.js +72 -0
- package/dist/api/import-brep.js.map +1 -0
- package/dist/api/import-step.d.ts +28 -0
- package/dist/api/import-step.d.ts.map +1 -0
- package/dist/api/import-step.js +57 -0
- package/dist/api/import-step.js.map +1 -0
- package/dist/api/index.d.ts +8 -12
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +22 -16
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +2 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +3 -1
- package/dist/api/internal/compat-projection.d.ts.map +1 -1
- package/dist/api/internal/compat-projection.js +8 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/replica-role-table.d.ts +36 -0
- package/dist/api/internal/replica-role-table.d.ts.map +1 -0
- package/dist/api/internal/replica-role-table.js +73 -0
- package/dist/api/internal/replica-role-table.js.map +1 -0
- package/dist/api/internal/result-unwrap.d.ts +3 -1
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +2 -2
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +1 -0
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/occt-kernel-bridge.d.ts +105 -27
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +255 -41
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts +32 -0
- package/dist/api/pattern.d.ts.map +1 -0
- package/dist/api/pattern.js +85 -0
- package/dist/api/pattern.js.map +1 -0
- package/dist/api/place.d.ts +35 -0
- package/dist/api/place.d.ts.map +1 -0
- package/dist/api/place.js +113 -0
- package/dist/api/place.js.map +1 -0
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +10 -3
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +145 -0
- package/dist/api/replicate.d.ts.map +1 -0
- package/dist/api/replicate.js +351 -0
- package/dist/api/replicate.js.map +1 -0
- package/dist/api/revolve.d.ts +36 -0
- package/dist/api/revolve.d.ts.map +1 -0
- package/dist/api/revolve.js +165 -0
- package/dist/api/revolve.js.map +1 -0
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +1 -0
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +1 -0
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +1 -0
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split.d.ts +31 -0
- package/dist/api/split.d.ts.map +1 -0
- package/dist/api/split.js +96 -0
- package/dist/api/split.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +17 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +86 -66
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface/projection-overrides.d.ts.map +1 -1
- package/dist/api/surface/projection-overrides.js +6 -0
- package/dist/api/surface/projection-overrides.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +65 -3
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +4 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +44 -12
- package/dist/api/transform.js.map +1 -1
- package/dist/boolean/deriveNormals.d.ts +5 -4
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +24 -7
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +34 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +62 -22
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +66 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +44 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -5
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +246 -9
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +96 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +66 -6
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +6 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +78 -8
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +130 -17
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +108 -12
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +6 -28
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -17
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +27 -0
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +48 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +7 -4
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +14 -4
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/module-registry.d.ts +3 -1
- package/dist/cad-runtime/module-registry.d.ts.map +1 -1
- package/dist/cad-runtime/module-registry.js +13 -1
- package/dist/cad-runtime/module-registry.js.map +1 -1
- package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
- package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
- package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
- package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
- package/dist/cad-runtime/runtime.d.ts +52 -2
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +180 -9
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +22 -0
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +82 -12
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +38 -0
- package/dist/env-agnostic.d.ts.map +1 -0
- package/dist/env-agnostic.js +29 -0
- package/dist/env-agnostic.js.map +1 -0
- package/dist/fcstd/attachment.d.ts +8 -1
- package/dist/fcstd/attachment.d.ts.map +1 -1
- package/dist/fcstd/attachment.js +7 -1
- package/dist/fcstd/attachment.js.map +1 -1
- package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
- package/dist/fcstd/build-fai-zip.js +12 -7
- package/dist/fcstd/build-fai-zip.js.map +1 -1
- package/dist/fcstd/codegen.d.ts +10 -1
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +158 -49
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/contour.d.ts.map +1 -1
- package/dist/fcstd/contour.js +23 -24
- package/dist/fcstd/contour.js.map +1 -1
- package/dist/fcstd/convert.d.ts +2 -18
- package/dist/fcstd/convert.d.ts.map +1 -1
- package/dist/fcstd/convert.js +35 -53
- package/dist/fcstd/convert.js.map +1 -1
- package/dist/fcstd/expressions.d.ts +24 -0
- package/dist/fcstd/expressions.d.ts.map +1 -1
- package/dist/fcstd/expressions.js +91 -0
- package/dist/fcstd/expressions.js.map +1 -1
- package/dist/fcstd/external-geo.d.ts +12 -1
- package/dist/fcstd/external-geo.d.ts.map +1 -1
- package/dist/fcstd/external-geo.js +15 -1
- package/dist/fcstd/external-geo.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts +21 -1
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +124 -8
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts +83 -0
- package/dist/fcstd/structural-types.d.ts.map +1 -0
- package/dist/fcstd/structural-types.js +121 -0
- package/dist/fcstd/structural-types.js.map +1 -0
- package/dist/index.d.ts +7 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +71 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -0
- package/dist/lang/determinism-scanner.js +625 -0
- package/dist/lang/determinism-scanner.js.map +1 -0
- package/dist/lang/symbol-table.d.ts +31 -0
- package/dist/lang/symbol-table.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +13 -19
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +13 -19
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +50 -1
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/mesh/creased-normals.d.ts +50 -0
- package/dist/mesh/creased-normals.d.ts.map +1 -0
- package/dist/mesh/creased-normals.js +114 -0
- package/dist/mesh/creased-normals.js.map +1 -0
- package/dist/mesh/decoration-provider.d.ts +53 -0
- package/dist/mesh/decoration-provider.d.ts.map +1 -0
- package/dist/mesh/decoration-provider.js +21 -0
- package/dist/mesh/decoration-provider.js.map +1 -0
- package/dist/mesh/engrave.d.ts +4 -0
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +22 -31
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +5 -14
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +7 -18
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +2 -1
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +5 -7
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts +5 -18
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +4 -48
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/stl-loader.d.ts +23 -0
- package/dist/mesh/stl-loader.d.ts.map +1 -0
- package/dist/mesh/stl-loader.js +139 -0
- package/dist/mesh/stl-loader.js.map +1 -0
- package/dist/module-resolver/parse-imports.d.ts +37 -0
- package/dist/module-resolver/parse-imports.d.ts.map +1 -0
- package/dist/module-resolver/parse-imports.js +39 -0
- package/dist/module-resolver/parse-imports.js.map +1 -0
- package/dist/module-resolver/resolver.d.ts +1 -1
- package/dist/module-resolver/resolver.js +2 -2
- package/dist/module-resolver/resolver.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +37 -4
- package/dist/node-host/cli.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +42 -0
- package/dist/primitives/text/cjk-font.d.ts.map +1 -0
- package/dist/primitives/text/cjk-font.js +86 -0
- package/dist/primitives/text/cjk-font.js.map +1 -0
- package/dist/runtime-state.d.ts +18 -6
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +9 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.js +2 -2
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +15 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +26 -3
- package/dist/shape.js.map +1 -1
- package/dist/symbol-table.d.ts +15 -0
- package/dist/symbol-table.d.ts.map +1 -0
- package/dist/symbol-table.js +14 -0
- package/dist/symbol-table.js.map +1 -0
- package/dist/topology/naming/build-naming.d.ts +14 -30
- package/dist/topology/naming/build-naming.d.ts.map +1 -1
- package/dist/topology/naming/build-naming.js +21 -54
- package/dist/topology/naming/build-naming.js.map +1 -1
- package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
- package/dist/topology/naming/capture-topo-ref.js +5 -0
- package/dist/topology/naming/capture-topo-ref.js.map +1 -1
- package/dist/topology/naming/index.d.ts +3 -0
- package/dist/topology/naming/index.d.ts.map +1 -1
- package/dist/topology/naming/index.js +3 -0
- package/dist/topology/naming/index.js.map +1 -1
- package/dist/topology/naming/lineage-resolve.d.ts +80 -0
- package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
- package/dist/topology/naming/lineage-resolve.js +120 -0
- package/dist/topology/naming/lineage-resolve.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +349 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -0
- package/dist/topology/naming/lineage.js +398 -0
- package/dist/topology/naming/lineage.js.map +1 -0
- package/dist/topology/naming/migrate.d.ts +41 -0
- package/dist/topology/naming/migrate.d.ts.map +1 -0
- package/dist/topology/naming/migrate.js +88 -0
- package/dist/topology/naming/migrate.js.map +1 -0
- package/dist/topology/naming/role-name.d.ts +176 -0
- package/dist/topology/naming/role-name.d.ts.map +1 -0
- package/dist/topology/naming/role-name.js +344 -0
- package/dist/topology/naming/role-name.js.map +1 -0
- package/dist/topology/naming/roles.d.ts +20 -22
- package/dist/topology/naming/roles.d.ts.map +1 -1
- package/dist/topology/naming/roles.js +51 -49
- package/dist/topology/naming/roles.js.map +1 -1
- package/dist/topology/naming/types.d.ts +65 -18
- package/dist/topology/naming/types.d.ts.map +1 -1
- package/dist/topology/naming/types.js.map +1 -1
- package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
- package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
- package/dist/vendored/brepjs/kernel/index.js +11 -0
- package/dist/vendored/brepjs/kernel/index.js.map +1 -1
- package/dist/weapp.d.ts +4 -4
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +7 -4
- package/dist/weapp.js.map +1 -1
- package/package.json +16 -14
- package/dist/api/compat/index.d.ts +0 -173
- package/dist/api/compat/index.d.ts.map +0 -1
- package/dist/api/compat/index.js +0 -222
- package/dist/api/compat/index.js.map +0 -1
- package/dist/api/compound.d.ts +0 -108
- package/dist/api/compound.d.ts.map +0 -1
- package/dist/api/compound.js +0 -162
- package/dist/api/compound.js.map +0 -1
- package/dist/api/copy.d.ts +0 -39
- package/dist/api/copy.d.ts.map +0 -1
- package/dist/api/copy.js +0 -81
- package/dist/api/copy.js.map +0 -1
- package/dist/api/fai_drill.d.ts +0 -46
- package/dist/api/fai_drill.d.ts.map +0 -1
- package/dist/api/fai_drill.js +0 -230
- package/dist/api/fai_drill.js.map +0 -1
- package/dist/api/fai_extrude.d.ts +0 -36
- package/dist/api/fai_extrude.d.ts.map +0 -1
- package/dist/api/fai_extrude.js +0 -78
- package/dist/api/fai_extrude.js.map +0 -1
- package/dist/api/fai_split.d.ts +0 -46
- package/dist/api/fai_split.d.ts.map +0 -1
- package/dist/api/fai_split.js +0 -253
- package/dist/api/fai_split.js.map +0 -1
- package/dist/api/load.d.ts +0 -39
- package/dist/api/load.d.ts.map +0 -1
- package/dist/api/load.js +0 -82
- package/dist/api/load.js.map +0 -1
- package/dist/api/svgExtrude.d.ts +0 -32
- package/dist/api/svgExtrude.d.ts.map +0 -1
- package/dist/api/svgExtrude.js +0 -73
- package/dist/api/svgExtrude.js.map +0 -1
- package/dist/api/text.d.ts +0 -34
- package/dist/api/text.d.ts.map +0 -1
- package/dist/api/text.js +0 -100
- package/dist/api/text.js.map +0 -1
- package/dist/brep/text/fontTestHelper.d.ts +0 -30
- package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
- package/dist/brep/text/fontTestHelper.js +0 -57
- package/dist/brep/text/fontTestHelper.js.map +0 -1
- package/dist/cad-runtime/module-executor.d.ts +0 -271
- package/dist/cad-runtime/module-executor.d.ts.map +0 -1
- package/dist/cad-runtime/module-executor.js +0 -630
- package/dist/cad-runtime/module-executor.js.map +0 -1
- package/dist/cad-runtime/terminal-dag.d.ts +0 -65
- package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
- package/dist/cad-runtime/terminal-dag.js +0 -167
- package/dist/cad-runtime/terminal-dag.js.map +0 -1
- package/dist/faqts/browser.d.ts +0 -16
- package/dist/faqts/browser.d.ts.map +0 -1
- package/dist/faqts/browser.js +0 -13
- package/dist/faqts/browser.js.map +0 -1
- package/dist/faqts/exec-blob.d.ts +0 -14
- package/dist/faqts/exec-blob.d.ts.map +0 -1
- package/dist/faqts/exec-blob.js +0 -22
- package/dist/faqts/exec-blob.js.map +0 -1
- package/dist/faqts/exec-node.d.ts +0 -15
- package/dist/faqts/exec-node.d.ts.map +0 -1
- package/dist/faqts/exec-node.js +0 -29
- package/dist/faqts/exec-node.js.map +0 -1
- package/dist/faqts/imports.d.ts +0 -74
- package/dist/faqts/imports.d.ts.map +0 -1
- package/dist/faqts/imports.js +0 -95
- package/dist/faqts/imports.js.map +0 -1
- package/dist/faqts/index.d.ts +0 -22
- package/dist/faqts/index.d.ts.map +0 -1
- package/dist/faqts/index.js +0 -21
- package/dist/faqts/index.js.map +0 -1
- package/dist/faqts/node.d.ts +0 -23
- package/dist/faqts/node.d.ts.map +0 -1
- package/dist/faqts/node.js +0 -23
- package/dist/faqts/node.js.map +0 -1
- package/dist/faqts/run.d.ts +0 -62
- package/dist/faqts/run.d.ts.map +0 -1
- package/dist/faqts/run.js +0 -62
- package/dist/faqts/run.js.map +0 -1
- package/dist/faqts/transform.d.ts +0 -43
- package/dist/faqts/transform.d.ts.map +0 -1
- package/dist/faqts/transform.js +0 -35
- package/dist/faqts/transform.js.map +0 -1
- package/dist/lang/compile.d.ts +0 -50
- package/dist/lang/compile.d.ts.map +0 -1
- package/dist/lang/compile.js +0 -368
- package/dist/lang/compile.js.map +0 -1
- package/dist/lang/keep.d.ts +0 -109
- package/dist/lang/keep.d.ts.map +0 -1
- package/dist/lang/keep.js +0 -226
- package/dist/lang/keep.js.map +0 -1
- package/dist/lang/parser.d.ts +0 -91
- package/dist/lang/parser.d.ts.map +0 -1
- package/dist/lang/parser.js +0 -1594
- package/dist/lang/parser.js.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
- package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
- package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
- package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
- package/dist/mesh/drill-hole/drill-types.js +0 -7
- package/dist/mesh/drill-hole/drill-types.js.map +0 -1
- package/dist/mesh/fai_drill.d.ts +0 -21
- package/dist/mesh/fai_drill.d.ts.map +0 -1
- package/dist/mesh/fai_drill.js +0 -92
- package/dist/mesh/fai_drill.js.map +0 -1
- package/dist/mesh/fai_extrude.d.ts +0 -24
- package/dist/mesh/fai_extrude.d.ts.map +0 -1
- package/dist/mesh/fai_extrude.js +0 -42
- package/dist/mesh/fai_extrude.js.map +0 -1
- package/dist/mesh/fai_split.d.ts +0 -164
- package/dist/mesh/fai_split.d.ts.map +0 -1
- package/dist/mesh/fai_split.js +0 -269
- package/dist/mesh/fai_split.js.map +0 -1
- package/dist/primitives/svg-extrude.d.ts +0 -43
- package/dist/primitives/svg-extrude.d.ts.map +0 -1
- package/dist/primitives/svg-extrude.js +0 -78
- package/dist/primitives/svg-extrude.js.map +0 -1
- package/dist/primitives/text/cjk.d.ts +0 -61
- package/dist/primitives/text/cjk.d.ts.map +0 -1
- package/dist/primitives/text/cjk.js +0 -215
- package/dist/primitives/text/cjk.js.map +0 -1
- package/dist/primitives/text-geometry.d.ts +0 -47
- package/dist/primitives/text-geometry.d.ts.map +0 -1
- package/dist/primitives/text-geometry.js +0 -127
- package/dist/primitives/text-geometry.js.map +0 -1
- package/dist/test-helpers.d.ts +0 -31
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -55
- package/dist/test-helpers.js.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
- package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAY,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,EAA4B,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGrE,yCAAyC;AACzC,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC,gFAAgF;AAChF,YAAY,EAAE,aAAa,EAAE,CAAA;AAU7B;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,QAAQ,GAAG,SAAS,CAQ5F;AAuCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAuBvB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM,EAAE,CASxF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,aAAa,GACvB,SAAS,CAaX;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,aAAa,GACvB,SAAS,CAMX;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,SAAS,EACtB,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,SAAS,CAwCX;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,EAC7C,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB"}
|
|
@@ -9,54 +9,67 @@
|
|
|
9
9
|
* 语句 LHS 为新 origin 给位置名(§3.4)。
|
|
10
10
|
* - `roleOfOrdinal`:序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。
|
|
11
11
|
*/
|
|
12
|
+
import { semantic, formatRoleName } from './role-name.js';
|
|
12
13
|
import { captureFaceHint } from './geom-hint.js';
|
|
13
14
|
/** 主轴判定阈值:abs(component) > 0.9 视为轴对齐。 */
|
|
14
15
|
export const AXIS_THRESHOLD = 0.9;
|
|
15
16
|
// ── 语义命名器(§3.2:faijs 单位/轴向契约,mm、+Z 向上)──
|
|
17
|
+
//
|
|
18
|
+
// Phase 1.7/1.12(计划 §4.2):命名器输出 **RoleName 结构值**(不再是 'box:top'
|
|
19
|
+
// 这类混入 op 前缀的扁平串)。前缀删除的依据:origin 已改 StmtId 权威表达来源,
|
|
20
|
+
// role 只是「那条语句内的局部名」——'box:top' 里的 'box:' 是把 origin 信息塞进
|
|
21
|
+
// role 的历史残留(违反 R1 的精神)。序列化线格式由 formatRoleName 统一给出
|
|
22
|
+
// (semantic → 'top' / 'lateral' / 'surface')。
|
|
16
23
|
/**
|
|
17
24
|
* box 面:按外法向主轴给语义名。
|
|
18
25
|
*
|
|
19
26
|
* @param n - the outward normal of the face (unit length expected).
|
|
20
|
-
* @returns the cardinal role ('
|
|
27
|
+
* @returns the cardinal role (semantic 'top' etc.), or undefined when no axis dominates.
|
|
21
28
|
*/
|
|
22
29
|
export function boxRoleFromNormal(n) {
|
|
23
30
|
if (n[2] > AXIS_THRESHOLD)
|
|
24
|
-
return '
|
|
31
|
+
return semantic('top');
|
|
25
32
|
if (n[2] < -AXIS_THRESHOLD)
|
|
26
|
-
return '
|
|
33
|
+
return semantic('bottom');
|
|
27
34
|
if (n[1] > AXIS_THRESHOLD)
|
|
28
|
-
return '
|
|
35
|
+
return semantic('back');
|
|
29
36
|
if (n[1] < -AXIS_THRESHOLD)
|
|
30
|
-
return '
|
|
37
|
+
return semantic('front');
|
|
31
38
|
if (n[0] > AXIS_THRESHOLD)
|
|
32
|
-
return '
|
|
39
|
+
return semantic('right');
|
|
33
40
|
if (n[0] < -AXIS_THRESHOLD)
|
|
34
|
-
return '
|
|
41
|
+
return semantic('left');
|
|
35
42
|
return undefined;
|
|
36
43
|
}
|
|
37
|
-
/** Z 轴端盖名:'+Z →
|
|
38
|
-
function axialCapName(
|
|
44
|
+
/** Z 轴端盖名:'+Z → top'、'-Z → bottom'(仅平面)。 */
|
|
45
|
+
function axialCapName(surfaceType, z) {
|
|
39
46
|
if (surfaceType !== 'plane')
|
|
40
47
|
return undefined;
|
|
41
48
|
if (z > AXIS_THRESHOLD)
|
|
42
|
-
return
|
|
49
|
+
return semantic('top');
|
|
43
50
|
if (z < -AXIS_THRESHOLD)
|
|
44
|
-
return
|
|
51
|
+
return semantic('bottom');
|
|
45
52
|
return undefined;
|
|
46
53
|
}
|
|
47
54
|
/** cylinder(Z 轴):端盖 + 侧立面。 */
|
|
48
55
|
function cylinderRole(surfaceType, z) {
|
|
49
|
-
return surfaceType === 'cylinder' ? '
|
|
56
|
+
return surfaceType === 'cylinder' ? semantic('lateral') : axialCapName(surfaceType, z);
|
|
50
57
|
}
|
|
51
58
|
/** cone(Z 轴):端盖 + 侧立面。 */
|
|
52
59
|
function coneRole(surfaceType, z) {
|
|
53
|
-
return surfaceType === 'cone' ? '
|
|
60
|
+
return surfaceType === 'cone' ? semantic('lateral') : axialCapName(surfaceType, z);
|
|
54
61
|
}
|
|
55
62
|
/** sphere:单球面。 */
|
|
56
63
|
function sphereRole(surfaceType) {
|
|
57
|
-
return surfaceType === 'sphere' ? '
|
|
64
|
+
return surfaceType === 'sphere' ? semantic('surface') : undefined;
|
|
58
65
|
}
|
|
59
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* 每基本体的语义命名器,按 opType 键控。
|
|
68
|
+
*
|
|
69
|
+
* Phase 1.12:输出从扁平串改为 **RoleName**(§4.2 R4:role 是结构化、封闭可枚举的
|
|
70
|
+
* 联合,扁平串只是它的线格式)。词汇表(封闭):box → top/bottom/front/back/left/right;
|
|
71
|
+
* cylinder/cone → lateral/top/bottom;sphere → surface。
|
|
72
|
+
*/
|
|
60
73
|
const ROLE_ASSIGNERS = {
|
|
61
74
|
box: (_surfaceType, normal) => boxRoleFromNormal(normal),
|
|
62
75
|
cylinder: (surfaceType, normal) => cylinderRole(surfaceType, normal[2]),
|
|
@@ -64,15 +77,20 @@ const ROLE_ASSIGNERS = {
|
|
|
64
77
|
sphere: (surfaceType, _normal) => sphereRole(surfaceType),
|
|
65
78
|
};
|
|
66
79
|
/**
|
|
67
|
-
* 给链根 shape 建
|
|
80
|
+
* 给链根 shape 建 role 子表(单 origin;§3.2)。
|
|
68
81
|
*
|
|
69
|
-
*
|
|
82
|
+
* 语义命名优先;**位置兜底已删**(Phase 1.7,计划 §4.2 R3:`${opType}:face_${i}`
|
|
83
|
+
* 里的 index 是 OCCT 枚举序号,OCCT 不承诺面序稳定,改参即漂——真正抗重放的
|
|
84
|
+
* 只有语义 role)。无语义名的面**不进表**:缺身份是显式状态(naming 行 role=null),
|
|
85
|
+
* 不是可伪造的名字。R1(局部唯一)由构造保证:同语句内一个 role 只指一个面。
|
|
86
|
+
*
|
|
87
|
+
* assign 时只保留 hash + hint,不保留面句柄
|
|
70
88
|
* (避免 wasm 句柄生命周期泄漏——读完几何量即弃)。
|
|
71
89
|
*
|
|
72
90
|
* @param kernel - the OCCT kernel.
|
|
73
91
|
* @param shape - the chain-root solid (primitive / load STEP 产物).
|
|
74
|
-
* @param opType - the chain-root operation type ('box'/'cylinder'/...
|
|
75
|
-
* @returns
|
|
92
|
+
* @param opType - the chain-root operation type ('box'/'cylinder'/...)。
|
|
93
|
+
* @returns role → hash 子表(role 为 RoleName 线格式串;仅语义命中的面)。
|
|
76
94
|
*/
|
|
77
95
|
export function assignRoles(kernel, shape, opType) {
|
|
78
96
|
const roles = new Map();
|
|
@@ -80,17 +98,15 @@ export function assignRoles(kernel, shape, opType) {
|
|
|
80
98
|
const faceHandles = kernel.getSubShapes(shape, 'face');
|
|
81
99
|
try {
|
|
82
100
|
const hashes = kernel.subShapeHashes(shape, 'face', 2147483647);
|
|
83
|
-
let index = 0;
|
|
84
101
|
for (let i = 0; i < faceHandles.length; i++) {
|
|
85
102
|
const hint = captureFaceHint(kernel, faceHandles[i]);
|
|
86
103
|
const normal = hint.normal ?? [0, 0, 1];
|
|
87
104
|
const surfaceType = hint.surfaceType ?? '';
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
roles.set(
|
|
93
|
-
index++;
|
|
105
|
+
const semanticRole = assigner?.(surfaceType, normal);
|
|
106
|
+
// R1:同名不重复认领(对称面法向并列时首个胜出——判定必须唯一胜出,G6)。
|
|
107
|
+
if (semanticRole === undefined || roles.has(formatRoleName(semanticRole)))
|
|
108
|
+
continue;
|
|
109
|
+
roles.set(formatRoleName(semanticRole), [hashes[i]]);
|
|
94
110
|
}
|
|
95
111
|
return roles;
|
|
96
112
|
}
|
|
@@ -174,17 +190,19 @@ export function propagateAllOrigins(roles, evolution) {
|
|
|
174
190
|
* 布尔合流:合并两个来源的 role 表(§3.4,faijs 对 brepjs 的必要扩展)。
|
|
175
191
|
*
|
|
176
192
|
* 对 A、B 两张 hash 演化分别传播各自的表后合并;布尔新生成的缝面/刃面
|
|
177
|
-
*
|
|
193
|
+
* 以本次布尔**语句的 StmtId** 为新 origin(Phase 1.6:不再用 LHS 变量名)。
|
|
194
|
+
* 缝面**不再给位置名**(Phase 1.7:位置兜底已删)——登记空子表占位,
|
|
195
|
+
* 面身份待 Phase 3 的 kernel/byAdjacency 词汇补齐;naming 行将显式 role=null。
|
|
178
196
|
*
|
|
179
197
|
* @param targetTable - the target part's role table.
|
|
180
198
|
* @param targetEvo - the target-side hash evolution (A 的 inHash 去向).
|
|
181
199
|
* @param toolTable - the tool part's role table.
|
|
182
200
|
* @param toolEvo - the tool-side hash evolution (B 的 inHash 去向).
|
|
183
|
-
* @param
|
|
184
|
-
* @param seamCount - how many seam/generated faces to
|
|
201
|
+
* @param outStmt - the boolean statement's StmtId (new origin for seam faces).
|
|
202
|
+
* @param seamCount - how many seam/generated faces to register (0 表示不登记).
|
|
185
203
|
* @returns the merged RoleTable.
|
|
186
204
|
*/
|
|
187
|
-
export function mergeRoleTables(targetTable, targetEvo, toolTable, toolEvo,
|
|
205
|
+
export function mergeRoleTables(targetTable, targetEvo, toolTable, toolEvo, outStmt, seamCount) {
|
|
188
206
|
const result = new Map();
|
|
189
207
|
for (const [origin, roles] of targetTable) {
|
|
190
208
|
const advanced = new Map();
|
|
@@ -223,28 +241,12 @@ export function mergeRoleTables(targetTable, targetEvo, toolTable, toolEvo, outP
|
|
|
223
241
|
}
|
|
224
242
|
}
|
|
225
243
|
if (seamCount > 0) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
result.set(outPart, seamRoles);
|
|
244
|
+
// Phase 1.7:缝面不再给位置兜底名。登记空子表占位(origin=本次语句 StmtId),
|
|
245
|
+
// 身份待 Phase 3 kernel/byAdjacency 词汇补齐;naming 行将显式 role=null(G6)。
|
|
246
|
+
result.set(outStmt, new Map());
|
|
230
247
|
}
|
|
231
248
|
return result;
|
|
232
249
|
}
|
|
233
|
-
/**
|
|
234
|
-
* 布尔缝面/刃面的位置名角色表(§3.4:以本次语句 LHS 为新 origin)。
|
|
235
|
-
* 缝面的 hash 来自结果形状的 subShapeHashes(按生成序),此处仅分配 role 名——
|
|
236
|
-
* hash 由调用方在拿到结果 shape 后填入(seam 面 hash 需结果 subShapeHashes 对照)。
|
|
237
|
-
*
|
|
238
|
-
* @param outPart - the boolean statement's LHS variable name.
|
|
239
|
-
* @param count - the number of seam faces to name.
|
|
240
|
-
* @returns a single-origin role map with positional roles.
|
|
241
|
-
*/
|
|
242
|
-
export function assignGeneratedPositionalRoles(outPart, count) {
|
|
243
|
-
const roles = new Map();
|
|
244
|
-
for (let i = 0; i < count; i++)
|
|
245
|
-
roles.set(`${outPart}:face_${i}`, []);
|
|
246
|
-
return roles;
|
|
247
|
-
}
|
|
248
250
|
/**
|
|
249
251
|
* 序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。
|
|
250
252
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/topology/naming/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAKjC,0CAA0C;AAE1C;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAoC;IACpE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc;QAAE,OAAO,SAAS,CAAA;IAC3C,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,YAAY,CAAA;IAC/C,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc;QAAE,OAAO,UAAU,CAAA;IAC5C,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,WAAW,CAAA;IAC9C,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc;QAAE,OAAO,WAAW,CAAA;IAC7C,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,UAAU,CAAA;IAC7C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8CAA8C;AAC9C,SAAS,YAAY,CAAC,MAAc,EAAE,WAAmB,EAAE,CAAS;IAClE,IAAI,WAAW,KAAK,OAAO;QAAE,OAAO,SAAS,CAAA;IAC7C,IAAI,CAAC,GAAG,cAAc;QAAE,OAAO,GAAG,MAAM,MAAM,CAAA;IAC9C,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,GAAG,MAAM,SAAS,CAAA;IAClD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8BAA8B;AAC9B,SAAS,YAAY,CAAC,WAAmB,EAAE,CAAS;IAClD,OAAO,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;AACnG,CAAC;AAED,0BAA0B;AAC1B,SAAS,QAAQ,CAAC,WAAmB,EAAE,CAAS;IAC9C,OAAO,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;AACvF,CAAC;AAED,kBAAkB;AAClB,SAAS,UAAU,CAAC,WAAmB;IACrC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAChE,CAAC;AAED,8BAA8B;AAC9B,MAAM,cAAc,GAA2G;IAC7H,GAAG,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;IACxD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;CAC1D,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CACzB,MAAqB,EACrB,KAAiB,EACjB,MAAc;IAEd,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QAC/D,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAA;YAC1C,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,IAAI,GACR,QAAQ,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,GAAG,MAAM,SAAS,KAAK,EAAE,CAAA;YAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5B,KAAK,EAAE,CAAA;QACT,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;YAAS,CAAC;QACT,+CAA+C;QAC/C,0CAA0C;QAC1C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,EAAE,SAAwB;IAC5E,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjF,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAgB,EAChB,MAAgB,EAChB,SAAwB;IAExB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAA;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoD,CAAA;IAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAgB,EAChB,SAAwB;IAExB,IAAI,MAAM,GAAc,KAAK,CAAA;IAC7B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAC7B,WAAsB,EACtB,SAAwB,EACxB,SAAoB,EACpB,OAAsB,EACtB,OAAiB,EACjB,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoD,CAAA;IAC1E,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC3D,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACxC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,oDAAoD;YACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAA;YACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;YAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;YAC3D,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAmB,QAAiC,CAAC,CAAA;YAC3E,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC9D,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;YAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;YAC3D,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7E,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAAe,EAAE,KAAa;IAC3E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACrE,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA6C,EAC7C,aAAgC,EAChC,OAAe;IAEf,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;IACvC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["/**\n * roles.ts — RoleTable 的生命周期纯逻辑(§3.2/§3.3/§3.4 移植 + 改造)\n *\n * - `assignRoles`:链根建表。语义优先(box/cylinder/cone/sphere 按法向/曲面类型\n * 给稳定名)、位置兜底(`${opType}:face_${i}`,保证每面必有 role)。\n * - `propagateRoles`:沿一次 hash 演化推进表(移植 brepjs updateRoles/nextHashes:\n * deleted 丢弃、modified 全部后继替换、未变保留;generated 刻意不消费)。\n * - `mergeRoleTables`:布尔合流——A/B 两个来源的表各自传播后合并,缝面以本次\n * 语句 LHS 为新 origin 给位置名(§3.4)。\n * - `roleOfOrdinal`:序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { HashEvolution } from '../../brep/face-evolution'\nimport type { PartName } from '../../identity'\nimport type { RoleTable } from './types'\nimport { captureFaceHint } from './geom-hint'\n\n/** 主轴判定阈值:abs(component) > 0.9 视为轴对齐。 */\nexport const AXIS_THRESHOLD = 0.9\n\n/** Re-export:hash 键演化(decodeHashEvolution 产出,见 brep/face-evolution.ts §2.4)。 */\nexport type { HashEvolution }\n\n// ── 语义命名器(§3.2:faijs 单位/轴向契约,mm、+Z 向上)──\n\n/**\n * box 面:按外法向主轴给语义名。\n *\n * @param n - the outward normal of the face (unit length expected).\n * @returns the cardinal role ('box:top' etc.), or undefined when no axis dominates.\n */\nexport function boxRoleFromNormal(n: readonly [number, number, number]): string | undefined {\n if (n[2] > AXIS_THRESHOLD) return 'box:top'\n if (n[2] < -AXIS_THRESHOLD) return 'box:bottom'\n if (n[1] > AXIS_THRESHOLD) return 'box:back'\n if (n[1] < -AXIS_THRESHOLD) return 'box:front'\n if (n[0] > AXIS_THRESHOLD) return 'box:right'\n if (n[0] < -AXIS_THRESHOLD) return 'box:left'\n return undefined\n}\n\n/** Z 轴端盖名:'+Z → :top'、'-Z → :bottom'(仅平面)。 */\nfunction axialCapName(prefix: string, surfaceType: string, z: number): string | undefined {\n if (surfaceType !== 'plane') return undefined\n if (z > AXIS_THRESHOLD) return `${prefix}:top`\n if (z < -AXIS_THRESHOLD) return `${prefix}:bottom`\n return undefined\n}\n\n/** cylinder(Z 轴):端盖 + 侧立面。 */\nfunction cylinderRole(surfaceType: string, z: number): string | undefined {\n return surfaceType === 'cylinder' ? 'cylinder:lateral' : axialCapName('cylinder', surfaceType, z)\n}\n\n/** cone(Z 轴):端盖 + 侧立面。 */\nfunction coneRole(surfaceType: string, z: number): string | undefined {\n return surfaceType === 'cone' ? 'cone:lateral' : axialCapName('cone', surfaceType, z)\n}\n\n/** sphere:单球面。 */\nfunction sphereRole(surfaceType: string): string | undefined {\n return surfaceType === 'sphere' ? 'sphere:surface' : undefined\n}\n\n/** 每基本体的语义命名器,按 opType 键控。 */\nconst ROLE_ASSIGNERS: Record<string, (surfaceType: string, normal: readonly [number, number, number]) => string | undefined> = {\n box: (_surfaceType, normal) => boxRoleFromNormal(normal),\n cylinder: (surfaceType, normal) => cylinderRole(surfaceType, normal[2]),\n cone: (surfaceType, normal) => coneRole(surfaceType, normal[2]),\n sphere: (surfaceType, _normal) => sphereRole(surfaceType),\n}\n\n/**\n * 给链根 shape 建 RoleTable(单个 origin 的表;§3.2)。\n *\n * 语义优先、位置兜底;assign 时只保留 hash + hint,不保留面句柄\n * (避免 wasm 句柄生命周期泄漏——读完几何量即弃)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the chain-root solid (primitive / load STEP 产物).\n * @param opType - the chain-root operation type ('box'/'cylinder'/... 或 part 变量名).\n * @returns RoleTable — 只有 origin=opType 一个键(调用方负责包装成多 origin 表)。\n */\nexport function assignRoles(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n opType: string,\n): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const assigner = ROLE_ASSIGNERS[opType]\n const faceHandles = kernel.getSubShapes(shape, 'face')\n try {\n const hashes = kernel.subShapeHashes(shape, 'face', 2147483647)\n let index = 0\n for (let i = 0; i < faceHandles.length; i++) {\n const hint = captureFaceHint(kernel, faceHandles[i])\n const normal = hint.normal ?? [0, 0, 1]\n const surfaceType = hint.surfaceType ?? ''\n const semantic = assigner?.(surfaceType, normal)\n const role =\n semantic !== undefined && !roles.has(semantic)\n ? semantic\n : `${opType}:face_${index}`\n roles.set(role, [hashes[i]])\n index++\n }\n return roles\n } finally {\n // getSubShapes 返回的每个子形都是独立 arena 句柄——读完几何量即释放,\n // 否则每次链根建表泄漏 faceCount 个存活句柄(arena 无界增长)。\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 把一个 role 的 hash 列表推进一个演化步(移植 brepjs nextHashes):\n * deleted 丢弃、modified 全部后继替换(1→多保留全部分片)、未变保留。\n *\n * @param hashes - the role's current face hashes.\n * @param evolution - the hash-keyed evolution record.\n * @returns the successor hashes.\n */\nexport function nextHashes(hashes: readonly number[], evolution: HashEvolution): number[] {\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 return successors\n}\n\n/**\n * 沿一次 hash 演化推进某个 origin 的 role 表(移植 brepjs updateRoles)。\n *\n * generated 刻意不消费(§1.3 事实:occt 系 generated hash 指向中间形、实测 0 存活);\n * 生成面由 DerivedFaceTopoRef 以 lineage 命名。\n *\n * @param roles - the input role table (may be the single-origin map or full table).\n * @param origin - the origin whose roles to advance.\n * @param evolution - the hash-keyed evolution record for this op.\n * @returns a NEW RoleTable with the origin's roles advanced (immutable style).\n */\nexport function propagateRoles(\n roles: RoleTable,\n origin: PartName,\n evolution: HashEvolution,\n): RoleTable {\n const originRoles = roles.get(origin)\n if (!originRoles) return roles\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of originRoles) {\n const successors = nextHashes(hashes, evolution)\n if (successors.length > 0) updated.set(role, successors)\n }\n const result = new Map<PartName, ReadonlyMap<string, readonly number[]>>()\n for (const [key, value] of roles) {\n result.set(key, key === origin ? updated : value)\n }\n return result\n}\n\n/**\n * 沿一次 hash 演化推进 RoleTable 的**所有** origin(单父 op 用,§3.3)。\n *\n * 变换/倒角等单输入 op 只产生一份演化,作用在输入表的所有 origin 上\n * (布尔合流后的表含多个 origin,刚体变换下面 1:1 保留全部)。\n *\n * @param roles - the input role table (possibly multi-origin after a merge).\n * @param evolution - the hash-keyed evolution record for this op.\n * @returns a NEW RoleTable with every origin's roles advanced.\n */\nexport function propagateAllOrigins(\n roles: RoleTable,\n evolution: HashEvolution,\n): RoleTable {\n let result: RoleTable = roles\n for (const origin of roles.keys()) {\n result = propagateRoles(result, origin, evolution)\n }\n return result\n}\n\n/**\n * 布尔合流:合并两个来源的 role 表(§3.4,faijs 对 brepjs 的必要扩展)。\n *\n * 对 A、B 两张 hash 演化分别传播各自的表后合并;布尔新生成的缝面/刃面\n * 以本次布尔语句的 LHS 变量名(= outPart)为新 origin,位置名命名。\n *\n * @param targetTable - the target part's role table.\n * @param targetEvo - the target-side hash evolution (A 的 inHash 去向).\n * @param toolTable - the tool part's role table.\n * @param toolEvo - the tool-side hash evolution (B 的 inHash 去向).\n * @param outPart - the boolean statement's LHS variable name (new origin for seam faces).\n * @param seamCount - how many seam/generated faces to name positionally (0 表示不补).\n * @returns the merged RoleTable.\n */\nexport function mergeRoleTables(\n targetTable: RoleTable,\n targetEvo: HashEvolution,\n toolTable: RoleTable,\n toolEvo: HashEvolution,\n outPart: PartName,\n seamCount: number,\n): RoleTable {\n const result = new Map<PartName, ReadonlyMap<string, readonly number[]>>()\n for (const [origin, roles] of targetTable) {\n const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, targetEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n result.set(origin, advanced)\n }\n for (const [origin, roles] of toolTable) {\n if (result.has(origin)) {\n // 同一 origin 出现在两侧(理论上罕见:同一变量两次输入)——按 tool 侧演化推进后合并。\n const existing = result.get(origin)!\n const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, toolEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n const merged = new Map<string, number[]>(existing as Map<string, number[]>)\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 const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, toolEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n result.set(origin, advanced)\n }\n }\n if (seamCount > 0) {\n const seamRoles = new Map<string, number[]>()\n for (let i = 0; i < seamCount; i++) seamRoles.set(`${outPart}:face_${i}`, [])\n result.set(outPart, seamRoles)\n }\n return result\n}\n\n/**\n * 布尔缝面/刃面的位置名角色表(§3.4:以本次语句 LHS 为新 origin)。\n * 缝面的 hash 来自结果形状的 subShapeHashes(按生成序),此处仅分配 role 名——\n * hash 由调用方在拿到结果 shape 后填入(seam 面 hash 需结果 subShapeHashes 对照)。\n *\n * @param outPart - the boolean statement's LHS variable name.\n * @param count - the number of seam faces to name.\n * @returns a single-origin role map with positional roles.\n */\nexport function assignGeneratedPositionalRoles(outPart: string, count: number): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n for (let i = 0; i < count; i++) roles.set(`${outPart}:face_${i}`, [])\n return roles\n}\n\n/**\n * 序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。\n *\n * 反查需要「序号 → hash」对照:subShapeHashes(shape,'face',B) 的数组下标 i 对应\n * 序号 i+1(§1.1 事实:getSubShapes ↔ subShapeHashes 同走 TopExp::MapShapes、\n * 逐位同序)。调用方传入该对照数组 + 该 origin 的 role 表,返回第 ordinal 个面\n * 的 role 名;不在表中 → undefined。\n *\n * @param roles - the role table for a single origin (role → hash list).\n * @param ordinalToHash - subShapeHashes(shape,'face') 数组:下标 i ↔ 序号 i+1 的 hash。\n * @param ordinal - the face ordinal (1-based).\n * @returns the role name, or undefined when the ordinal isn't tracked.\n */\nexport function roleOfOrdinal(\n roles: ReadonlyMap<string, readonly number[]>,\n ordinalToHash: readonly number[],\n ordinal: number,\n): string | undefined {\n const hash = ordinalToHash[ordinal - 1]\n if (hash === undefined) return undefined\n for (const [role, hashes] of roles) {\n if (hashes.includes(hash)) return role\n }\n return undefined\n}\n"]}
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/topology/naming/roles.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * roles.ts — RoleTable 的生命周期纯逻辑(§3.2/§3.3/§3.4 移植 + 改造)\n *\n * - `assignRoles`:链根建表。语义优先(box/cylinder/cone/sphere 按法向/曲面类型\n * 给稳定名)、位置兜底(`${opType}:face_${i}`,保证每面必有 role)。\n * - `propagateRoles`:沿一次 hash 演化推进表(移植 brepjs updateRoles/nextHashes:\n * deleted 丢弃、modified 全部后继替换、未变保留;generated 刻意不消费)。\n * - `mergeRoleTables`:布尔合流——A/B 两个来源的表各自传播后合并,缝面以本次\n * 语句 LHS 为新 origin 给位置名(§3.4)。\n * - `roleOfOrdinal`:序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { HashEvolution } from '../../brep/face-evolution'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- PartName retained for future 血统 API\nimport type { PartName, StmtId } from '../../identity'\nimport type { RoleTable } from './types'\nimport { semantic, formatRoleName, type RoleName } from './role-name'\nimport { captureFaceHint } from './geom-hint'\n\n/** 主轴判定阈值:abs(component) > 0.9 视为轴对齐。 */\nexport const AXIS_THRESHOLD = 0.9\n\n/** Re-export:hash 键演化(decodeHashEvolution 产出,见 brep/face-evolution.ts §2.4)。 */\nexport type { HashEvolution }\n\n// ── 语义命名器(§3.2:faijs 单位/轴向契约,mm、+Z 向上)──\n//\n// Phase 1.7/1.12(计划 §4.2):命名器输出 **RoleName 结构值**(不再是 'box:top'\n// 这类混入 op 前缀的扁平串)。前缀删除的依据:origin 已改 StmtId 权威表达来源,\n// role 只是「那条语句内的局部名」——'box:top' 里的 'box:' 是把 origin 信息塞进\n// role 的历史残留(违反 R1 的精神)。序列化线格式由 formatRoleName 统一给出\n// (semantic → 'top' / 'lateral' / 'surface')。\n\n/**\n * box 面:按外法向主轴给语义名。\n *\n * @param n - the outward normal of the face (unit length expected).\n * @returns the cardinal role (semantic 'top' etc.), or undefined when no axis dominates.\n */\nexport function boxRoleFromNormal(n: readonly [number, number, number]): RoleName | undefined {\n if (n[2] > AXIS_THRESHOLD) return semantic('top')\n if (n[2] < -AXIS_THRESHOLD) return semantic('bottom')\n if (n[1] > AXIS_THRESHOLD) return semantic('back')\n if (n[1] < -AXIS_THRESHOLD) return semantic('front')\n if (n[0] > AXIS_THRESHOLD) return semantic('right')\n if (n[0] < -AXIS_THRESHOLD) return semantic('left')\n return undefined\n}\n\n/** Z 轴端盖名:'+Z → top'、'-Z → bottom'(仅平面)。 */\nfunction axialCapName(surfaceType: string, z: number): RoleName | undefined {\n if (surfaceType !== 'plane') return undefined\n if (z > AXIS_THRESHOLD) return semantic('top')\n if (z < -AXIS_THRESHOLD) return semantic('bottom')\n return undefined\n}\n\n/** cylinder(Z 轴):端盖 + 侧立面。 */\nfunction cylinderRole(surfaceType: string, z: number): RoleName | undefined {\n return surfaceType === 'cylinder' ? semantic('lateral') : axialCapName(surfaceType, z)\n}\n\n/** cone(Z 轴):端盖 + 侧立面。 */\nfunction coneRole(surfaceType: string, z: number): RoleName | undefined {\n return surfaceType === 'cone' ? semantic('lateral') : axialCapName(surfaceType, z)\n}\n\n/** sphere:单球面。 */\nfunction sphereRole(surfaceType: string): RoleName | undefined {\n return surfaceType === 'sphere' ? semantic('surface') : undefined\n}\n\n/**\n * 每基本体的语义命名器,按 opType 键控。\n *\n * Phase 1.12:输出从扁平串改为 **RoleName**(§4.2 R4:role 是结构化、封闭可枚举的\n * 联合,扁平串只是它的线格式)。词汇表(封闭):box → top/bottom/front/back/left/right;\n * cylinder/cone → lateral/top/bottom;sphere → surface。\n */\nconst ROLE_ASSIGNERS: Record<string, (surfaceType: string, normal: readonly [number, number, number]) => RoleName | undefined> = {\n box: (_surfaceType, normal) => boxRoleFromNormal(normal),\n cylinder: (surfaceType, normal) => cylinderRole(surfaceType, normal[2]),\n cone: (surfaceType, normal) => coneRole(surfaceType, normal[2]),\n sphere: (surfaceType, _normal) => sphereRole(surfaceType),\n}\n\n/**\n * 给链根 shape 建 role 子表(单 origin;§3.2)。\n *\n * 语义命名优先;**位置兜底已删**(Phase 1.7,计划 §4.2 R3:`${opType}:face_${i}`\n * 里的 index 是 OCCT 枚举序号,OCCT 不承诺面序稳定,改参即漂——真正抗重放的\n * 只有语义 role)。无语义名的面**不进表**:缺身份是显式状态(naming 行 role=null),\n * 不是可伪造的名字。R1(局部唯一)由构造保证:同语句内一个 role 只指一个面。\n *\n * assign 时只保留 hash + hint,不保留面句柄\n * (避免 wasm 句柄生命周期泄漏——读完几何量即弃)。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the chain-root solid (primitive / load STEP 产物).\n * @param opType - the chain-root operation type ('box'/'cylinder'/...)。\n * @returns role → hash 子表(role 为 RoleName 线格式串;仅语义命中的面)。\n */\nexport function assignRoles(\n kernel: BrepEngineApi,\n shape: BrepHandle,\n opType: string,\n): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const assigner = ROLE_ASSIGNERS[opType]\n const faceHandles = kernel.getSubShapes(shape, 'face')\n try {\n const hashes = kernel.subShapeHashes(shape, 'face', 2147483647)\n for (let i = 0; i < faceHandles.length; i++) {\n const hint = captureFaceHint(kernel, faceHandles[i])\n const normal = hint.normal ?? [0, 0, 1]\n const surfaceType = hint.surfaceType ?? ''\n const semanticRole = assigner?.(surfaceType, normal)\n // R1:同名不重复认领(对称面法向并列时首个胜出——判定必须唯一胜出,G6)。\n if (semanticRole === undefined || roles.has(formatRoleName(semanticRole))) continue\n roles.set(formatRoleName(semanticRole), [hashes[i]])\n }\n return roles\n } finally {\n // getSubShapes 返回的每个子形都是独立 arena 句柄——读完几何量即释放,\n // 否则每次链根建表泄漏 faceCount 个存活句柄(arena 无界增长)。\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 把一个 role 的 hash 列表推进一个演化步(移植 brepjs nextHashes):\n * deleted 丢弃、modified 全部后继替换(1→多保留全部分片)、未变保留。\n *\n * @param hashes - the role's current face hashes.\n * @param evolution - the hash-keyed evolution record.\n * @returns the successor hashes.\n */\nexport function nextHashes(hashes: readonly number[], evolution: HashEvolution): number[] {\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 return successors\n}\n\n/**\n * 沿一次 hash 演化推进某个 origin 的 role 表(移植 brepjs updateRoles)。\n *\n * generated 刻意不消费(§1.3 事实:occt 系 generated hash 指向中间形、实测 0 存活);\n * 生成面由 DerivedFaceTopoRef 以 lineage 命名。\n *\n * @param roles - the input role table (may be the single-origin map or full table).\n * @param origin - the origin whose roles to advance.\n * @param evolution - the hash-keyed evolution record for this op.\n * @returns a NEW RoleTable with the origin's roles advanced (immutable style).\n */\nexport function propagateRoles(\n roles: RoleTable,\n origin: StmtId,\n evolution: HashEvolution,\n): RoleTable {\n const originRoles = roles.get(origin)\n if (!originRoles) return roles\n const updated = new Map<string, number[]>()\n for (const [role, hashes] of originRoles) {\n const successors = nextHashes(hashes, evolution)\n if (successors.length > 0) updated.set(role, successors)\n }\n const result = new Map<StmtId, ReadonlyMap<string, readonly number[]>>()\n for (const [key, value] of roles) {\n result.set(key, key === origin ? updated : value)\n }\n return result\n}\n\n/**\n * 沿一次 hash 演化推进 RoleTable 的**所有** origin(单父 op 用,§3.3)。\n *\n * 变换/倒角等单输入 op 只产生一份演化,作用在输入表的所有 origin 上\n * (布尔合流后的表含多个 origin,刚体变换下面 1:1 保留全部)。\n *\n * @param roles - the input role table (possibly multi-origin after a merge).\n * @param evolution - the hash-keyed evolution record for this op.\n * @returns a NEW RoleTable with every origin's roles advanced.\n */\nexport function propagateAllOrigins(\n roles: RoleTable,\n evolution: HashEvolution,\n): RoleTable {\n let result: RoleTable = roles\n for (const origin of roles.keys()) {\n result = propagateRoles(result, origin, evolution)\n }\n return result\n}\n\n/**\n * 布尔合流:合并两个来源的 role 表(§3.4,faijs 对 brepjs 的必要扩展)。\n *\n * 对 A、B 两张 hash 演化分别传播各自的表后合并;布尔新生成的缝面/刃面\n * 以本次布尔**语句的 StmtId** 为新 origin(Phase 1.6:不再用 LHS 变量名)。\n * 缝面**不再给位置名**(Phase 1.7:位置兜底已删)——登记空子表占位,\n * 面身份待 Phase 3 的 kernel/byAdjacency 词汇补齐;naming 行将显式 role=null。\n *\n * @param targetTable - the target part's role table.\n * @param targetEvo - the target-side hash evolution (A 的 inHash 去向).\n * @param toolTable - the tool part's role table.\n * @param toolEvo - the tool-side hash evolution (B 的 inHash 去向).\n * @param outStmt - the boolean statement's StmtId (new origin for seam faces).\n * @param seamCount - how many seam/generated faces to register (0 表示不登记).\n * @returns the merged RoleTable.\n */\nexport function mergeRoleTables(\n targetTable: RoleTable,\n targetEvo: HashEvolution,\n toolTable: RoleTable,\n toolEvo: HashEvolution,\n outStmt: StmtId,\n seamCount: number,\n): RoleTable {\n const result = new Map<StmtId, ReadonlyMap<string, readonly number[]>>()\n for (const [origin, roles] of targetTable) {\n const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, targetEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n result.set(origin, advanced)\n }\n for (const [origin, roles] of toolTable) {\n if (result.has(origin)) {\n // 同一 origin 出现在两侧(理论上罕见:同一变量两次输入)——按 tool 侧演化推进后合并。\n const existing = result.get(origin)!\n const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, toolEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n const merged = new Map<string, number[]>(existing as Map<string, number[]>)\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 const advanced = new Map<string, number[]>()\n for (const [role, hashes] of roles) {\n const successors = nextHashes(hashes, toolEvo)\n if (successors.length > 0) advanced.set(role, successors)\n }\n result.set(origin, advanced)\n }\n }\n if (seamCount > 0) {\n // Phase 1.7:缝面不再给位置兜底名。登记空子表占位(origin=本次语句 StmtId),\n // 身份待 Phase 3 kernel/byAdjacency 词汇补齐;naming 行将显式 role=null(G6)。\n result.set(outStmt, new Map())\n }\n return result\n}\n\n/**\n * 序号 → role 反查(§3.7 生成 ExecutionResult.naming 用)。\n *\n * 反查需要「序号 → hash」对照:subShapeHashes(shape,'face',B) 的数组下标 i 对应\n * 序号 i+1(§1.1 事实:getSubShapes ↔ subShapeHashes 同走 TopExp::MapShapes、\n * 逐位同序)。调用方传入该对照数组 + 该 origin 的 role 表,返回第 ordinal 个面\n * 的 role 名;不在表中 → undefined。\n *\n * @param roles - the role table for a single origin (role → hash list).\n * @param ordinalToHash - subShapeHashes(shape,'face') 数组:下标 i ↔ 序号 i+1 的 hash。\n * @param ordinal - the face ordinal (1-based).\n * @returns the role name, or undefined when the ordinal isn't tracked.\n */\nexport function roleOfOrdinal(\n roles: ReadonlyMap<string, readonly number[]>,\n ordinalToHash: readonly number[],\n ordinal: number,\n): string | undefined {\n const hash = ordinalToHash[ordinal - 1]\n if (hash === undefined) return undefined\n for (const [role, hashes] of roles) {\n if (hashes.includes(hash)) return role\n }\n return undefined\n}\n"]}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* hint 是几何兜底。区别:faijs 的 origin 可限定(RoleQualifier),以支持
|
|
9
9
|
* 布尔合流后来自不同链根来源的面。
|
|
10
10
|
*/
|
|
11
|
-
import type { PartName } from '../../identity.js';
|
|
11
|
+
import type { PartName, StmtId } from '../../identity.js';
|
|
12
|
+
import type { RoleName } from './role-name.js';
|
|
12
13
|
/**
|
|
13
14
|
* 轴几何快照(装配约束 P0 前置):圆柱/圆锥面与直边/圆边的有向轴。
|
|
14
15
|
* origin 是轴上一点(圆柱轴点 / 直边起点 / 圆边圆心),direction 是单位轴向。
|
|
@@ -48,17 +49,51 @@ export interface DerivedFaceHint {
|
|
|
48
49
|
readonly edgeMidpoint?: [number, number, number];
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
* role 的全局限定:origin =
|
|
52
|
-
* role =
|
|
52
|
+
* role 的全局限定:origin = 产生该面的那条语句(StmtId,全局唯一),
|
|
53
|
+
* role = 那条语句内的局部名(RoleName 的**线格式串**,`formatRoleName` 输出——
|
|
54
|
+
* 如 'top' / 'wall:3' / 'replica[2]/wall:3';消费点用 `parseRoleName` 解回结构)。
|
|
55
|
+
*
|
|
56
|
+
* Phase 1.6/1.7 就地换型后的形态(计划 §4.1/§4.2):origin 从 PartName 改 StmtId
|
|
57
|
+
* (PartName 会因"同一资产导入两次共用 origin"而算出相同 ref,`import-brep.ts:77`);
|
|
58
|
+
* role 删掉 'box:'/'extrude:' 这类 op 前缀——origin 已由 StmtId 权威表达,
|
|
59
|
+
* 前缀是把 origin 信息塞进 role 的历史残留(违反 R1 的精神)。
|
|
53
60
|
*/
|
|
54
61
|
export interface RoleQualifier {
|
|
55
|
-
readonly origin:
|
|
62
|
+
readonly origin: StmtId;
|
|
56
63
|
readonly role: string;
|
|
57
64
|
}
|
|
58
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* 面身份 = `(StmtId, RoleName)` 的因果坐标。
|
|
67
|
+
*
|
|
68
|
+
* - `origin` 一律 `StmtId`,**链根也用它自己那条语句**(不再有"资产名"这种 origin)。
|
|
69
|
+
* `StmtId` 天然唯一,且与变量重命名解耦——`PartName` 会被改名、也会被复用
|
|
70
|
+
* (同一资产导入两次曾共用 origin,导致两个不同实体的第 k 个面算出完全相同的 ref)。
|
|
71
|
+
* - `role` 是**那条语句内的局部名**(`RoleName`,结构化),全局唯一性由二元组提供。
|
|
72
|
+
* - `display` 仅用于 UI,**不参与身份判定、不参与解析**(UI 要显示"part3.top"是显示问题,
|
|
73
|
+
* 不能反向变成身份的组成部分,否则改个变量名就改身份)。
|
|
74
|
+
*
|
|
75
|
+
* **为什么"链根也用它自己那条语句"**:曾经链根的 origin 是"资产名 / 变量名"——
|
|
76
|
+
* 那是**命名**,不是**来源**。同一份 STEP 被 `cad.load` 两次,两次产出的面在语义上
|
|
77
|
+
* 是不同实体的面,却会拿到同一个 origin;用 StmtId 后它们自然分属两条语句。
|
|
78
|
+
*
|
|
79
|
+
* **V1(`RoleQualifier` / `FaceTopoRef` 等)与 V2 的关系**:V2 不是一套并行的新类型族,
|
|
80
|
+
* 而是把现有 `TopoRef` 族的 `origin`/`role` 字段**就地换成**上面两个字段(Phase 1.6/1.7)。
|
|
81
|
+
* 刻意不先加一套 `TopoRefV2` 并行存在——那会立刻让同一个类型有了两个家(§4.1 明令禁止)。
|
|
82
|
+
* 迁移器需要读旧形态时,旧形态由 `migrate.ts` 自带一份**冻结的** legacy 类型(唯一消费方,
|
|
83
|
+
* 故唯一归属)。
|
|
84
|
+
*/
|
|
85
|
+
export interface FaceIdentity {
|
|
86
|
+
/** 权威:产生这个面的那条语句(全局唯一)。 */
|
|
87
|
+
readonly origin: StmtId;
|
|
88
|
+
/** 那条语句把它当作什么。 */
|
|
89
|
+
readonly role: RoleName;
|
|
90
|
+
/** 显示名,仅 UI 用(不参与身份判定、不参与解析)。 */
|
|
91
|
+
readonly display?: PartName;
|
|
92
|
+
}
|
|
93
|
+
/** 面引用:origin+role 为主键(origin=StmtId、role=RoleName 线格式串),hint 为兜底(对应 brepjs ShapeRef)。 */
|
|
59
94
|
export interface FaceTopoRef {
|
|
60
95
|
readonly kind: 'face';
|
|
61
|
-
readonly origin:
|
|
96
|
+
readonly origin: StmtId;
|
|
62
97
|
readonly role: string;
|
|
63
98
|
readonly hint: FaceHint;
|
|
64
99
|
}
|
|
@@ -87,10 +122,15 @@ export interface DerivedFaceTopoRef {
|
|
|
87
122
|
/** 四类拓扑引用的并集。 */
|
|
88
123
|
export type TopoRef = FaceTopoRef | EdgeTopoRef | VertexTopoRef | DerivedFaceTopoRef;
|
|
89
124
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
125
|
+
* 产生语句(StmtId)→ role → 当前面 hash 列表。1→多分裂时一个 role 对应
|
|
126
|
+
* 多个 hash;resolve 只在后继内裁决。
|
|
127
|
+
*
|
|
128
|
+
* Phase 1.6 换型:外层键从 PartName 改 **StmtId**(§4.1:PartName 会被改名、
|
|
129
|
+
* 会被复用——同一资产导入两次曾共用 origin)。Map 键用 StmtId 的**串形**
|
|
130
|
+
* (`String(stmtId)`);StmtId 是 branded string,串形即其运行期形态。
|
|
131
|
+
* role 键是 RoleName 的线格式串(`formatRoleName` 输出)。
|
|
92
132
|
*/
|
|
93
|
-
export type RoleTable = ReadonlyMap<
|
|
133
|
+
export type RoleTable = ReadonlyMap<StmtId, ReadonlyMap<string, readonly number[]>>;
|
|
94
134
|
/** 解析成功:活实体 + 序号 + 置信度。 */
|
|
95
135
|
export type TopoResolution<T> = {
|
|
96
136
|
readonly ok: true;
|
|
@@ -102,8 +142,8 @@ export type TopoResolution<T> = {
|
|
|
102
142
|
readonly reason: 'deleted' | 'ambiguous' | 'not-found';
|
|
103
143
|
readonly candidatesOrdinal?: readonly number[];
|
|
104
144
|
};
|
|
105
|
-
/** 解析失败错误码:面/边/顶点/生成面统一用 deleted/ambiguous/not-found
|
|
106
|
-
export type TopoErrorCode = 'E_TOPO_DELETED' | 'E_TOPO_AMBIGUOUS' | 'E_TOPO_NOT_FOUND';
|
|
145
|
+
/** 解析失败错误码:面/边/顶点/生成面统一用 deleted/ambiguous/not-found 三码;mesh 路径引用拓扑用 mesh-unsupported。 */
|
|
146
|
+
export type TopoErrorCode = 'E_TOPO_DELETED' | 'E_TOPO_AMBIGUOUS' | 'E_TOPO_NOT_FOUND' | 'E_TOPO_MESH_UNSUPPORTED';
|
|
107
147
|
/** 解析失败异常:带错误码与 ref 的 kind,禁止静默拿序号硬取。 */
|
|
108
148
|
export declare class TopoRefError extends Error {
|
|
109
149
|
/** 错误码:E_TOPO_DELETED / E_TOPO_AMBIGUOUS / E_TOPO_NOT_FOUND。 */
|
|
@@ -116,16 +156,23 @@ export declare class TopoRefError extends Error {
|
|
|
116
156
|
}
|
|
117
157
|
/**
|
|
118
158
|
* 面命名行:序号(1起) ↔ 数组下标。宿主 O(1) 反查:拾取到的 FaceId ordinal
|
|
119
|
-
* → 本行 → captureTopoRef 造 TopoRef。
|
|
159
|
+
* → 本行 → captureTopoRef 造 TopoRef。
|
|
160
|
+
*
|
|
161
|
+
* Phase 1.6/1.7 换型(§4.1/§4.2):
|
|
162
|
+
* - `origin` 是产生该面的那条语句(StmtId)。
|
|
163
|
+
* - `role` 是 RoleName 的**线格式串**('top' / 'wall:3',无 'box:' 这类 op 前缀)。
|
|
164
|
+
* - **无身份面 → `role: null`**(G6:`''` 静默兜底已删)。mesh 来源只填 hint
|
|
165
|
+
* (`origin: null` / `role: null`);BREP 链上解析不出血统也显式为 null,
|
|
166
|
+
* 不再伪造空串。
|
|
120
167
|
*/
|
|
121
168
|
export interface FaceNaming {
|
|
122
|
-
readonly origin:
|
|
123
|
-
readonly role: string;
|
|
169
|
+
readonly origin: StmtId | null;
|
|
170
|
+
readonly role: string | null;
|
|
124
171
|
readonly hint: FaceHint;
|
|
125
172
|
}
|
|
126
173
|
/**
|
|
127
|
-
* 边命名行:两邻面的 RoleQualifier
|
|
128
|
-
*
|
|
174
|
+
* 边命名行:两邻面的 RoleQualifier + 边 hint;任一邻面无血统(mesh 无邻接、
|
|
175
|
+
* 或 BREP 链上未追踪)→ `faces: null`,只给 hint。宿主用它组 EdgeTopoRef(§6.1)。
|
|
129
176
|
*/
|
|
130
177
|
export interface EdgeNaming {
|
|
131
178
|
readonly faces: readonly [RoleQualifier, RoleQualifier] | null;
|
|
@@ -134,9 +181,9 @@ export interface EdgeNaming {
|
|
|
134
181
|
/** 每个 part 的命名数据(ExecutionResult.naming 的 value)。 */
|
|
135
182
|
export interface PartNaming {
|
|
136
183
|
readonly source: 'brep' | 'primitive' | 'mesh';
|
|
137
|
-
/** 面命名行;序号(1起) ↔
|
|
184
|
+
/** 面命名行;序号(1起) ↔ 数组下标。无身份的面 role=null(G6:无静默兜底)。 */
|
|
138
185
|
readonly faceNaming: ReadonlyArray<FaceNaming>;
|
|
139
|
-
/**
|
|
186
|
+
/** 边命名行。无邻接或邻面无血统 → faces=null,只给 hint。 */
|
|
140
187
|
readonly edgeNaming: ReadonlyArray<EdgeNaming>;
|
|
141
188
|
}
|
|
142
189
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/topology/naming/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/topology/naming/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8KH,yCAAyC;AACzC,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,gEAAgE;IACvD,IAAI,CAAe;IAC5B,iEAAiE;IACxD,OAAO,CAAiB;IACjC,+BAA+B;IACtB,iBAAiB,CAAoB;IAE9C,YAAY,IAAmB,EAAE,OAAwB,EAAE,OAAe,EAAE,iBAAqC;QAC/G,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;CACF","sourcesContent":["/**\n *\n * 跨历史身份层:TopoRef 是纯数据、JSON 安全(写进 .fai.js 的参数),\n * 在改参重放后仍能指认「同一个面/边/点」。序号(FaceId/EdgeId)是\n * 快照内地址层,不动;本层叠加在其上。\n *\n * 与 brepjs shapeRef 的分层同构:role 是稳定身份、hash 是会话内活句柄索引、\n * hint 是几何兜底。区别:faijs 的 origin 可限定(RoleQualifier),以支持\n * 布尔合流后来自不同链根来源的面。\n */\n\nimport type { PartName, StmtId } from '../../identity'\nimport type { RoleName } from './role-name'\n\n// ── 几何提示(hint)──\n\n/**\n * 轴几何快照(装配约束 P0 前置):圆柱/圆锥面与直边/圆边的有向轴。\n * origin 是轴上一点(圆柱轴点 / 直边起点 / 圆边圆心),direction 是单位轴向。\n */\nexport interface AxisHint {\n readonly origin: [number, number, number]\n readonly direction: [number, number, number]\n}\n\n/** 面几何快照:与 SelectorRuntime 的 FaceRow(surfaceType/area/center/normal)同源。 */\nexport interface FaceHint {\n readonly kind: 'face'\n readonly surfaceType?: string\n readonly normal?: [number, number, number]\n readonly center?: [number, number, number]\n readonly area?: number\n /** 圆柱/回转面的轴(装配 concentric 等轴约束的实体来源;平面/球面缺省)。 */\n readonly axis?: AxisHint\n}\n\n/** 边几何快照:length/midpoint 作裁决 hint。 */\nexport interface EdgeHint {\n readonly kind: 'edge'\n readonly length?: number\n readonly midpoint?: [number, number, number]\n /** 直边(起点+切向)或圆边(圆心+所在平面法向)的轴(装配轴约束的实体来源)。 */\n readonly axis?: AxisHint\n}\n\n/** 顶点几何快照:position 作裁决 hint。 */\nexport interface VertexHint {\n readonly kind: 'vertex'\n readonly position?: [number, number, number]\n}\n\n/** 生成面(倒角/圆角过渡面)几何快照:被桥接两面的外法向 + 边中点。 */\nexport interface DerivedFaceHint {\n readonly kind: 'derived-face'\n readonly normalA: [number, number, number]\n readonly normalB: [number, number, number]\n readonly edgeMidpoint?: [number, number, number]\n}\n\n// ── role 限定 ──\n\n/**\n * role 的全局限定:origin = 产生该面的那条语句(StmtId,全局唯一),\n * role = 那条语句内的局部名(RoleName 的**线格式串**,`formatRoleName` 输出——\n * 如 'top' / 'wall:3' / 'replica[2]/wall:3';消费点用 `parseRoleName` 解回结构)。\n *\n * Phase 1.6/1.7 就地换型后的形态(计划 §4.1/§4.2):origin 从 PartName 改 StmtId\n * (PartName 会因\"同一资产导入两次共用 origin\"而算出相同 ref,`import-brep.ts:77`);\n * role 删掉 'box:'/'extrude:' 这类 op 前缀——origin 已由 StmtId 权威表达,\n * 前缀是把 origin 信息塞进 role 的历史残留(违反 R1 的精神)。\n */\nexport interface RoleQualifier {\n readonly origin: StmtId\n readonly role: string\n}\n\n// ── 身份(权威形态,计划 §4.1)──\n\n/**\n * 面身份 = `(StmtId, RoleName)` 的因果坐标。\n *\n * - `origin` 一律 `StmtId`,**链根也用它自己那条语句**(不再有\"资产名\"这种 origin)。\n * `StmtId` 天然唯一,且与变量重命名解耦——`PartName` 会被改名、也会被复用\n * (同一资产导入两次曾共用 origin,导致两个不同实体的第 k 个面算出完全相同的 ref)。\n * - `role` 是**那条语句内的局部名**(`RoleName`,结构化),全局唯一性由二元组提供。\n * - `display` 仅用于 UI,**不参与身份判定、不参与解析**(UI 要显示\"part3.top\"是显示问题,\n * 不能反向变成身份的组成部分,否则改个变量名就改身份)。\n *\n * **为什么\"链根也用它自己那条语句\"**:曾经链根的 origin 是\"资产名 / 变量名\"——\n * 那是**命名**,不是**来源**。同一份 STEP 被 `cad.load` 两次,两次产出的面在语义上\n * 是不同实体的面,却会拿到同一个 origin;用 StmtId 后它们自然分属两条语句。\n *\n * **V1(`RoleQualifier` / `FaceTopoRef` 等)与 V2 的关系**:V2 不是一套并行的新类型族,\n * 而是把现有 `TopoRef` 族的 `origin`/`role` 字段**就地换成**上面两个字段(Phase 1.6/1.7)。\n * 刻意不先加一套 `TopoRefV2` 并行存在——那会立刻让同一个类型有了两个家(§4.1 明令禁止)。\n * 迁移器需要读旧形态时,旧形态由 `migrate.ts` 自带一份**冻结的** legacy 类型(唯一消费方,\n * 故唯一归属)。\n */\nexport interface FaceIdentity {\n /** 权威:产生这个面的那条语句(全局唯一)。 */\n readonly origin: StmtId\n /** 那条语句把它当作什么。 */\n readonly role: RoleName\n /** 显示名,仅 UI 用(不参与身份判定、不参与解析)。 */\n readonly display?: PartName\n}\n\n// ── TopoRef 四类 ──\n\n/** 面引用:origin+role 为主键(origin=StmtId、role=RoleName 线格式串),hint 为兜底(对应 brepjs ShapeRef)。 */\nexport interface FaceTopoRef {\n readonly kind: 'face'\n readonly origin: StmtId\n readonly role: string\n readonly hint: FaceHint\n}\n\n/**\n * 边引用:= 两邻面之交。faijs 扩展:两面可能来自布尔合流后的不同 origin,\n * 故用 RoleQualifier(带 origin 的稳定 role)而非 brepjs 的裸 role 串。\n */\nexport interface EdgeTopoRef {\n readonly kind: 'edge'\n readonly faces: readonly [RoleQualifier, RoleQualifier]\n readonly hint: EdgeHint\n}\n\n/** 顶点引用:≥3 邻面之交。 */\nexport interface VertexTopoRef {\n readonly kind: 'vertex'\n readonly faces: readonly RoleQualifier[]\n readonly hint: VertexHint\n}\n\n/** 生成面(倒角斜面/圆角面):桥接两面,normal-blend 解析。 */\nexport interface DerivedFaceTopoRef {\n readonly kind: 'derived-face'\n readonly op: 'fillet' | 'chamfer'\n readonly between: readonly [RoleQualifier, RoleQualifier]\n readonly hint: DerivedFaceHint\n}\n\n/** 四类拓扑引用的并集。 */\nexport type TopoRef = FaceTopoRef | EdgeTopoRef | VertexTopoRef | DerivedFaceTopoRef\n\n// ── 运行期 role 表(不序列化、不进 .fai.js)──\n\n/**\n * 产生语句(StmtId)→ role → 当前面 hash 列表。1→多分裂时一个 role 对应\n * 多个 hash;resolve 只在后继内裁决。\n *\n * Phase 1.6 换型:外层键从 PartName 改 **StmtId**(§4.1:PartName 会被改名、\n * 会被复用——同一资产导入两次曾共用 origin)。Map 键用 StmtId 的**串形**\n * (`String(stmtId)`);StmtId 是 branded string,串形即其运行期形态。\n * role 键是 RoleName 的线格式串(`formatRoleName` 输出)。\n */\nexport type RoleTable = ReadonlyMap<StmtId, ReadonlyMap<string, readonly number[]>>\n\n// ── 解析结果:显式三态,禁止静默取错 ──\n\n/** 解析成功:活实体 + 序号 + 置信度。 */\nexport type TopoResolution<T> =\n | {\n readonly ok: true\n readonly entity: T\n readonly ordinal: number\n readonly confidence: 'exact' | 'geometric-fallback'\n }\n | {\n readonly ok: false\n readonly reason: 'deleted' | 'ambiguous' | 'not-found'\n readonly candidatesOrdinal?: readonly number[]\n }\n\n// ── 错误码(§3.6:解析失败按码抛错,纳入 args 校验)──\n\n/** 解析失败错误码:面/边/顶点/生成面统一用 deleted/ambiguous/not-found 三码;mesh 路径引用拓扑用 mesh-unsupported。 */\nexport type TopoErrorCode =\n | 'E_TOPO_DELETED'\n | 'E_TOPO_AMBIGUOUS'\n | 'E_TOPO_NOT_FOUND'\n | 'E_TOPO_MESH_UNSUPPORTED'\n\n/** 解析失败异常:带错误码与 ref 的 kind,禁止静默拿序号硬取。 */\nexport class TopoRefError extends Error {\n /** 错误码:E_TOPO_DELETED / E_TOPO_AMBIGUOUS / E_TOPO_NOT_FOUND。 */\n readonly code: TopoErrorCode\n /** 解析失败的 TopoRef kind('face'|'edge'|'vertex'|'derived-face')。 */\n readonly refKind: TopoRef['kind']\n /** ambiguous 时的并列候选序号(1 起)。 */\n readonly candidatesOrdinal?: readonly number[]\n\n constructor(code: TopoErrorCode, refKind: TopoRef['kind'], message: string, candidatesOrdinal?: readonly number[]) {\n super(message)\n this.name = 'TopoRefError'\n this.code = code\n this.refKind = refKind\n this.candidatesOrdinal = candidatesOrdinal\n }\n}\n\n// ── §3.7 向宿主暴露的命名行(ExecutionResult.naming 元素)──\n\n/**\n * 面命名行:序号(1起) ↔ 数组下标。宿主 O(1) 反查:拾取到的 FaceId ordinal\n * → 本行 → captureTopoRef 造 TopoRef。\n *\n * Phase 1.6/1.7 换型(§4.1/§4.2):\n * - `origin` 是产生该面的那条语句(StmtId)。\n * - `role` 是 RoleName 的**线格式串**('top' / 'wall:3',无 'box:' 这类 op 前缀)。\n * - **无身份面 → `role: null`**(G6:`''` 静默兜底已删)。mesh 来源只填 hint\n * (`origin: null` / `role: null`);BREP 链上解析不出血统也显式为 null,\n * 不再伪造空串。\n */\nexport interface FaceNaming {\n readonly origin: StmtId | null\n readonly role: string | null\n readonly hint: FaceHint\n}\n\n/**\n * 边命名行:两邻面的 RoleQualifier + 边 hint;任一邻面无血统(mesh 无邻接、\n * 或 BREP 链上未追踪)→ `faces: null`,只给 hint。宿主用它组 EdgeTopoRef(§6.1)。\n */\nexport interface EdgeNaming {\n readonly faces: readonly [RoleQualifier, RoleQualifier] | null\n readonly hint: EdgeHint\n}\n\n/** 每个 part 的命名数据(ExecutionResult.naming 的 value)。 */\nexport interface PartNaming {\n readonly source: 'brep' | 'primitive' | 'mesh'\n /** 面命名行;序号(1起) ↔ 数组下标。无身份的面 role=null(G6:无静默兜底)。 */\n readonly faceNaming: ReadonlyArray<FaceNaming>\n /** 边命名行。无邻接或邻面无血统 → faces=null,只给 hint。 */\n readonly edgeNaming: ReadonlyArray<EdgeNaming>\n}\n"]}
|
|
@@ -65,4 +65,9 @@ export declare function syncRegistryFromGlobal(): void;
|
|
|
65
65
|
export declare function syncRegistryToGlobal(): void;
|
|
66
66
|
/** Current tessellation quality tier. */
|
|
67
67
|
export declare function currentQualityTier(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Test-only: reset the kernel registry (clear kernels, unfreeze) so a host
|
|
70
|
+
* re-assembly in tests can register a different engine. Never called in prod.
|
|
71
|
+
*/
|
|
72
|
+
export declare function __resetKernelRegistryForTests(): void;
|
|
68
73
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1E,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;AAqD1E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAcpD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,kBAAkB,CAM3E;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAErE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAGjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AACD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE1E,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,cAAc,EACd,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,CAAC;AAqD1E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAcpD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,kBAAkB,CAM3E;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAErE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAGjD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AACD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD"}
|
|
@@ -147,4 +147,15 @@ export function syncRegistryToGlobal() {
|
|
|
147
147
|
export function currentQualityTier() {
|
|
148
148
|
return currentQuality();
|
|
149
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Test-only: reset the kernel registry (clear kernels, unfreeze) so a host
|
|
152
|
+
* re-assembly in tests can register a different engine. Never called in prod.
|
|
153
|
+
*/
|
|
154
|
+
export function __resetKernelRegistryForTests() {
|
|
155
|
+
_kernels.clear();
|
|
156
|
+
_defaultKernelId = null;
|
|
157
|
+
_cachedDefault = null;
|
|
158
|
+
_frozen = false;
|
|
159
|
+
syncToGlobal();
|
|
160
|
+
}
|
|
150
161
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kernel registry facade — vendored port (layer L0 contact surface / D10).\n *\n * brepjs `src/kernel/index.ts`, trimmed to the faijs-compatible surface\n * (see docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8):\n *\n * - `getKernel()` is a **frozen read-only reader**: it is bound once at\n * assembly time and never switches at runtime. The runtime-switching\n * `withKernel` and the three-tier `init()` WASM fallback are both cut\n * (D10 — faijs already runs the same philosophy in\n * `brep/engine/registry.ts`'s `freezeEngineRegistries()`).\n * - The single occt-wasm module instance is injected through the faijs\n * `initOcctWasm` chain (D10): the faijs L3 bridge builds an\n * {@link OcctWasmAdapter} over that same instance and registers it here.\n * A second registration after `freezeKernels()` throws.\n *\n * Until an adapter is registered, `getKernel()` throws the same\n * \"not initialized\" error brepjs provides.\n */\n\nimport type { KernelAdapter } from './types.js';\nimport type { Kernel2DCapability } from './kernel2dTypes.js';\nimport type { KernelCapabilities } from './capabilities.js';\nimport { supportsKernel2D } from './kernel2dTypes.js';\nimport { currentQuality } from './quality.js';\nimport { supportsProjection, supportsConstraintSketch } from './types.js';\n// Re-export the L0 type surface used by ported L1/L2 code (identically to brepjs).\nexport type {\n KernelAdapter,\n KernelMeshResult,\n DistanceResult,\n KernelInstance,\n BooleanOptions,\n ShapeType,\n SurfaceType,\n ShapeOrientation,\n MeshOptions,\n KernelShape,\n KernelType,\n StepAssemblyPart,\n ShapeEvolution,\n OperationResult,\n} from './types.js';\nexport type {\n ProjectionCapability,\n ConstraintSketchCapability,\n} from './types.js';\nexport type {\n KernelBooleanOps,\n KernelBuilderOps,\n KernelCore,\n KernelCurveOps,\n KernelEvolutionOps,\n KernelIOOps,\n KernelMeasureOps,\n KernelMeshOps,\n KernelModifierOps,\n KernelPrimitiveOps,\n KernelRepairOps,\n KernelSurfaceOps,\n KernelSweepOps,\n KernelTopologyOps,\n KernelTransformOps,\n} from './interfaces/index.js';\nexport type { Kernel2DCapability } from './kernel2dTypes.js';\nexport type { KernelCapabilities } from './capabilities.js';\nexport { supportsKernel2D, supportsProjection, supportsConstraintSketch };\n\n// Kernel registry lives on globalThis (same pattern as runtime-state\n// '__FAICAD_FAIJS_RUNTIME__'): a CDN-bundled faijs subpath (e.g.\n// `/npm/@faicad/faijs@x/brepjs-compat/+esm`) is a SEPARATE module instance from\n// the host bundle, so module-level `const _kernels` would give the CDN copy an\n// empty registry even though the host already bound occt-wasm — every BREP op\n// then fails with \"kernel not initialized\". Sharing via globalThis keeps one\n// registry across all faijs instances (D10 single-instance holds: all copies\n// see the same occt-wasm adapter).\nconst GLOBAL_KEY = '__FAICAD_FAIJS_KERNEL_REGISTRY__';\ntype KernelRegistryState = {\n stateVersion: 1;\n kernels: Map<string, KernelAdapter>;\n defaultKernelId: string | null;\n cachedDefault: KernelAdapter | null;\n frozen: boolean;\n};\nfunction registryState(): KernelRegistryState {\n const g = globalThis as unknown as Record<string, KernelRegistryState | undefined>;\n let st = g[GLOBAL_KEY];\n if (!st) {\n st = { stateVersion: 1, kernels: new Map<string, KernelAdapter>(), defaultKernelId: null, cachedDefault: null, frozen: false };\n g[GLOBAL_KEY] = st;\n } else if (st.stateVersion !== 1) {\n throw new Error(`[faijs] kernel registry state version mismatch: loaded=${st.stateVersion}, expected=1`);\n }\n return st;\n}\nconst _kernels = new Map<string, KernelAdapter>();\nlet _defaultKernelId: string | null = null;\nlet _cachedDefault: KernelAdapter | null = null;\nlet _frozen = false;\n\n// Sync pass-through accessors over the global registry state. Every exported\n// function calls syncFromGlobal() first so a host-bundle bind is visible to a\n// CDN subpath instance and vice versa; mutations call syncToGlobal().\nfunction syncFromGlobal(): void {\n const st = registryState();\n _kernels.clear();\n for (const [k, v] of st.kernels) _kernels.set(k, v);\n _defaultKernelId = st.defaultKernelId;\n _cachedDefault = st.cachedDefault;\n _frozen = st.frozen;\n}\nfunction syncToGlobal(): void {\n const st = registryState();\n st.kernels = new Map(_kernels);\n st.defaultKernelId = _defaultKernelId;\n st.cachedDefault = _cachedDefault;\n st.frozen = _frozen;\n}\n\n/**\n * Freeze the kernel registry (D10 冻结,同 `freezeEngineRegistries` 时机)。\n * Faijs host calls this at the end of assembly; afterwards any\n * `registerKernel` throws.\n */\nexport function freezeKernels(): void {\n syncFromGlobal();\n _frozen = true;\n syncToGlobal();\n}\n\n/**\n * Register a kernel adapter (DIO injection: L3 bridge registers exactly one\n * 'occt-wasm' adapter over the faijs single wasm instance).\n * @throws If the registry is frozen (post-assembly, D10).\n */\nexport function registerKernel(id: string, adapter: KernelAdapter): void {\n syncFromGlobal();\n if (_frozen) {\n throw new Error(\n `faijs kernel registry frozen — cannot register '${id}' after assembly (D10)`\n );\n }\n _kernels.set(id, adapter);\n if (_defaultKernelId === null) _defaultKernelId = id;\n if (id === _defaultKernelId) _cachedDefault = adapter;\n syncToGlobal();\n}\n\n/**\n * Return a kernel adapter by id, or the default kernel if no id is given.\n *\n * @throws If no kernel has been registered via {@link registerKernel}\n * (D10: bound by the faijs host at assembly, then frozen).\n */\nexport function getKernel(id?: string): KernelAdapter {\n syncFromGlobal();\n if (!id && _cachedDefault) return _cachedDefault;\n const targetId = id ?? _defaultKernelId;\n if (!targetId) {\n throw new Error(\n 'faijs kernel not initialized. The faijs host must bind occt-wasm before use (D10).'\n );\n }\n const kernel = _kernels.get(targetId);\n if (!kernel) {\n throw new Error(`faijs: kernel '${targetId}' is not registered.`);\n }\n return kernel;\n}\n\n/**\n * Return the default kernel narrowed to {@link Kernel2DCapability}.\n * @throws If the kernel does not support 2D operations.\n */\nexport function getKernel2D(id?: string): KernelAdapter & Kernel2DCapability {\n const kernel = getKernel(id);\n if (!supportsKernel2D(kernel)) {\n throw new Error('faijs: current kernel does not support 2D operations.');\n }\n return kernel;\n}\n\n/** Capabilities of the active kernel (defaults to the active). */\nexport function getKernelCapabilities(id?: string): KernelCapabilities {\n return getKernel(id).capabilities;\n}\n\n/** Return the id of the currently active default kernel, or `null` if none. */\nexport function getActiveKernelId(): string | null {\n syncFromGlobal();\n return _defaultKernelId;\n}\n\n/**\n * Cross-instance sync hooks (globalThis registry singleton): exported for the\n * L3 bridge (`api/occt-kernel-bridge.ts`) so a CDN-bundled faijs instance with\n * its own module-level `_bound = false` can observe a host-bundle binding.\n */\nexport function syncRegistryFromGlobal(): void {\n syncFromGlobal();\n}\nexport function syncRegistryToGlobal(): void {\n syncToGlobal();\n}\n\n/** Current tessellation quality tier. */\nexport function currentQualityTier(): string {\n return currentQuality();\n}"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vendored/brepjs/kernel/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kernel registry facade — vendored port (layer L0 contact surface / D10).\n *\n * brepjs `src/kernel/index.ts`, trimmed to the faijs-compatible surface\n * (see docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8):\n *\n * - `getKernel()` is a **frozen read-only reader**: it is bound once at\n * assembly time and never switches at runtime. The runtime-switching\n * `withKernel` and the three-tier `init()` WASM fallback are both cut\n * (D10 — faijs already runs the same philosophy in\n * `brep/engine/registry.ts`'s `freezeEngineRegistries()`).\n * - The single occt-wasm module instance is injected through the faijs\n * `initOcctWasm` chain (D10): the faijs L3 bridge builds an\n * {@link OcctWasmAdapter} over that same instance and registers it here.\n * A second registration after `freezeKernels()` throws.\n *\n * Until an adapter is registered, `getKernel()` throws the same\n * \"not initialized\" error brepjs provides.\n */\n\nimport type { KernelAdapter } from './types.js';\nimport type { Kernel2DCapability } from './kernel2dTypes.js';\nimport type { KernelCapabilities } from './capabilities.js';\nimport { supportsKernel2D } from './kernel2dTypes.js';\nimport { currentQuality } from './quality.js';\nimport { supportsProjection, supportsConstraintSketch } from './types.js';\n// Re-export the L0 type surface used by ported L1/L2 code (identically to brepjs).\nexport type {\n KernelAdapter,\n KernelMeshResult,\n DistanceResult,\n KernelInstance,\n BooleanOptions,\n ShapeType,\n SurfaceType,\n ShapeOrientation,\n MeshOptions,\n KernelShape,\n KernelType,\n StepAssemblyPart,\n ShapeEvolution,\n OperationResult,\n} from './types.js';\nexport type {\n ProjectionCapability,\n ConstraintSketchCapability,\n} from './types.js';\nexport type {\n KernelBooleanOps,\n KernelBuilderOps,\n KernelCore,\n KernelCurveOps,\n KernelEvolutionOps,\n KernelIOOps,\n KernelMeasureOps,\n KernelMeshOps,\n KernelModifierOps,\n KernelPrimitiveOps,\n KernelRepairOps,\n KernelSurfaceOps,\n KernelSweepOps,\n KernelTopologyOps,\n KernelTransformOps,\n} from './interfaces/index.js';\nexport type { Kernel2DCapability } from './kernel2dTypes.js';\nexport type { KernelCapabilities } from './capabilities.js';\nexport { supportsKernel2D, supportsProjection, supportsConstraintSketch };\n\n// Kernel registry lives on globalThis (same pattern as runtime-state\n// '__FAICAD_FAIJS_RUNTIME__'): a CDN-bundled faijs subpath (e.g.\n// `/npm/@faicad/faijs@x/brepjs-compat/+esm`) is a SEPARATE module instance from\n// the host bundle, so module-level `const _kernels` would give the CDN copy an\n// empty registry even though the host already bound occt-wasm — every BREP op\n// then fails with \"kernel not initialized\". Sharing via globalThis keeps one\n// registry across all faijs instances (D10 single-instance holds: all copies\n// see the same occt-wasm adapter).\nconst GLOBAL_KEY = '__FAICAD_FAIJS_KERNEL_REGISTRY__';\ntype KernelRegistryState = {\n stateVersion: 1;\n kernels: Map<string, KernelAdapter>;\n defaultKernelId: string | null;\n cachedDefault: KernelAdapter | null;\n frozen: boolean;\n};\nfunction registryState(): KernelRegistryState {\n const g = globalThis as unknown as Record<string, KernelRegistryState | undefined>;\n let st = g[GLOBAL_KEY];\n if (!st) {\n st = { stateVersion: 1, kernels: new Map<string, KernelAdapter>(), defaultKernelId: null, cachedDefault: null, frozen: false };\n g[GLOBAL_KEY] = st;\n } else if (st.stateVersion !== 1) {\n throw new Error(`[faijs] kernel registry state version mismatch: loaded=${st.stateVersion}, expected=1`);\n }\n return st;\n}\nconst _kernels = new Map<string, KernelAdapter>();\nlet _defaultKernelId: string | null = null;\nlet _cachedDefault: KernelAdapter | null = null;\nlet _frozen = false;\n\n// Sync pass-through accessors over the global registry state. Every exported\n// function calls syncFromGlobal() first so a host-bundle bind is visible to a\n// CDN subpath instance and vice versa; mutations call syncToGlobal().\nfunction syncFromGlobal(): void {\n const st = registryState();\n _kernels.clear();\n for (const [k, v] of st.kernels) _kernels.set(k, v);\n _defaultKernelId = st.defaultKernelId;\n _cachedDefault = st.cachedDefault;\n _frozen = st.frozen;\n}\nfunction syncToGlobal(): void {\n const st = registryState();\n st.kernels = new Map(_kernels);\n st.defaultKernelId = _defaultKernelId;\n st.cachedDefault = _cachedDefault;\n st.frozen = _frozen;\n}\n\n/**\n * Freeze the kernel registry (D10 冻结,同 `freezeEngineRegistries` 时机)。\n * Faijs host calls this at the end of assembly; afterwards any\n * `registerKernel` throws.\n */\nexport function freezeKernels(): void {\n syncFromGlobal();\n _frozen = true;\n syncToGlobal();\n}\n\n/**\n * Register a kernel adapter (DIO injection: L3 bridge registers exactly one\n * 'occt-wasm' adapter over the faijs single wasm instance).\n * @throws If the registry is frozen (post-assembly, D10).\n */\nexport function registerKernel(id: string, adapter: KernelAdapter): void {\n syncFromGlobal();\n if (_frozen) {\n throw new Error(\n `faijs kernel registry frozen — cannot register '${id}' after assembly (D10)`\n );\n }\n _kernels.set(id, adapter);\n if (_defaultKernelId === null) _defaultKernelId = id;\n if (id === _defaultKernelId) _cachedDefault = adapter;\n syncToGlobal();\n}\n\n/**\n * Return a kernel adapter by id, or the default kernel if no id is given.\n *\n * @throws If no kernel has been registered via {@link registerKernel}\n * (D10: bound by the faijs host at assembly, then frozen).\n */\nexport function getKernel(id?: string): KernelAdapter {\n syncFromGlobal();\n if (!id && _cachedDefault) return _cachedDefault;\n const targetId = id ?? _defaultKernelId;\n if (!targetId) {\n throw new Error(\n 'faijs kernel not initialized. The faijs host must bind occt-wasm before use (D10).'\n );\n }\n const kernel = _kernels.get(targetId);\n if (!kernel) {\n throw new Error(`faijs: kernel '${targetId}' is not registered.`);\n }\n return kernel;\n}\n\n/**\n * Return the default kernel narrowed to {@link Kernel2DCapability}.\n * @throws If the kernel does not support 2D operations.\n */\nexport function getKernel2D(id?: string): KernelAdapter & Kernel2DCapability {\n const kernel = getKernel(id);\n if (!supportsKernel2D(kernel)) {\n throw new Error('faijs: current kernel does not support 2D operations.');\n }\n return kernel;\n}\n\n/** Capabilities of the active kernel (defaults to the active). */\nexport function getKernelCapabilities(id?: string): KernelCapabilities {\n return getKernel(id).capabilities;\n}\n\n/** Return the id of the currently active default kernel, or `null` if none. */\nexport function getActiveKernelId(): string | null {\n syncFromGlobal();\n return _defaultKernelId;\n}\n\n/**\n * Cross-instance sync hooks (globalThis registry singleton): exported for the\n * L3 bridge (`api/occt-kernel-bridge.ts`) so a CDN-bundled faijs instance with\n * its own module-level `_bound = false` can observe a host-bundle binding.\n */\nexport function syncRegistryFromGlobal(): void {\n syncFromGlobal();\n}\nexport function syncRegistryToGlobal(): void {\n syncToGlobal();\n}\n\n/** Current tessellation quality tier. */\nexport function currentQualityTier(): string {\n return currentQuality();\n}\n\n/**\n * Test-only: reset the kernel registry (clear kernels, unfreeze) so a host\n * re-assembly in tests can register a different engine. Never called in prod.\n */\nexport function __resetKernelRegistryForTests(): void {\n _kernels.clear();\n _defaultKernelId = null;\n _cachedDefault = null;\n _frozen = false;\n syncToGlobal();\n}"]}
|