@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/mesh/engrave.js
CHANGED
|
@@ -15,15 +15,14 @@ import { Vec3 as Vec3C, Quat, Mat4 } from '../math3d/index.js';
|
|
|
15
15
|
import { transformShape, translateShape } from './meshdata/ops.js';
|
|
16
16
|
import { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend.js';
|
|
17
17
|
import { boundingBox } from './query.js';
|
|
18
|
-
import {
|
|
18
|
+
import { createEngraveDecorationProvider } from '../extra/mesh/engrave-decoration.js';
|
|
19
19
|
/**
|
|
20
20
|
* Execute an engraving: generate the decoration geometry (text or SVG),
|
|
21
21
|
* position it onto a face, then run a boolean union (convex) or subtract
|
|
22
22
|
* (concave).
|
|
23
23
|
*
|
|
24
|
-
* The decoration geometry itself
|
|
25
|
-
*
|
|
26
|
-
* chain belongs to `@faicad/faijs-extra`, not to the platform surface.
|
|
24
|
+
* The decoration geometry itself is produced internally (the text/SVG geometry
|
|
25
|
+
* chain was absorbed into core as `extra/mesh/engrave-decoration`).
|
|
27
26
|
*
|
|
28
27
|
* @param shape - the world-space target shape.
|
|
29
28
|
* @param params - engrave parameters (text/svg, depth, face, mode).
|
|
@@ -34,13 +33,7 @@ export async function engrave(shape, params) {
|
|
|
34
33
|
if (!params.text && !params.svg) {
|
|
35
34
|
throw new Error('engrave requires either text or svg');
|
|
36
35
|
}
|
|
37
|
-
const provider =
|
|
38
|
-
if (!provider) {
|
|
39
|
-
throw new Error('engrave: no mesh decoration provider installed — the text/SVG geometry chain ' +
|
|
40
|
-
'lives in @faicad/faijs-extra; call setEngraveDecorationProvider() (or ' +
|
|
41
|
-
'installEditorMeshProviders() from @faicad/faijs-extra) before engraving in mesh mode, ' +
|
|
42
|
-
'or run the op on the BREP path');
|
|
43
|
-
}
|
|
36
|
+
const provider = createEngraveDecorationProvider();
|
|
44
37
|
let decoration = await provider({
|
|
45
38
|
text: params.text,
|
|
46
39
|
textSize: params.textSize,
|
package/dist/mesh/engrave.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 雕刻 API\n *\n * 提取来源:engine/components/engraving/EngravingCore.ts\n *\n * 从 executeEngraving 中提取纯几何计算部分:\n * 1. 生成装饰几何(文字或 SVG)\n * 2. 定位到面\n * 3. 布尔运算(凸=union,凹=subtract)\n *\n * 不包含:store 读写、commitGeometry、undo snapshot、toast。\n * 这些由执行器负责(P1 不改变现有执行器行为)。\n */\n\nimport { Vec3 as Vec3C, Quat, Mat4 } from '../math3d'\nimport { transformShape, translateShape } from './meshdata/ops'\nimport { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend'\nimport { boundingBox } from './query'\nimport { getEngraveDecorationProvider } from './decoration-provider'\nimport type { Shape, EngraveParams, KnurlParams } from './types'\n\n/**\n * Execute an engraving: generate the decoration geometry (text or SVG),\n * position it onto a face, then run a boolean union (convex) or subtract\n * (concave).\n *\n * The decoration geometry itself comes from the host-installed provider\n * (`setEngraveDecorationProvider`) — three's `Shape`/`ExtrudeGeometry`/`SVGLoader`\n * chain belongs to `@faicad/faijs-extra`, not to the platform surface.\n *\n * @param shape - the world-space target shape.\n * @param params - engrave parameters (text/svg, depth, face, mode).\n * @returns the engraved shape in world space.\n */\nexport async function engrave(shape: Shape, params: EngraveParams): Promise<Shape> {\n // 1. 生成装饰几何(局部空间,+Z = 挤出方向)\n if (!params.text && !params.svg) {\n throw new Error('engrave requires either text or svg')\n }\n const provider = getEngraveDecorationProvider()\n if (!provider) {\n throw new Error(\n 'engrave: no mesh decoration provider installed — the text/SVG geometry chain ' +\n 'lives in @faicad/faijs-extra; call setEngraveDecorationProvider() (or ' +\n 'installEditorMeshProviders() from @faicad/faijs-extra) before engraving in mesh mode, ' +\n 'or run the op on the BREP path',\n )\n }\n let decoration = await provider({\n text: params.text,\n textSize: params.textSize,\n svg: params.svg,\n svgSize: params.svgSize,\n svgNaturalWidth: params.svgNaturalWidth,\n svgNaturalHeight: params.svgNaturalHeight,\n depth: params.depth,\n })\n\n // 2. 定位装饰几何到面\n const faceCenter = new Vec3C(...params.face.center)\n const faceNormal = new Vec3C(...params.face.normal)\n\n // Center geometry at origin\n const bb = boundingBox(decoration)\n const center = new Vec3C(\n (bb.min[0] + bb.max[0]) / 2,\n (bb.min[1] + bb.max[1]) / 2,\n (bb.min[2] + bb.max[2]) / 2,\n )\n decoration = translateShape(decoration, -center.x, -center.y, -center.z)\n\n // Rotate +Z to align with face normal\n const quat = new Quat().setFromUnitVectors(\n new Vec3C(0, 0, 1),\n faceNormal,\n )\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n decoration = transformShape(decoration, rotMatrix)\n\n // Offset along normal (convex = outward, concave = inward)\n const offset = params.mode === 'convex' ? params.depth / 2 : -params.depth / 2\n const pos = faceCenter.clone().add(faceNormal.clone().multiplyScalar(offset))\n decoration = translateShape(decoration, pos.x, pos.y, pos.z)\n\n // 3. 转换为 ManifoldMeshData\n const decorationData = geoToManifoldMesh(decoration)\n\n // 4. 布尔运算\n const op = params.mode === 'convex' ? 'union' : 'subtract'\n const result = await computeBoolean([shape, decorationData], op)\n\n return result\n}\n\n/**\n * Apply a knurling texture displacement to a shape (vertex displacement, not a\n * boolean op). The replay path approximates UI face selection by excluding\n * faces whose normal deviates from the given face normal; the angle limits act\n * as an angular mask.\n *\n * @param shape - the world-space shape to knurl.\n * @param params - knurl parameters (texture height, refine length, UV scale, mapping mode).\n * @returns the displaced shape in world space.\n */\nexport async function knurl(shape: Shape, params: KnurlParams): Promise<Shape> {\n const { applyKnurlDisplacement, KNURL_DEFAULTS } = await import(\n './knurl/KnurlGenerator'\n )\n\n // 1. Shape → Shape (with normals)\n const geo = manifoldMeshToGeo(shape, { computeNormals: true })\n\n // 2. 计算面排除权重:法向与 face.normal 不接近的面标记为排除\n const positions = geo.positions\n const triCount = positions.length / 3\n const faceNormal = new Vec3C(...params.face.normal).normalize()\n\n // 计算每个三角形的法向\n const indices = geo.indices.length > 0 ? geo.indices : null\n const faceWeights = new Float32Array(positions.length)\n\n const v0 = new Vec3C()\n const v1 = new Vec3C()\n const v2 = new Vec3C()\n const edge1 = new Vec3C()\n const edge2 = new Vec3C()\n const triNormal = new Vec3C()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices ? indices[t * 3] : t * 3\n const i1 = indices ? indices[t * 3 + 1] : t * 3 + 1\n const i2 = indices ? indices[t * 3 + 2] : t * 3 + 2\n\n v0.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2])\n v1.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2])\n v2.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2])\n\n edge1.subVectors(v1, v0)\n edge2.subVectors(v2, v0)\n triNormal.crossVectors(edge1, edge2).normalize()\n\n // 法向相似度:dot > 0.5 (~60° within) → 不排除\n const dot = triNormal.dot(faceNormal)\n if (dot < 0.5) {\n faceWeights[t * 3] = 1.0\n faceWeights[t * 3 + 1] = 1.0\n faceWeights[t * 3 + 2] = 1.0\n }\n }\n\n // 3. 计算包围盒\n const bb = boundingBox(geo)\n const bbMin = new Vec3C(bb.min[0], bb.min[1], bb.min[2])\n const bbMax = new Vec3C(bb.max[0], bb.max[1], bb.max[2])\n const partBounds = {\n min: bbMin,\n max: bbMax,\n size: new Vec3C().subVectors(bbMax, bbMin),\n center: new Vec3C().addVectors(bbMin, bbMax).multiplyScalar(0.5),\n }\n\n // 4. 调用 applyKnurlDisplacement\n const result = await applyKnurlDisplacement(\n geo,\n {\n ...KNURL_DEFAULTS,\n textureHeight: params.knurlTextureHeight,\n invertDisplacement: params.knurlInvertDisplacement,\n refineLength: params.knurlRefineLength,\n scaleU: params.knurlScaleU,\n scaleV: params.knurlScaleV,\n mappingMode: params.knurlMappingMode,\n faceWeights,\n },\n undefined,\n partBounds,\n )\n\n // 5. Shape → ManifoldMeshData\n return geoToManifoldMesh(result)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engrave.js","sourceRoot":"","sources":["../../src/mesh/engrave.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 雕刻 API\n *\n * 提取来源:engine/components/engraving/EngravingCore.ts\n *\n * 从 executeEngraving 中提取纯几何计算部分:\n * 1. 生成装饰几何(文字或 SVG)\n * 2. 定位到面\n * 3. 布尔运算(凸=union,凹=subtract)\n *\n * 不包含:store 读写、commitGeometry、undo snapshot、toast。\n * 这些由执行器负责(P1 不改变现有执行器行为)。\n */\n\nimport { Vec3 as Vec3C, Quat, Mat4 } from '../math3d'\nimport { transformShape, translateShape } from './meshdata/ops'\nimport { computeBoolean, geoToManifoldMesh, manifoldMeshToGeo } from '../boolean/csg-backend'\nimport { boundingBox } from './query'\nimport { createEngraveDecorationProvider } from '../extra/mesh/engrave-decoration'\nimport type { Shape, EngraveParams, KnurlParams } from './types'\n\n/**\n * Execute an engraving: generate the decoration geometry (text or SVG),\n * position it onto a face, then run a boolean union (convex) or subtract\n * (concave).\n *\n * The decoration geometry itself is produced internally (the text/SVG geometry\n * chain was absorbed into core as `extra/mesh/engrave-decoration`).\n *\n * @param shape - the world-space target shape.\n * @param params - engrave parameters (text/svg, depth, face, mode).\n * @returns the engraved shape in world space.\n */\nexport async function engrave(shape: Shape, params: EngraveParams): Promise<Shape> {\n // 1. 生成装饰几何(局部空间,+Z = 挤出方向)\n if (!params.text && !params.svg) {\n throw new Error('engrave requires either text or svg')\n }\n const provider = createEngraveDecorationProvider()\n let decoration = await provider({\n text: params.text,\n textSize: params.textSize,\n svg: params.svg,\n svgSize: params.svgSize,\n svgNaturalWidth: params.svgNaturalWidth,\n svgNaturalHeight: params.svgNaturalHeight,\n depth: params.depth,\n })\n\n // 2. 定位装饰几何到面\n const faceCenter = new Vec3C(...params.face.center)\n const faceNormal = new Vec3C(...params.face.normal)\n\n // Center geometry at origin\n const bb = boundingBox(decoration)\n const center = new Vec3C(\n (bb.min[0] + bb.max[0]) / 2,\n (bb.min[1] + bb.max[1]) / 2,\n (bb.min[2] + bb.max[2]) / 2,\n )\n decoration = translateShape(decoration, -center.x, -center.y, -center.z)\n\n // Rotate +Z to align with face normal\n const quat = new Quat().setFromUnitVectors(\n new Vec3C(0, 0, 1),\n faceNormal,\n )\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n decoration = transformShape(decoration, rotMatrix)\n\n // Offset along normal (convex = outward, concave = inward)\n const offset = params.mode === 'convex' ? params.depth / 2 : -params.depth / 2\n const pos = faceCenter.clone().add(faceNormal.clone().multiplyScalar(offset))\n decoration = translateShape(decoration, pos.x, pos.y, pos.z)\n\n // 3. 转换为 ManifoldMeshData\n const decorationData = geoToManifoldMesh(decoration)\n\n // 4. 布尔运算\n const op = params.mode === 'convex' ? 'union' : 'subtract'\n const result = await computeBoolean([shape, decorationData], op)\n\n return result\n}\n\n/**\n * Apply a knurling texture displacement to a shape (vertex displacement, not a\n * boolean op). The replay path approximates UI face selection by excluding\n * faces whose normal deviates from the given face normal; the angle limits act\n * as an angular mask.\n *\n * @param shape - the world-space shape to knurl.\n * @param params - knurl parameters (texture height, refine length, UV scale, mapping mode).\n * @returns the displaced shape in world space.\n */\nexport async function knurl(shape: Shape, params: KnurlParams): Promise<Shape> {\n const { applyKnurlDisplacement, KNURL_DEFAULTS } = await import(\n './knurl/KnurlGenerator'\n )\n\n // 1. Shape → Shape (with normals)\n const geo = manifoldMeshToGeo(shape, { computeNormals: true })\n\n // 2. 计算面排除权重:法向与 face.normal 不接近的面标记为排除\n const positions = geo.positions\n const triCount = positions.length / 3\n const faceNormal = new Vec3C(...params.face.normal).normalize()\n\n // 计算每个三角形的法向\n const indices = geo.indices.length > 0 ? geo.indices : null\n const faceWeights = new Float32Array(positions.length)\n\n const v0 = new Vec3C()\n const v1 = new Vec3C()\n const v2 = new Vec3C()\n const edge1 = new Vec3C()\n const edge2 = new Vec3C()\n const triNormal = new Vec3C()\n\n for (let t = 0; t < triCount; t++) {\n const i0 = indices ? indices[t * 3] : t * 3\n const i1 = indices ? indices[t * 3 + 1] : t * 3 + 1\n const i2 = indices ? indices[t * 3 + 2] : t * 3 + 2\n\n v0.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2])\n v1.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2])\n v2.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2])\n\n edge1.subVectors(v1, v0)\n edge2.subVectors(v2, v0)\n triNormal.crossVectors(edge1, edge2).normalize()\n\n // 法向相似度:dot > 0.5 (~60° within) → 不排除\n const dot = triNormal.dot(faceNormal)\n if (dot < 0.5) {\n faceWeights[t * 3] = 1.0\n faceWeights[t * 3 + 1] = 1.0\n faceWeights[t * 3 + 2] = 1.0\n }\n }\n\n // 3. 计算包围盒\n const bb = boundingBox(geo)\n const bbMin = new Vec3C(bb.min[0], bb.min[1], bb.min[2])\n const bbMax = new Vec3C(bb.max[0], bb.max[1], bb.max[2])\n const partBounds = {\n min: bbMin,\n max: bbMax,\n size: new Vec3C().subVectors(bbMax, bbMin),\n center: new Vec3C().addVectors(bbMin, bbMax).multiplyScalar(0.5),\n }\n\n // 4. 调用 applyKnurlDisplacement\n const result = await applyKnurlDisplacement(\n geo,\n {\n ...KNURL_DEFAULTS,\n textureHeight: params.knurlTextureHeight,\n invertDisplacement: params.knurlInvertDisplacement,\n refineLength: params.knurlRefineLength,\n scaleU: params.knurlScaleU,\n scaleV: params.knurlScaleV,\n mappingMode: params.knurlMappingMode,\n faceWeights,\n },\n undefined,\n partBounds,\n )\n\n // 5. Shape → ManifoldMeshData\n return geoToManifoldMesh(result)\n}\n"]}
|
package/dist/mesh/index.d.ts
CHANGED
|
@@ -16,8 +16,6 @@ export type { Shape, BoundingBox, FaceDescriptor, BoxParams, SphereParams, Cylin
|
|
|
16
16
|
export { NRAD_DEFAULT, NRAD_MIN, NRAD_MAX, clampNRad } from './types.js';
|
|
17
17
|
export { isMeshShape } from './types.js';
|
|
18
18
|
export { guessStlUnit } from './stl-unit.js';
|
|
19
|
-
export { setEngraveDecorationProvider, getEngraveDecorationProvider } from './decoration-provider.js';
|
|
20
|
-
export type { EngraveDecorationProvider, EngraveDecorationParams } from './decoration-provider.js';
|
|
21
19
|
export { setManifoldWasmUrl, getManifoldWasmUrl, getManifoldModule } from './manifold-loader.js';
|
|
22
20
|
export { faceAt } from './query.js';
|
|
23
21
|
export { applyKnurlDisplacement, KNURL_DEFAULTS } from './knurl/KnurlGenerator.js';
|
package/dist/mesh/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,KAAK,EAAE,WAAW,EAAE,cAAc,EAClC,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAChE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EACvC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EACtD,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,GAC/D,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,KAAK,EAAE,WAAW,EAAE,cAAc,EAClC,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAChE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EACvC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EACtD,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,GAC/D,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG7F,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAGhC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/E,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvG,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAGnF,YAAY,EACV,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,GAC9D,MAAM,gBAAgB,CAAA"}
|
package/dist/mesh/index.js
CHANGED
|
@@ -16,8 +16,6 @@ export { NRAD_DEFAULT, NRAD_MIN, NRAD_MAX, clampNRad } from './types.js';
|
|
|
16
16
|
export { isMeshShape } from './types.js';
|
|
17
17
|
// ── stl-unit ──
|
|
18
18
|
export { guessStlUnit } from './stl-unit.js';
|
|
19
|
-
// ── decoration-provider ──
|
|
20
|
-
export { setEngraveDecorationProvider, getEngraveDecorationProvider } from './decoration-provider.js';
|
|
21
19
|
// ── manifold-loader ──
|
|
22
20
|
export { setManifoldWasmUrl, getManifoldWasmUrl, getManifoldModule } from './manifold-loader.js';
|
|
23
21
|
// ── query ──
|
package/dist/mesh/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mesh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE7F,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,cAAc;AACd,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAElF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,oBAAoB,EAAwB,MAAM,iBAAiB,CAAA;AACvG,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sBAAsB,CAAA","sourcesContent":["/**\n * mesh — 纯数据几何内核(按模块组织的实现层)\n *\n * See docs/api-contract.md §1 (architecture layers) and §10 (api function catalog).\n *\n * 原则(§5.1):\n * 1. 全部纯数据:输入输出是 Shape (ManifoldMeshData),不碰 THREE 场景、不读 store\n * 2. 不可变:每个 API 返回新几何,不修改输入\n * 3. 同步签名、异步执行:API 签名同步(或 async);worker 边界由 ScriptEngine 处理\n * 4. 坐标系:右手系 +Z 向上、毫米、角度用度\n *\n * ⚠️ B3 补正(2026-10-06):本文件不导出任何聚合对象(`cad` / `meshCad` 已删除)。\n * 要内核实现就从对应模块具名导入。门面层经 `export * from './mesh'` 消费。\n */\n\n// ── types ──\nexport type {\n Shape, BoundingBox, FaceDescriptor,\n BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams,\n TextParams, SvgExtrudeParams, SdfParams,\n DrillParams, ExtrudeParams, EngraveParams, KnurlParams,\n SplitPlane, SplitResult, DovetailSplitParams, TenonSplitParams,\n} from './types'\nexport { NRAD_DEFAULT, NRAD_MIN, NRAD_MAX, clampNRad } from './types'\nexport { isMeshShape } from './types'\n\n// ── stl-unit ──\nexport { guessStlUnit } from './stl-unit'\n\n// ── manifold-loader ──\nexport { setManifoldWasmUrl, getManifoldWasmUrl, getManifoldModule } from './manifold-loader'\n\n// ── query ──\nexport { faceAt } from './query'\n\n// ── knurl ──\nexport { applyKnurlDisplacement, KNURL_DEFAULTS } from './knurl/KnurlGenerator'\nexport type { KnurlBounds } from './knurl/KnurlGenerator'\nexport { subdivide } from './knurl/subdivision'\nexport { loadKnurlingTexture, setKnurlTextureLoader } from './knurl/textureLoader'\nexport type { TextureData } from './knurl/textureLoader'\nexport { QuantizedPointMap, weldVertices } from './knurl/meshIndex'\nexport { computeUV, MODE_TRIPLANAR, getCubicBlendWeights, type MappingSettings } from './knurl/mapping'\nexport { applyDisplacement, type DisplacementSettings } from './knurl/displacement'\n\n// ── import-model ──\nexport type {\n ImportModel, ImportPart, ImportAssemblyNode, ImportBambuViews,\n} from './import-model'\n"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - screw ← engine/primitives/screw/screw.ts (makeScrew)
|
|
7
7
|
*
|
|
8
8
|
* `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随
|
|
9
|
-
* B 组迁到
|
|
9
|
+
* B 组迁到 `core/src/extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再
|
|
10
10
|
* 承载 three 的非基础几何生成链。
|
|
11
11
|
*
|
|
12
12
|
* 所有函数返回 Shape (ManifoldMeshData):parametric GeoData → geoToManifoldMesh 转换。
|
package/dist/mesh/primitives.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - screw ← engine/primitives/screw/screw.ts (makeScrew)
|
|
7
7
|
*
|
|
8
8
|
* `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随
|
|
9
|
-
* B 组迁到
|
|
9
|
+
* B 组迁到 `core/src/extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再
|
|
10
10
|
* 承载 three 的非基础几何生成链。
|
|
11
11
|
*
|
|
12
12
|
* 所有函数返回 Shape (ManifoldMeshData):parametric GeoData → geoToManifoldMesh 转换。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 基本体 API — 从现有纯函数提取的统一接口\n *\n * 提取来源(§5.7):\n * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)\n * - screw ← engine/primitives/screw/screw.ts (makeScrew)\n *\n * `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随\n * B 组迁到 `@faicad/faijs-extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再\n * 承载 three 的非基础几何生成链。\n *\n * 所有函数返回 Shape (ManifoldMeshData):parametric GeoData → geoToManifoldMesh 转换。\n * 坐标系:Z-up、毫米。\n */\n\nimport { Mat4 } from '../math3d'\nimport { boxGeometry, cylinderGeometry, coneGeometry, sphereGeometry, type GeoData } from './meshdata/parametric'\nimport { transformShape, translateShape } from './meshdata/ops'\nimport { geoToManifoldMesh } from '../boolean/csg-backend'\nimport type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, SdfParams } from './types'\nimport { clampNRad } from './types'\n\n// ── 内部工具 ──\n\n/** GeoData → Shape (ManifoldMeshData);可选携带面结构元数据。 */\nfunction geoToShape(geo: GeoData, faceRanges?: Shape['faceRanges']): Shape {\n const shape = geoToManifoldMesh(geo) as Shape\n if (faceRanges !== undefined) shape.faceRanges = faceRanges\n return shape\n}\n\n/** Y-up → Z-up rotation (rotateX by PI/2), same as three's `makeRotationX(Math.PI / 2)`. */\nconst ROT_Y_TO_Z = new Mat4().makeRotationX(Math.PI / 2)\n\n// ── 创建 API ──\n\n/**\n * Create a box solid (brepjs contract, §4.1 A 决策).\n *\n * `box(width, depth, height)` — X=width, Y=depth, Z=height — places the\n * min-corner at the origin by default (`centered:false`). `centered: true`\n * centers the box at the origin; `at` is CENTER semantics and takes precedence\n * over `centered`. The `segments` option is consumed by the tessellation\n * caller (this mesh builder keeps it via clampNRad when present).\n *\n * @param params - box parameters (width/depth/height, optional at/centered/segments).\n * @returns the box shape.\n */\nexport function box(params: BoxParams): Shape {\n const { width, depth, height } = params\n // boxGeometry(width, height, depth) is Y-up (X=width, Y=height, Z=depth);\n // after the +90° rotateX the dims map to X=width, Y=depth, Z=height.\n const geo = boxGeometry(width, height, depth)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // 原 brepjs box semantics: corner at origin by default; centered at origin when\n // `centered` (no `at`); `at` (CENTER semantics) takes precedence.\n const at = params.at\n let tx = 0\n let ty = 0\n let tz = 0\n if (at !== undefined) {\n ;[tx, ty, tz] = at\n } else if (!params.centered) {\n tx = width / 2\n ty = depth / 2\n tz = height / 2\n }\n const translated = tx !== 0 || ty !== 0 || tz !== 0\n ? translateShape(rotated, tx, ty, tz)\n : rotated\n // 面结构(P4 面级):BoxGeometry 12 三角形 = 6 面 × 2,顺序固定\n // (+X, −X, +Y, −Y, +Z, −Z);geoToManifoldMesh 焊接顶点保三角形序,故面序契约成立。\n // 面序号契约(setFaceColor 的 faceIds 即此序号):0=+X, 1=−X, 2=+Y, 3=−Y, 4=+Z, 5=−Z。\n const faceRanges: Shape['faceRanges'] = [\n { start: 0, count: 2 },\n { start: 2, count: 2 },\n { start: 4, count: 2 },\n { start: 6, count: 2 },\n { start: 8, count: 2 },\n { start: 10, count: 2 },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a sphere centered at the origin (or the optional `center`).\n *\n * @param params - sphere parameters (radius, optional segments, optional center).\n * @returns the sphere shape.\n */\nexport function sphere(params: SphereParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = sphereGeometry(params.radius, segs, segs)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n const translated = params.center\n ? translateShape(rotated, params.center[0], params.center[1], params.center[2])\n : rotated\n return geoToShape(translated)\n}\n\n/**\n * Create a cylinder along +Z (`cylinder(radius, height, { at?, centered?,\n * segments? })` brepjs 契约,§4.3 A 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cylinder parameters (radius, height, optional at/centered/segments).\n * @returns the cylinder shape.\n */\nexport function cylinder(params: CylinderParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = cylinderGeometry(params.radius, params.radius, params.height, segs)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平移到 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n const translated = translateShape(rotated, baseX, baseY, baseZ + params.height / 2)\n // 面结构(P4 面级):CylinderGeometry 三角形布局稳定——侧面 2*segs(tri 0..2segs-1)、\n // 顶盖 segs、底盖 segs。面序号契约:0=侧面, 1=顶, 2=底。\n const faceRanges: Shape['faceRanges'] = [\n { start: 0, count: 2 * segs },\n { start: 2 * segs, count: segs },\n { start: 3 * segs, count: segs },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a cone, or a frustum when the top and bottom radii differ\n * (`cone(bottomRadius, topRadius, height, { at?, centered?, segments? })` brepjs\n * 契约,§4.1 P 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cone parameters (radiusBottom, radiusTop, height, optional at/centered/segments).\n * @returns the cone shape.\n */\nexport function cone(params: ConeParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n // radiusTop === 0 → 尖锥(coneGeometry 顶点在顶);其余(含 radiusTop ===\n // radiusBottom 的等径圆柱/圆台)用 cylinderGeometry(radiusTop/bottom 各就各位)。\n let geo: GeoData\n if (params.radiusTop === 0) {\n geo = coneGeometry(Math.max(params.radiusBottom, params.radiusTop), params.height, segs)\n } else {\n geo = cylinderGeometry(params.radiusTop, params.radiusBottom, params.height, segs)\n }\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平坦平移 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n const translated = translateShape(rotated, baseX, baseY, baseZ + params.height / 2)\n // 面结构(P4 面级):radiusTop=0 的 ConeGeometry 只有 2 面——侧面(segs 个\n // 三角扇)+ 底盖(segs 个);radiusTop>0 的圆台 CylinderGeometry 3 面\n // (侧面 2*segs、顶、底,同 cylinder 布局)。面序号契约:0=侧面, 1=底\n // (尖锥);0=侧面, 1=顶, 2=底(圆台)。\n const faceRanges: Shape['faceRanges'] =\n params.radiusTop === 0\n ? [\n { start: 0, count: segs },\n { start: segs, count: segs },\n ]\n : [\n { start: 0, count: 2 * segs },\n { start: 2 * segs, count: segs },\n { start: 3 * segs, count: segs },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a wedge (ramp) solid, fully parameterized and Z-up.\n *\n * @param params - wedge parameters (width, height, angle, length, optional center).\n * @returns the wedge shape.\n */\nexport function wedge(params: WedgeParams): Shape {\n const width = params.width\n const height = params.height\n const angle = params.angle\n const length = params.length\n\n const angleRad = (angle * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n // 顶边塌缩(斜坡已在宽度内到顶)→ 三角棱柱(与 brep wedge 的退化处理一致,\n // 保证 mesh/brep 同参数 bbox 一致;零面积三角形会破坏 manifold)。\n const degenerate = halfTopWidth <= 1e-12\n\n const positions = degenerate\n ? new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, 0, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, 0, height,\n ])\n : new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, halfTopWidth, height,\n -halfExtrude, -halfTopWidth, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, halfTopWidth, height,\n halfExtrude, -halfTopWidth, height,\n ])\n\n const indices = degenerate\n ? new Uint32Array([\n 0, 1, 2, 3, 5, 4,\n 0, 3, 4, 0, 4, 1,\n 0, 2, 5, 0, 5, 3,\n 1, 4, 5, 1, 5, 2,\n ])\n : new Uint32Array([\n 0, 1, 2, 0, 2, 3,\n 4, 6, 5, 4, 7, 6,\n 0, 4, 5, 0, 5, 1,\n 3, 2, 6, 3, 6, 7,\n 0, 3, 7, 0, 7, 4,\n 1, 5, 6, 1, 6, 2,\n ])\n\n const geo: GeoData = { positions, indices }\n\n const translated = params.center\n ? translateShape(geo, params.center[0], params.center[1], params.center[2])\n : geo\n return geoToShape(translated)\n}\n\n/**\n * Create a screw (threaded) geometry.\n *\n * @param params - screw parameters (system, specIdx, thread, length, head, optional pitchCustom and nRad).\n * @returns the screw shape.\n */\nexport async function screw(params: {\n system: 'metric' | 'imperial'\n specIdx: number\n thread: 'coarse' | 'fine' | 'custom' | 'none'\n pitchCustom?: number\n length: number\n head: 'hex' | 'chc' | 'none'\n nRad?: number\n}): Promise<Shape> {\n const { makeScrew } = await import('../primitives/screw/screw')\n const geo = makeScrew({\n system: params.system,\n specIdx: params.specIdx,\n thread: params.thread,\n pitchCustom: params.pitchCustom ?? 0,\n length: params.length,\n head: params.head,\n nRad: clampNRad(params.nRad),\n })\n return geoToShape(geo)\n}\n\n/**\n * Create a mesh from SDF (signed distance field) code, sampling the field with\n * marching cubes.\n *\n * @param params - SDF parameters (code, optional bounds, params, resolution).\n * @returns the sampled shape.\n */\nexport async function sdf(params: SdfParams): Promise<Shape> {\n const { runSdf } = await import('../sdf/sdf-runner')\n const box = params.box ?? [[-10, -10, -10], [10, 10, 10]]\n const bounds: [number, number, number, number, number, number] = [\n box[0][0], box[0][1], box[0][2],\n box[1][0], box[1][1], box[1][2],\n ]\n const mesh = await runSdf(\n params.code,\n params.params ?? {},\n bounds,\n params.resolution ?? 1.0,\n )\n return { positions: mesh.positions, indices: mesh.indices }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/mesh/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mesh 基本体 API — 从现有纯函数提取的统一接口\n *\n * 提取来源(§5.7):\n * - box/sphere/cylinder/cone/wedge ← engine/primitives/mesh-primitives.ts (makePrimitiveGeo)\n * - screw ← engine/primitives/screw/screw.ts (makeScrew)\n *\n * `text` / `svgExtrude`(three 的 Shape / ExtrudeGeometry / SVGLoader 链)已随\n * B 组迁到 `core/src/extra` 的 `mesh/primitives.ts`,core 的 mesh 面不再\n * 承载 three 的非基础几何生成链。\n *\n * 所有函数返回 Shape (ManifoldMeshData):parametric GeoData → geoToManifoldMesh 转换。\n * 坐标系:Z-up、毫米。\n */\n\nimport { Mat4 } from '../math3d'\nimport { boxGeometry, cylinderGeometry, coneGeometry, sphereGeometry, type GeoData } from './meshdata/parametric'\nimport { transformShape, translateShape } from './meshdata/ops'\nimport { geoToManifoldMesh } from '../boolean/csg-backend'\nimport type { Shape, BoxParams, SphereParams, CylinderParams, ConeParams, WedgeParams, SdfParams } from './types'\nimport { clampNRad } from './types'\n\n// ── 内部工具 ──\n\n/** GeoData → Shape (ManifoldMeshData);可选携带面结构元数据。 */\nfunction geoToShape(geo: GeoData, faceRanges?: Shape['faceRanges']): Shape {\n const shape = geoToManifoldMesh(geo) as Shape\n if (faceRanges !== undefined) shape.faceRanges = faceRanges\n return shape\n}\n\n/** Y-up → Z-up rotation (rotateX by PI/2), same as three's `makeRotationX(Math.PI / 2)`. */\nconst ROT_Y_TO_Z = new Mat4().makeRotationX(Math.PI / 2)\n\n// ── 创建 API ──\n\n/**\n * Create a box solid (brepjs contract, §4.1 A 决策).\n *\n * `box(width, depth, height)` — X=width, Y=depth, Z=height — places the\n * min-corner at the origin by default (`centered:false`). `centered: true`\n * centers the box at the origin; `at` is CENTER semantics and takes precedence\n * over `centered`. The `segments` option is consumed by the tessellation\n * caller (this mesh builder keeps it via clampNRad when present).\n *\n * @param params - box parameters (width/depth/height, optional at/centered/segments).\n * @returns the box shape.\n */\nexport function box(params: BoxParams): Shape {\n const { width, depth, height } = params\n // boxGeometry(width, height, depth) is Y-up (X=width, Y=height, Z=depth);\n // after the +90° rotateX the dims map to X=width, Y=depth, Z=height.\n const geo = boxGeometry(width, height, depth)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // 原 brepjs box semantics: corner at origin by default; centered at origin when\n // `centered` (no `at`); `at` (CENTER semantics) takes precedence.\n const at = params.at\n let tx = 0\n let ty = 0\n let tz = 0\n if (at !== undefined) {\n ;[tx, ty, tz] = at\n } else if (!params.centered) {\n tx = width / 2\n ty = depth / 2\n tz = height / 2\n }\n const translated = tx !== 0 || ty !== 0 || tz !== 0\n ? translateShape(rotated, tx, ty, tz)\n : rotated\n // 面结构(P4 面级):BoxGeometry 12 三角形 = 6 面 × 2,顺序固定\n // (+X, −X, +Y, −Y, +Z, −Z);geoToManifoldMesh 焊接顶点保三角形序,故面序契约成立。\n // 面序号契约(setFaceColor 的 faceIds 即此序号):0=+X, 1=−X, 2=+Y, 3=−Y, 4=+Z, 5=−Z。\n const faceRanges: Shape['faceRanges'] = [\n { start: 0, count: 2 },\n { start: 2, count: 2 },\n { start: 4, count: 2 },\n { start: 6, count: 2 },\n { start: 8, count: 2 },\n { start: 10, count: 2 },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a sphere centered at the origin (or the optional `center`).\n *\n * @param params - sphere parameters (radius, optional segments, optional center).\n * @returns the sphere shape.\n */\nexport function sphere(params: SphereParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = sphereGeometry(params.radius, segs, segs)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n const translated = params.center\n ? translateShape(rotated, params.center[0], params.center[1], params.center[2])\n : rotated\n return geoToShape(translated)\n}\n\n/**\n * Create a cylinder along +Z (`cylinder(radius, height, { at?, centered?,\n * segments? })` brepjs 契约,§4.3 A 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cylinder parameters (radius, height, optional at/centered/segments).\n * @returns the cylinder shape.\n */\nexport function cylinder(params: CylinderParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n const geo = cylinderGeometry(params.radius, params.radius, params.height, segs)\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平移到 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n const translated = translateShape(rotated, baseX, baseY, baseZ + params.height / 2)\n // 面结构(P4 面级):CylinderGeometry 三角形布局稳定——侧面 2*segs(tri 0..2segs-1)、\n // 顶盖 segs、底盖 segs。面序号契约:0=侧面, 1=顶, 2=底。\n const faceRanges: Shape['faceRanges'] = [\n { start: 0, count: 2 * segs },\n { start: 2 * segs, count: segs },\n { start: 3 * segs, count: segs },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a cone, or a frustum when the top and bottom radii differ\n * (`cone(bottomRadius, topRadius, height, { at?, centered?, segments? })` brepjs\n * 契约,§4.1 P 决策;与 brep 路径逐点对齐)。\n *\n * 锚点:`at` 是**底面轴心**(BASE)语义(默认 [0,0,0],底面在原点、+Z 延伸);\n * `centered:true` 指底面落到 −h/2(无 at 时居中到原点)——与 `at` 同给时以\n * `at` 为中心。`segments` 经 clampNRad 消费(P0 §5)。\n *\n * @param params - cone parameters (radiusBottom, radiusTop, height, optional at/centered/segments).\n * @returns the cone shape.\n */\nexport function cone(params: ConeParams): Shape {\n const segs = clampNRad(params.nRad ?? params.segments)\n // radiusTop === 0 → 尖锥(coneGeometry 顶点在顶);其余(含 radiusTop ===\n // radiusBottom 的等径圆柱/圆台)用 cylinderGeometry(radiusTop/bottom 各就各位)。\n let geo: GeoData\n if (params.radiusTop === 0) {\n geo = coneGeometry(Math.max(params.radiusBottom, params.radiusTop), params.height, segs)\n } else {\n geo = cylinderGeometry(params.radiusTop, params.radiusBottom, params.height, segs)\n }\n const rotated = transformShape(geo, ROT_Y_TO_Z)\n // geometry(rotateX 后)沿 z ∈ [-h/2, +h/2](three 默认 Y-up 居中):\n // 目标底面中心 in baseZ = (at?.[2] ?? 0) - (centered ? h/2 : 0) → 平坦平移 baseZ + h/2。\n const baseX = params.at?.[0] ?? 0\n const baseY = params.at?.[1] ?? 0\n const baseZ = (params.at?.[2] ?? 0) - (params.centered === true ? params.height / 2 : 0)\n const translated = translateShape(rotated, baseX, baseY, baseZ + params.height / 2)\n // 面结构(P4 面级):radiusTop=0 的 ConeGeometry 只有 2 面——侧面(segs 个\n // 三角扇)+ 底盖(segs 个);radiusTop>0 的圆台 CylinderGeometry 3 面\n // (侧面 2*segs、顶、底,同 cylinder 布局)。面序号契约:0=侧面, 1=底\n // (尖锥);0=侧面, 1=顶, 2=底(圆台)。\n const faceRanges: Shape['faceRanges'] =\n params.radiusTop === 0\n ? [\n { start: 0, count: segs },\n { start: segs, count: segs },\n ]\n : [\n { start: 0, count: 2 * segs },\n { start: 2 * segs, count: segs },\n { start: 3 * segs, count: segs },\n ]\n return geoToShape(translated, faceRanges)\n}\n\n/**\n * Create a wedge (ramp) solid, fully parameterized and Z-up.\n *\n * @param params - wedge parameters (width, height, angle, length, optional center).\n * @returns the wedge shape.\n */\nexport function wedge(params: WedgeParams): Shape {\n const width = params.width\n const height = params.height\n const angle = params.angle\n const length = params.length\n\n const angleRad = (angle * Math.PI) / 180\n const halfExtrude = length / 2\n const hw = width / 2\n const halfTopWidth = Math.max(0, hw - height / Math.tan(angleRad))\n // 顶边塌缩(斜坡已在宽度内到顶)→ 三角棱柱(与 brep wedge 的退化处理一致,\n // 保证 mesh/brep 同参数 bbox 一致;零面积三角形会破坏 manifold)。\n const degenerate = halfTopWidth <= 1e-12\n\n const positions = degenerate\n ? new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, 0, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, 0, height,\n ])\n : new Float32Array([\n -halfExtrude, -hw, 0,\n -halfExtrude, hw, 0,\n -halfExtrude, halfTopWidth, height,\n -halfExtrude, -halfTopWidth, height,\n halfExtrude, -hw, 0,\n halfExtrude, hw, 0,\n halfExtrude, halfTopWidth, height,\n halfExtrude, -halfTopWidth, height,\n ])\n\n const indices = degenerate\n ? new Uint32Array([\n 0, 1, 2, 3, 5, 4,\n 0, 3, 4, 0, 4, 1,\n 0, 2, 5, 0, 5, 3,\n 1, 4, 5, 1, 5, 2,\n ])\n : new Uint32Array([\n 0, 1, 2, 0, 2, 3,\n 4, 6, 5, 4, 7, 6,\n 0, 4, 5, 0, 5, 1,\n 3, 2, 6, 3, 6, 7,\n 0, 3, 7, 0, 7, 4,\n 1, 5, 6, 1, 6, 2,\n ])\n\n const geo: GeoData = { positions, indices }\n\n const translated = params.center\n ? translateShape(geo, params.center[0], params.center[1], params.center[2])\n : geo\n return geoToShape(translated)\n}\n\n/**\n * Create a screw (threaded) geometry.\n *\n * @param params - screw parameters (system, specIdx, thread, length, head, optional pitchCustom and nRad).\n * @returns the screw shape.\n */\nexport async function screw(params: {\n system: 'metric' | 'imperial'\n specIdx: number\n thread: 'coarse' | 'fine' | 'custom' | 'none'\n pitchCustom?: number\n length: number\n head: 'hex' | 'chc' | 'none'\n nRad?: number\n}): Promise<Shape> {\n const { makeScrew } = await import('../primitives/screw/screw')\n const geo = makeScrew({\n system: params.system,\n specIdx: params.specIdx,\n thread: params.thread,\n pitchCustom: params.pitchCustom ?? 0,\n length: params.length,\n head: params.head,\n nRad: clampNRad(params.nRad),\n })\n return geoToShape(geo)\n}\n\n/**\n * Create a mesh from SDF (signed distance field) code, sampling the field with\n * marching cubes.\n *\n * @param params - SDF parameters (code, optional bounds, params, resolution).\n * @returns the sampled shape.\n */\nexport async function sdf(params: SdfParams): Promise<Shape> {\n const { runSdf } = await import('../sdf/sdf-runner')\n const box = params.box ?? [[-10, -10, -10], [10, 10, 10]]\n const bounds: [number, number, number, number, number, number] = [\n box[0][0], box[0][1], box[0][2],\n box[1][0], box[1][1], box[1][2],\n ]\n const mesh = await runSdf(\n params.code,\n params.params ?? {},\n bounds,\n params.resolution ?? 1.0,\n )\n return { positions: mesh.positions, indices: mesh.indices }\n}\n"]}
|
package/dist/node-host/cli.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ export interface CliCheckOptions {
|
|
|
35
35
|
fontsDir?: string;
|
|
36
36
|
/**
|
|
37
37
|
* Extra cad-namespace entries the host merges at run time (`cad.sketch`
|
|
38
|
-
*
|
|
38
|
+
* built into core).
|
|
39
39
|
*
|
|
40
40
|
* I-group (2026-10-03): the unknown-op guard compares the script's callees
|
|
41
41
|
* against `symbolTableNames()`, which knows only the STATIC table. A host
|
|
@@ -57,7 +57,14 @@ export interface CliRunOptions {
|
|
|
57
57
|
fontsDir?: string;
|
|
58
58
|
/** Default font path used by the node ports. */
|
|
59
59
|
defaultFontPath?: string;
|
|
60
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Host-injected library namespaces, forwarded to `createRuntime`.
|
|
62
|
+
*
|
|
63
|
+
* `cad` is engine-built-in and RESERVED: `createRuntime` registers it (the
|
|
64
|
+
* full platform ∪ sketch ∪ editor surface) as the default namespace and
|
|
65
|
+
* rejects `libs.cad` with `E_CAD_RESERVED`. Hosts register only third-party
|
|
66
|
+
* libraries here, under any other name.
|
|
67
|
+
*/
|
|
61
68
|
libs?: Record<string, LibNamespace>;
|
|
62
69
|
/**
|
|
63
70
|
* 项目根(多文件 §4.5):相对 import 的解析基准,moduleKey = 相对它的路径。
|
|
@@ -121,7 +128,7 @@ export interface CliViewOptions {
|
|
|
121
128
|
fontsDir?: string;
|
|
122
129
|
/** Default font path used by the node ports. */
|
|
123
130
|
defaultFontPath?: string;
|
|
124
|
-
/** Host-injected library
|
|
131
|
+
/** Host-injected library namespaces (third-party libs only — `cad` is engine-built-in and reserved). */
|
|
125
132
|
libs?: Record<string, LibNamespace>;
|
|
126
133
|
/** Project root for relative .fai.js imports. */
|
|
127
134
|
projectRoot?: string;
|
|
@@ -256,7 +263,7 @@ export declare function parseArgs(argv: string[]): {
|
|
|
256
263
|
* CLI main entry point (called by scripts/faijs-cli.ts).
|
|
257
264
|
*
|
|
258
265
|
* @param argv - the raw process argument list
|
|
259
|
-
* @param libs - host-injected library
|
|
266
|
+
* @param libs - host-injected library namespaces, forwarded to `cliRun`; `cad` is engine-built-in and reserved, so callers pass third-party libraries only
|
|
260
267
|
* @returns the process exit code (0 on success, non-zero on failure)
|
|
261
268
|
*/
|
|
262
269
|
export declare function cliMain(argv: string[], libs?: Record<string, LibNamespace>): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/node-host/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/node-host/cli.js
CHANGED
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
* --sheet <front,top,right,iso> — (view) 多视图图纸(projectSheet;与 --view 互斥)
|
|
19
19
|
*/
|
|
20
20
|
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
21
|
-
import { createRequire } from 'node:module';
|
|
22
21
|
import { resolve, extname, dirname, join } from 'node:path';
|
|
23
22
|
import { createRuntime } from '../cad-runtime/runtime.js';
|
|
24
23
|
import { createNodePorts } from './index.js';
|
|
25
24
|
import { createFsProjectLoader, findProjectRoot, projectKeyOf } from './fs-project-loader.js';
|
|
25
|
+
import { readLibPackageJson as readLibPackageJsonShared, resolveLibPackageJsonPath, } from './lib-package-json.js';
|
|
26
26
|
import { exportModelSync } from '../brep/export/export-model.js';
|
|
27
27
|
import { exportStepFromSolids } from '../brep/export/step.js';
|
|
28
28
|
import { solidToShape } from '../brep/brep-ops.js';
|
|
@@ -46,6 +46,20 @@ const CLI_SHORT_NAMES = {
|
|
|
46
46
|
'faijs-gears': '@faicad/faijs-gears',
|
|
47
47
|
'faijs-fasteners': '@faicad/faijs-fasteners',
|
|
48
48
|
};
|
|
49
|
+
/**
|
|
50
|
+
* 读库自身的 `package.json`(`faijs.autoLift` + `faijs.lib` + `peerDependencies`)。
|
|
51
|
+
* 包未安装 / JSON 非法 → `undefined`(按未声明处理,回落 runtime 推断式 / 中立)。
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* 读库自身的 `package.json`(`faijs.autoLift` + `faijs.lib` + `peerDependencies`)。
|
|
55
|
+
* 包未安装 / JSON 非法 → `undefined`(按未声明处理,回落 runtime 推断式 / 中立)。
|
|
56
|
+
*
|
|
57
|
+
* 解析与缓存归 `lib-package-json.ts`(唯一归属):那里记着为什么不能用
|
|
58
|
+
* `require.resolve(`${pkg}/package.json`)`(Node 的 exports 门禁会让它恒抛)。
|
|
59
|
+
*/
|
|
60
|
+
function readLibPackageJson(pkg) {
|
|
61
|
+
return readLibPackageJsonShared(pkg);
|
|
62
|
+
}
|
|
49
63
|
/**
|
|
50
64
|
* 读库 package.json 的 `faijs.autoLift` 字段(D3-autoLift 外置,§9.4):
|
|
51
65
|
* 逐库 autoLift 约定从 host 写死改为由各库自身 package.json 声明,loader 此处读取。
|
|
@@ -53,17 +67,27 @@ const CLI_SHORT_NAMES = {
|
|
|
53
67
|
* 声明为布尔 → 直接采用(如 cq-compat 声明 false,因其函数以 faijs Shape 为受众,
|
|
54
68
|
* 被 compat 边界整体提升会破坏内部借面逻辑)。
|
|
55
69
|
*/
|
|
56
|
-
const requireNode = createRequire(import.meta.url);
|
|
57
70
|
function readLibAutoLift(pkg) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
const v = readLibPackageJson(pkg)?.faijs?.autoLift;
|
|
72
|
+
return typeof v === 'boolean' ? v : undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 读库的**库级定位声明**(§3.3 第 1 项):`faijs.lib` 原值 + `peerDependencies`。
|
|
76
|
+
* 这是与 `autoLiftFor` 同源(同一份 package.json)的第二个事实,装配期由
|
|
77
|
+
* `registerLib` → `assertLibDecl` 校验(含 platform 含 occt ⟹ 有 occt-wasm peer)。
|
|
78
|
+
* 只有 scoped 库能进 CLI 白名单,所以非 scoped 一律视为无声明。
|
|
79
|
+
*/
|
|
80
|
+
function readLibMeta(pkg) {
|
|
81
|
+
const pj = readLibPackageJson(pkg);
|
|
82
|
+
if (!pj)
|
|
65
83
|
return undefined;
|
|
66
|
-
}
|
|
84
|
+
const meta = {};
|
|
85
|
+
if (pj.faijs?.lib !== undefined)
|
|
86
|
+
meta.lib = pj.faijs.lib;
|
|
87
|
+
// 读到 package.json 就给出 peer 事实:无 `peerDependencies` → `{}`(明确「没有」),
|
|
88
|
+
// 而不是 `undefined`(「不知道」)——否则磁盘上的缺位会被单向校验放过。
|
|
89
|
+
meta.peers = pj.peerDependencies ?? {};
|
|
90
|
+
return meta;
|
|
67
91
|
}
|
|
68
92
|
/** specifier → scoped 全名归一:scoped 名原样,已登记短名映射,其余原样交 import 解析。 */
|
|
69
93
|
function normalizeCliSpecifier(name) {
|
|
@@ -82,11 +106,21 @@ const cliPortsLibLoader = {
|
|
|
82
106
|
const pkg = normalizeCliSpecifier(name);
|
|
83
107
|
if (!pkg.startsWith(CLI_SCOPED_PREFIX))
|
|
84
108
|
return undefined;
|
|
109
|
+
const pkgJsonPath = resolveLibPackageJsonPath(pkg);
|
|
110
|
+
if (pkgJsonPath === undefined)
|
|
111
|
+
return undefined;
|
|
85
112
|
try {
|
|
86
|
-
const req = createRequire(import.meta.url);
|
|
87
|
-
const pkgJsonPath = req.resolve(`${pkg}/package.json`);
|
|
88
113
|
const pkgDir = dirname(pkgJsonPath);
|
|
89
|
-
|
|
114
|
+
// Probe order is part of the scan contract: the runtime determinism gate
|
|
115
|
+
// scans library source with `strict: true`, which throws on TS syntax
|
|
116
|
+
// ("libraries must ship compiled JS"). Handing it `src/index.ts` while a
|
|
117
|
+
// compiled artifact exists therefore failed every repo whose package dir
|
|
118
|
+
// contains the TS sources — the normal case for a workspace package or a
|
|
119
|
+
// `file:` self-link (the package dir IS the repo root). Ship-first means
|
|
120
|
+
// the scanner sees the artifact that actually runs; a TS-only library
|
|
121
|
+
// (no dist, no JS) still falls through to `src/index.ts` and still trips
|
|
122
|
+
// the strict throw, which is the contract's intent.
|
|
123
|
+
for (const p of [join(pkgDir, 'dist', 'index.js'), join(pkgDir, 'src', 'index.js'), join(pkgDir, 'src', 'index.ts')]) {
|
|
90
124
|
if (existsSync(p))
|
|
91
125
|
return readFileSync(p, 'utf-8');
|
|
92
126
|
}
|
|
@@ -104,6 +138,11 @@ const cliPortsLibLoader = {
|
|
|
104
138
|
return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibAutoLift(pkg) : undefined;
|
|
105
139
|
},
|
|
106
140
|
},
|
|
141
|
+
// 库级定位声明(§3.3 第 1 项):与 autoLiftFor 同源读盘,装配期校验。
|
|
142
|
+
libMetaFor: (name) => {
|
|
143
|
+
const pkg = normalizeCliSpecifier(name);
|
|
144
|
+
return pkg.startsWith(CLI_SCOPED_PREFIX) ? readLibMeta(pkg) : undefined;
|
|
145
|
+
},
|
|
107
146
|
};
|
|
108
147
|
/**
|
|
109
148
|
* 注入 libLoader 到 node ports(CLI 宿主白名单装载)。Exported for executeScript (B6).
|
|
@@ -203,14 +242,6 @@ export async function cliRun(filePath, outPath, opts) {
|
|
|
203
242
|
defaultFontPath: opts?.defaultFontPath,
|
|
204
243
|
})), projectRoot);
|
|
205
244
|
const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs);
|
|
206
|
-
// Part 1.4:cad 经 registerLib 声明 packageName(脚本可 `import * as cad from
|
|
207
|
-
// '@faicad/faijs'`,check ①.5 据此校验 specifier——不 declare 则 import 被拒)。
|
|
208
|
-
if (opts?.libs?.cad) {
|
|
209
|
-
runtime.registerLib('cad', opts.libs.cad, {
|
|
210
|
-
default: true,
|
|
211
|
-
packageName: '@faicad/faijs',
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
245
|
// Execute(T5 后:direct 路径,源码文本直通执行)
|
|
215
246
|
const execResult = await runtime.execute(code, { entryKey });
|
|
216
247
|
if (execResult.failedAt) {
|
|
@@ -517,12 +548,6 @@ export async function cliView(filePath, outPath, opts) {
|
|
|
517
548
|
defaultFontPath: opts?.defaultFontPath,
|
|
518
549
|
})), projectRoot);
|
|
519
550
|
const runtime = createRuntime(ports, opts?.mode ?? 'auto', opts?.libs);
|
|
520
|
-
if (opts?.libs?.cad) {
|
|
521
|
-
runtime.registerLib('cad', opts.libs.cad, {
|
|
522
|
-
default: true,
|
|
523
|
-
packageName: '@faicad/faijs',
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
551
|
const execResult = await runtime.execute(code, { entryKey });
|
|
527
552
|
if (execResult.failedAt) {
|
|
528
553
|
return {
|
|
@@ -764,7 +789,7 @@ export function parseArgs(argv) {
|
|
|
764
789
|
* CLI main entry point (called by scripts/faijs-cli.ts).
|
|
765
790
|
*
|
|
766
791
|
* @param argv - the raw process argument list
|
|
767
|
-
* @param libs - host-injected library
|
|
792
|
+
* @param libs - host-injected library namespaces, forwarded to `cliRun`; `cad` is engine-built-in and reserved, so callers pass third-party libraries only
|
|
768
793
|
* @returns the process exit code (0 on success, non-zero on failure)
|
|
769
794
|
*/
|
|
770
795
|
export async function cliMain(argv, libs) {
|