@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":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AACvF,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,SAAS,IAAI,iBAAiB,EAC9B,cAAc,EACd,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,oCAAoC,CAAA;AAG3C,IAAI,MAAM,GAAG,KAAK,CAAA;AAElB;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,8EAA8E;IAC9E,8EAA8E;IAC9E,wEAAwE;IACxE,kEAAkE;IAClE,sBAAsB,EAAE,CAAC;IACzB,IAAI,MAAM;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAA;IAEjD,MAAM,WAAW,GAAG,cAAc,EAAgC,CAAA;IAClE,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IACvD,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACpC,aAAa,EAAE,CAAA;IACf,MAAM,GAAG,IAAI,CAAA;IACb,oBAAoB,EAAE,CAAA;IACtB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,IAAI,iBAAiB,EAAE,KAAK,WAAW,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAA;AACvC,CAAC","sourcesContent":["/**\n * L3 bridge — occt-wasm kernel single-instance injection (D10).\n *\n * The ported `kernel/occtWasm` adapter is constructor-injected (DI form, never\n * imports `occt-wasm` itself). This file is the **only** faijs-side place\n * wiring the two together (boundary rule D8/R5: core side may import the\n * vendored tree only from `api/`):\n *\n * initOcctWasm() ──same instance──▶ OcctWasmAdapter ──▶ registerKernel\n * (faijs existing (vendored, DI) (vendored kernel\n * occt singleton) registry, D10)\n *\n * `occtKernel.getKernel()` returns the faijs singleton `OcctKernel`; building\n * the adapter over that exact instance guarantees the single-instance ban\n * (D10: two wasm instances would put handles in different pointer spaces and\n * silently desync `hasBrep`/`brepOf`/face evolution).\n *\n * See docs/plans/2026-09-01-layered-api-architecture.md §D10 / §D8.\n */\n\nimport { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel'\nimport type { OcctKernelOwner } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport {\n freezeKernels,\n getActiveKernelId,\n getKernel as getVendoredKernel,\n registerKernel,\n syncRegistryFromGlobal,\n syncRegistryToGlobal,\n} from '../vendored/brepjs/kernel/index.js'\nimport type { KernelAdapter } from '../vendored/brepjs/kernel/types.js'\n\nlet _bound = false\n\n/**\n * Bind the ported kernel registry to the faijs single occt-wasm instance.\n *\n * Idempotent: the first call registers the adapter and freezes the registry\n * (D10 冻结); subsequent calls return the already-bound adapter without\n * re-registering. Call after `initOcctWasm()` has been run (e.g. inside\n * `registerOcctBrepEngine()` host assembly).\n *\n * @returns the registered kernel adapter.\n */\nexport function bindOcctKernel(): KernelAdapter {\n // Check the SHARED registry first (globalThis singleton): a CDN-bundled faijs\n // instance has its own module-level `_bound = false`, but the host bundle may\n // already have registered+bound 'occt-wasm'. Re-registering would throw\n // \"registry frozen\" — treat an existing binding as bound instead.\n syncRegistryFromGlobal();\n if (_bound) return getVendoredKernel('occt-wasm')\n\n const faijsKernel = getFaijsKernel() as unknown as OcctKernelOwner\n const adapter = OcctWasmAdapter.fromKernel(faijsKernel)\n registerKernel('occt-wasm', adapter)\n freezeKernels()\n _bound = true\n syncRegistryToGlobal()\n return adapter\n}\n\n/**\n * Whether the vendored kernel registry has been bound (D10).\n * @returns true once bound to the occt-wasm kernel.\n */\nexport function isOcctKernelBound(): boolean {\n return _bound && getActiveKernelId() === 'occt-wasm'\n}\n\n/**\n * Access the currently bound vendored kernel adapter (reads the registry).\n * @throws If the bridge has not been bound.\n * @returns the vendored occt-wasm kernel adapter.\n */\nexport function getBrepjsKernel(): KernelAdapter {\n return getVendoredKernel('occt-wasm')\n}"]}
|
|
1
|
+
{"version":3,"file":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — vendored kernel registry injection (engine-neutral, Phase 2 P2-5).\n *\n * 原 occt-kernel-bridge 的职责是「把 vendored kernel registry 冻结绑定到 occt-wasm\n * 单实例」(D10)。Phase 2 起改为**跟随当前 BREP 引擎**:装配期把 registry 里当前\n * 引擎(occt / brepkit / mock)的 `BrepEngineApi` 适配器包装为 brepjs `KernelAdapter`\n * 形态注册进 vendored registry,使 `vendoredRegistry.getKernel()` 返回当前引擎——\n * vendored 函数全部逻辑(命名/角色表/Result)原样保留、零改动。\n *\n * 边界规则(D8/R5)不变:本文件是 faijs 侧唯一把 vendored kernel registry 与\n * faijs 引擎接线的地方;core 侧只从 `api/` import vendored 树。\n *\n * 装配期完整性检查(方案 §Phase 2.5):KernelAdapter 是 211 方法大接口,但 vendored\n * 面存在大量**辅助构造方法**(createVector3d / createPoint3d / createDirection3d /\n * createAxis1 / createAxis2 / createAxis3,见 vendored core/kernelBoundary.ts)——\n * 它们不落在能力名体系内(BrepMethodKind 之外)、无法由 op 声明覆盖,任何 compat\n * op / TS compat 面都可能触发。⇒ 注入前必须断言这些胶水方法在适配器上齐备,缺失\n * 则在**装配期**报错(而非执行期崩)。清单见 {@link GLUE_METHODS}。\n */\n\nimport { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel'\nimport type { OcctKernelOwner } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport { getBrepEngine, type BrepEngine } from '../brep/engine/registry'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport {\n freezeKernels,\n getActiveKernelId,\n getKernel as getVendoredKernel,\n registerKernel,\n syncRegistryFromGlobal,\n syncRegistryToGlobal,\n __resetKernelRegistryForTests,\n} from '../vendored/brepjs/kernel/index.js'\nimport type { KernelAdapter } from '../vendored/brepjs/kernel/types.js'\n\n/** occt-wasm 适配器在 vendored registry 中的注册 id。这是 vendored 注册表的\n * 槽位名(宿主侧判据 + D10 globalThis 单例兼容),**不是**引擎身份标识——\n * 实际引擎由注入的 adapter 决定(vendored 面全部无参 `getKernel()` 取默认)。 */\nexport const VENDORED_OCCT_KERNEL_ID = 'occt-wasm'\n\n/**\n * 装配期完整性检查清单——vendored 面辅助构造/生命周期胶水方法。\n *\n * 这些方法不在 `BrepMethodKind` 能力名体系内(能力判定无法覆盖),但 vendored 面\n * 大量使用(kernelBoundary.ts / wrapperFns / castShape 等)。当前引擎的\n * KernelAdapter 包装必须全部具备,否则对应 compat op / TS compat 面会在执行期崩。\n *\n * Phase 0 盘点实证:36 个 compat op 的 vendored 函数(capability-map 64 方法)与\n * kernelBoundary 都不需要 createAxis*(2D sketcher / TS compat 面需要)——清单按\n * 「vendored 面实际触发面」保守枚举,缺即装配期报错。\n */\nconst GLUE_METHODS = [\n 'createVector3d',\n 'createPoint3d',\n 'createDirection3d',\n 'createAxis1',\n 'createAxis2',\n 'createAxis3',\n] as const\n\nlet _injected = false\n\n/**\n * Inject the currently-registered BREP engine into the vendored kernel registry\n * (replaces the old occt-only `bindOcctKernel()` fixed binding, Phase 2 P2-5).\n *\n * 装配期调用(在 `registerOcctBrepEngine()` / 其它引擎注册之后)。从引擎注册表取\n * 当前默认 BREP 引擎,按其 id 构造 KernelAdapter 形态注册进 vendored registry:\n *\n * - occt:`OcctWasmAdapter.fromKernel(当前引擎 primitives)`——同一 occt-wasm 单实例\n * (D10 不变),211 方法完整适配器,vendored 函数行为与旧 bindOcctKernel 完全一致;\n * - 其它引擎(brepkit/mock):将 BrepEngineApi 透传包装为 KernelAdapter 形态\n * (`dispose`→`release` 等方法名映射 + pattern 返回形态适配),**不做方法伪造**;\n * - 任一引擎注入前都做**装配期完整性检查**(GLUE_METHODS 齐备断言)。\n *\n * 幂等:首次调用后注册并冻结;重复调用返回已注入的适配器。\n *\n * @returns 注册进 vendored registry 的 kernel adapter。\n * @throws 无 BREP 引擎注册;或完整性检查失败(胶水方法缺失)——装配期报错。\n */\nexport async function injectCurrentBrepEngineAsKernel(): Promise<KernelAdapter> {\n // CDN 宿主跨实例同步:host bundle 已注入则直接复用(同旧 bindOcctKernel 语义)。\n // 短路判据与 isKernelInjected() 一致(含 registry 侧激活 id 分支),避免\n // 「registry 已注入但模块级 _injected=false」时走完整路径撞 frozen 抛错。\n syncRegistryFromGlobal()\n if (isKernelInjected()) return getVendoredKernel()\n\n const engine = await getBrepEngine()\n const adapter = buildKernelAdapter(engine)\n assertGlueMethodsComplete(engine.id, adapter)\n\n registerKernel(VENDORED_OCCT_KERNEL_ID, adapter)\n freezeKernels()\n _injected = true\n syncRegistryToGlobal()\n return adapter\n}\n\n/**\n * 按引擎 id 构造 KernelAdapter 形态(occt 走完整适配器;其它引擎透传包装)。\n *\n * occt 分支保持旧 bindOcctKernel 行为:OcctWasmAdapter.fromKernel 需要 occt-wasm\n * 实例(OcctKernelOwner)。当前引擎的 primitives 即 initOcctWasm 单例(occtApi 是\n * 同一实例的实例覆盖,方法面完整),转换安全。\n *\n * 其它引擎分支:BrepEngineApi → KernelAdapter 契约面——\n * - `dispose` → `release`(vendored 面用 dispose,BrepEngineApi 用 release);\n * - `linearPattern` / `circularPattern` 的方向/中心/轴参数是 Vec3 对象(BrepEngineApi\n * 口径),vendored 面传 [x,y,z] 三元组——包装为对象再转发;\n * - 返回 BrepHandle[](BrepEngineApi)→ KernelShape[](vendored castResultShape 消费\n * `.wrapped` + `.type`)——包装为 `{ wrapped, type: 'solid' }`;\n * - `gridPattern` 返回单 BrepHandle → 单 KernelShape(compound 语义一致)。\n * 不声明 `rectangularPattern`(纯 JS 组合,不调内核——capability-map 实证)。\n *\n * ⚠️ 不伪造:BrepEngineApi 未提供的方法**不**补桩;vendored 函数若触发,由\n * compat op 的静态能力判定(backend-dispatch,Phase 1)在执行前拦截。\n *\n * @param engine - 当前 BREP 引擎(装配期从引擎注册表取得)。\n * @returns 该引擎的 vendored KernelAdapter(occt → OcctWasmAdapter.fromKernel;\n * 其它引擎 → BrepEngineApi 透传包装,pattern 族 Vec3↔三元组适配)。\n */\nexport function buildKernelAdapter(engine: BrepEngine): KernelAdapter {\n if (engine.id === 'occt') {\n const faijsKernel = engine.primitives as unknown as OcctKernelOwner\n return OcctWasmAdapter.fromKernel(faijsKernel)\n }\n return wrapBrepEngineApi(engine.primitives)\n}\n\n/** No-op `delete` for synthesized glue objects (mirrors vendored `noop`). */\nconst noop = (): void => {}\n\n/**\n * vendored kernel methods with no source capability in BrepEngineApi.\n * Registered explicitly (not silently undefined): tests assert this list and\n * the engine-contract gap is a separate decision, not a wrapping bug. No\n * stubs, no fake zeros — a silent 0 is worse than a crash.\n */\nexport const UNMAPPED_VENDORED_MEASURE_METHODS = [\n 'area',\n 'length',\n 'linearCenterOfMass',\n] as const\n\n/** Unwrap a vendored KernelShape (handle view or bare number) to a BrepHandle. */\nfunction unwrapHandle(h: unknown): unknown {\n if (typeof h === 'number') return h\n const view = h as { id?: unknown }\n return typeof view.id === 'number' ? view.id : h\n}\n\n/**\n * Map vendored measure method names/shapes onto BrepEngineApi capabilities.\n * The vendored measure face calls `kernel.volume/area/length/centerOfMass/...`\n * (its own naming); the occt adapter carries an internal mapping layer — this\n * is the engine-neutral equivalent for any wrapped BrepEngineApi. Only real\n * BrepEngineApi capabilities are mapped; the rest stay in the gap registry.\n */\nfunction mapMeasureMethods(adapter: Record<string, unknown>, api: BrepEngineApi): void {\n adapter['volume'] = (s: unknown) => api.getVolume(unwrapHandle(s) as never)\n adapter['centerOfMass'] = (s: unknown): [number, number, number] => {\n const v = api.getCenterOfMass(unwrapHandle(s) as never)\n return [v.x, v.y, v.z]\n }\n adapter['boundingBox'] = (s: unknown) => {\n const bb = api.getBoundingBox(unwrapHandle(s) as never, true)\n return {\n min: [bb.xmin, bb.ymin, bb.zmin],\n max: [bb.xmax, bb.ymax, bb.zmax],\n }\n }\n // shapeType / isNull: same name, same semantics — already covered by the\n // transparent pass-through in wrapBrepEngineApi; listed here for docs only.\n // Known contract gaps (UNMAPPED_VENDORED_MEASURE_METHODS) are NOT stubbed:\n // they remain undefined so tests can pin the gap explicitly.\n}\n\n/**\n * Synthesize the vendored glue/auxiliary construction methods over any engine's\n * primitives. These 6 methods are pure JS data-literal constructors in the\n * vendored surface (zero kernel calls — see vendored constructionOps.ts), i.e.\n * a *calling convention*, not a kernel capability — so they are synthesized at\n * the faijs wrapper layer (engine-neutral) rather than added to BrepEngineApi.\n * Field shapes are copied verbatim from the vendored occt adapter; `delete` is\n * mandatory (kernelBoundary's with* helpers call it in `finally`).\n */\nfunction synthesizeGlueMethods(adapter: Record<string, unknown>): void {\n const pnt = (x: number, y: number, z: number, __type: string) => ({ x, y, z, __type, delete: noop })\n adapter['createPoint3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'point3d')\n adapter['createDirection3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'direction3d')\n adapter['createVector3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'vector3d')\n adapter['createAxis1'] = (cx: number, cy: number, cz: number, dx: number, dy: number, dz: number) => ({\n origin: { x: cx, y: cy, z: cz },\n direction: { x: dx, y: dy, z: dz },\n __type: 'axis1',\n delete: noop,\n })\n // axis2/axis3: 6- or 9-arg forms (origin + zDir + optional xDir).\n const makeAxis = (__type: 'axis2' | 'axis3') =>\n (ox: number, oy: number, oz: number, zx: number, zy: number, zz: number, xx?: number, xy?: number, xz?: number) => ({\n origin: { x: ox, y: oy, z: oz },\n zDir: { x: zx, y: zy, z: zz },\n xDir: xx !== undefined ? { x: xx, y: xy as number, z: xz as number } : undefined,\n __type,\n delete: noop,\n })\n adapter['createAxis2'] = makeAxis('axis2')\n adapter['createAxis3'] = makeAxis('axis3')\n}\n\n/** 把 BrepEngineApi 透传包装为 KernelAdapter 形态(非 occt 引擎)。 */\nfunction wrapBrepEngineApi(api: BrepEngineApi): KernelAdapter {\n const adapter: Record<string, unknown> = {\n // 生命周期:vendored 面统一用 dispose(BrepEngineApi 用 release)。\n dispose: (h: unknown) => api.release(h as never),\n }\n synthesizeGlueMethods(adapter)\n for (const key of Object.keys(api)) {\n if (key === 'release') continue // 上面已映射为 dispose\n adapter[key] = (api as unknown as Record<string, unknown>)[key]\n }\n // 测量面映射在透传之后追加,覆盖同名键(vendored 名 → BrepEngineApi 名 + 形态转换)。\n mapMeasureMethods(adapter, api)\n // pattern 族形态适配(BrepEngineApi 对象 Vec3 ↔ vendored 三元组)。\n adapter['linearPattern'] = (\n shape: unknown,\n direction: [number, number, number],\n spacing: number,\n count: number,\n ) =>\n api.linearPattern(\n shape as never,\n { x: direction[0], y: direction[1], z: direction[2] },\n spacing,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['circularPattern'] = (\n shape: unknown,\n center: [number, number, number],\n axis: [number, number, number],\n angleStep: number,\n count: number,\n ) =>\n api.circularPattern(\n shape as never,\n { x: center[0], y: center[1], z: center[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n angleStep,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['gridPattern'] = (\n shape: unknown,\n directionX: [number, number, number],\n directionY: [number, number, number],\n spacingX: number,\n spacingY: number,\n countX: number,\n countY: number,\n ) => ({\n wrapped: api.gridPattern(\n shape as never,\n { x: directionX[0], y: directionX[1], z: directionX[2] },\n { x: directionY[0], y: directionY[1], z: directionY[2] },\n spacingX,\n spacingY,\n countX,\n countY,\n ),\n type: 'compound',\n })\n return adapter as unknown as KernelAdapter\n}\n\n/**\n * 装配期完整性检查:KernelAdapter 胶水方法齐备断言。\n *\n * @param id - 引擎注册 id(报错时定位到引擎)。\n * @param adapter - 待注入 vendored registry 的 KernelAdapter。\n * @throws 缺失任一胶水方法 → 装配期报错(列出引擎 id 与缺失方法名)。\n */\nexport function assertGlueMethodsComplete(id: string, adapter: KernelAdapter): void {\n const missing = GLUE_METHODS.filter((m) => typeof (adapter as unknown as Record<string, unknown>)[m] !== 'function')\n if (missing.length > 0) {\n throw new Error(\n `[faijs] BREP engine '${id}' cannot back the vendored compat surface: KernelAdapter ` +\n `missing glue method(s): ${missing.join(', ')}. These auxiliary construction methods ` +\n `(createVector3d / createPoint3d / createDirection3d / createAxis1/2/3) are required by ` +\n `the vendored kernel boundary and cannot be covered by capability declarations. ` +\n `Fix the adapter (add real implementations) or do not inject this engine into the vendored registry.`\n )\n }\n}\n\n/**\n * Test-only: clear the injection cache and reset the vendored kernel registry\n * so a re-assembly (e.g. switching engines in tests) re-runs buildKernelAdapter\n * + assertGlueMethodsComplete for the new engine. Never called in prod.\n */\nexport function __resetKernelInjectionForTests(): void {\n _injected = false\n __resetKernelRegistryForTests()\n}\n\n/**\n * Whether the vendored kernel registry has been injected (engine-neutral D10).\n *\n * 取代旧的 `isOcctKernelBound()`(其判据 `_bound && getActiveKernelId() === 'occt-wasm'`\n * 把注入面写死为 occt)。新判据只问「vendored registry 是否已注入当前引擎」——\n * 不关心引擎 id,装配期换引擎(brepkit/mock)同样成立。\n *\n * @returns 注入是否已完成(vendored registry 已装配当前 BREP 引擎)。\n */\nexport function isKernelInjected(): boolean {\n syncRegistryFromGlobal()\n return _injected || getActiveKernelId() !== null\n}\n\n/**\n * Access the currently injected vendored kernel adapter (reads the registry).\n * @throws If the bridge has not been injected.\n * @returns the vendored kernel adapter for the current BREP engine.\n */\nexport function getBrepjsKernel(): KernelAdapter {\n return getVendoredKernel()\n}\n\n/**\n * 固定绑定 occt 内核到 vendored registry(Phase 2 前的装配方式)。\n *\n * @deprecated Phase 2 P2-5:固定绑定已被引擎中立的 injectCurrentBrepEngineAsKernel\n * 取代。保留导出仅为兼容旧调用点(适配器层迁移期);新代码一律用注入函数。\n * @returns 恒抛错——本函数已移除,仅保留签名占位。\n */\nexport function bindOcctKernel(): KernelAdapter {\n void getFaijsKernel\n throw new Error(\n '[faijs] bindOcctKernel() removed (Phase 2 P2-5): use injectCurrentBrepEngineAsKernel() ' +\n 'during host assembly to inject the current BREP engine into the vendored registry.'\n )\n}\n\n/**\n * 旧 occt 专用注入判据(Phase 2 前语义:绑定且激活内核为 occt-wasm)。\n *\n * @deprecated Phase 2 P2-5:occt 专用判据已被引擎中立的 isKernelInjected() 取代。\n * @returns 当前是否已注入(透传 isKernelInjected())。\n */\nexport function isOcctKernelBound(): boolean {\n return isKernelInjected()\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib pattern — linearPattern(手写覆盖生成投影,Phase 3: L3 `replica[k]` 角色表)
|
|
3
|
+
*
|
|
4
|
+
* 生成投影是 brep-only compatOp,不带角色表;本文件手写 defineOp,BREP 路径
|
|
5
|
+
* 用质心聚类把结果面按份数 k 分组、回投影到输入面角色,产出 `replica[k]/<inner>`。
|
|
6
|
+
*
|
|
7
|
+
* 机制(无内核历史,纯几何推理):pattern 的每份副本都是输入的精确平移,副本面
|
|
8
|
+
* 几何相同但质心不同。结果面沿 pattern 方向投影得到份数坐标 t,四舍五入到 spacing
|
|
9
|
+
* 倍数即得 k;再按「面内坐标」(centroid − t·dir)匹配输入面对应面,回投其 inner role。
|
|
10
|
+
*/
|
|
11
|
+
import type { Shape, Vec3 } from '../mesh/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* 线性阵列:沿 direction 复制 count 份(含原位置)。
|
|
14
|
+
* @group 特征
|
|
15
|
+
* @inputs 1
|
|
16
|
+
* @async true
|
|
17
|
+
* @qual ok
|
|
18
|
+
* @name linearPattern
|
|
19
|
+
* @note BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。结果面按份数 k 回投影到输入面
|
|
20
|
+
* 角色,产出 `replica[k]/<inner>`(Phase 3 L3 抗重放词汇)。
|
|
21
|
+
* @returns Shape 所有副本 fused 后的几何。
|
|
22
|
+
* @param input - 目标几何。type:Shape required:true
|
|
23
|
+
* @param direction - 阵列方向。type:[x,y,z] required:true
|
|
24
|
+
* @param count - 副本总数(含原位置)。type:number required:true
|
|
25
|
+
* @param spacing - 副本间距。type:number required:true
|
|
26
|
+
* @example
|
|
27
|
+
* const p = await cad.linearPattern(part0, [1, 0, 0], 3, 20)
|
|
28
|
+
*/
|
|
29
|
+
export declare const linearPattern: ((input: Shape, direction: Vec3, count: number, spacing: number) => Promise<Shape>) & {
|
|
30
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAqDhD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa;;CAUxB,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib pattern — linearPattern(手写覆盖生成投影,Phase 3: L3 `replica[k]` 角色表)
|
|
3
|
+
*
|
|
4
|
+
* 生成投影是 brep-only compatOp,不带角色表;本文件手写 defineOp,BREP 路径
|
|
5
|
+
* 用质心聚类把结果面按份数 k 分组、回投影到输入面角色,产出 `replica[k]/<inner>`。
|
|
6
|
+
*
|
|
7
|
+
* 机制(无内核历史,纯几何推理):pattern 的每份副本都是输入的精确平移,副本面
|
|
8
|
+
* 几何相同但质心不同。结果面沿 pattern 方向投影得到份数坐标 t,四舍五入到 spacing
|
|
9
|
+
* 倍数即得 k;再按「面内坐标」(centroid − t·dir)匹配输入面对应面,回投其 inner role。
|
|
10
|
+
*/
|
|
11
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
12
|
+
import { getBackends, getCurrentStmt, keep } from '../runtime-state.js';
|
|
13
|
+
import { fromBrep, brepOf } from '../shape.js';
|
|
14
|
+
import { defineOp } from '../sdk.js';
|
|
15
|
+
import { buildReplicaRoleTable } from './internal/replica-role-table.js';
|
|
16
|
+
/** 归一化向量(零向量 → [0,0,1] 兜底)。 */
|
|
17
|
+
function norm(v) {
|
|
18
|
+
const len = Math.hypot(v[0], v[1], v[2]);
|
|
19
|
+
if (len < 1e-9)
|
|
20
|
+
return [0, 0, 1];
|
|
21
|
+
return [v[0] / len, v[1] / len, v[2] / len];
|
|
22
|
+
}
|
|
23
|
+
/** BREP 路径:沿 direction 复制 count 份,质心聚类回投输入面角色。 */
|
|
24
|
+
function linearPatternBrep(input, direction, count, spacing) {
|
|
25
|
+
const kernel = getBackends().kernel.brep;
|
|
26
|
+
if (!kernel)
|
|
27
|
+
throw new Error('[stdlib/pattern] no OCCT kernel');
|
|
28
|
+
const inputSolid = brepOf(input);
|
|
29
|
+
if (!inputSolid)
|
|
30
|
+
throw new Error('[stdlib/pattern] input is not BREP');
|
|
31
|
+
// Phase 1.6:origin = 本次语句 StmtId。
|
|
32
|
+
const outStmt = String(getCurrentStmt()?.id ?? '');
|
|
33
|
+
// 取 count 份副本。Phase 2:BrepEngineApi.linearPattern 契约统一返回 BrepHandle[]
|
|
34
|
+
// (两内核原生都返回 compound,由适配器拆成数组)——不再有「单句柄 fused」形态。
|
|
35
|
+
const dir = norm(direction);
|
|
36
|
+
const raw = kernel.linearPattern(inputSolid, { x: dir[0], y: dir[1], z: dir[2] }, spacing, count);
|
|
37
|
+
let resultSolid;
|
|
38
|
+
try {
|
|
39
|
+
resultSolid = kernel.fuseAll(raw);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
for (const c of raw)
|
|
43
|
+
kernel.release(c);
|
|
44
|
+
}
|
|
45
|
+
// 第 k 份副本是输入沿 dir 平移 k*spacing:质心反投回输入坐标系(T_k⁻¹)。
|
|
46
|
+
const replicas = [];
|
|
47
|
+
for (let k = 0; k < count; k++) {
|
|
48
|
+
const off = k * spacing;
|
|
49
|
+
replicas.push({
|
|
50
|
+
label: `replica[${k}]`,
|
|
51
|
+
inverse: (c) => ({ x: c.x - off * dir[0], y: c.y - off * dir[1], z: c.z - off * dir[2] }),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt);
|
|
55
|
+
return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 线性阵列:沿 direction 复制 count 份(含原位置)。
|
|
59
|
+
* @group 特征
|
|
60
|
+
* @inputs 1
|
|
61
|
+
* @async true
|
|
62
|
+
* @qual ok
|
|
63
|
+
* @name linearPattern
|
|
64
|
+
* @note BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。结果面按份数 k 回投影到输入面
|
|
65
|
+
* 角色,产出 `replica[k]/<inner>`(Phase 3 L3 抗重放词汇)。
|
|
66
|
+
* @returns Shape 所有副本 fused 后的几何。
|
|
67
|
+
* @param input - 目标几何。type:Shape required:true
|
|
68
|
+
* @param direction - 阵列方向。type:[x,y,z] required:true
|
|
69
|
+
* @param count - 副本总数(含原位置)。type:number required:true
|
|
70
|
+
* @param spacing - 副本间距。type:number required:true
|
|
71
|
+
* @example
|
|
72
|
+
* const p = await cad.linearPattern(part0, [1, 0, 0], 3, 20)
|
|
73
|
+
*/
|
|
74
|
+
export const linearPattern = defineOp({
|
|
75
|
+
brep(input, direction, count, spacing) {
|
|
76
|
+
// copy-like keep semantics: replicate ops preserve their source shape.
|
|
77
|
+
keep(input);
|
|
78
|
+
return linearPatternBrep(input, direction, count, spacing);
|
|
79
|
+
},
|
|
80
|
+
// Phase 1(Brep 引擎可切换重构):能力前置判定——linearPattern 需要内核的
|
|
81
|
+
// 线性阵列方法(BrepMethodKind),brepkit 装配下缺失时执行前静态报错。
|
|
82
|
+
capabilities: ['linearPattern'],
|
|
83
|
+
naming: { kind: 'replicate', k: 0 },
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIjC,OAAO,EAAE,qBAAqB,EAAyB,MAAM,+BAA+B,CAAA;AAE5F,+BAA+B;AAC/B,SAAS,IAAI,CAAC,CAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED,kDAAkD;AAClD,SAAS,iBAAiB,CAAC,KAAY,EAAE,SAAe,EAAE,KAAa,EAAE,OAAe;IACtF,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,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,sEAAsE;IACtE,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IAEjG,IAAI,WAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAuB,EAAE,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,CAAA;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,WAAW,CAAC,GAAG;YACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1F,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEtF,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;AACvF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAY,EAAE,SAAe,EAAE,KAAa,EAAE,OAAe;QAChE,uEAAuE;QACvE,IAAI,CAAC,KAAK,CAAC,CAAA;QACX,OAAO,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IACD,oDAAoD;IACpD,gDAAgD;IAChD,YAAY,EAAE,CAAC,eAAe,CAAC;IAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAgB;CAClD,CAAC,CAAA","sourcesContent":["/**\n * stdlib pattern — linearPattern(手写覆盖生成投影,Phase 3: L3 `replica[k]` 角色表)\n *\n * 生成投影是 brep-only compatOp,不带角色表;本文件手写 defineOp,BREP 路径\n * 用质心聚类把结果面按份数 k 分组、回投影到输入面角色,产出 `replica[k]/<inner>`。\n *\n * 机制(无内核历史,纯几何推理):pattern 的每份副本都是输入的精确平移,副本面\n * 几何相同但质心不同。结果面沿 pattern 方向投影得到份数坐标 t,四舍五入到 spacing\n * 倍数即得 k;再按「面内坐标」(centroid − t·dir)匹配输入面对应面,回投其 inner role。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBackends, getCurrentStmt, keep } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\n\n/** 归一化向量(零向量 → [0,0,1] 兜底)。 */\nfunction norm(v: Vec3): [number, number, number] {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-9) return [0, 0, 1]\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/** BREP 路径:沿 direction 复制 count 份,质心聚类回投输入面角色。 */\nfunction linearPatternBrep(input: Shape, direction: Vec3, count: number, spacing: number): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/pattern] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/pattern] input is not BREP')\n\n // Phase 1.6:origin = 本次语句 StmtId。\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n // 取 count 份副本。Phase 2:BrepEngineApi.linearPattern 契约统一返回 BrepHandle[]\n // (两内核原生都返回 compound,由适配器拆成数组)——不再有「单句柄 fused」形态。\n const dir = norm(direction)\n const raw = kernel.linearPattern(inputSolid, { x: dir[0], y: dir[1], z: dir[2] }, spacing, count)\n\n let resultSolid: BrepHandle\n try {\n resultSolid = kernel.fuseAll(raw)\n } finally {\n for (const c of raw) kernel.release(c)\n }\n\n // 第 k 份副本是输入沿 dir 平移 k*spacing:质心反投回输入坐标系(T_k⁻¹)。\n const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const off = k * spacing\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => ({ x: c.x - off * dir[0], y: c.y - off * dir[1], z: c.z - off * dir[2] }),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n}\n\n/**\n * 线性阵列:沿 direction 复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name linearPattern\n * @note BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。结果面按份数 k 回投影到输入面\n * 角色,产出 `replica[k]/<inner>`(Phase 3 L3 抗重放词汇)。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param direction - 阵列方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param spacing - 副本间距。type:number required:true\n * @example\n * const p = await cad.linearPattern(part0, [1, 0, 0], 3, 20)\n */\nexport const linearPattern = defineOp({\n brep(input: Shape, direction: Vec3, count: number, spacing: number) {\n // copy-like keep semantics: replicate ops preserve their source shape.\n keep(input)\n return linearPatternBrep(input, direction, count, spacing)\n },\n // Phase 1(Brep 引擎可切换重构):能力前置判定——linearPattern 需要内核的\n // 线性阵列方法(BrepMethodKind),brepkit 装配下缺失时执行前静态报错。\n capabilities: ['linearPattern'],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib place — 平台刚性放置 op(H11 / 方案 §4.3)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 一个刚体变换:先绕局部原点按 `rotation`(四元数)旋转,再平移 `position`
|
|
6
|
+
* (= FreeCAD `Placement` 的 T(P)∘R(Q))。不接受 pivot——FCStd 语义就是绕局部原点。
|
|
7
|
+
*
|
|
8
|
+
* 路径:
|
|
9
|
+
* - brep 路径:`applyTransformBrep(kernel, solid, quat, [0,0,0], position)`
|
|
10
|
+
* (复用 api/compound 装配求解已标定的代码,矩阵约定见 §4.3 必做标定)。
|
|
11
|
+
* - mesh 路径:`applyTransform`(与 brep 路径同数学:p' = R·(p−0) + 0 + t)。
|
|
12
|
+
* 四元数→row-major 3×3 用手动 Hamilton 公式(与 THREE / FreeCAD gp_Quaternion
|
|
13
|
+
* 同约定),不引入 three 依赖。
|
|
14
|
+
*
|
|
15
|
+
* 变换不改变拓扑,面 ordinal 不变——roleTable 恒等传播(与 transform.ts 同)。
|
|
16
|
+
*/
|
|
17
|
+
import type { Shape } from '../mesh/types.js';
|
|
18
|
+
/**
|
|
19
|
+
* 刚性放置几何体:旋转(四元数,绕局部原点)后平移。两者皆可缺省 = 恒等。
|
|
20
|
+
* @group 变换
|
|
21
|
+
* @inputs 1
|
|
22
|
+
* @async false
|
|
23
|
+
* @qual ok
|
|
24
|
+
* @name place
|
|
25
|
+
* @returns Shape 放置后的几何(持 OCCT 句柄,可继续变换/导出)。
|
|
26
|
+
* @param input - 目标几何。type:Shape required:true
|
|
27
|
+
* @param params.rotation - 旋转四元数 [x,y,z,w](Hamilton,绕局部原点)。type:[number,number,number,number]
|
|
28
|
+
* @param params.position - 平移向量 [x,y,z](mm)。type:[number,number,number]
|
|
29
|
+
* @example
|
|
30
|
+
* const p = cad.place(part0, { rotation: [0, 0, Math.sin(Math.PI/4), Math.cos(Math.PI/4)], position: [10, 0, 0] })
|
|
31
|
+
*/
|
|
32
|
+
export declare const place: ((input: Shape, params: Record<string, unknown>) => Promise<Shape>) & {
|
|
33
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=place.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"place.d.ts","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA2E1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,KAAK;;CAgBhB,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib place — 平台刚性放置 op(H11 / 方案 §4.3)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 一个刚体变换:先绕局部原点按 `rotation`(四元数)旋转,再平移 `position`
|
|
6
|
+
* (= FreeCAD `Placement` 的 T(P)∘R(Q))。不接受 pivot——FCStd 语义就是绕局部原点。
|
|
7
|
+
*
|
|
8
|
+
* 路径:
|
|
9
|
+
* - brep 路径:`applyTransformBrep(kernel, solid, quat, [0,0,0], position)`
|
|
10
|
+
* (复用 api/compound 装配求解已标定的代码,矩阵约定见 §4.3 必做标定)。
|
|
11
|
+
* - mesh 路径:`applyTransform`(与 brep 路径同数学:p' = R·(p−0) + 0 + t)。
|
|
12
|
+
* 四元数→row-major 3×3 用手动 Hamilton 公式(与 THREE / FreeCAD gp_Quaternion
|
|
13
|
+
* 同约定),不引入 three 依赖。
|
|
14
|
+
*
|
|
15
|
+
* 变换不改变拓扑,面 ordinal 不变——roleTable 恒等传播(与 transform.ts 同)。
|
|
16
|
+
*/
|
|
17
|
+
import { getBackends } from '../runtime-state.js';
|
|
18
|
+
import { fromBrep, brepOf, inputRoleTable, isCompoundLike } from '../shape.js';
|
|
19
|
+
import { solidToShape, applyTransformBrep } from '../brep/brep-ops.js';
|
|
20
|
+
import { applyTransform } from '../mesh/rigid-transform.js';
|
|
21
|
+
import { identityEvolution, identityHashEvolution } from '../brep/face-evolution.js';
|
|
22
|
+
import { propagateAllOrigins } from '../topology/naming/roles.js';
|
|
23
|
+
import { defineOp } from '../sdk.js';
|
|
24
|
+
/** 四元数 (x,y,z,w) → row-major 3×3 旋转矩阵(Hamilton,与 THREE/FreeCAD 同约定)。 */
|
|
25
|
+
function quatToMat3(q) {
|
|
26
|
+
const [x, y, z, w] = q;
|
|
27
|
+
const x2 = x * x;
|
|
28
|
+
const y2 = y * y;
|
|
29
|
+
const z2 = z * z;
|
|
30
|
+
return [
|
|
31
|
+
1 - 2 * (y2 + z2), 2 * (x * y - w * z), 2 * (x * z + w * y),
|
|
32
|
+
2 * (x * y + w * z), 1 - 2 * (x2 + z2), 2 * (y * z - w * x),
|
|
33
|
+
2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x2 + y2),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
/** mesh 路径:展平结构 compound 子节点,逐子 mesh 变换后合并。 */
|
|
37
|
+
function placeMesh(input, rotation, position, mat3) {
|
|
38
|
+
const collect = (s, out) => {
|
|
39
|
+
if (isCompoundLike(s) && s.children) {
|
|
40
|
+
for (const c of s.children)
|
|
41
|
+
collect(c, out);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (s.positions && s.indices)
|
|
45
|
+
out.push(s);
|
|
46
|
+
};
|
|
47
|
+
const subs = [];
|
|
48
|
+
collect(input, subs);
|
|
49
|
+
const positions = [];
|
|
50
|
+
const indices = [];
|
|
51
|
+
for (const sub of subs) {
|
|
52
|
+
const t = applyTransform(sub, rotation, [0, 0, 0], position, mat3);
|
|
53
|
+
const base = positions.length / 3;
|
|
54
|
+
positions.push(...t.positions);
|
|
55
|
+
for (let i = 0; i < t.indices.length; i++)
|
|
56
|
+
indices.push(t.indices[i] + base);
|
|
57
|
+
}
|
|
58
|
+
return { positions: new Float32Array(positions), indices: new Uint32Array(indices) };
|
|
59
|
+
}
|
|
60
|
+
/** brep 路径:刚体变换实体 + 恒等面演化 + 恒等 roleTable 传播 + 三角化 + fromBrep 登记。 */
|
|
61
|
+
function placeBrep(input, rotation, position) {
|
|
62
|
+
const kernel = getBackends().kernel.brep;
|
|
63
|
+
if (!kernel)
|
|
64
|
+
throw new Error('[api/place] no OCCT kernel');
|
|
65
|
+
const inputSolid = brepOf(input);
|
|
66
|
+
if (!inputSolid)
|
|
67
|
+
throw new Error('[api/place] input is not BREP');
|
|
68
|
+
const resultSolid = applyTransformBrep(kernel, inputSolid, rotation, [0, 0, 0], position);
|
|
69
|
+
const inputTable = inputRoleTable(input);
|
|
70
|
+
let roleTable;
|
|
71
|
+
if (inputTable && inputTable.size > 0) {
|
|
72
|
+
roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, resultSolid));
|
|
73
|
+
}
|
|
74
|
+
return fromBrep(solidToShape(kernel, resultSolid), {
|
|
75
|
+
solid: resultSolid,
|
|
76
|
+
faceEvolution: identityEvolution(kernel, resultSolid),
|
|
77
|
+
roleTable,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 刚性放置几何体:旋转(四元数,绕局部原点)后平移。两者皆可缺省 = 恒等。
|
|
82
|
+
* @group 变换
|
|
83
|
+
* @inputs 1
|
|
84
|
+
* @async false
|
|
85
|
+
* @qual ok
|
|
86
|
+
* @name place
|
|
87
|
+
* @returns Shape 放置后的几何(持 OCCT 句柄,可继续变换/导出)。
|
|
88
|
+
* @param input - 目标几何。type:Shape required:true
|
|
89
|
+
* @param params.rotation - 旋转四元数 [x,y,z,w](Hamilton,绕局部原点)。type:[number,number,number,number]
|
|
90
|
+
* @param params.position - 平移向量 [x,y,z](mm)。type:[number,number,number]
|
|
91
|
+
* @example
|
|
92
|
+
* const p = cad.place(part0, { rotation: [0, 0, Math.sin(Math.PI/4), Math.cos(Math.PI/4)], position: [10, 0, 0] })
|
|
93
|
+
*/
|
|
94
|
+
export const place = defineOp({
|
|
95
|
+
name: 'place',
|
|
96
|
+
mesh: (input, params) => {
|
|
97
|
+
if (!input)
|
|
98
|
+
throw new Error('[api/place] no input geometry');
|
|
99
|
+
const rotation = params.rotation ?? [0, 0, 0, 1];
|
|
100
|
+
const position = params.position ?? [0, 0, 0];
|
|
101
|
+
return placeMesh(input, rotation, position, quatToMat3(rotation));
|
|
102
|
+
},
|
|
103
|
+
brep: (input, params) => {
|
|
104
|
+
if (!input)
|
|
105
|
+
throw new Error('[api/place] no input geometry');
|
|
106
|
+
const rotation = params.rotation ?? [0, 0, 0, 1];
|
|
107
|
+
const position = params.position ?? [0, 0, 0];
|
|
108
|
+
return placeBrep(input, rotation, position);
|
|
109
|
+
},
|
|
110
|
+
schema: { position: 'vec3?', rotation: 'quat?' },
|
|
111
|
+
naming: { kind: 'identity' },
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=place.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"place.js","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib place — 平台刚性放置 op(H11 / 方案 §4.3)\n *\n *\n * 一个刚体变换:先绕局部原点按 `rotation`(四元数)旋转,再平移 `position`\n * (= FreeCAD `Placement` 的 T(P)∘R(Q))。不接受 pivot——FCStd 语义就是绕局部原点。\n *\n * 路径:\n * - brep 路径:`applyTransformBrep(kernel, solid, quat, [0,0,0], position)`\n * (复用 api/compound 装配求解已标定的代码,矩阵约定见 §4.3 必做标定)。\n * - mesh 路径:`applyTransform`(与 brep 路径同数学:p' = R·(p−0) + 0 + t)。\n * 四元数→row-major 3×3 用手动 Hamilton 公式(与 THREE / FreeCAD gp_Quaternion\n * 同约定),不引入 three 依赖。\n *\n * 变换不改变拓扑,面 ordinal 不变——roleTable 恒等传播(与 transform.ts 同)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable, isCompoundLike } from '../shape'\nimport { solidToShape, applyTransformBrep } from '../brep/brep-ops'\nimport { applyTransform } from '../mesh/rigid-transform'\nimport { identityEvolution, identityHashEvolution } from '../brep/face-evolution'\nimport { propagateAllOrigins } from '../topology/naming/roles'\nimport type { RoleTable } from '../topology/naming/types'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 四元数 (x,y,z,w) → row-major 3×3 旋转矩阵(Hamilton,与 THREE/FreeCAD 同约定)。 */\nfunction quatToMat3(q: [number, number, number, number]): number[] {\n const [x, y, z, w] = q\n const x2 = x * x\n const y2 = y * y\n const z2 = z * z\n return [\n 1 - 2 * (y2 + z2), 2 * (x * y - w * z), 2 * (x * z + w * y),\n 2 * (x * y + w * z), 1 - 2 * (x2 + z2), 2 * (y * z - w * x),\n 2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x2 + y2),\n ]\n}\n\n/** mesh 路径:展平结构 compound 子节点,逐子 mesh 变换后合并。 */\nfunction placeMesh(\n input: Shape,\n rotation: [number, number, number, number],\n position: [number, number, number],\n mat3: number[],\n): Shape {\n const collect = (s: Shape, out: Shape[]): void => {\n if (isCompoundLike(s) && (s as { children?: Shape[] }).children) {\n for (const c of (s as { children: Shape[] }).children) collect(c, out)\n return\n }\n if (s.positions && s.indices) out.push(s)\n }\n const subs: Shape[] = []\n collect(input, subs)\n const positions: number[] = []\n const indices: number[] = []\n for (const sub of subs) {\n const t = applyTransform(sub, rotation, [0, 0, 0], position, mat3)\n const base = positions.length / 3\n positions.push(...t.positions)\n for (let i = 0; i < t.indices.length; i++) indices.push(t.indices[i] + base)\n }\n return { positions: new Float32Array(positions), indices: new Uint32Array(indices) }\n}\n\n/** brep 路径:刚体变换实体 + 恒等面演化 + 恒等 roleTable 传播 + 三角化 + fromBrep 登记。 */\nfunction placeBrep(input: Shape, rotation: [number, number, number, number], position: [number, number, number]): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[api/place] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[api/place] input is not BREP')\n\n const resultSolid = applyTransformBrep(kernel, inputSolid, rotation, [0, 0, 0], position)\n\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, resultSolid))\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 刚性放置几何体:旋转(四元数,绕局部原点)后平移。两者皆可缺省 = 恒等。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name place\n * @returns Shape 放置后的几何(持 OCCT 句柄,可继续变换/导出)。\n * @param input - 目标几何。type:Shape required:true\n * @param params.rotation - 旋转四元数 [x,y,z,w](Hamilton,绕局部原点)。type:[number,number,number,number]\n * @param params.position - 平移向量 [x,y,z](mm)。type:[number,number,number]\n * @example\n * const p = cad.place(part0, { rotation: [0, 0, Math.sin(Math.PI/4), Math.cos(Math.PI/4)], position: [10, 0, 0] })\n */\nexport const place = defineOp({\n name: 'place',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[api/place] no input geometry')\n const rotation = (params.rotation as [number, number, number, number]) ?? [0, 0, 0, 1]\n const position = (params.position as [number, number, number]) ?? [0, 0, 0]\n return placeMesh(input, rotation, position, quatToMat3(rotation))\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[api/place] no input geometry')\n const rotation = (params.rotation as [number, number, number, number]) ?? [0, 0, 0, 1]\n const position = (params.position as [number, number, number]) ?? [0, 0, 0]\n return placeBrep(input, rotation, position)\n },\n schema: { position: 'vec3?', rotation: 'quat?' },\n naming: { kind: 'identity' } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAgB1C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS1E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvE;AAoBD;;;;;;;;;;;;;;;;;;;;;KAqBK;AACL,eAAO,MAAM,GAAG;;CAuBd,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,MAAM;;CAejB,CAAA;AAWF;;;;;;;;;;;;;;;;;;;;;;IAsBI;AACJ,eAAO,MAAM,QAAQ;;CAenB,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;IAsBI;AACJ,eAAO,MAAM,IAAI;;CAsBf,CAAA;AAEF;;;;;;;;;;;;;;;;IAgBI;AACJ,eAAO,MAAM,KAAK;;CAahB,CAAA"}
|
package/dist/api/primitives.js
CHANGED
|
@@ -88,9 +88,11 @@ function primitiveBrep(op, params) {
|
|
|
88
88
|
throw new Error('[stdlib/box] no OCCT kernel');
|
|
89
89
|
const type = op === 'box' ? 'cube' : op;
|
|
90
90
|
const result = primitiveToBrepSolid(kernel, type, params);
|
|
91
|
-
// §3.2:链根建表——语义命名器按 op 类型给面命名('
|
|
92
|
-
//
|
|
93
|
-
|
|
91
|
+
// §3.2:链根建表——语义命名器按 op 类型给面命名(semantic 'top'/'lateral' 等,
|
|
92
|
+
// Phase 1.7 已删 'box:' 前缀与位置兜底)。
|
|
93
|
+
// Phase 1.6:origin 用链根语句的 StmtId(当前语句 id,§2.2/§4.1)——变量名会被
|
|
94
|
+
// 改名/复用,StmtId 全局唯一,保证多个同类型 primitive 不撞 origin。
|
|
95
|
+
const origin = String(getCurrentStmt()?.id ?? op);
|
|
94
96
|
const roles = assignRoles(kernel, result.solid, op);
|
|
95
97
|
return fromBrep(solidToShape(kernel, result.solid, clampNRad((params.nRad ?? params.segments))), { solid: result.solid, roleTable: new Map([[asPartName(origin), roles]]) });
|
|
96
98
|
}
|
|
@@ -138,6 +140,7 @@ export const box = defineOp({
|
|
|
138
140
|
// D11 位置→对象(§4.1/§6.2):三个标量装箱成 { width, depth, height },尾参
|
|
139
141
|
// options 经 dual-form-args 的尾参合并(§6.2)并入。
|
|
140
142
|
slotMap: { keys: ['width', 'depth', 'height'] },
|
|
143
|
+
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'front' }, { kind: 'semantic', name: 'back' }, { kind: 'semantic', name: 'left' }, { kind: 'semantic', name: 'right' }] } },
|
|
141
144
|
});
|
|
142
145
|
/**
|
|
143
146
|
* 创建球体。
|
|
@@ -170,6 +173,7 @@ export const sphere = defineOp({
|
|
|
170
173
|
// D11: `sphere(10)` == `sphere({ radius: 10 })`; 尾参 options({at, segments})
|
|
171
174
|
// 经 dual-form-args 的尾参合并规则归一(裁决 4,§6.2)。
|
|
172
175
|
slotMap: { keys: ['radius'] },
|
|
176
|
+
naming: { kind: 'unmodeled', reason: 'sphere face vocabulary pending Phase 3' },
|
|
173
177
|
});
|
|
174
178
|
/**
|
|
175
179
|
* 位置归一:把 brepjs 契约的 `at`(= faijs 的 `center`,球心语义)归一为一个
|
|
@@ -217,6 +221,7 @@ export const cylinder = defineOp({
|
|
|
217
221
|
// D11(§4.1/§6.2):`cylinder(5, 40)` 两个标量装箱成 { radius, height };尾参 options
|
|
218
222
|
// 经 dual-form-args 尾参合并并入。
|
|
219
223
|
slotMap: { keys: ['radius', 'height'] },
|
|
224
|
+
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } },
|
|
220
225
|
});
|
|
221
226
|
/**
|
|
222
227
|
* 创建圆锥体(brepjs 契约,§4.1 P 决策)。radiusTop 等于 radiusBottom 时即圆柱,0 为尖锥。
|
|
@@ -262,6 +267,7 @@ export const cone = defineOp({
|
|
|
262
267
|
// D11(§4.1/§6.2): `cone(10, 4, 30)` 三个标量装箱成 { radiusBottom, radiusTop, height }。
|
|
263
268
|
// 尾参 options({at, centered, segments})经 dual-form-args 尾参合并并入。
|
|
264
269
|
slotMap: { keys: ['radiusBottom', 'radiusTop', 'height'] },
|
|
270
|
+
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } },
|
|
265
271
|
});
|
|
266
272
|
/**
|
|
267
273
|
* 创建楔形体。唯一契约是 width/height/angle/length(width/height/angle 为正数,length 沿切割方向),
|
|
@@ -292,5 +298,6 @@ export const wedge = defineOp({
|
|
|
292
298
|
},
|
|
293
299
|
// D11: `wedge(30, 20, 45, 10)` == `wedge({ width: 30, height: 20, angle: 45, length: 10 })`.
|
|
294
300
|
slotMap: { keys: ['width', 'height', 'angle', 'length'] },
|
|
301
|
+
naming: { kind: 'unmodeled', reason: 'wedge face vocabulary pending Phase 3' },
|
|
295
302
|
});
|
|
296
303
|
//# sourceMappingURL=primitives.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib primitives — 基本体创建库函数(box/sphere/cylinder/cone/wedge)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { clampNRad } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { primitiveToBrepSolid } from '../primitives/brep-primitives'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { assignRoles } from '../topology/naming/roles'\nimport { asPartName } from '../identity'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber, assertNonNegativeNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate box parameters (brepjs contract, §4.1 A 决策): `width`, `depth` and\n * `height` must be positive numbers. The legacy `{ size }` object form is\n * removed — any call still passing `size` throws an explicit `E_ARGS_FORM`\n * error pointing at the new signature (error hint ≠ compatibility).\n * @param params - the raw box operation parameters.\n */\nexport function assertBoxParams(params: Record<string, unknown>): void {\n if (params.size !== undefined) {\n throw new Error(\n '[faijs/args] box: E_ARGS_FORM: the `box({ size })` object form is removed. ' +\n 'box now uses `box(width, depth, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.width, 'box.width')\n assertPositiveNumber(params.depth, 'box.depth')\n assertPositiveNumber(params.height, 'box.height')\n}\n\n/**\n * Validate sphere parameters: `radius` must be a positive number.\n * @param params - the raw sphere operation parameters.\n */\nexport function assertSphereParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.radius, 'sphere.radius')\n}\n\n/**\n * Validate cylinder parameters (brepjs contract, §4.3 A 决策): `radius` and\n * `height` must be positive. The legacy `{ center }` object key is removed — any\n * call still passing `center` throws an explicit `E_ARGS_FORM` error pointing at\n * the new signature (error hint ≠ compatibility, 裁决 3).\n * @param params - the raw cylinder operation parameters.\n */\nexport function assertCylinderParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cylinder: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cylinder now uses `cylinder(radius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radius, 'cylinder.radius')\n assertPositiveNumber(params.height, 'cylinder.height')\n}\n\n/**\n * Validate cone parameters (brepjs contract, §4.1 P 决策): `radiusBottom` and\n * `height` must be positive, `radiusTop` must be non-negative. The legacy\n * `{ center }` object key is removed — any call still passing `center` throws an\n * explicit `E_ARGS_FORM` error pointing at the new signature (error hint ≠\n * compatibility, 裁决 3).\n * @param params - the raw cone operation parameters.\n */\nexport function assertConeParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cone: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cone now uses `cone(bottomRadius, topRadius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radiusBottom, 'cone.radiusBottom')\n assertNonNegativeNumber(params.radiusTop, 'cone.radiusTop')\n assertPositiveNumber(params.height, 'cone.height')\n}\n\n/**\n * Validate wedge parameters: `width`, `height`, `angle`, and `length` must be\n * positive numbers.\n * @param params - the raw wedge operation parameters.\n */\nexport function assertWedgeParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.width, 'wedge.width')\n assertPositiveNumber(params.height, 'wedge.height')\n assertPositiveNumber(params.angle, 'wedge.angle')\n assertPositiveNumber(params.length, 'wedge.length')\n}\n\n/** BREP 路径:OCCT 精确构造 + 三角化 + fromBrep 登记(基本体无面演化;链根建 roleTable)。 */\nfunction primitiveBrep(op: string, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/box] no OCCT kernel')\n const type = op === 'box' ? 'cube' : op\n const result = primitiveToBrepSolid(kernel, type as 'cube' | 'sphere' | 'cylinder' | 'cone' | 'wedge', params as never)\n // §3.2:链根建表——语义命名器按 op 类型给面命名('box'→box:top 等,其余位置名兜底)。\n // origin 用链根 part 变量名(当前语句 LHS,§2.2),保证多个同类型 primitive 不撞 origin。\n const origin = String(getCurrentStmt()?.outputs[0] ?? op)\n const roles = assignRoles(kernel, result.solid, op)\n return fromBrep(\n solidToShape(kernel, result.solid, clampNRad((params.nRad ?? params.segments) as number)),\n { solid: result.solid, roleTable: new Map([[asPartName(origin), roles]]) },\n )\n}\n\n/**\n * 创建长方体(brepjs 契约,§4.1 A 决策)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name box\n * @returns Shape 长方体几何,可作为后续 op 的输入。\n * @param params.width - X 方向边长(mm)。type:number required:true\n * @param params.depth - Y 方向边长(mm)。type:number required:true\n * @param params.height - Z 方向边长(mm)。type:number required:true\n * @param params.at - 中心点(CENTER 语义,优先于 centered)。type:[x,y,z] 可选\n * @param params.centered - 无 at 时是否居中到原点(type:boolean 默认 false,角点在原点)。\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const part0 = cad.box(10, 20, 30)\n * const part1 = cad.box(30, 20, 10, { centered: true, at: [1, 2, 3], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`box(width, depth, height)` 与 `box(10, 20, 30, {centered:true})`\n * 归一到同一对象(D11 位置→对象 + 尾参 options 合并)。旧 `{ size }` 对象形态已废弃(裁决 3),\n * 传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.1)。\n */\nexport const box = defineOp({\n name: 'box',\n mesh: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return cad.box(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return primitiveBrep('box', params)\n },\n // schema feeds codegen/UI parameter panels.\n schema: {\n width: 'number',\n depth: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11 位置→对象(§4.1/§6.2):三个标量装箱成 { width, depth, height },尾参\n // options 经 dual-form-args 的尾参合并(§6.2)并入。\n slotMap: { keys: ['width', 'depth', 'height'] },\n})\n\n/**\n * 创建球体。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sphere\n * @returns Shape 球体几何,可作为后续 op 的输入。\n * @param params.radius - 半径(mm)。type:number required:true\n * @param params.segments - 细分度(影响面数)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @param params.center - 球心位置(at 的同义别名)。type:[x,y,z] 默认 [0,0,0](原点)。\n * @param params.at - 球心位置(center 的同义别名,brepjs 契约;裁决 4 双形态合法)。\n * @example\n * const r = cad.sphere({ radius: 10 })\n * const r = cad.sphere(10, { at: [0, 0, 10], segments: 64 })\n * const r = cad.sphere({ radius: 10, segments: 64, center: [0,0,10] })\n */\nexport const sphere = defineOp({\n name: 'sphere',\n mesh: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return cad.sphere(centerParams(params) as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return primitiveBrep('sphere', centerParams(params))\n },\n schema: { radius: 'number', segments: 'number?', center: 'vec3?', at: 'vec3?' },\n // D11: `sphere(10)` == `sphere({ radius: 10 })`; 尾参 options({at, segments})\n // 经 dual-form-args 的尾参合并规则归一(裁决 4,§6.2)。\n slotMap: { keys: ['radius'] },\n})\n\n/**\n * 位置归一:把 brepjs 契约的 `at`(= faijs 的 `center`,球心语义)归一为一个\n * `center` 输入,mesh/brep 两条消费路径共用(裁决 1/4,§4.2)。\n */\nfunction centerParams(params: Record<string, unknown>): Record<string, unknown> {\n if (params.at !== undefined) return { ...params, center: params.at }\n return params\n}\n\n/**\n * 创建圆柱体(brepjs 契约,§4.3 A 决策)。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cylinder\n * @returns Shape 圆柱体几何,可作为后续 op 的输入。\n * @param params.radius - 底面半径(mm)。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面中心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cylinder(5, 40)\n * const c = cad.cylinder(5, 40, { centered: true, at: [0, 0, 20], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`cylinder(5, 40)` 与 `cylinder(5, 40, {centered:true})`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }` 对象形态已废弃\n * (裁决 3),传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.3)。\n */\nexport const cylinder = defineOp({\n name: 'cylinder',\n mesh: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return cad.cylinder(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return primitiveBrep('cylinder', params)\n },\n schema: { radius: 'number', height: 'number', at: 'vec3?', centered: 'boolean?', segments: 'number?' },\n // D11(§4.1/§6.2):`cylinder(5, 40)` 两个标量装箱成 { radius, height };尾参 options\n // 经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radius', 'height'] },\n})\n\n/**\n * 创建圆锥体(brepjs 契约,§4.1 P 决策)。radiusTop 等于 radiusBottom 时即圆柱,0 为尖锥。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cone\n * @returns Shape 圆锥体几何,可作为后续 op 的输入。\n * @param params.radiusBottom - 底半径(mm)。type:number required:true\n * @param params.radiusTop - 顶半径(mm),0 为尖锥,非负,等于 radiusBottom 得圆柱。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面轴心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cone(10, 4, 30)\n * const c = cad.cone(10, 0, 30, { centered: true, at: [0, 0, 20], segments: 64 })\n * 位置原生(§4.1/§6.2):`cone(10, 4, 30)` 与 `cone(10, 4, 30, { centered: true })`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }`/`{ size }` 对象形态\n * 已废弃(裁决 3),传入会抛 E_ARGS_FORM(错误提示 ≠ 兼容)。\n */\nexport const cone = defineOp({\n name: 'cone',\n mesh: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return cad.cone(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return primitiveBrep('cone', params)\n },\n schema: {\n radiusBottom: 'number',\n radiusTop: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11(§4.1/§6.2): `cone(10, 4, 30)` 三个标量装箱成 { radiusBottom, radiusTop, height }。\n // 尾参 options({at, centered, segments})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radiusBottom', 'radiusTop', 'height'] },\n})\n\n/**\n * 创建楔形体。唯一契约是 width/height/angle/length(width/height/angle 为正数,length 沿切割方向),\n * 旧文档的 size 形态已废弃,传 { size } 会抛错。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name wedge\n * @note 曾与 UI 面板的 `size` 形态并存并写入文档,但断言层确认唯一合法契约是 width/height/angle/length;传 `{ size }` 直接抛错。已按真源收敛。\n * @returns Shape 楔形体几何,可作为后续 op 的输入。\n * @param params.width - 底面宽度(mm)。type:number required:true\n * @param params.height - 高度(mm)。type:number required:true\n * @param params.angle - 楔形角度(度)。type:number required:true\n * @param params.length - 沿切割方向的长度(mm)。type:number required:true\n * @example\n * const w = cad.wedge({ width: 30, height: 20, angle: 45, length: 10 })\n */\nexport const wedge = defineOp({\n name: 'wedge',\n mesh: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return cad.wedge(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return primitiveBrep('wedge', params)\n },\n // D11: `wedge(30, 20, 45, 10)` == `wedge({ width: 30, height: 20, angle: 45, length: 10 })`.\n slotMap: { keys: ['width', 'height', 'angle', 'length'] },\n})\n"]}
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib primitives — 基本体创建库函数(box/sphere/cylinder/cone/wedge)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { clampNRad } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { primitiveToBrepSolid } from '../primitives/brep-primitives'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { assignRoles } from '../topology/naming/roles'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { asPartName } from '../identity'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber, assertNonNegativeNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate box parameters (brepjs contract, §4.1 A 决策): `width`, `depth` and\n * `height` must be positive numbers. The legacy `{ size }` object form is\n * removed — any call still passing `size` throws an explicit `E_ARGS_FORM`\n * error pointing at the new signature (error hint ≠ compatibility).\n * @param params - the raw box operation parameters.\n */\nexport function assertBoxParams(params: Record<string, unknown>): void {\n if (params.size !== undefined) {\n throw new Error(\n '[faijs/args] box: E_ARGS_FORM: the `box({ size })` object form is removed. ' +\n 'box now uses `box(width, depth, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.width, 'box.width')\n assertPositiveNumber(params.depth, 'box.depth')\n assertPositiveNumber(params.height, 'box.height')\n}\n\n/**\n * Validate sphere parameters: `radius` must be a positive number.\n * @param params - the raw sphere operation parameters.\n */\nexport function assertSphereParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.radius, 'sphere.radius')\n}\n\n/**\n * Validate cylinder parameters (brepjs contract, §4.3 A 决策): `radius` and\n * `height` must be positive. The legacy `{ center }` object key is removed — any\n * call still passing `center` throws an explicit `E_ARGS_FORM` error pointing at\n * the new signature (error hint ≠ compatibility, 裁决 3).\n * @param params - the raw cylinder operation parameters.\n */\nexport function assertCylinderParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cylinder: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cylinder now uses `cylinder(radius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radius, 'cylinder.radius')\n assertPositiveNumber(params.height, 'cylinder.height')\n}\n\n/**\n * Validate cone parameters (brepjs contract, §4.1 P 决策): `radiusBottom` and\n * `height` must be positive, `radiusTop` must be non-negative. The legacy\n * `{ center }` object key is removed — any call still passing `center` throws an\n * explicit `E_ARGS_FORM` error pointing at the new signature (error hint ≠\n * compatibility, 裁决 3).\n * @param params - the raw cone operation parameters.\n */\nexport function assertConeParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cone: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cone now uses `cone(bottomRadius, topRadius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radiusBottom, 'cone.radiusBottom')\n assertNonNegativeNumber(params.radiusTop, 'cone.radiusTop')\n assertPositiveNumber(params.height, 'cone.height')\n}\n\n/**\n * Validate wedge parameters: `width`, `height`, `angle`, and `length` must be\n * positive numbers.\n * @param params - the raw wedge operation parameters.\n */\nexport function assertWedgeParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.width, 'wedge.width')\n assertPositiveNumber(params.height, 'wedge.height')\n assertPositiveNumber(params.angle, 'wedge.angle')\n assertPositiveNumber(params.length, 'wedge.length')\n}\n\n/** BREP 路径:OCCT 精确构造 + 三角化 + fromBrep 登记(基本体无面演化;链根建 roleTable)。 */\nfunction primitiveBrep(op: string, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/box] no OCCT kernel')\n const type = op === 'box' ? 'cube' : op\n const result = primitiveToBrepSolid(kernel, type as 'cube' | 'sphere' | 'cylinder' | 'cone' | 'wedge', params as never)\n // §3.2:链根建表——语义命名器按 op 类型给面命名(semantic 'top'/'lateral' 等,\n // Phase 1.7 已删 'box:' 前缀与位置兜底)。\n // Phase 1.6:origin 用链根语句的 StmtId(当前语句 id,§2.2/§4.1)——变量名会被\n // 改名/复用,StmtId 全局唯一,保证多个同类型 primitive 不撞 origin。\n const origin = String(getCurrentStmt()?.id ?? op)\n const roles = assignRoles(kernel, result.solid, op)\n return fromBrep(\n solidToShape(kernel, result.solid, clampNRad((params.nRad ?? params.segments) as number)),\n { solid: result.solid, roleTable: new Map([[asPartName(origin), roles]]) },\n )\n}\n\n/**\n * 创建长方体(brepjs 契约,§4.1 A 决策)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name box\n * @returns Shape 长方体几何,可作为后续 op 的输入。\n * @param params.width - X 方向边长(mm)。type:number required:true\n * @param params.depth - Y 方向边长(mm)。type:number required:true\n * @param params.height - Z 方向边长(mm)。type:number required:true\n * @param params.at - 中心点(CENTER 语义,优先于 centered)。type:[x,y,z] 可选\n * @param params.centered - 无 at 时是否居中到原点(type:boolean 默认 false,角点在原点)。\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const part0 = cad.box(10, 20, 30)\n * const part1 = cad.box(30, 20, 10, { centered: true, at: [1, 2, 3], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`box(width, depth, height)` 与 `box(10, 20, 30, {centered:true})`\n * 归一到同一对象(D11 位置→对象 + 尾参 options 合并)。旧 `{ size }` 对象形态已废弃(裁决 3),\n * 传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.1)。\n */\nexport const box = defineOp({\n name: 'box',\n mesh: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return cad.box(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return primitiveBrep('box', params)\n },\n // schema feeds codegen/UI parameter panels.\n schema: {\n width: 'number',\n depth: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11 位置→对象(§4.1/§6.2):三个标量装箱成 { width, depth, height },尾参\n // options 经 dual-form-args 的尾参合并(§6.2)并入。\n slotMap: { keys: ['width', 'depth', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'front' }, { kind: 'semantic', name: 'back' }, { kind: 'semantic', name: 'left' }, { kind: 'semantic', name: 'right' }] } } as Provenance,\n})\n\n/**\n * 创建球体。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sphere\n * @returns Shape 球体几何,可作为后续 op 的输入。\n * @param params.radius - 半径(mm)。type:number required:true\n * @param params.segments - 细分度(影响面数)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @param params.center - 球心位置(at 的同义别名)。type:[x,y,z] 默认 [0,0,0](原点)。\n * @param params.at - 球心位置(center 的同义别名,brepjs 契约;裁决 4 双形态合法)。\n * @example\n * const r = cad.sphere({ radius: 10 })\n * const r = cad.sphere(10, { at: [0, 0, 10], segments: 64 })\n * const r = cad.sphere({ radius: 10, segments: 64, center: [0,0,10] })\n */\nexport const sphere = defineOp({\n name: 'sphere',\n mesh: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return cad.sphere(centerParams(params) as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return primitiveBrep('sphere', centerParams(params))\n },\n schema: { radius: 'number', segments: 'number?', center: 'vec3?', at: 'vec3?' },\n // D11: `sphere(10)` == `sphere({ radius: 10 })`; 尾参 options({at, segments})\n // 经 dual-form-args 的尾参合并规则归一(裁决 4,§6.2)。\n slotMap: { keys: ['radius'] },\n naming: { kind: 'unmodeled', reason: 'sphere face vocabulary pending Phase 3' } as Provenance,\n})\n\n/**\n * 位置归一:把 brepjs 契约的 `at`(= faijs 的 `center`,球心语义)归一为一个\n * `center` 输入,mesh/brep 两条消费路径共用(裁决 1/4,§4.2)。\n */\nfunction centerParams(params: Record<string, unknown>): Record<string, unknown> {\n if (params.at !== undefined) return { ...params, center: params.at }\n return params\n}\n\n/**\n * 创建圆柱体(brepjs 契约,§4.3 A 决策)。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cylinder\n * @returns Shape 圆柱体几何,可作为后续 op 的输入。\n * @param params.radius - 底面半径(mm)。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面中心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cylinder(5, 40)\n * const c = cad.cylinder(5, 40, { centered: true, at: [0, 0, 20], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`cylinder(5, 40)` 与 `cylinder(5, 40, {centered:true})`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }` 对象形态已废弃\n * (裁决 3),传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.3)。\n */\nexport const cylinder = defineOp({\n name: 'cylinder',\n mesh: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return cad.cylinder(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return primitiveBrep('cylinder', params)\n },\n schema: { radius: 'number', height: 'number', at: 'vec3?', centered: 'boolean?', segments: 'number?' },\n // D11(§4.1/§6.2):`cylinder(5, 40)` 两个标量装箱成 { radius, height };尾参 options\n // 经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radius', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建圆锥体(brepjs 契约,§4.1 P 决策)。radiusTop 等于 radiusBottom 时即圆柱,0 为尖锥。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cone\n * @returns Shape 圆锥体几何,可作为后续 op 的输入。\n * @param params.radiusBottom - 底半径(mm)。type:number required:true\n * @param params.radiusTop - 顶半径(mm),0 为尖锥,非负,等于 radiusBottom 得圆柱。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面轴心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cone(10, 4, 30)\n * const c = cad.cone(10, 0, 30, { centered: true, at: [0, 0, 20], segments: 64 })\n * 位置原生(§4.1/§6.2):`cone(10, 4, 30)` 与 `cone(10, 4, 30, { centered: true })`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }`/`{ size }` 对象形态\n * 已废弃(裁决 3),传入会抛 E_ARGS_FORM(错误提示 ≠ 兼容)。\n */\nexport const cone = defineOp({\n name: 'cone',\n mesh: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return cad.cone(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return primitiveBrep('cone', params)\n },\n schema: {\n radiusBottom: 'number',\n radiusTop: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11(§4.1/§6.2): `cone(10, 4, 30)` 三个标量装箱成 { radiusBottom, radiusTop, height }。\n // 尾参 options({at, centered, segments})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radiusBottom', 'radiusTop', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建楔形体。唯一契约是 width/height/angle/length(width/height/angle 为正数,length 沿切割方向),\n * 旧文档的 size 形态已废弃,传 { size } 会抛错。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name wedge\n * @note 曾与 UI 面板的 `size` 形态并存并写入文档,但断言层确认唯一合法契约是 width/height/angle/length;传 `{ size }` 直接抛错。已按真源收敛。\n * @returns Shape 楔形体几何,可作为后续 op 的输入。\n * @param params.width - 底面宽度(mm)。type:number required:true\n * @param params.height - 高度(mm)。type:number required:true\n * @param params.angle - 楔形角度(度)。type:number required:true\n * @param params.length - 沿切割方向的长度(mm)。type:number required:true\n * @example\n * const w = cad.wedge({ width: 30, height: 20, angle: 45, length: 10 })\n */\nexport const wedge = defineOp({\n name: 'wedge',\n mesh: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return cad.wedge(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return primitiveBrep('wedge', params)\n },\n // D11: `wedge(30, 20, 45, 10)` == `wedge({ width: 30, height: 20, angle: 45, length: 10 })`.\n slotMap: { keys: ['width', 'height', 'angle', 'length'] },\n naming: { kind: 'unmodeled', reason: 'wedge face vocabulary pending Phase 3' } as Provenance,\n})\n"]}
|