@faicad/faijs 0.29.3 → 0.30.9
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/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +136 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +228 -0
- package/dist/api/appearance.js.map +1 -0
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +28 -0
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +19 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +31 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +91 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +97 -0
- package/dist/api/meta.js.map +1 -0
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +124 -8
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +204 -13
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +8 -8
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +268 -25
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +65 -3
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +90 -29
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/types.d.ts +5 -6
- package/dist/lang/types.d.ts.map +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +39 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +151 -22
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +42 -7
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +37 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +205 -14
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +43 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +32 -5
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +35 -3
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +44 -2
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +9 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joints-kinematics.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/joints-kinematics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kinematic joints + IK — core 自有实现(§5.6.3 移植:vendored jointFns + ikFns 逐字对齐)。\n *\n * 移植来源:packages/brepjs/src/operations/{jointFns,ikFns}.ts(纯算法零 kernel 依赖,\n * 仅用 quat 与 assembly-tree;Phase 5 随 brepjs 包删除前已做 parity 对拍)。\n */\nimport { quatFromAxisAngle, quatRotate, quatMultiply } from './quat'\nimport type { AssemblyNode, Vec3 } from './assembly-tree'\nimport { walkAssembly } from './assembly-tree'\n\n/**\n * Drivable kinematic joints — built on the assembly tree. A joint connects a\n * `parent` (reference) body to a `child` (moving) body and carries one or more\n * drivable degrees of freedom (DOF), each clamped to its own range.\n *\n * Single-DOF joints (`revolute`, `prismatic`) are sugar over the Phase-1 mate\n * constraints — a revolute is concentric (axis alignment) plus an angle driver;\n * a prismatic is coincident plus a distance driver. Multi-DOF joints compose\n * several DOFs about a shared anchor: `cylindrical` (rotation + slide on one\n * axis, 2 DOF), `planar` (two in-plane translations + a rotation about the\n * normal, 3 DOF), and `spherical` (three rotations about a pivot, 3 DOF).\n *\n * The `dofs` array is the source of truth; `value`/`min`/`max`/`axis` mirror the\n * primary (first) DOF for single-DOF ergonomics and backward compatibility.\n * `joint.dofs` are the stored degrees of freedom, distinct from\n * `AssemblyNode.rotate` (a static structural transform).\n */\n\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A joint axis: a point on the axis line plus a direction. */\nexport interface JointAxis {\n readonly origin: Vec3;\n readonly direction: Vec3;\n}\n\n/** The kind of kinematic joint: revolute, prismatic, cylindrical, planar, or spherical. */\nexport type JointType = 'revolute' | 'prismatic' | 'cylindrical' | 'planar' | 'spherical';\n\n/**\n * A single drivable degree of freedom. A `rotation` DOF turns about the joint's\n * anchor point along `axis` (degrees); a `translation` DOF slides along `axis`\n * (length units). `value` is always clamped to `[min, max]`.\n */\nexport interface JointDOF {\n readonly kind: 'rotation' | 'translation';\n readonly axis: Vec3;\n readonly min: number;\n readonly max: number;\n readonly value: number;\n}\n\n/**\n * A kinematic joint connecting a parent and child body, with its drivable DOFs.\n */\nexport interface Joint {\n readonly type: JointType;\n /** Reference body (stays put); the child moves relative to it. */\n readonly parent: string;\n readonly child: string;\n /** Primary axis; `origin` is the anchor every rotation DOF pivots about. */\n readonly axis: JointAxis;\n /** Primary-DOF range bounds (mirror of `dofs[0]`). */\n readonly min: number;\n readonly max: number;\n /** Primary-DOF value (mirror of `dofs[0]`), always clamped to `[min, max]`. */\n readonly value: number;\n /** All drivable degrees of freedom, in composition order. */\n readonly dofs: readonly JointDOF[];\n /**\n * Optional fixed transform applied to the child frame *after* the joint\n * motion (`childWorld = parentWorld ∘ jointTransform ∘ offset`). Lets a single\n * joint carry a static link offset (e.g. a Denavit-Hartenberg link geometry)\n * without an extra body. Defaults to identity. See `jointsFromDH`.\n */\n readonly offset?: JointPose;\n}\n\n/** A rigid transform: translation + quaternion rotation `[w, x, y, z]`. */\nexport interface JointPose {\n readonly position: Vec3;\n readonly rotation: [number, number, number, number];\n}\n\n/** Options for single-DOF joints: range bounds and initial value. */\nexport interface JointOptions {\n /** Range lower bound. Default: -180 (revolute) / 0 (prismatic). */\n min?: number;\n /** Range upper bound. Default: 180 (revolute) / 100 (prismatic). */\n max?: number;\n /** Initial value, clamped to the range. Default: 0. */\n value?: number;\n}\n\n/** Per-DOF ranges for a cylindrical joint (rotation about + slide along one axis). */\nexport interface CylindricalOptions {\n /** Rotation DOF (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * Translation DOF (length). Default range 0..100, matching `prismaticJoint`\n * (both model a slide along an axis). This is deliberately asymmetric with\n * `planarJoint`'s in-plane translations, which default to -100..100 because\n * an unanchored in-plane slide is naturally bidirectional.\n */\n translation?: JointOptions;\n}\n\n/** Per-DOF ranges for a planar joint (two in-plane translations + a rotation). */\nexport interface PlanarOptions {\n /** Translation along the in-plane `uDirection`. Default range -100..100. */\n u?: JointOptions;\n /** Translation along `normal × u`. Default range -100..100. */\n v?: JointOptions;\n /** Rotation about the plane normal (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * In-plane reference direction for the `u` translation. Projected onto the\n * plane and normalized; defaults to an arbitrary perpendicular of the normal.\n */\n uDirection?: Vec3;\n}\n\n/** Per-DOF ranges for a spherical joint (three rotations about a pivot). */\nexport interface SphericalOptions {\n /** Rotation about local X through the pivot (degrees). Default range -180..180. */\n x?: JointOptions;\n /** Rotation about local Y through the pivot (degrees). Default range -180..180. */\n y?: JointOptions;\n /** Rotation about local Z through the pivot (degrees). Default range -180..180. */\n z?: JointOptions;\n}\n\nconst DEG2RAD = Math.PI / 180;\n\n// ---------------------------------------------------------------------------\n// Construction\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction unit(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2]) || 1;\n return [v[0] / l, v[1] / l, v[2] / l];\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n/** A unit vector perpendicular to `v` (for the unspecified-reference case). */\nfunction anyPerpendicular(v: Vec3): Vec3 {\n const ref: Vec3 = Math.abs(v[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n return unit(cross(v, ref));\n}\n\n/** Build one DOF, normalizing an inverted range and clamping the initial value. */\nfunction makeDof(\n kind: JointDOF['kind'],\n axis: Vec3,\n opts: JointOptions,\n defMin: number,\n defMax: number\n): JointDOF {\n // Normalize the range so an inverted (min > max) input can't break the\n // \"value is always within [min, max]\" invariant.\n const a = opts.min ?? defMin;\n const b = opts.max ?? defMax;\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n return { kind, axis: unit(axis), min, max, value: clamp(opts.value ?? 0, min, max) };\n}\n\n/** Assemble a Joint from its DOFs, mirroring the primary DOF into the top level. */\nfunction buildJoint(\n type: JointType,\n parent: string,\n child: string,\n axis: JointAxis,\n dofs: readonly JointDOF[]\n): Joint {\n const primary = dofs[0] ?? { kind: 'rotation', axis: [0, 0, 1], min: 0, max: 0, value: 0 };\n return {\n type,\n parent,\n child,\n axis: { origin: axis.origin, direction: unit(axis.direction) },\n min: primary.min,\n max: primary.max,\n value: primary.value,\n dofs,\n };\n}\n\n/** A revolute (hinge) joint — the child rotates about `axis` by `value` degrees.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created revolute joint.\n */\nexport function revoluteJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('revolute', parent, child, axis, [\n makeDof('rotation', axis.direction, opts, -180, 180),\n ]);\n}\n\n/**\n * A prismatic (slider) joint — the child translates along `axis` by `value`\n * units. Only `axis.direction` is used; `axis.origin` is ignored (a pure\n * translation has no anchor point), unlike a revolute joint which rotates about\n * the axis line through `origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Slide axis; only `direction` is used.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created prismatic joint.\n */\nexport function prismaticJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('prismatic', parent, child, axis, [\n makeDof('translation', axis.direction, opts, 0, 100),\n ]);\n}\n\n/**\n * A cylindrical joint — the child both rotates about and slides along a single\n * `axis` (2 DOF). DOF order: `[rotation, translation]`. The two motions share\n * the axis, so they commute; rotation pivots about `axis.origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional per-DOF ranges and initial values.\n * @returns The newly created cylindrical joint.\n */\nexport function cylindricalJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: CylindricalOptions = {}\n): Joint {\n return buildJoint('cylindrical', parent, child, axis, [\n makeDof('rotation', axis.direction, opts.rotation ?? {}, -180, 180),\n makeDof('translation', axis.direction, opts.translation ?? {}, 0, 100),\n ]);\n}\n\n/**\n * A planar joint — the child translates within a plane and rotates about its\n * normal (3 DOF). `plane.direction` is the normal; `plane.origin` the rotation\n * anchor. DOF order: `[u-translation, v-translation, rotation]`, where the\n * translations are applied in the plane frame (independent of the rotation).\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param plane - Plane definition; `direction` is the normal, `origin` the anchor.\n * @param opts - Optional per-DOF ranges, initial values, and in-plane axes.\n * @returns The newly created planar joint.\n */\nexport function planarJoint(\n parent: string,\n child: string,\n plane: JointAxis,\n opts: PlanarOptions = {}\n): Joint {\n const normal = unit(plane.direction);\n // Project a requested u-direction onto the plane; fall back to an arbitrary\n // in-plane axis. v completes a right-handed in-plane basis.\n let u: Vec3;\n if (opts.uDirection) {\n const d = opts.uDirection;\n const proj = d[0] * normal[0] + d[1] * normal[1] + d[2] * normal[2];\n const inPlane: Vec3 = [\n d[0] - proj * normal[0],\n d[1] - proj * normal[1],\n d[2] - proj * normal[2],\n ];\n u =\n Math.hypot(inPlane[0], inPlane[1], inPlane[2]) < 1e-9\n ? anyPerpendicular(normal)\n : unit(inPlane);\n } else {\n u = anyPerpendicular(normal);\n }\n const v = unit(cross(normal, u));\n return buildJoint('planar', parent, child, { origin: plane.origin, direction: normal }, [\n makeDof('translation', u, opts.u ?? {}, -100, 100),\n makeDof('translation', v, opts.v ?? {}, -100, 100),\n makeDof('rotation', normal, opts.rotation ?? {}, -180, 180),\n ]);\n}\n\n/**\n * A spherical (ball) joint — the child rotates freely about a pivot point\n * (3 DOF). DOF order: `[x, y, z]` rotations about the local axes through\n * `pivot`, composed as `Rx · Ry · Rz`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param pivot - Pivot point all rotations pass through.\n * @param opts - Optional per-axis ranges and initial values.\n * @returns The newly created spherical joint.\n */\nexport function sphericalJoint(\n parent: string,\n child: string,\n pivot: Vec3,\n opts: SphericalOptions = {}\n): Joint {\n return buildJoint('spherical', parent, child, { origin: pivot, direction: [0, 0, 1] }, [\n makeDof('rotation', [1, 0, 0], opts.x ?? {}, -180, 180),\n makeDof('rotation', [0, 1, 0], opts.y ?? {}, -180, 180),\n makeDof('rotation', [0, 0, 1], opts.z ?? {}, -180, 180),\n ]);\n}\n\n/**\n * Return a copy of `joint` with per-DOF values set (each clamped to its range).\n * Values are positional, matching `joint.dofs`; omitted entries keep their\n * stored value. The primary mirror (`value`) is kept in sync with `dofs[0]`.\n * @param joint - The joint to update.\n * @param values - Positional per-DOF values; omitted entries keep their value.\n * @returns A new joint with the values set.\n */\nexport function setJointValues(joint: Joint, values: readonly number[]): Joint {\n const dofs = joint.dofs.map((d, i) => {\n const v = values[i];\n return v === undefined ? d : { ...d, value: clamp(v, d.min, d.max) };\n });\n const primary = dofs[0];\n return primary ? { ...joint, dofs, value: primary.value } : { ...joint, dofs };\n}\n\n/** Return a copy of `joint` with its primary DOF set (clamped to range).\n * @param joint - The joint to update.\n * @param value - New primary-DOF value.\n * @returns A new joint with the primary value set.\n */\nexport function setJointValue(joint: Joint, value: number): Joint {\n return setJointValues(joint, [value]);\n}\n\n// ---------------------------------------------------------------------------\n// Kinematics\n// ---------------------------------------------------------------------------\n\n/** The local rigid transform contributed by a single DOF at `value`. */\nfunction dofPose(origin: Vec3, dof: JointDOF, value: number): JointPose {\n if (dof.kind === 'translation') {\n // `origin` is intentionally unused: a pure translation has no pivot.\n return {\n position: [dof.axis[0] * value, dof.axis[1] * value, dof.axis[2] * value],\n rotation: [1, 0, 0, 0],\n };\n }\n // Rotation about the axis line through `origin`: p ↦ R·p + (origin − R·origin).\n const rotation = quatFromAxisAngle(dof.axis, value * DEG2RAD);\n const ro = quatRotate(rotation, origin);\n return { position: [origin[0] - ro[0], origin[1] - ro[1], origin[2] - ro[2]], rotation };\n}\n\n/**\n * The child's local rigid transform (relative to the parent) for given DOF\n * values. Defaults to each DOF's stored value. A single `number` overrides only\n * the primary DOF (single-DOF ergonomics); an array overrides positionally,\n * with omitted entries keeping their stored value. Each value is clamped to its\n * DOF range.\n *\n * DOFs are folded in array order via frame composition. For same-anchor\n * rotations (e.g. spherical) this composes to a single rotation about the pivot;\n * for a cylindrical axis the rotation and slide commute.\n * @param joint - The joint to evaluate.\n * @param value - Primary-DOF override (number) or positional per-DOF overrides.\n * @returns The child's local pose relative to the parent.\n */\nexport function jointTransform(\n joint: Joint,\n value: number | readonly number[] = joint.value\n): JointPose {\n const overrides = Array.isArray(value) ? (value as readonly number[]) : undefined;\n const primary = overrides ? undefined : (value as number);\n const origin = joint.axis.origin;\n\n let pose = IDENTITY_POSE;\n for (let i = 0; i < joint.dofs.length; i++) {\n const dof = joint.dofs[i];\n if (!dof) continue;\n const raw = overrides\n ? (overrides[i] ?? dof.value)\n : i === 0\n ? (primary ?? dof.value)\n : dof.value;\n pose = composePose(pose, dofPose(origin, dof, clamp(raw, dof.min, dof.max)));\n }\n return pose;\n}\n\n// ---------------------------------------------------------------------------\n// Assembly integration\n// ---------------------------------------------------------------------------\n\n/** Attach a joint to an assembly node. Returns a new node (immutable).\n * @param assembly - The assembly node to attach the joint to.\n * @param joint - The joint to attach.\n * @returns A new node with the joint added.\n */\nexport function addJoint(assembly: AssemblyNode, joint: Joint): AssemblyNode {\n const existing = (assembly.joints ?? []) as readonly Joint[];\n return { ...assembly, joints: [...existing, joint] };\n}\n\n// ---------------------------------------------------------------------------\n// Forward kinematics\n// ---------------------------------------------------------------------------\n\nconst IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\n/** Compose two poses: the result applies `b` in `a`'s frame (`a ∘ b`). */\nfunction composePose(a: JointPose, b: JointPose): JointPose {\n const rb = quatRotate(a.rotation, b.position);\n return {\n position: [a.position[0] + rb[0], a.position[1] + rb[1], a.position[2] + rb[2]],\n rotation: quatMultiply(a.rotation, b.rotation),\n };\n}\n\n/** Collect every joint attached anywhere in the assembly tree. */\nfunction collectJoints(assembly: AssemblyNode): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (node) => {\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n return joints;\n}\n\n/**\n * Forward kinematics: set joint values and propagate world poses down the\n * kinematic chain. Each joint's axis is interpreted in its **parent's** frame,\n * so a child's world pose is `parentWorld ∘ jointTransform(joint, value)`.\n *\n * Bodies not driven by a joint (chain roots) start at the origin. `jointValues`\n * overrides a joint's stored value, keyed by the **child** node name; omitted\n * joints use `joint.value`. Resolution is topological (reuses the Phase-0\n * ordering), so chains of any depth compose. Returns a world pose for every node.\n * @param assembly - The assembly to solve.\n * @param jointValues - Optional value overrides keyed by child node name.\n * @returns A world pose for every node in the assembly.\n */\nexport function forwardKinematics(\n assembly: AssemblyNode,\n jointValues: Readonly<Record<string, number | readonly number[]>> = {}\n): Map<string, JointPose> {\n // Single pass: gather joints and node names together.\n const joints: Joint[] = [];\n const names = new Set<string>();\n walkAssembly(assembly, (node) => {\n names.add(node.name);\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) {\n byChild.set(j.child, j);\n names.add(j.parent);\n names.add(j.child);\n }\n\n const poses = new Map<string, JointPose>();\n // Roots: any node not driven by a joint sits at the origin.\n for (const name of names) if (!byChild.has(name)) poses.set(name, IDENTITY_POSE);\n\n // Propagate down the joint graph: a joint resolves once its parent is placed.\n const pending = [...joints];\n let progress = true;\n while (progress && pending.length > 0) {\n progress = false;\n for (let i = pending.length - 1; i >= 0; i--) {\n const j = pending[i];\n if (!j) continue;\n const parentPose = poses.get(j.parent);\n if (!parentPose) continue; // parent not placed yet — defer\n pending.splice(i, 1);\n progress = true;\n if (poses.has(j.child)) continue; // already placed (duplicate/cycle) — skip\n const value = jointValues[j.child] ?? j.value;\n const local = j.offset\n ? composePose(jointTransform(j, value), j.offset)\n : jointTransform(j, value);\n poses.set(j.child, composePose(parentPose, local));\n }\n }\n // A joint whose parent never resolved (cycle/dangling) still gets an entry so\n // the map covers every node.\n for (const j of pending) if (!poses.has(j.child)) poses.set(j.child, IDENTITY_POSE);\n\n return poses;\n}\n\n/**\n * Open-chain mobility — the number of independent degrees of freedom, summing\n * each joint's DOF count (revolute/prismatic 1, cylindrical 2, planar/spherical\n * 3). For a serial chain this equals the total DOF. (Closed-loop\n * Grübler/Kutzbach analysis is future work.)\n * @param assembly - The assembly to analyze.\n * @returns Total number of independent degrees of freedom.\n */\nexport function mechanismDOF(assembly: AssemblyNode): number {\n return collectJoints(assembly).reduce((sum, j) => sum + j.dofs.length, 0);\n}\n\n/**\n * Inverse kinematics and motion trajectories for joint chains.\n *\n * `inverseKinematics` solves for the joint values that place an end-effector at\n * a target pose, using a damped-least-squares (Levenberg-Marquardt) update over\n * a numerically-differentiated Jacobian. Differentiating through\n * `forwardKinematics` keeps the solver agnostic to joint type — revolute,\n * prismatic, and the multi-DOF cylindrical/planar/spherical joints all\n * contribute their `dofs` uniformly — and respects each DOF's range by clamping\n * every iterate.\n *\n * `jointTrajectory` samples a straight-line path in joint space between two\n * configurations, returning the posed assembly (via forward kinematics) at each\n * step — the building block for animation and reachable-workspace sweeps.\n */\n\n\ntype Quat = readonly [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A target for the end-effector: a world position, optionally an orientation. */\nexport interface IKTarget {\n readonly position: Vec3;\n /** Target orientation `[w, x, y, z]`. Omit for position-only IK. */\n readonly rotation?: Quat;\n}\n\n/** Options for the inverse-kinematics solver (iterations, tolerance, damping, seed). */\nexport interface IKOptions {\n /** Maximum solver iterations. Default 200. */\n maxIterations?: number;\n /** Convergence threshold on the residual norm. Default 1e-5. */\n tolerance?: number;\n /** Damping factor λ for the least-squares step. Default 0.05. */\n damping?: number;\n /** Initial joint values, keyed by child node (number or per-DOF array). */\n seed?: Readonly<Record<string, number | readonly number[]>>;\n /** Local point on the end-effector node to drive to the target. Default origin. */\n tip?: Vec3;\n}\n\n/** Outcome of an inverse-kinematics solve: values, convergence, and residual. */\nexport interface IKResult {\n /** Solved joint values, keyed by child node, one entry per DOF. */\n readonly values: Record<string, number[]>;\n readonly converged: boolean;\n readonly iterations: number;\n /** Final residual norm (position, plus orientation when targeted). */\n readonly error: number;\n}\n\n// ---------------------------------------------------------------------------\n// Small vector / quaternion helpers\n// ---------------------------------------------------------------------------\n\nconst IK_IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\nfunction applyPose(pose: JointPose, p: Vec3): Vec3 {\n const r = quatRotate(pose.rotation, p);\n return [r[0] + pose.position[0], r[1] + pose.position[1], r[2] + pose.position[2]];\n}\n\nfunction quatConjugate(q: Quat): Quat {\n return [q[0], -q[1], -q[2], -q[3]];\n}\n\n/**\n * The rotation vector (axis · angle) taking orientation `from` to `to`, i.e. the\n * angular error that drives `from` toward `to`. Returns the zero vector when the\n * orientations coincide.\n */\nfunction rotationError(from: Quat, to: Quat): Vec3 {\n const d = quatMultiply(to, quatConjugate(from));\n let [w, x, y, z] = d;\n const norm = Math.hypot(w, x, y, z) || 1;\n w /= norm;\n x /= norm;\n y /= norm;\n z /= norm;\n if (w < 0) {\n // Shortest path: q and -q represent the same rotation.\n w = -w;\n x = -x;\n y = -y;\n z = -z;\n }\n const s = Math.hypot(x, y, z);\n if (s < 1e-12) return [0, 0, 0];\n const angle = 2 * Math.atan2(s, w);\n const k = angle / s;\n return [x * k, y * k, z * k];\n}\n\n// ---------------------------------------------------------------------------\n// Chain extraction\n// ---------------------------------------------------------------------------\n\n/** Joints from the root down to `endEffector`, in root→leaf order. */\nfunction chainTo(assembly: AssemblyNode, endEffector: string): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) byChild.set(j.child, j);\n\n const chain: Joint[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = endEffector;\n while (cur && byChild.has(cur) && !seen.has(cur)) {\n seen.add(cur);\n const j = byChild.get(cur);\n if (!j) break;\n chain.push(j);\n cur = j.parent;\n }\n return chain.reverse();\n}\n\n// ---------------------------------------------------------------------------\n// Linear algebra (small dense systems, Float64Array to avoid index-undefined)\n// ---------------------------------------------------------------------------\n\n/** Read a Float64Array element as a definite number (dense matrices are full). */\nfunction el(a: Float64Array, i: number): number {\n return a[i] ?? 0;\n}\n\n/** Solve `A x = b` for an `n×n` system by Gauss-Jordan with partial pivoting. */\nfunction solveLinear(A: Float64Array, b: Float64Array, n: number): Float64Array | null {\n const w = n + 1;\n const M = new Float64Array(n * w);\n for (let r = 0; r < n; r++) {\n for (let c = 0; c < n; c++) M[r * w + c] = el(A, r * n + c);\n M[r * w + n] = el(b, r);\n }\n for (let col = 0; col < n; col++) {\n let piv = col;\n for (let r = col + 1; r < n; r++) {\n if (Math.abs(el(M, r * w + col)) > Math.abs(el(M, piv * w + col))) piv = r;\n }\n if (Math.abs(el(M, piv * w + col)) < 1e-12) return null;\n if (piv !== col) {\n for (let k = col; k < w; k++) {\n const tmp = el(M, col * w + k);\n M[col * w + k] = el(M, piv * w + k);\n M[piv * w + k] = tmp;\n }\n }\n const d = el(M, col * w + col);\n for (let k = col; k < w; k++) M[col * w + k] = el(M, col * w + k) / d;\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const f = el(M, r * w + col);\n if (f === 0) continue;\n for (let k = col; k < w; k++) M[r * w + k] = el(M, r * w + k) - f * el(M, col * w + k);\n }\n }\n const x = new Float64Array(n);\n for (let r = 0; r < n; r++) x[r] = el(M, r * w + n);\n return x;\n}\n\n// ---------------------------------------------------------------------------\n// Inverse kinematics\n// ---------------------------------------------------------------------------\n\ninterface FlatChain {\n /** Joint segments in root→leaf order, each owning `count` consecutive DOFs. */\n readonly segments: ReadonlyArray<{ child: string; count: number }>;\n /** Current parameter vector (one entry per DOF). */\n readonly q: Float64Array;\n /** Per-DOF lower and upper bounds. */\n readonly lo: Float64Array;\n readonly hi: Float64Array;\n}\n\n/** Flatten a chain's DOFs into a parameter vector with bounds, applying the seed. */\nfunction flattenChain(\n chain: readonly Joint[],\n seed?: Readonly<Record<string, number | readonly number[]>>\n): FlatChain {\n const segments: Array<{ child: string; count: number }> = [];\n const q: number[] = [];\n const lo: number[] = [];\n const hi: number[] = [];\n for (const j of chain) {\n const s = seed?.[j.child];\n segments.push({ child: j.child, count: j.dofs.length });\n j.dofs.forEach((dof, i) => {\n const seeded = Array.isArray(s) ? s[i] : i === 0 ? (s as number | undefined) : undefined;\n const v = seeded ?? dof.value;\n q.push(Math.min(dof.max, Math.max(dof.min, v)));\n lo.push(dof.min);\n hi.push(dof.max);\n });\n }\n return {\n segments,\n q: Float64Array.from(q),\n lo: Float64Array.from(lo),\n hi: Float64Array.from(hi),\n };\n}\n\n/** Slice a parameter vector back into per-joint value arrays keyed by child. */\nfunction overridesOf(segments: FlatChain['segments'], q: Float64Array): Record<string, number[]> {\n const out: Record<string, number[]> = {};\n let i = 0;\n for (const seg of segments) {\n const vals: number[] = [];\n for (let k = 0; k < seg.count; k++) vals.push(el(q, i++));\n out[seg.child] = vals;\n }\n return out;\n}\n\n/** Residual twist `e` (target − current) for a pose; returns its norm. */\nfunction residualTwist(\n out: Float64Array,\n pose: JointPose,\n target: IKTarget,\n tip: Vec3,\n m: number\n): number {\n const pos = applyPose(pose, tip);\n out[0] = target.position[0] - pos[0];\n out[1] = target.position[1] - pos[1];\n out[2] = target.position[2] - pos[2];\n if (m === 6 && target.rotation) {\n const r = rotationError(pose.rotation, target.rotation);\n out[3] = r[0];\n out[4] = r[1];\n out[5] = r[2];\n }\n let s = 0;\n for (let i = 0; i < m; i++) s += el(out, i) ** 2;\n return Math.sqrt(s);\n}\n\n/**\n * Finite-difference Jacobian: column `j` is the end-effector twist from δq[j].\n * The probe steps *inward* from a bound — `forwardKinematics` clamps each DOF to\n * its range, so a forward `+eps` at the upper limit would yield a zero column and\n * trap the solver at the ceiling. Stepping `-eps` there (and dividing by the\n * signed step) keeps every column a true one-sided derivative.\n */\nfunction fillJacobian(\n J: Float64Array,\n q: Float64Array,\n n: number,\n m: number,\n lo: Float64Array,\n hi: Float64Array,\n base: JointPose,\n tip: Vec3,\n eps: number,\n tipPose: (s: Float64Array) => JointPose\n): void {\n const basePos = applyPose(base, tip);\n for (let j = 0; j < n; j++) {\n const saved = el(q, j);\n // Step away from whichever bound we're against so the perturbation isn't\n // clamped to a no-op; default forward.\n const h = saved + eps > el(hi, j) && saved - eps >= el(lo, j) ? -eps : eps;\n q[j] = saved + h;\n const p2 = tipPose(q);\n q[j] = saved;\n const pos2 = applyPose(p2, tip);\n J[j] = (pos2[0] - basePos[0]) / h;\n J[n + j] = (pos2[1] - basePos[1]) / h;\n J[2 * n + j] = (pos2[2] - basePos[2]) / h;\n if (m === 6) {\n const dr = rotationError(base.rotation, p2.rotation);\n J[3 * n + j] = dr[0] / h;\n J[4 * n + j] = dr[1] / h;\n J[5 * n + j] = dr[2] / h;\n }\n }\n}\n\n/** One damped-least-squares step: `Δq = Jᵀ(JJᵀ + λ²I)⁻¹ e`. */\nfunction dlsStep(\n J: Float64Array,\n e: Float64Array,\n n: number,\n m: number,\n lambda: number\n): Float64Array | null {\n const A = new Float64Array(m * m);\n const lam2 = lambda * lambda;\n for (let r = 0; r < m; r++) {\n for (let c = 0; c < m; c++) {\n let s = 0;\n for (let k = 0; k < n; k++) s += el(J, r * n + k) * el(J, c * n + k);\n A[r * m + c] = s + (r === c ? lam2 : 0);\n }\n }\n const y = solveLinear(A, e, m);\n if (!y) return null;\n const dq = new Float64Array(n);\n for (let j = 0; j < n; j++) {\n let v = 0;\n for (let r = 0; r < m; r++) v += el(J, r * n + j) * el(y, r);\n dq[j] = v;\n }\n return dq;\n}\n\n/**\n * Solve for the joint values that place `endEffector` (offset by `tip`) at\n * `target`, by damped-least-squares descent on a numerical Jacobian. Joint\n * ranges are honored: every iterate is clamped to each DOF's `[min, max]`.\n *\n * Returns the solved per-DOF values keyed by child node (ready to pass to\n * `forwardKinematics`), whether it converged, the iteration count, and the final\n * residual norm. An end-effector with no driving joints, or an unreachable\n * target, returns `converged: false` with the best configuration found.\n * @param assembly - The assembly containing the kinematic chain.\n * @param endEffector - Name of the end-effector node.\n * @param target - Target world pose for the end-effector.\n * @param options - Optional solver settings (iterations, tolerance, damping, seed, tip).\n * @returns The solved joint values and convergence diagnostics.\n */\nexport function inverseKinematics(\n assembly: AssemblyNode,\n endEffector: string,\n target: IKTarget,\n options: IKOptions = {}\n): IKResult {\n const maxIterations = options.maxIterations ?? 200;\n const tolerance = options.tolerance ?? 1e-5;\n const lambda = options.damping ?? 0.05;\n const tip: Vec3 = options.tip ?? [0, 0, 0];\n const m = target.rotation !== undefined ? 6 : 3;\n const eps = 1e-6;\n\n const { segments, q, lo, hi } = flattenChain(chainTo(assembly, endEffector), options.seed);\n const n = q.length;\n\n const tipPose = (state: Float64Array): JointPose =>\n forwardKinematics(assembly, overridesOf(segments, state)).get(endEffector) ?? IK_IDENTITY_POSE;\n\n const e = new Float64Array(m);\n const J = new Float64Array(m * n);\n\n let pose = tipPose(q);\n let err = residualTwist(e, pose, target, tip, m);\n let iter = 0;\n\n for (; iter < maxIterations && n > 0 && err > tolerance; iter++) {\n fillJacobian(J, q, n, m, lo, hi, pose, tip, eps, tipPose);\n const dq = dlsStep(J, e, n, m, lambda);\n if (!dq) break;\n for (let j = 0; j < n; j++) {\n const next = el(q, j) + el(dq, j);\n q[j] = Math.min(el(hi, j), Math.max(el(lo, j), next));\n }\n pose = tipPose(q);\n err = residualTwist(e, pose, target, tip, m);\n }\n\n return {\n values: overridesOf(segments, q),\n converged: err <= tolerance,\n iterations: iter,\n error: err,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Trajectories\n// ---------------------------------------------------------------------------\n\n/** One sample of a joint-space trajectory: parameter, values, and world poses. */\nexport interface TrajectorySample {\n /** Normalized path parameter in `[0, 1]`. */\n readonly t: number;\n /** Interpolated joint values at this step, keyed by child node. */\n readonly values: Record<string, number[]>;\n /** Forward-kinematics world poses for every node at this step. */\n readonly poses: Map<string, JointPose>;\n}\n\n/** Resolve a value spec (number, array, or absent) to a per-DOF array. */\nfunction valuesOf(joint: Joint, spec: number | readonly number[] | undefined): number[] {\n return joint.dofs.map((dof, i) => {\n const raw = Array.isArray(spec) ? spec[i] : i === 0 ? (spec as number | undefined) : undefined;\n const v = raw ?? dof.value;\n return Math.min(dof.max, Math.max(dof.min, v));\n });\n}\n\n/**\n * Sample a straight-line path in joint space from `from` to `to` over `steps`\n * segments, yielding `steps + 1` samples (inclusive of both endpoints). Each\n * sample carries the interpolated per-DOF values (clamped to range) and the\n * forward-kinematics poses of every node. Joints absent from `from`/`to` hold\n * their stored value at both ends.\n * @param assembly - The assembly to pose at each sample.\n * @param from - Starting joint values keyed by child node name.\n * @param to - Ending joint values keyed by child node name.\n * @param steps - Number of path segments (samples are `steps + 1`).\n * @returns The trajectory samples with interpolated values and poses.\n */\nexport function jointTrajectory(\n assembly: AssemblyNode,\n from: Readonly<Record<string, number | readonly number[]>>,\n to: Readonly<Record<string, number | readonly number[]>>,\n steps: number\n): TrajectorySample[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n\n const ends = joints.map((j) => ({\n child: j.child,\n a: valuesOf(j, from[j.child]),\n b: valuesOf(j, to[j.child]),\n }));\n\n const count = Math.max(1, Math.floor(steps));\n const samples: TrajectorySample[] = [];\n for (let s = 0; s <= count; s++) {\n const t = s / count;\n const values: Record<string, number[]> = {};\n for (const end of ends) {\n values[end.child] = end.a.map((a, i) => a + ((end.b[i] ?? a) - a) * t);\n }\n samples.push({ t, values, poses: forwardKinematics(assembly, values) });\n }\n return samples;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"joints-kinematics.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/joints-kinematics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kinematic joints + IK — core 自有实现(§5.6.3 移植:brepjs jointFns + ikFns 逐字对齐)。\n *\n * 移植来源:packages/brepjs/src/operations/{jointFns,ikFns}.ts(纯算法零 kernel 依赖,\n * 仅用 quat 与 assembly-tree;Phase 5 随 brepjs 包删除前已做 parity 对拍)。\n */\nimport { quatFromAxisAngle, quatRotate, quatMultiply } from './quat'\nimport type { AssemblyNode, Vec3 } from './assembly-tree'\nimport { walkAssembly } from './assembly-tree'\n\n/**\n * Drivable kinematic joints — built on the assembly tree. A joint connects a\n * `parent` (reference) body to a `child` (moving) body and carries one or more\n * drivable degrees of freedom (DOF), each clamped to its own range.\n *\n * Single-DOF joints (`revolute`, `prismatic`) are sugar over the Phase-1 mate\n * constraints — a revolute is concentric (axis alignment) plus an angle driver;\n * a prismatic is coincident plus a distance driver. Multi-DOF joints compose\n * several DOFs about a shared anchor: `cylindrical` (rotation + slide on one\n * axis, 2 DOF), `planar` (two in-plane translations + a rotation about the\n * normal, 3 DOF), and `spherical` (three rotations about a pivot, 3 DOF).\n *\n * The `dofs` array is the source of truth; `value`/`min`/`max`/`axis` mirror the\n * primary (first) DOF for single-DOF ergonomics and backward compatibility.\n * `joint.dofs` are the stored degrees of freedom, distinct from\n * `AssemblyNode.rotate` (a static structural transform).\n */\n\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A joint axis: a point on the axis line plus a direction. */\nexport interface JointAxis {\n readonly origin: Vec3;\n readonly direction: Vec3;\n}\n\n/** The kind of kinematic joint: revolute, prismatic, cylindrical, planar, or spherical. */\nexport type JointType = 'revolute' | 'prismatic' | 'cylindrical' | 'planar' | 'spherical';\n\n/**\n * A single drivable degree of freedom. A `rotation` DOF turns about the joint's\n * anchor point along `axis` (degrees); a `translation` DOF slides along `axis`\n * (length units). `value` is always clamped to `[min, max]`.\n */\nexport interface JointDOF {\n readonly kind: 'rotation' | 'translation';\n readonly axis: Vec3;\n readonly min: number;\n readonly max: number;\n readonly value: number;\n}\n\n/**\n * A kinematic joint connecting a parent and child body, with its drivable DOFs.\n */\nexport interface Joint {\n readonly type: JointType;\n /** Reference body (stays put); the child moves relative to it. */\n readonly parent: string;\n readonly child: string;\n /** Primary axis; `origin` is the anchor every rotation DOF pivots about. */\n readonly axis: JointAxis;\n /** Primary-DOF range bounds (mirror of `dofs[0]`). */\n readonly min: number;\n readonly max: number;\n /** Primary-DOF value (mirror of `dofs[0]`), always clamped to `[min, max]`. */\n readonly value: number;\n /** All drivable degrees of freedom, in composition order. */\n readonly dofs: readonly JointDOF[];\n /**\n * Optional fixed transform applied to the child frame *after* the joint\n * motion (`childWorld = parentWorld ∘ jointTransform ∘ offset`). Lets a single\n * joint carry a static link offset (e.g. a Denavit-Hartenberg link geometry)\n * without an extra body. Defaults to identity. See `jointsFromDH`.\n */\n readonly offset?: JointPose;\n}\n\n/** A rigid transform: translation + quaternion rotation `[w, x, y, z]`. */\nexport interface JointPose {\n readonly position: Vec3;\n readonly rotation: [number, number, number, number];\n}\n\n/** Options for single-DOF joints: range bounds and initial value. */\nexport interface JointOptions {\n /** Range lower bound. Default: -180 (revolute) / 0 (prismatic). */\n min?: number;\n /** Range upper bound. Default: 180 (revolute) / 100 (prismatic). */\n max?: number;\n /** Initial value, clamped to the range. Default: 0. */\n value?: number;\n}\n\n/** Per-DOF ranges for a cylindrical joint (rotation about + slide along one axis). */\nexport interface CylindricalOptions {\n /** Rotation DOF (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * Translation DOF (length). Default range 0..100, matching `prismaticJoint`\n * (both model a slide along an axis). This is deliberately asymmetric with\n * `planarJoint`'s in-plane translations, which default to -100..100 because\n * an unanchored in-plane slide is naturally bidirectional.\n */\n translation?: JointOptions;\n}\n\n/** Per-DOF ranges for a planar joint (two in-plane translations + a rotation). */\nexport interface PlanarOptions {\n /** Translation along the in-plane `uDirection`. Default range -100..100. */\n u?: JointOptions;\n /** Translation along `normal × u`. Default range -100..100. */\n v?: JointOptions;\n /** Rotation about the plane normal (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * In-plane reference direction for the `u` translation. Projected onto the\n * plane and normalized; defaults to an arbitrary perpendicular of the normal.\n */\n uDirection?: Vec3;\n}\n\n/** Per-DOF ranges for a spherical joint (three rotations about a pivot). */\nexport interface SphericalOptions {\n /** Rotation about local X through the pivot (degrees). Default range -180..180. */\n x?: JointOptions;\n /** Rotation about local Y through the pivot (degrees). Default range -180..180. */\n y?: JointOptions;\n /** Rotation about local Z through the pivot (degrees). Default range -180..180. */\n z?: JointOptions;\n}\n\nconst DEG2RAD = Math.PI / 180;\n\n// ---------------------------------------------------------------------------\n// Construction\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction unit(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2]) || 1;\n return [v[0] / l, v[1] / l, v[2] / l];\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n/** A unit vector perpendicular to `v` (for the unspecified-reference case). */\nfunction anyPerpendicular(v: Vec3): Vec3 {\n const ref: Vec3 = Math.abs(v[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n return unit(cross(v, ref));\n}\n\n/** Build one DOF, normalizing an inverted range and clamping the initial value. */\nfunction makeDof(\n kind: JointDOF['kind'],\n axis: Vec3,\n opts: JointOptions,\n defMin: number,\n defMax: number\n): JointDOF {\n // Normalize the range so an inverted (min > max) input can't break the\n // \"value is always within [min, max]\" invariant.\n const a = opts.min ?? defMin;\n const b = opts.max ?? defMax;\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n return { kind, axis: unit(axis), min, max, value: clamp(opts.value ?? 0, min, max) };\n}\n\n/** Assemble a Joint from its DOFs, mirroring the primary DOF into the top level. */\nfunction buildJoint(\n type: JointType,\n parent: string,\n child: string,\n axis: JointAxis,\n dofs: readonly JointDOF[]\n): Joint {\n const primary = dofs[0] ?? { kind: 'rotation', axis: [0, 0, 1], min: 0, max: 0, value: 0 };\n return {\n type,\n parent,\n child,\n axis: { origin: axis.origin, direction: unit(axis.direction) },\n min: primary.min,\n max: primary.max,\n value: primary.value,\n dofs,\n };\n}\n\n/** A revolute (hinge) joint — the child rotates about `axis` by `value` degrees.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created revolute joint.\n */\nexport function revoluteJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('revolute', parent, child, axis, [\n makeDof('rotation', axis.direction, opts, -180, 180),\n ]);\n}\n\n/**\n * A prismatic (slider) joint — the child translates along `axis` by `value`\n * units. Only `axis.direction` is used; `axis.origin` is ignored (a pure\n * translation has no anchor point), unlike a revolute joint which rotates about\n * the axis line through `origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Slide axis; only `direction` is used.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created prismatic joint.\n */\nexport function prismaticJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('prismatic', parent, child, axis, [\n makeDof('translation', axis.direction, opts, 0, 100),\n ]);\n}\n\n/**\n * A cylindrical joint — the child both rotates about and slides along a single\n * `axis` (2 DOF). DOF order: `[rotation, translation]`. The two motions share\n * the axis, so they commute; rotation pivots about `axis.origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional per-DOF ranges and initial values.\n * @returns The newly created cylindrical joint.\n */\nexport function cylindricalJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: CylindricalOptions = {}\n): Joint {\n return buildJoint('cylindrical', parent, child, axis, [\n makeDof('rotation', axis.direction, opts.rotation ?? {}, -180, 180),\n makeDof('translation', axis.direction, opts.translation ?? {}, 0, 100),\n ]);\n}\n\n/**\n * A planar joint — the child translates within a plane and rotates about its\n * normal (3 DOF). `plane.direction` is the normal; `plane.origin` the rotation\n * anchor. DOF order: `[u-translation, v-translation, rotation]`, where the\n * translations are applied in the plane frame (independent of the rotation).\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param plane - Plane definition; `direction` is the normal, `origin` the anchor.\n * @param opts - Optional per-DOF ranges, initial values, and in-plane axes.\n * @returns The newly created planar joint.\n */\nexport function planarJoint(\n parent: string,\n child: string,\n plane: JointAxis,\n opts: PlanarOptions = {}\n): Joint {\n const normal = unit(plane.direction);\n // Project a requested u-direction onto the plane; fall back to an arbitrary\n // in-plane axis. v completes a right-handed in-plane basis.\n let u: Vec3;\n if (opts.uDirection) {\n const d = opts.uDirection;\n const proj = d[0] * normal[0] + d[1] * normal[1] + d[2] * normal[2];\n const inPlane: Vec3 = [\n d[0] - proj * normal[0],\n d[1] - proj * normal[1],\n d[2] - proj * normal[2],\n ];\n u =\n Math.hypot(inPlane[0], inPlane[1], inPlane[2]) < 1e-9\n ? anyPerpendicular(normal)\n : unit(inPlane);\n } else {\n u = anyPerpendicular(normal);\n }\n const v = unit(cross(normal, u));\n return buildJoint('planar', parent, child, { origin: plane.origin, direction: normal }, [\n makeDof('translation', u, opts.u ?? {}, -100, 100),\n makeDof('translation', v, opts.v ?? {}, -100, 100),\n makeDof('rotation', normal, opts.rotation ?? {}, -180, 180),\n ]);\n}\n\n/**\n * A spherical (ball) joint — the child rotates freely about a pivot point\n * (3 DOF). DOF order: `[x, y, z]` rotations about the local axes through\n * `pivot`, composed as `Rx · Ry · Rz`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param pivot - Pivot point all rotations pass through.\n * @param opts - Optional per-axis ranges and initial values.\n * @returns The newly created spherical joint.\n */\nexport function sphericalJoint(\n parent: string,\n child: string,\n pivot: Vec3,\n opts: SphericalOptions = {}\n): Joint {\n return buildJoint('spherical', parent, child, { origin: pivot, direction: [0, 0, 1] }, [\n makeDof('rotation', [1, 0, 0], opts.x ?? {}, -180, 180),\n makeDof('rotation', [0, 1, 0], opts.y ?? {}, -180, 180),\n makeDof('rotation', [0, 0, 1], opts.z ?? {}, -180, 180),\n ]);\n}\n\n/**\n * Return a copy of `joint` with per-DOF values set (each clamped to its range).\n * Values are positional, matching `joint.dofs`; omitted entries keep their\n * stored value. The primary mirror (`value`) is kept in sync with `dofs[0]`.\n * @param joint - The joint to update.\n * @param values - Positional per-DOF values; omitted entries keep their value.\n * @returns A new joint with the values set.\n */\nexport function setJointValues(joint: Joint, values: readonly number[]): Joint {\n const dofs = joint.dofs.map((d, i) => {\n const v = values[i];\n return v === undefined ? d : { ...d, value: clamp(v, d.min, d.max) };\n });\n const primary = dofs[0];\n return primary ? { ...joint, dofs, value: primary.value } : { ...joint, dofs };\n}\n\n/** Return a copy of `joint` with its primary DOF set (clamped to range).\n * @param joint - The joint to update.\n * @param value - New primary-DOF value.\n * @returns A new joint with the primary value set.\n */\nexport function setJointValue(joint: Joint, value: number): Joint {\n return setJointValues(joint, [value]);\n}\n\n// ---------------------------------------------------------------------------\n// Kinematics\n// ---------------------------------------------------------------------------\n\n/** The local rigid transform contributed by a single DOF at `value`. */\nfunction dofPose(origin: Vec3, dof: JointDOF, value: number): JointPose {\n if (dof.kind === 'translation') {\n // `origin` is intentionally unused: a pure translation has no pivot.\n return {\n position: [dof.axis[0] * value, dof.axis[1] * value, dof.axis[2] * value],\n rotation: [1, 0, 0, 0],\n };\n }\n // Rotation about the axis line through `origin`: p ↦ R·p + (origin − R·origin).\n const rotation = quatFromAxisAngle(dof.axis, value * DEG2RAD);\n const ro = quatRotate(rotation, origin);\n return { position: [origin[0] - ro[0], origin[1] - ro[1], origin[2] - ro[2]], rotation };\n}\n\n/**\n * The child's local rigid transform (relative to the parent) for given DOF\n * values. Defaults to each DOF's stored value. A single `number` overrides only\n * the primary DOF (single-DOF ergonomics); an array overrides positionally,\n * with omitted entries keeping their stored value. Each value is clamped to its\n * DOF range.\n *\n * DOFs are folded in array order via frame composition. For same-anchor\n * rotations (e.g. spherical) this composes to a single rotation about the pivot;\n * for a cylindrical axis the rotation and slide commute.\n * @param joint - The joint to evaluate.\n * @param value - Primary-DOF override (number) or positional per-DOF overrides.\n * @returns The child's local pose relative to the parent.\n */\nexport function jointTransform(\n joint: Joint,\n value: number | readonly number[] = joint.value\n): JointPose {\n const overrides = Array.isArray(value) ? (value as readonly number[]) : undefined;\n const primary = overrides ? undefined : (value as number);\n const origin = joint.axis.origin;\n\n let pose = IDENTITY_POSE;\n for (let i = 0; i < joint.dofs.length; i++) {\n const dof = joint.dofs[i];\n if (!dof) continue;\n const raw = overrides\n ? (overrides[i] ?? dof.value)\n : i === 0\n ? (primary ?? dof.value)\n : dof.value;\n pose = composePose(pose, dofPose(origin, dof, clamp(raw, dof.min, dof.max)));\n }\n return pose;\n}\n\n// ---------------------------------------------------------------------------\n// Assembly integration\n// ---------------------------------------------------------------------------\n\n/** Attach a joint to an assembly node. Returns a new node (immutable).\n * @param assembly - The assembly node to attach the joint to.\n * @param joint - The joint to attach.\n * @returns A new node with the joint added.\n */\nexport function addJoint(assembly: AssemblyNode, joint: Joint): AssemblyNode {\n const existing = (assembly.joints ?? []) as readonly Joint[];\n return { ...assembly, joints: [...existing, joint] };\n}\n\n// ---------------------------------------------------------------------------\n// Forward kinematics\n// ---------------------------------------------------------------------------\n\nconst IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\n/** Compose two poses: the result applies `b` in `a`'s frame (`a ∘ b`). */\nfunction composePose(a: JointPose, b: JointPose): JointPose {\n const rb = quatRotate(a.rotation, b.position);\n return {\n position: [a.position[0] + rb[0], a.position[1] + rb[1], a.position[2] + rb[2]],\n rotation: quatMultiply(a.rotation, b.rotation),\n };\n}\n\n/** Collect every joint attached anywhere in the assembly tree. */\nfunction collectJoints(assembly: AssemblyNode): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (node) => {\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n return joints;\n}\n\n/**\n * Forward kinematics: set joint values and propagate world poses down the\n * kinematic chain. Each joint's axis is interpreted in its **parent's** frame,\n * so a child's world pose is `parentWorld ∘ jointTransform(joint, value)`.\n *\n * Bodies not driven by a joint (chain roots) start at the origin. `jointValues`\n * overrides a joint's stored value, keyed by the **child** node name; omitted\n * joints use `joint.value`. Resolution is topological (reuses the Phase-0\n * ordering), so chains of any depth compose. Returns a world pose for every node.\n * @param assembly - The assembly to solve.\n * @param jointValues - Optional value overrides keyed by child node name.\n * @returns A world pose for every node in the assembly.\n */\nexport function forwardKinematics(\n assembly: AssemblyNode,\n jointValues: Readonly<Record<string, number | readonly number[]>> = {}\n): Map<string, JointPose> {\n // Single pass: gather joints and node names together.\n const joints: Joint[] = [];\n const names = new Set<string>();\n walkAssembly(assembly, (node) => {\n names.add(node.name);\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) {\n byChild.set(j.child, j);\n names.add(j.parent);\n names.add(j.child);\n }\n\n const poses = new Map<string, JointPose>();\n // Roots: any node not driven by a joint sits at the origin.\n for (const name of names) if (!byChild.has(name)) poses.set(name, IDENTITY_POSE);\n\n // Propagate down the joint graph: a joint resolves once its parent is placed.\n const pending = [...joints];\n let progress = true;\n while (progress && pending.length > 0) {\n progress = false;\n for (let i = pending.length - 1; i >= 0; i--) {\n const j = pending[i];\n if (!j) continue;\n const parentPose = poses.get(j.parent);\n if (!parentPose) continue; // parent not placed yet — defer\n pending.splice(i, 1);\n progress = true;\n if (poses.has(j.child)) continue; // already placed (duplicate/cycle) — skip\n const value = jointValues[j.child] ?? j.value;\n const local = j.offset\n ? composePose(jointTransform(j, value), j.offset)\n : jointTransform(j, value);\n poses.set(j.child, composePose(parentPose, local));\n }\n }\n // A joint whose parent never resolved (cycle/dangling) still gets an entry so\n // the map covers every node.\n for (const j of pending) if (!poses.has(j.child)) poses.set(j.child, IDENTITY_POSE);\n\n return poses;\n}\n\n/**\n * Open-chain mobility — the number of independent degrees of freedom, summing\n * each joint's DOF count (revolute/prismatic 1, cylindrical 2, planar/spherical\n * 3). For a serial chain this equals the total DOF. (Closed-loop\n * Grübler/Kutzbach analysis is future work.)\n * @param assembly - The assembly to analyze.\n * @returns Total number of independent degrees of freedom.\n */\nexport function mechanismDOF(assembly: AssemblyNode): number {\n return collectJoints(assembly).reduce((sum, j) => sum + j.dofs.length, 0);\n}\n\n/**\n * Inverse kinematics and motion trajectories for joint chains.\n *\n * `inverseKinematics` solves for the joint values that place an end-effector at\n * a target pose, using a damped-least-squares (Levenberg-Marquardt) update over\n * a numerically-differentiated Jacobian. Differentiating through\n * `forwardKinematics` keeps the solver agnostic to joint type — revolute,\n * prismatic, and the multi-DOF cylindrical/planar/spherical joints all\n * contribute their `dofs` uniformly — and respects each DOF's range by clamping\n * every iterate.\n *\n * `jointTrajectory` samples a straight-line path in joint space between two\n * configurations, returning the posed assembly (via forward kinematics) at each\n * step — the building block for animation and reachable-workspace sweeps.\n */\n\n\ntype Quat = readonly [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A target for the end-effector: a world position, optionally an orientation. */\nexport interface IKTarget {\n readonly position: Vec3;\n /** Target orientation `[w, x, y, z]`. Omit for position-only IK. */\n readonly rotation?: Quat;\n}\n\n/** Options for the inverse-kinematics solver (iterations, tolerance, damping, seed). */\nexport interface IKOptions {\n /** Maximum solver iterations. Default 200. */\n maxIterations?: number;\n /** Convergence threshold on the residual norm. Default 1e-5. */\n tolerance?: number;\n /** Damping factor λ for the least-squares step. Default 0.05. */\n damping?: number;\n /** Initial joint values, keyed by child node (number or per-DOF array). */\n seed?: Readonly<Record<string, number | readonly number[]>>;\n /** Local point on the end-effector node to drive to the target. Default origin. */\n tip?: Vec3;\n}\n\n/** Outcome of an inverse-kinematics solve: values, convergence, and residual. */\nexport interface IKResult {\n /** Solved joint values, keyed by child node, one entry per DOF. */\n readonly values: Record<string, number[]>;\n readonly converged: boolean;\n readonly iterations: number;\n /** Final residual norm (position, plus orientation when targeted). */\n readonly error: number;\n}\n\n// ---------------------------------------------------------------------------\n// Small vector / quaternion helpers\n// ---------------------------------------------------------------------------\n\nconst IK_IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\nfunction applyPose(pose: JointPose, p: Vec3): Vec3 {\n const r = quatRotate(pose.rotation, p);\n return [r[0] + pose.position[0], r[1] + pose.position[1], r[2] + pose.position[2]];\n}\n\nfunction quatConjugate(q: Quat): Quat {\n return [q[0], -q[1], -q[2], -q[3]];\n}\n\n/**\n * The rotation vector (axis · angle) taking orientation `from` to `to`, i.e. the\n * angular error that drives `from` toward `to`. Returns the zero vector when the\n * orientations coincide.\n */\nfunction rotationError(from: Quat, to: Quat): Vec3 {\n const d = quatMultiply(to, quatConjugate(from));\n let [w, x, y, z] = d;\n const norm = Math.hypot(w, x, y, z) || 1;\n w /= norm;\n x /= norm;\n y /= norm;\n z /= norm;\n if (w < 0) {\n // Shortest path: q and -q represent the same rotation.\n w = -w;\n x = -x;\n y = -y;\n z = -z;\n }\n const s = Math.hypot(x, y, z);\n if (s < 1e-12) return [0, 0, 0];\n const angle = 2 * Math.atan2(s, w);\n const k = angle / s;\n return [x * k, y * k, z * k];\n}\n\n// ---------------------------------------------------------------------------\n// Chain extraction\n// ---------------------------------------------------------------------------\n\n/** Joints from the root down to `endEffector`, in root→leaf order. */\nfunction chainTo(assembly: AssemblyNode, endEffector: string): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) byChild.set(j.child, j);\n\n const chain: Joint[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = endEffector;\n while (cur && byChild.has(cur) && !seen.has(cur)) {\n seen.add(cur);\n const j = byChild.get(cur);\n if (!j) break;\n chain.push(j);\n cur = j.parent;\n }\n return chain.reverse();\n}\n\n// ---------------------------------------------------------------------------\n// Linear algebra (small dense systems, Float64Array to avoid index-undefined)\n// ---------------------------------------------------------------------------\n\n/** Read a Float64Array element as a definite number (dense matrices are full). */\nfunction el(a: Float64Array, i: number): number {\n return a[i] ?? 0;\n}\n\n/** Solve `A x = b` for an `n×n` system by Gauss-Jordan with partial pivoting. */\nfunction solveLinear(A: Float64Array, b: Float64Array, n: number): Float64Array | null {\n const w = n + 1;\n const M = new Float64Array(n * w);\n for (let r = 0; r < n; r++) {\n for (let c = 0; c < n; c++) M[r * w + c] = el(A, r * n + c);\n M[r * w + n] = el(b, r);\n }\n for (let col = 0; col < n; col++) {\n let piv = col;\n for (let r = col + 1; r < n; r++) {\n if (Math.abs(el(M, r * w + col)) > Math.abs(el(M, piv * w + col))) piv = r;\n }\n if (Math.abs(el(M, piv * w + col)) < 1e-12) return null;\n if (piv !== col) {\n for (let k = col; k < w; k++) {\n const tmp = el(M, col * w + k);\n M[col * w + k] = el(M, piv * w + k);\n M[piv * w + k] = tmp;\n }\n }\n const d = el(M, col * w + col);\n for (let k = col; k < w; k++) M[col * w + k] = el(M, col * w + k) / d;\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const f = el(M, r * w + col);\n if (f === 0) continue;\n for (let k = col; k < w; k++) M[r * w + k] = el(M, r * w + k) - f * el(M, col * w + k);\n }\n }\n const x = new Float64Array(n);\n for (let r = 0; r < n; r++) x[r] = el(M, r * w + n);\n return x;\n}\n\n// ---------------------------------------------------------------------------\n// Inverse kinematics\n// ---------------------------------------------------------------------------\n\ninterface FlatChain {\n /** Joint segments in root→leaf order, each owning `count` consecutive DOFs. */\n readonly segments: ReadonlyArray<{ child: string; count: number }>;\n /** Current parameter vector (one entry per DOF). */\n readonly q: Float64Array;\n /** Per-DOF lower and upper bounds. */\n readonly lo: Float64Array;\n readonly hi: Float64Array;\n}\n\n/** Flatten a chain's DOFs into a parameter vector with bounds, applying the seed. */\nfunction flattenChain(\n chain: readonly Joint[],\n seed?: Readonly<Record<string, number | readonly number[]>>\n): FlatChain {\n const segments: Array<{ child: string; count: number }> = [];\n const q: number[] = [];\n const lo: number[] = [];\n const hi: number[] = [];\n for (const j of chain) {\n const s = seed?.[j.child];\n segments.push({ child: j.child, count: j.dofs.length });\n j.dofs.forEach((dof, i) => {\n const seeded = Array.isArray(s) ? s[i] : i === 0 ? (s as number | undefined) : undefined;\n const v = seeded ?? dof.value;\n q.push(Math.min(dof.max, Math.max(dof.min, v)));\n lo.push(dof.min);\n hi.push(dof.max);\n });\n }\n return {\n segments,\n q: Float64Array.from(q),\n lo: Float64Array.from(lo),\n hi: Float64Array.from(hi),\n };\n}\n\n/** Slice a parameter vector back into per-joint value arrays keyed by child. */\nfunction overridesOf(segments: FlatChain['segments'], q: Float64Array): Record<string, number[]> {\n const out: Record<string, number[]> = {};\n let i = 0;\n for (const seg of segments) {\n const vals: number[] = [];\n for (let k = 0; k < seg.count; k++) vals.push(el(q, i++));\n out[seg.child] = vals;\n }\n return out;\n}\n\n/** Residual twist `e` (target − current) for a pose; returns its norm. */\nfunction residualTwist(\n out: Float64Array,\n pose: JointPose,\n target: IKTarget,\n tip: Vec3,\n m: number\n): number {\n const pos = applyPose(pose, tip);\n out[0] = target.position[0] - pos[0];\n out[1] = target.position[1] - pos[1];\n out[2] = target.position[2] - pos[2];\n if (m === 6 && target.rotation) {\n const r = rotationError(pose.rotation, target.rotation);\n out[3] = r[0];\n out[4] = r[1];\n out[5] = r[2];\n }\n let s = 0;\n for (let i = 0; i < m; i++) s += el(out, i) ** 2;\n return Math.sqrt(s);\n}\n\n/**\n * Finite-difference Jacobian: column `j` is the end-effector twist from δq[j].\n * The probe steps *inward* from a bound — `forwardKinematics` clamps each DOF to\n * its range, so a forward `+eps` at the upper limit would yield a zero column and\n * trap the solver at the ceiling. Stepping `-eps` there (and dividing by the\n * signed step) keeps every column a true one-sided derivative.\n */\nfunction fillJacobian(\n J: Float64Array,\n q: Float64Array,\n n: number,\n m: number,\n lo: Float64Array,\n hi: Float64Array,\n base: JointPose,\n tip: Vec3,\n eps: number,\n tipPose: (s: Float64Array) => JointPose\n): void {\n const basePos = applyPose(base, tip);\n for (let j = 0; j < n; j++) {\n const saved = el(q, j);\n // Step away from whichever bound we're against so the perturbation isn't\n // clamped to a no-op; default forward.\n const h = saved + eps > el(hi, j) && saved - eps >= el(lo, j) ? -eps : eps;\n q[j] = saved + h;\n const p2 = tipPose(q);\n q[j] = saved;\n const pos2 = applyPose(p2, tip);\n J[j] = (pos2[0] - basePos[0]) / h;\n J[n + j] = (pos2[1] - basePos[1]) / h;\n J[2 * n + j] = (pos2[2] - basePos[2]) / h;\n if (m === 6) {\n const dr = rotationError(base.rotation, p2.rotation);\n J[3 * n + j] = dr[0] / h;\n J[4 * n + j] = dr[1] / h;\n J[5 * n + j] = dr[2] / h;\n }\n }\n}\n\n/** One damped-least-squares step: `Δq = Jᵀ(JJᵀ + λ²I)⁻¹ e`. */\nfunction dlsStep(\n J: Float64Array,\n e: Float64Array,\n n: number,\n m: number,\n lambda: number\n): Float64Array | null {\n const A = new Float64Array(m * m);\n const lam2 = lambda * lambda;\n for (let r = 0; r < m; r++) {\n for (let c = 0; c < m; c++) {\n let s = 0;\n for (let k = 0; k < n; k++) s += el(J, r * n + k) * el(J, c * n + k);\n A[r * m + c] = s + (r === c ? lam2 : 0);\n }\n }\n const y = solveLinear(A, e, m);\n if (!y) return null;\n const dq = new Float64Array(n);\n for (let j = 0; j < n; j++) {\n let v = 0;\n for (let r = 0; r < m; r++) v += el(J, r * n + j) * el(y, r);\n dq[j] = v;\n }\n return dq;\n}\n\n/**\n * Solve for the joint values that place `endEffector` (offset by `tip`) at\n * `target`, by damped-least-squares descent on a numerical Jacobian. Joint\n * ranges are honored: every iterate is clamped to each DOF's `[min, max]`.\n *\n * Returns the solved per-DOF values keyed by child node (ready to pass to\n * `forwardKinematics`), whether it converged, the iteration count, and the final\n * residual norm. An end-effector with no driving joints, or an unreachable\n * target, returns `converged: false` with the best configuration found.\n * @param assembly - The assembly containing the kinematic chain.\n * @param endEffector - Name of the end-effector node.\n * @param target - Target world pose for the end-effector.\n * @param options - Optional solver settings (iterations, tolerance, damping, seed, tip).\n * @returns The solved joint values and convergence diagnostics.\n */\nexport function inverseKinematics(\n assembly: AssemblyNode,\n endEffector: string,\n target: IKTarget,\n options: IKOptions = {}\n): IKResult {\n const maxIterations = options.maxIterations ?? 200;\n const tolerance = options.tolerance ?? 1e-5;\n const lambda = options.damping ?? 0.05;\n const tip: Vec3 = options.tip ?? [0, 0, 0];\n const m = target.rotation !== undefined ? 6 : 3;\n const eps = 1e-6;\n\n const { segments, q, lo, hi } = flattenChain(chainTo(assembly, endEffector), options.seed);\n const n = q.length;\n\n const tipPose = (state: Float64Array): JointPose =>\n forwardKinematics(assembly, overridesOf(segments, state)).get(endEffector) ?? IK_IDENTITY_POSE;\n\n const e = new Float64Array(m);\n const J = new Float64Array(m * n);\n\n let pose = tipPose(q);\n let err = residualTwist(e, pose, target, tip, m);\n let iter = 0;\n\n for (; iter < maxIterations && n > 0 && err > tolerance; iter++) {\n fillJacobian(J, q, n, m, lo, hi, pose, tip, eps, tipPose);\n const dq = dlsStep(J, e, n, m, lambda);\n if (!dq) break;\n for (let j = 0; j < n; j++) {\n const next = el(q, j) + el(dq, j);\n q[j] = Math.min(el(hi, j), Math.max(el(lo, j), next));\n }\n pose = tipPose(q);\n err = residualTwist(e, pose, target, tip, m);\n }\n\n return {\n values: overridesOf(segments, q),\n converged: err <= tolerance,\n iterations: iter,\n error: err,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Trajectories\n// ---------------------------------------------------------------------------\n\n/** One sample of a joint-space trajectory: parameter, values, and world poses. */\nexport interface TrajectorySample {\n /** Normalized path parameter in `[0, 1]`. */\n readonly t: number;\n /** Interpolated joint values at this step, keyed by child node. */\n readonly values: Record<string, number[]>;\n /** Forward-kinematics world poses for every node at this step. */\n readonly poses: Map<string, JointPose>;\n}\n\n/** Resolve a value spec (number, array, or absent) to a per-DOF array. */\nfunction valuesOf(joint: Joint, spec: number | readonly number[] | undefined): number[] {\n return joint.dofs.map((dof, i) => {\n const raw = Array.isArray(spec) ? spec[i] : i === 0 ? (spec as number | undefined) : undefined;\n const v = raw ?? dof.value;\n return Math.min(dof.max, Math.max(dof.min, v));\n });\n}\n\n/**\n * Sample a straight-line path in joint space from `from` to `to` over `steps`\n * segments, yielding `steps + 1` samples (inclusive of both endpoints). Each\n * sample carries the interpolated per-DOF values (clamped to range) and the\n * forward-kinematics poses of every node. Joints absent from `from`/`to` hold\n * their stored value at both ends.\n * @param assembly - The assembly to pose at each sample.\n * @param from - Starting joint values keyed by child node name.\n * @param to - Ending joint values keyed by child node name.\n * @param steps - Number of path segments (samples are `steps + 1`).\n * @returns The trajectory samples with interpolated values and poses.\n */\nexport function jointTrajectory(\n assembly: AssemblyNode,\n from: Readonly<Record<string, number | readonly number[]>>,\n to: Readonly<Record<string, number | readonly number[]>>,\n steps: number\n): TrajectorySample[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n\n const ends = joints.map((j) => ({\n child: j.child,\n a: valuesOf(j, from[j.child]),\n b: valuesOf(j, to[j.child]),\n }));\n\n const count = Math.max(1, Math.floor(steps));\n const samples: TrajectorySample[] = [];\n for (let s = 0; s <= count; s++) {\n const t = s / count;\n const values: Record<string, number[]> = {};\n for (const end of ends) {\n values[end.child] = end.a.map((a, i) => a + ((end.b[i] ?? a) - a) * t);\n }\n samples.push({ t, values, poses: forwardKinematics(assembly, values) });\n }\n return samples;\n}\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* api/assembly/solvers/linalg — 自实现向量数学与线性求解(P1,裁定 4)
|
|
3
3
|
*
|
|
4
4
|
* 规模极小(≤30 阶对称正定),优先 Cholesky(比 Gauss-Jordan 更稳且快),
|
|
5
|
-
* 退化时回落 Gauss-Jordan 带部分主元。
|
|
6
|
-
* 不可 import(裁定 4),故在此自实现,
|
|
5
|
+
* 退化时回落 Gauss-Jordan 带部分主元。brepjs 的 `ikFns.solveLinear` 是模块私有、
|
|
6
|
+
* 不可 import(裁定 4),故在此自实现,brepjs 只读约定不变。
|
|
7
7
|
*
|
|
8
8
|
* 模块零外部依赖;所有函数纯数值。
|
|
9
9
|
*/
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* api/assembly/solvers/linalg — 自实现向量数学与线性求解(P1,裁定 4)
|
|
3
3
|
*
|
|
4
4
|
* 规模极小(≤30 阶对称正定),优先 Cholesky(比 Gauss-Jordan 更稳且快),
|
|
5
|
-
* 退化时回落 Gauss-Jordan 带部分主元。
|
|
6
|
-
* 不可 import(裁定 4),故在此自实现,
|
|
5
|
+
* 退化时回落 Gauss-Jordan 带部分主元。brepjs 的 `ikFns.solveLinear` 是模块私有、
|
|
6
|
+
* 不可 import(裁定 4),故在此自实现,brepjs 只读约定不变。
|
|
7
7
|
*
|
|
8
8
|
* 模块零外部依赖;所有函数纯数值。
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linalg.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/linalg.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solvers/linalg — 自实现向量数学与线性求解(P1,裁定 4)\n *\n * 规模极小(≤30 阶对称正定),优先 Cholesky(比 Gauss-Jordan 更稳且快),\n * 退化时回落 Gauss-Jordan 带部分主元。vendored 的 `ikFns.solveLinear` 是模块私有、\n * 不可 import(裁定 4),故在此自实现,vendored 只读约定不变。\n *\n * 模块零外部依赖;所有函数纯数值。\n */\n\nexport type Vec3 = [number, number, number]\n\n/**\n * Component-wise vector sum `a + b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the sum vector.\n */\nexport function vadd(a: Vec3, b: Vec3): Vec3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\n}\n/**\n * Component-wise vector difference `a - b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the difference vector.\n */\nexport function vsub(a: Vec3, b: Vec3): Vec3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\n}\n/**\n * Dot product `⟨a, b⟩`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the dot product.\n */\nexport function vdot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n/**\n * Cross product `a × b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the cross-product vector.\n */\nexport function vcross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\n}\n/**\n * Scalar multiple `a * s`.\n * @param a - the vector.\n * @param s - the scalar factor.\n * @returns the scaled vector.\n */\nexport function vscale(a: Vec3, s: number): Vec3 {\n return [a[0] * s, a[1] * s, a[2] * s]\n}\n/**\n * Euclidean norm `‖a‖`.\n * @param a - the vector.\n * @returns the norm.\n */\nexport function vnorm(a: Vec3): number {\n return Math.hypot(a[0], a[1], a[2])\n}\n/**\n * 原地归一化(零向量安全:返回 [0,0,0])。\n * @param a - the vector to normalize (not mutated).\n * @returns the unit vector along `a`, or `[0, 0, 0]` for a near-zero vector.\n */\nexport function vnormalize(a: Vec3): Vec3 {\n const l = vnorm(a)\n return l < 1e-15 ? [0, 0, 0] : [a[0] / l, a[1] / l, a[2] / l]\n}\n/**\n * Sum of squared components `‖a‖²`.\n * @param a - the vector.\n * @returns the sum of squares.\n */\nexport function vsumsqr(a: Vec3): number {\n return a[0] * a[0] + a[1] * a[1] + a[2] * a[2]\n}\n\n/**\n * AᵀA(n×m 矩阵 → n×n 对称)与 Aᵀb。矩阵按行主序扁平存于 `A`(len = rows*cols)。\n * @param a - row-major `rows × cols` matrix A (flat array, length rows*cols).\n * @param rows - number of rows of A.\n * @param cols - number of columns of A.\n * @returns the `cols × cols` symmetric matrix AᵀA (row-major, flat).\n */\nexport function ata(a: number[], rows: number, cols: number): number[] {\n const out = new Array(cols * cols).fill(0)\n for (let i = 0; i < cols; i++) {\n for (let j = 0; j < cols; j++) {\n let s = 0\n for (let k = 0; k < rows; k++) s += a[k * cols + i] * a[k * cols + j]\n out[i * cols + j] = s\n }\n }\n return out\n}\n/**\n * Aᵀb for the row-major `rows × cols` matrix `a` and length-`rows` vector `b`.\n * @param a - row-major `rows × cols` matrix A (flat array, length rows*cols).\n * @param b - right-hand-side vector of length rows.\n * @param rows - number of rows of A.\n * @param cols - number of columns of A.\n * @returns the length-`cols` vector Aᵀb.\n */\nexport function atb(a: number[], b: number[], rows: number, cols: number): number[] {\n const out = new Array(cols).fill(0)\n for (let j = 0; j < cols; j++) {\n let s = 0\n for (let k = 0; k < rows; k++) s += a[k * cols + j] * b[k]\n out[j] = s\n }\n return out\n}\n\n/**\n * 解 (M + λI) x = b,M 为 n×n 对称正定(此处 M = JᵀJ)。\n * 先尝试 Cholesky(M + λI);若非正定,逐步放大 λ 重试;最终回落带部分主元 Gauss-Jordan。\n *\n * @param m - row-major `n × n` symmetric positive-definite matrix M (flat array).\n * @param b - right-hand-side vector of length n.\n * @param n - system dimension.\n * @param lambda - initial damping coefficient (progressively amplified on retry).\n * @returns 解向量 x,或退化时 null。\n */\nexport function solveDampedNormal(\n m: number[],\n b: number[],\n n: number,\n lambda: number,\n): number[] | null {\n // 尝试多级 λ(LM 阻尼放大)\n const lambdas = [lambda, lambda * 4, lambda * 16, lambda * 64, lambda * 256, lambda * 1024]\n for (const lam of lambdas) {\n const md = m.slice()\n for (let i = 0; i < n; i++) md[i * n + i] += lam\n const x = choleskySolve(md, b, n)\n if (x) return x\n }\n return gaussJordanSolve(m, b, n, lambda)\n}\n\n/** Cholesky(A = L Lᵀ)解对称正定系统;失败返回 null。 */\nfunction choleskySolve(a: number[], b: number[], n: number): number[] | null {\n const L = new Array(n * n).fill(0)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j <= i; j++) {\n let s = a[i * n + j]\n for (let k = 0; k < j; k++) s -= L[i * n + k] * L[j * n + k]\n if (i === j) {\n if (s <= 0) return null // 非正定\n L[i * n + i] = Math.sqrt(s)\n } else {\n L[i * n + j] = s / L[j * n + j]\n }\n }\n }\n // 前代 L y = b\n const y = new Array(n).fill(0)\n for (let i = 0; i < n; i++) {\n let s = b[i]\n for (let k = 0; k < i; k++) s -= L[i * n + k] * y[k]\n y[i] = s / L[i * n + i]\n }\n // 回代 Lᵀ x = y\n const x = new Array(n).fill(0)\n for (let i = n - 1; i >= 0; i--) {\n let s = y[i]\n for (let k = i + 1; k < n; k++) s -= L[k * n + i] * x[k]\n x[i] = s / L[i * n + i]\n }\n return x\n}\n\n/** 带部分主元 Gauss-Jordan,附加 λI 阻尼保证可解性。 */\nfunction gaussJordanSolve(a: number[], b: number[], n: number, lambda: number): number[] | null {\n const m = a.slice()\n for (let i = 0; i < n; i++) m[i * n + i] += lambda\n const x = new Array(n).fill(0)\n const aug = new Array(n).fill(0).map((_, i) => [...m.slice(i * n, i * n + n), b[i]])\n for (let col = 0; col < n; col++) {\n let piv = col\n let best = Math.abs(aug[col][col])\n for (let r = col + 1; r < n; r++) {\n const v = Math.abs(aug[r][col])\n if (v > best) {\n best = v\n piv = r\n }\n }\n if (best < 1e-15) return null\n if (piv !== col) {\n const tmp = aug[piv]\n aug[piv] = aug[col]\n aug[col] = tmp\n }\n const d = aug[col][col]\n for (let j = col; j <= n; j++) aug[col][j] /= d\n for (let r = 0; r < n; r++) {\n if (r === col) continue\n const f = aug[r][col]\n if (f === 0) continue\n for (let j = col; j <= n; j++) aug[r][j] -= f * aug[col][j]\n }\n }\n for (let i = 0; i < n; i++) x[i] = aug[i][n]\n return x\n}\n"]}
|
|
1
|
+
{"version":3,"file":"linalg.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/linalg.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solvers/linalg — 自实现向量数学与线性求解(P1,裁定 4)\n *\n * 规模极小(≤30 阶对称正定),优先 Cholesky(比 Gauss-Jordan 更稳且快),\n * 退化时回落 Gauss-Jordan 带部分主元。brepjs 的 `ikFns.solveLinear` 是模块私有、\n * 不可 import(裁定 4),故在此自实现,brepjs 只读约定不变。\n *\n * 模块零外部依赖;所有函数纯数值。\n */\n\nexport type Vec3 = [number, number, number]\n\n/**\n * Component-wise vector sum `a + b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the sum vector.\n */\nexport function vadd(a: Vec3, b: Vec3): Vec3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\n}\n/**\n * Component-wise vector difference `a - b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the difference vector.\n */\nexport function vsub(a: Vec3, b: Vec3): Vec3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\n}\n/**\n * Dot product `⟨a, b⟩`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the dot product.\n */\nexport function vdot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n/**\n * Cross product `a × b`.\n * @param a - left operand.\n * @param b - right operand.\n * @returns the cross-product vector.\n */\nexport function vcross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\n}\n/**\n * Scalar multiple `a * s`.\n * @param a - the vector.\n * @param s - the scalar factor.\n * @returns the scaled vector.\n */\nexport function vscale(a: Vec3, s: number): Vec3 {\n return [a[0] * s, a[1] * s, a[2] * s]\n}\n/**\n * Euclidean norm `‖a‖`.\n * @param a - the vector.\n * @returns the norm.\n */\nexport function vnorm(a: Vec3): number {\n return Math.hypot(a[0], a[1], a[2])\n}\n/**\n * 原地归一化(零向量安全:返回 [0,0,0])。\n * @param a - the vector to normalize (not mutated).\n * @returns the unit vector along `a`, or `[0, 0, 0]` for a near-zero vector.\n */\nexport function vnormalize(a: Vec3): Vec3 {\n const l = vnorm(a)\n return l < 1e-15 ? [0, 0, 0] : [a[0] / l, a[1] / l, a[2] / l]\n}\n/**\n * Sum of squared components `‖a‖²`.\n * @param a - the vector.\n * @returns the sum of squares.\n */\nexport function vsumsqr(a: Vec3): number {\n return a[0] * a[0] + a[1] * a[1] + a[2] * a[2]\n}\n\n/**\n * AᵀA(n×m 矩阵 → n×n 对称)与 Aᵀb。矩阵按行主序扁平存于 `A`(len = rows*cols)。\n * @param a - row-major `rows × cols` matrix A (flat array, length rows*cols).\n * @param rows - number of rows of A.\n * @param cols - number of columns of A.\n * @returns the `cols × cols` symmetric matrix AᵀA (row-major, flat).\n */\nexport function ata(a: number[], rows: number, cols: number): number[] {\n const out = new Array(cols * cols).fill(0)\n for (let i = 0; i < cols; i++) {\n for (let j = 0; j < cols; j++) {\n let s = 0\n for (let k = 0; k < rows; k++) s += a[k * cols + i] * a[k * cols + j]\n out[i * cols + j] = s\n }\n }\n return out\n}\n/**\n * Aᵀb for the row-major `rows × cols` matrix `a` and length-`rows` vector `b`.\n * @param a - row-major `rows × cols` matrix A (flat array, length rows*cols).\n * @param b - right-hand-side vector of length rows.\n * @param rows - number of rows of A.\n * @param cols - number of columns of A.\n * @returns the length-`cols` vector Aᵀb.\n */\nexport function atb(a: number[], b: number[], rows: number, cols: number): number[] {\n const out = new Array(cols).fill(0)\n for (let j = 0; j < cols; j++) {\n let s = 0\n for (let k = 0; k < rows; k++) s += a[k * cols + j] * b[k]\n out[j] = s\n }\n return out\n}\n\n/**\n * 解 (M + λI) x = b,M 为 n×n 对称正定(此处 M = JᵀJ)。\n * 先尝试 Cholesky(M + λI);若非正定,逐步放大 λ 重试;最终回落带部分主元 Gauss-Jordan。\n *\n * @param m - row-major `n × n` symmetric positive-definite matrix M (flat array).\n * @param b - right-hand-side vector of length n.\n * @param n - system dimension.\n * @param lambda - initial damping coefficient (progressively amplified on retry).\n * @returns 解向量 x,或退化时 null。\n */\nexport function solveDampedNormal(\n m: number[],\n b: number[],\n n: number,\n lambda: number,\n): number[] | null {\n // 尝试多级 λ(LM 阻尼放大)\n const lambdas = [lambda, lambda * 4, lambda * 16, lambda * 64, lambda * 256, lambda * 1024]\n for (const lam of lambdas) {\n const md = m.slice()\n for (let i = 0; i < n; i++) md[i * n + i] += lam\n const x = choleskySolve(md, b, n)\n if (x) return x\n }\n return gaussJordanSolve(m, b, n, lambda)\n}\n\n/** Cholesky(A = L Lᵀ)解对称正定系统;失败返回 null。 */\nfunction choleskySolve(a: number[], b: number[], n: number): number[] | null {\n const L = new Array(n * n).fill(0)\n for (let i = 0; i < n; i++) {\n for (let j = 0; j <= i; j++) {\n let s = a[i * n + j]\n for (let k = 0; k < j; k++) s -= L[i * n + k] * L[j * n + k]\n if (i === j) {\n if (s <= 0) return null // 非正定\n L[i * n + i] = Math.sqrt(s)\n } else {\n L[i * n + j] = s / L[j * n + j]\n }\n }\n }\n // 前代 L y = b\n const y = new Array(n).fill(0)\n for (let i = 0; i < n; i++) {\n let s = b[i]\n for (let k = 0; k < i; k++) s -= L[i * n + k] * y[k]\n y[i] = s / L[i * n + i]\n }\n // 回代 Lᵀ x = y\n const x = new Array(n).fill(0)\n for (let i = n - 1; i >= 0; i--) {\n let s = y[i]\n for (let k = i + 1; k < n; k++) s -= L[k * n + i] * x[k]\n x[i] = s / L[i * n + i]\n }\n return x\n}\n\n/** 带部分主元 Gauss-Jordan,附加 λI 阻尼保证可解性。 */\nfunction gaussJordanSolve(a: number[], b: number[], n: number, lambda: number): number[] | null {\n const m = a.slice()\n for (let i = 0; i < n; i++) m[i * n + i] += lambda\n const x = new Array(n).fill(0)\n const aug = new Array(n).fill(0).map((_, i) => [...m.slice(i * n, i * n + n), b[i]])\n for (let col = 0; col < n; col++) {\n let piv = col\n let best = Math.abs(aug[col][col])\n for (let r = col + 1; r < n; r++) {\n const v = Math.abs(aug[r][col])\n if (v > best) {\n best = v\n piv = r\n }\n }\n if (best < 1e-15) return null\n if (piv !== col) {\n const tmp = aug[piv]\n aug[piv] = aug[col]\n aug[col] = tmp\n }\n const d = aug[col][col]\n for (let j = col; j <= n; j++) aug[col][j] /= d\n for (let r = 0; r < n; r++) {\n if (r === col) continue\n const f = aug[r][col]\n if (f === 0) continue\n for (let j = col; j <= n; j++) aug[r][j] -= f * aug[col][j]\n }\n }\n for (let i = 0; i < n; i++) x[i] = aug[i][n]\n return x\n}\n"]}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* api/assembly/solvers/types — 纯 TS global 求解器的类型与契约(P1)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 与 `docs/plans/2026-09-17-assembly-global-solver-plan.md`。
|
|
6
|
-
*
|
|
7
|
-
* 本模块是 pure-type / 轻量数据层,不依赖任何 vendored 或运行时单例,
|
|
4
|
+
* 本模块是 pure-type / 轻量数据层,不依赖任何 brepjs 或运行时单例,
|
|
8
5
|
* 供 solve.ts、global-solver.ts、compound.ts 共享。
|
|
9
6
|
*/
|
|
10
7
|
import type { AssemblyTransform } from '../../../runtime-state.js';
|
|
11
|
-
/** 求解风格:'chain'
|
|
8
|
+
/** 求解风格:'chain'(链式拓扑解析,默认)/ 'global'(CadQuery 兼容全局最小二乘)。 */
|
|
12
9
|
export type SolverStyle = 'chain' | 'global';
|
|
13
10
|
/**
|
|
14
11
|
* 求解选项(P1):透传自 `cad.assembly({ solver })` / `AssemblyBehavior.solver`。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,4DAA4D;AAC5D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA;AAEzF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,uBAAuB;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAKD,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE1D,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,UAAU,CAAA;CACvB;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;IAClE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAA;IAChD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAA;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IAC7F,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,OAAO,CAAA;IAClB,iFAAiF;IACjF,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* api/assembly/solvers/types — 纯 TS global 求解器的类型与契约(P1)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 与 `docs/plans/2026-09-17-assembly-global-solver-plan.md`。
|
|
6
|
-
*
|
|
7
|
-
* 本模块是 pure-type / 轻量数据层,不依赖任何 vendored 或运行时单例,
|
|
4
|
+
* 本模块是 pure-type / 轻量数据层,不依赖任何 brepjs 或运行时单例,
|
|
8
5
|
* 供 solve.ts、global-solver.ts、compound.ts 共享。
|
|
9
6
|
*/
|
|
10
7
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG","sourcesContent":["/**\n * api/assembly/solvers/types — 纯 TS global 求解器的类型与契约(P1)\n *\n * 本模块是 pure-type / 轻量数据层,不依赖任何 brepjs 或运行时单例,\n * 供 solve.ts、global-solver.ts、compound.ts 共享。\n */\n\nimport type { AssemblyTransform } from '../../../runtime-state'\n\n/** 求解风格:'chain'(链式拓扑解析,默认)/ 'global'(CadQuery 兼容全局最小二乘)。 */\nexport type SolverStyle = 'chain' | 'global'\n\n/**\n * 求解选项(P1):透传自 `cad.assembly({ solver })` / `AssemblyBehavior.solver`。\n * `name` 用于 B4 锚定(assembly.py:465 `name == self.name` 锁定)→ 从 behavior.name 注入。\n */\nexport interface SolveOptions {\n /** 默认 'chain',向后零兼容。 */\n solver?: SolverStyle\n /** 装配名(B4 锚定用;cq-compat 的 buildAssembly 注入)。 */\n name?: string\n}\n\n/**\n * global 求解器内部的本地系标记(local-frame marker)。\n *\n * 与 CQ solver.py 的 marker 同义:\n * - point:装配实体的局部坐标点;\n * - axis:轴上一点 + 单位方向(边/圆柱面法线);\n * - plane:面中心 + 单位法向(face_mate / align / angle 用)。\n *\n * 所有坐标取自成员 Shape 的本地系(faijs Shape 不携带 placement → 本地系 == 建模系)。\n */\nexport type GlobalMarker =\n | { type: 'point'; p: [number, number, number] }\n | { type: 'axis'; origin: [number, number, number]; dir: [number, number, number] }\n | { type: 'plane'; center: [number, number, number]; normal: [number, number, number] }\n\n/** global 求解结果(与 `AssemblySolveResult` 对齐的字段集,但新增 residuals)。 */\nexport interface GlobalSolveResult {\n /** 每个被定位成员一条终态变换(pivot 恒 [0,0,0];恒等位姿不输出)。 */\n transforms: AssemblyTransform[]\n /** 恒 0(数值求解不做 DOF 分析,保留字段避免 undefined)。 */\n dof: number\n /** LM 终止即 true(无论残差大小;裁定 4.6)。 */\n converged: boolean\n /** 仅约束类型无法映射为代价时填充。 */\n unsupported: string[]\n /** 逐约束最终残差(诊断,满足「绝不静默」)。 */\n residuals: number[]\n /** 残差超阈值(>1e-6·scale)的约束逐条写入(折中可见)。 */\n warnings?: string[]\n}\n\n\n// ── §5.6.1:chain 求解器类型迁入(原 brepjs kernel/solverAdapter.ts,已内化为第一方代码) ──\n\n/** 3D vector(chain 求解器本地别名,与 quat.ts 同构)。 */\nexport type SolverVec3 = readonly [number, number, number]\n\n/** A geometric entity (plane, axis, or point) referenced by a chain-solver constraint. */\nexport interface SolverEntity {\n type: 'plane' | 'axis' | 'point'\n origin: SolverVec3\n normal?: SolverVec3\n direction?: SolverVec3\n}\n\n/** A chain-solver constraint between two entities, with an optional scalar value. */\nexport interface SolverConstraint {\n type: 'coincident' | 'concentric' | 'distance' | 'angle' | 'fixed'\n entityA?: { node: string; entity: SolverEntity }\n entityB?: { node: string; entity: SolverEntity }\n value?: number\n}\n\n/** Result of the chain solver: per-node transforms, DOF count, and convergence. */\nexport interface SolverResult {\n transforms: Map<string, { position: SolverVec3; rotation: [number, number, number, number] }>\n dof: number\n converged: boolean\n /** Constraint types that were passed in but not solved (not yet implemented). */\n unsupported: string[]\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA8Q1C;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,KAAK;;CAgBhB,CAAA;AAEF;;;;;;;;;;;;;;;IAeI;AACJ,eAAO,MAAM,GAAG;;CAYd,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,QAAQ;;CAanB,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,SAAS;;CAiBpB,CAAA"}
|
package/dist/api/boolean.js
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* 阶段 1:拆为三个薄函数 union/subtract/intersect + 兼容 boolean 导出(过渡)。
|
|
8
8
|
* 阶段 3 将删除 boolean 兼容导出。
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
// B3 correction (2026-10-06): no library-face cad aggregate — import the impl from its own module.
|
|
11
|
+
import * as meshBoolean from '../mesh/boolean.js';
|
|
11
12
|
import { solidToShape } from '../brep/brep-ops.js';
|
|
12
13
|
import { booleanWithRoleTable, } from '../brep/face-evolution.js';
|
|
13
14
|
import { getCurrentStmt, getBackends, keepHidden, nameOf } from '../runtime-state.js';
|
|
@@ -219,16 +220,16 @@ async function booleanMesh(inputs, operation) {
|
|
|
219
220
|
throw new Error('[api/boolean] boolean needs at least 1 input');
|
|
220
221
|
}
|
|
221
222
|
if (operation === 'union')
|
|
222
|
-
return
|
|
223
|
+
return meshBoolean.union(inputs[0], inputs[1], ...inputs.slice(2));
|
|
223
224
|
if (operation === 'subtract') {
|
|
224
|
-
let result = await
|
|
225
|
+
let result = await meshBoolean.subtract(inputs[0], inputs[1]);
|
|
225
226
|
for (let i = 2; i < inputs.length; i++)
|
|
226
|
-
result = await
|
|
227
|
+
result = await meshBoolean.subtract(result, inputs[i]);
|
|
227
228
|
return result;
|
|
228
229
|
}
|
|
229
|
-
let result = await
|
|
230
|
+
let result = await meshBoolean.intersect(inputs[0], inputs[1]);
|
|
230
231
|
for (let i = 2; i < inputs.length; i++)
|
|
231
|
-
result = await
|
|
232
|
+
result = await meshBoolean.intersect(result, inputs[i]);
|
|
232
233
|
return result;
|
|
233
234
|
}
|
|
234
235
|
// ── 三个薄导出(多输入 variadic,defineOp 声明双路径 + 逐核函数 face-evolution 能力) ──
|