@faicad/faijs 0.33.1 → 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 +20 -4
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +84 -35
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/sketch/shapes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * shapes — `cad.sketch` 的**语义图元面**(脚本面)。\n *\n * 一条规则:**形状语义只在这里实现一次**。\n * - 正向(求解前):`expandShapes` 语义图元 → canonical 几何 + 形状自带约束;\n * - 反向(交互写回):`shapeHandles` 给出可拖手柄,`dragShapeHandle` 把\"拖到哪\"写回形状\n * 参数,`handleForGeomControl` 负责\"派生几何上的某个控制点 → 哪个手柄\"的翻译。\n * 宿主不认识任何形状数学,只做 tag 查表 + 调这三个函数。\n *\n * 宿主(3d_editor 等)只负责鼠标/吸附/命中这类交互,**禁止再自持一份展开逻辑**:\n * 草稿以 shapes 为真源,派生几何一律由本模块算出来。\n *\n * ── 角度规则的唯一实现:`arcSweep` ────────────────────────────────────────\n * 弧的有符号扫掠跨度这条规则,全仓库只应有一处实现(本模块的 `arcSweep`):\n * core `geometry2d/adapt.ts#profileSegToCurve` 建弧、宿主采样折线、faijs-cadquery\n * 三点弧取点,三处必须同解——否则\"编辑期看到的弧\"与\"内核建的弧\"不是同一条,\n * 仓库里已踩过 `sketch-arc-ccw-gotcha`(CW 短弧被当 CCW 补角长弧,revolve 退化、\n * BRepMesh 挂死)。宿主要算扫角就 import 它,**不要抄**。\n *\n * ── 单位 ──────────────────────────────────────────────────────────────────\n * 长度 mm;**所有角度一律弧度**(与 `canonical.ts` 同一条约定:arc 的 `a0/a1`、\n * `ellipse.angle`、`polygon.angle`、`trapezoid.a1/a2`、约束里的 `angle.value`)。\n * CadQuery 的度制在 `faijs-cadquery` 边界换算,不进入本层。\n *\n * ── tag 规则(唯一一条,两边共用)─────────────────────────────────────────\n * - 画笔图元(line / arc / bspline / point)的 tag **就是它自己那个 geom** 的 tag;\n * - 罐头形状(rect / roundedRect / circle / ellipse / polygon / slot / trapezoid)的\n * tag 是**形状名**,派生 geom 的 tag 为 `<形状名>.0`、`<形状名>.1`……下标顺序固定\n * (见各形状的展开注释,UI 与测试都依赖这个顺序);\n * - 形状没给 tag 时自动分配 `g<N>`(只占一个编号,派生 geom 仍是 `g<N>.k`)。\n * N 取所有既有 `g<N>`(含 `.k` 形式)的最大值 +1,**不复用已删除的编号**——\n * 复用会让\"删了 g2 再画一个\"拿到同一个名字,而旧约束可能还引用着它。\n *\n * ── 模式(mode)────────────────────────────────────────────────────────────\n * - `'a'`(缺省):并入轮廓;\n * - `'s'`:该形状的轮廓**应作为内环(孔)**。孔的身份由轮廓包含关系决定\n * (core `organiseBlueprints` + `addHolesInFace`),本层只记下\"哪些 geom 声明了\n * 内环语义\",供 op 侧校验(`subtractRanges`);\n * - `'c'`:构造几何(= `construction: true`),参与求解但不进轮廓;\n * - `'i'` / `'r'`:第一版**不支持**,显式报 `E_SKETCHC_UNSUPPORTED_MODE`——\n * 面级布尔/按 tag 替换属第二版,绝不做静默降级。\n */\nimport type { Ref, SketchConstraint, SketchGeom } from './canonical.js'\n\n/** 平面内二维点(草图局部坐标,mm)。 */\nexport type Pt2 = [number, number]\n\n/** 形状区域语义(CadQuery 的 a/s/i/c/r)。 */\nexport type SketchMode = 'a' | 's' | 'i' | 'c' | 'r'\n\n/** 形状展开/写回失败。`code` 前缀在 message 里,宿主按既有习惯用正则匹配。 */\nexport class SketchShapeError extends Error {\n constructor(\n /** `E_SKETCHC_*` 错误码。 */\n readonly code: string,\n detail: string,\n ) {\n super(`${code}: ${detail}`)\n this.name = 'SketchShapeError'\n }\n}\n\n/** 所有形状共有字段。 */\nexport interface ShapeBase {\n /** 形状名;罐头形状的派生 geom tag 为 `<tag>.k`。缺省时自动分配 `g<N>`。 */\n tag?: string\n /** 区域语义;缺省 `'a'`。 */\n mode?: SketchMode\n /** 构造几何(等价 `mode:'c'`):参与求解、但不进轮廓。 */\n construction?: boolean\n}\n\n/**\n * 语义图元。罐头形状的 `cx`/`cy` 缺省 0(形状中心),`angle` 是**弧度**。\n *\n * axis 对齐的四个罐头(rect / roundedRect / slot / trapezoid)刻意**没有 angle**:\n * 它们靠 `horizontal`/`vertical` 形状约束保持轴对齐,给个 angle 会让约束与初值互斗\n * (求解器把形状转回去)。要摆角度就把草图放在带朝向的平面上。\n */\nexport type SketchShape =\n | (ShapeBase & { kind: 'rect'; w: number; d: number; cx?: number; cy?: number })\n | (ShapeBase & { kind: 'roundedRect'; w: number; d: number; r: number; cx?: number; cy?: number })\n | (ShapeBase & { kind: 'circle'; r: number; cx?: number; cy?: number })\n | (ShapeBase & { kind: 'ellipse'; rx: number; ry: number; cx?: number; cy?: number; angle?: number })\n | (ShapeBase & { kind: 'polygon'; n: number; r: number; cx?: number; cy?: number; angle?: number })\n | (ShapeBase & { kind: 'slot'; w: number; d: number; cx?: number; cy?: number })\n | (ShapeBase & { kind: 'trapezoid'; w: number; h: number; a1: number; a2?: number; cx?: number; cy?: number })\n | (ShapeBase & { kind: 'line'; from: Pt2; to: Pt2 })\n | (ShapeBase & { kind: 'arc'; cx: number; cy: number; r: number; a0: number; a1: number; ccw?: boolean })\n | (ShapeBase & { kind: 'bspline'; pts: Pt2[]; degree?: number })\n | (ShapeBase & { kind: 'point'; x: number; y: number })\n | { kind: 'close'; ref?: string }\n\n/** 画笔图元的 kind(可串成链、可被 `close` 闭合)。 */\nconst PEN_KINDS = ['line', 'arc', 'bspline'] as const\n\n/** 形状展开后的一份记录(宿主用它把派生 geom 映射回形状)。 */\nexport interface ShapeSpan {\n /** 输入 `shapes` 里的下标。 */\n index: number\n /** 形状 kind(`close` 也在内)。 */\n kind: SketchShape['kind']\n /** 形状名(自动分配时是本层生成的 `g<N>`)。 */\n tag: string\n /** 该形状产出的第一个 geom 在 `geoms` 里的下标。 */\n start: number\n /** 产出的 geom 条数(`close` 已是闭环时是 0)。 */\n count: number\n}\n\n/** `expandShapes` 的产物。 */\nexport interface ExpandedShapes {\n /** 展开后的 canonical 几何。 */\n geoms: SketchGeom[]\n /** **形状自带**的约束(不含调用方自己写的约束)。 */\n constraints: SketchConstraint[]\n /** 每个输入形状一段(与 `shapes` 同序同长)。 */\n spans: ShapeSpan[]\n /** geom 下标 → 产出它的形状下标(与 `spans` 的 `index` 对齐)。 */\n owners: number[]\n /** 声明了内环(`mode:'s'`)语义的形状所产出的 geom 区间,供 op 校验。 */\n subtractRanges: Array<{ index: number; start: number; count: number }>\n /** 展开之后下一个可用的 `g<N>` 编号(供宿主给新形状命名)。 */\n nextTag: number\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// tag 分配\n// ────────────────────────────────────────────────────────────────────────────\n\nconst TAG_RE = /^g(\\d+)(?:\\.\\d+)?$/\n\n/** 从一组 tag 里取出 `g<N>` 的最大编号(不认识的名字返回 0)。 */\nfunction maxTagNumber(tags: Iterable<string | undefined>): number {\n let max = 0\n for (const tag of tags) {\n const m = TAG_RE.exec(tag ?? '')\n if (m) max = Math.max(max, Number(m[1]))\n }\n return max\n}\n\n/**\n * 给一个新形状分配名字:`g<N>`,N = 既有最大编号 + 1(不复用已删除的编号)。\n *\n * @param shapes - 当前草稿里的全部形状(含 auto 分配过的名字)。\n * @returns 未被占用的 `g<N>`。\n */\nexport function nextShapeTag(shapes: readonly SketchShape[]): string {\n const used = new Set<string>()\n for (const s of shapes) {\n if ('tag' in s && s.tag !== undefined) used.add(s.tag)\n }\n let next = maxTagNumber(used) + 1\n while (used.has(`g${next}`)) next++\n return `g${next}`\n}\n\n/** 罐头形状的派生 geom tag:`<形状名>.<下标>`。 */\nfunction derivedTag(shapeTag: string, index: number): string {\n return `${shapeTag}.${index}`\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// 形状轮廓数学(罐头形状的唯一实现;faijs-cadquery 也调这里,不许再抄一份)\n// ────────────────────────────────────────────────────────────────────────────\n\n/** 把局部坐标点平移到形状中心。 */\nfunction place(p: Pt2, cx: number, cy: number): Pt2 {\n return [p[0] + cx, p[1] + cy]\n}\n\n/**\n * 矩形的四个角点(局部 + 中心平移后),顺序 `bottom-left → bottom-right →\n * top-right → top-left`(与 3d_editor 既有矩形命令的边顺序一致)。\n *\n * @param w - 宽(沿 +X)。\n * @param d - 高(沿 +Y)。\n * @param cx - 中心 x(缺省 0)。\n * @param cy - 中心 y(缺省 0)。\n * @returns 四个角点。\n */\nexport function rectCorners(w: number, d: number, cx = 0, cy = 0): [Pt2, Pt2, Pt2, Pt2] {\n return [\n place([-w / 2, -d / 2], cx, cy),\n place([w / 2, -d / 2], cx, cy),\n place([w / 2, d / 2], cx, cy),\n place([-w / 2, d / 2], cx, cy),\n ]\n}\n\n/**\n * 正多边形顶点。**第一个顶点在 `angle` 方向**,随后逆时针均匀分布。\n *\n * 宿主约定由调用方给:`expandShapes` 用 (angle, ccw=true);CadQuery 的\n * `regularPolygon` 是\"首顶点在 +Y、顺时针\",它自己传 `(π/2, false)`——\n * 公式只在这里写一次,约定由调用方显式声明。\n *\n * @param r - 外接圆半径。\n * @param n - 边数(≥3)。\n * @param angle - 首顶点极角(弧度)。\n * @param ccw - 是否逆时针排列(缺省 true)。\n * @returns n 个顶点(不重复首点)。\n */\nexport function regularPolygonVertices(r: number, n: number, angle = 0, ccw = true): Pt2[] {\n const out: Pt2[] = []\n const dir = ccw ? 1 : -1\n for (let i = 0; i < n; i++) {\n const a = angle + (dir * i * 2 * Math.PI) / n\n out.push([r * Math.cos(a), r * Math.sin(a)])\n }\n return out\n}\n\n/**\n * 长圆槽(stadium):两条直边在 `y = ±d/2` 上、沿 X 跨 `w`,两端各一个半径\n * `d/2` 的半圆,圆心在 `(±w/2, 0)`。**总长 = w + d,总高 = d**(CadQuery\n * `Sketch.slot(w, h)` 的语义,`d` 即它的 `h`)。\n *\n * @param w - 直边长度(两圆心距)。\n * @param d - 槽宽(= 端部半圆直径)。\n * @param cx - 中心 x。\n * @param cy - 中心 y。\n * @returns 两条直边(左→右 的底边、右→左 的顶边)与两个半圆(圆心、半径、起止角)。\n */\nexport function slotOutline(\n w: number,\n d: number,\n cx = 0,\n cy = 0,\n): {\n bottom: [Pt2, Pt2]\n top: [Pt2, Pt2]\n rightArc: { c: Pt2; r: number; a0: number; a1: number }\n leftArc: { c: Pt2; r: number; a0: number; a1: number }\n} {\n const r = d / 2\n return {\n bottom: [place([-w / 2, -r], cx, cy), place([w / 2, -r], cx, cy)],\n top: [place([w / 2, r], cx, cy), place([-w / 2, r], cx, cy)],\n // 右端:-90° → 90°(逆时针,经过 +X 侧的最远点 (w/2 + r, 0))\n rightArc: { c: place([w / 2, 0], cx, cy), r, a0: -Math.PI / 2, a1: Math.PI / 2 },\n // 左端:90° → 270°(逆时针,经过 -X 侧)\n leftArc: { c: place([-w / 2, 0], cx, cy), r, a0: Math.PI / 2, a1: (3 * Math.PI) / 2 },\n }\n}\n\n/**\n * 梯形四角(底边在下、居中):底宽 `w`、高 `h`,左右底角 `a1`/`a2`(**弧度**)。\n *\n * 与 CadQuery `Sketch.trapezoid(w, h, a1, a2)` 同几何(它在边界把度换成弧度):\n * 顶点按 `bottom-left → bottom-right → top-right → top-left` 排列(逆时针)。\n *\n * @param w - 底宽。\n * @param h - 高。\n * @param a1 - 左下底角(弧度)。\n * @param a2 - 右下底角(弧度)。\n * @param cx - 中心 x。\n * @param cy - 中心 y。\n * @returns 四个角点。\n */\nexport function trapezoidCorners(\n w: number,\n h: number,\n a1: number,\n a2: number,\n cx = 0,\n cy = 0,\n): [Pt2, Pt2, Pt2, Pt2] {\n const t1 = h / Math.tan(a1)\n const t2 = h / Math.tan(a2)\n return [\n place([-w / 2, -h / 2], cx, cy),\n place([w / 2, -h / 2], cx, cy),\n place([w / 2 - t2, h / 2], cx, cy),\n place([-w / 2 + t1, h / 2], cx, cy),\n ]\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// 参数校验\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction badParam(detail: string): never {\n throw new SketchShapeError('E_SKETCHC_SHAPE_BAD_PARAM', detail)\n}\n\nfunction positive(value: number, what: string): number {\n if (!Number.isFinite(value) || value <= 0) badParam(`${what} must be a positive number, got ${value}`)\n return value\n}\n\n/**\n * 形状是否声明了\"区域语义\"(能当孔)。单条 line/arc/bspline/point 不构成区域:\n * 它们的孔身份(如果有)由闭合链的轮廓包含关系决定,不由形状本身声明。\n */\nfunction regionSemantics(shape: SketchShape): boolean {\n return shape.kind !== 'line' && shape.kind !== 'arc' && shape.kind !== 'bspline'\n && shape.kind !== 'point' && shape.kind !== 'close'\n}\n\n/** 校验 mode/construction 组合,返回该形状是否为构造几何。 */\nfunction resolveFlags(shape: SketchShape): { construction: boolean; mode: SketchMode } {\n const mode = ('mode' in shape ? shape.mode : undefined) ?? 'a'\n if (mode === 'i' || mode === 'r') {\n throw new SketchShapeError(\n 'E_SKETCHC_UNSUPPORTED_MODE',\n `mode \"${mode}\" on ${shape.kind} is not supported in this version (add/subtract/construction only)`,\n )\n }\n if (mode === 's' && !regionSemantics(shape)) {\n throw new SketchShapeError(\n 'E_SKETCHC_SHAPE_MODE_NOT_APPLICABLE',\n `${shape.kind} is a single edge, not a region — \"subtract\" cannot apply ` +\n '(a closed pen chain becomes a hole by contour containment instead)',\n )\n }\n const construction = ('construction' in shape && shape.construction === true) || mode === 'c'\n return { construction, mode }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// 展开:语义图元 → canonical 几何 + 形状自带约束\n// ────────────────────────────────────────────────────────────────────────────\n\n/** 展开一个罐头形状的几何与约束(tag 已分配;`construction` 已打上)。 */\ninterface ShapeExpansion {\n geoms: SketchGeom[]\n constraints: SketchConstraint[]\n}\n\nfunction line(a: Pt2, b: Pt2, tag: string, construction: boolean | undefined): SketchGeom {\n return {\n tag, kind: 'line', x1: a[0], y1: a[1], x2: b[0], y2: b[1],\n ...(construction ? { construction: true } : {}),\n }\n}\n\n/** 闭合多边形(若干 line 首尾相接)→ n 条线 + n 个角重合 + (n-1) 条等长。 */\nfunction closedPolylineGeoms(\n corners: Pt2[],\n tags: string[],\n construction: boolean | undefined,\n): ShapeExpansion {\n const geoms = corners.map((p, i) => line(p, corners[(i + 1) % corners.length]!, tags[i]!, construction))\n const constraints: SketchConstraint[] = corners.map((_, i) => ({\n kind: 'coincident',\n a: { tag: tags[i]!, at: 'end' },\n b: { tag: tags[(i + 1) % corners.length]!, at: 'start' },\n }))\n for (let i = 1; i < corners.length; i++) {\n constraints.push({ kind: 'equal', a: { tag: tags[0]! }, b: { tag: tags[i]! } })\n }\n return { geoms, constraints }\n}\n\n/**\n * 展开一个形状。\n *\n * @param shape - 语义图元。\n * @param tags - 该形状可用的 tag(罐头形状多个、画笔图元一个)。\n * @param construction - 是否打构造标记(由 `resolveFlags` 统一裁定)。\n * @returns 几何与形状自带约束。\n */\nfunction expandOne(shape: SketchShape, tags: string[], construction: boolean | undefined): ShapeExpansion {\n const cxOf = (s: { cx?: number }): number => s.cx ?? 0\n const cyOf = (s: { cy?: number }): number => s.cy ?? 0\n\n switch (shape.kind) {\n case 'rect': {\n positive(shape.w, 'rect.w')\n positive(shape.d, 'rect.d')\n const c = rectCorners(shape.w, shape.d, cxOf(shape), cyOf(shape))\n const { geoms, constraints } = closedPolylineGeoms(c, tags, construction)\n // 形状约束按 3d_editor 既有矩形命令的**同一顺序**:底/顶水平、右/左垂直。\n constraints.splice(4, 4,\n { kind: 'horizontal', of: { tag: tags[0]! } }, // 底\n { kind: 'horizontal', of: { tag: tags[2]! } }, // 顶\n { kind: 'vertical', of: { tag: tags[1]! } }, // 右\n { kind: 'vertical', of: { tag: tags[3]! } }, // 左\n )\n return { geoms, constraints }\n }\n case 'roundedRect': {\n positive(shape.w, 'roundedRect.w')\n positive(shape.d, 'roundedRect.d')\n positive(shape.r, 'roundedRect.r')\n if (shape.r * 2 > Math.min(shape.w, shape.d)) {\n badParam(`roundedRect.r=${shape.r} does not fit in ${shape.w}x${shape.d}`)\n }\n const cx = cxOf(shape)\n const cy = cyOf(shape)\n const { w, d, r } = shape\n const hw = w / 2\n const hd = d / 2\n // 顺序:底边、右下弧、右边、右上弧、顶边、左上弧、左边、左下弧。\n const geoms: SketchGeom[] = [\n line(place([-hw + r, -hd], cx, cy), place([hw - r, -hd], cx, cy), tags[0]!, construction),\n {\n tag: tags[1]!, kind: 'arc', cx: cx + hw - r, cy: cy - hd + r, r,\n a0: -Math.PI / 2, a1: 0, ccw: true, ...(construction ? { construction: true } : {}),\n },\n line(place([hw, -hd + r], cx, cy), place([hw, hd - r], cx, cy), tags[2]!, construction),\n {\n tag: tags[3]!, kind: 'arc', cx: cx + hw - r, cy: cy + hd - r, r,\n a0: 0, a1: Math.PI / 2, ccw: true, ...(construction ? { construction: true } : {}),\n },\n line(place([hw - r, hd], cx, cy), place([-hw + r, hd], cx, cy), tags[4]!, construction),\n {\n tag: tags[5]!, kind: 'arc', cx: cx - hw + r, cy: cy + hd - r, r,\n a0: Math.PI / 2, a1: Math.PI, ccw: true, ...(construction ? { construction: true } : {}),\n },\n line(place([-hw, hd - r], cx, cy), place([-hw, -hd + r], cx, cy), tags[6]!, construction),\n {\n tag: tags[7]!, kind: 'arc', cx: cx - hw + r, cy: cy - hd + r, r,\n a0: Math.PI, a1: (3 * Math.PI) / 2, ccw: true, ...(construction ? { construction: true } : {}),\n },\n ]\n const constraints: SketchConstraint[] = []\n for (let i = 0; i < geoms.length; i++) {\n constraints.push({\n kind: 'coincident',\n a: { tag: tags[i]!, at: 'end' },\n b: { tag: tags[(i + 1) % geoms.length]!, at: 'start' },\n })\n }\n constraints.push({ kind: 'horizontal', of: { tag: tags[0]! } })\n constraints.push({ kind: 'horizontal', of: { tag: tags[4]! } })\n constraints.push({ kind: 'vertical', of: { tag: tags[2]! } })\n constraints.push({ kind: 'vertical', of: { tag: tags[6]! } })\n // 圆角半径:同 slot 的缺口说明——弧上的 radius 约束当前不生效(后端无 arc_rules),\n // 圆角半径靠形状参数(初值)+ UI 写回把守。\n for (const t of [tags[1]!, tags[3]!, tags[5]!, tags[7]!]) {\n constraints.push({ kind: 'radius', of: { tag: t }, value: r })\n }\n return { geoms, constraints }\n }\n case 'circle': {\n positive(shape.r, 'circle.r')\n return {\n geoms: [{\n tag: tags[0]!, kind: 'circle', cx: cxOf(shape), cy: cyOf(shape), r: shape.r,\n ...(construction ? { construction: true } : {}),\n }],\n constraints: [],\n }\n }\n case 'ellipse': {\n positive(shape.rx, 'ellipse.rx')\n positive(shape.ry, 'ellipse.ry')\n const angle = shape.angle ?? 0\n return {\n geoms: [{\n tag: tags[0]!, kind: 'ellipse', cx: cxOf(shape), cy: cyOf(shape),\n rx: shape.rx, ry: shape.ry, ...(angle !== 0 ? { angle } : {}),\n ...(construction ? { construction: true } : {}),\n }],\n constraints: [],\n }\n }\n case 'polygon': {\n if (!Number.isInteger(shape.n) || shape.n < 3) badParam(`polygon.n must be an integer ≥ 3, got ${shape.n}`)\n positive(shape.r, 'polygon.r')\n const cx = cxOf(shape)\n const cy = cyOf(shape)\n const verts = regularPolygonVertices(shape.r, shape.n, shape.angle ?? 0)\n .map((p) => place(p, cx, cy))\n return closedPolylineGeoms(verts, tags, construction)\n }\n case 'slot': {\n positive(shape.w, 'slot.w')\n positive(shape.d, 'slot.d')\n const o = slotOutline(shape.w, shape.d, cxOf(shape), cyOf(shape))\n const geoms: SketchGeom[] = [\n line(o.bottom[0], o.bottom[1], tags[0]!, construction),\n {\n tag: tags[1]!, kind: 'arc', cx: o.rightArc.c[0], cy: o.rightArc.c[1], r: o.rightArc.r,\n a0: o.rightArc.a0, a1: o.rightArc.a1, ccw: true, ...(construction ? { construction: true } : {}),\n },\n line(o.top[0], o.top[1], tags[2]!, construction),\n {\n tag: tags[3]!, kind: 'arc', cx: o.leftArc.c[0], cy: o.leftArc.c[1], r: o.leftArc.r,\n a0: o.leftArc.a0, a1: o.leftArc.a1, ccw: true, ...(construction ? { construction: true } : {}),\n },\n ]\n const constraints: SketchConstraint[] = []\n for (let i = 0; i < 4; i++) {\n constraints.push({\n kind: 'coincident',\n a: { tag: tags[i]!, at: 'end' },\n b: { tag: tags[(i + 1) % 4]!, at: 'start' },\n })\n }\n constraints.push({ kind: 'horizontal', of: { tag: tags[0]! } })\n constraints.push({ kind: 'horizontal', of: { tag: tags[2]! } })\n // ⚠️ 缺口(2026-10-03 实测):**圆弧上的 `radius` 约束在 faijs 的 planegcs 后端\n // 里当前无效**——后端没 push `arc_rules`,弧的 radius/角度是只写参数,而回读\n // 半径是按 |start − centre| 算的(见 planegcs-backend.ts 的 GOTCHA、\n // shapes-solve.test.ts 的\"缺口登记\")。这两条照样发出:后端一补 arc_rules 就\n // 立刻生效;在此之前 slot 的端半径由**形状参数(初值)+ UI 写回**把守——求解\n // 不会主动破坏它,但别的约束把它推歪时也拉不回来(唯一实测过的修法会让\n // slot + 调用方约束被 GCS 误判成 conflicting,所以先不修)。\n constraints.push({ kind: 'radius', of: { tag: tags[1]! }, value: shape.d / 2 })\n constraints.push({ kind: 'radius', of: { tag: tags[3]! }, value: shape.d / 2 })\n return { geoms, constraints }\n }\n case 'trapezoid': {\n positive(shape.w, 'trapezoid.w')\n positive(shape.h, 'trapezoid.h')\n const a2 = shape.a2 ?? shape.a1\n for (const [name, a] of [['a1', shape.a1], ['a2', a2]] as const) {\n if (!Number.isFinite(a) || a <= 0 || a >= Math.PI) {\n badParam(`trapezoid.${name} must be in (0, π) radians, got ${a}`)\n }\n }\n const c = trapezoidCorners(shape.w, shape.h, shape.a1, a2, cxOf(shape), cyOf(shape))\n const geoms = c.map((p, i) => line(p, c[(i + 1) % 4]!, tags[i]!, construction))\n const constraints: SketchConstraint[] = []\n for (let i = 0; i < 4; i++) {\n constraints.push({\n kind: 'coincident',\n a: { tag: tags[i]!, at: 'end' },\n b: { tag: tags[(i + 1) % 4]!, at: 'start' },\n })\n }\n constraints.push({ kind: 'horizontal', of: { tag: tags[0]! } })\n // 两个底角:planegcs 的 l2l_angle_pppp 值是 **dir(b) − dir(a) 的有向差**\n // (实测,见 shapes-solve.test.ts 的探针;不是\"两线夹角取锐角\"),所以每个角\n // 都要用 `at` 把两条线的方向挑出来,值正好等于内角:\n // 左下角 a1:底边正向(+X) → 左腰向上(几何按 tl→bl 存,取 at:'end' 反向)\n // 右下角 a2:右腰向上(几何按 br→tr 存,正向即是向上)→ 底边反向(−X)\n constraints.push({ kind: 'angle', a: { tag: tags[0]!, at: 'start' }, b: { tag: tags[3]!, at: 'end' }, value: shape.a1 })\n constraints.push({ kind: 'angle', a: { tag: tags[1]!, at: 'start' }, b: { tag: tags[0]!, at: 'end' }, value: a2 })\n return { geoms, constraints }\n }\n case 'line':\n return {\n geoms: [line(shape.from, shape.to, tags[0]!, construction)],\n constraints: [],\n }\n case 'arc': {\n positive(shape.r, 'arc.r')\n return {\n geoms: [{\n tag: tags[0]!, kind: 'arc', cx: shape.cx, cy: shape.cy, r: shape.r,\n a0: shape.a0, a1: shape.a1, ...(shape.ccw !== undefined ? { ccw: shape.ccw } : {}),\n ...(construction ? { construction: true } : {}),\n }],\n constraints: [],\n }\n }\n case 'bspline': {\n if (shape.pts.length < 2) badParam(`bspline needs at least 2 poles, got ${shape.pts.length}`)\n const degree = shape.degree ?? Math.min(3, shape.pts.length - 1)\n if (!Number.isInteger(degree) || degree < 1 || degree >= shape.pts.length) {\n badParam(`bspline.degree must be an integer in 1..${shape.pts.length - 1}, got ${shape.degree}`)\n }\n return {\n geoms: [{\n tag: tags[0]!, kind: 'bspline',\n poles: shape.pts.map(([x, y]) => ({ x, y })),\n knots: clampedUniformKnots(shape.pts.length, degree),\n degree,\n ...(construction ? { construction: true } : {}),\n }],\n constraints: [],\n }\n }\n case 'point':\n return {\n geoms: [{\n tag: tags[0]!, kind: 'point', x: shape.x, y: shape.y,\n ...(construction ? { construction: true } : {}),\n }],\n constraints: [],\n }\n case 'close':\n // close 由 expandShapes 单独处理(它需要链上其它形状的几何)。\n throw new SketchShapeError('E_SKETCHC_CLOSE_NO_CHAIN', 'close is handled by expandShapes, not expandOne')\n }\n}\n\n/**\n * 钳位均匀节点向量:两端各重复 `degree+1` 次(clamped),内部节点均匀。\n *\n * `pts` 是**控制点**(不是插值点)——canonical 的 bspline 存的就是 poles/knots/degree,\n * 本层负责把一个\"可手写的点列\"变成合法的样条载荷。\n *\n * @param poleCount - 控制点个数。\n * @param degree - 次数。\n * @returns 长度 `poleCount + degree + 1` 的节点向量。\n */\nexport function clampedUniformKnots(poleCount: number, degree: number): number[] {\n const inner = poleCount - degree - 1\n const knots: number[] = []\n for (let i = 0; i <= degree; i++) knots.push(0)\n for (let i = 1; i <= inner; i++) knots.push(i / (inner + 1))\n for (let i = 0; i <= degree; i++) knots.push(1)\n return knots\n}\n\n/** 某形状会产出多少条 geom(罐头形状固定、画笔图元 1)。 */\nfunction geomCountOfShape(shape: SketchShape): number {\n switch (shape.kind) {\n case 'rect': return 4\n case 'roundedRect': return 8\n case 'polygon': return shape.n\n case 'slot': return 4\n case 'trapezoid': return 4\n case 'close': return 0\n default: return 1\n }\n}\n\n/** 链上的起点(画笔形状的“入口”点)。 */\nfunction penStart(geom: SketchGeom): Pt2 | undefined {\n switch (geom.kind) {\n case 'line': return [geom.x1, geom.y1]\n case 'arc': return [geom.cx + geom.r * Math.cos(geom.a0), geom.cy + geom.r * Math.sin(geom.a0)]\n case 'bspline': {\n const p = geom.poles[0]\n return p ? [p.x, p.y] : undefined\n }\n default: return undefined\n }\n}\n\n/** 链上的终点(画笔形状的“出口”点)。 */\nfunction penEnd(geom: SketchGeom): Pt2 | undefined {\n switch (geom.kind) {\n case 'line': return [geom.x2, geom.y2]\n case 'arc': return [geom.cx + geom.r * Math.cos(geom.a1), geom.cy + geom.r * Math.sin(geom.a1)]\n case 'bspline': {\n const p = geom.poles[geom.poles.length - 1]\n return p ? [p.x, p.y] : undefined\n }\n default: return undefined\n }\n}\n\n/** `close` 判定\"已经闭合\"的容差(mm,与 contour.ts 的 JOIN_TOL 同量级)。 */\nconst CLOSE_TOL = 1e-7\n\n/**\n * 展开语义图元清单。\n *\n * 正向规则见文件头。`close` 会把它前面那一段**连续的画笔形状**(line/arc/bspline)\n * 收口:链尾到链首补一条直线;链首尾本来就重合(≤1e-7)时不补。链不存在、\n * 或 `ref` 指向的不是链上的画笔形状,都显式报错。\n *\n * @param shapes - 语义图元清单(顺序即链序)。\n * @returns 展开结果(几何、形状自带约束、tag 映射、内环区间、下一个可用编号)。\n * @throws SketchShapeError 参数非法 / 模式不支持 / close 无链。\n */\nexport function expandShapes(shapes: readonly SketchShape[]): ExpandedShapes {\n // Pass A:把显式命名的 tag 全部登记,并算出自动编号的起点(与形状顺序无关,\n // 否则「后面的 g100」会让前面的自动编号撞车)。\n const usedTags = new Set<string>()\n for (const s of shapes) {\n const tag = 'tag' in s ? s.tag : undefined\n if (tag === undefined) continue\n usedTags.add(tag)\n if (s.kind === 'close') continue\n for (let i = 0; i < geomCountOfShape(s); i++) usedTags.add(derivedTag(tag, i))\n }\n let nextNumber = maxTagNumber(usedTags) + 1\n const allocNumber = (): string => {\n while (usedTags.has(`g${nextNumber}`)) nextNumber++\n const tag = `g${nextNumber}`\n usedTags.add(tag)\n return tag\n }\n\n const geoms: SketchGeom[] = []\n const constraints: SketchConstraint[] = []\n const spans: ShapeSpan[] = []\n const owners: number[] = []\n const subtractRanges: ExpandedShapes['subtractRanges'] = []\n /** 画笔形状在 `spans` 里的下标(链式 close 用)。 */\n const penSpans: number[] = []\n /** 每个 span 产出的几何(close 复核链首尾用)。 */\n const spanGeoms: SketchGeom[][] = []\n\n for (let index = 0; index < shapes.length; index++) {\n const shape = shapes[index]!\n const start = geoms.length\n\n if (shape.kind !== 'close') {\n const { mode, construction } = resolveFlags(shape)\n const explicitTag = 'tag' in shape ? shape.tag : undefined\n const shapeTag = explicitTag ?? allocNumber()\n const count = geomCountOfShape(shape)\n const tags: string[] =\n shape.kind === 'line' || shape.kind === 'arc' || shape.kind === 'bspline' || shape.kind === 'point'\n ? [shapeTag]\n : Array.from({ length: count }, (_, i) => derivedTag(shapeTag, i))\n for (const t of tags) usedTags.add(t)\n const expanded = expandOne(shape, tags, construction ? true : undefined)\n for (const g of expanded.geoms) {\n geoms.push(g)\n owners.push(index)\n }\n constraints.push(...expanded.constraints)\n spans.push({ index, kind: shape.kind, tag: shapeTag, start, count: expanded.geoms.length })\n spanGeoms.push(expanded.geoms)\n if ((PEN_KINDS as readonly string[]).includes(shape.kind)) penSpans.push(index)\n if (mode === 's') {\n subtractRanges.push({ index, start, count: expanded.geoms.length })\n }\n continue\n }\n\n // ── close:把链收口 ──\n // 链 = **紧邻 close 之前**的一段连续画笔形状(line/arc/bspline);`ref` 只决定\n // **收口目标点**(缺省 = 链首起点),不改变链本身——与\"闭合到该 tag 起点\"一致。\n // 链与 close 之间隔着非画笔形状(罐头形状/点)即视为无链:让\"哪条链被闭合\"\n // 由语句顺序唯一决定,而不是靠猜。\n let targetSpan = -1\n if (shape.ref !== undefined) {\n const at = spans.findIndex((s) => s.tag === shape.ref)\n const refKind = at >= 0 ? spans[at]!.kind : undefined\n if (refKind === undefined || !(PEN_KINDS as readonly string[]).includes(refKind)) {\n throw new SketchShapeError(\n 'E_SKETCHC_CLOSE_BAD_REF',\n `close.ref \"${shape.ref}\" does not name a pen shape (line/arc/bspline) in this sketch`,\n )\n }\n targetSpan = at\n }\n const lastPenSpan = penSpans[penSpans.length - 1]\n if (lastPenSpan === undefined || lastPenSpan !== index - 1) {\n throw new SketchShapeError(\n 'E_SKETCHC_CLOSE_NO_CHAIN',\n 'close must directly follow the pen chain it closes (line/arc/bspline),' +\n '或先用 ref 指明要闭合到哪个形状',\n )\n }\n const chainMemberSpans: number[] = []\n for (let i = penSpans.length - 1; i >= 0; i--) {\n const spanIndex = penSpans[i]!\n const prev = chainMemberSpans[0]\n if (prev === undefined || spanIndex === prev - 1) chainMemberSpans.unshift(spanIndex)\n else break\n }\n if (chainMemberSpans.length === 0) {\n throw new SketchShapeError(\n 'E_SKETCHC_CLOSE_NO_CHAIN',\n 'close found no pen chain to close (画一条线/弧之后再闭合,或去掉这条 close)',\n )\n }\n if (targetSpan < 0) {\n targetSpan = chainMemberSpans[0]!\n } else if (!chainMemberSpans.includes(targetSpan)) {\n throw new SketchShapeError(\n 'E_SKETCHC_CLOSE_BAD_REF',\n `close.ref \"${shape.ref}\" is not part of the pen chain immediately before this close`,\n )\n }\n\n const lastGeooms = spanGeoms[chainMemberSpans[chainMemberSpans.length - 1]!]!\n const lastGeom = lastGeooms[lastGeooms.length - 1]!\n const targetGeoms = spanGeoms[targetSpan]!\n const from = penEnd(lastGeom)\n const to = penStart(targetGeoms[0]!)\n if (from === undefined || to === undefined) {\n throw new SketchShapeError(\n 'E_SKETCHC_CLOSE_NO_CHAIN',\n `close cannot read the chain ends (${lastGeom.kind} → ${targetGeoms[0]!.kind})`,\n )\n }\n let emitted = 0\n let emittedTag = ''\n if (Math.hypot(from[0] - to[0], from[1] - to[1]) > CLOSE_TOL) {\n emittedTag = allocNumber()\n geoms.push(line(from, to, emittedTag, undefined))\n owners.push(index)\n emitted = 1\n }\n spans.push({ index, kind: 'close', tag: emittedTag, start, count: emitted })\n spanGeoms.push([])\n }\n\n // nextTag = 第一个仍然空闲的编号(自动分配可能已经吃掉若干编号)。\n let freeNumber = nextNumber\n while (usedTags.has(`g${freeNumber}`)) freeNumber++\n return { geoms, constraints, spans, owners, subtractRanges, nextTag: freeNumber }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// 反向:拖拽手柄 → 形状参数(交互写回)\n// ────────────────────────────────────────────────────────────────────────────\n\n/** 手柄语义(渲染与拖拽共用同一份定义,宿主不许再算一套)。 */\nexport type ShapeHandleKind = 'corner' | 'edge' | 'center' | 'radius' | 'start' | 'end' | 'mid' | 'vertex'\n\n/** 一个可拖拽手柄:位置 + 语义(拖它意味着改什么)。 */\nexport interface ShapeHandle {\n point: Pt2\n kind: ShapeHandleKind\n}\n\n/** 这个形状/手柄在本版本拖不动 → 显式报错(宁可拖不动,也不静默变形)。 */\nfunction editUnsupported(shape: SketchShape, what: string): never {\n throw new SketchShapeError(\n 'E_SKETCHC_SHAPE_EDIT_UNSUPPORTED',\n `${shape.kind}: ${what} is not editable in this version`,\n )\n}\n\n/** 形状中心(无中心的形状取原点)。 */\nfunction shapeCenter(shape: SketchShape): Pt2 {\n const cx = 'cx' in shape ? (shape.cx ?? 0) : 0\n const cy = 'cy' in shape ? (shape.cy ?? 0) : 0\n return [cx, cy]\n}\n\n/** 两点中点。 */\nfunction midpoint(a: Pt2, b: Pt2): Pt2 {\n return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]\n}\n\n/** 把点按中心平移。 */\nfunction translatePoint(p: Pt2, from: Pt2, to: Pt2): Pt2 {\n return [p[0] + (to[0] - from[0]), p[1] + (to[1] - from[1])]\n}\n\n/**\n * 圆弧的有符号扫掠跨度(弧度)。**这条规则的全仓库唯一实现。**\n *\n * 规则**必须与 core 的 `geometry2d/adapt.ts#profileSegToCurve` 完全一致**,否则\n * 编辑期预览画的弧与执行后内核建的弧不是同一条——那正是仓库里踩过的\n * `sketch-arc-ccw-gotcha`(CW 短弧被当成 CCW 补角长弧,revolve 退化、BRepMesh 挂死):\n *\n * - **方向由 `ccw` 决定,不由 `a1 - a0` 的符号决定**;`ccw` 缺省时按 `a1 > a0` 推断\n * (canonical 的既有约定:`cq-compat` 产 `ccw: da > 0`)。\n * - 扫角用 `while` 平移到 (0, 2π],**不能用 `%`**——整圆恰为 2π 时 `x % x === 0`\n * 会把它消成退化线段。\n * - `a0 === a1` 视为整圆(扫角 2π)。\n *\n * 消费方:本模块的 `arcMidAngle` / `arcPoints`;宿主(3d_editor)的弧采样与吸附\n * (原先自己抄了一份 `arcSpan`,2026-10-03 收归到这里);faijs-cadquery 的三点弧。\n *\n * @param a0 - 起始角(弧度)。\n * @param a1 - 终止角(弧度)。\n * @param ccw - 逆时针为正;缺省按 `a1 > a0` 推断。\n * @returns 有符号扫角:`ccw` 为正、顺为负,绝对值落在 (0, 2π]。\n */\nexport function arcSweep(a0: number, a1: number, ccw: boolean | undefined): number {\n const dir = ccw ?? a1 - a0 > 0\n let sweep = dir ? a1 - a0 : a0 - a1\n while (sweep <= 0) sweep += Math.PI * 2\n while (sweep > Math.PI * 2) sweep -= Math.PI * 2\n return dir ? sweep : -sweep\n}\n\n/** 圆弧中点手柄的角度。 */\nfunction arcMidAngle(a0: number, a1: number, ccw: boolean | undefined): number {\n return a0 + arcSweep(a0, a1, ccw) / 2\n}\n\n/**\n * 圆弧的三个关键点(三点弧构造的唯一实现:`start → mid → end`,`mid` 一定在弧上)。\n *\n * 消费方:`shapeHandles` 的弧手柄;faijs-cadquery 的 `slot()` 与 `arc(c,r,a,da)`\n * 重载(OCCT `makeArcEdge` / CadQuery 都是三点弧签名)。反向遍历同一条弧只需交换\n * `start` / `end`(`mid` 不变——同一段弧反向走,半程点是同一个点)。\n *\n * @param c - 圆心。\n * @param r - 半径。\n * @param a0 - 起始角(弧度)。\n * @param a1 - 终止角(弧度)。\n * @param ccw - 方向(缺省按 `a1 > a0` 推)。\n * @returns 三点(草图局部坐标)。\n */\nexport function arcPoints(\n c: Pt2,\n r: number,\n a0: number,\n a1: number,\n ccw?: boolean,\n): { start: Pt2; mid: Pt2; end: Pt2 } {\n const at = (a: number): Pt2 => [c[0] + r * Math.cos(a), c[1] + r * Math.sin(a)]\n return { start: at(a0), mid: at(arcMidAngle(a0, a1, ccw)), end: at(a1) }\n}\n\n/**\n * 形状的可拖拽手柄清单(下标即 `dragShapeHandle` / `handleForGeomControl` 的 handle 参数)。\n *\n * 布局(顺序固定,测试与宿主都依赖):\n * - `rect`:`[角0, 角1, 角2, 角3, 边0中, 边1中, 边2中, 边3中, 中心]`(角顺序同展开:左下起逆时针)\n * - `circle`:`[中心, 半径]`;`ellipse`:`[中心, rx, ry]`;`polygon`:`[中心, 顶点0..n-1]`\n * - `line`:`[起点, 终点, 中点]`;`arc`:`[圆心, 起点, 终点, 中点]`;`point`:`[点]`\n * - `bspline`:`[控制点0..n-1]`\n * - `slot` / `roundedRect` / `trapezoid`:**只有中心**(v1 支持整体平移)\n *\n * @param shape - 语义图元。\n * @returns 手柄清单(可能为空,如 `close`)。\n */\nexport function shapeHandles(shape: SketchShape): ShapeHandle[] {\n const [c, y] = shapeCenter(shape)\n switch (shape.kind) {\n case 'rect': {\n const corners = rectCorners(shape.w, shape.d, c, y)\n return [\n ...corners.map((point): ShapeHandle => ({ point, kind: 'corner' })),\n ...corners.map((p, i): ShapeHandle => ({ point: midpoint(p, corners[(i + 1) % 4]!), kind: 'edge' })),\n { point: [c, y], kind: 'center' },\n ]\n }\n case 'circle':\n return [\n { point: [c, y], kind: 'center' },\n { point: [c + shape.r, y], kind: 'radius' },\n ]\n case 'ellipse':\n return [\n { point: [c, y], kind: 'center' },\n { point: [c + shape.rx, y], kind: 'radius' },\n { point: [c, y + shape.ry], kind: 'radius' },\n ]\n case 'polygon': {\n const verts = regularPolygonVertices(shape.r, shape.n, shape.angle ?? 0).map((p) => place(p, c, y))\n return [\n { point: [c, y], kind: 'center' },\n ...verts.map((point): ShapeHandle => ({ point, kind: 'vertex' })),\n ]\n }\n case 'slot':\n case 'roundedRect':\n case 'trapezoid':\n return [{ point: [c, y], kind: 'center' }]\n case 'line':\n return [\n { point: shape.from, kind: 'start' },\n { point: shape.to, kind: 'end' },\n { point: midpoint(shape.from, shape.to), kind: 'mid' },\n ]\n case 'arc': {\n const { mid, start, end } = arcPoints([shape.cx, shape.cy], shape.r, shape.a0, shape.a1, shape.ccw)\n return [\n { point: [shape.cx, shape.cy], kind: 'center' },\n { point: start, kind: 'start' },\n { point: end, kind: 'end' },\n { point: mid, kind: 'mid' },\n ]\n }\n case 'bspline':\n return shape.pts.map((pt): ShapeHandle => ({ point: [pt[0], pt[1]], kind: 'vertex' }))\n case 'point':\n return [{ point: [shape.x, shape.y], kind: 'start' }]\n case 'close':\n return []\n }\n}\n\n/** 拖动矩形的角:对角不动、这一角跟手(轴对齐,靠 H/V 形状约束维持)。 */\nfunction dragRectCorner(shape: Extract<SketchShape, { kind: 'rect' }>, handle: number, to: Pt2): SketchShape {\n const [c, y] = shapeCenter(shape)\n const opposite = rectCorners(shape.w, shape.d, c, y)[(handle + 2) % 4]!\n const w = Math.abs(to[0] - opposite[0])\n const d = Math.abs(to[1] - opposite[1])\n if (w <= 0 || d <= 0) badParam(`rect drag collapsed the rectangle (w=${w}, d=${d})`)\n return { ...shape, w, d, cx: (to[0] + opposite[0]) / 2, cy: (to[1] + opposite[1]) / 2 }\n}\n\n/** 拖动矩形的边:那条边跟手、对边不动。 */\nfunction dragRectEdge(shape: Extract<SketchShape, { kind: 'rect' }>, edge: number, to: Pt2): SketchShape {\n const [c, y] = shapeCenter(shape)\n switch (edge) {\n case 0: { // 底边(y = cy - d/2)\n const top = y + shape.d / 2\n const d = top - to[1]\n if (d <= 0) badParam(`rect bottom edge drag collapsed the height (d=${d})`)\n return { ...shape, d, cx: c, cy: (top + to[1]) / 2 }\n }\n case 2: { // 顶边\n const bottom = y - shape.d / 2\n const d = to[1] - bottom\n if (d <= 0) badParam(`rect top edge drag collapsed the height (d=${d})`)\n return { ...shape, d, cx: c, cy: (bottom + to[1]) / 2 }\n }\n case 1: { // 右边(x = cx + w/2)\n const left = c - shape.w / 2\n const w = to[0] - left\n if (w <= 0) badParam(`rect right edge drag collapsed the width (w=${w})`)\n return { ...shape, w, cx: (left + to[0]) / 2, cy: y }\n }\n default: { // 左边\n const right = c + shape.w / 2\n const w = right - to[0]\n if (w <= 0) badParam(`rect left edge drag collapsed the width (w=${w})`)\n return { ...shape, w, cx: (right + to[0]) / 2, cy: y }\n }\n }\n}\n\n/**\n * 拖动形状的某个手柄,返回**新的形状参数**(拖拽写回的唯一入口)。\n *\n * 语义:形状保持自己的形状语义——拖矩形的角,得到\"对角不动、这一角跟手\"的矩形;\n * 拖矩形某条边,得到\"那条边移动\"的矩形;拖中心,整体平移。宿主不需要任何形状数学。\n *\n * @param shape - 原形状。\n * @param handle - `shapeHandles(shape)` 的下标。\n * @param to - 目标点(草图局部坐标,已含吸附结果)。\n * @returns 写回后的形状。\n * @throws SketchShapeError 手柄越界 / 该形状不支持这种拖拽 / 拖成退化几何。\n */\nexport function dragShapeHandle(shape: SketchShape, handle: number, to: Pt2): SketchShape {\n const handles = shapeHandles(shape)\n const h = handles[handle]\n if (!h) {\n throw new SketchShapeError(\n 'E_SKETCHC_SHAPE_EDIT_MISMATCH',\n `handle ${handle} out of range for ${shape.kind} (${handles.length} handles)`,\n )\n }\n const center = shapeCenter(shape)\n switch (shape.kind) {\n case 'rect': {\n if (h.kind === 'center') {\n return { ...shape, cx: to[0], cy: to[1] }\n }\n if (h.kind === 'corner') return dragRectCorner(shape, handle, to)\n return dragRectEdge(shape, handle - 4, to)\n }\n case 'circle': {\n if (h.kind === 'center') return { ...shape, cx: to[0], cy: to[1] }\n const r = Math.hypot(to[0] - center[0], to[1] - center[1])\n if (!(r > 0)) badParam('circle drag collapsed the radius to 0')\n return { ...shape, r }\n }\n case 'ellipse': {\n if (h.kind === 'center') return { ...shape, cx: to[0], cy: to[1] }\n if (handle === 1) {\n const rx = Math.abs(to[0] - center[0])\n if (!(rx > 0)) badParam('ellipse drag collapsed rx to 0')\n return { ...shape, rx }\n }\n const ry = Math.abs(to[1] - center[1])\n if (!(ry > 0)) badParam('ellipse drag collapsed ry to 0')\n return { ...shape, ry }\n }\n case 'polygon': {\n if (h.kind === 'center') return { ...shape, cx: to[0], cy: to[1] }\n const r = Math.hypot(to[0] - center[0], to[1] - center[1])\n if (!(r > 0)) badParam('polygon drag collapsed the circumradius to 0')\n const k = handle - 1\n let angle = Math.atan2(to[1] - center[1], to[0] - center[0]) - (k * 2 * Math.PI) / shape.n\n while (angle <= -Math.PI) angle += Math.PI * 2\n while (angle > Math.PI) angle -= Math.PI * 2\n return { ...shape, r, angle }\n }\n case 'slot':\n case 'roundedRect':\n case 'trapezoid':\n if (h.kind === 'center') return { ...shape, cx: to[0], cy: to[1] }\n return editUnsupported(shape, `${h.kind} handle`)\n case 'line': {\n if (h.kind === 'start') return { ...shape, from: [to[0], to[1]] }\n if (h.kind === 'end') return { ...shape, to: [to[0], to[1]] }\n // 中点 = 整体平移(保持长度与方向)。\n return { ...shape, from: translatePoint(shape.from, h.point, to), to: translatePoint(shape.to, h.point, to) }\n }\n case 'arc': {\n if (h.kind === 'center') return { ...shape, cx: to[0], cy: to[1] }\n const r = Math.hypot(to[0] - shape.cx, to[1] - shape.cy)\n if (!(r > 0)) badParam('arc drag collapsed the radius to 0')\n if (h.kind === 'mid') return { ...shape, r }\n const angle = Math.atan2(to[1] - shape.cy, to[0] - shape.cx)\n return h.kind === 'start' ? { ...shape, r, a0: angle } : { ...shape, r, a1: angle }\n }\n case 'bspline': {\n const pts = shape.pts.map((p, i) => (i === handle ? ([to[0], to[1]] as Pt2) : p))\n return { ...shape, pts }\n }\n case 'point':\n return { ...shape, x: to[0], y: to[1] }\n case 'close':\n return editUnsupported(shape, 'handle')\n }\n}\n\n/** 宿主 UI 的「派生几何控制点」语义(与 3d_editor `sketch-draft.ts#ControlPointKind` 对齐)。 */\nexport type GeomControl = 'start' | 'end' | 'mid' | 'center' | 'radius'\n\n/**\n * 把「派生几何上的某个控制点」翻译成形状手柄下标——宿主不知道任何形状数学,\n * 只做 `tag → 形状 + 形状内几何下标` 的查表。\n *\n * 罐头形状的派生几何顺序与展开一致(见 `expandShapes` 注释):\n * - `rect` / `roundedRect` 的线:第 k 条线 = 角 k → 角 k+1(`start`/`end`/`mid` 一一对应);\n * - 其余罐头形状的切线点/圆心等控制点与形状定义参数不是一一对应(拖它意味着改哪个\n * 参数并不唯一),本版本显式报不支持——宁可拖不动,也不静默变形。\n *\n * @param shape - 该几何所属的形状。\n * @param geomIndexInShape - 该几何在形状展开结果里的下标。\n * @param control - 控制点语义。\n * @returns `shapeHandles(shape)` 的下标。\n * @throws SketchShapeError 该组合不支持拖拽。\n */\nexport function handleForGeomControl(\n shape: SketchShape,\n geomIndexInShape: number,\n control: GeomControl,\n): number {\n const corners = (): number => {\n if (control === 'mid') return 4 + geomIndexInShape\n return control === 'start' ? geomIndexInShape : (geomIndexInShape + 1) % 4\n }\n switch (shape.kind) {\n case 'rect':\n return corners()\n case 'roundedRect':\n // 弧的切点/圆心与形状定义参数不是一一对应(拖它意味着改 w/d/r 并不唯一);\n // 直边虽然有序,但拖动会牵动圆角——v1 只给中心手柄(`shapeHandles`)。\n return editUnsupported(shape, `${control} handle`)\n case 'polygon':\n if (control === 'mid') return editUnsupported(shape, 'mid on an edge')\n return control === 'start' ? 1 + geomIndexInShape : 1 + ((geomIndexInShape + 1) % shape.n)\n case 'line':\n return control === 'start' ? 0 : control === 'end' ? 1 : 2\n case 'arc':\n switch (control) {\n case 'center': return 0\n case 'start': return 1\n case 'end': return 2\n case 'mid': return 3\n default: return editUnsupported(shape, `${control} on an arc`)\n }\n case 'circle':\n return control === 'center' ? 0 : 1\n case 'point':\n return 0\n case 'bspline':\n return editUnsupported(shape, `${control} (bspline 用 shapeHandles 直接取控制点)`)\n case 'ellipse':\n case 'slot':\n case 'trapezoid':\n case 'close':\n return editUnsupported(shape, `${control} handle`)\n }\n}\n\n/**\n * 形状的自带约束里引用了哪些 tag(宿主删形状时用来级联清理自己的约束)。\n * @param constraint - 待提取引用的约束。type:SketchConstraint required:true\n * @returns string[] 约束值里出现的全部 tag(可能为空数组)。\n */\nexport function refsOfConstraint(constraint: SketchConstraint): string[] {\n const out: string[] = []\n for (const value of Object.values(constraint)) {\n const ref = value as Ref | undefined\n if (ref && typeof ref === 'object' && 'tag' in ref && typeof ref.tag === 'string') out.push(ref.tag)\n }\n return out\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SketchConstraint, SketchGeom, SolveOutcome } from './canonical.js';
|
|
2
|
+
import { type PlanegcsSolverOptions } from './planegcs-backend.js';
|
|
3
|
+
import type { ExternalFixedSeg, SketchSolver } from './solver.js';
|
|
4
|
+
/** Options for {@link solveSketch}. */
|
|
5
|
+
export interface SolveSketchOptions extends PlanegcsSolverOptions {
|
|
6
|
+
/** A pre-built solver (avoids re-instantiating the wasm module per call). */
|
|
7
|
+
solver?: SketchSolver;
|
|
8
|
+
/** Pre-projected fixed external geometry the constraints may reference. */
|
|
9
|
+
external?: ExternalFixedSeg[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Solve a canonical sketch.
|
|
13
|
+
*
|
|
14
|
+
* @param geoms - canonical geometry; stored coordinates are the initial guess.
|
|
15
|
+
* @param constraints - canonical constraints (default: none — a declarative sketch).
|
|
16
|
+
* @param opts - solver selection / external geometry.
|
|
17
|
+
* @returns the solved geometry plus explicit diagnostics.
|
|
18
|
+
* @throws SketchProjectionError for bad refs / unsupported geometry / unmapped constraints.
|
|
19
|
+
*/
|
|
20
|
+
export declare function solveSketch(geoms: SketchGeom[], constraints?: SketchConstraint[], opts?: SolveSketchOptions): Promise<SolveOutcome>;
|
|
21
|
+
//# sourceMappingURL=solve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve.d.ts","sourceRoot":"","sources":["../../src/sketch/solve.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAoC,MAAM,gBAAgB,CAAA;AAElH,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEjE,uCAAuC;AACvC,MAAM,WAAW,kBAAmB,SAAQ,qBAAqB;IAC/D,6EAA6E;IAC7E,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAC9B;AAoED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EAAE,EACnB,WAAW,GAAE,gBAAgB,EAAO,EACpC,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,YAAY,CAAC,CA2DvB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* solve — `solveSketch`: the canonical-model entry to the planegcs pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Projects canonical geometry/constraints to the FCStd shape the backend
|
|
5
|
+
* consumes, solves, and projects the solved geometry back. Under- and
|
|
6
|
+
* over-constraint are allowed and surface through `SolveOutcome.status` (§5);
|
|
7
|
+
* projection errors (bad ref, unsupported geometry, unmapped constraint) are
|
|
8
|
+
* raised so the caller can surface them explicitly rather than silently.
|
|
9
|
+
*/
|
|
10
|
+
import { isOk } from '../api/result.js';
|
|
11
|
+
import { fromFreeCadGeoms, toFreeCadConstraints, toFreeCadGeoms } from './project.js';
|
|
12
|
+
import { createPlanegcsSolver } from './planegcs-backend.js';
|
|
13
|
+
/** Resolve a solver from the options (explicit solver → wasm source → error). */
|
|
14
|
+
async function resolveSolver(opts) {
|
|
15
|
+
if (opts?.solver)
|
|
16
|
+
return opts.solver;
|
|
17
|
+
if (opts?.wasmPath !== undefined || opts?.wasmBytes !== undefined) {
|
|
18
|
+
return createPlanegcsSolver({ wasmPath: opts.wasmPath, wasmBytes: opts.wasmBytes });
|
|
19
|
+
}
|
|
20
|
+
throw new Error('E_SKETCHC_NO_WASM: solveSketch needs opts.solver, opts.wasmPath or opts.wasmBytes');
|
|
21
|
+
}
|
|
22
|
+
/** Probe the wrapper's remaining-DoF report when the backend exposes one. */
|
|
23
|
+
function readDof(solver) {
|
|
24
|
+
const probe = solver.getDof;
|
|
25
|
+
if (typeof probe === 'function') {
|
|
26
|
+
try {
|
|
27
|
+
const v = probe.call(solver);
|
|
28
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
29
|
+
return v;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
/* backend does not report DoF */
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return -1;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract the `Ref` fields from a canonical constraint. Every union member
|
|
39
|
+
* carries its element references as `Ref`-typed properties; the `value` /
|
|
40
|
+
* `dir` / `at` companions are not refs and are skipped by the structural guard.
|
|
41
|
+
*/
|
|
42
|
+
function constraintRefs(c) {
|
|
43
|
+
const refs = [];
|
|
44
|
+
for (const v of Object.values(c)) {
|
|
45
|
+
if (v && typeof v === 'object' && !Array.isArray(v) && ('tag' in v || 'index' in v)) {
|
|
46
|
+
refs.push(v);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return refs;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve the solver's numeric `problemConstraints` (canonical indices) into
|
|
53
|
+
* readable conflict details with element tags, so the script-face error can
|
|
54
|
+
* point at *which* constraints clash and *where* (§3.2 of the 2026-09-27 plan).
|
|
55
|
+
*/
|
|
56
|
+
function buildConflictDetails(problemConstraints, constraints, geoms) {
|
|
57
|
+
const tagOf = (r) => {
|
|
58
|
+
if ('tag' in r)
|
|
59
|
+
return r.tag;
|
|
60
|
+
const g = geoms[r.index];
|
|
61
|
+
return g?.tag ?? `geom#${r.index}`;
|
|
62
|
+
};
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const idx of problemConstraints) {
|
|
65
|
+
const c = constraints[idx];
|
|
66
|
+
if (!c)
|
|
67
|
+
continue;
|
|
68
|
+
out.push({
|
|
69
|
+
kind: c.kind,
|
|
70
|
+
refs: constraintRefs(c).map(tagOf),
|
|
71
|
+
value: 'value' in c ? c.value : undefined,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Solve a canonical sketch.
|
|
78
|
+
*
|
|
79
|
+
* @param geoms - canonical geometry; stored coordinates are the initial guess.
|
|
80
|
+
* @param constraints - canonical constraints (default: none — a declarative sketch).
|
|
81
|
+
* @param opts - solver selection / external geometry.
|
|
82
|
+
* @returns the solved geometry plus explicit diagnostics.
|
|
83
|
+
* @throws SketchProjectionError for bad refs / unsupported geometry / unmapped constraints.
|
|
84
|
+
*/
|
|
85
|
+
export async function solveSketch(geoms, constraints = [], opts) {
|
|
86
|
+
const fcstdGeoms = toFreeCadGeoms(geoms);
|
|
87
|
+
const projected = toFreeCadConstraints(constraints, geoms);
|
|
88
|
+
const solver = await resolveSolver(opts);
|
|
89
|
+
const result = await solver.solve(fcstdGeoms, projected.constraints, opts?.external);
|
|
90
|
+
if (!isOk(result)) {
|
|
91
|
+
return {
|
|
92
|
+
geoms, converged: false, status: 'failed', dof: -1,
|
|
93
|
+
problemConstraints: [], droppedConstraints: [], reason: 'solver-error',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const raw = result.value;
|
|
97
|
+
const solvedCanonical = fromFreeCadGeoms(raw.geoms).map((g, i) => {
|
|
98
|
+
const input = geoms[i];
|
|
99
|
+
const tag = input?.tag;
|
|
100
|
+
// Preserve the author's arc orientation (ccw) across the solve. The FCStd
|
|
101
|
+
// round-trip only reports a CCW-normalised span (see fromFreeCadGeoms), so a
|
|
102
|
+
// CW arc would otherwise come back as ccw:true and be rebuilt as the long CCW
|
|
103
|
+
// arc through arcToHandles — the A3 regression class. The solver only relocates
|
|
104
|
+
// coordinates; it does not change which arc (CW minor vs CCW) the author intended.
|
|
105
|
+
if (g.kind === 'arc' && input?.kind === 'arc') {
|
|
106
|
+
const withCcw = { ...g, ccw: input.ccw };
|
|
107
|
+
return tag === undefined ? withCcw : { ...withCcw, tag };
|
|
108
|
+
}
|
|
109
|
+
return tag === undefined ? g : { ...g, tag };
|
|
110
|
+
});
|
|
111
|
+
let status;
|
|
112
|
+
let dof;
|
|
113
|
+
if (raw.converged) {
|
|
114
|
+
dof = readDof(solver);
|
|
115
|
+
if (raw.droppedConstraints.length > 0) {
|
|
116
|
+
status = 'redundant';
|
|
117
|
+
}
|
|
118
|
+
else if (dof > 0) {
|
|
119
|
+
status = 'underconstrained';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
status = 'solved';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
dof = -1;
|
|
127
|
+
status = raw.reason === 'conflicting' ? 'conflicting'
|
|
128
|
+
: raw.reason === 'redundant' ? 'redundant'
|
|
129
|
+
: 'failed';
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
geoms: solvedCanonical,
|
|
133
|
+
converged: raw.converged,
|
|
134
|
+
status,
|
|
135
|
+
dof,
|
|
136
|
+
problemConstraints: raw.problemConstraints,
|
|
137
|
+
droppedConstraints: raw.droppedConstraints,
|
|
138
|
+
reason: raw.converged ? undefined : raw.reason,
|
|
139
|
+
conflictDetails: status === 'conflicting'
|
|
140
|
+
? buildConflictDetails(raw.problemConstraints, constraints, geoms)
|
|
141
|
+
: undefined,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=solve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../src/sketch/solve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * solve — `solveSketch`: the canonical-model entry to the planegcs pipeline.\n *\n * Projects canonical geometry/constraints to the FCStd shape the backend\n * consumes, solves, and projects the solved geometry back. Under- and\n * over-constraint are allowed and surface through `SolveOutcome.status` (§5);\n * projection errors (bad ref, unsupported geometry, unmapped constraint) are\n * raised so the caller can surface them explicitly rather than silently.\n */\nimport { isOk } from '../api/result'\nimport type { SketchConstraint, SketchGeom, SolveOutcome, SolveStatus, Ref, ConflictDetail } from './canonical.js'\nimport { fromFreeCadGeoms, toFreeCadConstraints, toFreeCadGeoms } from './project.js'\nimport { createPlanegcsSolver, type PlanegcsSolverOptions } from './planegcs-backend.js'\nimport type { ExternalFixedSeg, SketchSolver } from './solver.js'\n\n/** Options for {@link solveSketch}. */\nexport interface SolveSketchOptions extends PlanegcsSolverOptions {\n /** A pre-built solver (avoids re-instantiating the wasm module per call). */\n solver?: SketchSolver\n /** Pre-projected fixed external geometry the constraints may reference. */\n external?: ExternalFixedSeg[]\n}\n\n/** Resolve a solver from the options (explicit solver → wasm source → error). */\nasync function resolveSolver(opts?: SolveSketchOptions): Promise<SketchSolver> {\n if (opts?.solver) return opts.solver\n if (opts?.wasmPath !== undefined || opts?.wasmBytes !== undefined) {\n return createPlanegcsSolver({ wasmPath: opts.wasmPath, wasmBytes: opts.wasmBytes })\n }\n throw new Error('E_SKETCHC_NO_WASM: solveSketch needs opts.solver, opts.wasmPath or opts.wasmBytes')\n}\n\n/** Probe the wrapper's remaining-DoF report when the backend exposes one. */\nfunction readDof(solver: SketchSolver): number {\n const probe = (solver as unknown as { getDof?: () => number }).getDof\n if (typeof probe === 'function') {\n try {\n const v = probe.call(solver)\n if (typeof v === 'number' && Number.isFinite(v)) return v\n } catch {\n /* backend does not report DoF */\n }\n }\n return -1\n}\n\n/**\n * Extract the `Ref` fields from a canonical constraint. Every union member\n * carries its element references as `Ref`-typed properties; the `value` /\n * `dir` / `at` companions are not refs and are skipped by the structural guard.\n */\nfunction constraintRefs(c: SketchConstraint): Ref[] {\n const refs: Ref[] = []\n for (const v of Object.values(c)) {\n if (v && typeof v === 'object' && !Array.isArray(v) && ('tag' in v || 'index' in v)) {\n refs.push(v as Ref)\n }\n }\n return refs\n}\n\n/**\n * Resolve the solver's numeric `problemConstraints` (canonical indices) into\n * readable conflict details with element tags, so the script-face error can\n * point at *which* constraints clash and *where* (§3.2 of the 2026-09-27 plan).\n */\nfunction buildConflictDetails(\n problemConstraints: number[],\n constraints: SketchConstraint[],\n geoms: SketchGeom[],\n): ConflictDetail[] {\n const tagOf = (r: Ref): string => {\n if ('tag' in r) return r.tag\n const g = geoms[r.index]\n return g?.tag ?? `geom#${r.index}`\n }\n const out: ConflictDetail[] = []\n for (const idx of problemConstraints) {\n const c = constraints[idx]\n if (!c) continue\n out.push({\n kind: c.kind,\n refs: constraintRefs(c).map(tagOf),\n value: 'value' in c ? c.value : undefined,\n })\n }\n return out\n}\n\n/**\n * Solve a canonical sketch.\n *\n * @param geoms - canonical geometry; stored coordinates are the initial guess.\n * @param constraints - canonical constraints (default: none — a declarative sketch).\n * @param opts - solver selection / external geometry.\n * @returns the solved geometry plus explicit diagnostics.\n * @throws SketchProjectionError for bad refs / unsupported geometry / unmapped constraints.\n */\nexport async function solveSketch(\n geoms: SketchGeom[],\n constraints: SketchConstraint[] = [],\n opts?: SolveSketchOptions,\n): Promise<SolveOutcome> {\n const fcstdGeoms = toFreeCadGeoms(geoms)\n const projected = toFreeCadConstraints(constraints, geoms)\n const solver = await resolveSolver(opts)\n\n const result = await solver.solve(fcstdGeoms, projected.constraints, opts?.external)\n if (!isOk(result)) {\n return {\n geoms, converged: false, status: 'failed', dof: -1,\n problemConstraints: [], droppedConstraints: [], reason: 'solver-error',\n }\n }\n\n const raw = result.value\n const solvedCanonical = fromFreeCadGeoms(raw.geoms).map((g, i) => {\n const input = geoms[i]\n const tag = input?.tag\n // Preserve the author's arc orientation (ccw) across the solve. The FCStd\n // round-trip only reports a CCW-normalised span (see fromFreeCadGeoms), so a\n // CW arc would otherwise come back as ccw:true and be rebuilt as the long CCW\n // arc through arcToHandles — the A3 regression class. The solver only relocates\n // coordinates; it does not change which arc (CW minor vs CCW) the author intended.\n if (g.kind === 'arc' && input?.kind === 'arc') {\n const withCcw = { ...g, ccw: input.ccw }\n return tag === undefined ? withCcw : { ...withCcw, tag }\n }\n return tag === undefined ? g : { ...g, tag }\n })\n\n let status: SolveStatus\n let dof: number\n if (raw.converged) {\n dof = readDof(solver)\n if (raw.droppedConstraints.length > 0) {\n status = 'redundant'\n } else if (dof > 0) {\n status = 'underconstrained'\n } else {\n status = 'solved'\n }\n } else {\n dof = -1\n status = raw.reason === 'conflicting' ? 'conflicting'\n : raw.reason === 'redundant' ? 'redundant'\n : 'failed'\n }\n\n return {\n geoms: solvedCanonical,\n converged: raw.converged,\n status,\n dof,\n problemConstraints: raw.problemConstraints,\n droppedConstraints: raw.droppedConstraints,\n reason: raw.converged ? undefined : raw.reason,\n conflictDetails: status === 'conflicting'\n ? buildConflictDetails(raw.problemConstraints, constraints, geoms)\n : undefined,\n }\n}"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* solver-loader — planegcs solver loading, aligned with core's wasm pattern.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors `setOcctWasmInitFn` / `initOcctWasm` (occt) and
|
|
5
|
+
* `setBrepkitWasmInitFn` / `initBrepkitWasm` (brepkit):
|
|
6
|
+
*
|
|
7
|
+
* 1. `setSketchSolverInitFn(fn | null)` — host injects a solver factory
|
|
8
|
+
* (browser/weapp pass a factory that knows the wasm URL).
|
|
9
|
+
* 2. `initSketchSolver()` — internal three-stage init:
|
|
10
|
+
* ① custom init fn from globalThis shared slot;
|
|
11
|
+
* ② Node auto: `createNodePlanegcsSolver()` (resolves wasm from node_modules);
|
|
12
|
+
* ③ throw "no init function set and not in Node environment".
|
|
13
|
+
* 3. globalThis sharing: the factory is stored on `globalThis['__faijs_sketch_solver__']`
|
|
14
|
+
* so CDN-externalized multi-instance works (same as occt/brepkit).
|
|
15
|
+
*
|
|
16
|
+
* `installSketchSolver` is retained as a deprecated alias of
|
|
17
|
+
* `setSketchSolverInitFn` for one release to avoid breaking too many
|
|
18
|
+
* downstream call sites at once.
|
|
19
|
+
*/
|
|
20
|
+
import type { SketchSolver } from './solver.js';
|
|
21
|
+
type SolverFactory = () => Promise<SketchSolver>;
|
|
22
|
+
/**
|
|
23
|
+
* Inject (or clear, with `null`) the host's planegcs solver factory.
|
|
24
|
+
*
|
|
25
|
+
* Browser/weapp hosts call this once at startup with a factory that resolves
|
|
26
|
+
* the wasm bytes and calls `createPlanegcsSolver({ wasmBytes | wasmLoaderPath })`.
|
|
27
|
+
* Node hosts do NOT need to call this — `initSketchSolver()` auto-resolves
|
|
28
|
+
* the wasm from `@salusoft89/planegcs` in `node_modules`.
|
|
29
|
+
*
|
|
30
|
+
* @param fn - the solver factory, or null to clear.
|
|
31
|
+
*/
|
|
32
|
+
export declare function setSketchSolverInitFn(fn: SolverFactory | null): void;
|
|
33
|
+
/**
|
|
34
|
+
* Initialize the shared sketch solver instance (idempotent).
|
|
35
|
+
*
|
|
36
|
+
* Resolution order:
|
|
37
|
+
* ① custom init function injected by the host;
|
|
38
|
+
* ② Node auto: `createNodePlanegcsSolver()`;
|
|
39
|
+
* ③ throw "no init function set and not in Node environment".
|
|
40
|
+
*
|
|
41
|
+
* @returns a promise resolving to a `SketchSolver`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function initSketchSolver(): Promise<SketchSolver>;
|
|
44
|
+
/** Reset the solver promise (test-only). */
|
|
45
|
+
export declare function _resetSketchSolver(): void;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=solver-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver-loader.d.ts","sourceRoot":"","sources":["../../src/sketch/solver-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/C,KAAK,aAAa,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;AAehD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEpE;AAeD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CA8BxD;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** The globalThis slot key for sharing the solver factory across instances. */
|
|
2
|
+
const SOLVER_SHARED_KEY = '__faijs_sketch_solver__';
|
|
3
|
+
/** Get or create the globalThis shared state for the sketch solver. */
|
|
4
|
+
function getSketchSolverSharedState() {
|
|
5
|
+
const g = globalThis;
|
|
6
|
+
if (!g[SOLVER_SHARED_KEY]) {
|
|
7
|
+
g[SOLVER_SHARED_KEY] = { customInitFn: null };
|
|
8
|
+
}
|
|
9
|
+
return g[SOLVER_SHARED_KEY];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Inject (or clear, with `null`) the host's planegcs solver factory.
|
|
13
|
+
*
|
|
14
|
+
* Browser/weapp hosts call this once at startup with a factory that resolves
|
|
15
|
+
* the wasm bytes and calls `createPlanegcsSolver({ wasmBytes | wasmLoaderPath })`.
|
|
16
|
+
* Node hosts do NOT need to call this — `initSketchSolver()` auto-resolves
|
|
17
|
+
* the wasm from `@salusoft89/planegcs` in `node_modules`.
|
|
18
|
+
*
|
|
19
|
+
* @param fn - the solver factory, or null to clear.
|
|
20
|
+
*/
|
|
21
|
+
export function setSketchSolverInitFn(fn) {
|
|
22
|
+
getSketchSolverSharedState().customInitFn = fn;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initialize and return the planegcs solver (idempotent — the factory is
|
|
26
|
+
* called once; subsequent calls return the same promise).
|
|
27
|
+
*
|
|
28
|
+
* Three-stage (aligned with occt/brepkit):
|
|
29
|
+
* ① custom init fn (host-injected via `setSketchSolverInitFn`);
|
|
30
|
+
* ② Node auto: `createNodePlanegcsSolver()`;
|
|
31
|
+
* ③ throw "no init function set and not in Node environment".
|
|
32
|
+
*
|
|
33
|
+
* @returns a promise resolving to a `SketchSolver`.
|
|
34
|
+
*/
|
|
35
|
+
let solverPromise = null;
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the shared sketch solver instance (idempotent).
|
|
38
|
+
*
|
|
39
|
+
* Resolution order:
|
|
40
|
+
* ① custom init function injected by the host;
|
|
41
|
+
* ② Node auto: `createNodePlanegcsSolver()`;
|
|
42
|
+
* ③ throw "no init function set and not in Node environment".
|
|
43
|
+
*
|
|
44
|
+
* @returns a promise resolving to a `SketchSolver`.
|
|
45
|
+
*/
|
|
46
|
+
export function initSketchSolver() {
|
|
47
|
+
if (solverPromise)
|
|
48
|
+
return solverPromise;
|
|
49
|
+
const shared = getSketchSolverSharedState();
|
|
50
|
+
// ① custom init fn (host-injected)
|
|
51
|
+
if (shared.customInitFn) {
|
|
52
|
+
solverPromise = shared.customInitFn();
|
|
53
|
+
return solverPromise;
|
|
54
|
+
}
|
|
55
|
+
// ② Node auto: resolve wasm from node_modules
|
|
56
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
57
|
+
solverPromise = (async () => {
|
|
58
|
+
const { createRequire } = await import('node:module');
|
|
59
|
+
const { dirname, join } = await import('node:path');
|
|
60
|
+
const { createPlanegcsSolver } = await import('./planegcs-backend.js');
|
|
61
|
+
const require = createRequire(import.meta.url);
|
|
62
|
+
const pkgDir = dirname(require.resolve('@salusoft89/planegcs/package.json'));
|
|
63
|
+
const wasmPath = join(pkgDir, 'dist', 'planegcs_dist', 'planegcs.wasm');
|
|
64
|
+
return createPlanegcsSolver({ wasmPath });
|
|
65
|
+
})();
|
|
66
|
+
return solverPromise;
|
|
67
|
+
}
|
|
68
|
+
// ③ not Node and no init fn
|
|
69
|
+
throw new Error('E_SKETCHC_NO_SOLVER: no sketch solver init function set and not in Node environment. ' +
|
|
70
|
+
'Call setSketchSolverInitFn() first.');
|
|
71
|
+
}
|
|
72
|
+
/** Reset the solver promise (test-only). */
|
|
73
|
+
export function _resetSketchSolver() {
|
|
74
|
+
solverPromise = null;
|
|
75
|
+
getSketchSolverSharedState().customInitFn = null;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=solver-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver-loader.js","sourceRoot":"","sources":["../../src/sketch/solver-loader.ts"],"names":[],"mappings":"AAqBA,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,yBAAyB,CAAA;AAQnD,uEAAuE;AACvE,SAAS,0BAA0B;IACjC,MAAM,CAAC,GAAG,UAAgD,CAAA;IAC1D,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAoC,CAAA;IACjF,CAAC;IACD,OAAO,CAAC,CAAC,iBAAiB,CAA4B,CAAA;AACxD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAwB;IAC5D,0BAA0B,EAAE,CAAC,YAAY,GAAG,EAAE,CAAA;AAChD,CAAC;AAED;;;;;;;;;;GAUG;AACH,IAAI,aAAa,GAAiC,IAAI,CAAA;AAEtD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAA;IAEvC,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAA;IAE3C,mCAAmC;IACnC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;QACrC,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC7D,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;YACtE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,CAAA;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,CAAA;YACvE,OAAO,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC3C,CAAC,CAAC,EAAE,CAAA;QACJ,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,4BAA4B;IAC5B,MAAM,IAAI,KAAK,CACb,uFAAuF;QACvF,qCAAqC,CACtC,CAAA;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,IAAI,CAAA;IACpB,0BAA0B,EAAE,CAAC,YAAY,GAAG,IAAI,CAAA;AAClD,CAAC","sourcesContent":["/**\r\n * solver-loader — planegcs solver loading, aligned with core's wasm pattern.\r\n *\r\n * Mirrors `setOcctWasmInitFn` / `initOcctWasm` (occt) and\r\n * `setBrepkitWasmInitFn` / `initBrepkitWasm` (brepkit):\r\n *\r\n * 1. `setSketchSolverInitFn(fn | null)` — host injects a solver factory\r\n * (browser/weapp pass a factory that knows the wasm URL).\r\n * 2. `initSketchSolver()` — internal three-stage init:\r\n * ① custom init fn from globalThis shared slot;\r\n * ② Node auto: `createNodePlanegcsSolver()` (resolves wasm from node_modules);\r\n * ③ throw \"no init function set and not in Node environment\".\r\n * 3. globalThis sharing: the factory is stored on `globalThis['__faijs_sketch_solver__']`\r\n * so CDN-externalized multi-instance works (same as occt/brepkit).\r\n *\r\n * `installSketchSolver` is retained as a deprecated alias of\r\n * `setSketchSolverInitFn` for one release to avoid breaking too many\r\n * downstream call sites at once.\r\n */\r\nimport type { SketchSolver } from './solver.js'\r\n\r\n/** The globalThis slot key for sharing the solver factory across instances. */\r\nconst SOLVER_SHARED_KEY = '__faijs_sketch_solver__'\r\n\r\ntype SolverFactory = () => Promise<SketchSolver>\r\n\r\ninterface SketchSolverSharedState {\r\n customInitFn: SolverFactory | null\r\n}\r\n\r\n/** Get or create the globalThis shared state for the sketch solver. */\r\nfunction getSketchSolverSharedState(): SketchSolverSharedState {\r\n const g = globalThis as unknown as Record<string, unknown>\r\n if (!g[SOLVER_SHARED_KEY]) {\r\n g[SOLVER_SHARED_KEY] = { customInitFn: null } satisfies SketchSolverSharedState\r\n }\r\n return g[SOLVER_SHARED_KEY] as SketchSolverSharedState\r\n}\r\n\r\n/**\r\n * Inject (or clear, with `null`) the host's planegcs solver factory.\r\n *\r\n * Browser/weapp hosts call this once at startup with a factory that resolves\r\n * the wasm bytes and calls `createPlanegcsSolver({ wasmBytes | wasmLoaderPath })`.\r\n * Node hosts do NOT need to call this — `initSketchSolver()` auto-resolves\r\n * the wasm from `@salusoft89/planegcs` in `node_modules`.\r\n *\r\n * @param fn - the solver factory, or null to clear.\r\n */\r\nexport function setSketchSolverInitFn(fn: SolverFactory | null): void {\r\n getSketchSolverSharedState().customInitFn = fn\r\n}\r\n\r\n/**\r\n * Initialize and return the planegcs solver (idempotent — the factory is\r\n * called once; subsequent calls return the same promise).\r\n *\r\n * Three-stage (aligned with occt/brepkit):\r\n * ① custom init fn (host-injected via `setSketchSolverInitFn`);\r\n * ② Node auto: `createNodePlanegcsSolver()`;\r\n * ③ throw \"no init function set and not in Node environment\".\r\n *\r\n * @returns a promise resolving to a `SketchSolver`.\r\n */\r\nlet solverPromise: Promise<SketchSolver> | null = null\r\n\r\n/**\n * Initialize the shared sketch solver instance (idempotent).\n *\n * Resolution order:\n * ① custom init function injected by the host;\n * ② Node auto: `createNodePlanegcsSolver()`;\n * ③ throw \"no init function set and not in Node environment\".\n *\n * @returns a promise resolving to a `SketchSolver`.\n */\nexport function initSketchSolver(): Promise<SketchSolver> {\r\n if (solverPromise) return solverPromise\r\n\r\n const shared = getSketchSolverSharedState()\r\n\r\n // ① custom init fn (host-injected)\r\n if (shared.customInitFn) {\r\n solverPromise = shared.customInitFn()\r\n return solverPromise\r\n }\r\n\r\n // ② Node auto: resolve wasm from node_modules\r\n if (typeof process !== 'undefined' && process.versions?.node) {\r\n solverPromise = (async () => {\r\n const { createRequire } = await import('node:module')\r\n const { dirname, join } = await import('node:path')\r\n const { createPlanegcsSolver } = await import('./planegcs-backend.js')\r\n const require = createRequire(import.meta.url)\r\n const pkgDir = dirname(require.resolve('@salusoft89/planegcs/package.json'))\r\n const wasmPath = join(pkgDir, 'dist', 'planegcs_dist', 'planegcs.wasm')\r\n return createPlanegcsSolver({ wasmPath })\r\n })()\r\n return solverPromise\r\n }\r\n\r\n // ③ not Node and no init fn\r\n throw new Error(\r\n 'E_SKETCHC_NO_SOLVER: no sketch solver init function set and not in Node environment. ' +\r\n 'Call setSketchSolverInitFn() first.',\r\n )\r\n}\r\n\r\n/** Reset the solver promise (test-only). */\r\nexport function _resetSketchSolver(): void {\r\n solverPromise = null\r\n getSketchSolverSharedState().customInitFn = null\r\n}\r\n"]}
|