@faicad/faijs 0.33.2 → 0.35.2
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 +14 -14
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +40 -14
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +47 -6
- package/dist/api/appearance.d.ts.map +1 -1
- package/dist/api/appearance.js.map +1 -1
- package/dist/api/assembly/solve-tree.d.ts +1 -0
- package/dist/api/assembly/solve-tree.d.ts.map +1 -1
- package/dist/api/assembly/solve-tree.js +42 -17
- package/dist/api/assembly/solve-tree.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -0
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +130 -23
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
- package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
- package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +20 -2
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/chamfer.d.ts +7 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +57 -13
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/draft.d.ts +7 -4
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +11 -6
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.d.ts +4 -4
- package/dist/api/edge-ref.js +4 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/extrude.d.ts +10 -6
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +50 -25
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts +4 -4
- package/dist/api/face-ref.js +4 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +6 -3
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +12 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +6 -2
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +24 -6
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +7 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +45 -12
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/helix.d.ts +13 -13
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -24
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-brep.d.ts +10 -18
- package/dist/api/import-brep.d.ts.map +1 -1
- package/dist/api/import-brep.js +17 -25
- package/dist/api/import-brep.js.map +1 -1
- package/dist/api/import-step.d.ts +10 -15
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +24 -29
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.js +2 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/export-members.js.map +1 -1
- package/dist/api/loft-advanced.d.ts +4 -0
- package/dist/api/loft-advanced.d.ts.map +1 -1
- package/dist/api/loft-advanced.js +4 -0
- package/dist/api/loft-advanced.js.map +1 -1
- package/dist/api/loft.d.ts +5 -3
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +5 -3
- package/dist/api/loft.js.map +1 -1
- package/dist/api/meta.d.ts +42 -6
- package/dist/api/meta.d.ts.map +1 -1
- package/dist/api/meta.js.map +1 -1
- package/dist/api/punch-hole.d.ts +5 -2
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +4 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +4 -5
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +4 -5
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/selectors-to-refs.d.ts +83 -0
- package/dist/api/selectors-to-refs.d.ts.map +1 -0
- package/dist/api/selectors-to-refs.js +211 -0
- package/dist/api/selectors-to-refs.js.map +1 -0
- package/dist/api/shell.d.ts +17 -8
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +45 -15
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +12 -6
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +31 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts +3 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +3 -0
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/sketch-on-surface.d.ts +4 -1
- package/dist/api/sketch-on-surface.d.ts.map +1 -1
- package/dist/api/sketch-on-surface.js +4 -1
- package/dist/api/sketch-on-surface.js.map +1 -1
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +9 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/brep/brep-chain.js +2 -2
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +1 -1
- package/dist/brep/brep-ops.js +1 -1
- 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 +45 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +87 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +33 -7
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +47 -16
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +14 -15
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +35 -15
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/primitives-brep.js +2 -2
- package/dist/brep/primitives-brep.js.map +1 -1
- package/dist/brep/text/text-to-solid.d.ts +40 -3
- package/dist/brep/text/text-to-solid.d.ts.map +1 -1
- package/dist/brep/text/text-to-solid.js +104 -24
- package/dist/brep/text/text-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +315 -36
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +7 -7
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.js +6 -6
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
- package/dist/browser.d.ts +2 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -2
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +11 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +16 -8
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +62 -5
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +617 -42
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/closure.d.ts +3 -2
- package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
- package/dist/cad-runtime/interp/closure.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +9 -6
- package/dist/cad-runtime/interp/env.d.ts.map +1 -1
- package/dist/cad-runtime/interp/env.js +4 -2
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-decl.d.ts +121 -0
- package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
- package/dist/cad-runtime/lib-decl.js +100 -0
- package/dist/cad-runtime/lib-decl.js.map +1 -0
- package/dist/cad-runtime/ports.d.ts +12 -0
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +59 -5
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +237 -18
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/extra/browser.d.ts +9 -0
- package/dist/extra/browser.d.ts.map +1 -0
- package/dist/extra/browser.js +9 -0
- package/dist/extra/browser.js.map +1 -0
- package/dist/extra/editor-ops.d.ts +22 -0
- package/dist/extra/editor-ops.d.ts.map +1 -0
- package/dist/extra/editor-ops.js +21 -0
- package/dist/extra/editor-ops.js.map +1 -0
- package/dist/extra/extras/svg-extrude.d.ts +45 -0
- package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
- package/dist/extra/extras/svg-extrude.js +110 -0
- package/dist/extra/extras/svg-extrude.js.map +1 -0
- package/dist/extra/extras/text-cjk.d.ts +36 -0
- package/dist/extra/extras/text-cjk.d.ts.map +1 -0
- package/dist/extra/extras/text-cjk.js +86 -0
- package/dist/extra/extras/text-cjk.js.map +1 -0
- package/dist/extra/extras/text-geometry.d.ts +69 -0
- package/dist/extra/extras/text-geometry.d.ts.map +1 -0
- package/dist/extra/extras/text-geometry.js +188 -0
- package/dist/extra/extras/text-geometry.js.map +1 -0
- package/dist/extra/index.d.ts +40 -0
- package/dist/extra/index.d.ts.map +1 -0
- package/dist/extra/index.js +40 -0
- package/dist/extra/index.js.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
- package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
- package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
- package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
- package/dist/extra/mesh/engrave-decoration.js +39 -0
- package/dist/extra/mesh/engrave-decoration.js.map +1 -0
- package/dist/extra/mesh/fai_drill.d.ts +21 -0
- package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
- package/dist/extra/mesh/fai_drill.js +89 -0
- package/dist/extra/mesh/fai_drill.js.map +1 -0
- package/dist/extra/mesh/fai_extrude.d.ts +24 -0
- package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
- package/dist/extra/mesh/fai_extrude.js +42 -0
- package/dist/extra/mesh/fai_extrude.js.map +1 -0
- package/dist/extra/mesh/fai_split.d.ts +164 -0
- package/dist/extra/mesh/fai_split.d.ts.map +1 -0
- package/dist/extra/mesh/fai_split.js +269 -0
- package/dist/extra/mesh/fai_split.js.map +1 -0
- package/dist/extra/mesh/primitives.d.ts +29 -0
- package/dist/extra/mesh/primitives.d.ts.map +1 -0
- package/dist/extra/mesh/primitives.js +41 -0
- package/dist/extra/mesh/primitives.js.map +1 -0
- package/dist/extra/op-names.d.ts +37 -0
- package/dist/extra/op-names.d.ts.map +1 -0
- package/dist/extra/op-names.js +46 -0
- package/dist/extra/op-names.js.map +1 -0
- package/dist/extra/ops/compound.d.ts +140 -0
- package/dist/extra/ops/compound.d.ts.map +1 -0
- package/dist/extra/ops/compound.js +167 -0
- package/dist/extra/ops/compound.js.map +1 -0
- package/dist/extra/ops/copy.d.ts +40 -0
- package/dist/extra/ops/copy.d.ts.map +1 -0
- package/dist/extra/ops/copy.js +83 -0
- package/dist/extra/ops/copy.js.map +1 -0
- package/dist/extra/ops/fai_drill.d.ts +51 -0
- package/dist/extra/ops/fai_drill.d.ts.map +1 -0
- package/dist/extra/ops/fai_drill.js +233 -0
- package/dist/extra/ops/fai_drill.js.map +1 -0
- package/dist/extra/ops/fai_extrude.d.ts +36 -0
- package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
- package/dist/extra/ops/fai_extrude.js +84 -0
- package/dist/extra/ops/fai_extrude.js.map +1 -0
- package/dist/extra/ops/fai_split.d.ts +46 -0
- package/dist/extra/ops/fai_split.d.ts.map +1 -0
- package/dist/extra/ops/fai_split.js +235 -0
- package/dist/extra/ops/fai_split.js.map +1 -0
- package/dist/extra/ops/load.d.ts +49 -0
- package/dist/extra/ops/load.d.ts.map +1 -0
- package/dist/extra/ops/load.js +385 -0
- package/dist/extra/ops/load.js.map +1 -0
- package/dist/extra/ops/svg-extrude.d.ts +32 -0
- package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
- package/dist/extra/ops/svg-extrude.js +74 -0
- package/dist/extra/ops/svg-extrude.js.map +1 -0
- package/dist/extra/ops/text.d.ts +34 -0
- package/dist/extra/ops/text.d.ts.map +1 -0
- package/dist/extra/ops/text.js +100 -0
- package/dist/extra/ops/text.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.d.ts +3 -3
- package/dist/lang/symbol-table.generated.d.ts +10 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +10 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +3 -3
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/math3d/index.d.ts +1 -1
- package/dist/math3d/index.js +1 -1
- package/dist/math3d/index.js.map +1 -1
- package/dist/mesh/engrave.d.ts +2 -3
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +4 -11
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +0 -2
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +0 -2
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/primitives.d.ts +1 -1
- package/dist/mesh/primitives.js +1 -1
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/node-host/cli.d.ts +11 -4
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +53 -28
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts.map +1 -1
- package/dist/node-host/execute-script.js +3 -4
- package/dist/node-host/execute-script.js.map +1 -1
- package/dist/node-host/lib-package-json.d.ts +36 -0
- package/dist/node-host/lib-package-json.d.ts.map +1 -0
- package/dist/node-host/lib-package-json.js +73 -0
- package/dist/node-host/lib-package-json.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +41 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.js +1 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/runtime-state.d.ts +28 -1
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +14 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +11 -2
- package/dist/sdk.js.map +1 -1
- package/dist/sketch/bspline.d.ts +58 -0
- package/dist/sketch/bspline.d.ts.map +1 -0
- package/dist/sketch/bspline.js +104 -0
- package/dist/sketch/bspline.js.map +1 -0
- package/dist/sketch/canonical.d.ts +239 -0
- package/dist/sketch/canonical.d.ts.map +1 -0
- package/dist/sketch/canonical.js +17 -0
- package/dist/sketch/canonical.js.map +1 -0
- package/dist/sketch/contour.d.ts +43 -0
- package/dist/sketch/contour.d.ts.map +1 -0
- package/dist/sketch/contour.js +202 -0
- package/dist/sketch/contour.js.map +1 -0
- package/dist/sketch/dim-spec.d.ts +32 -0
- package/dist/sketch/dim-spec.d.ts.map +1 -0
- package/dist/sketch/dim-spec.js +112 -0
- package/dist/sketch/dim-spec.js.map +1 -0
- package/dist/sketch/faces.d.ts +45 -0
- package/dist/sketch/faces.d.ts.map +1 -0
- package/dist/sketch/faces.js +108 -0
- package/dist/sketch/faces.js.map +1 -0
- package/dist/sketch/fcstd-types.d.ts +194 -0
- package/dist/sketch/fcstd-types.d.ts.map +1 -0
- package/dist/sketch/fcstd-types.js +67 -0
- package/dist/sketch/fcstd-types.js.map +1 -0
- package/dist/sketch/index.d.ts +46 -0
- package/dist/sketch/index.d.ts.map +1 -0
- package/dist/sketch/index.js +39 -0
- package/dist/sketch/index.js.map +1 -0
- package/dist/sketch/node.d.ts +14 -0
- package/dist/sketch/node.d.ts.map +1 -0
- package/dist/sketch/node.js +43 -0
- package/dist/sketch/node.js.map +1 -0
- package/dist/sketch/op.d.ts +111 -0
- package/dist/sketch/op.d.ts.map +1 -0
- package/dist/sketch/op.js +185 -0
- package/dist/sketch/op.js.map +1 -0
- package/dist/sketch/planegcs-backend.d.ts +69 -0
- package/dist/sketch/planegcs-backend.d.ts.map +1 -0
- package/dist/sketch/planegcs-backend.js +812 -0
- package/dist/sketch/planegcs-backend.js.map +1 -0
- package/dist/sketch/project.d.ts +176 -0
- package/dist/sketch/project.d.ts.map +1 -0
- package/dist/sketch/project.js +656 -0
- package/dist/sketch/project.js.map +1 -0
- package/dist/sketch/shapes.d.ts +370 -0
- package/dist/sketch/shapes.d.ts.map +1 -0
- package/dist/sketch/shapes.js +959 -0
- package/dist/sketch/shapes.js.map +1 -0
- package/dist/sketch/solve.d.ts +21 -0
- package/dist/sketch/solve.d.ts.map +1 -0
- package/dist/sketch/solve.js +144 -0
- package/dist/sketch/solve.js.map +1 -0
- package/dist/sketch/solver-loader.d.ts +47 -0
- package/dist/sketch/solver-loader.d.ts.map +1 -0
- package/dist/sketch/solver-loader.js +77 -0
- package/dist/sketch/solver-loader.js.map +1 -0
- package/dist/sketch/solver.d.ts +63 -0
- package/dist/sketch/solver.d.ts.map +1 -0
- package/dist/sketch/solver.js +28 -0
- package/dist/sketch/solver.js.map +1 -0
- package/dist/sketch/verify.d.ts +53 -0
- package/dist/sketch/verify.d.ts.map +1 -0
- package/dist/sketch/verify.js +71 -0
- package/dist/sketch/verify.js.map +1 -0
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +43 -11
package/dist/api/meta.d.ts
CHANGED
|
@@ -57,17 +57,53 @@ export interface FileMeta {
|
|
|
57
57
|
}
|
|
58
58
|
/** Shape 元数据方法签名(运行时由 attachMetaMethods 挂载;纯数据判定不受影响)。 */
|
|
59
59
|
export interface ShapeMetaMethods {
|
|
60
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* 合并 meta:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。
|
|
62
|
+
* @param spec - 待合并的元数据字段(空串 = 显式清除该字段)。
|
|
63
|
+
* @returns this(可链式调用)。
|
|
64
|
+
* @example
|
|
65
|
+
* part0.setMeta({ partNumber: 'PN-1001', designer: 'ada' })
|
|
66
|
+
*/
|
|
61
67
|
setMeta(spec: ShapeMeta): this;
|
|
62
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* 便捷:等价 setMeta({ name })(空串视为清除)。
|
|
70
|
+
* @param name - 零件名。
|
|
71
|
+
* @returns this(可链式调用)。
|
|
72
|
+
* @example
|
|
73
|
+
* part0.setName('bracket')
|
|
74
|
+
*/
|
|
63
75
|
setName(name: string): this;
|
|
64
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* 便捷:等价 setMeta({ description })(空串视为清除)。
|
|
78
|
+
* @param description - 描述文本(导出到 3MF Description / STEP FILE_DESCRIPTION)。
|
|
79
|
+
* @returns this(可链式调用)。
|
|
80
|
+
* @example
|
|
81
|
+
* part0.setDescription('left-hand bracket')
|
|
82
|
+
*/
|
|
65
83
|
setDescription(description: string): this;
|
|
66
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* 便捷:等价 setMeta({ partNumber })。
|
|
86
|
+
* @param partNumber - 零件号。
|
|
87
|
+
* @returns this(可链式调用)。
|
|
88
|
+
* @example
|
|
89
|
+
* part0.setPartNumber('PN-1001')
|
|
90
|
+
*/
|
|
67
91
|
setPartNumber(partNumber: string): this;
|
|
68
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* 便捷:等价 setMeta({ metadata: {...cur.metadata, ...kv} });值为空串的键删除。
|
|
94
|
+
* @param key - 自定义 metadata 键(3MF 带前缀名 / STEP header 其余字段)。
|
|
95
|
+
* @param value - 键值;空串删除该键。
|
|
96
|
+
* @returns this(可链式调用)。
|
|
97
|
+
* @example
|
|
98
|
+
* part0.setMetaField('Material', 'AL-6061')
|
|
99
|
+
*/
|
|
69
100
|
setMetaField(key: string, value: string): this;
|
|
70
|
-
/**
|
|
101
|
+
/**
|
|
102
|
+
* 读取当前 meta(可能 undefined)。
|
|
103
|
+
* @returns 当前元数据的只读快照;从未设置过时为 `undefined`。
|
|
104
|
+
* @example
|
|
105
|
+
* const meta = part0.getMeta()
|
|
106
|
+
*/
|
|
71
107
|
getMeta(): Readonly<ShapeMeta> | undefined;
|
|
72
108
|
}
|
|
73
109
|
/**
|
package/dist/api/meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/api/meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAI1C,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/api/meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAI1C,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC9B;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B;;;;;;OAMG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC;;;;;;OAMG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9C;;;;;OAKG;IACH,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;CAC3C;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,CAuBhF;AAID;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,gBAAgB,CA2BxE"}
|
package/dist/api/meta.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/api/meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/api/meta.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/meta — faijs 零件名称/描述/料号 与 整体文件元数据 权威类型与 Shape 方法\n *\n * 定位(与 api/appearance.ts 同款方法模式):\n * - 名称/描述设置**不是 op**(不进 defineOp/api-namespace/args-schema),是 Shape\n * 实例方法(`box1.setName('…')`,复用 `asm1.solve()` 的成员调用语句形态)。\n * - `ShapeMeta`(零件级)与 `FileMeta`(整体级)引擎无关、JSON 可序列化;\n * `Shape.meta` 随 Shape 走 mesh/brep 双链路,编辑器/查看器只读字段。\n * - 本文件零依赖(不 import THREE / occt / store);唯一 import 是 mesh/types\n * 的 `Shape` 类型(type-only),mesh/types 亦只 type-import 本文件的类型,\n * 两者为类型环、无运行时环(值依赖单向:shape.ts → api/meta.ts)。\n *\n * 命名约定(camelCase,faijs 全 TS/JS 生态):\n * - 零件级:`name` / `description` / `partNumber` / `metadata`(键值)。\n * - 方法:`setName` / `setDescription` / `setPartNumber` / `setMetaField` /\n * `setMeta` / `getMeta`。字段名与 3MF/STEP 规范一致(不用 note)。\n * 空串 = 清除:`setName('')` 删除 name(与「undefined 不覆盖」互补,用户可\n * 显式去掉继承来的名称)。\n */\n\nimport type { Shape } from '../mesh/types'\n\n// ── 类型 ──\n\n/** 零件级说明性元数据 —— 引擎无关、JSON 可序列化、随 Shape 走双链路。 */\nexport interface ShapeMeta {\n /** 零件名:3MF `<object name>` / STEP `PRODUCT().name`。 */\n name?: string\n /** 描述:STEP `PRODUCT.description`;3MF 写 `faijs:description` metadatagroup。 */\n description?: string\n /** 料号:3MF `<object partnumber>`;STEP `PRODUCT_IDENTIFICATION` 或 UDA。 */\n partNumber?: string\n /**\n * 自定义键值:3MF `<object><metadatagroup>`(vendor 前缀);STEP UDA。\n * 键为规范/厂商原始名(3MF 含命名空间前缀);faijs 不解释值语义,\n * 读入保留、写出回写。\n */\n metadata?: Record<string, string>\n}\n\n/**\n * 整体/文档级说明性元数据 —— 导入结果 / 导出选项,不挂 Shape。\n *\n * 不叫 `ModelMeta`:CAD 直觉里 \"model\" 偏单个零件(那是 `ShapeMeta` 的活);\n * 本类型承载整个交换文件(3MF `<model>` / STEP P21 header)的元数据,故用\n * `FileMeta`。\n */\nexport interface FileMeta {\n title?: string // 3MF Title / STEP FILE_NAME.name\n description?: string // 3MF Description / STEP FILE_DESCRIPTION.description\n designer?: string // 3MF Designer / STEP FILE_NAME.originator\n author?: string // STEP FILE_NAME.author(3MF 无对应;跨格式不互转)\n organization?: string // STEP FILE_NAME.organization(3MF 无对应)\n copyright?: string // 3MF Copyright(STEP 无标准位置)\n licenseTerms?: string // 3MF LicenseTerms(STEP 无标准位置)\n rating?: string // 3MF Rating(STEP 无标准位置)\n creationDate?: string // 3MF CreationDate / STEP FILE_NAME.timestamp\n modificationDate?: string // 3MF ModificationDate(STEP 无标准位置)\n application?: string // 3MF Application / STEP FILE_NAME.preprocessor\n /** 未知/厂商自定义 metadata 兜底(3MF model 级带前缀名;STEP header 其余字段)。 */\n metadata?: Record<string, string>\n}\n\n/** Shape 元数据方法签名(运行时由 attachMetaMethods 挂载;纯数据判定不受影响)。 */\nexport interface ShapeMetaMethods {\n /**\n * 合并 meta:`{...cur, ...spec}`,spec 中 undefined 字段保留旧值。\n * @param spec - 待合并的元数据字段(空串 = 显式清除该字段)。\n * @returns this(可链式调用)。\n * @example\n * part0.setMeta({ partNumber: 'PN-1001', designer: 'ada' })\n */\n setMeta(spec: ShapeMeta): this\n /**\n * 便捷:等价 setMeta({ name })(空串视为清除)。\n * @param name - 零件名。\n * @returns this(可链式调用)。\n * @example\n * part0.setName('bracket')\n */\n setName(name: string): this\n /**\n * 便捷:等价 setMeta({ description })(空串视为清除)。\n * @param description - 描述文本(导出到 3MF Description / STEP FILE_DESCRIPTION)。\n * @returns this(可链式调用)。\n * @example\n * part0.setDescription('left-hand bracket')\n */\n setDescription(description: string): this\n /**\n * 便捷:等价 setMeta({ partNumber })。\n * @param partNumber - 零件号。\n * @returns this(可链式调用)。\n * @example\n * part0.setPartNumber('PN-1001')\n */\n setPartNumber(partNumber: string): this\n /**\n * 便捷:等价 setMeta({ metadata: {...cur.metadata, ...kv} });值为空串的键删除。\n * @param key - 自定义 metadata 键(3MF 带前缀名 / STEP header 其余字段)。\n * @param value - 键值;空串删除该键。\n * @returns this(可链式调用)。\n * @example\n * part0.setMetaField('Material', 'AL-6061')\n */\n setMetaField(key: string, value: string): this\n /**\n * 读取当前 meta(可能 undefined)。\n * @returns 当前元数据的只读快照;从未设置过时为 `undefined`。\n * @example\n * const meta = part0.getMeta()\n */\n getMeta(): Readonly<ShapeMeta> | undefined\n}\n\n// ── 合并 ──\n\n/**\n * 合并零件级元数据:spec 中 undefined 字段不覆盖旧值;空串覆盖为清除。\n * @param cur 当前 meta(可为 undefined)\n * @param spec 待合并字段(undefined 字段跳过;'' 显式清除)\n * @returns 合并后的 meta(新对象;cur 为 undefined 时仅含 spec 非空字段)\n */\nexport function mergeMeta(cur: ShapeMeta | undefined, spec: ShapeMeta): ShapeMeta {\n const clean: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(spec)) {\n if (v === undefined) continue\n if (k === 'metadata' && v && typeof v === 'object') {\n // 键值子合并:保留旧 metadata 的未覆盖键。\n const base: Record<string, string> = { ...((cur?.metadata as Record<string, string> | undefined) ?? {}) }\n for (const [kk, vv] of Object.entries(v as Record<string, string>)) {\n if (vv === '') delete base[kk] // 空串清除该键\n else base[kk] = vv\n }\n clean[k] = base\n continue\n }\n if (v === '') clean[k] = undefined as unknown as string // 空串清除顶层字段\n else clean[k] = v\n }\n const merged = { ...(cur ?? {}), ...clean } as ShapeMeta\n // 清理合并后为 undefined 的顶层键(空串清除写入 undefined)。\n for (const k of Object.keys(merged)) {\n if ((merged as Record<string, unknown>)[k] === undefined) delete (merged as Record<string, unknown>)[k]\n }\n return merged\n}\n\n// ── Shape 方法挂载 ──\n\n/**\n * 给 Shape 实例挂载元数据方法(幂等:已有 setMeta 则跳过)。\n *\n * 所有产物构造点(solid/curve → fromBrep/fromMeshSolid/fromBrepCurve)统一\n * 调用本函数,保证 mesh/brep 双支路产物都可用 `box1.setName(...)`。\n * 方法**不序列化**(JSON 丢弃函数);`meta` 字段随产物跨打印,编辑器/\n * 查看器只读字段即可,不依赖方法。\n * @param shape 产物 Shape 实例(solid/curve 产物)\n * @returns 挂载后的 shape(类型提升为 `Shape & ShapeMetaMethods`;同一实例原地挂载)\n */\nexport function attachMetaMethods(shape: Shape): Shape & ShapeMetaMethods {\n const s = shape as Shape & ShapeMetaMethods\n if (typeof s.setMeta === 'function') return s\n s.setMeta = function setMeta(this: Shape & ShapeMetaMethods, spec: ShapeMeta) {\n this.meta = mergeMeta(this.meta, spec)\n return this\n }\n s.setName = function setName(this: Shape & ShapeMetaMethods, name: string) {\n this.meta = mergeMeta(this.meta, { name })\n return this\n }\n s.setDescription = function setDescription(this: Shape & ShapeMetaMethods, description: string) {\n this.meta = mergeMeta(this.meta, { description })\n return this\n }\n s.setPartNumber = function setPartNumber(this: Shape & ShapeMetaMethods, partNumber: string) {\n this.meta = mergeMeta(this.meta, { partNumber })\n return this\n }\n s.setMetaField = function setMetaField(this: Shape & ShapeMetaMethods, key: string, value: string) {\n this.meta = mergeMeta(this.meta, { metadata: { [key]: value } })\n return this\n }\n s.getMeta = function getMeta(this: Shape) {\n return this.meta\n }\n return s\n}"]}
|
package/dist/api/punch-hole.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface PunchHoleParams {
|
|
|
31
31
|
contours: ProfileLoop[];
|
|
32
32
|
/** The target solid on which the hole is punched. */
|
|
33
33
|
on: Shape;
|
|
34
|
-
/** The host face: a
|
|
34
|
+
/** The host face: a FaceTopoRef (UI-picked literal), a CadQuery face selector string (e.g. ">Z", resolved on `on`), or a 1-based ordinal (mesh chain / current kernel snapshot only). */
|
|
35
35
|
face: FaceSelector;
|
|
36
36
|
/** Removal depth along the face inward normal. `null`/absent = through hole. */
|
|
37
37
|
height?: number | null;
|
|
@@ -66,10 +66,13 @@ export declare function buildPunchHole(kernel: BrepEngineApi, params: PunchHoleP
|
|
|
66
66
|
* @returns Shape with the profile punched out of `on`.
|
|
67
67
|
* @param params.contours - ordered 2D closed contours (the hole profile).type:any[] required:true
|
|
68
68
|
* @param params.on - the target solid to punch.type:Shape required:true
|
|
69
|
-
* @param params.face - host face:
|
|
69
|
+
* @param params.face - host face: FaceTopoRef(UI 拾取产物字面量)| 面选择器字符串(如 ">Z",在 on 上解析,多面命中抛错)| 1 起序号(仅网格链/当前内核快照,禁止用于生成脚本)。type:any required:true
|
|
70
70
|
* @param params.height - blind depth along the face inward normal (null/absent = through).type:number|object required:false
|
|
71
71
|
* @param params.draftAngle - wall taper in degrees (default 0 = straight; built as an occt loft frustum).type:number required:false
|
|
72
72
|
* @param params.scaleMode - UV mapping: 'original' | 'bounds' | 'native'.type:string required:false
|
|
73
|
+
* @example
|
|
74
|
+
* // loop = 一个闭合 2D 轮廓:{ segments: [{ kind: 'line', x1, y1, x2, y2 }, ...] }
|
|
75
|
+
* const plate = await cad.punchHole({ contours: [loop], on: cad.box(40, 40, 4), face: '>Z' })
|
|
73
76
|
*/
|
|
74
77
|
export declare const punchHole: ((params: Record<string, unknown>) => Promise<Shape>) & {
|
|
75
78
|
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punch-hole.d.ts","sourceRoot":"","sources":["../../src/api/punch-hole.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQtD,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIvE,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAEjE,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,qDAAqD;IACrD,EAAE,EAAE,KAAK,CAAA;IACT,
|
|
1
|
+
{"version":3,"file":"punch-hole.d.ts","sourceRoot":"","sources":["../../src/api/punch-hole.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQtD,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIvE,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAEjE,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,qDAAqD;IACrD,EAAE,EAAE,KAAK,CAAA;IACT,yLAAyL;IACzL,IAAI,EAAE,YAAY,CAAA;IAClB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAC7C;AAuED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,GAAG,UAAU,CA+F1G;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,GAAG,KAAK,CAOpF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS;;CASpB,CAAA"}
|
package/dist/api/punch-hole.js
CHANGED
|
@@ -190,10 +190,13 @@ export function buildPunchHole(kernel, params) {
|
|
|
190
190
|
* @returns Shape with the profile punched out of `on`.
|
|
191
191
|
* @param params.contours - ordered 2D closed contours (the hole profile).type:any[] required:true
|
|
192
192
|
* @param params.on - the target solid to punch.type:Shape required:true
|
|
193
|
-
* @param params.face - host face:
|
|
193
|
+
* @param params.face - host face: FaceTopoRef(UI 拾取产物字面量)| 面选择器字符串(如 ">Z",在 on 上解析,多面命中抛错)| 1 起序号(仅网格链/当前内核快照,禁止用于生成脚本)。type:any required:true
|
|
194
194
|
* @param params.height - blind depth along the face inward normal (null/absent = through).type:number|object required:false
|
|
195
195
|
* @param params.draftAngle - wall taper in degrees (default 0 = straight; built as an occt loft frustum).type:number required:false
|
|
196
196
|
* @param params.scaleMode - UV mapping: 'original' | 'bounds' | 'native'.type:string required:false
|
|
197
|
+
* @example
|
|
198
|
+
* // loop = 一个闭合 2D 轮廓:{ segments: [{ kind: 'line', x1, y1, x2, y2 }, ...] }
|
|
199
|
+
* const plate = await cad.punchHole({ contours: [loop], on: cad.box(40, 40, 4), face: '>Z' })
|
|
197
200
|
*/
|
|
198
201
|
export const punchHole = defineOp({
|
|
199
202
|
engines: ['occt'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"punch-hole.js","sourceRoot":"","sources":["../../src/api/punch-hole.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @platform occt — 本文件 import occt-kernel(getOcctKernel:draft-angle punch\n * 的 frustum loft 走原生 occt `loft`,适配器层无此能力)。\n *\n * `cad.punchHole`: cut a face-placed 2D profile out of a solid (E4 pocket/through\n * hole with optional taper).\n *\n * The hole profile is a set of closed 2D contours placed on a target face of the\n * solid (the same placement step as `cad.sketchOnFace`). Each placed contour is\n * extruded from the face *into* the part along the face inward normal, and the\n * resulting prism is the \"punch\" tool; a Boolean `cut` removes it from the host —\n * a profile-based pocket (`height` given) or through-hole (`height: null`).\n *\n * v1 scope: the punch is a straight linear prism, or — when `draftAngle > 0` — a\n * **tapered frustum** whose walls recede by `draftAngle` over the punch depth\n * (built as an occt `loft` between a mouth wire in the host plane and an inset\n * end wire at depth `depth·tan(draftAngle)`). The op is a composition over the\n * E3 on-surface placement + `kernel.extrude`/occt `loft` + `kernel.cut` and\n * declares `engines: ['occt']` (surface sampling + Boolean cut + draft loft need\n * the BREP platform).\n * @module\n */\nimport type { Shape } from '../mesh/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { solidToShape } from '../brep/brep-ops'\nimport { fromBrep, brepOf } from '../shape'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { TopoRefError } from '../topology/naming'\nimport { resolveFaceHandle, type FaceSelector } from './sketch-on-face'\nimport { makeUvMap, curves2dBounds, type UvMap } from '../geometry2d/bridge/on-surface'\nimport { evaluateCurve2d } from '../geometry2d/curve2d'\nimport { profileSegToCurve } from '../geometry2d/adapt'\nimport { assertProfileParams, type ProfileLoop } from './profile'\n\n/** Parameters for `cad.punchHole`. */\nexport interface PunchHoleParams {\n /** Ordered 2D closed contour(s) describing the hole profile (same shape as `cad.profile`). */\n contours: ProfileLoop[]\n /** The target solid on which the hole is punched. */\n on: Shape\n /** The host face: a 1-based ordinal or a `cad.faceRef(on, n)` result. */\n face: FaceSelector\n /** Removal depth along the face inward normal. `null`/absent = through hole. */\n height?: number | null\n /** Taper on the hole walls (degrees; default 0 = straight wall). Built as a frustum via occt loft. */\n draftAngle?: number\n /** UV mapping mode for contour placement (default `'original'`). */\n scaleMode?: 'original' | 'bounds' | 'native'\n}\n\n/** Extra length past the host extent so a through-hole clears the opposite side. */\nconst THROUGH_MARGIN = 10\n\n/**\n * Depth of the punch extrusion: the explicit `height`, or the host's bounding-box\n * diagonal (+ margin) for a through hole.\n * @param kernel - the BREP engine surface.\n * @param solid - the host solid handle.\n * @param height - the blind depth, or null for through.\n * @returns the positive extrude length.\n */\nfunction punchDepth(kernel: BrepEngineApi, solid: BrepHandle, height: number | null | undefined): number {\n if (height !== null && height !== undefined) return height\n const box = kernel.getBoundingBox(solid)\n const diag = Math.hypot(box.xmax - box.xmin, box.ymax - box.ymin, box.zmax - box.zmin)\n return diag + THROUGH_MARGIN\n}\n\n/**\n * Map a contour's sampled 2D points onto the host face's UV space, evaluate the\n * surface there, and return a clean, coplanar polygon (sample points projected\n * onto the host's plane through its normal). Rebuilding a straight-edged planar\n * face is deliberate: extruding the on-surface bridge's wire-derived face (a\n * near-coplanar shell, z varies by ~1e-7) collapses its OCCT volume to ~0 — see\n * GOTCHA `punch-hole` (E4).\n * @param kernel - the BREP engine surface.\n * @param host - the host face handle.\n * @param mode - the face scale mode.\n * @param uv - the UV mapping for this contour.\n * @param anchor - an in-plane point of the host face (for the projection plane).\n * @param n - the host face outward normal (unit).\n * @param contour - the 2D contour to punch.\n * @returns a flat polygon of 3D points (each approximately in the host plane).\n */\nfunction buildPolygon3d(\n kernel: BrepEngineApi,\n host: BrepHandle,\n uv: UvMap,\n anchor: { x: number; y: number; z: number },\n n: { x: number; y: number; z: number },\n contour: ProfileLoop,\n): { x: number; y: number; z: number }[] {\n const pts: { x: number; y: number; z: number }[] = []\n // Dedupe consecutive coincident samples across the contour.\n const push = (p: { x: number; y: number; z: number }) => {\n const last = pts[pts.length - 1]\n if (last && Math.abs(last.x - p.x) < 1e-7 && Math.abs(last.y - p.y) < 1e-7 && Math.abs(last.z - p.z) < 1e-7) return\n pts.push(p)\n }\n for (const seg of contour.segments) {\n const c = profileSegToCurve(seg as never)\n for (let k = 0; k <= 12; k++) {\n const [x, y] = evaluateCurve2d(c, k / 12)\n const [u, v] = uv(x, y)\n const raw = kernel.pointOnSurface(host, u, v)\n // Project onto the host face plane (through `anchor` + `n`) for exact coplanarity.\n const d = (raw.x - anchor.x) * n.x + (raw.y - anchor.y) * n.y + (raw.z - anchor.z) * n.z\n push({ x: raw.x - n.x * d, y: raw.y - n.y * d, z: raw.z - n.z * d })\n }\n }\n // Close the loop: drop a trailing point equal to the first.\n if (pts.length > 1) {\n const a = pts[0]!\n const b = pts[pts.length - 1]!\n if (Math.abs(a.x - b.x) < 1e-7 && Math.abs(a.y - b.y) < 1e-7 && Math.abs(a.z - b.z) < 1e-7) pts.pop()\n }\n return pts\n}\n\n/**\n * Build and cut the punch solid for every placed profile on the host face and\n * Boolean-cut it from `solid`, returning the holed solid handle.\n * @param kernel - the BREP engine surface.\n * @param solid - the host solid handle.\n * @param params - the punch parameters.\n * @returns the holed solid handle.\n */\nexport function punchSolidOf(kernel: BrepEngineApi, solid: BrepHandle, params: PunchHoleParams): BrepHandle {\n const host = resolveFaceHandle(kernel, params.on, params.face)\n const mode = params.scaleMode ?? 'original'\n const depth = punchDepth(kernel, solid, params.height ?? null)\n\n const draft = params.draftAngle ?? 0\n const draftRad = (draft * Math.PI) / 180\n\n // Punch inward = opposite the host face outward normal.\n const n0 = kernel.surfaceNormal(host, 0, 0)\n const nlen = Math.hypot(n0.x, n0.y, n0.z) || 1\n const n = { x: n0.x / nlen, y: n0.y / nlen, z: n0.z / nlen }\n\n // In-plane anchor via the host face's UV center.\n const ub = kernel.uvBounds(host)\n const uMid = (ub.uMin + ub.uMax) / 2\n const vMid = (ub.vMin + ub.vMax) / 2\n const anchor = kernel.pointOnSurface(host, uMid, vMid)\n\n const bounds = ub\n let result = solid\n for (const contour of params.contours) {\n const curves = contour.segments.map((s) => profileSegToCurve(s as never))\n const uv = makeUvMap(mode, curves2dBounds(curves), bounds)\n const mouth = buildPolygon3d(kernel, host, uv, anchor, n, contour)\n if (mouth.length < 3) throw new Error('punchHole: contour is degenerate (fewer than 3 distinct points)')\n\n // Mouth wire on the host plane.\n const mouthEdges = [] as BrepHandle[]\n for (let i = 0; i < mouth.length; i++) {\n const a = mouth[i]!\n const b = mouth[(i + 1) % mouth.length]!\n mouthEdges.push(kernel.makeLineEdge(a, b) as never)\n }\n\n let punch: BrepHandle\n if (draft !== 0) {\n // Drafted hole = a tapered frustum: the mouth wire at the host plane and an\n // end wire (recessed by `depth*tan(draftAngle)` toward the contour centre)\n // at the punch depth, lofted together via occt. Verified: occt `loft` of two\n // parallel-planar rect wires reproduces the analytic frustum volume exactly.\n const inset = depth * Math.tan(draftRad)\n // Uniform wall recess: each wall recedes by `inset` = depth·tan(draftAngle)\n // measured *perpendicular* to that wall. For a homothetic scale about the\n // centroid by factor s, the perpendicular recess of an edge at distance h\n // from the centroid is h·(1−s); so choose s = 1 − inset/h̄ with h̄ the mean\n // centroid→edge distance (h̄ = the half-side for a square/rect ⇒ walls land\n // at exactly draftAngle).\n const cx = mouth.reduce((s, p) => s + p.x, 0) / mouth.length\n const cy = mouth.reduce((s, p) => s + p.y, 0) / mouth.length\n const cz = mouth.reduce((s, p) => s + p.z, 0) / mouth.length\n let edgeSum = 0\n for (let i = 0; i < mouth.length; i++) {\n const a = mouth[i]!\n const b = mouth[(i + 1) % mouth.length]!\n // centroid → edge midpoint projection in the host plane\n const mx = (a.x + b.x) / 2 - cx\n const my = (a.y + b.y) / 2 - cy\n const mz = (a.z + b.z) / 2 - cz\n edgeSum += Math.hypot(mx, my, mz)\n }\n const hBar = edgeSum / mouth.length\n if (!Number.isFinite(hBar) || hBar <= 1e-9 || inset >= hBar * 0.999) {\n throw new Error(\n `E_PUNCH_DRAFT_OVER_TAPER: draftAngle ${draft}° inset ${inset.toFixed(3)} must be < half-width ${hBar.toFixed(3)} at depth ${depth}`,\n )\n }\n const s = 1 - inset / hBar\n const endPoints = mouth.map((p) => ({\n x: cx + (p.x - cx) * s - n.x * depth,\n y: cy + (p.y - cy) * s - n.y * depth,\n z: cz + (p.z - cz) * s - n.z * depth,\n }))\n const endEdges = endPoints.map((p, i) => {\n const a = endPoints[i]!\n const b = endPoints[(i + 1) % endPoints.length]!\n return kernel.makeLineEdge(a, b) as never\n }) as BrepHandle[]\n const k = getOcctKernel()\n punch = k.loft(\n [kernel.makeWire(mouthEdges), kernel.makeWire(endEdges)] as unknown as never[],\n true,\n true,\n ) as unknown as BrepHandle\n } else {\n const prismFace = kernel.makeFace(kernel.makeWire(mouthEdges))\n punch = kernel.extrude(prismFace, -n.x * depth, -n.y * depth, -n.z * depth)\n }\n try {\n result = kernel.cut(result, punch)\n } finally {\n kernel.release(punch)\n }\n }\n return result\n}\n\n/**\n * Build a Shape: the host solid with the profile(s) punched out of `params.on`.\n * @param kernel - the BREP engine surface.\n * @param params - the punch parameters.\n * @returns the holed Shape.\n */\nexport function buildPunchHole(kernel: BrepEngineApi, params: PunchHoleParams): Shape {\n const solid = brepOf(params.on) as BrepHandle | undefined\n if (solid === undefined) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'face', 'punchHole: target `on` has no BREP solid')\n }\n const holed = punchSolidOf(kernel, solid, params)\n return fromBrep(solidToShape(kernel, holed), { solid: holed })\n}\n\n/**\n * `cad.punchHole`: cut a face-placed 2D profile out of a solid.\n * @group 创建\n * @inputs 1\n * @async false\n * @qual ok\n * @name punchHole\n * @returns Shape with the profile punched out of `on`.\n * @param params.contours - ordered 2D closed contours (the hole profile).type:any[] required:true\n * @param params.on - the target solid to punch.type:Shape required:true\n * @param params.face - host face: 1-based ordinal or `cad.faceRef(on, n)`.type:any required:true\n * @param params.height - blind depth along the face inward normal (null/absent = through).type:number|object required:false\n * @param params.draftAngle - wall taper in degrees (default 0 = straight; built as an occt loft frustum).type:number required:false\n * @param params.scaleMode - UV mapping: 'original' | 'bounds' | 'native'.type:string required:false\n */\nexport const punchHole = defineOp({\n engines: ['occt'],\n brep(params: Record<string, unknown>) {\n assertProfileParams(params)\n return buildPunchHole(getBrepApi(), params as unknown as PunchHoleParams)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n\n paramDims: {},\n})"]}
|
|
1
|
+
{"version":3,"file":"punch-hole.js","sourceRoot":"","sources":["../../src/api/punch-hole.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @platform occt — 本文件 import occt-kernel(getOcctKernel:draft-angle punch\n * 的 frustum loft 走原生 occt `loft`,适配器层无此能力)。\n *\n * `cad.punchHole`: cut a face-placed 2D profile out of a solid (E4 pocket/through\n * hole with optional taper).\n *\n * The hole profile is a set of closed 2D contours placed on a target face of the\n * solid (the same placement step as `cad.sketchOnFace`). Each placed contour is\n * extruded from the face *into* the part along the face inward normal, and the\n * resulting prism is the \"punch\" tool; a Boolean `cut` removes it from the host —\n * a profile-based pocket (`height` given) or through-hole (`height: null`).\n *\n * v1 scope: the punch is a straight linear prism, or — when `draftAngle > 0` — a\n * **tapered frustum** whose walls recede by `draftAngle` over the punch depth\n * (built as an occt `loft` between a mouth wire in the host plane and an inset\n * end wire at depth `depth·tan(draftAngle)`). The op is a composition over the\n * E3 on-surface placement + `kernel.extrude`/occt `loft` + `kernel.cut` and\n * declares `engines: ['occt']` (surface sampling + Boolean cut + draft loft need\n * the BREP platform).\n * @module\n */\nimport type { Shape } from '../mesh/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { solidToShape } from '../brep/brep-ops'\nimport { fromBrep, brepOf } from '../shape'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { TopoRefError } from '../topology/naming'\nimport { resolveFaceHandle, type FaceSelector } from './sketch-on-face'\nimport { makeUvMap, curves2dBounds, type UvMap } from '../geometry2d/bridge/on-surface'\nimport { evaluateCurve2d } from '../geometry2d/curve2d'\nimport { profileSegToCurve } from '../geometry2d/adapt'\nimport { assertProfileParams, type ProfileLoop } from './profile'\n\n/** Parameters for `cad.punchHole`. */\nexport interface PunchHoleParams {\n /** Ordered 2D closed contour(s) describing the hole profile (same shape as `cad.profile`). */\n contours: ProfileLoop[]\n /** The target solid on which the hole is punched. */\n on: Shape\n /** The host face: a FaceTopoRef (UI-picked literal), a CadQuery face selector string (e.g. \">Z\", resolved on `on`), or a 1-based ordinal (mesh chain / current kernel snapshot only). */\n face: FaceSelector\n /** Removal depth along the face inward normal. `null`/absent = through hole. */\n height?: number | null\n /** Taper on the hole walls (degrees; default 0 = straight wall). Built as a frustum via occt loft. */\n draftAngle?: number\n /** UV mapping mode for contour placement (default `'original'`). */\n scaleMode?: 'original' | 'bounds' | 'native'\n}\n\n/** Extra length past the host extent so a through-hole clears the opposite side. */\nconst THROUGH_MARGIN = 10\n\n/**\n * Depth of the punch extrusion: the explicit `height`, or the host's bounding-box\n * diagonal (+ margin) for a through hole.\n * @param kernel - the BREP engine surface.\n * @param solid - the host solid handle.\n * @param height - the blind depth, or null for through.\n * @returns the positive extrude length.\n */\nfunction punchDepth(kernel: BrepEngineApi, solid: BrepHandle, height: number | null | undefined): number {\n if (height !== null && height !== undefined) return height\n const box = kernel.getBoundingBox(solid)\n const diag = Math.hypot(box.xmax - box.xmin, box.ymax - box.ymin, box.zmax - box.zmin)\n return diag + THROUGH_MARGIN\n}\n\n/**\n * Map a contour's sampled 2D points onto the host face's UV space, evaluate the\n * surface there, and return a clean, coplanar polygon (sample points projected\n * onto the host's plane through its normal). Rebuilding a straight-edged planar\n * face is deliberate: extruding the on-surface bridge's wire-derived face (a\n * near-coplanar shell, z varies by ~1e-7) collapses its OCCT volume to ~0 — see\n * GOTCHA `punch-hole` (E4).\n * @param kernel - the BREP engine surface.\n * @param host - the host face handle.\n * @param mode - the face scale mode.\n * @param uv - the UV mapping for this contour.\n * @param anchor - an in-plane point of the host face (for the projection plane).\n * @param n - the host face outward normal (unit).\n * @param contour - the 2D contour to punch.\n * @returns a flat polygon of 3D points (each approximately in the host plane).\n */\nfunction buildPolygon3d(\n kernel: BrepEngineApi,\n host: BrepHandle,\n uv: UvMap,\n anchor: { x: number; y: number; z: number },\n n: { x: number; y: number; z: number },\n contour: ProfileLoop,\n): { x: number; y: number; z: number }[] {\n const pts: { x: number; y: number; z: number }[] = []\n // Dedupe consecutive coincident samples across the contour.\n const push = (p: { x: number; y: number; z: number }) => {\n const last = pts[pts.length - 1]\n if (last && Math.abs(last.x - p.x) < 1e-7 && Math.abs(last.y - p.y) < 1e-7 && Math.abs(last.z - p.z) < 1e-7) return\n pts.push(p)\n }\n for (const seg of contour.segments) {\n const c = profileSegToCurve(seg as never)\n for (let k = 0; k <= 12; k++) {\n const [x, y] = evaluateCurve2d(c, k / 12)\n const [u, v] = uv(x, y)\n const raw = kernel.pointOnSurface(host, u, v)\n // Project onto the host face plane (through `anchor` + `n`) for exact coplanarity.\n const d = (raw.x - anchor.x) * n.x + (raw.y - anchor.y) * n.y + (raw.z - anchor.z) * n.z\n push({ x: raw.x - n.x * d, y: raw.y - n.y * d, z: raw.z - n.z * d })\n }\n }\n // Close the loop: drop a trailing point equal to the first.\n if (pts.length > 1) {\n const a = pts[0]!\n const b = pts[pts.length - 1]!\n if (Math.abs(a.x - b.x) < 1e-7 && Math.abs(a.y - b.y) < 1e-7 && Math.abs(a.z - b.z) < 1e-7) pts.pop()\n }\n return pts\n}\n\n/**\n * Build and cut the punch solid for every placed profile on the host face and\n * Boolean-cut it from `solid`, returning the holed solid handle.\n * @param kernel - the BREP engine surface.\n * @param solid - the host solid handle.\n * @param params - the punch parameters.\n * @returns the holed solid handle.\n */\nexport function punchSolidOf(kernel: BrepEngineApi, solid: BrepHandle, params: PunchHoleParams): BrepHandle {\n const host = resolveFaceHandle(kernel, params.on, params.face)\n const mode = params.scaleMode ?? 'original'\n const depth = punchDepth(kernel, solid, params.height ?? null)\n\n const draft = params.draftAngle ?? 0\n const draftRad = (draft * Math.PI) / 180\n\n // Punch inward = opposite the host face outward normal.\n const n0 = kernel.surfaceNormal(host, 0, 0)\n const nlen = Math.hypot(n0.x, n0.y, n0.z) || 1\n const n = { x: n0.x / nlen, y: n0.y / nlen, z: n0.z / nlen }\n\n // In-plane anchor via the host face's UV center.\n const ub = kernel.uvBounds(host)\n const uMid = (ub.uMin + ub.uMax) / 2\n const vMid = (ub.vMin + ub.vMax) / 2\n const anchor = kernel.pointOnSurface(host, uMid, vMid)\n\n const bounds = ub\n let result = solid\n for (const contour of params.contours) {\n const curves = contour.segments.map((s) => profileSegToCurve(s as never))\n const uv = makeUvMap(mode, curves2dBounds(curves), bounds)\n const mouth = buildPolygon3d(kernel, host, uv, anchor, n, contour)\n if (mouth.length < 3) throw new Error('punchHole: contour is degenerate (fewer than 3 distinct points)')\n\n // Mouth wire on the host plane.\n const mouthEdges = [] as BrepHandle[]\n for (let i = 0; i < mouth.length; i++) {\n const a = mouth[i]!\n const b = mouth[(i + 1) % mouth.length]!\n mouthEdges.push(kernel.makeLineEdge(a, b) as never)\n }\n\n let punch: BrepHandle\n if (draft !== 0) {\n // Drafted hole = a tapered frustum: the mouth wire at the host plane and an\n // end wire (recessed by `depth*tan(draftAngle)` toward the contour centre)\n // at the punch depth, lofted together via occt. Verified: occt `loft` of two\n // parallel-planar rect wires reproduces the analytic frustum volume exactly.\n const inset = depth * Math.tan(draftRad)\n // Uniform wall recess: each wall recedes by `inset` = depth·tan(draftAngle)\n // measured *perpendicular* to that wall. For a homothetic scale about the\n // centroid by factor s, the perpendicular recess of an edge at distance h\n // from the centroid is h·(1−s); so choose s = 1 − inset/h̄ with h̄ the mean\n // centroid→edge distance (h̄ = the half-side for a square/rect ⇒ walls land\n // at exactly draftAngle).\n const cx = mouth.reduce((s, p) => s + p.x, 0) / mouth.length\n const cy = mouth.reduce((s, p) => s + p.y, 0) / mouth.length\n const cz = mouth.reduce((s, p) => s + p.z, 0) / mouth.length\n let edgeSum = 0\n for (let i = 0; i < mouth.length; i++) {\n const a = mouth[i]!\n const b = mouth[(i + 1) % mouth.length]!\n // centroid → edge midpoint projection in the host plane\n const mx = (a.x + b.x) / 2 - cx\n const my = (a.y + b.y) / 2 - cy\n const mz = (a.z + b.z) / 2 - cz\n edgeSum += Math.hypot(mx, my, mz)\n }\n const hBar = edgeSum / mouth.length\n if (!Number.isFinite(hBar) || hBar <= 1e-9 || inset >= hBar * 0.999) {\n throw new Error(\n `E_PUNCH_DRAFT_OVER_TAPER: draftAngle ${draft}° inset ${inset.toFixed(3)} must be < half-width ${hBar.toFixed(3)} at depth ${depth}`,\n )\n }\n const s = 1 - inset / hBar\n const endPoints = mouth.map((p) => ({\n x: cx + (p.x - cx) * s - n.x * depth,\n y: cy + (p.y - cy) * s - n.y * depth,\n z: cz + (p.z - cz) * s - n.z * depth,\n }))\n const endEdges = endPoints.map((p, i) => {\n const a = endPoints[i]!\n const b = endPoints[(i + 1) % endPoints.length]!\n return kernel.makeLineEdge(a, b) as never\n }) as BrepHandle[]\n const k = getOcctKernel()\n punch = k.loft(\n [kernel.makeWire(mouthEdges), kernel.makeWire(endEdges)] as unknown as never[],\n true,\n true,\n ) as unknown as BrepHandle\n } else {\n const prismFace = kernel.makeFace(kernel.makeWire(mouthEdges))\n punch = kernel.extrude(prismFace, -n.x * depth, -n.y * depth, -n.z * depth)\n }\n try {\n result = kernel.cut(result, punch)\n } finally {\n kernel.release(punch)\n }\n }\n return result\n}\n\n/**\n * Build a Shape: the host solid with the profile(s) punched out of `params.on`.\n * @param kernel - the BREP engine surface.\n * @param params - the punch parameters.\n * @returns the holed Shape.\n */\nexport function buildPunchHole(kernel: BrepEngineApi, params: PunchHoleParams): Shape {\n const solid = brepOf(params.on) as BrepHandle | undefined\n if (solid === undefined) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'face', 'punchHole: target `on` has no BREP solid')\n }\n const holed = punchSolidOf(kernel, solid, params)\n return fromBrep(solidToShape(kernel, holed), { solid: holed })\n}\n\n/**\n * `cad.punchHole`: cut a face-placed 2D profile out of a solid.\n * @group 创建\n * @inputs 1\n * @async false\n * @qual ok\n * @name punchHole\n * @returns Shape with the profile punched out of `on`.\n * @param params.contours - ordered 2D closed contours (the hole profile).type:any[] required:true\n * @param params.on - the target solid to punch.type:Shape required:true\n * @param params.face - host face: FaceTopoRef(UI 拾取产物字面量)| 面选择器字符串(如 \">Z\",在 on 上解析,多面命中抛错)| 1 起序号(仅网格链/当前内核快照,禁止用于生成脚本)。type:any required:true\n * @param params.height - blind depth along the face inward normal (null/absent = through).type:number|object required:false\n * @param params.draftAngle - wall taper in degrees (default 0 = straight; built as an occt loft frustum).type:number required:false\n * @param params.scaleMode - UV mapping: 'original' | 'bounds' | 'native'.type:string required:false\n * @example\n * // loop = 一个闭合 2D 轮廓:{ segments: [{ kind: 'line', x1, y1, x2, y2 }, ...] }\n * const plate = await cad.punchHole({ contours: [loop], on: cad.box(40, 40, 4), face: '>Z' })\n */\nexport const punchHole = defineOp({\n engines: ['occt'],\n brep(params: Record<string, unknown>) {\n assertProfileParams(params)\n return buildPunchHole(getBrepApi(), params as unknown as PunchHoleParams)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n\n paramDims: {},\n})"]}
|
package/dist/api/replicate.d.ts
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
* replicate — handwritten overrides for the copy-family ops (keep semantics +
|
|
3
3
|
* replica[k] role tables).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* (与 face-evolution.ts 同口径)。
|
|
5
|
+
* 平台分层(narrowing plan Phase 5,D11):本文件是**纯中立面**——不 import 任何平台
|
|
6
|
+
* 模块,所有 op 只看 L1 核心面(`getBrepApi()`),故无 `@platform` 标注、也不声明
|
|
7
|
+
* `engines`。面演化轨由 `hasNativeHistory` 在 mirrorBrep 内部按引擎事实静态分叉
|
|
8
|
+
* (详见文末「平台分层」段)。
|
|
10
9
|
*
|
|
11
10
|
* All 9 copy-like ops must NOT consume their input (same as `copy`): each brep
|
|
12
11
|
* body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicate.d.ts","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"replicate.d.ts","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAuBhD,gDAAgD;AAChD,UAAU,aAAa;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChF,wBAAwB;IACxB,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7E;AAmED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe;;CA0C1B,CAAA;AAIF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW;;CAiFtB,CAAA;AAGF,UAAU,yBAAyB;IACjC,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB;;CAqE7B,CAAA;AAIF,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,EAAE,CAAC,EAAE,IAAI,CAAA;CACV;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU;;CAkDrB,CAAA;AAIF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;CAwBjB,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,KAAK;;CAqBhB,CAAA"}
|
package/dist/api/replicate.js
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
* replicate — handwritten overrides for the copy-family ops (keep semantics +
|
|
3
3
|
* replica[k] role tables).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* (与 face-evolution.ts 同口径)。
|
|
5
|
+
* 平台分层(narrowing plan Phase 5,D11):本文件是**纯中立面**——不 import 任何平台
|
|
6
|
+
* 模块,所有 op 只看 L1 核心面(`getBrepApi()`),故无 `@platform` 标注、也不声明
|
|
7
|
+
* `engines`。面演化轨由 `hasNativeHistory` 在 mirrorBrep 内部按引擎事实静态分叉
|
|
8
|
+
* (详见文末「平台分层」段)。
|
|
10
9
|
*
|
|
11
10
|
* All 9 copy-like ops must NOT consume their input (same as `copy`): each brep
|
|
12
11
|
* body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicate.js","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * replicate — handwritten overrides for the copy-family ops (keep semantics +\n * replica[k] role tables).\n *\n * @platform occt — 本文件 import occt-kernel(mirrorJoin 走 `mirrorWithHistory`\n * 平台面,D3)。文件级标注满足守卫①(平台 import 自证身份);文件内的**中立 op**\n * (circularPattern/gridPattern/rectangularPattern/clone 只用 L1 核心面)不声明\n * engines,运行时不拦截——标注只约束平台 import,不改变函数级中立性\n * (与 face-evolution.ts 同口径)。\n *\n * All 9 copy-like ops must NOT consume their input (same as `copy`): each brep\n * body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),\n * so the source stays a live terminal in both runtime and UI.\n *\n * Two groups:\n * - Multi-replica patterns (circularPattern / gridPattern / rectangularPattern /\n * mirrorJoin): promoted from generated compatOps to handwritten defineOps that\n * also build `replica[*]/<inner>` role tables (same treatment as linearPattern,\n * via the shared buildReplicaRoleTable helper).\n * - Single-copy ops (mirror / clone / transformCopy): thin overrides that keep\n * the input and delegate to the generated compatOp (adopt/engines/naming\n * preserved).\n *\n * The generated files stay untouched; overrides win via api-namespace spread\n * (same precedent as cut / split / linearPattern).\n *\n * 平台分层(narrowing plan Phase 5,D11):\n * - mirrorJoin / mirror / circularPattern / gridPattern / rectangularPattern /\n * clone:中立 op(实现只用 L1 核心面)→ 无 engines、无能力声明;\n * 面演化轨由 `hasNativeHistory` 在 mirrorBrep 内部按引擎事实静态分叉。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt, keep, keepHidden } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\nimport {\n meshKernelFailure,\n meshPatternProduct,\n meshSolidBasicEntry,\n meshSolidProduct,\n} from './internal/mesh-solid-op'\n// Generated compatOps (delegation targets for the thin single-copy overrides).\n// NOTE: transformCopy is NOT a script-face op (arg-spec skip: ComposedTransform\n// is not constructible in .fai.js); it stays a TS-library-only re-export.\nimport {\n mirror as generatedMirror,\n clone as generatedClone,\n} from './generated/topology'\n/** 镜像面参数(与旧 MirrorOptions 同形;G5 去外部依赖后本地自持)。 */\ninterface MirrorOptions {\n /** 镜像面法向。默认 [0,0,1]。 */\n normal?: readonly [number, number, number] | { x: number; y: number; z: number }\n /** 镜像面过点。默认 [0,0,0]。 */\n at?: readonly [number, number, number] | { x: number; y: number; z: number }\n}\n\n/** Normalize a vector (zero vector → [0,0,1] fallback, same as pattern.ts). */\nfunction norm(v: Vec3): Vec3 {\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\nfunction toBrepVec(v: Vec3): BrepVec3 {\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/**\n * `MirrorOptions` 的宽松向量形态(只读元组或 `{x,y,z}`)→ `Vec3`。\n *\n * 生成的 compatOp 自己吃得下这两种形态,网格路径要自己换算,故收在一处。\n *\n * @param v - the loosely typed vector from the op's options.\n * @param fallback - the default vector.\n * @returns the vector as a plain tuple.\n */\nfunction optionVec(\n v: readonly [number, number, number] | { x: number; y: number; z: number } | undefined,\n fallback: Vec3,\n): Vec3 {\n if (!v) return fallback\n if (Array.isArray(v)) return [v[0] as number, v[1] as number, v[2] as number]\n const o = v as { x: number; y: number; z: number }\n return [o.x, o.y, o.z]\n}\n\n/** Shared prelude: L1 kernel(getBrepApi,D12)+ BREP input handle + output statement id. */\nfunction prelude(input: Shape, tag: string): { kernel: BrepEngineApi; solid: BrepHandle; outStmt: string } {\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (solid === undefined) throw new Error(`[api/${tag}] input is not BREP`)\n return { kernel, solid, outStmt: String(getCurrentStmt()?.id ?? '') }\n}\n\n/** Rotate point p around the axis line (point `center`, unit direction `u`) by theta radians. */\nfunction rotateAroundAxis(p: BrepVec3, center: BrepVec3, u: Vec3, theta: number): BrepVec3 {\n const vx = p.x - center.x\n const vy = p.y - center.y\n const vz = p.z - center.z\n const cos = Math.cos(theta)\n const sin = Math.sin(theta)\n const dot = vx * u[0] + vy * u[1] + vz * u[2]\n // u × v\n const cx = u[1] * vz - u[2] * vy\n const cy = u[2] * vx - u[0] * vz\n const cz = u[0] * vy - u[1] * vx\n return {\n x: center.x + vx * cos + cx * sin + u[0] * dot * (1 - cos),\n y: center.y + vy * cos + cy * sin + u[1] * dot * (1 - cos),\n z: center.z + vz * cos + cz * sin + u[2] * dot * (1 - cos),\n }\n}\n\n/** Reflect point p across the plane (point `o`, unit normal `n`). Self-inverse. */\nfunction reflectAcrossPlane(p: BrepVec3, o: BrepVec3, n: Vec3): BrepVec3 {\n const d = (p.x - o.x) * n[0] + (p.y - o.y) * n[1] + (p.z - o.z) * n[2]\n return { x: p.x - 2 * d * n[0], y: p.y - 2 * d * n[1], z: p.z - 2 * d * n[2] }\n}\n\n// ── circularPattern ─────────────────────────────────────────────────────────\n\n/**\n * 环形阵列:绕 axis 均分 fullAngle(度,缺省 360)复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name circularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[k]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param axis - 旋转轴方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param fullAngle - 总角度(度,缺省 360)。type:number required:false\n * @param center - 旋转轴上一点(缺省原点)。type:[x,y,z] required:false\n * @example\n * const p = await cad.circularPattern(part0, [0, 0, 1], 6)\n */\nexport const circularPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n // 网格链:内核返回 count 份副本(含原位置),融合成一个网格零件;近似拓扑没有\n // role 层,故不产 `replica[k]/<inner>` 命名(如实缺席)。\n return meshPatternProduct(entry, 'circularPattern', 'E_PATTERN_FAILED', () =>\n entry.kernel.circularPattern(entry.solid, toBrepVec(center), toBrepVec(u), step, count),\n )\n },\n brep(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n const raw = kernel.circularPattern(solid, toBrepVec(center), toBrepVec(u), step, 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 const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const theta = (-k * step * Math.PI) / 180\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => rotateAroundAxis(c, toBrepVec(center), u, theta),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.circularPattern/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n\n// ── gridPattern ─────────────────────────────────────────────────────────────\n\n/**\n * 二维栅格阵列:沿 directionX × directionY 复制 countX×countY 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name gridPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 全部副本的 compound。\n * @param input - 目标几何。type:Shape required:true\n * @param directionX - 第一方向。type:[x,y,z] required:true\n * @param directionY - 第二方向。type:[x,y,z] required:true\n * @param countX - X 向副本数。type:number required:true\n * @param countY - Y 向副本数。type:number required:true\n * @param spacingX - X 向间距。type:number required:true\n * @param spacingY - Y 向间距。type:number required:true\n * @example\n * const p = await cad.gridPattern(part0, [1, 0, 0], [0, 1, 0], 3, 2, 20, 20)\n */\nexport const gridPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // 网格链走\"逐份平移 + fuseAll\"(与 rectangularPattern 同口径),不用内核的\n // `gridPattern`——那支返回**单个 compound 句柄**,近似拓扑无法把 compound 讲成\n // 一个网格零件;逐份平移则得到与线性/环形阵列同形的单一融合实体。\n return meshPatternProduct(entry, 'gridPattern', 'E_PATTERN_FAILED', () => {\n const copies: BrepHandle[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n copies.push(entry.kernel.translate(\n entry.solid,\n ox * dx[0] + oy * dy[0],\n ox * dx[1] + oy * dy[1],\n ox * dx[2] + oy * dy[2],\n ))\n }\n }\n return copies\n })\n },\n brep(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // kernel.gridPattern 返回 compound 单句柄(含全部副本),无需 fuse。\n const resultSolid = kernel.gridPattern(\n solid,\n toBrepVec(dx),\n toBrepVec(dy),\n spacingX,\n spacingY,\n countX,\n countY,\n )\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.gridPattern/translate/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n// ── rectangularPattern ──────────────────────────────────────────────────────\n\ninterface RectangularPatternOptions {\n xDir: Vec3\n xCount: number\n xSpacing: number\n yDir: Vec3\n yCount: number\n ySpacing: number\n}\n\n/**\n * 矩形阵列:按 options(xDir/xCount/xSpacing/yDir/yCount/ySpacing)复制并 fuse。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name rectangularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - 阵列参数。type:RectangularPatternOptions required:true\n * @example\n * const p = await cad.rectangularPattern(part0, { xDir: [1,0,0], xCount: 3, xSpacing: 20, yDir: [0,1,0], yCount: 2, ySpacing: 15 })\n */\nexport const rectangularPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options: RectangularPatternOptions) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // 与 BREP 路径同一手法(逐份 translate 再 fuseAll),只是句柄来自网格后端。\n return meshPatternProduct(entry, 'rectangularPattern', 'E_PATTERN_FAILED', () => {\n const copies: BrepHandle[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(entry.kernel.translate(\n entry.solid,\n ox * dx[0] + oy * dy[0],\n ox * dx[1] + oy * dy[1],\n ox * dx[2] + oy * dy[2],\n ))\n }\n }\n return copies\n })\n },\n brep(input: Shape, options: RectangularPatternOptions) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // 实现为纯 JS 组合:逐份 translate 再 fuseAll,不依赖内核的 rectangularPattern 方法。\n const copies: BrepHandle[] = []\n try {\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(kernel.translate(solid, ox * dx[0] + oy * dy[0], ox * dx[1] + oy * dy[1], ox * dx[2] + oy * dy[2]))\n }\n }\n const resultSolid = kernel.fuseAll(copies)\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n for (const c of copies) kernel.release(c)\n }\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.translate/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n\n// ── mirrorJoin ──────────────────────────────────────────────────────────────\n\ninterface MirrorJoinOptions {\n normal?: Vec3\n at?: Vec3\n}\n\n/**\n * 镜像并融合:原物(replica[0])+ 沿平面镜像(replica[1])fuse 成一体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirrorJoin\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[0|1]/<inner>`。\n * @returns Shape fuse 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面法向与面上一点。type:MirrorJoinOptions required:false\n * @example\n * const p = await cad.mirrorJoin(part0, { normal: [1, 0, 0] })\n */\nexport const mirrorJoin = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options?: MirrorJoinOptions) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'mirrorJoin')\n const n = norm(optionVec(options?.normal, [1, 0, 0]))\n const o = toBrepVec(optionVec(options?.at, [0, 0, 0]))\n // 输入句柄**不释放**(keep 语义);只释放本次自造的镜像副本。\n let mirrored: BrepHandle\n try {\n mirrored = entry.kernel.mirror(entry.solid, o, toBrepVec(n))\n } catch (cause) {\n throw meshKernelFailure('mirrorJoin', 'E_MIRROR_FAILED', `mirror across normal [${n.join(', ')}]`, cause)\n }\n try {\n return meshSolidProduct(entry, entry.kernel.fuse(entry.solid, mirrored))\n } catch (cause) {\n throw meshKernelFailure('mirrorJoin', 'E_MIRROR_FAILED', 'fusing the mirrored copy', cause)\n } finally {\n entry.backend.release(mirrored)\n }\n },\n brep(input: Shape, options?: MirrorJoinOptions) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'mirrorJoin')\n const n = norm(options?.normal ?? [1, 0, 0])\n const o = toBrepVec(options?.at ?? [0, 0, 0])\n // replicate 的 role table 经质心聚类重建(引擎无关),mirror history 对\n // role table 无增量收益,故走 L1 kernel.mirror(两引擎的 L1 契约面均提供\n // `mirror`;`mirrorWithHistory` 不参与本 op,与引擎身份无关)。\n // 面演化由 mirrorBrep(topologyFns.ts)双轨接入,replicate 不重复消费。\n const mirrored = kernel.mirror(solid, o, toBrepVec(n))\n try {\n const resultSolid = kernel.fuse(solid, mirrored)\n\n const replicas: ReplicaTransform[] = [\n { label: 'replica[0]', inverse: (c) => ({ x: c.x, y: c.y, z: c.z }) },\n { label: 'replica[1]', inverse: (c) => reflectAcrossPlane(c, o, n) },\n ]\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n kernel.release(mirrored)\n }\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.mirror/fuse)。replicate 的\n // role table 不消费 mirror history(见上注释),面演化由 mirrorBrep 双轨接入。\n naming: { kind: 'replicate', k: 2 } as Provenance,\n\n paramDims: {},\n})\n\n// ── single-copy thin overrides(keep + 委托生成 op)─────────────────────────\n\n/**\n * 镜像:返回镜像后的新 Shape(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirror\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 镜像后的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面。type:MirrorOptions required:false\n * @example\n * const p = await cad.mirror(part0, { normal: [1, 0, 0] })\n */\nexport const mirror = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options?: MirrorOptions) {\n keep(input)\n const entry = meshSolidBasicEntry(input, 'mirror')\n const n = norm(optionVec(options?.normal, [1, 0, 0]))\n const o = toBrepVec(optionVec(options?.at, [0, 0, 0]))\n let result: BrepHandle\n try {\n result = entry.kernel.mirror(entry.solid, o, toBrepVec(n))\n } catch (cause) {\n throw meshKernelFailure('mirror', 'E_MIRROR_FAILED', `mirror across normal [${n.join(', ')}]`, cause)\n }\n return meshSolidProduct(entry, result)\n },\n async brep(input: Shape, options?: MirrorOptions) {\n keep(input)\n return (await generatedMirror(input, options)) as Shape\n },\n // 薄 override:generatedMirror 走 L1 kernel.mirror,与 clone 薄 override 同模式\n // (无能力门,内层实现自行按引擎事实分叉)。面演化由 mirrorBrep 双轨接入。\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n\n paramDims: {},\n})\n\n/**\n * 深拷贝句柄:返回独立副本(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name clone\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 克隆的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const p = await cad.clone(part0)\n */\nexport const clone = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape) {\n keep(input)\n const entry = meshSolidBasicEntry(input, 'clone')\n let result: BrepHandle\n try {\n result = entry.kernel.copyShape(entry.solid)\n } catch (cause) {\n throw meshKernelFailure('clone', 'E_CLONE_FAILED', 'copying the mesh solid handle', cause)\n }\n return meshSolidProduct(entry, result)\n },\n async brep(input: Shape) {\n keep(input)\n return (await generatedClone(input)) as Shape\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.copyShape)。\n naming: { kind: 'identity' } as Provenance,\n\n paramDims: {},\n})\n"]}
|
|
1
|
+
{"version":3,"file":"replicate.js","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * replicate — handwritten overrides for the copy-family ops (keep semantics +\n * replica[k] role tables).\n *\n * 平台分层(narrowing plan Phase 5,D11):本文件是**纯中立面**——不 import 任何平台\n * 模块,所有 op 只看 L1 核心面(`getBrepApi()`),故无 `@platform` 标注、也不声明\n * `engines`。面演化轨由 `hasNativeHistory` 在 mirrorBrep 内部按引擎事实静态分叉\n * (详见文末「平台分层」段)。\n *\n * All 9 copy-like ops must NOT consume their input (same as `copy`): each brep\n * body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),\n * so the source stays a live terminal in both runtime and UI.\n *\n * Two groups:\n * - Multi-replica patterns (circularPattern / gridPattern / rectangularPattern /\n * mirrorJoin): promoted from generated compatOps to handwritten defineOps that\n * also build `replica[*]/<inner>` role tables (same treatment as linearPattern,\n * via the shared buildReplicaRoleTable helper).\n * - Single-copy ops (mirror / clone / transformCopy): thin overrides that keep\n * the input and delegate to the generated compatOp (adopt/engines/naming\n * preserved).\n *\n * The generated files stay untouched; overrides win via api-namespace spread\n * (same precedent as cut / split / linearPattern).\n *\n * 平台分层(narrowing plan Phase 5,D11):\n * - mirrorJoin / mirror / circularPattern / gridPattern / rectangularPattern /\n * clone:中立 op(实现只用 L1 核心面)→ 无 engines、无能力声明;\n * 面演化轨由 `hasNativeHistory` 在 mirrorBrep 内部按引擎事实静态分叉。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt, keep, keepHidden } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\nimport {\n meshKernelFailure,\n meshPatternProduct,\n meshSolidBasicEntry,\n meshSolidProduct,\n} from './internal/mesh-solid-op'\n// Generated compatOps (delegation targets for the thin single-copy overrides).\n// NOTE: transformCopy is NOT a script-face op (arg-spec skip: ComposedTransform\n// is not constructible in .fai.js); it stays a TS-library-only re-export.\nimport {\n mirror as generatedMirror,\n clone as generatedClone,\n} from './generated/topology'\n/** 镜像面参数(与旧 MirrorOptions 同形;G5 去外部依赖后本地自持)。 */\ninterface MirrorOptions {\n /** 镜像面法向。默认 [0,0,1]。 */\n normal?: readonly [number, number, number] | { x: number; y: number; z: number }\n /** 镜像面过点。默认 [0,0,0]。 */\n at?: readonly [number, number, number] | { x: number; y: number; z: number }\n}\n\n/** Normalize a vector (zero vector → [0,0,1] fallback, same as pattern.ts). */\nfunction norm(v: Vec3): Vec3 {\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\nfunction toBrepVec(v: Vec3): BrepVec3 {\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/**\n * `MirrorOptions` 的宽松向量形态(只读元组或 `{x,y,z}`)→ `Vec3`。\n *\n * 生成的 compatOp 自己吃得下这两种形态,网格路径要自己换算,故收在一处。\n *\n * @param v - the loosely typed vector from the op's options.\n * @param fallback - the default vector.\n * @returns the vector as a plain tuple.\n */\nfunction optionVec(\n v: readonly [number, number, number] | { x: number; y: number; z: number } | undefined,\n fallback: Vec3,\n): Vec3 {\n if (!v) return fallback\n if (Array.isArray(v)) return [v[0] as number, v[1] as number, v[2] as number]\n const o = v as { x: number; y: number; z: number }\n return [o.x, o.y, o.z]\n}\n\n/** Shared prelude: L1 kernel(getBrepApi,D12)+ BREP input handle + output statement id. */\nfunction prelude(input: Shape, tag: string): { kernel: BrepEngineApi; solid: BrepHandle; outStmt: string } {\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (solid === undefined) throw new Error(`[api/${tag}] input is not BREP`)\n return { kernel, solid, outStmt: String(getCurrentStmt()?.id ?? '') }\n}\n\n/** Rotate point p around the axis line (point `center`, unit direction `u`) by theta radians. */\nfunction rotateAroundAxis(p: BrepVec3, center: BrepVec3, u: Vec3, theta: number): BrepVec3 {\n const vx = p.x - center.x\n const vy = p.y - center.y\n const vz = p.z - center.z\n const cos = Math.cos(theta)\n const sin = Math.sin(theta)\n const dot = vx * u[0] + vy * u[1] + vz * u[2]\n // u × v\n const cx = u[1] * vz - u[2] * vy\n const cy = u[2] * vx - u[0] * vz\n const cz = u[0] * vy - u[1] * vx\n return {\n x: center.x + vx * cos + cx * sin + u[0] * dot * (1 - cos),\n y: center.y + vy * cos + cy * sin + u[1] * dot * (1 - cos),\n z: center.z + vz * cos + cz * sin + u[2] * dot * (1 - cos),\n }\n}\n\n/** Reflect point p across the plane (point `o`, unit normal `n`). Self-inverse. */\nfunction reflectAcrossPlane(p: BrepVec3, o: BrepVec3, n: Vec3): BrepVec3 {\n const d = (p.x - o.x) * n[0] + (p.y - o.y) * n[1] + (p.z - o.z) * n[2]\n return { x: p.x - 2 * d * n[0], y: p.y - 2 * d * n[1], z: p.z - 2 * d * n[2] }\n}\n\n// ── circularPattern ─────────────────────────────────────────────────────────\n\n/**\n * 环形阵列:绕 axis 均分 fullAngle(度,缺省 360)复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name circularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[k]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param axis - 旋转轴方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param fullAngle - 总角度(度,缺省 360)。type:number required:false\n * @param center - 旋转轴上一点(缺省原点)。type:[x,y,z] required:false\n * @example\n * const p = await cad.circularPattern(part0, [0, 0, 1], 6)\n */\nexport const circularPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n // 网格链:内核返回 count 份副本(含原位置),融合成一个网格零件;近似拓扑没有\n // role 层,故不产 `replica[k]/<inner>` 命名(如实缺席)。\n return meshPatternProduct(entry, 'circularPattern', 'E_PATTERN_FAILED', () =>\n entry.kernel.circularPattern(entry.solid, toBrepVec(center), toBrepVec(u), step, count),\n )\n },\n brep(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n const raw = kernel.circularPattern(solid, toBrepVec(center), toBrepVec(u), step, 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 const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const theta = (-k * step * Math.PI) / 180\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => rotateAroundAxis(c, toBrepVec(center), u, theta),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.circularPattern/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n\n// ── gridPattern ─────────────────────────────────────────────────────────────\n\n/**\n * 二维栅格阵列:沿 directionX × directionY 复制 countX×countY 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name gridPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 全部副本的 compound。\n * @param input - 目标几何。type:Shape required:true\n * @param directionX - 第一方向。type:[x,y,z] required:true\n * @param directionY - 第二方向。type:[x,y,z] required:true\n * @param countX - X 向副本数。type:number required:true\n * @param countY - Y 向副本数。type:number required:true\n * @param spacingX - X 向间距。type:number required:true\n * @param spacingY - Y 向间距。type:number required:true\n * @example\n * const p = await cad.gridPattern(part0, [1, 0, 0], [0, 1, 0], 3, 2, 20, 20)\n */\nexport const gridPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // 网格链走\"逐份平移 + fuseAll\"(与 rectangularPattern 同口径),不用内核的\n // `gridPattern`——那支返回**单个 compound 句柄**,近似拓扑无法把 compound 讲成\n // 一个网格零件;逐份平移则得到与线性/环形阵列同形的单一融合实体。\n return meshPatternProduct(entry, 'gridPattern', 'E_PATTERN_FAILED', () => {\n const copies: BrepHandle[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n copies.push(entry.kernel.translate(\n entry.solid,\n ox * dx[0] + oy * dy[0],\n ox * dx[1] + oy * dy[1],\n ox * dx[2] + oy * dy[2],\n ))\n }\n }\n return copies\n })\n },\n brep(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // kernel.gridPattern 返回 compound 单句柄(含全部副本),无需 fuse。\n const resultSolid = kernel.gridPattern(\n solid,\n toBrepVec(dx),\n toBrepVec(dy),\n spacingX,\n spacingY,\n countX,\n countY,\n )\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.gridPattern/translate/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n// ── rectangularPattern ──────────────────────────────────────────────────────\n\ninterface RectangularPatternOptions {\n xDir: Vec3\n xCount: number\n xSpacing: number\n yDir: Vec3\n yCount: number\n ySpacing: number\n}\n\n/**\n * 矩形阵列:按 options(xDir/xCount/xSpacing/yDir/yCount/ySpacing)复制并 fuse。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name rectangularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - 阵列参数。type:RectangularPatternOptions required:true\n * @example\n * const p = await cad.rectangularPattern(part0, { xDir: [1,0,0], xCount: 3, xSpacing: 20, yDir: [0,1,0], yCount: 2, ySpacing: 15 })\n */\nexport const rectangularPattern = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options: RectangularPatternOptions) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // 与 BREP 路径同一手法(逐份 translate 再 fuseAll),只是句柄来自网格后端。\n return meshPatternProduct(entry, 'rectangularPattern', 'E_PATTERN_FAILED', () => {\n const copies: BrepHandle[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(entry.kernel.translate(\n entry.solid,\n ox * dx[0] + oy * dy[0],\n ox * dx[1] + oy * dy[1],\n ox * dx[2] + oy * dy[2],\n ))\n }\n }\n return copies\n })\n },\n brep(input: Shape, options: RectangularPatternOptions) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // 实现为纯 JS 组合:逐份 translate 再 fuseAll,不依赖内核的 rectangularPattern 方法。\n const copies: BrepHandle[] = []\n try {\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(kernel.translate(solid, ox * dx[0] + oy * dy[0], ox * dx[1] + oy * dy[1], ox * dx[2] + oy * dy[2]))\n }\n }\n const resultSolid = kernel.fuseAll(copies)\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n for (const c of copies) kernel.release(c)\n }\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.translate/fuseAll)。\n naming: { kind: 'replicate', k: 0 } as Provenance,\n\n paramDims: {},\n})\n\n// ── mirrorJoin ──────────────────────────────────────────────────────────────\n\ninterface MirrorJoinOptions {\n normal?: Vec3\n at?: Vec3\n}\n\n/**\n * 镜像并融合:原物(replica[0])+ 沿平面镜像(replica[1])fuse 成一体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirrorJoin\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[0|1]/<inner>`。\n * @returns Shape fuse 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面法向与面上一点。type:MirrorJoinOptions required:false\n * @example\n * const p = await cad.mirrorJoin(part0, { normal: [1, 0, 0] })\n */\nexport const mirrorJoin = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options?: MirrorJoinOptions) {\n keepHidden(input)\n const entry = meshSolidBasicEntry(input, 'mirrorJoin')\n const n = norm(optionVec(options?.normal, [1, 0, 0]))\n const o = toBrepVec(optionVec(options?.at, [0, 0, 0]))\n // 输入句柄**不释放**(keep 语义);只释放本次自造的镜像副本。\n let mirrored: BrepHandle\n try {\n mirrored = entry.kernel.mirror(entry.solid, o, toBrepVec(n))\n } catch (cause) {\n throw meshKernelFailure('mirrorJoin', 'E_MIRROR_FAILED', `mirror across normal [${n.join(', ')}]`, cause)\n }\n try {\n return meshSolidProduct(entry, entry.kernel.fuse(entry.solid, mirrored))\n } catch (cause) {\n throw meshKernelFailure('mirrorJoin', 'E_MIRROR_FAILED', 'fusing the mirrored copy', cause)\n } finally {\n entry.backend.release(mirrored)\n }\n },\n brep(input: Shape, options?: MirrorJoinOptions) {\n keepHidden(input)\n const { kernel, solid, outStmt } = prelude(input, 'mirrorJoin')\n const n = norm(options?.normal ?? [1, 0, 0])\n const o = toBrepVec(options?.at ?? [0, 0, 0])\n // replicate 的 role table 经质心聚类重建(引擎无关),mirror history 对\n // role table 无增量收益,故走 L1 kernel.mirror(两引擎的 L1 契约面均提供\n // `mirror`;`mirrorWithHistory` 不参与本 op,与引擎身份无关)。\n // 面演化由 mirrorBrep(topologyFns.ts)双轨接入,replicate 不重复消费。\n const mirrored = kernel.mirror(solid, o, toBrepVec(n))\n try {\n const resultSolid = kernel.fuse(solid, mirrored)\n\n const replicas: ReplicaTransform[] = [\n { label: 'replica[0]', inverse: (c) => ({ x: c.x, y: c.y, z: c.z }) },\n { label: 'replica[1]', inverse: (c) => reflectAcrossPlane(c, o, n) },\n ]\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n kernel.release(mirrored)\n }\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.mirror/fuse)。replicate 的\n // role table 不消费 mirror history(见上注释),面演化由 mirrorBrep 双轨接入。\n naming: { kind: 'replicate', k: 2 } as Provenance,\n\n paramDims: {},\n})\n\n// ── single-copy thin overrides(keep + 委托生成 op)─────────────────────────\n\n/**\n * 镜像:返回镜像后的新 Shape(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirror\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 镜像后的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面。type:MirrorOptions required:false\n * @example\n * const p = await cad.mirror(part0, { normal: [1, 0, 0] })\n */\nexport const mirror = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape, options?: MirrorOptions) {\n keep(input)\n const entry = meshSolidBasicEntry(input, 'mirror')\n const n = norm(optionVec(options?.normal, [1, 0, 0]))\n const o = toBrepVec(optionVec(options?.at, [0, 0, 0]))\n let result: BrepHandle\n try {\n result = entry.kernel.mirror(entry.solid, o, toBrepVec(n))\n } catch (cause) {\n throw meshKernelFailure('mirror', 'E_MIRROR_FAILED', `mirror across normal [${n.join(', ')}]`, cause)\n }\n return meshSolidProduct(entry, result)\n },\n async brep(input: Shape, options?: MirrorOptions) {\n keep(input)\n return (await generatedMirror(input, options)) as Shape\n },\n // 薄 override:generatedMirror 走 L1 kernel.mirror,与 clone 薄 override 同模式\n // (无能力门,内层实现自行按引擎事实分叉)。面演化由 mirrorBrep 双轨接入。\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n\n paramDims: {},\n})\n\n/**\n * 深拷贝句柄:返回独立副本(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name clone\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 克隆的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const p = await cad.clone(part0)\n */\nexport const clone = defineOp({\n meshEngines: ['brepkit'],\n mesh(input: Shape) {\n keep(input)\n const entry = meshSolidBasicEntry(input, 'clone')\n let result: BrepHandle\n try {\n result = entry.kernel.copyShape(entry.solid)\n } catch (cause) {\n throw meshKernelFailure('clone', 'E_CLONE_FAILED', 'copying the mesh solid handle', cause)\n }\n return meshSolidProduct(entry, result)\n },\n async brep(input: Shape) {\n keep(input)\n return (await generatedClone(input)) as Shape\n },\n // 中立 op(D11):实现只用 L1 核心面(kernel.copyShape)。\n naming: { kind: 'identity' } as Provenance,\n\n paramDims: {},\n})\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api selectors-to-refs — CadQuery 选择器 → TopoRef 桥(方案 2026-10-12 §3.2)
|
|
3
|
+
*
|
|
4
|
+
* 把 CadQuery 字符串选择器(`">Z"`、`"|Z"`、`"%PLANE"`、命名视图 `"top"`、
|
|
5
|
+
* 集合表达式 `"|Z and %PLANE"` …)求值成内核句柄,再经命名层(RoleTable + 血缘)
|
|
6
|
+
* 反查合成 `FaceTopoRef` / `EdgeTopoRef`,或直接投影成顶点坐标(`P3`)——让
|
|
7
|
+
* `cad.*` op 的拓扑参数能吃下字符串选择器(AI 生成 faijs 代码的目标形态),
|
|
8
|
+
* 而不破坏「选择器子系统与命名/TopoRef 系统物理隔离」的红线。
|
|
9
|
+
*
|
|
10
|
+
* 职责边界(方案 §3.2 R4):本文件是选择器与命名系统之间**唯一的显式通道**。
|
|
11
|
+
* 句柄 → TopoRef 反查复用 `edge-ref.ts` / `face-ref.ts` 已示范的路径
|
|
12
|
+
* (`captureEdgeHint` / `captureFaceHint` / `findOriginRole` /
|
|
13
|
+
* `recoverEdgeFaceRole`),不重写命名逻辑。
|
|
14
|
+
*
|
|
15
|
+
* 错误红线(方案 §3.2 R1,与 faijs 红线一致):选择器选中的**无名实体**
|
|
16
|
+
* (role 缺失,如 3MF 网格链)→ 抛 `TopoRefError`,不静默降级;网格零件没有
|
|
17
|
+
* role 层,选择器/命名体系只服务精度链(网格链用序号是设计定论)。
|
|
18
|
+
*/
|
|
19
|
+
import type { Shape } from '../mesh/types.js';
|
|
20
|
+
import { type EdgeTopoRef, type FaceTopoRef } from '../topology/naming/index.js';
|
|
21
|
+
import type { P3 } from './cadquery-selectors/entity.js';
|
|
22
|
+
/**
|
|
23
|
+
* 把面选择器字符串解析成 `FaceTopoRef[]`(选择器 → 句柄 → TopoRef 全链)。
|
|
24
|
+
*
|
|
25
|
+
* 示例:`">Z"`(Z 极值面)、`"|Z"`(法向平行 Z 的平面面)、`"%PLANE"`、
|
|
26
|
+
* `"top"`(命名视图)、`"|Z and %PLANE"`(集合表达式)。
|
|
27
|
+
*
|
|
28
|
+
* @param shape - 目标几何(BREP 实体所在的 Shape;选择器服务精度链)。
|
|
29
|
+
* @param sel - CadQuery 面选择器字符串。
|
|
30
|
+
* @returns 选中面的 `FaceTopoRef[]`(保持选择器返回顺序)。
|
|
31
|
+
* @throws {TopoRefError} 无 BREP / 选中面无 role 血统(不静默降级)。
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveSelectorToFaceRefs(shape: Shape, sel: string): FaceTopoRef[];
|
|
34
|
+
/**
|
|
35
|
+
* 把边选择器字符串解析成 `EdgeTopoRef[]`(选择器 → 句柄 → TopoRef 全链)。
|
|
36
|
+
*
|
|
37
|
+
* 示例:`"|Z"`(切线平行 Z 的边)、`">Z"`(Z 极值边)、`"%LINE"`、
|
|
38
|
+
* `"#Z"`(切线垂直 Z)。
|
|
39
|
+
*
|
|
40
|
+
* @param shape - 目标几何(BREP 实体所在的 Shape)。
|
|
41
|
+
* @param sel - CadQuery 边选择器字符串。
|
|
42
|
+
* @returns 选中边的 `EdgeTopoRef[]`(保持选择器返回顺序)。
|
|
43
|
+
* @throws {TopoRefError} 无 BREP / 选中边邻面不足两面或无 role 血统。
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveSelectorToEdgeRefs(shape: Shape, sel: string): EdgeTopoRef[];
|
|
46
|
+
/**
|
|
47
|
+
* 把顶点选择器字符串解析成顶点坐标 `P3[]`。
|
|
48
|
+
*
|
|
49
|
+
* 顶点没有角色身份(命名层只给面/边命名),故直接投影成世界坐标点——
|
|
50
|
+
* 供未来需要「点」的 op(如打点/对齐)使用。
|
|
51
|
+
*
|
|
52
|
+
* @param shape - 目标几何(BREP 实体所在的 Shape)。
|
|
53
|
+
* @param sel - CadQuery 顶点选择器字符串(如 `">Z"`、`"(0,0,0)"`,空串 = 全部)。
|
|
54
|
+
* @returns 选中顶点的世界坐标(保持选择器返回顺序)。
|
|
55
|
+
* @throws {TopoRefError} 无 BREP(顶点选择器只服务精度链)。
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveSelectorToVertexPts(shape: Shape, sel: string): P3[];
|
|
58
|
+
/** 边选择器参数的一个条目:选择器字符串或 `EdgeTopoRef`。 */
|
|
59
|
+
export type EdgeSelectorEntry = EdgeTopoRef | string;
|
|
60
|
+
/** 面选择器参数的一个条目:选择器字符串或 `FaceTopoRef`。 */
|
|
61
|
+
export type FaceSelectorEntry = FaceTopoRef | string;
|
|
62
|
+
/**
|
|
63
|
+
* 展开 op 的边选择器参数(顶层字符串或数组元素字符串)到 `EdgeTopoRef[]`。
|
|
64
|
+
*
|
|
65
|
+
* 形态(方案 D2-A):`edges: "|Z"`、`edges: ["|Z"]`、`edges: ["|Z", refA]` 均可。
|
|
66
|
+
* 数组里的 `EdgeTopoRef` 原样保留;字符串逐个经桥解析(保持出现顺序)。
|
|
67
|
+
*
|
|
68
|
+
* @param shape - 目标几何(BREP 实体所在的 Shape)。
|
|
69
|
+
* @param edges - 边选择器参数(字符串 = 单一选择器;数组元素可为选择器字符串或 EdgeTopoRef)。
|
|
70
|
+
* @returns 展开后的 `EdgeTopoRef[]`。
|
|
71
|
+
*/
|
|
72
|
+
export declare function expandEdgeSelectorRefs(shape: Shape, edges: EdgeSelectorEntry[] | string): EdgeTopoRef[];
|
|
73
|
+
/**
|
|
74
|
+
* 展开 op 的面选择器参数(顶层字符串或数组元素字符串)到 `FaceTopoRef[]`。
|
|
75
|
+
*
|
|
76
|
+
* 形态(方案 D2-A):`openFaces: ">Z"`、`faces: ["|Z"]`、`faces: ["|Z", refA]` 均可。
|
|
77
|
+
*
|
|
78
|
+
* @param shape - 目标几何(BREP 实体所在的 Shape)。
|
|
79
|
+
* @param faces - 面选择器参数(字符串 = 单一选择器;数组元素可为选择器字符串或 FaceTopoRef)。
|
|
80
|
+
* @returns 展开后的 `FaceTopoRef[]`。
|
|
81
|
+
*/
|
|
82
|
+
export declare function expandFaceSelectorRefs(shape: Shape, faces: FaceSelectorEntry[] | string): FaceTopoRef[];
|
|
83
|
+
//# sourceMappingURL=selectors-to-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors-to-refs.d.ts","sourceRoot":"","sources":["../../src/api/selectors-to-refs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAA;AAgJrD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAalF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAalF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,CAQ1E;AAID,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,MAAM,CAAA;AAEpD,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,MAAM,CAAA;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,GAClC,WAAW,EAAE,CAGf;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,GAClC,WAAW,EAAE,CAGf"}
|