@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
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib compound — 平台几何复合体 op(H11 / 方案 §4.2)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 与编辑器 `cad.group`(`api/compound.ts`)的区别:
|
|
6
|
+
* - `group` 是 ../3d_editor 的「结构分组」op:产出 `{kind:'compound', children}`
|
|
7
|
+
* 结构壳(无 OCCT 句柄),意义是层级/画布结构,不可变换、不可导出为实体。
|
|
8
|
+
* - 本 op 是 faijs **平台**几何 op:把多个成员聚成一个**几何复合体**
|
|
9
|
+
* (OCCT `TopoDS_Compound`,持句柄),可被放置、导出、作为后续 op 的输入。
|
|
10
|
+
*
|
|
11
|
+
* 路径:
|
|
12
|
+
* - brep 路径:`kernel.makeCompound(handles)`(收任意 BrepHandle,含非实体)
|
|
13
|
+
* → `solidToShape` 三角化 → `fromBrep` 登记句柄。
|
|
14
|
+
* - mesh 路径:合并成员 mesh(结构 compound 子节点展平;纯线框无面成员不贡献网格)。
|
|
15
|
+
*
|
|
16
|
+
* 成员不 keep:复合体是单一几何输出,成员作为子形被吸入,不单独作为终端显示。
|
|
17
|
+
*/
|
|
18
|
+
import type { Shape } from '../mesh/types.js';
|
|
19
|
+
import { type CompoundShape } from '../shape.js';
|
|
20
|
+
/**
|
|
21
|
+
* mesh 路径:合并成员 mesh(展平结构 compound 子节点)。
|
|
22
|
+
*
|
|
23
|
+
* @param members - 待合并的成员(结构 compound 递归展平)。
|
|
24
|
+
* @returns 合并后的单一 mesh Shape。
|
|
25
|
+
*/
|
|
26
|
+
export declare function mergeMeshes(members: Array<Shape | CompoundShape>): Shape;
|
|
27
|
+
/**
|
|
28
|
+
* `cad.compound({ members, name? })` → 几何复合体 Shape(持 OCCT 句柄)。
|
|
29
|
+
*
|
|
30
|
+
* @group 结构
|
|
31
|
+
* @inputs 1
|
|
32
|
+
* @qual ok
|
|
33
|
+
* @name compound
|
|
34
|
+
* @param params.members - 成员数组(Shape 或结构 compound;编译产物 ctx.<var> 引用)。type:Shape[]
|
|
35
|
+
* @param params.name - 可选名称。type:string
|
|
36
|
+
* @note 成员经 `params.members` 传入,不是位置参数。与编辑器 `cad.group` 的区别:本 op 产出**几何**复合体(持 OCCT 句柄,可放置/导出),`group` 是结构壳(无句柄)。平台侧不要用 `group`。
|
|
37
|
+
* @returns Shape 几何复合体(brep 路径持句柄,可变换/可导出)。
|
|
38
|
+
* @example
|
|
39
|
+
* const c = cad.compound({ members: [part0, part1] })
|
|
40
|
+
*/
|
|
41
|
+
export declare function compound(params: {
|
|
42
|
+
members?: Array<Shape | CompoundShape>;
|
|
43
|
+
name?: string;
|
|
44
|
+
}): Shape;
|
|
45
|
+
//# sourceMappingURL=compound-geom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound-geom.d.ts","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAiB/E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,KAAK,CAWxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAwBjG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib compound — 平台几何复合体 op(H11 / 方案 §4.2)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 与编辑器 `cad.group`(`api/compound.ts`)的区别:
|
|
6
|
+
* - `group` 是 ../3d_editor 的「结构分组」op:产出 `{kind:'compound', children}`
|
|
7
|
+
* 结构壳(无 OCCT 句柄),意义是层级/画布结构,不可变换、不可导出为实体。
|
|
8
|
+
* - 本 op 是 faijs **平台**几何 op:把多个成员聚成一个**几何复合体**
|
|
9
|
+
* (OCCT `TopoDS_Compound`,持句柄),可被放置、导出、作为后续 op 的输入。
|
|
10
|
+
*
|
|
11
|
+
* 路径:
|
|
12
|
+
* - brep 路径:`kernel.makeCompound(handles)`(收任意 BrepHandle,含非实体)
|
|
13
|
+
* → `solidToShape` 三角化 → `fromBrep` 登记句柄。
|
|
14
|
+
* - mesh 路径:合并成员 mesh(结构 compound 子节点展平;纯线框无面成员不贡献网格)。
|
|
15
|
+
*
|
|
16
|
+
* 成员不 keep:复合体是单一几何输出,成员作为子形被吸入,不单独作为终端显示。
|
|
17
|
+
*/
|
|
18
|
+
import { isCompoundLike, brepOf, fromBrep } from '../shape.js';
|
|
19
|
+
import { getBackends, BrepUnsupportedError } from '../runtime-state.js';
|
|
20
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
21
|
+
/** 把任意成员(Shape 或结构 compound)展平为若干子 mesh。 */
|
|
22
|
+
function collectSubMeshes(s) {
|
|
23
|
+
if (isCompoundLike(s)) {
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const c of s.children)
|
|
26
|
+
out.push(...collectSubMeshes(c));
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
if (s.positions && s.indices)
|
|
30
|
+
return [s];
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* mesh 路径:合并成员 mesh(展平结构 compound 子节点)。
|
|
35
|
+
*
|
|
36
|
+
* @param members - 待合并的成员(结构 compound 递归展平)。
|
|
37
|
+
* @returns 合并后的单一 mesh Shape。
|
|
38
|
+
*/
|
|
39
|
+
export function mergeMeshes(members) {
|
|
40
|
+
const positions = [];
|
|
41
|
+
const indices = [];
|
|
42
|
+
for (const m of members) {
|
|
43
|
+
for (const sub of collectSubMeshes(m)) {
|
|
44
|
+
const base = positions.length / 3;
|
|
45
|
+
positions.push(...sub.positions);
|
|
46
|
+
for (let i = 0; i < sub.indices.length; i++)
|
|
47
|
+
indices.push(sub.indices[i] + base);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { positions: new Float32Array(positions), indices: new Uint32Array(indices) };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* `cad.compound({ members, name? })` → 几何复合体 Shape(持 OCCT 句柄)。
|
|
54
|
+
*
|
|
55
|
+
* @group 结构
|
|
56
|
+
* @inputs 1
|
|
57
|
+
* @qual ok
|
|
58
|
+
* @name compound
|
|
59
|
+
* @param params.members - 成员数组(Shape 或结构 compound;编译产物 ctx.<var> 引用)。type:Shape[]
|
|
60
|
+
* @param params.name - 可选名称。type:string
|
|
61
|
+
* @note 成员经 `params.members` 传入,不是位置参数。与编辑器 `cad.group` 的区别:本 op 产出**几何**复合体(持 OCCT 句柄,可放置/导出),`group` 是结构壳(无句柄)。平台侧不要用 `group`。
|
|
62
|
+
* @returns Shape 几何复合体(brep 路径持句柄,可变换/可导出)。
|
|
63
|
+
* @example
|
|
64
|
+
* const c = cad.compound({ members: [part0, part1] })
|
|
65
|
+
*/
|
|
66
|
+
export function compound(params) {
|
|
67
|
+
const members = params.members ?? [];
|
|
68
|
+
const { config, kernel: kernels } = getBackends();
|
|
69
|
+
const kernel = kernels.brep;
|
|
70
|
+
// 结构 compound 是结构壳(无 OCCT 句柄):不在 BREP 链上 → 视为无句柄成员。
|
|
71
|
+
const handles = members.map((m) => (isCompoundLike(m) ? undefined : brepOf(m)));
|
|
72
|
+
const allBrep = !!kernel && handles.every((h) => h !== undefined);
|
|
73
|
+
if (config.mode === 'brep' && !allBrep) {
|
|
74
|
+
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: compound members are not all on the BREP chain');
|
|
75
|
+
}
|
|
76
|
+
// brep 路径:合并为 TopoDS_Compound 并登记句柄
|
|
77
|
+
if (allBrep && config.mode !== 'mesh') {
|
|
78
|
+
const compoundHandle = kernel.makeCompound(handles);
|
|
79
|
+
const mesh = solidToShape(kernel, compoundHandle);
|
|
80
|
+
return fromBrep(mesh, { solid: compoundHandle });
|
|
81
|
+
}
|
|
82
|
+
// mesh 路径:合并成员 mesh
|
|
83
|
+
return mergeMeshes(members);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=compound-geom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound-geom.js","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib compound — 平台几何复合体 op(H11 / 方案 §4.2)\n *\n *\n * 与编辑器 `cad.group`(`api/compound.ts`)的区别:\n * - `group` 是 ../3d_editor 的「结构分组」op:产出 `{kind:'compound', children}`\n * 结构壳(无 OCCT 句柄),意义是层级/画布结构,不可变换、不可导出为实体。\n * - 本 op 是 faijs **平台**几何 op:把多个成员聚成一个**几何复合体**\n * (OCCT `TopoDS_Compound`,持句柄),可被放置、导出、作为后续 op 的输入。\n *\n * 路径:\n * - brep 路径:`kernel.makeCompound(handles)`(收任意 BrepHandle,含非实体)\n * → `solidToShape` 三角化 → `fromBrep` 登记句柄。\n * - mesh 路径:合并成员 mesh(结构 compound 子节点展平;纯线框无面成员不贡献网格)。\n *\n * 成员不 keep:复合体是单一几何输出,成员作为子形被吸入,不单独作为终端显示。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { isCompoundLike, brepOf, fromBrep, type CompoundShape } from '../shape'\nimport { getBackends, BrepUnsupportedError } from '../runtime-state'\nimport { solidToShape } from '../brep/brep-ops'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 把任意成员(Shape 或结构 compound)展平为若干子 mesh。 */\nfunction collectSubMeshes(s: Shape | CompoundShape): Shape[] {\n if (isCompoundLike(s)) {\n const out: Shape[] = []\n for (const c of s.children) out.push(...collectSubMeshes(c))\n return out\n }\n if (s.positions && s.indices) return [s]\n return []\n}\n\n/**\n * mesh 路径:合并成员 mesh(展平结构 compound 子节点)。\n *\n * @param members - 待合并的成员(结构 compound 递归展平)。\n * @returns 合并后的单一 mesh Shape。\n */\nexport function mergeMeshes(members: Array<Shape | CompoundShape>): Shape {\n const positions: number[] = []\n const indices: number[] = []\n for (const m of members) {\n for (const sub of collectSubMeshes(m)) {\n const base = positions.length / 3\n positions.push(...sub.positions)\n for (let i = 0; i < sub.indices.length; i++) indices.push(sub.indices[i] + base)\n }\n }\n return { positions: new Float32Array(positions), indices: new Uint32Array(indices) }\n}\n\n/**\n * `cad.compound({ members, name? })` → 几何复合体 Shape(持 OCCT 句柄)。\n *\n * @group 结构\n * @inputs 1\n * @qual ok\n * @name compound\n * @param params.members - 成员数组(Shape 或结构 compound;编译产物 ctx.<var> 引用)。type:Shape[]\n * @param params.name - 可选名称。type:string\n * @note 成员经 `params.members` 传入,不是位置参数。与编辑器 `cad.group` 的区别:本 op 产出**几何**复合体(持 OCCT 句柄,可放置/导出),`group` 是结构壳(无句柄)。平台侧不要用 `group`。\n * @returns Shape 几何复合体(brep 路径持句柄,可变换/可导出)。\n * @example\n * const c = cad.compound({ members: [part0, part1] })\n */\nexport function compound(params: { members?: Array<Shape | CompoundShape>; name?: string }): Shape {\n const members = params.members ?? []\n const { config, kernel: kernels } = getBackends()\n const kernel = kernels.brep as BrepEngineApi | null\n\n // 结构 compound 是结构壳(无 OCCT 句柄):不在 BREP 链上 → 视为无句柄成员。\n const handles = members.map((m) => (isCompoundLike(m) ? undefined : brepOf(m)))\n const allBrep = !!kernel && handles.every((h) => h !== undefined)\n\n if (config.mode === 'brep' && !allBrep) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: compound members are not all on the BREP chain',\n )\n }\n\n // brep 路径:合并为 TopoDS_Compound 并登记句柄\n if (allBrep && config.mode !== 'mesh') {\n const compoundHandle = kernel!.makeCompound(handles as BrepHandle[])\n const mesh = solidToShape(kernel!, compoundHandle)\n return fromBrep(mesh, { solid: compoundHandle })\n }\n\n // mesh 路径:合并成员 mesh\n return mergeMeshes(members)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-ref.d.ts","sourceRoot":"","sources":["../../src/api/edge-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAA;AAGpE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"edge-ref.d.ts","sourceRoot":"","sources":["../../src/api/edge-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAA;AAGpE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CA2DnE"}
|
package/dist/api/edge-ref.js
CHANGED
|
@@ -46,10 +46,13 @@ export function edgeRef(of, edgeOrdinal) {
|
|
|
46
46
|
throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `edgeRef: edgeOrdinal must be an integer >= 1 (got ${edgeOrdinal})`);
|
|
47
47
|
}
|
|
48
48
|
const kernel = getBackends().kernel.brep;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
// Phase 1.9(D6/§3):mesh 路径不支持拓扑引用——静态判定、显式抛错,不静默降级
|
|
50
|
+
if (!kernel) {
|
|
51
|
+
throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'edge', 'edgeRef: topology references are BREP-only (mesh path unsupported)');
|
|
52
|
+
}
|
|
53
|
+
if (!brepOf(of)) {
|
|
54
|
+
throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'edge', 'edgeRef: input shape has no BREP solid (mesh shapes do not carry topology identity)');
|
|
55
|
+
}
|
|
53
56
|
const ctx = buildEdgeResolutionContext(kernel, of);
|
|
54
57
|
if (!ctx)
|
|
55
58
|
throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'edgeRef: input has no BREP naming context');
|
package/dist/api/edge-ref.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-ref.js","sourceRoot":"","sources":["../../src/api/edge-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAGjC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAElF,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CAAC,EAAS,EAAE,WAAmB;IACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,qDAAqD,WAAW,GAAG,CAAC,CAAA;IACzH,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"edge-ref.js","sourceRoot":"","sources":["../../src/api/edge-ref.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib edge-ref — 边引用查询:把「边序号」解析成 `EdgeTopoRef`(1 起)\n *\n * fillet / chamfer 的选边参数是 `EdgeTopoRef`(相邻两面的 role 对,见\n * `topology/naming`);而外部格式(FCStd / STEP 编辑器 / 上游特征文件)通常只给\n * 「第 N 条边」。本模块是两者之间的桥:在内核现场枚举里取第 N 条边,再由输入\n * Shape 的命名槽(RoleTable + subShapeHashes)反查它两邻面的 `{origin, role}`,\n * 合成可直接喂给 `cad.fillet` / `cad.chamfer` 的 `EdgeTopoRef`。\n *\n * 序号语义(GOTCHA):faijs 的 `getSubShapes(solid,'edge')` 与 `wireframe()` 同用\n * `TopExp::MapShapes` + `NCollection_IndexedMap`(`occt-kernel/topologyExt.ts` 已\n * 记档),故第 N 条边 == FreeCAD 的 `EdgeN`(fcstd-port/test/FreeCAD 的\n * external-geo corpus 测试实测 `wireframe.edgeGroups[k] == FreeCAD \"Edge(k+1)\"`;\n * 2026-09-20 随语料依赖测试迁至 fcstd-port)。这是 FCStd 移植选边的锚点。\n *\n * 与 `faceNormal`(`api/geom.ts`)的差异:`faceNormal` 的 `ordinal` 是 0 起\n * (直接下标 `faces[ordinal]`),而本函数是 1 起——与命名层 `TopoRef` 序号\n * (`ordinal` 1 起,见 `topology/naming/types.ts`)及 FreeCAD `EdgeN` 一致。\n *\n * 纯查询:同步、无副作用、不改 Shape;定不了案一律抛 `TopoRefError`(三态错误码),\n * 绝不静默拿序号硬取。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { brepOf } from '../shape'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { captureEdgeHint, findOriginRole, TopoRefError } from '../topology/naming'\nimport type { EdgeTopoRef, RoleQualifier } from '../topology/naming'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n/**\n * 查询几何体第 N 条边的 `EdgeTopoRef`,供 `cad.fillet` / `cad.chamfer` 的 `edges` 使用:\n * `cad.fillet(base, { edges: [cad.edgeRef(base, 17)], radius: 2 })`。\n *\n * 定不了案(无 BREP / 序号越界 / 邻面不足两面 / 邻面无 role 血统)抛 `TopoRefError`。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name edgeRef\n * @returns EdgeTopoRef 该边的拓扑引用(相邻两面 role 对 + length/midpoint hint)。\n * @param of - 目标几何(BREP 实体所在的 Shape)。type:Shape required:true\n * @param edgeOrdinal - 边序号(1 起;等于 FreeCAD 的 `EdgeN`)。type:number required:true\n * @note 序号 1 起,与命名层 `TopoRef.ordinal` 及 FreeCAD `EdgeN` 同序(`getSubShapes(solid,'edge')` 用 TopExp::MapShapes + IndexedMap 枚举)。\n * @example\n * const part1 = cad.fillet(part0, { edges: [cad.edgeRef(part0, 1)], radius: 2 })\n */\nexport function edgeRef(of: Shape, edgeOrdinal: number): EdgeTopoRef {\n if (!Number.isInteger(edgeOrdinal) || edgeOrdinal < 1) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `edgeRef: edgeOrdinal must be an integer >= 1 (got ${edgeOrdinal})`)\n }\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n // Phase 1.9(D6/§3):mesh 路径不支持拓扑引用——静态判定、显式抛错,不静默降级\n if (!kernel) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'edge', 'edgeRef: topology references are BREP-only (mesh path unsupported)')\n }\n if (!brepOf(of)) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'edge', 'edgeRef: input shape has no BREP solid (mesh shapes do not carry topology identity)')\n }\n\n const ctx = buildEdgeResolutionContext(kernel, of as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'edgeRef: input has no BREP naming context')\n\n const edge = ctx.edges?.find((e) => e.ordinal === edgeOrdinal)\n if (!edge || edge.handle === undefined) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edgeRef: edge ordinal ${edgeOrdinal} out of range [1, ${ctx.edges?.length ?? 0}]`,\n )\n }\n const handle = edge.handle\n\n // 该边的相邻面(现场:逐面枚举其边,与 handle 同体者即邻面)——不依赖\n // ctx.edgeFaceAdjacency 的数组下标对齐(那里按 liveEdges 过滤后建表)。\n const faceOrdinals: number[] = []\n for (const f of ctx.faces) {\n if (f.handle === undefined) continue\n if (kernel.getSubShapes(f.handle, 'edge').some((eh) => kernel.isSame(eh, handle))) {\n faceOrdinals.push(f.ordinal)\n }\n }\n if (faceOrdinals.length < 2) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edgeRef: edge ${edgeOrdinal} has ${faceOrdinals.length} adjacent face(s); an EdgeTopoRef needs a two-face pair`,\n )\n }\n\n const table = ctx.roleTable\n if (!table) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'edgeRef: input shape has no role table (nameless shape)')\n }\n const ordinalToHash = ctx.faces.map((f) => f.hash ?? 0)\n const quals: RoleQualifier[] = []\n for (const fo of faceOrdinals.slice(0, 2)) {\n const found = findOriginRole(table, ordinalToHash, fo)\n if (!found) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `edgeRef: adjacent face ordinal ${fo} has no role lineage`)\n }\n quals.push({ origin: found.origin, role: found.role })\n }\n\n const [qa, qb] = quals as [RoleQualifier, RoleQualifier]\n return { kind: 'edge', faces: [qa, qb], hint: captureEdgeHint(kernel, handle as BrepHandle) }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAoBhD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASzE;AAsID;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,eAAO,MAAM,OAAO;;CA8BlB,CAAA"}
|
package/dist/api/engrave.js
CHANGED
|
@@ -211,5 +211,6 @@ export const engrave = defineOp({
|
|
|
211
211
|
const svgText = await resolveEngraveSvg(params);
|
|
212
212
|
return engraveBrepPath(input, params, svgText);
|
|
213
213
|
},
|
|
214
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
214
215
|
});
|
|
215
216
|
//# sourceMappingURL=engrave.js.map
|
package/dist/api/engrave.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE/C,wDAAwD;AAExD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA+B;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,CAAA;IACvF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,CAAA;IAC9D,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACxD,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,SAAS,oBAAoB,CAC3B,QAAc,EACd,aAAkE;IAElE,MAAM,MAAM,GAAG,aAAa,EAAE,QAAQ,CAAA;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAA;IAC5B,OAAO;QACL,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACvB,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACvB,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;KACxB,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,SAAS,cAAc,CAAC,MAAY;IAClC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAA;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAClD,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IAEjD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;QACjD,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACvD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,GAAG,EAAE,CAAA;IACZ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACf,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAE/B,OAAO;QACL,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAK,EAAE,GAAG,CAAC,EAAG,CAAC;QAC5C,EAAE,GAAG,EAAE,GAAG,CAAC,EAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,CAAC,EAAE,GAAG,CAAC,EAAW,EAAE,GAAG,CAAC,EAAW,CAAC,EAAQ,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,4CAA4C;AAC5C,SAAS,mBAAmB,CAAC,MAAqB,EAAE,KAAiB;IACnE,MAAM,EAAE,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IACvD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACrB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,0DAA0D;AAC1D,KAAK,UAAU,eAAe,CAAC,KAAY,EAAE,MAA+B,EAAE,OAAgB;IAC5F,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IAC1D,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAe,CAAA;IACpC,MAAM,IAAI,GAAI,MAAM,CAAC,IAAyC,IAAI,SAAS,CAAA;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAA0B,CAAA;IAE9C,2CAA2C;IAC3C,IAAI,eAA2B,CAAA;IAC/B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,iBAAiB,EAAE,CAAA;QACzB,MAAM,QAAQ,GAAI,MAAM,CAAC,QAAmB,IAAI,EAAE,CAAA;QAClD,eAAe,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,eAAe,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;YAC5C,KAAK;YACL,cAAc,EAAG,MAAM,CAAC,OAAkB,IAAI,EAAE;SACjD,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IAED,WAAW;IACX,eAAe,GAAG,mBAAmB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAE9D,iBAAiB;IACjB,MAAM,eAAe,GAAU,MAAM,CAAC,UAAmB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACtE,MAAM,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;IAC5D,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAE/B,qEAAqE;IACrE,MAAM,eAAe,GAAU,MAAM,CAAC,UAAmB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACtE,MAAM,eAAe,GAAG,oBAAoB,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACjG,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;IACvE,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;IACvE,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACxD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvB,wBAAwB;IACxB,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAA;IAClC,IAAI,MAAkB,CAAA;IACtB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAE1B,wDAAwD;IACxD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YACvC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,GAAG,KAAK,CAAA;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,iBAAiB,CAAC,MAA+B;IAC9D,OAAO,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI;QACpD,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAmC,EAAE,CAAC;QAChG,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE,KAAY,EAAE,MAA+B,EAAE,EAAE;QAC5D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACjE,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC/C,UAAU;QACV,MAAM,UAAU,GAAU,MAAM,CAAC,UAAmB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACjE,MAAM,UAAU,GAAU,MAAM,CAAC,UAAmB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACjE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;QACtH,MAAM,OAAO,GAAG,CAAC,CAAE,MAAM,CAAC,IAA2B,CAAA;QAErD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE;YACxB,IAAI,EAAG,MAAM,CAAC,IAAyC,IAAI,SAAS;YACpE,KAAK,EAAE,MAAM,CAAC,KAAe;YAC7B,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;YAChD,IAAI,EAAE,OAAO,CAAC,CAAC,CAAE,MAAM,CAAC,IAAe,CAAC,CAAC,CAAC,SAAS;YACnD,QAAQ,EAAE,MAAM,CAAC,QAA8B;YAC/C,GAAG,EAAE,OAAO;YACZ,eAAe,EAAE,YAAY;YAC7B,gBAAgB,EAAE,aAAa;YAC/B,OAAO,EAAE,MAAM,CAAC,OAA6B;SAC9C,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,KAAY,EAAE,MAA+B,EAAE,EAAE;QAC5D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACjE,mBAAmB,CAAC,MAAM,CAAC,CAAA;QAC3B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC/C,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;CACF,CAAC,CAAA","sourcesContent":["/**\n * stdlib engrave — 雕刻库函数\n *\n *\n * dispatchPath 静态判定 brep/mesh。\n * BREP 路径:textToSolid/svgToSolid + boolean(cut/fuse)。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { AssetResolver } from '../cad-runtime/ports'\nimport { cad } from '../mesh'\nimport { parseSvgNaturalSize } from '../primitives/parse-svg-size'\nimport { textToSolid } from '../brep/text/text-to-solid'\nimport { svgToSolid } from '../brep/svg/svg-to-solid'\nimport { ensureDefaultFont } from '../brep/text/fontRegistry'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { resolveSvgArg } from './internal/svg-asset-resolver'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber } from './assert'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate engrave parameters: at least one of `text` or `svg` must be\n * provided, and `depth` (if provided) must be a positive number.\n * @param params - the raw engrave operation parameters.\n */\nexport function assertEngraveParams(params: Record<string, unknown>): void {\n const hasText = params.text !== undefined && params.text !== null && params.text !== ''\n const hasSvg = params.svg !== undefined && params.svg !== null\n if (!hasText && !hasSvg) {\n throw new Error('[stdlib] engrave requires either \"text\" or \"svg\"')\n }\n if (params.depth !== undefined && params.depth !== null) {\n assertPositiveNumber(params.depth, 'engrave.depth')\n }\n}\n\n/** 世界坐标 → BREP solid 局部坐标。 */\nfunction worldToLocalPosition(\n worldPos: Vec3,\n partTransform: { position?: [number, number, number] } | undefined,\n): Vec3 {\n const offset = partTransform?.position\n if (!offset) return worldPos\n return [\n worldPos[0] - offset[0],\n worldPos[1] - offset[1],\n worldPos[2] - offset[2],\n ]\n}\n\n/** 计算将 +Z 轴对齐到目标法向量的 3x4 仿射变换矩阵(仅旋转,无平移,Rodrigues 公式)。 */\nfunction alignZToNormal(normal: Vec3): number[] {\n const [nx, ny, nz] = normal\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz)\n if (len < 1e-10) {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n }\n const ux = nx / len, uy = ny / len, uz = nz / len\n\n if (Math.abs(ux) < 1e-10 && Math.abs(uy) < 1e-10) {\n if (uz > 0) return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n return [1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0]\n }\n\n const s = Math.sqrt(ux * ux + uy * uy)\n const c = uz\n const t = 1 - c\n const ax = -uy / s, ay = ux / s\n\n return [\n c + ax * ax * t, ax * ay * t, ay * s, 0,\n ax * ay * t, c + ay * ay * t, -ax * s, 0,\n -ay * s, ax * s, c, 0,\n ]\n}\n\n/** 将 solid 居中到原点(基于包围盒中心,与 mesh 路径语义一致)。 */\nfunction centerSolidAtOrigin(kernel: BrepEngineApi, solid: BrepHandle): BrepHandle {\n const bb = getSolidBoundingBox(kernel, solid)\n const cx = (bb.min[0] + bb.max[0]) / 2\n const cy = (bb.min[1] + bb.max[1]) / 2\n const cz = (bb.min[2] + bb.max[2]) / 2\n const centered = kernel.translate(solid, -cx, -cy, -cz)\n kernel.release(solid)\n return centered\n}\n\n/** BREP 路径:textToSolid/svgToSolid + boolean(cut/fuse)。 */\nasync function engraveBrepPath(input: Shape, params: Record<string, unknown>, svgText?: string): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/engrave] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/engrave] input is not BREP')\n\n const depth = params.depth as number\n const mode = (params.mode as 'convex' | 'concave' | undefined) ?? 'concave'\n const text = params.text as string | undefined\n\n // 1. 创建装饰 solid(文字或 SVG),depth 与 mesh 路径一致\n let decorationSolid: BrepHandle\n if (text) {\n await ensureDefaultFont()\n const textSize = (params.textSize as number) ?? 10\n decorationSolid = textToSolid(kernel, text, { fontSize: textSize, depth })\n } else if (svgText) {\n decorationSolid = svgToSolid(kernel, svgText, {\n depth,\n targetLongSide: (params.svgSize as number) ?? 20,\n })\n } else {\n throw new Error('[stdlib/engrave] neither text nor svg provided')\n }\n\n // 2. 居中到原点\n decorationSolid = centerSolidAtOrigin(kernel, decorationSolid)\n\n // 3. 旋转 +Z 对齐面法向\n const worldFaceNormal: Vec3 = (params.faceNormal as Vec3) ?? [0, 0, 1]\n const rotMatrix = alignZToNormal(worldFaceNormal)\n const rotated = kernel.transform(decorationSolid, rotMatrix)\n kernel.release(decorationSolid)\n\n // 4. 沿法向偏移 + 平移到面中心(凸 offset=+depth/2,凹 offset=-depth/2;加 0.01 避免共面)\n const worldFaceCenter: Vec3 = (params.faceCenter as Vec3) ?? [0, 0, 0]\n const localFaceCenter = worldToLocalPosition(worldFaceCenter, getBackends().config.partTransform)\n const offset = mode === 'convex' ? depth / 2 : -depth / 2\n const epsilon = 0.01\n const tx = localFaceCenter[0] + worldFaceNormal[0] * (offset + epsilon)\n const ty = localFaceCenter[1] + worldFaceNormal[1] * (offset + epsilon)\n const tz = localFaceCenter[2] + worldFaceNormal[2] * (offset + epsilon)\n const positioned = kernel.translate(rotated, tx, ty, tz)\n kernel.release(rotated)\n\n // 5. 布尔运算(凸=fuse,凹=cut)\n const isRaised = mode === 'convex'\n let result: BrepHandle\n if (isRaised) {\n result = kernel.fuse(inputSolid, positioned)\n } else {\n result = kernel.cut(inputSolid, positioned)\n }\n kernel.release(positioned)\n\n // 5b. cut 可能分裂成多个 solid(compound),用 fuseAll 合并回单一 solid\n try {\n const subSolids = kernel.getSubShapes(result, 'solid')\n if (subSolids.length > 1) {\n const fused = kernel.fuseAll(subSolids)\n for (const s of subSolids) {\n try { kernel.release(s) } catch { /* 已释放 */ }\n }\n try { kernel.release(result) } catch { /* 已释放 */ }\n result = fused\n }\n } catch {\n // getSubShapes 失败说明结果不是 compound,无需处理\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/** 解析 SVG 资产引用(AssetRef → SVG 文本),两条路径共享;无 svg 返回 undefined。 */\nasync function resolveEngraveSvg(params: Record<string, unknown>): Promise<string | undefined> {\n return params.svg !== undefined && params.svg !== null\n ? await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n : undefined\n}\n\n/**\n * 在几何表面雕刻文字或 SVG(文字分支与 logo 分支都可用)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name engrave\n * @returns Shape 雕刻后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.mode - 雕刻方式:concave 凹陷(减法)/ convex 凸出(加法)。type:'concave' | 'convex' 默认 'concave'\n * @param params.depth - 深度 / 凸出高度(mm)。type:number 默认 0\n * @param params.text - 文字内容(与 svg 二选一)。type:string\n * @param params.textSize - 字号(mm)。type:number 默认 10\n * @param params.svg - SVG 资产引用(与 text 二选一;经 cad.asset 解析)。type:string\n * @param params.svgSize - SVG 长边目标尺寸。type:number\n * @param params.faceCenter - 面位置(绝对坐标)。type:[x,y,z] 默认 [0,0,0]\n * @param params.faceNormal - 面法向。type:[x,y,z] 默认 [0,0,1]\n * @note 早期 logo 分支用 `svgText`(整份 XML 拷贝 + `svgSize` 文本导出丢失,往返失真);现已改为 `svg` 资产引用,`engravingType` 冗余键已移除。faceCenter/faceNormal 目前是绝对坐标快照。\n * @example\n * const p = await cad.engrave(part0, { mode: 'concave', depth: 2, text: 'Hello', textSize: 10, faceCenter: [0, 0, 0], faceNormal: [0, 0, -1] })\n */\nexport const engrave = defineOp({\n mesh: async (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/engrave] no input geometry')\n assertEngraveParams(params)\n const svgText = await resolveEngraveSvg(params)\n // mesh 路径\n const faceCenter: Vec3 = (params.faceCenter as Vec3) ?? [0, 0, 0]\n const faceNormal: Vec3 = (params.faceNormal as Vec3) ?? [0, 0, 1]\n const { naturalWidth, naturalHeight } = svgText ? parseSvgNaturalSize(svgText) : { naturalWidth: 0, naturalHeight: 0 }\n const hasText = !!(params.text as string | undefined)\n\n return cad.engrave(input, {\n mode: (params.mode as 'convex' | 'concave' | undefined) ?? 'concave',\n depth: params.depth as number,\n face: { center: faceCenter, normal: faceNormal },\n text: hasText ? (params.text as string) : undefined,\n textSize: params.textSize as number | undefined,\n svg: svgText,\n svgNaturalWidth: naturalWidth,\n svgNaturalHeight: naturalHeight,\n svgSize: params.svgSize as number | undefined,\n })\n },\n brep: async (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/engrave] no input geometry')\n assertEngraveParams(params)\n const svgText = await resolveEngraveSvg(params)\n return engraveBrepPath(input, params, svgText)\n },\n})\n"]}
|
|
1
|
+
{"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib engrave — 雕刻库函数\n *\n *\n * dispatchPath 静态判定 brep/mesh。\n * BREP 路径:textToSolid/svgToSolid + boolean(cut/fuse)。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { AssetResolver } from '../cad-runtime/ports'\nimport { cad } from '../mesh'\nimport { parseSvgNaturalSize } from '../primitives/parse-svg-size'\nimport { textToSolid } from '../brep/text/text-to-solid'\nimport { svgToSolid } from '../brep/svg/svg-to-solid'\nimport { ensureDefaultFont } from '../brep/text/fontRegistry'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { resolveSvgArg } from './internal/svg-asset-resolver'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { assertPositiveNumber } from './assert'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate engrave parameters: at least one of `text` or `svg` must be\n * provided, and `depth` (if provided) must be a positive number.\n * @param params - the raw engrave operation parameters.\n */\nexport function assertEngraveParams(params: Record<string, unknown>): void {\n const hasText = params.text !== undefined && params.text !== null && params.text !== ''\n const hasSvg = params.svg !== undefined && params.svg !== null\n if (!hasText && !hasSvg) {\n throw new Error('[stdlib] engrave requires either \"text\" or \"svg\"')\n }\n if (params.depth !== undefined && params.depth !== null) {\n assertPositiveNumber(params.depth, 'engrave.depth')\n }\n}\n\n/** 世界坐标 → BREP solid 局部坐标。 */\nfunction worldToLocalPosition(\n worldPos: Vec3,\n partTransform: { position?: [number, number, number] } | undefined,\n): Vec3 {\n const offset = partTransform?.position\n if (!offset) return worldPos\n return [\n worldPos[0] - offset[0],\n worldPos[1] - offset[1],\n worldPos[2] - offset[2],\n ]\n}\n\n/** 计算将 +Z 轴对齐到目标法向量的 3x4 仿射变换矩阵(仅旋转,无平移,Rodrigues 公式)。 */\nfunction alignZToNormal(normal: Vec3): number[] {\n const [nx, ny, nz] = normal\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz)\n if (len < 1e-10) {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n }\n const ux = nx / len, uy = ny / len, uz = nz / len\n\n if (Math.abs(ux) < 1e-10 && Math.abs(uy) < 1e-10) {\n if (uz > 0) return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0]\n return [1, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0]\n }\n\n const s = Math.sqrt(ux * ux + uy * uy)\n const c = uz\n const t = 1 - c\n const ax = -uy / s, ay = ux / s\n\n return [\n c + ax * ax * t, ax * ay * t, ay * s, 0,\n ax * ay * t, c + ay * ay * t, -ax * s, 0,\n -ay * s, ax * s, c, 0,\n ]\n}\n\n/** 将 solid 居中到原点(基于包围盒中心,与 mesh 路径语义一致)。 */\nfunction centerSolidAtOrigin(kernel: BrepEngineApi, solid: BrepHandle): BrepHandle {\n const bb = getSolidBoundingBox(kernel, solid)\n const cx = (bb.min[0] + bb.max[0]) / 2\n const cy = (bb.min[1] + bb.max[1]) / 2\n const cz = (bb.min[2] + bb.max[2]) / 2\n const centered = kernel.translate(solid, -cx, -cy, -cz)\n kernel.release(solid)\n return centered\n}\n\n/** BREP 路径:textToSolid/svgToSolid + boolean(cut/fuse)。 */\nasync function engraveBrepPath(input: Shape, params: Record<string, unknown>, svgText?: string): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/engrave] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/engrave] input is not BREP')\n\n const depth = params.depth as number\n const mode = (params.mode as 'convex' | 'concave' | undefined) ?? 'concave'\n const text = params.text as string | undefined\n\n // 1. 创建装饰 solid(文字或 SVG),depth 与 mesh 路径一致\n let decorationSolid: BrepHandle\n if (text) {\n await ensureDefaultFont()\n const textSize = (params.textSize as number) ?? 10\n decorationSolid = textToSolid(kernel, text, { fontSize: textSize, depth })\n } else if (svgText) {\n decorationSolid = svgToSolid(kernel, svgText, {\n depth,\n targetLongSide: (params.svgSize as number) ?? 20,\n })\n } else {\n throw new Error('[stdlib/engrave] neither text nor svg provided')\n }\n\n // 2. 居中到原点\n decorationSolid = centerSolidAtOrigin(kernel, decorationSolid)\n\n // 3. 旋转 +Z 对齐面法向\n const worldFaceNormal: Vec3 = (params.faceNormal as Vec3) ?? [0, 0, 1]\n const rotMatrix = alignZToNormal(worldFaceNormal)\n const rotated = kernel.transform(decorationSolid, rotMatrix)\n kernel.release(decorationSolid)\n\n // 4. 沿法向偏移 + 平移到面中心(凸 offset=+depth/2,凹 offset=-depth/2;加 0.01 避免共面)\n const worldFaceCenter: Vec3 = (params.faceCenter as Vec3) ?? [0, 0, 0]\n const localFaceCenter = worldToLocalPosition(worldFaceCenter, getBackends().config.partTransform)\n const offset = mode === 'convex' ? depth / 2 : -depth / 2\n const epsilon = 0.01\n const tx = localFaceCenter[0] + worldFaceNormal[0] * (offset + epsilon)\n const ty = localFaceCenter[1] + worldFaceNormal[1] * (offset + epsilon)\n const tz = localFaceCenter[2] + worldFaceNormal[2] * (offset + epsilon)\n const positioned = kernel.translate(rotated, tx, ty, tz)\n kernel.release(rotated)\n\n // 5. 布尔运算(凸=fuse,凹=cut)\n const isRaised = mode === 'convex'\n let result: BrepHandle\n if (isRaised) {\n result = kernel.fuse(inputSolid, positioned)\n } else {\n result = kernel.cut(inputSolid, positioned)\n }\n kernel.release(positioned)\n\n // 5b. cut 可能分裂成多个 solid(compound),用 fuseAll 合并回单一 solid\n try {\n const subSolids = kernel.getSubShapes(result, 'solid')\n if (subSolids.length > 1) {\n const fused = kernel.fuseAll(subSolids)\n for (const s of subSolids) {\n try { kernel.release(s) } catch { /* 已释放 */ }\n }\n try { kernel.release(result) } catch { /* 已释放 */ }\n result = fused\n }\n } catch {\n // getSubShapes 失败说明结果不是 compound,无需处理\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/** 解析 SVG 资产引用(AssetRef → SVG 文本),两条路径共享;无 svg 返回 undefined。 */\nasync function resolveEngraveSvg(params: Record<string, unknown>): Promise<string | undefined> {\n return params.svg !== undefined && params.svg !== null\n ? await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n : undefined\n}\n\n/**\n * 在几何表面雕刻文字或 SVG(文字分支与 logo 分支都可用)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name engrave\n * @returns Shape 雕刻后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.mode - 雕刻方式:concave 凹陷(减法)/ convex 凸出(加法)。type:'concave' | 'convex' 默认 'concave'\n * @param params.depth - 深度 / 凸出高度(mm)。type:number 默认 0\n * @param params.text - 文字内容(与 svg 二选一)。type:string\n * @param params.textSize - 字号(mm)。type:number 默认 10\n * @param params.svg - SVG 资产引用(与 text 二选一;经 cad.asset 解析)。type:string\n * @param params.svgSize - SVG 长边目标尺寸。type:number\n * @param params.faceCenter - 面位置(绝对坐标)。type:[x,y,z] 默认 [0,0,0]\n * @param params.faceNormal - 面法向。type:[x,y,z] 默认 [0,0,1]\n * @note 早期 logo 分支用 `svgText`(整份 XML 拷贝 + `svgSize` 文本导出丢失,往返失真);现已改为 `svg` 资产引用,`engravingType` 冗余键已移除。faceCenter/faceNormal 目前是绝对坐标快照。\n * @example\n * const p = await cad.engrave(part0, { mode: 'concave', depth: 2, text: 'Hello', textSize: 10, faceCenter: [0, 0, 0], faceNormal: [0, 0, -1] })\n */\nexport const engrave = defineOp({\n mesh: async (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/engrave] no input geometry')\n assertEngraveParams(params)\n const svgText = await resolveEngraveSvg(params)\n // mesh 路径\n const faceCenter: Vec3 = (params.faceCenter as Vec3) ?? [0, 0, 0]\n const faceNormal: Vec3 = (params.faceNormal as Vec3) ?? [0, 0, 1]\n const { naturalWidth, naturalHeight } = svgText ? parseSvgNaturalSize(svgText) : { naturalWidth: 0, naturalHeight: 0 }\n const hasText = !!(params.text as string | undefined)\n\n return cad.engrave(input, {\n mode: (params.mode as 'convex' | 'concave' | undefined) ?? 'concave',\n depth: params.depth as number,\n face: { center: faceCenter, normal: faceNormal },\n text: hasText ? (params.text as string) : undefined,\n textSize: params.textSize as number | undefined,\n svg: svgText,\n svgNaturalWidth: naturalWidth,\n svgNaturalHeight: naturalHeight,\n svgSize: params.svgSize as number | undefined,\n })\n },\n brep: async (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/engrave] no input geometry')\n assertEngraveParams(params)\n const svgText = await resolveEngraveSvg(params)\n return engraveBrepPath(input, params, svgText)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extrude.d.ts","sourceRoot":"","sources":["../../src/api/extrude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
1
|
+
{"version":3,"file":"extrude.d.ts","sourceRoot":"","sources":["../../src/api/extrude.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAYH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAGhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAsGrD,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,KAAK,EAAE,IAAI,CAAA;IACX,gDAAgD;IAChD,MAAM,EAAE,IAAI,CAAA;CACb;AAED,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,CAAA;AAEnF,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,uDAAuD;IACvD,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;IAC7B,kCAAkC;IAClC,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AA2OD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,OAAO;;CAwClB,CAAA"}
|
package/dist/api/extrude.js
CHANGED
|
@@ -26,11 +26,121 @@ import { extrude as projectedExtrude } from './generated/operations.js';
|
|
|
26
26
|
import * as THREE from 'three';
|
|
27
27
|
import { solidToShape, matrixToArray } from '../brep/brep-ops.js';
|
|
28
28
|
import { getSolidBoundingBox } from '../brep/brep-utils.js';
|
|
29
|
-
import { getBackends } from '../runtime-state.js';
|
|
29
|
+
import { getBackends, getCurrentStmt } from '../runtime-state.js';
|
|
30
30
|
import { fromBrep, brepOf } from '../shape.js';
|
|
31
|
+
import { formatRoleName, semantic, wall } from '../topology/naming/role-name.js';
|
|
31
32
|
import { defineOp } from '../sdk.js';
|
|
32
33
|
import { assertPositiveNumber } from './assert.js';
|
|
33
34
|
import { TopoRefError } from '../topology/naming/index.js';
|
|
35
|
+
/**
|
|
36
|
+
|
|
37
|
+
* extrude 的 construct 词汇表(计划 §4.4):`cap:bottom` / `cap:top` / `wall:<i>`。
|
|
38
|
+
*
|
|
39
|
+
* 判定口径:
|
|
40
|
+
* - 拉伸方向取自一对平面端面法向的**带符号差**(两法向指向相反)——不依赖脚本
|
|
41
|
+
* 怎么写方向,现场几何是唯一真值;
|
|
42
|
+
* - 面法向与拉伸轴 |cos| ≈ 1 → 端面:中心沿轴分量小者 `cap:bottom`、大者 `cap:top`;
|
|
43
|
+
* - 面法向与拉伸轴 |cos| ≈ 0 → 侧面 `wall:<i>`,i = 该面在侧面枚举中的相对序
|
|
44
|
+
* (OCCT prism 的侧面顺序 = profile wire 的边序——makeWire 按构造顺序收边,
|
|
45
|
+
* prism 不重排;G3-L1 改参重放依赖该稳定性);
|
|
46
|
+
* - 非平面/无法向的面不进表:缺身份是显式状态(naming 行 role=null),不伪造。
|
|
47
|
+
*
|
|
48
|
+
* @param kernel - the OCCT kernel.
|
|
49
|
+
* @param solid - the extruded solid.
|
|
50
|
+
* @returns role(线格式串)→ hash 子表。
|
|
51
|
+
*/
|
|
52
|
+
function extrudeConstructRoles(kernel, solid) {
|
|
53
|
+
const roles = new Map();
|
|
54
|
+
const faceHandles = kernel.getSubShapes(solid, 'face');
|
|
55
|
+
try {
|
|
56
|
+
const hashes = kernel.subShapeHashes(solid, 'face', 2147483647);
|
|
57
|
+
// 每面的法向(仅平面;侧面可能是圆柱/其它——wall 只挂平面侧面的前提是
|
|
58
|
+
// 直拉伸,斜面/圆柱侧面留待 3.1 的完整枚举器)
|
|
59
|
+
const normals = faceHandles.map((f) => {
|
|
60
|
+
if (kernel.surfaceType(f) !== 'plane')
|
|
61
|
+
return undefined;
|
|
62
|
+
const uv = kernel.uvBounds(f);
|
|
63
|
+
const n = kernel.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2);
|
|
64
|
+
return [n.x, n.y, n.z];
|
|
65
|
+
});
|
|
66
|
+
const centers = faceHandles.map((f) => {
|
|
67
|
+
const c = kernel.getSurfaceCenterOfMass(f);
|
|
68
|
+
return [c.x, c.y, c.z];
|
|
69
|
+
});
|
|
70
|
+
// 拉伸轴:找一对 |cos| ≈ 1 的反平行平面法向 → 带符号单位方向
|
|
71
|
+
let axis;
|
|
72
|
+
for (let i = 0; i < normals.length && !axis; i++) {
|
|
73
|
+
const a = normals[i];
|
|
74
|
+
if (!a)
|
|
75
|
+
continue;
|
|
76
|
+
for (let j = i + 1; j < normals.length; j++) {
|
|
77
|
+
const b = normals[j];
|
|
78
|
+
if (!b)
|
|
79
|
+
continue;
|
|
80
|
+
const lenA = Math.hypot(a[0], a[1], a[2]);
|
|
81
|
+
const lenB = Math.hypot(b[0], b[1], b[2]);
|
|
82
|
+
if (lenA < 1e-9 || lenB < 1e-9)
|
|
83
|
+
continue;
|
|
84
|
+
const cos = (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]) / (lenA * lenB);
|
|
85
|
+
if (Math.abs(cos) > 0.999) {
|
|
86
|
+
// b 反向即「从 i 面指向 j 面」的方向
|
|
87
|
+
axis = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const axisLen = axis ? Math.hypot(axis[0], axis[1], axis[2]) : 0;
|
|
93
|
+
if (axis && axisLen > 1e-9) {
|
|
94
|
+
const ax = [axis[0] / axisLen, axis[1] / axisLen, axis[2] / axisLen];
|
|
95
|
+
// 端面:沿轴投影最小者 = cap:bottom,最大者 = cap:top
|
|
96
|
+
const capCandidates = [];
|
|
97
|
+
for (let i = 0; i < normals.length; i++) {
|
|
98
|
+
const n = normals[i];
|
|
99
|
+
if (!n)
|
|
100
|
+
continue;
|
|
101
|
+
const len = Math.hypot(n[0], n[1], n[2]) || 1;
|
|
102
|
+
const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len;
|
|
103
|
+
if (cos > 0.999) {
|
|
104
|
+
capCandidates.push({ idx: i, t: centers[i][0] * ax[0] + centers[i][1] * ax[1] + centers[i][2] * ax[2] });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (capCandidates.length >= 2) {
|
|
108
|
+
capCandidates.sort((p, q) => p.t - q.t);
|
|
109
|
+
const bottom = capCandidates[0];
|
|
110
|
+
const top = capCandidates[capCandidates.length - 1];
|
|
111
|
+
// 端面词汇用 semantic('bottom'/'top'——与 box 同形)。计划 §4.4 写的
|
|
112
|
+
// `cap:<name>` 前缀形态与 RoleName 契约冲突(semantic 名不允许 ':',
|
|
113
|
+
// role-name.ts SEMANTIC_NAME_RE),落地以契约为准:semantic 直名。
|
|
114
|
+
if (hashes[bottom.idx] !== undefined)
|
|
115
|
+
roles.set(formatRoleName(semantic('bottom')), [hashes[bottom.idx]]);
|
|
116
|
+
if (hashes[top.idx] !== undefined)
|
|
117
|
+
roles.set(formatRoleName(semantic('top')), [hashes[top.idx]]);
|
|
118
|
+
}
|
|
119
|
+
// 侧面:|cos| ≈ 0,按枚举序编号(= profile 边序)
|
|
120
|
+
let wallIdx = 0;
|
|
121
|
+
for (let i = 0; i < normals.length; i++) {
|
|
122
|
+
const n = normals[i];
|
|
123
|
+
if (!n || hashes[i] === undefined)
|
|
124
|
+
continue;
|
|
125
|
+
const len = Math.hypot(n[0], n[1], n[2]) || 1;
|
|
126
|
+
const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len;
|
|
127
|
+
if (cos < 0.001) {
|
|
128
|
+
roles.set(formatRoleName(wall(wallIdx)), [hashes[i]]);
|
|
129
|
+
wallIdx++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return roles;
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
for (const h of faceHandles) {
|
|
137
|
+
try {
|
|
138
|
+
kernel.release(h);
|
|
139
|
+
}
|
|
140
|
+
catch { /* 已释放 */ }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
34
144
|
/** 判定是否为朴素对象(对象形态判别器,避免误吞 Shape / 数组)。 */
|
|
35
145
|
function isPlainObject(v) {
|
|
36
146
|
return v !== null && typeof v === 'object' && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
|
|
@@ -287,13 +397,31 @@ export const extrude = defineOp({
|
|
|
287
397
|
if (!inputSolid)
|
|
288
398
|
throw new Error('[stdlib/extrude] input is not BREP');
|
|
289
399
|
const clipped = extrudeUpToSolid(kernel, inputSolid, o);
|
|
290
|
-
|
|
400
|
+
// 3.2: inlined registerExtrudeRoles — origin = StmtId, roles from construct enumerator
|
|
401
|
+
const origin = String(getCurrentStmt()?.id ?? '');
|
|
402
|
+
return fromBrep(solidToShape(kernel, clipped), {
|
|
403
|
+
solid: clipped,
|
|
404
|
+
roleTable: new Map([[origin, extrudeConstructRoles(kernel, clipped)]]),
|
|
405
|
+
});
|
|
291
406
|
}
|
|
292
407
|
// 长度形态:委托生成投影(生成投影自带借入 / Result 翻转 / 收养)
|
|
293
408
|
const normal = new THREE.Vector3(...(o.normal ?? [0, 0, 1])).normalize();
|
|
294
409
|
const sign = o.mode === 'backward' ? -1 : 1;
|
|
295
410
|
const v = [normal.x * o.length * sign, normal.y * o.length * sign, normal.z * o.length * sign];
|
|
296
|
-
|
|
411
|
+
const result = (await projectedExtrude(input, v));
|
|
412
|
+
// E3 后续:委托路径同样要建链根表(投影只给几何,命名是 faijs 语义)。
|
|
413
|
+
// 3.2: inlined registerExtrudeRoles — origin = StmtId, roles from construct enumerator
|
|
414
|
+
const kernel = getBackends().kernel.brep;
|
|
415
|
+
const solid = kernel ? brepOf(result) : undefined;
|
|
416
|
+
if (kernel && solid) {
|
|
417
|
+
const origin = String(getCurrentStmt()?.id ?? '');
|
|
418
|
+
return fromBrep(solidToShape(kernel, solid), {
|
|
419
|
+
solid,
|
|
420
|
+
roleTable: new Map([[origin, extrudeConstructRoles(kernel, solid)]]),
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
return result;
|
|
297
424
|
},
|
|
425
|
+
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'wall', index: 0 }] } },
|
|
298
426
|
});
|
|
299
427
|
//# sourceMappingURL=extrude.js.map
|