@faicad/faijs 0.16.0 → 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
package/LICENSE
CHANGED
|
@@ -22,8 +22,7 @@ SOFTWARE.
|
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
full attribution. Apache-2.0 text: https://www.apache.org/licenses/LICENSE-2.0
|
|
25
|
+
The brepjs-derived sources (compat facade) in `src/api/` retain their
|
|
26
|
+
Apache-2.0 attribution, which now lives in the standalone
|
|
27
|
+
`@faicad/faijs-brepjs` package (see `@faicad/faijs-brepjs` NOTICE and
|
|
28
|
+
LICENSE). Apache-2.0 text: https://www.apache.org/licenses/LICENSE-2.0
|
package/NOTICE
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
faijs — @faicad/faijs NOTICE
|
|
2
2
|
============================
|
|
3
3
|
|
|
4
|
-
This product
|
|
5
|
-
(https://github.com/OpenCascade/brepjs
|
|
6
|
-
License 2.0
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
repository (packages/core/src/vendored/brepjs/NOTICE).
|
|
4
|
+
This product's brepjs-compat facade contains code ported from the
|
|
5
|
+
`brepjs` project (https://github.com/OpenCascade/brepjs, licensed under
|
|
6
|
+
the Apache License 2.0, locked at upstream commit 8685273a).
|
|
7
|
+
The ported sources now live in the standalone `@faicad/faijs-brepjs`
|
|
8
|
+
package; its NOTICE and LICENSE carry the full attribution.
|
|
10
9
|
|
|
11
10
|
Full Apache-2.0 text: https://www.apache.org/licenses/LICENSE-2.0
|
|
12
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAyCH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAmDpD"}
|
|
@@ -27,13 +27,24 @@ import { knurl } from './knurl.js';
|
|
|
27
27
|
import { sdf } from './sdf.js';
|
|
28
28
|
import { screw } from './screw.js';
|
|
29
29
|
import { sketch } from './sketch.js';
|
|
30
|
+
import { wire } from './wire.js';
|
|
31
|
+
import { helix } from './helix.js';
|
|
30
32
|
import { union, subtract, intersect, cut } from './boolean.js';
|
|
31
33
|
import { split } from './split.js';
|
|
34
|
+
import { sweep } from './sweep.js';
|
|
35
|
+
import { loft } from './loft.js';
|
|
32
36
|
import { linearPattern } from './pattern.js';
|
|
33
37
|
import { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate.js';
|
|
34
38
|
import { engrave } from './engrave.js';
|
|
35
39
|
import { chamfer } from './chamfer.js';
|
|
36
40
|
import { fillet } from './fillet.js';
|
|
41
|
+
import { shell } from './shell.js';
|
|
42
|
+
import { draft } from './draft.js';
|
|
43
|
+
import { thicken } from './thicken.js';
|
|
44
|
+
import { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair.js';
|
|
45
|
+
import { filletVariable } from './fillet-variable.js';
|
|
46
|
+
import { splitByPlane } from './split-by-plane.js';
|
|
47
|
+
import { sectionByPlane } from './section-by-plane.js';
|
|
37
48
|
import { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom.js';
|
|
38
49
|
import { edgeRef } from './edge-ref.js';
|
|
39
50
|
import { faceRef } from './face-ref.js';
|
|
@@ -64,12 +75,19 @@ export function createApiNamespace() {
|
|
|
64
75
|
return {
|
|
65
76
|
contractVersion: CONTRACT_VERSION,
|
|
66
77
|
box, sphere, cylinder, cone, wedge,
|
|
67
|
-
screw, sketch, sdf,
|
|
78
|
+
screw, sketch, wire, helix, sdf,
|
|
68
79
|
// D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。
|
|
69
80
|
translate, rotate_euler, scale, scale3d,
|
|
70
81
|
engrave, chamfer, fillet, knurl,
|
|
82
|
+
// Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。
|
|
83
|
+
shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,
|
|
84
|
+
defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,
|
|
71
85
|
union, subtract, intersect,
|
|
72
86
|
extrude, revolve,
|
|
87
|
+
// Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。
|
|
88
|
+
// arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,
|
|
89
|
+
// 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。
|
|
90
|
+
sweep, loft,
|
|
73
91
|
faceNormal, bboxCenter, bboxMin, bboxMax,
|
|
74
92
|
edgeRef,
|
|
75
93
|
faceRef,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrE,iEAAiE;AACjE,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB;IAChC,6EAA6E;IAC7E,0EAA0E;IAC1E,6DAA6D;IAC7D,OAAO;QACL,eAAe,EAAE,gBAAgB;QACjC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;QAClC,KAAK,EAAE,MAAM,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)\n *\n *\n * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。\n *\n * 归属(monorepo P5/E-a-1):本文件随 stdlib 出包,是 faijs 默认标准库\n * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /\n * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)\n * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,\n * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中\n * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { sketch } from './sketch'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { StdlibNamespace } from '../runtime-state'\n\n/**\n * Assemble stdlib functions into the cad namespace.\n *\n * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,经 `compatOp(projectBrepOp(…))` 包装的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与\n * `api/index.ts` 导出面同源于同一份清单。\n *\n * @returns the assembled StdlibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): StdlibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because StdlibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, sketch, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as StdlibNamespace\n}\n"]}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import type { Shape } from '../../mesh/types.js';
|
|
17
17
|
import type { BrepEngineApi } from '../../brep/engine/primitives.js';
|
|
18
|
-
import type { SolverEntity } from '
|
|
18
|
+
import type { SolverEntity } from './solvers/types.js';
|
|
19
19
|
import { type ResolvedFaceGeometry } from '../topo-resolve.js';
|
|
20
20
|
import type { EntityRef } from './types.js';
|
|
21
21
|
/** 实体抽取环境:内核(null = mesh/primitive 行快照路径)+ 成员查找。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,SAAS,CAAA;AAEtD,oDAAoD;AACpD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,2BAA2B;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAA;CAC9C;AAQD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,GAAG,YAAY,CAiBnF;AAOD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,GAAG,oBAAoB,CAcvG;AAqCD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,GAAG,YAAY,CA4C1F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAAE,YAAY,EAAiB,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,GAEpB,MAAM,iBAAiB,CAAA;AAUxB,qCAAqC;AACrC,SAAS,iBAAiB,CAAC,IAA0B;IACnD,OAAO,mCAAmC,IAAI,CAAC,WAAW,IAAI,SAAS,0BAA0B;QAC/F,oFAAoF,CAAA;AACxF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAA0B;IACnE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAA;IAC3B,IAAI,EAAE,KAAK,UAAU,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;IACnF,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;IACpE,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,oDAAoD,EAAE,EAAE;QACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CACrD,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,oBAAoB,CAAC,IAA0E;IACtG,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;AACpF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAc,EAAE,GAAwB;IAC/E,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IACzF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAiG,CAAA;IAClH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAAoD,CAAC,CAAA;IAC1G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,oBAAoB,CAAC,IAA4E,CAAC,CAAA;AAC3G,CAAC;AAED,4DAA4D;AAC5D,SAAS,0BAA0B,CACjC,MAAqB,EACrB,KAAY,EACZ,WAAiD,EACjD,IAAc;IAEd,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACrD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,iDAAiD,IAAI,sCAAsC,CAC5F,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;IAC/C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,yBAAyB,QAAQ,CAAC,OAAO,6BAA6B,IAAI,GAAG,CAC9E,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,gBAAgB,QAAQ,CAAC,OAAO,qDAAqD,CACtF,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAc,EAAE,GAAwB;IAC1E,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IAEzF,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;IAC7C,CAAC;IACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,0BAA0B,CAAC,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;QACvB,kDAAkD;QAClD,MAAM,GAAG,GAAG,2BAA2B,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC1D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,aAAa,GAAG,CAAC,SAAS,kCAAkC,GAAG,CAAC,IAAI,EAAE,CACvE,CAAA;QACH,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,aAAa,GAAG,CAAC,SAAS,uBAAuB,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,MAAM,SAAS,CAC3F,CAAA;QACH,CAAC;QACD,OAAO,0BAA0B,CAAC,4BAA4B,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACvF,CAAC;IACD,UAAU;IACV,MAAM,IAAI,GAAG,GAAG,CAAC,IAAuF,CAAA;IACxG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;IACnF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,0CAA0C,GAAG,CAAC,IAAI,2CAA2C,CAC9F,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,OAA+C,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1H,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;AACzE,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B,CACnC,GAAwB,EACxB,KAA0C,EAC1C,IAAc;IAEd,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAA+C,CAAC,CAAA;QAC/F,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAEN,CAAA;IACb,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,uCAAuC,IAAI,GAAG,CAAC,CAAA;IACpG,CAAC;IACD,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAA;AACH,CAAC","sourcesContent":["/**\n * api/assembly/entities — EntityRef → SolverEntity 实体抽取(P1,方案 §3.6 / §5.2)\n *\n * 三要素范式(与 chamfer 同构,方案 §3.5):\n * 1. 引用可序列化:EntityRef 进 .fai.js;\n * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);\n * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。\n *\n * 输出契约对齐 brepjs solverAdapter 的 SolverEntity:{ type: 'plane'|'axis'|'point',\n * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),\n * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。\n *\n * 缺轴(mesh 行快照无宿主注入的 axis、sphere 等无轴面类型)→ 抛\n * E_TOPO_NOT_FOUND(方案 R4/P0 验收③:绝不静默降级)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { PartName } from '../../identity'\nimport type { SolverEntity } from '../../vendored/brepjs/kernel/solverAdapter'\nimport { TopoRefError, type AxisHint } from '../../topology/naming'\nimport { resolveTopoRef, captureEdgeAxis, captureFaceHint } from '../../topology/naming'\nimport {\n buildShapeResolutionContext,\n buildEdgeResolutionContext,\n resolveFaceGeometry,\n type ResolvedFaceGeometry,\n} from '../topo-resolve'\nimport type { EntityRef, AssemblyVec3 } from './types'\n\n/** 实体抽取环境:内核(null = mesh/primitive 行快照路径)+ 成员查找。 */\nexport interface EntityResolutionEnv {\n kernel: BrepEngineApi | null\n /** part 变量名 → 成员 Shape。 */\n memberOf: (part: string) => Shape | undefined\n}\n\n/** 无轴可用的报错信息后缀(E_TOPO_NOT_FOUND)。 */\nfunction missingAxisReason(geom: ResolvedFaceGeometry): string {\n return `face needs an axis (surfaceType=${geom.surfaceType ?? 'unknown'}) but none is available ` +\n `(BREP path: captureFaceHint; mesh path: host must inject axis into the naming row)`\n}\n\n/**\n * 面几何 → SolverEntity(方案 §5.2 抽取规则表)。\n * 平面 → plane;圆柱/圆锥(有轴)→ axis;其它/缺轴 → E_TOPO_NOT_FOUND。\n *\n * @param geom - the resolved face geometry (live BREP or mesh row snapshot).\n * @returns the solver entity (plane or axis).\n * @throws TopoRefError with code E_TOPO_NOT_FOUND when the surface has no usable axis or is unsupported.\n */\nexport function faceGeometryToSolverEntity(geom: ResolvedFaceGeometry): SolverEntity {\n const st = geom.surfaceType\n if (st === 'cylinder' || st === 'cone') {\n if (!geom.axis) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', missingAxisReason(geom))\n }\n return { type: 'axis', origin: geom.axis.origin, direction: geom.axis.direction }\n }\n if (!st || st === 'plane') {\n return { type: 'plane', origin: geom.center, normal: geom.normal }\n }\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `unsupported surface type for an assembly entity: ${st}` +\n (geom.axis ? '' : ` (${missingAxisReason(geom)})`),\n )\n}\n\n/** 快照形态 FaceRef → ResolvedFaceGeometry(无 axis——贴合语义只需 center+normal)。 */\nfunction snapshotFaceGeometry(face: { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 }): ResolvedFaceGeometry {\n return { surfaceType: face.surfaceType, center: face.center, normal: face.normal }\n}\n\n/**\n * 解析一个 EntityRef 的面几何(mate/align 降级路径用:只需 center + normal,\n * 圆柱面轴不参与贴合——方案 §3.7.4 适用边界)。\n *\n * @param ref - the entity reference (must be a face reference).\n * @param env - the resolution environment.\n * @returns the resolved face geometry.\n * @throws Error when the ref is not a face reference or the part is unknown.\n */\nexport function resolveFaceGeometryOfRef(ref: EntityRef, env: EntityResolutionEnv): ResolvedFaceGeometry {\n if (!('face' in ref)) {\n throw new Error('[assembly] mate/align constraints require face references on both sides')\n }\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n const face = ref.face as { topoRef?: unknown; center?: AssemblyVec3; normal?: AssemblyVec3; surfaceType?: string }\n if (face.topoRef) {\n return resolveFaceGeometry(env.kernel, shape, face.topoRef as Parameters<typeof resolveFaceGeometry>[2])\n }\n if (!face.center || !face.normal) {\n throw new Error('[assembly] face snapshot requires center and normal')\n }\n return snapshotFaceGeometry(face as { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 })\n}\n\n/** 边 TopoRef → 轴(BREP 现场;mesh 无邻接能力 → E_TOPO_NOT_FOUND)。 */\nfunction resolveEdgeAxisFromTopoRef(\n kernel: BrepEngineApi,\n shape: Shape,\n edgeTopoRef: Parameters<typeof resolveTopoRef>[0],\n part: PartName,\n): AxisHint {\n const ctx = buildEdgeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge entity needs a BREP naming context (part=${part}); mesh parts have no edge adjacency`,\n )\n }\n const resolved = resolveTopoRef(edgeTopoRef, ctx)\n const entry = ctx.edges?.[resolved.ordinal - 1]\n if (!entry?.handle) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `resolved edge ordinal ${resolved.ordinal} has no live handle (part=${part})`,\n )\n }\n const axis = captureEdgeAxis(kernel, entry.handle)\n if (!axis) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge ordinal ${resolved.ordinal} is not a line or circle — no axis entity available`,\n )\n }\n return axis\n}\n\n/**\n * 解析一个 EntityRef → SolverEntity(coincident/concentric/distance/angle 直译路径)。\n *\n * @param ref - the entity reference.\n * @param env - the resolution environment.\n * @returns the solver entity (pure data).\n * @throws TopoRefError / Error on unresolvable or unsupported references.\n */\nexport function resolveSolverEntity(ref: EntityRef, env: EntityResolutionEnv): SolverEntity {\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n\n if ('point' in ref) {\n return { type: 'point', origin: ref.point }\n }\n if ('face' in ref) {\n return faceGeometryToSolverEntity(resolveFaceGeometryOfRef(ref, env))\n }\n if ('faceIndex' in ref) {\n // 序号简写(1 起,调试用):直接按 ordinal 取候选面几何(不走 TopoRef 打分)\n const ctx = buildShapeResolutionContext(env.kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} has no naming context on part ${ref.part}`,\n )\n }\n const entry = ctx.faces[ref.faceIndex - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} out of range (part ${ref.part} has ${ctx.faces.length} faces)`,\n )\n }\n return faceGeometryToSolverEntity(faceGeometryFromContextEntry(env, entry, ref.part))\n }\n // edge 引用\n const edge = ref.edge as { topoRef?: unknown; axis?: { origin: AssemblyVec3; direction: AssemblyVec3 } }\n if (edge.axis) {\n return { type: 'axis', origin: edge.axis.origin, direction: edge.axis.direction }\n }\n if (!env.kernel) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge TopoRef needs a live kernel (part=${ref.part}); mesh path supports only axis snapshots`,\n )\n }\n const axis = resolveEdgeAxisFromTopoRef(env.kernel, shape, edge.topoRef as Parameters<typeof resolveTopoRef>[0], ref.part)\n return { type: 'axis', origin: axis.origin, direction: axis.direction }\n}\n\n/**\n * faceIndex 简写的面几何(从解析上下文候选行直接取):\n * BREP 候选(活句柄)→ captureFaceHint 现场;行快照候选 → 行几何。\n */\nfunction faceGeometryFromContextEntry(\n env: EntityResolutionEnv,\n entry: { handle?: unknown; row?: unknown },\n part: PartName,\n): ResolvedFaceGeometry {\n if (entry.handle && env.kernel) {\n const hint = captureFaceHint(env.kernel, entry.handle as Parameters<typeof captureFaceHint>[1])\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n const hint = entry.row as\n | { surfaceType?: string; center?: AssemblyVec3; normal?: AssemblyVec3; axis?: AxisHint }\n | undefined\n if (!hint?.center || !hint?.normal) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceIndex row has no geometry (part=${part})`)\n }\n return {\n surfaceType: hint.surfaceType,\n center: hint.center,\n normal: hint.normal,\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/api/assembly/entities.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/entities — EntityRef → SolverEntity 实体抽取(P1,方案 §3.6 / §5.2)\n *\n * 三要素范式(与 chamfer 同构,方案 §3.5):\n * 1. 引用可序列化:EntityRef 进 .fai.js;\n * 2. 解析在执行期:TopoRef 复用 topo-resolve 的解析通道(BREP 现场 / mesh 行快照);\n * 3. 句柄是瞬态:解析出的几何立即转成纯数据 SolverEntity,句柄不跨语句。\n *\n * 输出契约对齐 brepjs solverAdapter 的 SolverEntity:{ type: 'plane'|'axis'|'point',\n * origin, normal?/direction? }。dependent 侧填本地坐标(部件自身坐标系),\n * reference 侧世界变换由 solverAdapter 的 transformEntity 负责——本层不做。\n *\n * 缺轴(mesh 行快照无宿主注入的 axis、sphere 等无轴面类型)→ 抛\n * E_TOPO_NOT_FOUND(方案 R4/P0 验收③:绝不静默降级)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { PartName } from '../../identity'\nimport type { SolverEntity } from './solvers/types'\nimport { TopoRefError, type AxisHint } from '../../topology/naming'\nimport { resolveTopoRef, captureEdgeAxis, captureFaceHint } from '../../topology/naming'\nimport {\n buildShapeResolutionContext,\n buildEdgeResolutionContext,\n resolveFaceGeometry,\n type ResolvedFaceGeometry,\n} from '../topo-resolve'\nimport type { EntityRef, AssemblyVec3 } from './types'\n\n/** 实体抽取环境:内核(null = mesh/primitive 行快照路径)+ 成员查找。 */\nexport interface EntityResolutionEnv {\n kernel: BrepEngineApi | null\n /** part 变量名 → 成员 Shape。 */\n memberOf: (part: string) => Shape | undefined\n}\n\n/** 无轴可用的报错信息后缀(E_TOPO_NOT_FOUND)。 */\nfunction missingAxisReason(geom: ResolvedFaceGeometry): string {\n return `face needs an axis (surfaceType=${geom.surfaceType ?? 'unknown'}) but none is available ` +\n `(BREP path: captureFaceHint; mesh path: host must inject axis into the naming row)`\n}\n\n/**\n * 面几何 → SolverEntity(方案 §5.2 抽取规则表)。\n * 平面 → plane;圆柱/圆锥(有轴)→ axis;其它/缺轴 → E_TOPO_NOT_FOUND。\n *\n * @param geom - the resolved face geometry (live BREP or mesh row snapshot).\n * @returns the solver entity (plane or axis).\n * @throws TopoRefError with code E_TOPO_NOT_FOUND when the surface has no usable axis or is unsupported.\n */\nexport function faceGeometryToSolverEntity(geom: ResolvedFaceGeometry): SolverEntity {\n const st = geom.surfaceType\n if (st === 'cylinder' || st === 'cone') {\n if (!geom.axis) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', missingAxisReason(geom))\n }\n return { type: 'axis', origin: geom.axis.origin, direction: geom.axis.direction }\n }\n if (!st || st === 'plane') {\n return { type: 'plane', origin: geom.center, normal: geom.normal }\n }\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `unsupported surface type for an assembly entity: ${st}` +\n (geom.axis ? '' : ` (${missingAxisReason(geom)})`),\n )\n}\n\n/** 快照形态 FaceRef → ResolvedFaceGeometry(无 axis——贴合语义只需 center+normal)。 */\nfunction snapshotFaceGeometry(face: { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 }): ResolvedFaceGeometry {\n return { surfaceType: face.surfaceType, center: face.center, normal: face.normal }\n}\n\n/**\n * 解析一个 EntityRef 的面几何(mate/align 降级路径用:只需 center + normal,\n * 圆柱面轴不参与贴合——方案 §3.7.4 适用边界)。\n *\n * @param ref - the entity reference (must be a face reference).\n * @param env - the resolution environment.\n * @returns the resolved face geometry.\n * @throws Error when the ref is not a face reference or the part is unknown.\n */\nexport function resolveFaceGeometryOfRef(ref: EntityRef, env: EntityResolutionEnv): ResolvedFaceGeometry {\n if (!('face' in ref)) {\n throw new Error('[assembly] mate/align constraints require face references on both sides')\n }\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n const face = ref.face as { topoRef?: unknown; center?: AssemblyVec3; normal?: AssemblyVec3; surfaceType?: string }\n if (face.topoRef) {\n return resolveFaceGeometry(env.kernel, shape, face.topoRef as Parameters<typeof resolveFaceGeometry>[2])\n }\n if (!face.center || !face.normal) {\n throw new Error('[assembly] face snapshot requires center and normal')\n }\n return snapshotFaceGeometry(face as { surfaceType?: string; center: AssemblyVec3; normal: AssemblyVec3 })\n}\n\n/** 边 TopoRef → 轴(BREP 现场;mesh 无邻接能力 → E_TOPO_NOT_FOUND)。 */\nfunction resolveEdgeAxisFromTopoRef(\n kernel: BrepEngineApi,\n shape: Shape,\n edgeTopoRef: Parameters<typeof resolveTopoRef>[0],\n part: PartName,\n): AxisHint {\n const ctx = buildEdgeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge entity needs a BREP naming context (part=${part}); mesh parts have no edge adjacency`,\n )\n }\n const resolved = resolveTopoRef(edgeTopoRef, ctx)\n const entry = ctx.edges?.[resolved.ordinal - 1]\n if (!entry?.handle) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `resolved edge ordinal ${resolved.ordinal} has no live handle (part=${part})`,\n )\n }\n const axis = captureEdgeAxis(kernel, entry.handle)\n if (!axis) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge ordinal ${resolved.ordinal} is not a line or circle — no axis entity available`,\n )\n }\n return axis\n}\n\n/**\n * 解析一个 EntityRef → SolverEntity(coincident/concentric/distance/angle 直译路径)。\n *\n * @param ref - the entity reference.\n * @param env - the resolution environment.\n * @returns the solver entity (pure data).\n * @throws TopoRefError / Error on unresolvable or unsupported references.\n */\nexport function resolveSolverEntity(ref: EntityRef, env: EntityResolutionEnv): SolverEntity {\n const shape = env.memberOf(ref.part)\n if (!shape) throw new Error(`[assembly] constraint references unknown part: ${ref.part}`)\n\n if ('point' in ref) {\n return { type: 'point', origin: ref.point }\n }\n if ('face' in ref) {\n return faceGeometryToSolverEntity(resolveFaceGeometryOfRef(ref, env))\n }\n if ('faceIndex' in ref) {\n // 序号简写(1 起,调试用):直接按 ordinal 取候选面几何(不走 TopoRef 打分)\n const ctx = buildShapeResolutionContext(env.kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} has no naming context on part ${ref.part}`,\n )\n }\n const entry = ctx.faces[ref.faceIndex - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceIndex ${ref.faceIndex} out of range (part ${ref.part} has ${ctx.faces.length} faces)`,\n )\n }\n return faceGeometryToSolverEntity(faceGeometryFromContextEntry(env, entry, ref.part))\n }\n // edge 引用\n const edge = ref.edge as { topoRef?: unknown; axis?: { origin: AssemblyVec3; direction: AssemblyVec3 } }\n if (edge.axis) {\n return { type: 'axis', origin: edge.axis.origin, direction: edge.axis.direction }\n }\n if (!env.kernel) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'edge',\n `edge TopoRef needs a live kernel (part=${ref.part}); mesh path supports only axis snapshots`,\n )\n }\n const axis = resolveEdgeAxisFromTopoRef(env.kernel, shape, edge.topoRef as Parameters<typeof resolveTopoRef>[0], ref.part)\n return { type: 'axis', origin: axis.origin, direction: axis.direction }\n}\n\n/**\n * faceIndex 简写的面几何(从解析上下文候选行直接取):\n * BREP 候选(活句柄)→ captureFaceHint 现场;行快照候选 → 行几何。\n */\nfunction faceGeometryFromContextEntry(\n env: EntityResolutionEnv,\n entry: { handle?: unknown; row?: unknown },\n part: PartName,\n): ResolvedFaceGeometry {\n if (entry.handle && env.kernel) {\n const hint = captureFaceHint(env.kernel, entry.handle as Parameters<typeof captureFaceHint>[1])\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n const hint = entry.row as\n | { surfaceType?: string; center?: AssemblyVec3; normal?: AssemblyVec3; axis?: AxisHint }\n | undefined\n if (!hint?.center || !hint?.normal) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceIndex row has no geometry (part=${part})`)\n }\n return {\n surfaceType: hint.surfaceType,\n center: hint.center,\n normal: hint.normal,\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n}\n"]}
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* 四元数顺序:faijs 对外 [x,y,z,w],brepjs [w,x,y,z]——只经 ./pose 的转换函数
|
|
19
19
|
* 换序,禁止在本模块手写分量重排。
|
|
20
20
|
*/
|
|
21
|
-
import { type Joint, type JointPose, type IKOptions as BrepjsIKOptions } from '
|
|
22
|
-
import { type AssemblyNode } from '
|
|
21
|
+
import { type Joint, type JointPose, type IKOptions as BrepjsIKOptions } from './solvers/joints-kinematics.js';
|
|
22
|
+
import { type AssemblyNode } from './solvers/assembly-tree.js';
|
|
23
23
|
import { type FaijsQuat } from './pose.js';
|
|
24
24
|
import type { AssemblyTransform } from '../../runtime-state.js';
|
|
25
25
|
import type { AssemblyVec3 } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joints.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAQL,KAAK,KAAK,EACV,KAAK,SAAS,EAEd,KAAK,SAAS,IAAI,eAAe,EAElC,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"joints.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* 四元数顺序:faijs 对外 [x,y,z,w],brepjs [w,x,y,z]——只经 ./pose 的转换函数
|
|
19
19
|
* 换序,禁止在本模块手写分量重排。
|
|
20
20
|
*/
|
|
21
|
-
import { revoluteJoint, prismaticJoint, forwardKinematics as brepjsForwardKinematics, mechanismDOF as brepjsMechanismDOF, jointTrajectory as brepjsJointTrajectory, inverseKinematics as brepjsInverseKinematics, addJoint, } from '
|
|
22
|
-
import { createAssemblyNode, addChild } from '
|
|
21
|
+
import { revoluteJoint, prismaticJoint, forwardKinematics as brepjsForwardKinematics, mechanismDOF as brepjsMechanismDOF, jointTrajectory as brepjsJointTrajectory, inverseKinematics as brepjsInverseKinematics, addJoint, } from './solvers/joints-kinematics.js';
|
|
22
|
+
import { createAssemblyNode, addChild } from './solvers/assembly-tree.js';
|
|
23
23
|
import { fromBrepjsQuat, toBrepjsQuat, jointPoseToAssemblyTransform, isIdentityPose, } from './pose.js';
|
|
24
24
|
// ── buildJoint:JointSpec → brepjs Joint ──
|
|
25
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joints.js","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/joints — 运动副声明与运动学解算(P3)\n *\n * JointSpec 是 .fai.js 可序列化子集(派生字段 dofs 由 vendored 工厂构造,\n * 与 brepjs Joint.dofs 的组合顺序对齐:cylindrical → [rotation, translation]、\n * planar → [u, v, rotation]、spherical → [x, y, z])。\n *\n * P3 首期只实现 revolute / prismatic 两种单 DOF 运动副;cylindrical / planar /\n * spherical 在 buildJoint 里显式抛错(绝不静默降级成单 DOF),待 per-DOF ranges\n * 启用(JointSpec.dofs 已按此预留)。\n *\n * 链路:JointSpec[] → buildJoint(vendored 工厂)→ buildKinematicTree(建树三步\n * + 校验)→ solveKinematics(vendored forwardKinematics)→ per-member 位姿。\n *\n * cad.* 查询函数(jointTrajectory / inverseKinematics / mechanismDOF)是无副作用\n * 纯函数:输入纯数据、输出纯数据,不挂在 assembly receiver 上。\n *\n * 四元数顺序:faijs 对外 [x,y,z,w],brepjs [w,x,y,z]——只经 ./pose 的转换函数\n * 换序,禁止在本模块手写分量重排。\n */\n\nimport {\n revoluteJoint,\n prismaticJoint,\n forwardKinematics as brepjsForwardKinematics,\n mechanismDOF as brepjsMechanismDOF,\n jointTrajectory as brepjsJointTrajectory,\n inverseKinematics as brepjsInverseKinematics,\n addJoint,\n type Joint,\n type JointPose,\n type IKResult as BrepjsIKResult,\n type IKOptions as BrepjsIKOptions,\n type IKTarget as BrepjsIKTarget,\n} from '../../vendored/brepjs/index'\nimport { createAssemblyNode, addChild, type AssemblyNode } from '../../vendored/brepjs/index'\nimport {\n fromBrepjsQuat,\n toBrepjsQuat,\n jointPoseToAssemblyTransform,\n isIdentityPose,\n type FaijsQuat,\n} from './pose'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport type { AssemblyVec3 } from './types'\n\n// ── JointSpec(.fai.js 可序列化子集)──\n\n/** 运动副类型:P3 首期只实现 revolute / prismatic。 */\nexport type JointType = 'revolute' | 'prismatic' | 'cylindrical' | 'planar' | 'spherical'\n\n/** 单 DOF 范围(主 DOF 镜像字段 min/max/value)。 */\nexport interface JointDofSpec {\n min: number\n max: number\n value: number\n}\n\n/**\n * 可序列化运动副声明(.fai.js 对象字面量)。派生字段(dofs)由 buildJoint 内\n * vendored 工厂构造——脚本里只写纯数据。\n */\nexport interface JointSpec {\n type: JointType\n /**\n * 参考体(不动);child 相对它运动。必须是 members 里的**变量名**(字符串——\n * `.fai.js` 可序列化子集;members 也是字符串名数组)。buildKinematicTree\n * 校验二者 ∈ members。\n */\n parent: string\n /** 从动体(同样是 members 里的变量名)。 */\n child: string\n /** 主轴:origin 是所有旋转 DOF 的枢轴锚点。 */\n axis: { origin: AssemblyVec3; direction: AssemblyVec3 }\n /** 主 DOF 范围与当前值(revolute 单位 deg / prismatic 单位 mm;由 type 决定)。 */\n min: number\n max: number\n value: number\n /**\n * 多 DOF 运动副(cylindrical 2 / planar 3 / spherical 3)的逐 DOF 范围,\n * **长度必须与 type 的 DOF 数一致,顺序 = brepjs `Joint.dofs` 的组合顺序**:\n * cylindrical → [rotation, translation]\n * planar → [u, v, rotation]\n * spherical → [x, y, z]\n * P3 首期只实现 revolute/prismatic,此字段随多 DOF 类型一起启用。\n */\n dofs?: JointDofSpec[]\n /** planar 专用:面内 u 参考方向(brepjs 会投影到平面并归一化)。 */\n uDirection?: AssemblyVec3\n /** 静态连杆偏置(childWorld = parentWorld ∘ jointTransform ∘ offset),可选。 */\n offset?: { position?: AssemblyVec3; rotation?: FaijsQuat }\n}\n\n// ── buildJoint:JointSpec → brepjs Joint ──\n\n/**\n * 由 JointSpec 构造 brepjs Joint。\n *\n * revolute/prismatic 走 vendored 工厂(主 DOF 的 value 在工厂内 clamp 到\n * [min,max]);cylindrical/planar/spherical 显式抛错(多 DOF 未启用,绝不\n * 静默降级)。offset 的四元数经 toBrepjsQuat 换序(faijs [x,y,z,w] → brepjs\n * [w,x,y,z])。\n *\n * @param spec - the serializable joint declaration.\n * @returns the vendored brepjs Joint (with offset attached when declared).\n * @throws Error on multi-DOF joint types and unknown joint types.\n */\nexport function buildJoint(spec: JointSpec): Joint {\n const axis = { origin: spec.axis.origin, direction: spec.axis.direction }\n const options = { min: spec.min, max: spec.max, value: spec.value }\n let joint: Joint\n switch (spec.type) {\n case 'revolute':\n joint = revoluteJoint(String(spec.parent), String(spec.child), axis, options)\n break\n case 'prismatic':\n joint = prismaticJoint(String(spec.parent), String(spec.child), axis, options)\n break\n case 'cylindrical':\n case 'planar':\n case 'spherical':\n throw new Error(`[assembly] joint type '${spec.type}' is not supported yet; per-DOF ranges pending`)\n default: {\n const exhaustive: never = spec.type\n throw new Error(`[assembly] unknown joint type '${String(exhaustive)}'`)\n }\n }\n if (spec.offset) {\n const rotation = spec.offset.rotation\n ? ([...toBrepjsQuat(spec.offset.rotation)] as [number, number, number, number])\n : ([1, 0, 0, 0] as [number, number, number, number])\n joint = {\n ...joint,\n offset: {\n position: spec.offset.position ?? ([0, 0, 0] as [number, number, number]),\n rotation,\n },\n }\n }\n return joint\n}\n\n// ── buildKinematicTree:建树三步 + 校验 ──\n\n/**\n * 由成员名 + JointSpec[] 构建 kinematic AssemblyNode 树(vendored\n * forwardKinematics 只接受单个根;多成员必须有唯一合成根)。\n *\n * 校验(求解前,绝不静默):\n * - 成员名空串 → 抛错(与约束求解 R7 同源);\n * - parent/child 必须在 members 里 → 抛错并附成员名全集;\n * - 同一 child 不得被两个 joint 驱动(brepjs forwardKinematics 对重复 child\n * 静默跳过——faijs 侧必须在求解前显式失败)。\n *\n * 建树三步:\n * ① 合成根 '__asm_root'(不带 shape);② 全部成员挂成子节点(未被 joint 驱动\n * 的成员靠这一步拿到 identity 位姿;addChild 返回新节点必须重新赋值);③ 每个\n * joint 经 addJoint 挂到树上(FK 用 walkAssembly 收集 node.joints,位姿按\n * joint.parent/child 的名字图传播,与树边无关)。\n *\n * @param memberNames - member variable names (the tree covers every member).\n * @param joints - raw joint declarations.\n * @returns the assembled kinematic tree root.\n * @throws Error on empty member names, unknown joint parts, or duplicate child drive.\n */\nexport function buildKinematicTree(memberNames: string[], joints: JointSpec[]): AssemblyNode {\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 name in joints`,\n )\n }\n })\n const memberSet = new Set(memberNames)\n const driven = new Set<string>()\n for (const j of joints) {\n if (!memberSet.has(String(j.parent))) {\n throw new Error(\n `[assembly] joint parent '${String(j.parent)}' is not a member — members: ${memberNames.join(', ')}`,\n )\n }\n if (!memberSet.has(String(j.child))) {\n throw new Error(\n `[assembly] joint child '${String(j.child)}' is not a member — members: ${memberNames.join(', ')}`,\n )\n }\n if (driven.has(String(j.child))) {\n throw new Error(\n `[assembly] joint child '${String(j.child)}' is driven by more than one joint — each child must be driven by exactly one joint`,\n )\n }\n driven.add(String(j.child))\n }\n // 建树三步(见函数头注释)\n let root = createAssemblyNode('__asm_root')\n for (const m of memberNames) root = addChild(root, createAssemblyNode(m))\n for (const j of joints) root = addJoint(root, buildJoint(j))\n return root\n}\n\n// ── solveKinematics:正解 ──\n\n/** per-member 运动学位姿(rotation 为 faijs [x,y,z,w])。 */\nexport interface KinematicsPose {\n position: AssemblyVec3\n rotation: FaijsQuat\n}\n\n/** 运动学解算结果:装配变换(被驱动成员)+ 全成员位姿表。 */\nexport interface KinematicsSolveResult {\n /** 被 joints 定位(非恒等)的成员装配变换;index = 成员下标。 */\n transforms: AssemblyTransform[]\n /** 全部成员的终态位姿(含恒等,链根也在此);键 = 成员名。 */\n kinematics: Record<string, KinematicsPose>\n}\n\n/** 从 joints 推导查询场景的成员名全集(parent ∪ child,保序去重)。 */\nfunction specMemberNames(joints: JointSpec[]): string[] {\n const names: string[] = []\n const seen = new Set<string>()\n for (const j of joints) {\n for (const n of [String(j.parent), String(j.child)]) {\n if (!seen.has(n)) {\n seen.add(n)\n names.push(n)\n }\n }\n }\n return names\n}\n\n/**\n * 运动学正解:buildKinematicTree → vendored forwardKinematics → per-member 位姿。\n *\n * 校验(求解前):成员名空串 / parent-child ∈ members / child 唯一驱动(都收在\n * buildKinematicTree 内);drive 键必须 ∈ joints 的 child 集(多余键是笔误,\n * 显式失败而非静默忽略)。\n *\n * forwards 返回的 Map 含合成根 '__asm_root'——本函数按 memberNames 过滤掉,\n * 只输出成员位姿。transforms 只含非恒等(被驱动)成员,恒等成员不输出(引擎\n * 不做无谓重算,与约束求解语义一致);kinematics 则覆盖全部成员(含恒等),\n * 供宿主动画/导出读取完整骨架。\n *\n * @param memberNames - member variable names.\n * @param joints - raw joint declarations.\n * @param drive - per-child DOF value overrides (number for the primary DOF, or\n * a per-DOF array); keyed by child member name.\n * @returns the per-member kinematics result.\n * @throws Error on empty member names, unknown joint parts, duplicate child drive,\n * or a drive key that is not a joint child.\n */\nexport function solveKinematics(\n memberNames: string[],\n joints: JointSpec[],\n drive?: Record<string, number | number[]>,\n): KinematicsSolveResult {\n if (drive) {\n const jointChildren = new Set(joints.map((j) => String(j.child)))\n for (const key of Object.keys(drive)) {\n if (!jointChildren.has(key)) {\n throw new Error(\n `[assembly] drive key '${key}' does not name a joint child — joint children: ${[...jointChildren].join(', ')}`,\n )\n }\n }\n }\n const tree = buildKinematicTree(memberNames, joints)\n const poses = brepjsForwardKinematics(tree, drive)\n const transforms: AssemblyTransform[] = []\n const kinematics: Record<string, KinematicsPose> = {}\n memberNames.forEach((name, index) => {\n const pose = poses.get(name)\n if (!pose) return\n const rotation = fromBrepjsQuat(pose.rotation)\n kinematics[name] = {\n position: [pose.position[0], pose.position[1], pose.position[2]],\n rotation,\n }\n if (!isIdentityPose(pose)) transforms.push(jointPoseToAssemblyTransform(pose, index))\n })\n return { transforms, kinematics }\n}\n\n// ── cad.* 查询函数(纯函数,无副作用;输入输出都是纯数据)──\n\n/** `cad.jointTrajectory({ joints, from, to, steps })` 参数。 */\nexport interface JointTrajectoryParams {\n joints: JointSpec[]\n from: Record<string, number | number[]>\n to: Record<string, number | number[]>\n steps: number\n}\n\n/** 轨迹采样(poses 的 rotation 已换序为 faijs [x,y,z,w])。 */\nexport interface FaijsTrajectorySample {\n /** 归一化路径参数 ∈ [0,1]。 */\n t: number\n /** 该步的逐 DOF 值(键 = child 成员名)。 */\n values: Record<string, number[]>\n /** 该步全成员世界位姿。 */\n poses: Map<string, KinematicsPose>\n}\n\n/**\n * `cad.jointTrajectory({ joints, from, to, steps })` — 关节空间直线路径采样。\n * 产出 steps+1 个采样(含两端点);joints 缺省值在两端取存储值。\n * 无 endEffector 参数(关节空间插值,不追踪端点)。\n *\n * @param p - trajectory query parameters.\n * @returns the sampled trajectory (poses with faijs-order quaternions).\n */\nexport function jointTrajectory(p: JointTrajectoryParams): FaijsTrajectorySample[] {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n return brepjsJointTrajectory(tree, p.from, p.to, p.steps).map((s) => ({\n t: s.t,\n values: s.values,\n poses: new Map(\n [...s.poses.entries()].map(([name, pose]) => [\n name,\n {\n position: [pose.position[0], pose.position[1], pose.position[2]],\n rotation: fromBrepjsQuat(pose.rotation),\n },\n ]),\n ),\n }))\n}\n\n/** `cad.inverseKinematics({ joints, endEffector, target, options? })` 参数。 */\nexport interface InverseKinematicsParams {\n joints: JointSpec[]\n /** 末端执行器 = child 成员名。 */\n endEffector: string\n /** 目标位姿(rotation 对外 faijs [x,y,z,w],内部 toBrepjsQuat 换序)。 */\n target: { position: AssemblyVec3; rotation?: FaijsQuat }\n options?: BrepjsIKOptions\n}\n\n/** IK 结果(与 vendored IKResult 同构;values 键 = child 成员名)。 */\nexport interface IKResult {\n values: Record<string, number[]>\n converged: boolean\n iterations: number\n error: number\n}\n\n/**\n * `cad.inverseKinematics({ joints, endEffector, target, options? })` —\n * damped-least-squares IK:求使末端到达 target 的关节值。关节范围在每个迭代\n * clamp;不可达目标返回 converged:false 与最优配置。纯函数,无副作用。\n *\n * @param p - IK query parameters.\n * @returns the solved joint values plus convergence diagnostics.\n */\nexport function inverseKinematics(p: InverseKinematicsParams): IKResult {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n const target: BrepjsIKTarget = {\n position: p.target.position,\n ...(p.target.rotation ? { rotation: toBrepjsQuat(p.target.rotation) } : {}),\n }\n const result: BrepjsIKResult = brepjsInverseKinematics(tree, p.endEffector, target, p.options)\n return {\n values: result.values,\n converged: result.converged,\n iterations: result.iterations,\n error: result.error,\n }\n}\n\n/** `cad.mechanismDOF({ joints })` 参数。 */\nexport interface MechanismDOFParams {\n joints: JointSpec[]\n}\n\n/**\n * `cad.mechanismDOF({ joints })` — 开链机构自由度 = 各 joint DOF 数之和\n * (revolute/prismatic 各 1;串联两 revolute = 2)。纯函数,无副作用。\n *\n * @param p - DOF query parameters.\n * @returns the mechanism's total degree of freedom.\n */\nexport function mechanismDOF(p: MechanismDOFParams): number {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n return brepjsMechanismDOF(tree)\n}\n\n// re-export:查询函数对外的类型面(IKOptions 透传给宿主)。\nexport type { JointPose, BrepjsIKOptions as IKOptions }"]}
|
|
1
|
+
{"version":3,"file":"joints.js","sourceRoot":"","sources":["../../../src/api/assembly/joints.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/joints — 运动副声明与运动学解算(P3)\n *\n * JointSpec 是 .fai.js 可序列化子集(派生字段 dofs 由 vendored 工厂构造,\n * 与 brepjs Joint.dofs 的组合顺序对齐:cylindrical → [rotation, translation]、\n * planar → [u, v, rotation]、spherical → [x, y, z])。\n *\n * P3 首期只实现 revolute / prismatic 两种单 DOF 运动副;cylindrical / planar /\n * spherical 在 buildJoint 里显式抛错(绝不静默降级成单 DOF),待 per-DOF ranges\n * 启用(JointSpec.dofs 已按此预留)。\n *\n * 链路:JointSpec[] → buildJoint(vendored 工厂)→ buildKinematicTree(建树三步\n * + 校验)→ solveKinematics(vendored forwardKinematics)→ per-member 位姿。\n *\n * cad.* 查询函数(jointTrajectory / inverseKinematics / mechanismDOF)是无副作用\n * 纯函数:输入纯数据、输出纯数据,不挂在 assembly receiver 上。\n *\n * 四元数顺序:faijs 对外 [x,y,z,w],brepjs [w,x,y,z]——只经 ./pose 的转换函数\n * 换序,禁止在本模块手写分量重排。\n */\n\nimport {\n revoluteJoint,\n prismaticJoint,\n forwardKinematics as brepjsForwardKinematics,\n mechanismDOF as brepjsMechanismDOF,\n jointTrajectory as brepjsJointTrajectory,\n inverseKinematics as brepjsInverseKinematics,\n addJoint,\n type Joint,\n type JointPose,\n type IKResult as BrepjsIKResult,\n type IKOptions as BrepjsIKOptions,\n type IKTarget as BrepjsIKTarget,\n} from './solvers/joints-kinematics'\nimport { createAssemblyNode, addChild, type AssemblyNode } from './solvers/assembly-tree'\nimport {\n fromBrepjsQuat,\n toBrepjsQuat,\n jointPoseToAssemblyTransform,\n isIdentityPose,\n type FaijsQuat,\n} from './pose'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport type { AssemblyVec3 } from './types'\n\n// ── JointSpec(.fai.js 可序列化子集)──\n\n/** 运动副类型:P3 首期只实现 revolute / prismatic。 */\nexport type JointType = 'revolute' | 'prismatic' | 'cylindrical' | 'planar' | 'spherical'\n\n/** 单 DOF 范围(主 DOF 镜像字段 min/max/value)。 */\nexport interface JointDofSpec {\n min: number\n max: number\n value: number\n}\n\n/**\n * 可序列化运动副声明(.fai.js 对象字面量)。派生字段(dofs)由 buildJoint 内\n * vendored 工厂构造——脚本里只写纯数据。\n */\nexport interface JointSpec {\n type: JointType\n /**\n * 参考体(不动);child 相对它运动。必须是 members 里的**变量名**(字符串——\n * `.fai.js` 可序列化子集;members 也是字符串名数组)。buildKinematicTree\n * 校验二者 ∈ members。\n */\n parent: string\n /** 从动体(同样是 members 里的变量名)。 */\n child: string\n /** 主轴:origin 是所有旋转 DOF 的枢轴锚点。 */\n axis: { origin: AssemblyVec3; direction: AssemblyVec3 }\n /** 主 DOF 范围与当前值(revolute 单位 deg / prismatic 单位 mm;由 type 决定)。 */\n min: number\n max: number\n value: number\n /**\n * 多 DOF 运动副(cylindrical 2 / planar 3 / spherical 3)的逐 DOF 范围,\n * **长度必须与 type 的 DOF 数一致,顺序 = brepjs `Joint.dofs` 的组合顺序**:\n * cylindrical → [rotation, translation]\n * planar → [u, v, rotation]\n * spherical → [x, y, z]\n * P3 首期只实现 revolute/prismatic,此字段随多 DOF 类型一起启用。\n */\n dofs?: JointDofSpec[]\n /** planar 专用:面内 u 参考方向(brepjs 会投影到平面并归一化)。 */\n uDirection?: AssemblyVec3\n /** 静态连杆偏置(childWorld = parentWorld ∘ jointTransform ∘ offset),可选。 */\n offset?: { position?: AssemblyVec3; rotation?: FaijsQuat }\n}\n\n// ── buildJoint:JointSpec → brepjs Joint ──\n\n/**\n * 由 JointSpec 构造 brepjs Joint。\n *\n * revolute/prismatic 走 vendored 工厂(主 DOF 的 value 在工厂内 clamp 到\n * [min,max]);cylindrical/planar/spherical 显式抛错(多 DOF 未启用,绝不\n * 静默降级)。offset 的四元数经 toBrepjsQuat 换序(faijs [x,y,z,w] → brepjs\n * [w,x,y,z])。\n *\n * @param spec - the serializable joint declaration.\n * @returns the vendored brepjs Joint (with offset attached when declared).\n * @throws Error on multi-DOF joint types and unknown joint types.\n */\nexport function buildJoint(spec: JointSpec): Joint {\n const axis = { origin: spec.axis.origin, direction: spec.axis.direction }\n const options = { min: spec.min, max: spec.max, value: spec.value }\n let joint: Joint\n switch (spec.type) {\n case 'revolute':\n joint = revoluteJoint(String(spec.parent), String(spec.child), axis, options)\n break\n case 'prismatic':\n joint = prismaticJoint(String(spec.parent), String(spec.child), axis, options)\n break\n case 'cylindrical':\n case 'planar':\n case 'spherical':\n throw new Error(`[assembly] joint type '${spec.type}' is not supported yet; per-DOF ranges pending`)\n default: {\n const exhaustive: never = spec.type\n throw new Error(`[assembly] unknown joint type '${String(exhaustive)}'`)\n }\n }\n if (spec.offset) {\n const rotation = spec.offset.rotation\n ? ([...toBrepjsQuat(spec.offset.rotation)] as [number, number, number, number])\n : ([1, 0, 0, 0] as [number, number, number, number])\n joint = {\n ...joint,\n offset: {\n position: spec.offset.position ?? ([0, 0, 0] as [number, number, number]),\n rotation,\n },\n }\n }\n return joint\n}\n\n// ── buildKinematicTree:建树三步 + 校验 ──\n\n/**\n * 由成员名 + JointSpec[] 构建 kinematic AssemblyNode 树(vendored\n * forwardKinematics 只接受单个根;多成员必须有唯一合成根)。\n *\n * 校验(求解前,绝不静默):\n * - 成员名空串 → 抛错(与约束求解 R7 同源);\n * - parent/child 必须在 members 里 → 抛错并附成员名全集;\n * - 同一 child 不得被两个 joint 驱动(brepjs forwardKinematics 对重复 child\n * 静默跳过——faijs 侧必须在求解前显式失败)。\n *\n * 建树三步:\n * ① 合成根 '__asm_root'(不带 shape);② 全部成员挂成子节点(未被 joint 驱动\n * 的成员靠这一步拿到 identity 位姿;addChild 返回新节点必须重新赋值);③ 每个\n * joint 经 addJoint 挂到树上(FK 用 walkAssembly 收集 node.joints,位姿按\n * joint.parent/child 的名字图传播,与树边无关)。\n *\n * @param memberNames - member variable names (the tree covers every member).\n * @param joints - raw joint declarations.\n * @returns the assembled kinematic tree root.\n * @throws Error on empty member names, unknown joint parts, or duplicate child drive.\n */\nexport function buildKinematicTree(memberNames: string[], joints: JointSpec[]): AssemblyNode {\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 name in joints`,\n )\n }\n })\n const memberSet = new Set(memberNames)\n const driven = new Set<string>()\n for (const j of joints) {\n if (!memberSet.has(String(j.parent))) {\n throw new Error(\n `[assembly] joint parent '${String(j.parent)}' is not a member — members: ${memberNames.join(', ')}`,\n )\n }\n if (!memberSet.has(String(j.child))) {\n throw new Error(\n `[assembly] joint child '${String(j.child)}' is not a member — members: ${memberNames.join(', ')}`,\n )\n }\n if (driven.has(String(j.child))) {\n throw new Error(\n `[assembly] joint child '${String(j.child)}' is driven by more than one joint — each child must be driven by exactly one joint`,\n )\n }\n driven.add(String(j.child))\n }\n // 建树三步(见函数头注释)\n let root = createAssemblyNode('__asm_root')\n for (const m of memberNames) root = addChild(root, createAssemblyNode(m))\n for (const j of joints) root = addJoint(root, buildJoint(j))\n return root\n}\n\n// ── solveKinematics:正解 ──\n\n/** per-member 运动学位姿(rotation 为 faijs [x,y,z,w])。 */\nexport interface KinematicsPose {\n position: AssemblyVec3\n rotation: FaijsQuat\n}\n\n/** 运动学解算结果:装配变换(被驱动成员)+ 全成员位姿表。 */\nexport interface KinematicsSolveResult {\n /** 被 joints 定位(非恒等)的成员装配变换;index = 成员下标。 */\n transforms: AssemblyTransform[]\n /** 全部成员的终态位姿(含恒等,链根也在此);键 = 成员名。 */\n kinematics: Record<string, KinematicsPose>\n}\n\n/** 从 joints 推导查询场景的成员名全集(parent ∪ child,保序去重)。 */\nfunction specMemberNames(joints: JointSpec[]): string[] {\n const names: string[] = []\n const seen = new Set<string>()\n for (const j of joints) {\n for (const n of [String(j.parent), String(j.child)]) {\n if (!seen.has(n)) {\n seen.add(n)\n names.push(n)\n }\n }\n }\n return names\n}\n\n/**\n * 运动学正解:buildKinematicTree → vendored forwardKinematics → per-member 位姿。\n *\n * 校验(求解前):成员名空串 / parent-child ∈ members / child 唯一驱动(都收在\n * buildKinematicTree 内);drive 键必须 ∈ joints 的 child 集(多余键是笔误,\n * 显式失败而非静默忽略)。\n *\n * forwards 返回的 Map 含合成根 '__asm_root'——本函数按 memberNames 过滤掉,\n * 只输出成员位姿。transforms 只含非恒等(被驱动)成员,恒等成员不输出(引擎\n * 不做无谓重算,与约束求解语义一致);kinematics 则覆盖全部成员(含恒等),\n * 供宿主动画/导出读取完整骨架。\n *\n * @param memberNames - member variable names.\n * @param joints - raw joint declarations.\n * @param drive - per-child DOF value overrides (number for the primary DOF, or\n * a per-DOF array); keyed by child member name.\n * @returns the per-member kinematics result.\n * @throws Error on empty member names, unknown joint parts, duplicate child drive,\n * or a drive key that is not a joint child.\n */\nexport function solveKinematics(\n memberNames: string[],\n joints: JointSpec[],\n drive?: Record<string, number | number[]>,\n): KinematicsSolveResult {\n if (drive) {\n const jointChildren = new Set(joints.map((j) => String(j.child)))\n for (const key of Object.keys(drive)) {\n if (!jointChildren.has(key)) {\n throw new Error(\n `[assembly] drive key '${key}' does not name a joint child — joint children: ${[...jointChildren].join(', ')}`,\n )\n }\n }\n }\n const tree = buildKinematicTree(memberNames, joints)\n const poses = brepjsForwardKinematics(tree, drive)\n const transforms: AssemblyTransform[] = []\n const kinematics: Record<string, KinematicsPose> = {}\n memberNames.forEach((name, index) => {\n const pose = poses.get(name)\n if (!pose) return\n const rotation = fromBrepjsQuat(pose.rotation)\n kinematics[name] = {\n position: [pose.position[0], pose.position[1], pose.position[2]],\n rotation,\n }\n if (!isIdentityPose(pose)) transforms.push(jointPoseToAssemblyTransform(pose, index))\n })\n return { transforms, kinematics }\n}\n\n// ── cad.* 查询函数(纯函数,无副作用;输入输出都是纯数据)──\n\n/** `cad.jointTrajectory({ joints, from, to, steps })` 参数。 */\nexport interface JointTrajectoryParams {\n joints: JointSpec[]\n from: Record<string, number | number[]>\n to: Record<string, number | number[]>\n steps: number\n}\n\n/** 轨迹采样(poses 的 rotation 已换序为 faijs [x,y,z,w])。 */\nexport interface FaijsTrajectorySample {\n /** 归一化路径参数 ∈ [0,1]。 */\n t: number\n /** 该步的逐 DOF 值(键 = child 成员名)。 */\n values: Record<string, number[]>\n /** 该步全成员世界位姿。 */\n poses: Map<string, KinematicsPose>\n}\n\n/**\n * `cad.jointTrajectory({ joints, from, to, steps })` — 关节空间直线路径采样。\n * 产出 steps+1 个采样(含两端点);joints 缺省值在两端取存储值。\n * 无 endEffector 参数(关节空间插值,不追踪端点)。\n *\n * @param p - trajectory query parameters.\n * @returns the sampled trajectory (poses with faijs-order quaternions).\n */\nexport function jointTrajectory(p: JointTrajectoryParams): FaijsTrajectorySample[] {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n return brepjsJointTrajectory(tree, p.from, p.to, p.steps).map((s) => ({\n t: s.t,\n values: s.values,\n poses: new Map(\n [...s.poses.entries()].map(([name, pose]) => [\n name,\n {\n position: [pose.position[0], pose.position[1], pose.position[2]],\n rotation: fromBrepjsQuat(pose.rotation),\n },\n ]),\n ),\n }))\n}\n\n/** `cad.inverseKinematics({ joints, endEffector, target, options? })` 参数。 */\nexport interface InverseKinematicsParams {\n joints: JointSpec[]\n /** 末端执行器 = child 成员名。 */\n endEffector: string\n /** 目标位姿(rotation 对外 faijs [x,y,z,w],内部 toBrepjsQuat 换序)。 */\n target: { position: AssemblyVec3; rotation?: FaijsQuat }\n options?: BrepjsIKOptions\n}\n\n/** IK 结果(与 vendored IKResult 同构;values 键 = child 成员名)。 */\nexport interface IKResult {\n values: Record<string, number[]>\n converged: boolean\n iterations: number\n error: number\n}\n\n/**\n * `cad.inverseKinematics({ joints, endEffector, target, options? })` —\n * damped-least-squares IK:求使末端到达 target 的关节值。关节范围在每个迭代\n * clamp;不可达目标返回 converged:false 与最优配置。纯函数,无副作用。\n *\n * @param p - IK query parameters.\n * @returns the solved joint values plus convergence diagnostics.\n */\nexport function inverseKinematics(p: InverseKinematicsParams): IKResult {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n const target: BrepjsIKTarget = {\n position: p.target.position,\n ...(p.target.rotation ? { rotation: toBrepjsQuat(p.target.rotation) } : {}),\n }\n const result: BrepjsIKResult = brepjsInverseKinematics(tree, p.endEffector, target, p.options)\n return {\n values: result.values,\n converged: result.converged,\n iterations: result.iterations,\n error: result.error,\n }\n}\n\n/** `cad.mechanismDOF({ joints })` 参数。 */\nexport interface MechanismDOFParams {\n joints: JointSpec[]\n}\n\n/**\n * `cad.mechanismDOF({ joints })` — 开链机构自由度 = 各 joint DOF 数之和\n * (revolute/prismatic 各 1;串联两 revolute = 2)。纯函数,无副作用。\n *\n * @param p - DOF query parameters.\n * @returns the mechanism's total degree of freedom.\n */\nexport function mechanismDOF(p: MechanismDOFParams): number {\n const memberNames = specMemberNames(p.joints)\n const tree = buildKinematicTree(memberNames, p.joints)\n return brepjsMechanismDOF(tree)\n}\n\n// re-export:查询函数对外的类型面(IKOptions 透传给宿主)。\nexport type { JointPose, BrepjsIKOptions as IKOptions }"]}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* 禁止把复合语义拆成多条 SolverConstraint——每节点只被定位一次(方案 §3.7.1)。
|
|
12
12
|
*/
|
|
13
|
-
import type { SolverConstraint, SolverEntity } from '
|
|
13
|
+
import type { SolverConstraint, SolverEntity } from './solvers/types.js';
|
|
14
14
|
import type { ResolvedFaceGeometry } from '../topo-resolve.js';
|
|
15
15
|
import type { AssemblyVec3, StructuralConstraint } from './types.js';
|
|
16
16
|
import { type EntityResolutionEnv } from './entities.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lower.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/lower.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"lower.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/lower.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAa,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAiD,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEpG;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CAOjF;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,YAAY,CAAA;CACzB;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,EAC3E,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,EACzC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,EACzC,KAAK,CAAC,EAAE,MAAM,GACb,iBAAiB,CA+CnB;AAeD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAmC9G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lower.js","sourceRoot":"","sources":["../../../src/api/assembly/lower.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/lower — faijs 约束 → brepjs SolverConstraint 降级(P1,方案 §3.7.2 / §4.2)\n *\n * 关键简化(方案 §3.7.3):不自写合成器、不自写拓扑调度——\n * - mate → concentric + dep 侧 axis 编码取反法向(flip 是贴合语义的正解:\n * A 的外法向 = B 的内法向);\n * - align → concentric + 两侧 axis 编码不取反;\n * - coincident/concentric/distance/angle → 直译;\n * - parallel/perpendicular → angle 0°/90° 语法糖。\n *\n * 禁止把复合语义拆成多条 SolverConstraint——每节点只被定位一次(方案 §3.7.1)。\n */\n\nimport type { SolverConstraint, SolverEntity } from '../../vendored/brepjs/kernel/solverAdapter'\nimport type { ResolvedFaceGeometry } from '../topo-resolve'\nimport type { AssemblyVec3, EntityRef, StructuralConstraint } from './types'\nimport { resolveFaceGeometryOfRef, resolveSolverEntity, type EntityResolutionEnv } from './entities'\n\n/**\n * 面 → 有向轴实体(§3.7.2 轴编码)。flip=true 取内法向(贴合语义)。\n * origin = 面中心:dep 侧是本地坐标,ref 侧由 brepjs transformEntity 转世界。\n *\n * @param f - the resolved face geometry (center + normal).\n * @param flip - when true, negate the normal (mate encoding on the dependent side).\n * @returns the directed axis entity.\n */\nexport function axisFromFace(f: ResolvedFaceGeometry, flip: boolean): SolverEntity {\n const n = f.normal\n return {\n type: 'axis',\n origin: f.center,\n direction: flip ? ([-n[0], -n[1], -n[2]] as AssemblyVec3) : n,\n }\n}\n\n/** 降级产物:SolverConstraint + dependent 实体 origin(作 AssemblyTransform 的 pivot)。 */\nexport interface LoweredConstraint {\n constraint: SolverConstraint\n /** dependent 侧实体 origin(本地坐标);fixed 约束无。 */\n depOrigin?: AssemblyVec3\n}\n\n/** 直译定位约束的形状(a/b 必有,value 可选)。 */\ninterface PairSpec {\n type: 'coincident' | 'concentric' | 'distance' | 'angle'\n value?: number\n a: EntityRef\n b: EntityRef\n}\n\n/**\n * 纯实体降级(P2-f3):两侧 SolverEntity 已知(预览路径 / 宿主已持有几何)。\n * 与 lowerStructuralConstraint 共用 axisFromFace 的编码规则,不另写数学。\n *\n * mate/align 要求两侧都是 `plane` 实体(贴合语义只接受平面)——把 plane 还原成\n * {center, normal} 再走 axisFromFace 编码;与执行路径(lowerStructuralConstraint\n * 的 mate/align 分支)逐位一致。非 plane 输入直接抛错(绝不静默)。\n *\n * @param type - the constraint type(parallel/perpendicular 请显式用 angle 0/90)。\n * @param a - the reference-side entity (node + solver entity).\n * @param b - the dependent-side entity (node + solver entity).\n * @param value - distance/angle 用(其它类型忽略)。\n * @returns the lowered solver constraint with the dependent origin.\n */\nexport function lowerEntities(\n type: 'mate' | 'align' | 'coincident' | 'concentric' | 'distance' | 'angle',\n a: { node: string; entity: SolverEntity },\n b: { node: string; entity: SolverEntity },\n value?: number,\n): LoweredConstraint {\n switch (type) {\n case 'mate':\n case 'align': {\n const kindA = a.entity.type\n const kindB = b.entity.type\n if (kindA !== 'plane' || kindB !== 'plane') {\n throw new Error(\n `[assembly:lower] ${type} requires plane entities on both sides, got ${kindA}/${kindB}`,\n )\n }\n // SolverEntity.origin/normal 是 readonly Vec3;拷贝成可变 AssemblyVec3 再传给\n // axisFromFace(避免类型断言覆盖 readonly→mutable 的契约警告)。\n // SolverEntity 是扁平 interface(type 联合非 tagged union),kind 检查后字段必然存在。\n const normalA = a.entity.normal as readonly [number, number, number]\n const normalB = b.entity.normal as readonly [number, number, number]\n const pa = { origin: [...a.entity.origin] as AssemblyVec3, normal: [...normalA] as AssemblyVec3 }\n const pb = { origin: [...b.entity.origin] as AssemblyVec3, normal: [...normalB] as AssemblyVec3 }\n const flip = type === 'mate'\n return {\n constraint: {\n type: 'concentric',\n entityA: { node: a.node, entity: axisFromFace({ center: pa.origin, normal: pa.normal }, false) },\n entityB: { node: b.node, entity: axisFromFace({ center: pb.origin, normal: pb.normal }, flip) },\n },\n depOrigin: pb.origin,\n }\n }\n case 'coincident':\n case 'concentric':\n case 'distance':\n case 'angle': {\n const constraint: SolverConstraint = {\n type,\n entityA: { node: a.node, entity: a.entity },\n entityB: { node: b.node, entity: b.entity },\n }\n if (value !== undefined) constraint.value = value\n return { constraint, depOrigin: [b.entity.origin[0], b.entity.origin[1], b.entity.origin[2]] }\n }\n default:\n // TS 穷尽分支防御:JS 调用方可能传越界字符串(fixed/parallel/perpendicular/其他)\n throw new Error(\n `[assembly:lower] unsupported constraint type for lowerEntities: ${String(type)} ` +\n `(fixed has no displacement semantics; parallel/perpendicular use 'angle' 0/90)`,\n )\n }\n}\n\n/** 直译定位约束:解析两侧实体后原样翻译。 */\nfunction lowerPair(c: PairSpec, env: EntityResolutionEnv): LoweredConstraint {\n const entityA = resolveSolverEntity(c.a, env)\n const entityB = resolveSolverEntity(c.b, env)\n const constraint: SolverConstraint = {\n type: c.type,\n entityA: { node: c.a.part, entity: entityA },\n entityB: { node: c.b.part, entity: entityB },\n }\n if (c.value !== undefined) constraint.value = c.value\n return { constraint, depOrigin: [entityB.origin[0], entityB.origin[1], entityB.origin[2]] }\n}\n\n/**\n * 把一条规范化约束降级为 brepjs SolverConstraint(§4.2 步骤 3)。\n *\n * @param c - the normalized structural constraint.\n * @param env - the entity resolution environment (kernel + member lookup).\n * @returns the lowered solver constraint with the dependent origin.\n */\nexport function lowerStructuralConstraint(c: StructuralConstraint, env: EntityResolutionEnv): LoweredConstraint {\n switch (c.type) {\n case 'mate':\n case 'align': {\n // 贴合/对齐:两侧都必须是面引用;轴编码进 concentric(§3.7.2)\n const geomA = resolveFaceGeometryOfRef(c.a, env)\n const geomB = resolveFaceGeometryOfRef(c.b, env)\n const flip = c.type === 'mate'\n return {\n constraint: {\n type: 'concentric',\n entityA: { node: c.a.part, entity: axisFromFace(geomA, false) },\n entityB: { node: c.b.part, entity: axisFromFace(geomB, flip) },\n },\n depOrigin: geomB.center,\n }\n }\n case 'parallel':\n return lowerPair({ type: 'angle', value: 0, a: c.a, b: c.b }, env)\n case 'perpendicular':\n return lowerPair({ type: 'angle', value: 90, a: c.a, b: c.b }, env)\n case 'fixed':\n // solver 对 fixed 只读 entityA.node;entity 占位满足 SolverConstraint 形状\n return {\n constraint: {\n type: 'fixed',\n entityA: { node: c.part, entity: { type: 'point', origin: [0, 0, 0] } },\n },\n }\n case 'coincident':\n case 'concentric':\n case 'distance':\n case 'angle':\n return lowerPair(c, env)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lower.js","sourceRoot":"","sources":["../../../src/api/assembly/lower.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/lower — faijs 约束 → brepjs SolverConstraint 降级(P1,方案 §3.7.2 / §4.2)\n *\n * 关键简化(方案 §3.7.3):不自写合成器、不自写拓扑调度——\n * - mate → concentric + dep 侧 axis 编码取反法向(flip 是贴合语义的正解:\n * A 的外法向 = B 的内法向);\n * - align → concentric + 两侧 axis 编码不取反;\n * - coincident/concentric/distance/angle → 直译;\n * - parallel/perpendicular → angle 0°/90° 语法糖。\n *\n * 禁止把复合语义拆成多条 SolverConstraint——每节点只被定位一次(方案 §3.7.1)。\n */\n\nimport type { SolverConstraint, SolverEntity } from './solvers/types'\nimport type { ResolvedFaceGeometry } from '../topo-resolve'\nimport type { AssemblyVec3, EntityRef, StructuralConstraint } from './types'\nimport { resolveFaceGeometryOfRef, resolveSolverEntity, type EntityResolutionEnv } from './entities'\n\n/**\n * 面 → 有向轴实体(§3.7.2 轴编码)。flip=true 取内法向(贴合语义)。\n * origin = 面中心:dep 侧是本地坐标,ref 侧由 brepjs transformEntity 转世界。\n *\n * @param f - the resolved face geometry (center + normal).\n * @param flip - when true, negate the normal (mate encoding on the dependent side).\n * @returns the directed axis entity.\n */\nexport function axisFromFace(f: ResolvedFaceGeometry, flip: boolean): SolverEntity {\n const n = f.normal\n return {\n type: 'axis',\n origin: f.center,\n direction: flip ? ([-n[0], -n[1], -n[2]] as AssemblyVec3) : n,\n }\n}\n\n/** 降级产物:SolverConstraint + dependent 实体 origin(作 AssemblyTransform 的 pivot)。 */\nexport interface LoweredConstraint {\n constraint: SolverConstraint\n /** dependent 侧实体 origin(本地坐标);fixed 约束无。 */\n depOrigin?: AssemblyVec3\n}\n\n/** 直译定位约束的形状(a/b 必有,value 可选)。 */\ninterface PairSpec {\n type: 'coincident' | 'concentric' | 'distance' | 'angle'\n value?: number\n a: EntityRef\n b: EntityRef\n}\n\n/**\n * 纯实体降级(P2-f3):两侧 SolverEntity 已知(预览路径 / 宿主已持有几何)。\n * 与 lowerStructuralConstraint 共用 axisFromFace 的编码规则,不另写数学。\n *\n * mate/align 要求两侧都是 `plane` 实体(贴合语义只接受平面)——把 plane 还原成\n * {center, normal} 再走 axisFromFace 编码;与执行路径(lowerStructuralConstraint\n * 的 mate/align 分支)逐位一致。非 plane 输入直接抛错(绝不静默)。\n *\n * @param type - the constraint type(parallel/perpendicular 请显式用 angle 0/90)。\n * @param a - the reference-side entity (node + solver entity).\n * @param b - the dependent-side entity (node + solver entity).\n * @param value - distance/angle 用(其它类型忽略)。\n * @returns the lowered solver constraint with the dependent origin.\n */\nexport function lowerEntities(\n type: 'mate' | 'align' | 'coincident' | 'concentric' | 'distance' | 'angle',\n a: { node: string; entity: SolverEntity },\n b: { node: string; entity: SolverEntity },\n value?: number,\n): LoweredConstraint {\n switch (type) {\n case 'mate':\n case 'align': {\n const kindA = a.entity.type\n const kindB = b.entity.type\n if (kindA !== 'plane' || kindB !== 'plane') {\n throw new Error(\n `[assembly:lower] ${type} requires plane entities on both sides, got ${kindA}/${kindB}`,\n )\n }\n // SolverEntity.origin/normal 是 readonly Vec3;拷贝成可变 AssemblyVec3 再传给\n // axisFromFace(避免类型断言覆盖 readonly→mutable 的契约警告)。\n // SolverEntity 是扁平 interface(type 联合非 tagged union),kind 检查后字段必然存在。\n const normalA = a.entity.normal as readonly [number, number, number]\n const normalB = b.entity.normal as readonly [number, number, number]\n const pa = { origin: [...a.entity.origin] as AssemblyVec3, normal: [...normalA] as AssemblyVec3 }\n const pb = { origin: [...b.entity.origin] as AssemblyVec3, normal: [...normalB] as AssemblyVec3 }\n const flip = type === 'mate'\n return {\n constraint: {\n type: 'concentric',\n entityA: { node: a.node, entity: axisFromFace({ center: pa.origin, normal: pa.normal }, false) },\n entityB: { node: b.node, entity: axisFromFace({ center: pb.origin, normal: pb.normal }, flip) },\n },\n depOrigin: pb.origin,\n }\n }\n case 'coincident':\n case 'concentric':\n case 'distance':\n case 'angle': {\n const constraint: SolverConstraint = {\n type,\n entityA: { node: a.node, entity: a.entity },\n entityB: { node: b.node, entity: b.entity },\n }\n if (value !== undefined) constraint.value = value\n return { constraint, depOrigin: [b.entity.origin[0], b.entity.origin[1], b.entity.origin[2]] }\n }\n default:\n // TS 穷尽分支防御:JS 调用方可能传越界字符串(fixed/parallel/perpendicular/其他)\n throw new Error(\n `[assembly:lower] unsupported constraint type for lowerEntities: ${String(type)} ` +\n `(fixed has no displacement semantics; parallel/perpendicular use 'angle' 0/90)`,\n )\n }\n}\n\n/** 直译定位约束:解析两侧实体后原样翻译。 */\nfunction lowerPair(c: PairSpec, env: EntityResolutionEnv): LoweredConstraint {\n const entityA = resolveSolverEntity(c.a, env)\n const entityB = resolveSolverEntity(c.b, env)\n const constraint: SolverConstraint = {\n type: c.type,\n entityA: { node: c.a.part, entity: entityA },\n entityB: { node: c.b.part, entity: entityB },\n }\n if (c.value !== undefined) constraint.value = c.value\n return { constraint, depOrigin: [entityB.origin[0], entityB.origin[1], entityB.origin[2]] }\n}\n\n/**\n * 把一条规范化约束降级为 brepjs SolverConstraint(§4.2 步骤 3)。\n *\n * @param c - the normalized structural constraint.\n * @param env - the entity resolution environment (kernel + member lookup).\n * @returns the lowered solver constraint with the dependent origin.\n */\nexport function lowerStructuralConstraint(c: StructuralConstraint, env: EntityResolutionEnv): LoweredConstraint {\n switch (c.type) {\n case 'mate':\n case 'align': {\n // 贴合/对齐:两侧都必须是面引用;轴编码进 concentric(§3.7.2)\n const geomA = resolveFaceGeometryOfRef(c.a, env)\n const geomB = resolveFaceGeometryOfRef(c.b, env)\n const flip = c.type === 'mate'\n return {\n constraint: {\n type: 'concentric',\n entityA: { node: c.a.part, entity: axisFromFace(geomA, false) },\n entityB: { node: c.b.part, entity: axisFromFace(geomB, flip) },\n },\n depOrigin: geomB.center,\n }\n }\n case 'parallel':\n return lowerPair({ type: 'angle', value: 0, a: c.a, b: c.b }, env)\n case 'perpendicular':\n return lowerPair({ type: 'angle', value: 90, a: c.a, b: c.b }, env)\n case 'fixed':\n // solver 对 fixed 只读 entityA.node;entity 占位满足 SolverConstraint 形状\n return {\n constraint: {\n type: 'fixed',\n entityA: { node: c.part, entity: { type: 'point', origin: [0, 0, 0] } },\n },\n }\n case 'coincident':\n case 'concentric':\n case 'distance':\n case 'angle':\n return lowerPair(c, env)\n }\n}\n"]}
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* 令 pivot = dependent 实体 origin(单约束场景),二者等价:
|
|
9
9
|
* translation = position − pivot + R·pivot。
|
|
10
10
|
*/
|
|
11
|
-
import type { SolverEntity } from '
|
|
12
|
-
import { quatRotate } from '
|
|
13
|
-
import type { JointPose } from '
|
|
11
|
+
import type { SolverEntity } from './solvers/types.js';
|
|
12
|
+
import { quatRotate } from './solvers/quat.js';
|
|
13
|
+
import type { JointPose } from './solvers/joints-kinematics.js';
|
|
14
14
|
import type { AssemblyTransform } from '../../runtime-state.js';
|
|
15
15
|
import type { AssemblyVec3 } from './types.js';
|
|
16
16
|
/** brepjs 四元数 [w,x,y,z]。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pose.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/pose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pose.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/pose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,4BAA4B;AAC5B,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAClE,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAExD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,CAErD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAU1D;AAUD,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACpD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAe/G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAU9F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAKxD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAE1D;AAED,iEAAiE;AACjE,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 令 pivot = dependent 实体 origin(单约束场景),二者等价:
|
|
9
9
|
* translation = position − pivot + R·pivot。
|
|
10
10
|
*/
|
|
11
|
-
import { quatRotate } from '
|
|
11
|
+
import { quatRotate } from './solvers/quat.js';
|
|
12
12
|
/**
|
|
13
13
|
* brepjs [w,x,y,z] → faijs [x,y,z,w](分量换序,不改变旋转本身)。
|
|
14
14
|
* @param q - the brepjs-order quaternion.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pose.js","sourceRoot":"","sources":["../../../src/api/assembly/pose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pose.js","sourceRoot":"","sources":["../../../src/api/assembly/pose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAU3C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,CAAa;IAC1C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAY;IACvC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAY;IAC9C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACxC,OAAO;QACL,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/C,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/C,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;KAChD,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,CAAe;IAC9C,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACxC,CAAA;AACH,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAgB,EAAE,KAAmB,EAAE,KAAa;IAC1F,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAChC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IAC/B,OAAO;QACL,KAAK;QACL,UAAU,EAAE,CAAC;QACb,KAAK;QACL,WAAW,EAAE;YACX,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SACpC;QACD,cAAc,EAAE,CAAC;KAClB,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAe,EAAE,KAAa;IACzE,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAChC,OAAO;QACL,KAAK;QACL,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnE,cAAc,EAAE,CAAC;KAClB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CACrG,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAe;IAC1C,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,iEAAiE;AACjE,OAAO,EAAE,UAAU,EAAE,CAAA","sourcesContent":["/**\n * api/assembly/pose — 位姿转换契约(P1,方案 §4.3)\n *\n * brepjs 与 faijs 的位姿模型两处不一致,转换收口在本模块(禁止别处手写 q[0]/q[3]):\n * (a) 四元数分量顺序:brepjs [w,x,y,z] ↔ faijs [x,y,z,w];\n * (b) pivot 语义:brepjs `p' = R·p + position`(绕原点)↔\n * faijs `p' = R·(p − pivot) + pivot + translation`。\n * 令 pivot = dependent 实体 origin(单约束场景),二者等价:\n * translation = position − pivot + R·pivot。\n */\n\nimport type { SolverEntity } from './solvers/types'\nimport { quatRotate } from './solvers/quat'\nimport type { JointPose } from './solvers/joints-kinematics'\nimport type { AssemblyTransform } from '../../runtime-state'\nimport type { AssemblyVec3 } from './types'\n\n/** brepjs 四元数 [w,x,y,z]。 */\nexport type BrepjsQuat = readonly [number, number, number, number]\n/** faijs 四元数 [x,y,z,w]。 */\nexport type FaijsQuat = [number, number, number, number]\n\n/**\n * brepjs [w,x,y,z] → faijs [x,y,z,w](分量换序,不改变旋转本身)。\n * @param q - the brepjs-order quaternion.\n * @returns the faijs-order quaternion.\n */\nexport function fromBrepjsQuat(q: BrepjsQuat): FaijsQuat {\n return [q[1], q[2], q[3], q[0]]\n}\n\n/**\n * faijs [x,y,z,w] → brepjs [w,x,y,z]。\n * @param q - the faijs-order quaternion.\n * @returns the brepjs-order quaternion.\n */\nexport function toBrepjsQuat(q: FaijsQuat): BrepjsQuat {\n return [q[3], q[0], q[1], q[2]]\n}\n\n/**\n * 四元数 → 旋转矩阵(3x3, row-major;brepjs 位姿换算唯一入口)。\n * @param q - the faijs-order quaternion.\n * @returns the 9-component row-major rotation matrix.\n */\nexport function quaternionToMatrix3(q: FaijsQuat): number[] {\n const [x, y, z, w] = q\n const xx = x * x, yy = y * y, zz = z * z\n const xy = x * y, xz = x * z, yz = y * z\n const wx = w * x, wy = w * y, wz = w * z\n return [\n 1 - 2 * (yy + zz), 2 * (xy - wz), 2 * (xz + wy),\n 2 * (xy + wz), 1 - 2 * (xx + zz), 2 * (yz - wx),\n 2 * (xz - wy), 2 * (yz + wx), 1 - 2 * (xx + yy),\n ]\n}\n\nfunction mat3MulVec(m: number[], v: AssemblyVec3): AssemblyVec3 {\n return [\n m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n m[6] * v[0] + m[7] * v[1] + m[8] * v[2],\n ]\n}\n\n/** brepjs 单节点位姿(position + [w,x,y,z] 旋转)。 */\nexport interface SolverPose {\n position: readonly [number, number, number]\n rotation: readonly [number, number, number, number]\n}\n\n/**\n * brepjs 位姿 → faijs AssemblyTransform(§4.3(b) 换算;T2 锁定)。\n *\n * @param pose - the solver pose (p' = R·p + position).\n * @param pivot - rotation pivot in faijs model (convention: the dependent entity's origin).\n * @param index - member index (filled by the caller).\n * @returns the AssemblyTransform with quaternion/pivot/translation/rotationMatrix.\n */\nexport function poseToAssemblyTransform(pose: SolverPose, pivot: AssemblyVec3, index: number): AssemblyTransform {\n const q = fromBrepjsQuat(pose.rotation)\n const m = quaternionToMatrix3(q)\n const rp = mat3MulVec(m, pivot)\n return {\n index,\n quaternion: q,\n pivot,\n translation: [\n pose.position[0] - pivot[0] + rp[0],\n pose.position[1] - pivot[1] + rp[1],\n pose.position[2] - pivot[2] + rp[2],\n ],\n rotationMatrix: m,\n }\n}\n\n/**\n * brepjs FK 位姿(JointPose = { position, rotation: [w,x,y,z] })→ faijs AssemblyTransform。\n *\n * brepjs 前向运动学的位姿是「绕原点整体模型」(p' = R·p + position),与约束求解的\n * pivot 换算同式——故 pivot = [0,0,0]、translation = pose.position。旋转经\n * fromBrepjsQuat 换序为 faijs [x,y,z,w];rotationMatrix 与其它变换同源。\n *\n * @param pose - the forward-kinematics pose (p' = R·p + position).\n * @param index - member index (filled by the caller).\n * @returns the AssemblyTransform with zero pivot and the FK position as translation.\n */\nexport function jointPoseToAssemblyTransform(pose: JointPose, index: number): AssemblyTransform {\n const q = fromBrepjsQuat(pose.rotation)\n const m = quaternionToMatrix3(q)\n return {\n index,\n quaternion: q,\n pivot: [0, 0, 0],\n translation: [pose.position[0], pose.position[1], pose.position[2]],\n rotationMatrix: m,\n }\n}\n\n/**\n * 判定一个位姿是否为恒等(锚定/链根成员:跳过输出,引擎不做无谓重算)。\n * @param pose - the solver pose.\n * @returns true when the pose is exactly identity.\n */\nexport function isIdentityPose(pose: SolverPose): boolean {\n return (\n pose.position[0] === 0 && pose.position[1] === 0 && pose.position[2] === 0 &&\n pose.rotation[0] === 1 && pose.rotation[1] === 0 && pose.rotation[2] === 0 && pose.rotation[3] === 0\n )\n}\n\n/**\n * 供 solve.ts 记录 pivot 用的 dependent 实体 origin 读取。\n * @param e - the solver entity.\n * @returns a copy of the entity origin.\n */\nexport function entityOrigin(e: SolverEntity): AssemblyVec3 {\n return [e.origin[0], e.origin[1], e.origin[2]]\n}\n\n/** brepjs quatRotate 的再导出(rotate by [w,x,y,z] quat)——测试与换算共用。 */\nexport { quatRotate }\n"]}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 仅支持"恰好定位一个 dependent"的单条约束;`fixed`(无位移语义)与
|
|
16
16
|
* `parallel`/`perpendicular`(请用 `angle` 0/90 显式表达)不支持,报错。
|
|
17
17
|
*/
|
|
18
|
-
import type { SolverEntity } from '
|
|
18
|
+
import type { SolverEntity } from './solvers/types.js';
|
|
19
19
|
import type { AssemblyTransform } from '../../runtime-state.js';
|
|
20
20
|
import type { AssemblyVec3 } from './types.js';
|
|
21
21
|
/** 预览支持的约束类型(fixed 无位移语义 → 抛错;parallel/perpendicular → angle 糖)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/api/assembly/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAI5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,oEAAoE;AACpE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAA;AAEzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,qBAAqB,EAC3B,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,YAAY,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,iBAAiB,CAgBnB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EACG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC1C,YAAY,CASd"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* 仅支持"恰好定位一个 dependent"的单条约束;`fixed`(无位移语义)与
|
|
16
16
|
* `parallel`/`perpendicular`(请用 `angle` 0/90 显式表达)不支持,报错。
|
|
17
17
|
*/
|
|
18
|
-
import { solveConstraints } from '
|
|
18
|
+
import { solveConstraints } from './solvers/chain-solver.js';
|
|
19
19
|
import { lowerEntities } from './lower.js';
|
|
20
20
|
import { poseToAssemblyTransform } from './pose.js';
|
|
21
21
|
/**
|