@faicad/faijs 0.16.1 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +4 -5
- package/NOTICE +5 -6
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +19 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.d.ts.map +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +2 -2
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +2 -2
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/lower.d.ts +1 -1
- package/dist/api/assembly/lower.d.ts.map +1 -1
- package/dist/api/assembly/lower.js.map +1 -1
- package/dist/api/assembly/pose.d.ts +3 -3
- package/dist/api/assembly/pose.d.ts.map +1 -1
- package/dist/api/assembly/pose.js +1 -1
- package/dist/api/assembly/pose.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.d.ts.map +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.map +1 -1
- package/dist/api/assembly/solve.js +3 -3
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
- package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
- package/dist/api/assembly/solvers/assembly-tree.js +130 -0
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.js +330 -0
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
- package/dist/api/assembly/solvers/global-solver.js +2 -2
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
- package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
- package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
- package/dist/api/assembly/solvers/quat.d.ts +35 -0
- package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
- package/dist/api/assembly/solvers/quat.js +84 -0
- package/dist/api/assembly/solvers/quat.js.map +1 -0
- package/dist/api/assembly/solvers/types.d.ts +33 -0
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +3 -4
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
- package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/booleanFns.js +99 -0
- package/dist/api/brep-mirror/booleanFns.js.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.js +131 -0
- package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
- package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
- package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/compoundFns.js +300 -0
- package/dist/api/brep-mirror/compoundFns.js.map +1 -0
- package/dist/api/brep-mirror/healingFns.d.ts +78 -0
- package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/healingFns.js +294 -0
- package/dist/api/brep-mirror/healingFns.js.map +1 -0
- package/dist/api/brep-mirror/hullFns.d.ts +20 -0
- package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/hullFns.js +46 -0
- package/dist/api/brep-mirror/hullFns.js.map +1 -0
- package/dist/api/brep-mirror/patternFns.d.ts +43 -0
- package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/patternFns.js +178 -0
- package/dist/api/brep-mirror/patternFns.js.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.js +104 -0
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
- package/dist/api/brep-mirror/roofFns.d.ts +24 -0
- package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/roofFns.js +229 -0
- package/dist/api/brep-mirror/roofFns.js.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.js +443 -0
- package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
- package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
- package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/sweepFns.js +200 -0
- package/dist/api/brep-mirror/sweepFns.js.map +1 -0
- package/dist/api/brep-mirror/threadFns.d.ts +15 -0
- package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
- package/dist/api/brep-mirror/threadFns.js +37 -2
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
- package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/topologyFns.js +273 -0
- package/dist/api/brep-mirror/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +190 -0
- package/dist/api/brep-topology.d.ts.map +1 -0
- package/dist/api/brep-topology.js +337 -0
- package/dist/api/brep-topology.js.map +1 -0
- package/dist/api/brepjs-compat/constants.d.ts +11 -0
- package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
- package/dist/api/brepjs-compat/constants.js +11 -0
- package/dist/api/brepjs-compat/constants.js.map +1 -0
- package/dist/api/brepjs-compat/index.d.ts +19 -232
- package/dist/api/brepjs-compat/index.d.ts.map +1 -1
- package/dist/api/brepjs-compat/index.js +19 -286
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
- package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeOps.js +170 -0
- package/dist/api/brepjs-compat/planeOps.js.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.js +8 -0
- package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
- package/dist/api/brepjs-compat/types.d.ts +64 -0
- package/dist/api/brepjs-compat/types.d.ts.map +1 -0
- package/dist/api/brepjs-compat/types.js +48 -0
- package/dist/api/brepjs-compat/types.js.map +1 -0
- package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
- package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/vecOps.js +202 -0
- package/dist/api/brepjs-compat/vecOps.js.map +1 -0
- package/dist/api/chamfer.d.ts +5 -0
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +13 -8
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts.map +1 -1
- package/dist/api/compound-geom.js +8 -2
- package/dist/api/compound-geom.js.map +1 -1
- package/dist/api/draft.d.ts +69 -0
- package/dist/api/draft.d.ts.map +1 -0
- package/dist/api/draft.js +109 -0
- package/dist/api/draft.js.map +1 -0
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +2 -2
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +2 -3
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +28 -13
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +2 -2
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +137 -0
- package/dist/api/feature-repair.d.ts.map +1 -0
- package/dist/api/feature-repair.js +221 -0
- package/dist/api/feature-repair.js.map +1 -0
- package/dist/api/fillet-variable.d.ts +35 -0
- package/dist/api/fillet-variable.d.ts.map +1 -0
- package/dist/api/fillet-variable.js +71 -0
- package/dist/api/fillet-variable.js.map +1 -0
- package/dist/api/fillet.d.ts +3 -0
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +7 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +1 -13
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +6 -1
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/brepjs/index.d.ts +298 -298
- package/dist/api/generated/brepjs/index.d.ts.map +1 -1
- package/dist/api/generated/brepjs/index.js +183 -183
- package/dist/api/generated/brepjs/index.js.map +1 -1
- package/dist/api/generated/core.d.ts +3 -123
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +2 -81
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +1 -15
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +6 -3
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +1 -13
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +6 -1
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +1 -39
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +6 -4
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +53 -97
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +48 -143
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +1 -10
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +2 -10
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +65 -110
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +132 -80
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +1 -8
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +6 -4
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +1 -9
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +6 -1
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +2 -0
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +34 -22
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +52 -27
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +18 -4
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +4 -7
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +10 -8
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +1 -6
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +6 -3
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +77 -175
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +172 -131
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +2 -2
- package/dist/api/geom.js.map +1 -1
- package/dist/api/helix.d.ts +51 -0
- package/dist/api/helix.d.ts.map +1 -0
- package/dist/api/helix.js +63 -0
- package/dist/api/helix.js.map +1 -0
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +6 -2
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +18 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +29 -12
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +10 -0
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +9 -3
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +4 -4
- package/dist/api/internal/compat-projection.js +7 -7
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +75 -42
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +105 -50
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +31 -0
- package/dist/api/internal/profile-wire.d.ts.map +1 -0
- package/dist/api/internal/profile-wire.js +37 -0
- package/dist/api/internal/profile-wire.js.map +1 -0
- package/dist/api/internal/replica-role-table.js +2 -2
- package/dist/api/internal/replica-role-table.js.map +1 -1
- package/dist/api/loft.d.ts +66 -0
- package/dist/api/loft.d.ts.map +1 -0
- package/dist/api/loft.js +111 -0
- package/dist/api/loft.js.map +1 -0
- package/dist/api/measurement/index.d.ts +51 -0
- package/dist/api/measurement/index.d.ts.map +1 -0
- package/dist/api/measurement/index.js +71 -0
- package/dist/api/measurement/index.js.map +1 -0
- package/dist/api/occt-kernel-bridge.d.ts +5 -8
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +18 -14
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +3 -4
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.d.ts.map +1 -1
- package/dist/api/place.js +2 -4
- package/dist/api/place.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +3 -4
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +28 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +29 -19
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +6 -11
- package/dist/api/result.d.ts.map +1 -1
- package/dist/api/result.js +6 -11
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts.map +1 -1
- package/dist/api/revolve.js +15 -14
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +3 -0
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +9 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts +1 -1
- package/dist/api/section-by-plane.d.ts +42 -0
- package/dist/api/section-by-plane.d.ts.map +1 -0
- package/dist/api/section-by-plane.js +61 -0
- package/dist/api/section-by-plane.js.map +1 -0
- package/dist/api/shell.d.ts +45 -0
- package/dist/api/shell.d.ts.map +1 -0
- package/dist/api/shell.js +73 -0
- package/dist/api/shell.js.map +1 -0
- package/dist/api/sketch.d.ts +8 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +12 -7
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split-by-plane.d.ts +41 -0
- package/dist/api/split-by-plane.d.ts.map +1 -0
- package/dist/api/split-by-plane.js +60 -0
- package/dist/api/split-by-plane.js.map +1 -0
- package/dist/api/split.d.ts +6 -1
- package/dist/api/split.d.ts.map +1 -1
- package/dist/api/split.js +23 -9
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +22 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +723 -476
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +55 -0
- package/dist/api/sweep.d.ts.map +1 -0
- package/dist/api/sweep.js +86 -0
- package/dist/api/sweep.js.map +1 -0
- package/dist/api/thicken.d.ts +36 -0
- package/dist/api/thicken.d.ts.map +1 -0
- package/dist/api/thicken.js +55 -0
- package/dist/api/thicken.js.map +1 -0
- package/dist/api/transform.d.ts +8 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +15 -4
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +48 -0
- package/dist/api/view/cameraFns.d.ts.map +1 -0
- package/dist/api/view/cameraFns.js +75 -0
- package/dist/api/view/cameraFns.js.map +1 -0
- package/dist/api/view/projectionPlanes.d.ts +25 -0
- package/dist/api/view/projectionPlanes.d.ts.map +1 -0
- package/dist/api/view/projectionPlanes.js +30 -0
- package/dist/api/view/projectionPlanes.js.map +1 -0
- package/dist/api/view/view-camera.d.ts +2 -2
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +3 -3
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +9 -6
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +132 -65
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/wire.d.ts +45 -0
- package/dist/api/wire.d.ts.map +1 -0
- package/dist/api/wire.js +96 -0
- package/dist/api/wire.js.map +1 -0
- package/dist/boolean/creased-normals.d.ts +50 -0
- package/dist/boolean/creased-normals.d.ts.map +1 -0
- package/dist/boolean/creased-normals.js +114 -0
- package/dist/boolean/creased-normals.js.map +1 -0
- package/dist/boolean/deriveNormals.d.ts +4 -1
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +5 -2
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +6 -0
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +11 -2
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +4 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +4 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +79 -59
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +7 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +15 -7
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +52 -167
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +93 -130
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +9 -7
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +14 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js +11 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts +3 -0
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +7 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +8 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +15 -3
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +20 -2
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +25 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +336 -144
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +5 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +32 -2
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +8 -2
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +3 -0
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +3 -1
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +18 -2
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +29 -1
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +3 -0
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +7 -0
- package/dist/env-agnostic.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +28 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +29 -1
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +6 -3
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +31 -0
- package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
- package/dist/occt-kernel/hullGeometry.js +319 -0
- package/dist/occt-kernel/hullGeometry.js.map +1 -0
- package/dist/occt-kernel/hullOps.d.ts +24 -0
- package/dist/occt-kernel/hullOps.d.ts.map +1 -0
- package/dist/occt-kernel/hullOps.js +52 -0
- package/dist/occt-kernel/hullOps.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts +14 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
- package/dist/occt-kernel/occt-primitives.js +351 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -0
- package/dist/occt-kernel/occtKernel.d.ts +14 -6
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +11 -3
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/topologyExt.js +2 -2
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/primitives/brep-primitives.d.ts +4 -0
- package/dist/primitives/brep-primitives.d.ts.map +1 -1
- package/dist/primitives/brep-primitives.js +4 -0
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +22 -0
- package/dist/result/bug.d.ts.map +1 -0
- package/dist/result/bug.js +28 -0
- package/dist/result/bug.js.map +1 -0
- package/dist/result/errors.d.ts +270 -0
- package/dist/result/errors.d.ts.map +1 -0
- package/dist/result/errors.js +317 -0
- package/dist/result/errors.js.map +1 -0
- package/dist/result/kernelErrorTranslation.d.ts +21 -0
- package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
- package/dist/result/kernelErrorTranslation.js +102 -0
- package/dist/result/kernelErrorTranslation.js.map +1 -0
- package/dist/result/result.d.ts +213 -0
- package/dist/result/result.d.ts.map +1 -0
- package/dist/result/result.js +336 -0
- package/dist/result/result.js.map +1 -0
- package/dist/result/vec3.d.ts +12 -0
- package/dist/result/vec3.d.ts.map +1 -0
- package/dist/result/vec3.js +14 -0
- package/dist/result/vec3.js.map +1 -0
- package/dist/runtime-state.d.ts +9 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +3 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +2 -1
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +43 -1
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +57 -1
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/geom-hint.js +1 -1
- package/dist/topology/naming/geom-hint.js.map +1 -1
- package/dist/topology/naming/score.js +1 -1
- package/dist/topology/naming/score.js.map +1 -1
- package/package.json +6 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/api/assembly/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/api/assembly/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAOhD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAC1B,IAA2B,EAC3B,SAAuB,EACvB,SAAuB,EACvB,KAAc;IAEd,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,aAAa,CAC7C,IAAI,EACJ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EACpC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EACpC,KAAK,CACN,CAAA;IACD,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,UAA8B,CAAC,CAAC,CAAA;IAChF,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,gEAAgE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAC5G,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAC7E,OAAO,uBAAuB,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,CAG2C;IAE3C,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QAC9D,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QACnE,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAC9C,CAAC;AACH,CAAC","sourcesContent":["/**\n * api/assembly/preview — 装配约束预览纯函数入口(P2-f3,方案 §2.3)\n *\n * 动机:3d_editor 预览需要**与执行同源**的轻量入口(P2-f5 已删除旧预览专用数学);\n *\n * 同源性保证:内部复用 lowerEntities(与 lowerStructuralConstraint 同编码规则)\n * 与 vendored brepjs solveConstraints——不另写数学。\n *\n * **输入约定**:一律是\"未编码\"的实体(SolverEntity,纯数据)——\n * 面 → {type:'plane', origin:center, normal},圆柱/圆锥面与边 →\n * {type:'axis', origin, direction},点 → {type:'point', origin};\n * `mate`/`align` 的 flip 由 solvePreview 内部负责(mate:dep 侧法向取反;\n * align:不取反),宿主不需要知道自己该不该 flip。\n *\n * 仅支持\"恰好定位一个 dependent\"的单条约束;`fixed`(无位移语义)与\n * `parallel`/`perpendicular`(请用 `angle` 0/90 显式表达)不支持,报错。\n */\n\nimport type { SolverConstraint, SolverEntity } from './solvers/types'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport { solveConstraints } from './solvers/chain-solver'\nimport { lowerEntities } from './lower'\nimport { poseToAssemblyTransform } from './pose'\nimport type { AssemblyVec3 } from './types'\n\n/** 预览支持的约束类型(fixed 无位移语义 → 抛错;parallel/perpendicular → angle 糖)。 */\nexport type PreviewConstraintType =\n | 'mate' | 'align' | 'coincident' | 'concentric' | 'distance' | 'angle'\n\n/**\n * 单约束预览:给定两条实体的几何(SolverEntity,纯数据),\n * 走与 solveAssembly 完全相同的 lower → solveConstraints 链路,\n * 返回 dependent 侧成员的位姿(AssemblyTransform,index 固定 -1,\n * pivot = dep 实体 origin)。\n *\n * @param type - the constraint type.\n * @param refEntity - the reference-side solver entity.\n * @param depEntity - the dependent-side solver entity.\n * @param value - distance/angle 用(定距 mm / 夹角 deg)。\n * @returns the dependent-side AssemblyTransform (index = -1).\n * @throws Error on entity type mismatch / non-convergence / dep not positioned.\n */\nexport function solvePreview(\n type: PreviewConstraintType,\n refEntity: SolverEntity,\n depEntity: SolverEntity,\n value?: number,\n): AssemblyTransform {\n const { constraint, depOrigin } = lowerEntities(\n type,\n { node: '__ref', entity: refEntity },\n { node: '__dep', entity: depEntity },\n value,\n )\n const r = solveConstraints(['__ref', '__dep'], [constraint as SolverConstraint])\n if (!r.converged) {\n throw new Error(\n `[assembly:preview] constraint did not converge; unsupported: ${r.unsupported.join(', ') || '(no detail)'}`,\n )\n }\n const pose = r.transforms.get('__dep')\n if (!pose) throw new Error('[assembly:preview] dependent was not positioned')\n return poseToAssemblyTransform(pose, depOrigin ?? [0, 0, 0], -1)\n}\n\n/**\n * 宿主拾取数据 → SolverEntity(预览时几何就在手上,不经过 TopoRef 解析)。\n *\n * @param g - 宿主拾取的几何数据(plane/axis/point,带 kind 判别)。\n * @returns 可供求解器消解的 SolverEntity(plane/axis/point)。\n */\nexport function entityFromGeometry(\n g:\n | { kind: 'plane'; center: AssemblyVec3; normal: AssemblyVec3 }\n | { kind: 'axis'; origin: AssemblyVec3; direction: AssemblyVec3 }\n | { kind: 'point'; origin: AssemblyVec3 },\n): SolverEntity {\n switch (g.kind) {\n case 'plane':\n return { type: 'plane', origin: g.center, normal: g.normal }\n case 'axis':\n return { type: 'axis', origin: g.origin, direction: g.direction }\n case 'point':\n return { type: 'point', origin: g.origin }\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/solve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"solve.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/solve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAO5D,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,SAAS,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,kBAAkB,EAAE,EACjC,IAAI,CAAC,EAAE,YAAY,GAClB,mBAAmB,CA0DrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,KAAK,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,kBAAkB,EAAE,EACjC,MAAM,GAAE,SAAS,EAAO,EACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACzC,IAAI,CAAC,EAAE,YAAY,GAClB,mBAAmB,CAkCrB"}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* 不收敛 → 抛错(D3,错误信息带 unsupported 明细;对齐「绝不静默」约定)。
|
|
9
9
|
* 恒等位姿的成员(锚定/链根)不输出变换——引擎不做无谓的几何重算。
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import { solveConstraints } from '
|
|
11
|
+
import { getBrepApi } from '../../brep/handle-bridge.js';
|
|
12
|
+
import { solveConstraints } from './solvers/chain-solver.js';
|
|
13
13
|
import { normalizeConstraint } from './normalize.js';
|
|
14
14
|
import { lowerStructuralConstraint } from './lower.js';
|
|
15
15
|
import { poseToAssemblyTransform, isIdentityPose } from './pose.js';
|
|
@@ -46,7 +46,7 @@ export function solveAssembly(members, memberNames, constraints, opts) {
|
|
|
46
46
|
// 此时快照引用仍可解,TopoRef 引用按 E_TOPO_NOT_FOUND 显式报错
|
|
47
47
|
let kernel = null;
|
|
48
48
|
try {
|
|
49
|
-
kernel =
|
|
49
|
+
kernel = getBrepApi();
|
|
50
50
|
}
|
|
51
51
|
catch {
|
|
52
52
|
// backends not configured — snapshot-form constraints still solvable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../../src/api/assembly/solve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solve — 装配求解入口(P1,方案 §4.2)\n *\n * 流程:规范化(normalize)→ 降级(lower)→ brepjs solveConstraints\n *(拓扑轮次调度 / DOF / converged 全部由 brepjs 提供,零 vendored 修改)→\n * per-member 终态 AssemblyTransform(修 L6:不再 per-constraint 增量叠加)。\n *\n * 不收敛 → 抛错(D3,错误信息带 unsupported 明细;对齐「绝不静默」约定)。\n * 恒等位姿的成员(锚定/链根)不输出变换——引擎不做无谓的几何重算。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport { getBackends } from '../../runtime-state'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport { solveConstraints } from '../../vendored/brepjs/kernel/solverAdapter'\nimport { normalizeConstraint } from './normalize'\nimport { lowerStructuralConstraint } from './lower'\nimport { type EntityResolutionEnv } from './entities'\nimport { poseToAssemblyTransform, isIdentityPose, type SolverPose } from './pose'\nimport { solveKinematics, type JointSpec, type KinematicsPose } from './joints'\nimport type { AssemblyConstraint, AssemblyVec3 } from './types'\nimport type { SolveOptions } from './solvers/types'\nimport { solveGlobal } from './solvers/global-solver'\n\n/** 求解完整结果:per-member 终态变换 + 诊断量。 */\nexport interface AssemblySolveResult {\n /** 每个被定位成员一条终态变换(index = 成员下标;恒等位姿不输出)。 */\n transforms: AssemblyTransform[]\n /** unsupported 约束的自由度合计(诊断量;收敛时为 0)。 */\n dof: number\n /** 是否全部约束可解(不收敛时 solveAssembly 已抛错,此字段恒 true)。 */\n converged: boolean\n /** 无法求解的约束明细(entity 类型不匹配 / 参考不可达)。 */\n unsupported: string[]\n /**\n * P3:运动副解算的全成员位姿表(键 = 成员名;含恒等链根),\n * 只有该装配声明了 joints 时才存在——宿主从 ExecutionResult.kinematics 消费。\n */\n kinematics?: Record<string, KinematicsPose>\n /**\n * P3:合并诊断(joints 覆盖约束解时各记一条;D-P3-1,不参与 converged 统计)。\n */\n warnings?: string[]\n /**\n * P1(global 求解器):逐约束最终残差(CQ 代价的逐约束平方和)。chain 路径不填。\n */\n residuals?: number[]\n}\n\n/**\n * 求解装配:members + memberNames + constraints → per-member 终态。\n *\n * @param members - member shapes (compound children, aligned with memberNames).\n * @param memberNames - member variable names (R7: empty names throw before solving).\n * @param constraints - raw constraints from `cad.assembly({ constraints })`.\n * @param opts - optional solver options (e.g. `solver: 'global'` selects the global least-squares path).\n * @returns the solve result (transforms + diagnostics).\n * @throws Error on empty member names, unknown constraint parts, or non-convergence.\n */\nexport function solveAssembly(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n opts?: SolveOptions,\n): AssemblySolveResult {\n // P1:global 求解器分派(CadQuery 兼容全局最小二乘;零额外依赖)\n if (opts?.solver === 'global') {\n return solveGlobal(members, memberNames, constraints, opts)\n }\n\n // R7:成员名是 solver 的节点键,空串会让多成员互相覆盖——求解前断言\n memberNames.forEach((name, i) => {\n if (!name) {\n throw new Error(\n `[assembly] member at index ${i} has an empty name — members are referenced by variable name in constraints`,\n )\n }\n })\n\n const memberMap = new Map<string, Shape>()\n members.forEach((m, i) => {\n const name = memberNames[i]\n if (name && !memberMap.has(name)) memberMap.set(name, m)\n })\n // kernel 仅 TopoRef/边引用解析需要;backends 未配置(纯位姿场景/单测)→ null,\n // 此时快照引用仍可解,TopoRef 引用按 E_TOPO_NOT_FOUND 显式报错\n let kernel: BrepEngineApi | null = null\n try {\n kernel = getBackends().kernel.brep as BrepEngineApi | null\n } catch {\n // backends not configured — snapshot-form constraints still solvable\n }\n const env: EntityResolutionEnv = { kernel, memberOf: (p: string) => memberMap.get(p) }\n\n const lowered: ReturnType<typeof lowerStructuralConstraint>['constraint'][] = []\n const depOrigins = new Map<string, AssemblyVec3>()\n for (const raw of constraints) {\n const c = normalizeConstraint(raw)\n const { constraint, depOrigin } = lowerStructuralConstraint(c, env)\n lowered.push(constraint)\n if (depOrigin && constraint.entityB) depOrigins.set(constraint.entityB.node, depOrigin)\n }\n\n const result = solveConstraints([...memberNames], lowered)\n if (!result.converged) {\n throw new Error(\n `[assembly] constraint solve did not converge (dof=${result.dof}); unsupported: ` +\n (result.unsupported.length > 0 ? result.unsupported.join(', ') : '(no detail)'),\n )\n }\n\n // per-member 终态(L6 修复):恒等位姿(锚定/链根)不输出,引擎不重算\n const transforms: AssemblyTransform[] = []\n for (const [node, rawPose] of result.transforms) {\n const pose: SolverPose = rawPose\n if (isIdentityPose(pose)) continue\n const index = memberNames.indexOf(node)\n if (index < 0) continue\n const pivot = depOrigins.get(node) ?? ([0, 0, 0] as AssemblyVec3)\n transforms.push(poseToAssemblyTransform(pose, pivot, index))\n }\n return { transforms, dof: result.dof, converged: result.converged, unsupported: result.unsupported }\n}\n\n/**\n * 求解装配(约束 + 运动副,P3):先跑约束求解得到 per-member 终态,再跑\n * solveKinematics 得到 joints 的 per-member 位姿,以**成员名**为键用 joints 结果\n * 覆盖同名成员的约束解,得到唯一一张表——**在库侧一次合并**,调用方一次性\n * setPendingAssemblyTransforms(禁止引擎侧两次登记)。\n *\n * 诊断不混用:joints 不参与 solveConstraints 的 converged/dof/unsupported 统计;\n * 覆盖发生时在 warnings 里各记一条(D-P3-1)。kinematics 为全成员位姿表(含\n * 恒等链根),供宿主从 ExecutionResult.kinematics 消费。\n *\n * joints 为空 → 退化为基础 solveAssembly 行为(无 kinematics/warnings 字段)。\n *\n * @param members - member shapes (aligned with memberNames).\n * @param memberNames - member variable names (R7: empty names throw).\n * @param constraints - raw constraints (may be empty).\n * @param joints - raw joint declarations (may be empty).\n * @param drive - per-child DOF value overrides (may be undefined).\n * @param opts - optional solver options (forwarded to the base constraint solve).\n * @returns the merged solve result (transforms + diagnostics + kinematics/warnings).\n */\nexport function solveAssemblyAndKinematics(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n joints: JointSpec[] = [],\n drive?: Record<string, number | number[]>,\n opts?: SolveOptions,\n): AssemblySolveResult {\n const base = solveAssembly(members, memberNames, constraints, opts)\n if (joints.length === 0) return base\n\n const kin = solveKinematics(memberNames, joints, drive)\n // 合并:以成员名为键,joints 结果覆盖同名成员的约束解(唯一一张表)\n const merged = new Map<string, AssemblyTransform>()\n for (const t of base.transforms) {\n const name = memberNames[t.index]\n if (name) merged.set(name, t)\n }\n const warnings: string[] = []\n for (const t of kin.transforms) {\n const name = memberNames[t.index]\n if (!name) continue\n if (merged.has(name)) {\n warnings.push(`[assembly] joint '${name}' overrides the constraint solution for member '${name}'`)\n }\n merged.set(name, t)\n }\n // 按成员下标升序输出(与约束解的 Map 遍历序解耦,输出顺序确定)\n const transforms = [...merged.entries()]\n .map(([name, t]) => ({ name, t }))\n .sort((a, b) => memberNames.indexOf(a.name) - memberNames.indexOf(b.name))\n .map(({ t }) => t)\n\n return {\n transforms,\n dof: base.dof,\n converged: base.converged,\n unsupported: base.unsupported,\n kinematics: kin.kinematics,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"solve.js","sourceRoot":"","sources":["../../../src/api/assembly/solve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solve — 装配求解入口(P1,方案 §4.2)\n *\n * 流程:规范化(normalize)→ 降级(lower)→ brepjs solveConstraints\n *(拓扑轮次调度 / DOF / converged 全部由 brepjs 提供,零 vendored 修改)→\n * per-member 终态 AssemblyTransform(修 L6:不再 per-constraint 增量叠加)。\n *\n * 不收敛 → 抛错(D3,错误信息带 unsupported 明细;对齐「绝不静默」约定)。\n * 恒等位姿的成员(锚定/链根)不输出变换——引擎不做无谓的几何重算。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { solveConstraints } from './solvers/chain-solver'\nimport { normalizeConstraint } from './normalize'\nimport { lowerStructuralConstraint } from './lower'\nimport { type EntityResolutionEnv } from './entities'\nimport { poseToAssemblyTransform, isIdentityPose, type SolverPose } from './pose'\nimport { solveKinematics, type JointSpec, type KinematicsPose } from './joints'\nimport type { AssemblyConstraint, AssemblyVec3 } from './types'\nimport type { SolveOptions } from './solvers/types'\nimport { solveGlobal } from './solvers/global-solver'\n\n/** 求解完整结果:per-member 终态变换 + 诊断量。 */\nexport interface AssemblySolveResult {\n /** 每个被定位成员一条终态变换(index = 成员下标;恒等位姿不输出)。 */\n transforms: AssemblyTransform[]\n /** unsupported 约束的自由度合计(诊断量;收敛时为 0)。 */\n dof: number\n /** 是否全部约束可解(不收敛时 solveAssembly 已抛错,此字段恒 true)。 */\n converged: boolean\n /** 无法求解的约束明细(entity 类型不匹配 / 参考不可达)。 */\n unsupported: string[]\n /**\n * P3:运动副解算的全成员位姿表(键 = 成员名;含恒等链根),\n * 只有该装配声明了 joints 时才存在——宿主从 ExecutionResult.kinematics 消费。\n */\n kinematics?: Record<string, KinematicsPose>\n /**\n * P3:合并诊断(joints 覆盖约束解时各记一条;D-P3-1,不参与 converged 统计)。\n */\n warnings?: string[]\n /**\n * P1(global 求解器):逐约束最终残差(CQ 代价的逐约束平方和)。chain 路径不填。\n */\n residuals?: number[]\n}\n\n/**\n * 求解装配:members + memberNames + constraints → per-member 终态。\n *\n * @param members - member shapes (compound children, aligned with memberNames).\n * @param memberNames - member variable names (R7: empty names throw before solving).\n * @param constraints - raw constraints from `cad.assembly({ constraints })`.\n * @param opts - optional solver options (e.g. `solver: 'global'` selects the global least-squares path).\n * @returns the solve result (transforms + diagnostics).\n * @throws Error on empty member names, unknown constraint parts, or non-convergence.\n */\nexport function solveAssembly(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n opts?: SolveOptions,\n): AssemblySolveResult {\n // P1:global 求解器分派(CadQuery 兼容全局最小二乘;零额外依赖)\n if (opts?.solver === 'global') {\n return solveGlobal(members, memberNames, constraints, opts)\n }\n\n // R7:成员名是 solver 的节点键,空串会让多成员互相覆盖——求解前断言\n memberNames.forEach((name, i) => {\n if (!name) {\n throw new Error(\n `[assembly] member at index ${i} has an empty name — members are referenced by variable name in constraints`,\n )\n }\n })\n\n const memberMap = new Map<string, Shape>()\n members.forEach((m, i) => {\n const name = memberNames[i]\n if (name && !memberMap.has(name)) memberMap.set(name, m)\n })\n // kernel 仅 TopoRef/边引用解析需要;backends 未配置(纯位姿场景/单测)→ null,\n // 此时快照引用仍可解,TopoRef 引用按 E_TOPO_NOT_FOUND 显式报错\n let kernel: BrepEngineApi | null = null\n try {\n kernel = getBrepApi()\n } catch {\n // backends not configured — snapshot-form constraints still solvable\n }\n const env: EntityResolutionEnv = { kernel, memberOf: (p: string) => memberMap.get(p) }\n\n const lowered: ReturnType<typeof lowerStructuralConstraint>['constraint'][] = []\n const depOrigins = new Map<string, AssemblyVec3>()\n for (const raw of constraints) {\n const c = normalizeConstraint(raw)\n const { constraint, depOrigin } = lowerStructuralConstraint(c, env)\n lowered.push(constraint)\n if (depOrigin && constraint.entityB) depOrigins.set(constraint.entityB.node, depOrigin)\n }\n\n const result = solveConstraints([...memberNames], lowered)\n if (!result.converged) {\n throw new Error(\n `[assembly] constraint solve did not converge (dof=${result.dof}); unsupported: ` +\n (result.unsupported.length > 0 ? result.unsupported.join(', ') : '(no detail)'),\n )\n }\n\n // per-member 终态(L6 修复):恒等位姿(锚定/链根)不输出,引擎不重算\n const transforms: AssemblyTransform[] = []\n for (const [node, rawPose] of result.transforms) {\n const pose: SolverPose = rawPose\n if (isIdentityPose(pose)) continue\n const index = memberNames.indexOf(node)\n if (index < 0) continue\n const pivot = depOrigins.get(node) ?? ([0, 0, 0] as AssemblyVec3)\n transforms.push(poseToAssemblyTransform(pose, pivot, index))\n }\n return { transforms, dof: result.dof, converged: result.converged, unsupported: result.unsupported }\n}\n\n/**\n * 求解装配(约束 + 运动副,P3):先跑约束求解得到 per-member 终态,再跑\n * solveKinematics 得到 joints 的 per-member 位姿,以**成员名**为键用 joints 结果\n * 覆盖同名成员的约束解,得到唯一一张表——**在库侧一次合并**,调用方一次性\n * setPendingAssemblyTransforms(禁止引擎侧两次登记)。\n *\n * 诊断不混用:joints 不参与 solveConstraints 的 converged/dof/unsupported 统计;\n * 覆盖发生时在 warnings 里各记一条(D-P3-1)。kinematics 为全成员位姿表(含\n * 恒等链根),供宿主从 ExecutionResult.kinematics 消费。\n *\n * joints 为空 → 退化为基础 solveAssembly 行为(无 kinematics/warnings 字段)。\n *\n * @param members - member shapes (aligned with memberNames).\n * @param memberNames - member variable names (R7: empty names throw).\n * @param constraints - raw constraints (may be empty).\n * @param joints - raw joint declarations (may be empty).\n * @param drive - per-child DOF value overrides (may be undefined).\n * @param opts - optional solver options (forwarded to the base constraint solve).\n * @returns the merged solve result (transforms + diagnostics + kinematics/warnings).\n */\nexport function solveAssemblyAndKinematics(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n joints: JointSpec[] = [],\n drive?: Record<string, number | number[]>,\n opts?: SolveOptions,\n): AssemblySolveResult {\n const base = solveAssembly(members, memberNames, constraints, opts)\n if (joints.length === 0) return base\n\n const kin = solveKinematics(memberNames, joints, drive)\n // 合并:以成员名为键,joints 结果覆盖同名成员的约束解(唯一一张表)\n const merged = new Map<string, AssemblyTransform>()\n for (const t of base.transforms) {\n const name = memberNames[t.index]\n if (name) merged.set(name, t)\n }\n const warnings: string[] = []\n for (const t of kin.transforms) {\n const name = memberNames[t.index]\n if (!name) continue\n if (merged.has(name)) {\n warnings.push(`[assembly] joint '${name}' overrides the constraint solution for member '${name}'`)\n }\n merged.set(name, t)\n }\n // 按成员下标升序输出(与约束解的 Map 遍历序解耦,输出顺序确定)\n const transforms = [...merged.entries()]\n .map(([name, t]) => ({ name, t }))\n .sort((a, b) => memberNames.indexOf(a.name) - memberNames.indexOf(b.name))\n .map(({ t }) => t)\n\n return {\n transforms,\n dof: base.dof,\n converged: base.converged,\n unsupported: base.unsupported,\n kinematics: kin.kinematics,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assembly tree — core 自有实现(§5.6 移植:vendored assemblyFns 逐字对齐,纯数据结构)。
|
|
3
|
+
*
|
|
4
|
+
* An assembly is a tree of nodes. Each node has an optional shape,
|
|
5
|
+
* a local transform (translation + rotation), optional metadata,
|
|
6
|
+
* and child nodes. This is a pure data structure with no kernel calls.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const asm = createAssemblyNode('root')
|
|
10
|
+
* |> addChild(_, createAssemblyNode('part-a', { shape: boxShape, translate: [10, 0, 0] }))
|
|
11
|
+
* |> addChild(_, createAssemblyNode('part-b', { shape: cylShape }));
|
|
12
|
+
*/
|
|
13
|
+
import type { Shape } from '../../../mesh/types.js';
|
|
14
|
+
/** 3D vector(core 本地别名,§5.6 移植)。 */
|
|
15
|
+
export type Vec3 = readonly [number, number, number];
|
|
16
|
+
/**
|
|
17
|
+
* A node in an assembly tree: optional shape, local transform, metadata, and children.
|
|
18
|
+
*/
|
|
19
|
+
export interface AssemblyNode {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly shape?: Shape;
|
|
22
|
+
readonly translate?: Vec3;
|
|
23
|
+
readonly rotate?: {
|
|
24
|
+
angle: number;
|
|
25
|
+
axis?: Vec3;
|
|
26
|
+
};
|
|
27
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
28
|
+
readonly children: ReadonlyArray<AssemblyNode>;
|
|
29
|
+
readonly mates?: readonly unknown[];
|
|
30
|
+
/** Drivable kinematic joints (see jointFns). Typed loosely to avoid a cycle. */
|
|
31
|
+
readonly joints?: readonly unknown[];
|
|
32
|
+
}
|
|
33
|
+
/** Optional properties for creating or updating an assembly node. */
|
|
34
|
+
export interface AssemblyNodeOptions {
|
|
35
|
+
shape?: Shape;
|
|
36
|
+
translate?: Vec3;
|
|
37
|
+
rotate?: {
|
|
38
|
+
angle: number;
|
|
39
|
+
axis?: Vec3;
|
|
40
|
+
};
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a new assembly node.
|
|
45
|
+
* @param name - Name of the node.
|
|
46
|
+
* @param options - Optional shape, transform, and metadata.
|
|
47
|
+
* @returns The newly created assembly node.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createAssemblyNode(name: string, options?: AssemblyNodeOptions): AssemblyNode;
|
|
50
|
+
/**
|
|
51
|
+
* Add a child node. Returns a new parent node.
|
|
52
|
+
* @param parent - The parent node to extend.
|
|
53
|
+
* @param child - The child node to append.
|
|
54
|
+
* @returns A new parent node with the child added.
|
|
55
|
+
*/
|
|
56
|
+
export declare function addChild(parent: AssemblyNode, child: AssemblyNode): AssemblyNode;
|
|
57
|
+
/**
|
|
58
|
+
* Remove a child by name (first match). Returns a new parent node.
|
|
59
|
+
* @param parent - The parent node to modify.
|
|
60
|
+
* @param childName - Name of the child to remove.
|
|
61
|
+
* @returns A new parent node with the child removed.
|
|
62
|
+
*/
|
|
63
|
+
export declare function removeChild(parent: AssemblyNode, childName: string): AssemblyNode;
|
|
64
|
+
/**
|
|
65
|
+
* Update a node's properties. Returns a new node.
|
|
66
|
+
* @param node - The node to update.
|
|
67
|
+
* @param updates - Partial options to apply.
|
|
68
|
+
* @returns A new node with the updates applied.
|
|
69
|
+
*/
|
|
70
|
+
export declare function updateNode(node: AssemblyNode, updates: Partial<AssemblyNodeOptions>): AssemblyNode;
|
|
71
|
+
/**
|
|
72
|
+
* Find a node by name (depth-first). Returns undefined if not found.
|
|
73
|
+
* @param root - Root of the subtree to search.
|
|
74
|
+
* @param name - Name of the node to find.
|
|
75
|
+
* @returns The first matching node, or undefined.
|
|
76
|
+
*/
|
|
77
|
+
export declare function findNode(root: AssemblyNode, name: string): AssemblyNode | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Walk the tree depth-first, calling visitor for each node.
|
|
80
|
+
* @param root - Root node to walk from.
|
|
81
|
+
* @param visitor - Callback invoked with each node and its depth.
|
|
82
|
+
* @param depth - Starting depth (used internally for recursion).
|
|
83
|
+
* @returns Nothing.
|
|
84
|
+
*/
|
|
85
|
+
export declare function walkAssembly(root: AssemblyNode, visitor: (node: AssemblyNode, depth: number) => void, depth?: number): void;
|
|
86
|
+
/**
|
|
87
|
+
* Count all nodes in the tree.
|
|
88
|
+
* @param root - Root node to count from.
|
|
89
|
+
* @returns Total number of nodes including the root.
|
|
90
|
+
*/
|
|
91
|
+
export declare function countNodes(root: AssemblyNode): number;
|
|
92
|
+
/**
|
|
93
|
+
* Collect all shapes in the tree (depth-first).
|
|
94
|
+
* @param root - Root node to collect from.
|
|
95
|
+
* @returns All shapes found on nodes in the tree.
|
|
96
|
+
*/
|
|
97
|
+
export declare function collectShapes(root: AssemblyNode): Shape[];
|
|
98
|
+
//# sourceMappingURL=assembly-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembly-tree.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,oCAAoC;AACpC,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACtC;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAShG;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,YAAY,CAQd;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOnF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EACpD,KAAK,SAAI,GACR,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,CAMzD"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assembly tree — core 自有实现(§5.6 移植:vendored assemblyFns 逐字对齐,纯数据结构)。
|
|
3
|
+
*
|
|
4
|
+
* An assembly is a tree of nodes. Each node has an optional shape,
|
|
5
|
+
* a local transform (translation + rotation), optional metadata,
|
|
6
|
+
* and child nodes. This is a pure data structure with no kernel calls.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const asm = createAssemblyNode('root')
|
|
10
|
+
* |> addChild(_, createAssemblyNode('part-a', { shape: boxShape, translate: [10, 0, 0] }))
|
|
11
|
+
* |> addChild(_, createAssemblyNode('part-b', { shape: cylShape }));
|
|
12
|
+
*/
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constructors
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Create a new assembly node.
|
|
18
|
+
* @param name - Name of the node.
|
|
19
|
+
* @param options - Optional shape, transform, and metadata.
|
|
20
|
+
* @returns The newly created assembly node.
|
|
21
|
+
*/
|
|
22
|
+
export function createAssemblyNode(name, options = {}) {
|
|
23
|
+
return {
|
|
24
|
+
name,
|
|
25
|
+
children: [],
|
|
26
|
+
...(options.shape !== undefined ? { shape: options.shape } : {}),
|
|
27
|
+
...(options.translate !== undefined ? { translate: options.translate } : {}),
|
|
28
|
+
...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
|
|
29
|
+
...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Immutable tree operations
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Add a child node. Returns a new parent node.
|
|
37
|
+
* @param parent - The parent node to extend.
|
|
38
|
+
* @param child - The child node to append.
|
|
39
|
+
* @returns A new parent node with the child added.
|
|
40
|
+
*/
|
|
41
|
+
export function addChild(parent, child) {
|
|
42
|
+
return { ...parent, children: [...parent.children, child] };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remove a child by name (first match). Returns a new parent node.
|
|
46
|
+
* @param parent - The parent node to modify.
|
|
47
|
+
* @param childName - Name of the child to remove.
|
|
48
|
+
* @returns A new parent node with the child removed.
|
|
49
|
+
*/
|
|
50
|
+
export function removeChild(parent, childName) {
|
|
51
|
+
const idx = parent.children.findIndex((c) => c.name === childName);
|
|
52
|
+
if (idx === -1)
|
|
53
|
+
return parent;
|
|
54
|
+
const children = [...parent.children];
|
|
55
|
+
children.splice(idx, 1);
|
|
56
|
+
return { ...parent, children };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Update a node's properties. Returns a new node.
|
|
60
|
+
* @param node - The node to update.
|
|
61
|
+
* @param updates - Partial options to apply.
|
|
62
|
+
* @returns A new node with the updates applied.
|
|
63
|
+
*/
|
|
64
|
+
export function updateNode(node, updates) {
|
|
65
|
+
return {
|
|
66
|
+
...node,
|
|
67
|
+
...(updates.shape !== undefined ? { shape: updates.shape } : {}),
|
|
68
|
+
...(updates.translate !== undefined ? { translate: updates.translate } : {}),
|
|
69
|
+
...(updates.rotate !== undefined ? { rotate: updates.rotate } : {}),
|
|
70
|
+
...(updates.metadata !== undefined ? { metadata: updates.metadata } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Traversal
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Find a node by name (depth-first). Returns undefined if not found.
|
|
78
|
+
* @param root - Root of the subtree to search.
|
|
79
|
+
* @param name - Name of the node to find.
|
|
80
|
+
* @returns The first matching node, or undefined.
|
|
81
|
+
*/
|
|
82
|
+
export function findNode(root, name) {
|
|
83
|
+
if (root.name === name)
|
|
84
|
+
return root;
|
|
85
|
+
for (const child of root.children) {
|
|
86
|
+
const found = findNode(child, name);
|
|
87
|
+
if (found)
|
|
88
|
+
return found;
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Walk the tree depth-first, calling visitor for each node.
|
|
94
|
+
* @param root - Root node to walk from.
|
|
95
|
+
* @param visitor - Callback invoked with each node and its depth.
|
|
96
|
+
* @param depth - Starting depth (used internally for recursion).
|
|
97
|
+
* @returns Nothing.
|
|
98
|
+
*/
|
|
99
|
+
export function walkAssembly(root, visitor, depth = 0) {
|
|
100
|
+
visitor(root, depth);
|
|
101
|
+
for (const child of root.children) {
|
|
102
|
+
walkAssembly(child, visitor, depth + 1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Count all nodes in the tree.
|
|
107
|
+
* @param root - Root node to count from.
|
|
108
|
+
* @returns Total number of nodes including the root.
|
|
109
|
+
*/
|
|
110
|
+
export function countNodes(root) {
|
|
111
|
+
let count = 1;
|
|
112
|
+
for (const child of root.children) {
|
|
113
|
+
count += countNodes(child);
|
|
114
|
+
}
|
|
115
|
+
return count;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Collect all shapes in the tree (depth-first).
|
|
119
|
+
* @param root - Root node to collect from.
|
|
120
|
+
* @returns All shapes found on nodes in the tree.
|
|
121
|
+
*/
|
|
122
|
+
export function collectShapes(root) {
|
|
123
|
+
const shapes = [];
|
|
124
|
+
walkAssembly(root, (node) => {
|
|
125
|
+
if (node.shape)
|
|
126
|
+
shapes.push(node.shape);
|
|
127
|
+
});
|
|
128
|
+
return shapes;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=assembly-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembly-tree.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Assembly tree — core 自有实现(§5.6 移植:vendored assemblyFns 逐字对齐,纯数据结构)。\n *\n * An assembly is a tree of nodes. Each node has an optional shape,\n * a local transform (translation + rotation), optional metadata,\n * and child nodes. This is a pure data structure with no kernel calls.\n *\n * Usage:\n * const asm = createAssemblyNode('root')\n * |> addChild(_, createAssemblyNode('part-a', { shape: boxShape, translate: [10, 0, 0] }))\n * |> addChild(_, createAssemblyNode('part-b', { shape: cylShape }));\n */\n\nimport type { Shape } from '../../../mesh/types'\n\n/** 3D vector(core 本地别名,§5.6 移植)。 */\nexport type Vec3 = readonly [number, number, number];\n\n// ---------------------------------------------------------------------------\n// Assembly types\n// ---------------------------------------------------------------------------\n\n/**\n * A node in an assembly tree: optional shape, local transform, metadata, and children.\n */\nexport interface AssemblyNode {\n readonly name: string;\n readonly shape?: Shape;\n readonly translate?: Vec3;\n readonly rotate?: { angle: number; axis?: Vec3 };\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly children: ReadonlyArray<AssemblyNode>;\n readonly mates?: readonly unknown[];\n /** Drivable kinematic joints (see jointFns). Typed loosely to avoid a cycle. */\n readonly joints?: readonly unknown[];\n}\n\n/** Optional properties for creating or updating an assembly node. */\nexport interface AssemblyNodeOptions {\n shape?: Shape;\n translate?: Vec3;\n rotate?: { angle: number; axis?: Vec3 };\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new assembly node.\n * @param name - Name of the node.\n * @param options - Optional shape, transform, and metadata.\n * @returns The newly created assembly node.\n */\nexport function createAssemblyNode(name: string, options: AssemblyNodeOptions = {}): AssemblyNode {\n return {\n name,\n children: [],\n ...(options.shape !== undefined ? { shape: options.shape } : {}),\n ...(options.translate !== undefined ? { translate: options.translate } : {}),\n ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Immutable tree operations\n// ---------------------------------------------------------------------------\n\n/**\n * Add a child node. Returns a new parent node.\n * @param parent - The parent node to extend.\n * @param child - The child node to append.\n * @returns A new parent node with the child added.\n */\nexport function addChild(parent: AssemblyNode, child: AssemblyNode): AssemblyNode {\n return { ...parent, children: [...parent.children, child] };\n}\n\n/**\n * Remove a child by name (first match). Returns a new parent node.\n * @param parent - The parent node to modify.\n * @param childName - Name of the child to remove.\n * @returns A new parent node with the child removed.\n */\nexport function removeChild(parent: AssemblyNode, childName: string): AssemblyNode {\n const idx = parent.children.findIndex((c) => c.name === childName);\n if (idx === -1) return parent;\n const children = [...parent.children];\n children.splice(idx, 1);\n return { ...parent, children };\n}\n\n/**\n * Update a node's properties. Returns a new node.\n * @param node - The node to update.\n * @param updates - Partial options to apply.\n * @returns A new node with the updates applied.\n */\nexport function updateNode(\n node: AssemblyNode,\n updates: Partial<AssemblyNodeOptions>\n): AssemblyNode {\n return {\n ...node,\n ...(updates.shape !== undefined ? { shape: updates.shape } : {}),\n ...(updates.translate !== undefined ? { translate: updates.translate } : {}),\n ...(updates.rotate !== undefined ? { rotate: updates.rotate } : {}),\n ...(updates.metadata !== undefined ? { metadata: updates.metadata } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Traversal\n// ---------------------------------------------------------------------------\n\n/**\n * Find a node by name (depth-first). Returns undefined if not found.\n * @param root - Root of the subtree to search.\n * @param name - Name of the node to find.\n * @returns The first matching node, or undefined.\n */\nexport function findNode(root: AssemblyNode, name: string): AssemblyNode | undefined {\n if (root.name === name) return root;\n for (const child of root.children) {\n const found = findNode(child, name);\n if (found) return found;\n }\n return undefined;\n}\n\n/**\n * Walk the tree depth-first, calling visitor for each node.\n * @param root - Root node to walk from.\n * @param visitor - Callback invoked with each node and its depth.\n * @param depth - Starting depth (used internally for recursion).\n * @returns Nothing.\n */\nexport function walkAssembly(\n root: AssemblyNode,\n visitor: (node: AssemblyNode, depth: number) => void,\n depth = 0\n): void {\n visitor(root, depth);\n for (const child of root.children) {\n walkAssembly(child, visitor, depth + 1);\n }\n}\n\n/**\n * Count all nodes in the tree.\n * @param root - Root node to count from.\n * @returns Total number of nodes including the root.\n */\nexport function countNodes(root: AssemblyNode): number {\n let count = 1;\n for (const child of root.children) {\n count += countNodes(child);\n }\n return count;\n}\n\n/**\n * Collect all shapes in the tree (depth-first).\n * @param root - Root node to collect from.\n * @returns All shapes found on nodes in the tree.\n */\nexport function collectShapes(root: AssemblyNode): Shape[] {\n const shapes: Shape[] = [];\n walkAssembly(root, (node) => {\n if (node.shape) shapes.push(node.shape);\n });\n return shapes;\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constraint solver (chain) — core 自有实现(§5.6 移植:vendored solverAdapter 逐字对齐)。
|
|
3
|
+
*
|
|
4
|
+
* 移植来源:packages/brepjs/src/kernel/solverAdapter.ts(Phase 5 随 brepjs 包删除前
|
|
5
|
+
* 已做 parity 对拍——本文件与 vendored 行为逐项一致,无重新设计)。
|
|
6
|
+
* 类型 SolverEntity/SolverConstraint/SolverResult 迁入 ./types(§5.6.1,消费方共用)。
|
|
7
|
+
*/
|
|
8
|
+
import type { SolverConstraint, SolverResult } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Solve assembly constraints analytically.
|
|
11
|
+
*
|
|
12
|
+
* Handles: fixed, concentric (axis-axis), angle (plane-plane orientation), and
|
|
13
|
+
* coincident/distance for any supported entity-type pair (plane-plane,
|
|
14
|
+
* plane-point, point-point, axis-axis, axis-point, and both point orders — see
|
|
15
|
+
* `TRANSLATIONAL_PAIRS`). For a positioning mate, entityA is the reference and
|
|
16
|
+
* entityB the dependent. Chain roots (nodes never positioned by a
|
|
17
|
+
* mate) and explicit `fixed` nodes anchor at the origin; constraints then resolve
|
|
18
|
+
* in topological order — each places its dependent against the reference's solved
|
|
19
|
+
* pose (rotation included), so multi-body chains compose. Returns
|
|
20
|
+
* `converged: false` with details for entity-type mismatches and any constraint
|
|
21
|
+
* whose reference never resolves.
|
|
22
|
+
* @param nodes - Names of the nodes participating in the assembly.
|
|
23
|
+
* @param constraints - Constraints to solve.
|
|
24
|
+
* @returns The solver result with per-node transforms, DOF count, and convergence info.
|
|
25
|
+
*/
|
|
26
|
+
export declare function solveConstraints(nodes: string[], constraints: SolverConstraint[]): SolverResult;
|
|
27
|
+
//# sourceMappingURL=chain-solver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-solver.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/chain-solver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAgB,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4Q3E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,YAAY,CA6E/F"}
|