@faicad/faijs 0.16.1 → 0.18.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 +20 -2
- 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 +66 -29
- 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 +104 -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 +276 -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 +12 -3
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +54 -20
- 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 +44 -14
- 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 +22 -10
- 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 +20 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +30 -13
- 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/profile.d.ts +89 -0
- package/dist/api/profile.d.ts.map +1 -0
- package/dist/api/profile.js +194 -0
- package/dist/api/profile.js.map +1 -0
- package/dist/api/replicate.d.ts +28 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +34 -23
- 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 +729 -477
- 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 +35 -2
- 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 +64 -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 +782 -218
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +40 -0
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -0
- package/dist/brepkit-kernel/multi-version-test.js +89 -0
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -0
- 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 +29 -1
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +30 -2
- 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/dist/api/screw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screw.js","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib screw — 螺丝创建库函数(creator 函数,无输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { threadBrep } from './brep-mirror/threadFns'\nimport { getScrewSpec, threadToPitchMm, SCREW_HEAD_DIMS } from '../primitives/screw/screw-db'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:threadBrep + fuse 构造精确螺纹螺钉 + 三角化 + fromBrep 登记。 */\nasync function screwBrep(params: Record<string, unknown>): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/screw] no OCCT kernel')\n\n const system = params.system as 'metric' | 'imperial'\n const specIdx = params.specIdx as number\n const spec = getScrewSpec(system, specIdx)\n const length = params.length as number\n const head = params.head as 'hex' | 'chc' | 'none'\n const thread = params.thread as 'coarse' | 'fine' | 'custom' | 'none'\n const pitchCustom = params.pitchCustom as number | undefined\n\n // 1. 螺杆(圆柱体,居中)\n const shank = kernel.makeCylinder(spec.dia / 2, length)\n const centeredShank = kernel.translate(shank, 0, 0, -length / 2)\n kernel.release(shank)\n\n let result = centeredShank\n\n // 2. 螺纹(外螺纹)\n if (thread !== 'none') {\n const pitch = threadToPitchMm(system, spec, thread, pitchCustom)\n if (pitch > 0) {\n const threadSolid = threadBrep(kernel, {\n radius: spec.dia / 2,\n pitch,\n height: length,\n })\n // threadBrep creates thread from Z=0 to Z=height; center it to match shank\n const centeredThread = kernel.translate(threadSolid, 0, 0, -length / 2)\n kernel.release(threadSolid)\n const fused = kernel.fuse(result, centeredThread)\n kernel.release(result)\n kernel.release(centeredThread)\n result = fused\n }\n }\n\n // 3. 螺钉头\n if (head === 'hex') {\n // 六棱柱头\n const headHeight = spec.dia * SCREW_HEAD_DIMS.hex.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.hex.radiusFactor\n const headSolid = makeHexPrismBrep(kernel, headRadius, headHeight, length / 2)\n const fused = kernel.fuse(result, headSolid)\n kernel.release(result)\n kernel.release(headSolid)\n result = fused\n } else if (head === 'chc') {\n // 沉头(圆锥)\n const headHeight = spec.dia * SCREW_HEAD_DIMS.chc.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.chc.radiusFactor\n const cone = kernel.makeCone(headRadius, 0, headHeight)\n const positioned = kernel.translate(cone, 0, 0, length / 2)\n kernel.release(cone)\n const fused = kernel.fuse(result, positioned)\n kernel.release(result)\n kernel.release(positioned)\n result = fused\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 构造六棱柱 BREP solid\n */\nfunction makeHexPrismBrep(\n kernel: BrepEngineApi,\n radius: number,\n height: number,\n zOffset: number,\n): BrepHandle {\n // 六边形顶点\n const pts: { x: number; y: number; z: number }[] = []\n for (let i = 0; i < 6; i++) {\n const angle = (i * 2 * Math.PI) / 6\n pts.push({\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n z: 0,\n })\n }\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let i = 0; i < 6; i++) {\n const edge = kernel.makeLineEdge(pts[i], pts[(i + 1) % 6])\n edges.push(edge)\n }\n\n // 构建 wire → face → extrude\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 0, 0, height)\n\n // 平移到 zOffset\n const positioned = kernel.translate(extruded, 0, 0, zOffset)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return positioned\n}\n\n/**\n * Validate screw parameters: `system` and `specIdx` are required, and `length`\n * must be a finite number.\n * @param params - the raw screw operation parameters.\n */\nexport function assertScrewParams(params: Record<string, unknown>): void {\n if (typeof params.system !== 'string' || typeof params.specIdx !== 'number') {\n throw new Error(\n `[stdlib/screw] system (string) and specIdx (number) are required, got system=${JSON.stringify(params.system)}, specIdx=${JSON.stringify(params.specIdx)}`,\n )\n }\n if (typeof params.length !== 'number' || !Number.isFinite(params.length)) {\n throw new Error(`[stdlib/screw] length must be a finite number, got ${JSON.stringify(params.length)}`)\n }\n}\n\n/**\n * 生成螺丝零件(螺纹 + 头型)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name screw\n * @returns Shape 螺丝几何,生成独立零件。\n * @param params.system - 制式。type:'metric' | 'imperial' required:true\n * @param params.specIdx - 规格索引(决定公称直径,如 5 → M5、6 → M6)。type:number required:true\n * @param params.thread - 螺纹类型。type:'coarse' | 'fine' | 'custom' | 'none' 默认 'coarse'\n * @param params.length - 螺杆长度(mm)。type:number required:true\n * @param params.head - 头型(hex 六角 / chc 沉头 / none 无头)。type:'hex' | 'chc' | 'none' 默认 'none'\n * @param params.pitchCustom - 自定螺距(thread='custom' 时用)。type:number\n * @param params.nRad - 径向分段数(拓扑参数)。type:number 默认 32\n * @note nRad 是拓扑参数不是渲染参数:mesh 路径直接决定分段数;BREP 路径用精确曲面,nRad 仅作 BREP→mesh 三角化角度提示(angular deflection ≈ 2π/nRad)。.fai.js 默认 32 不输出,非默认才输出以保证可复现。\n * @note pitchCustom 执行层已支持(makeScrew/threadBrep 均读取),codegen 曾不序列化(TODO);当前已机械输出。\n * @example\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex' })\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex', nRad: 64 })\n */\nexport const screw = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return cad.screw({\n system: params.system as 'metric' | 'imperial',\n specIdx: params.specIdx as number,\n thread: params.thread as 'coarse' | 'fine' | 'custom' | 'none',\n pitchCustom: params.pitchCustom as number | undefined,\n length: params.length as number,\n head: params.head as 'hex' | 'chc' | 'none',\n nRad: params.nRad as number | undefined,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return screwBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"screw.js","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib screw — 螺丝创建库函数(creator 函数,无输入)\n *\n * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——BREP 路径的\n * 螺纹经 `threadBrep`(brep-mirror/threadFns.ts)走 occt-only `loft`(D3)→\n * `engines: ['occt']`。mesh 路径(cad.screw)在 auto 模式下正常降级。\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { threadBrep } from './brep-mirror/threadFns'\nimport { getScrewSpec, threadToPitchMm, SCREW_HEAD_DIMS } from '../primitives/screw/screw-db'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:threadBrep + fuse 构造精确螺纹螺钉 + 三角化 + fromBrep 登记。 */\nasync function screwBrep(params: Record<string, unknown>): Promise<Shape> {\n // L1 面(D12):makeCylinder/translate/fuse/makeCone 等全是 L1;螺纹 loft 在\n // threadFns 内部走 occt 平台面。\n const kernel = getBrepApi()\n\n const system = params.system as 'metric' | 'imperial'\n const specIdx = params.specIdx as number\n const spec = getScrewSpec(system, specIdx)\n const length = params.length as number\n const head = params.head as 'hex' | 'chc' | 'none'\n const thread = params.thread as 'coarse' | 'fine' | 'custom' | 'none'\n const pitchCustom = params.pitchCustom as number | undefined\n\n // 1. 螺杆(圆柱体,居中)\n const shank = kernel.makeCylinder(spec.dia / 2, length)\n const centeredShank = kernel.translate(shank, 0, 0, -length / 2)\n kernel.release(shank)\n\n let result = centeredShank\n\n // 2. 螺纹(外螺纹)\n if (thread !== 'none') {\n const pitch = threadToPitchMm(system, spec, thread, pitchCustom)\n if (pitch > 0) {\n const threadSolid = threadBrep(kernel, {\n radius: spec.dia / 2,\n pitch,\n height: length,\n })\n // threadBrep creates thread from Z=0 to Z=height; center it to match shank\n const centeredThread = kernel.translate(threadSolid, 0, 0, -length / 2)\n kernel.release(threadSolid)\n const fused = kernel.fuse(result, centeredThread)\n kernel.release(result)\n kernel.release(centeredThread)\n result = fused\n }\n }\n\n // 3. 螺钉头\n if (head === 'hex') {\n // 六棱柱头\n const headHeight = spec.dia * SCREW_HEAD_DIMS.hex.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.hex.radiusFactor\n const headSolid = makeHexPrismBrep(kernel, headRadius, headHeight, length / 2)\n const fused = kernel.fuse(result, headSolid)\n kernel.release(result)\n kernel.release(headSolid)\n result = fused\n } else if (head === 'chc') {\n // 沉头(圆锥)\n const headHeight = spec.dia * SCREW_HEAD_DIMS.chc.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.chc.radiusFactor\n const cone = kernel.makeCone(headRadius, 0, headHeight)\n const positioned = kernel.translate(cone, 0, 0, length / 2)\n kernel.release(cone)\n const fused = kernel.fuse(result, positioned)\n kernel.release(result)\n kernel.release(positioned)\n result = fused\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 构造六棱柱 BREP solid\n */\nfunction makeHexPrismBrep(\n kernel: BrepEngineApi,\n radius: number,\n height: number,\n zOffset: number,\n): BrepHandle {\n // 六边形顶点\n const pts: { x: number; y: number; z: number }[] = []\n for (let i = 0; i < 6; i++) {\n const angle = (i * 2 * Math.PI) / 6\n pts.push({\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n z: 0,\n })\n }\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let i = 0; i < 6; i++) {\n const edge = kernel.makeLineEdge(pts[i], pts[(i + 1) % 6])\n edges.push(edge)\n }\n\n // 构建 wire → face → extrude\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 0, 0, height)\n\n // 平移到 zOffset\n const positioned = kernel.translate(extruded, 0, 0, zOffset)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return positioned\n}\n\n/**\n * Validate screw parameters: `system` and `specIdx` are required, and `length`\n * must be a finite number.\n * @param params - the raw screw operation parameters.\n */\nexport function assertScrewParams(params: Record<string, unknown>): void {\n if (typeof params.system !== 'string' || typeof params.specIdx !== 'number') {\n throw new Error(\n `[stdlib/screw] system (string) and specIdx (number) are required, got system=${JSON.stringify(params.system)}, specIdx=${JSON.stringify(params.specIdx)}`,\n )\n }\n if (typeof params.length !== 'number' || !Number.isFinite(params.length)) {\n throw new Error(`[stdlib/screw] length must be a finite number, got ${JSON.stringify(params.length)}`)\n }\n}\n\n/**\n * 生成螺丝零件(螺纹 + 头型)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name screw\n * @returns Shape 螺丝几何,生成独立零件。\n * @param params.system - 制式。type:'metric' | 'imperial' required:true\n * @param params.specIdx - 规格索引(决定公称直径,如 5 → M5、6 → M6)。type:number required:true\n * @param params.thread - 螺纹类型。type:'coarse' | 'fine' | 'custom' | 'none' 默认 'coarse'\n * @param params.length - 螺杆长度(mm)。type:number required:true\n * @param params.head - 头型(hex 六角 / chc 沉头 / none 无头)。type:'hex' | 'chc' | 'none' 默认 'none'\n * @param params.pitchCustom - 自定螺距(thread='custom' 时用)。type:number\n * @param params.nRad - 径向分段数(拓扑参数)。type:number 默认 32\n * @note nRad 是拓扑参数不是渲染参数:mesh 路径直接决定分段数;BREP 路径用精确曲面,nRad 仅作 BREP→mesh 三角化角度提示(angular deflection ≈ 2π/nRad)。.fai.js 默认 32 不输出,非默认才输出以保证可复现。\n * @note pitchCustom 执行层已支持(makeScrew/threadBrep 均读取),codegen 曾不序列化(TODO);当前已机械输出。\n * @example\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex' })\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex', nRad: 64 })\n */\nexport const screw = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return cad.screw({\n system: params.system as 'metric' | 'imperial',\n specIdx: params.specIdx as number,\n thread: params.thread as 'coarse' | 'fine' | 'custom' | 'none',\n pitchCustom: params.pitchCustom as number | undefined,\n length: params.length as number,\n head: params.head as 'hex' | 'chc' | 'none',\n nRad: params.nRad as number | undefined,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return screwBrep(params)\n },\n // 平台 op(D11):螺纹 loft 是 occt-only(threadFns.ts,D3)→ engines 声明。\n engines: ['occt'],\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
package/dist/api/sdf.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export declare function assertSdfParams(params: Record<string, unknown>): void;
|
|
|
26
26
|
* @example
|
|
27
27
|
* const s = await cad.sdf({ code: 'return sphere(10) - sphere(5, [10,0,0])', box: [[-20,-20,-20],[30,20,20]], resolution: 1 })
|
|
28
28
|
*/
|
|
29
|
-
export declare const sdf: ((params: Record<string, unknown>) => Promise<import("
|
|
29
|
+
export declare const sdf: ((params: Record<string, unknown>) => Promise<import(".").Shape>) & {
|
|
30
30
|
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
31
31
|
};
|
|
32
32
|
//# sourceMappingURL=sdf.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
|
|
5
|
+
* 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。
|
|
6
|
+
*
|
|
7
|
+
* 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把
|
|
8
|
+
* compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为
|
|
9
|
+
* **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为
|
|
10
|
+
* `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。
|
|
11
|
+
* 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。
|
|
12
|
+
*/
|
|
13
|
+
import type { Shape } from '../mesh/types.js';
|
|
14
|
+
type Vec3 = [number, number, number];
|
|
15
|
+
/** `cad.sectionByPlane` 参数。 */
|
|
16
|
+
export interface SectionByPlaneParams {
|
|
17
|
+
/** 平面上一点(mm)。 */
|
|
18
|
+
point: Vec3;
|
|
19
|
+
/** 平面法向(不必单位化)。 */
|
|
20
|
+
normal: Vec3;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。
|
|
24
|
+
* @group 特征
|
|
25
|
+
* @inputs 1
|
|
26
|
+
* @async true
|
|
27
|
+
* @qual ok
|
|
28
|
+
* @name sectionByPlane
|
|
29
|
+
* @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',
|
|
30
|
+
* 全部交线收拢为一个 compound);平面不与体相交时显式报错。
|
|
31
|
+
* @returns Shape 1D 截面曲线。
|
|
32
|
+
* @param input - 目标实体。type:Shape required:true
|
|
33
|
+
* @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
|
|
34
|
+
* @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
|
|
35
|
+
* @example
|
|
36
|
+
* const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
|
|
37
|
+
*/
|
|
38
|
+
export declare const sectionByPlane: ((input: Shape, params: SectionByPlaneParams) => Promise<Shape>) & {
|
|
39
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
40
|
+
};
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=section-by-plane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-by-plane.d.ts","sourceRoot":"","sources":["../../src/api/section-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEpC,+BAA+B;AAC/B,MAAM,WAAW,oBAAoB;IACnC,iBAAiB;IACjB,KAAK,EAAE,IAAI,CAAA;IACX,mBAAmB;IACnB,MAAM,EAAE,IAAI,CAAA;CACb;AAwBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc;;CAMzB,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
|
|
5
|
+
* 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。
|
|
6
|
+
*
|
|
7
|
+
* 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把
|
|
8
|
+
* compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为
|
|
9
|
+
* **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为
|
|
10
|
+
* `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。
|
|
11
|
+
* 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。
|
|
12
|
+
*/
|
|
13
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
14
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
15
|
+
import { brepOf, fromBrepCurve } from '../shape.js';
|
|
16
|
+
import { defineOp } from '../sdk.js';
|
|
17
|
+
/** 元组 → BrepVec3 对象(同 split-by-plane:L1 向量形参是 {x,y,z} 对象)。 */
|
|
18
|
+
function toVec3(v) {
|
|
19
|
+
if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
|
|
20
|
+
throw new Error('E_SECTION_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers');
|
|
21
|
+
}
|
|
22
|
+
return { x: v[0], y: v[1], z: v[2] };
|
|
23
|
+
}
|
|
24
|
+
/** BREP 路径:L1 sectionByPlane → 交线收拢为 1D compound → fromBrepCurve 登记。 */
|
|
25
|
+
function sectionByPlaneBrep(input, params) {
|
|
26
|
+
const { point, normal } = params ?? {};
|
|
27
|
+
const kernel = getBrepApi();
|
|
28
|
+
const solid = brepOf(input);
|
|
29
|
+
if (!solid)
|
|
30
|
+
throw new Error('E_SECTION_BY_PLANE_NO_BREP: sectionByPlane input is not BREP');
|
|
31
|
+
const curves = kernel.sectionByPlane(solid, toVec3(point), toVec3(normal));
|
|
32
|
+
if (!curves || curves.length === 0) {
|
|
33
|
+
throw new Error('E_SECTION_BY_PLANE_NO_INTERSECTION: plane does not intersect the shape');
|
|
34
|
+
}
|
|
35
|
+
const compound = kernel.makeCompound(curves);
|
|
36
|
+
return fromBrepCurve(solidToShape(kernel, compound), { solid: compound });
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。
|
|
40
|
+
* @group 特征
|
|
41
|
+
* @inputs 1
|
|
42
|
+
* @async true
|
|
43
|
+
* @qual ok
|
|
44
|
+
* @name sectionByPlane
|
|
45
|
+
* @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',
|
|
46
|
+
* 全部交线收拢为一个 compound);平面不与体相交时显式报错。
|
|
47
|
+
* @returns Shape 1D 截面曲线。
|
|
48
|
+
* @param input - 目标实体。type:Shape required:true
|
|
49
|
+
* @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
|
|
50
|
+
* @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
|
|
51
|
+
* @example
|
|
52
|
+
* const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
|
|
53
|
+
*/
|
|
54
|
+
export const sectionByPlane = defineOp({
|
|
55
|
+
capabilities: ['directEdit'],
|
|
56
|
+
brep(input, params) {
|
|
57
|
+
return sectionByPlaneBrep(input, params);
|
|
58
|
+
},
|
|
59
|
+
naming: { kind: 'unmodeled', reason: '1D section curves have no face role vocabulary' },
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=section-by-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-by-plane.js","sourceRoot":"","sources":["../../src/api/section-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAajC,8DAA8D;AAC9D,SAAS,MAAM,CAAC,CAAO;IACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtC,CAAC;AAED,wEAAwE;AACxE,SAAS,kBAAkB,CAAC,KAAY,EAAE,MAA4B;IACpE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAK,EAA2B,CAAA;IAChE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IAC3F,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;IAC3F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5C,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,KAAY,EAAE,MAA4B;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,gDAAgD,EAAgB;CACtG,CAAC,CAAA","sourcesContent":["/**\n * stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)\n *\n * 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有\n * 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。\n *\n * 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把\n * compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为\n * **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为\n * `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。\n * 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\ntype Vec3 = [number, number, number]\n\n/** `cad.sectionByPlane` 参数。 */\nexport interface SectionByPlaneParams {\n /** 平面上一点(mm)。 */\n point: Vec3\n /** 平面法向(不必单位化)。 */\n normal: Vec3\n}\n\n/** 元组 → BrepVec3 对象(同 split-by-plane:L1 向量形参是 {x,y,z} 对象)。 */\nfunction toVec3(v: Vec3): BrepVec3 {\n if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {\n throw new Error('E_SECTION_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers')\n }\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** BREP 路径:L1 sectionByPlane → 交线收拢为 1D compound → fromBrepCurve 登记。 */\nfunction sectionByPlaneBrep(input: Shape, params: SectionByPlaneParams): Shape {\n const { point, normal } = params ?? ({} as SectionByPlaneParams)\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_SECTION_BY_PLANE_NO_BREP: sectionByPlane input is not BREP')\n const curves = kernel.sectionByPlane(solid, toVec3(point), toVec3(normal))\n if (!curves || curves.length === 0) {\n throw new Error('E_SECTION_BY_PLANE_NO_INTERSECTION: plane does not intersect the shape')\n }\n const compound = kernel.makeCompound(curves)\n return fromBrepCurve(solidToShape(kernel, compound), { solid: compound })\n}\n\n/**\n * 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name sectionByPlane\n * @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',\n * 全部交线收拢为一个 compound);平面不与体相交时显式报错。\n * @returns Shape 1D 截面曲线。\n * @param input - 目标实体。type:Shape required:true\n * @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true\n * @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true\n * @example\n * const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })\n */\nexport const sectionByPlane = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: SectionByPlaneParams) {\n return sectionByPlaneBrep(input, params)\n },\n naming: { kind: 'unmodeled', reason: '1D section curves have no face role vocabulary' } as Provenance,\n})\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与
|
|
5
|
+
* brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
|
|
6
|
+
* (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是
|
|
7
|
+
* 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。
|
|
8
|
+
*
|
|
9
|
+
* 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),
|
|
10
|
+
* 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的
|
|
11
|
+
* `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举
|
|
12
|
+
* + `resolveTopoRef`)。
|
|
13
|
+
*/
|
|
14
|
+
import type { Shape } from '../mesh/types.js';
|
|
15
|
+
import type { FaceTopoRef } from '../topology/naming/index.js';
|
|
16
|
+
/** `cad.shell` 参数。 */
|
|
17
|
+
export interface ShellParams {
|
|
18
|
+
/** 抽壳时移除的面(FaceTopoRef[],`cad.faceRef` 产物;空数组 = 全封闭薄壁)。 */
|
|
19
|
+
openFaces: FaceTopoRef[];
|
|
20
|
+
/** 壁厚(mm,>0,向内偏置)。 */
|
|
21
|
+
thickness: number;
|
|
22
|
+
/** 容差(mm,可选;默认走内核约定值)。 */
|
|
23
|
+
tolerance?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 抽壳:移除指定面并把余下面偏置成等厚薄壁。
|
|
27
|
+
* @group 特征
|
|
28
|
+
* @inputs 1
|
|
29
|
+
* @async true
|
|
30
|
+
* @qual ok
|
|
31
|
+
* @name shell
|
|
32
|
+
* @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。
|
|
33
|
+
* 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。
|
|
34
|
+
* @returns Shape 抽壳后的薄壁体。
|
|
35
|
+
* @param input - 目标几何。type:Shape required:true
|
|
36
|
+
* @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
|
|
37
|
+
* @param params.thickness - 壁厚(mm,>0)。type:number required:true
|
|
38
|
+
* @param params.tolerance - 容差(mm)。type:number required:false
|
|
39
|
+
* @example
|
|
40
|
+
* const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })
|
|
41
|
+
*/
|
|
42
|
+
export declare const shell: ((input: Shape, params: ShellParams) => Promise<Shape>) & {
|
|
43
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/api/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD,sBAAsB;AACtB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgCD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAMhB,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与
|
|
5
|
+
* brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
|
|
6
|
+
* (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是
|
|
7
|
+
* 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。
|
|
8
|
+
*
|
|
9
|
+
* 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),
|
|
10
|
+
* 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的
|
|
11
|
+
* `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举
|
|
12
|
+
* + `resolveTopoRef`)。
|
|
13
|
+
*/
|
|
14
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
15
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
16
|
+
import { brepOf, fromBrep } from '../shape.js';
|
|
17
|
+
import { defineOp } from '../sdk.js';
|
|
18
|
+
import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
|
|
19
|
+
import { buildEdgeResolutionContext } from './topo-resolve.js';
|
|
20
|
+
/** BREP 路径:解析面引用 → L1 shell → 收养。 */
|
|
21
|
+
function shellBrep(input, params) {
|
|
22
|
+
const { openFaces, thickness, tolerance } = params ?? {};
|
|
23
|
+
if (!Array.isArray(openFaces)) {
|
|
24
|
+
throw new Error('E_SHELL_BAD_OPEN_FACES: shell.openFaces must be an array of FaceTopoRef');
|
|
25
|
+
}
|
|
26
|
+
if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness <= 0) {
|
|
27
|
+
throw new Error('E_SHELL_BAD_THICKNESS: shell.thickness must be a positive number');
|
|
28
|
+
}
|
|
29
|
+
const kernel = getBrepApi();
|
|
30
|
+
const solid = brepOf(input);
|
|
31
|
+
if (!solid)
|
|
32
|
+
throw new Error('E_SHELL_NO_BREP: shell input is not BREP');
|
|
33
|
+
const ctx = buildEdgeResolutionContext(kernel, input);
|
|
34
|
+
if (!ctx)
|
|
35
|
+
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'shell: input has no BREP naming context');
|
|
36
|
+
const faceHandles = openFaces.map((ref) => {
|
|
37
|
+
if (!ref || ref.kind !== 'face') {
|
|
38
|
+
throw new Error('E_SHELL_BAD_OPEN_FACES: every openFaces entry must be a FaceTopoRef (cad.faceRef)');
|
|
39
|
+
}
|
|
40
|
+
const r = resolveTopoRef(ref, ctx);
|
|
41
|
+
if (r.handle === undefined) {
|
|
42
|
+
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `shell: face resolved without handle (${ref.origin}/${ref.role})`);
|
|
43
|
+
}
|
|
44
|
+
return r.handle;
|
|
45
|
+
});
|
|
46
|
+
const result = kernel.shell(solid, faceHandles, thickness, tolerance ?? 1e-6);
|
|
47
|
+
return fromBrep(solidToShape(kernel, result), { solid: result });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 抽壳:移除指定面并把余下面偏置成等厚薄壁。
|
|
51
|
+
* @group 特征
|
|
52
|
+
* @inputs 1
|
|
53
|
+
* @async true
|
|
54
|
+
* @qual ok
|
|
55
|
+
* @name shell
|
|
56
|
+
* @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。
|
|
57
|
+
* 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。
|
|
58
|
+
* @returns Shape 抽壳后的薄壁体。
|
|
59
|
+
* @param input - 目标几何。type:Shape required:true
|
|
60
|
+
* @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
|
|
61
|
+
* @param params.thickness - 壁厚(mm,>0)。type:number required:true
|
|
62
|
+
* @param params.tolerance - 容差(mm)。type:number required:false
|
|
63
|
+
* @example
|
|
64
|
+
* const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })
|
|
65
|
+
*/
|
|
66
|
+
export const shell = defineOp({
|
|
67
|
+
capabilities: ['directEdit'],
|
|
68
|
+
brep(input, params) {
|
|
69
|
+
return shellBrep(input, params);
|
|
70
|
+
},
|
|
71
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/api/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAY3D,qCAAqC;AACrC,SAAS,SAAS,CAAC,KAAY,EAAE,MAAmB;IAClD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,IAAK,EAAkB,CAAA;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAEvE,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAe,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,yCAAyC,CAAC,CAAA;IACvG,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC,GAAG,IAAK,GAA0B,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;QACtG,CAAC;QACD,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,wCAAwC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;QACvH,CAAC;QACD,OAAO,CAAC,CAAC,MAAoB,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,CAAA;IAC7E,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,KAAY,EAAE,MAAmB;QACpC,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAgB;CAC3E,CAAC,CAAA","sourcesContent":["/**\n * stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)\n *\n * 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与\n * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`\n * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是\n * 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。\n *\n * 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),\n * 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的\n * `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举\n * + `resolveTopoRef`)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { FaceTopoRef } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n/** `cad.shell` 参数。 */\nexport interface ShellParams {\n /** 抽壳时移除的面(FaceTopoRef[],`cad.faceRef` 产物;空数组 = 全封闭薄壁)。 */\n openFaces: FaceTopoRef[]\n /** 壁厚(mm,>0,向内偏置)。 */\n thickness: number\n /** 容差(mm,可选;默认走内核约定值)。 */\n tolerance?: number\n}\n\n/** BREP 路径:解析面引用 → L1 shell → 收养。 */\nfunction shellBrep(input: Shape, params: ShellParams): Shape {\n const { openFaces, thickness, tolerance } = params ?? ({} as ShellParams)\n if (!Array.isArray(openFaces)) {\n throw new Error('E_SHELL_BAD_OPEN_FACES: shell.openFaces must be an array of FaceTopoRef')\n }\n if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness <= 0) {\n throw new Error('E_SHELL_BAD_THICKNESS: shell.thickness must be a positive number')\n }\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_SHELL_NO_BREP: shell input is not BREP')\n\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'shell: input has no BREP naming context')\n const faceHandles = openFaces.map((ref) => {\n if (!ref || (ref as { kind?: unknown }).kind !== 'face') {\n throw new Error('E_SHELL_BAD_OPEN_FACES: every openFaces entry must be a FaceTopoRef (cad.faceRef)')\n }\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `shell: face resolved without handle (${ref.origin}/${ref.role})`)\n }\n return r.handle as BrepHandle\n })\n\n const result = kernel.shell(solid, faceHandles, thickness, tolerance ?? 1e-6)\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 抽壳:移除指定面并把余下面偏置成等厚薄壁。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name shell\n * @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。\n * 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。\n * @returns Shape 抽壳后的薄壁体。\n * @param input - 目标几何。type:Shape required:true\n * @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true\n * @param params.thickness - 壁厚(mm,>0)。type:number required:true\n * @param params.tolerance - 容差(mm)。type:number required:false\n * @example\n * const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })\n */\nexport const shell = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: ShellParams) {\n return shellBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
package/dist/api/sketch.d.ts
CHANGED
|
@@ -48,6 +48,11 @@ export interface SketchLoop {
|
|
|
48
48
|
/** `cad.sketch` 参数:轮廓环集合(第一个为外环,其余为孔)。 */
|
|
49
49
|
export interface SketchContoursParams {
|
|
50
50
|
contours: SketchLoop[];
|
|
51
|
+
/**
|
|
52
|
+
* 产物形态:'face'(默认)构面;'wire' 只交出不带面的外环 wire(1D 曲线),
|
|
53
|
+
* 供扫掠族(sweep/loft/…)直接作 spine。'wire' 形态丢弃孔环(扫掠脊柱为单闭合轮廓)。
|
|
54
|
+
*/
|
|
55
|
+
as?: 'face' | 'wire';
|
|
51
56
|
}
|
|
52
57
|
/**
|
|
53
58
|
* Validate sketch parameters: `contours` must be a non-empty array of loops,
|
|
@@ -62,10 +67,12 @@ export declare function assertSketchParams(params: Record<string, unknown>): voi
|
|
|
62
67
|
* @async false
|
|
63
68
|
* @qual ok
|
|
64
69
|
* @name sketch
|
|
65
|
-
* @returns Shape 平面几何(mesh 三角化 + BREP
|
|
70
|
+
* @returns Shape 平面几何(mesh 三角化 + BREP 句柄);`as:'wire'` 时返回 1D 曲线(kind:'curve')。
|
|
66
71
|
* @param params.contours - 有序 2D 轮廓(线段/圆弧;外环 + 孔)。type:SketchLoop[] required:true
|
|
72
|
+
* @param params.as - 产物形态:'face'(默认)构面;'wire' 只交外环 wire(1D 曲线)。type:'face'|'wire' required:false
|
|
67
73
|
* @example
|
|
68
74
|
* const f = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }] })
|
|
75
|
+
* const w = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }], as: 'wire' })
|
|
69
76
|
*/
|
|
70
77
|
export declare const sketch: ((params: Record<string, unknown>) => Promise<Shape>) & {
|
|
71
78
|
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
package/dist/api/sketch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,0BAA0B;AAC1B,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,CAAA;AAEpD,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,0BAA0B;AAC1B,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,CAAA;AAEpD,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAaxE;AAqGD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}
|
package/dist/api/sketch.js
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* 坐标系:输入 2D 点即 (x, y, 0),法向 +Z;草图在 Body 局部系内的定位由调用方(fcstd 端口)
|
|
15
15
|
* 在轮廓坐标里预先变换,或由下游特征的 Placement 承担。
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
18
18
|
import { solidToShape } from '../brep/brep-ops.js';
|
|
19
|
-
import { fromBrep } from '../shape.js';
|
|
19
|
+
import { fromBrep, fromBrepCurve } from '../shape.js';
|
|
20
20
|
import { defineOp } from '../sdk.js';
|
|
21
21
|
// ── 参数自校验 ──
|
|
22
22
|
/**
|
|
@@ -99,11 +99,10 @@ function loopToWire(kernel, loop) {
|
|
|
99
99
|
}
|
|
100
100
|
return kernel.makeWire(edges);
|
|
101
101
|
}
|
|
102
|
-
/** BREP 路径:2D 轮廓 → planar face(外环 +
|
|
102
|
+
/** BREP 路径:2D 轮廓 → planar face(外环 + 孔),或 'wire' 形态仅交外环 wire。 */
|
|
103
103
|
function sketchBrep(params) {
|
|
104
|
-
const kernel =
|
|
105
|
-
|
|
106
|
-
throw new Error('[stdlib/sketch] no BREP kernel');
|
|
104
|
+
const kernel = getBrepApi();
|
|
105
|
+
const as = params.as ?? 'face';
|
|
107
106
|
const loops = params.contours.map((loop) => ({ loop, area: Math.abs(loopSignedArea(loop)) }));
|
|
108
107
|
// 面积最大者为外环,其余为孔
|
|
109
108
|
let outerIdx = 0;
|
|
@@ -112,6 +111,10 @@ function sketchBrep(params) {
|
|
|
112
111
|
outerIdx = i;
|
|
113
112
|
}
|
|
114
113
|
const outerWire = loopToWire(kernel, loops[outerIdx].loop);
|
|
114
|
+
// 'wire' 形态:只交外环 wire(1D 曲线),不构面 —— 供扫掠族作 spine。
|
|
115
|
+
if (as === 'wire') {
|
|
116
|
+
return fromBrepCurve(solidToShape(kernel, outerWire), { solid: outerWire });
|
|
117
|
+
}
|
|
115
118
|
const face = kernel.makeFace(outerWire);
|
|
116
119
|
const holeWires = [];
|
|
117
120
|
for (let i = 0; i < loops.length; i++) {
|
|
@@ -134,10 +137,12 @@ function sketchBrep(params) {
|
|
|
134
137
|
* @async false
|
|
135
138
|
* @qual ok
|
|
136
139
|
* @name sketch
|
|
137
|
-
* @returns Shape 平面几何(mesh 三角化 + BREP
|
|
140
|
+
* @returns Shape 平面几何(mesh 三角化 + BREP 句柄);`as:'wire'` 时返回 1D 曲线(kind:'curve')。
|
|
138
141
|
* @param params.contours - 有序 2D 轮廓(线段/圆弧;外环 + 孔)。type:SketchLoop[] required:true
|
|
142
|
+
* @param params.as - 产物形态:'face'(默认)构面;'wire' 只交外环 wire(1D 曲线)。type:'face'|'wire' required:false
|
|
139
143
|
* @example
|
|
140
144
|
* const f = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }] })
|
|
145
|
+
* const w = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }], as: 'wire' })
|
|
141
146
|
*/
|
|
142
147
|
export const sketch = defineOp({
|
|
143
148
|
capabilities: ['directEdit'],
|
package/dist/api/sketch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sketch.js","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AA4CjC,cAAc;AAEd;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA+B;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC/E,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvF,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC/E,CAAC;QACD,IAAK,IAAmB,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,SAAS,cAAc,CAAC,IAAgB;IACtC,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5B,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAE,CAAA;QACxB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAE,CAAA;QAC3C,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACxB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,oCAAoC;AACpC,SAAS,YAAY,CACnB,MAAqB,EACrB,GAAiB;IAEjB,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IACpD,IAAI,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAA;IACjC,sBAAsB;IACtB,OAAO,KAAK,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IACvC,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;QAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IAEhD,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAU,EAA4C,EAAE;QACnF,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QACpF,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QAClF,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QAClF,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1C,CAAC,CAAA;IAED,6CAA6C;IAC7C,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QAC5B,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,4CAA4C;AAC5C,SAAS,UAAU,CAAC,MAAqB,EAAE,IAAgB;IACzD,MAAM,KAAK,GAAgD,EAAE,CAAA;IAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QACjG,CAAC;aAAM,CAAC;YACN,0BAA0B;YAC1B,IAAI,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAA;YACzC,OAAO,KAAK,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;YACvC,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;gBAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;YAChD,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACjG,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAoD,CAAC,CAAA;AAC9E,CAAC;AAED,2CAA2C;AAC3C,SAAS,UAAU,CAAC,MAA+B;IACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE9D,MAAM,KAAK,GAAI,MAAM,CAAC,QAAyB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/G,gBAAgB;IAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAE,CAAC,IAAI;YAAE,QAAQ,GAAG,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAEvC,MAAM,SAAS,GAA4C,EAAE,CAAA;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,QAAQ;YAAE,SAAQ;QAC5B,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACpD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACpB,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACzB,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,MAA+B;QAClC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC1B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,EAAgB;CACtF,CAAC,CAAA","sourcesContent":["/**\n * stdlib sketch — 从 2D 轮廓构面(creator 函数,无输入,brep-only)。\n *\n * 用途:faijs 此前没有「从 2D 轮廓构造 planar face」的能力,导致草图轮廓无法喂给\n * extrude/revolve。本 op 接收 2D 轮廓(线段 + 圆弧),在 z=0 平面用 OCCT 构面:\n * makeLineEdge/makeArcEdge → makeWire → makeFace(+ addHolesInFace)。\n *\n * 设计:\n * - 输入:{ contours: SketchLoop[] },每个 loop = 有序 segments(line / arc,z=0)。\n * - 外环 = 面积(shoelace)绝对值最大的 loop;其余 loop 作为孔。\n * - 圆弧:用起点/中点/终点三点的 makeArcEdge;整圆(sweep≈2π)拆成两段弧。\n * - 输出:Shape(mesh 三角化 + 句柄登记)。brep-only(下游 extrude/revolve 亦 brep-only)。\n *\n * 坐标系:输入 2D 点即 (x, y, 0),法向 +Z;草图在 Body 局部系内的定位由调用方(fcstd 端口)\n * 在轮廓坐标里预先变换,或由下游特征的 Placement 承担。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { getBackends } from '../runtime-state'\nimport { solidToShape } from '../brep/brep-ops'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\n// ── 参数形状(与 fcstd Contour 结构相同,避免引擎依赖端口层)──\n\n/** 直线段(2D,z=0;端点为绝对坐标)。 */\nexport interface SketchLineSeg {\n kind: 'line'\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n/** 圆弧段(圆心 + 半径 + 起止角,弧度;z=0)。 */\nexport interface SketchArcSeg {\n kind: 'arc'\n cx: number\n cy: number\n radius: number\n /** 起始角(弧度) */\n startAngle: number\n /** 终止角(弧度) */\n endAngle: number\n ccw: boolean\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n/** 一条有序 2D 轮廓段(直线或圆弧)。 */\nexport type SketchSeg = SketchLineSeg | SketchArcSeg\n\n/** 单个轮廓环:有序段序列(首尾相接)。 */\nexport interface SketchLoop {\n segments: SketchSeg[]\n}\n\n/** `cad.sketch` 参数:轮廓环集合(第一个为外环,其余为孔)。 */\nexport interface SketchContoursParams {\n contours: SketchLoop[]\n}\n\n// ── 参数自校验 ──\n\n/**\n * Validate sketch parameters: `contours` must be a non-empty array of loops,\n * each with at least one segment.\n * @param params the raw sketch operation parameters.\n */\nexport function assertSketchParams(params: Record<string, unknown>): void {\n const contours = params.contours\n if (!Array.isArray(contours) || contours.length === 0) {\n throw new Error('E_SKETCH_NO_CONTOURS: sketch requires at least one contour')\n }\n for (const loop of contours) {\n if (!loop || typeof loop !== 'object' || !Array.isArray((loop as SketchLoop).segments)) {\n throw new Error('E_SKETCH_BAD_LOOP: each contour must have a segments array')\n }\n if ((loop as SketchLoop).segments.length === 0) {\n throw new Error('E_SKETCH_EMPTY_LOOP: a contour must have at least one segment')\n }\n }\n}\n\n/** 单环 shoelace 面积(带符号)。 */\nfunction loopSignedArea(loop: SketchLoop): number {\n const pts: Array<[number, number]> = []\n for (const seg of loop.segments) {\n pts.push([seg.x1, seg.y1])\n }\n let a = 0\n for (let i = 0; i < pts.length; i++) {\n const [x1, y1] = pts[i]!\n const [x2, y2] = pts[(i + 1) % pts.length]!\n a += x1 * y2 - x2 * y1\n }\n return a / 2\n}\n\n/** 圆弧 → 一条或两条 makeArcEdge(整圆拆分)。 */\nfunction arcToHandles(\n kernel: BrepEngineApi,\n seg: SketchArcSeg,\n): ReturnType<BrepEngineApi['makeArcEdge']>[] {\n const { cx, cy, radius, startAngle, endAngle } = seg\n let sweep = endAngle - startAngle\n // 归一化到 (0, 2π],处理角度回绕\n while (sweep <= 0) sweep += 2 * Math.PI\n while (sweep > 2 * Math.PI) sweep -= 2 * Math.PI\n\n const makeOne = (a0: number, a1: number): ReturnType<BrepEngineApi['makeArcEdge']> => {\n const mid = (a0 + a1) / 2\n const start = { x: cx + radius * Math.cos(a0), y: cy + radius * Math.sin(a0), z: 0 }\n const m = { x: cx + radius * Math.cos(mid), y: cy + radius * Math.sin(mid), z: 0 }\n const end = { x: cx + radius * Math.cos(a1), y: cy + radius * Math.sin(a1), z: 0 }\n return kernel.makeArcEdge(start, m, end)\n }\n\n // 整圆(sweep≈2π):拆成两段半圆,避免 makeArcEdge 起点≈终点退化\n if (sweep >= 2 * Math.PI - 1e-9) {\n const half = 2 * Math.PI / 2\n return [makeOne(startAngle, startAngle + half), makeOne(startAngle + half, startAngle + 2 * Math.PI)]\n }\n return [makeOne(startAngle, endAngle)]\n}\n\n/** 单环 → wire handle(仅构面,不释放中间句柄,遵循现有惯例)。 */\nfunction loopToWire(kernel: BrepEngineApi, loop: SketchLoop): ReturnType<BrepEngineApi['makeWire']> {\n const edges: ReturnType<BrepEngineApi['makeLineEdge']>[] = []\n for (const seg of loop.segments) {\n if (seg.kind === 'line') {\n edges.push(kernel.makeLineEdge({ x: seg.x1, y: seg.y1, z: 0 }, { x: seg.x2, y: seg.y2, z: 0 }))\n } else {\n // 极小扫角(退化弧)→ 退化为线段,避免构边失败\n let sweep = seg.endAngle - seg.startAngle\n while (sweep <= 0) sweep += 2 * Math.PI\n while (sweep > 2 * Math.PI) sweep -= 2 * Math.PI\n if (sweep < 1e-9) {\n edges.push(kernel.makeLineEdge({ x: seg.x1, y: seg.y1, z: 0 }, { x: seg.x2, y: seg.y2, z: 0 }))\n } else {\n edges.push(...arcToHandles(kernel, seg))\n }\n }\n }\n return kernel.makeWire(edges as ReturnType<BrepEngineApi['makeLineEdge']>[])\n}\n\n/** BREP 路径:2D 轮廓 → planar face(外环 + 孔)。 */\nfunction sketchBrep(params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/sketch] no BREP kernel')\n\n const loops = (params.contours as SketchLoop[]).map((loop) => ({ loop, area: Math.abs(loopSignedArea(loop)) }))\n // 面积最大者为外环,其余为孔\n let outerIdx = 0\n for (let i = 1; i < loops.length; i++) {\n if (loops[i]!.area > loops[outerIdx]!.area) outerIdx = i\n }\n\n const outerWire = loopToWire(kernel, loops[outerIdx]!.loop)\n const face = kernel.makeFace(outerWire)\n\n const holeWires: ReturnType<BrepEngineApi['makeWire']>[] = []\n for (let i = 0; i < loops.length; i++) {\n if (i === outerIdx) continue\n holeWires.push(loopToWire(kernel, loops[i]!.loop))\n }\n if (holeWires.length > 0) {\n const faced = kernel.addHolesInFace(face, holeWires)\n kernel.release(face)\n return fromBrep(solidToShape(kernel, faced), { solid: faced })\n }\n\n kernel.release(outerWire)\n return fromBrep(solidToShape(kernel, face), { solid: face })\n}\n\n/**\n * 从 2D 轮廓构造平面(creator,无输入)。仅 BREP 可用。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sketch\n * @returns Shape 平面几何(mesh 三角化 + BREP 句柄)。\n * @param params.contours - 有序 2D 轮廓(线段/圆弧;外环 + 孔)。type:SketchLoop[] required:true\n * @example\n * const f = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }] })\n */\nexport const sketch = defineOp({\n capabilities: ['directEdit'],\n brep(params: Record<string, unknown>) {\n assertSketchParams(params)\n return sketchBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"sketch.js","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib sketch — 从 2D 轮廓构面(creator 函数,无输入,brep-only)。\n *\n * 用途:faijs 此前没有「从 2D 轮廓构造 planar face」的能力,导致草图轮廓无法喂给\n * extrude/revolve。本 op 接收 2D 轮廓(线段 + 圆弧),在 z=0 平面用 OCCT 构面:\n * makeLineEdge/makeArcEdge → makeWire → makeFace(+ addHolesInFace)。\n *\n * 设计:\n * - 输入:{ contours: SketchLoop[] },每个 loop = 有序 segments(line / arc,z=0)。\n * - 外环 = 面积(shoelace)绝对值最大的 loop;其余 loop 作为孔。\n * - 圆弧:用起点/中点/终点三点的 makeArcEdge;整圆(sweep≈2π)拆成两段弧。\n * - 输出:Shape(mesh 三角化 + 句柄登记)。brep-only(下游 extrude/revolve 亦 brep-only)。\n *\n * 坐标系:输入 2D 点即 (x, y, 0),法向 +Z;草图在 Body 局部系内的定位由调用方(fcstd 端口)\n * 在轮廓坐标里预先变换,或由下游特征的 Placement 承担。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { solidToShape } from '../brep/brep-ops'\nimport { fromBrep, fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\n// ── 参数形状(与 fcstd Contour 结构相同,避免引擎依赖端口层)──\n\n/** 直线段(2D,z=0;端点为绝对坐标)。 */\nexport interface SketchLineSeg {\n kind: 'line'\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n/** 圆弧段(圆心 + 半径 + 起止角,弧度;z=0)。 */\nexport interface SketchArcSeg {\n kind: 'arc'\n cx: number\n cy: number\n radius: number\n /** 起始角(弧度) */\n startAngle: number\n /** 终止角(弧度) */\n endAngle: number\n ccw: boolean\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n/** 一条有序 2D 轮廓段(直线或圆弧)。 */\nexport type SketchSeg = SketchLineSeg | SketchArcSeg\n\n/** 单个轮廓环:有序段序列(首尾相接)。 */\nexport interface SketchLoop {\n segments: SketchSeg[]\n}\n\n/** `cad.sketch` 参数:轮廓环集合(第一个为外环,其余为孔)。 */\nexport interface SketchContoursParams {\n contours: SketchLoop[]\n /**\n * 产物形态:'face'(默认)构面;'wire' 只交出不带面的外环 wire(1D 曲线),\n * 供扫掠族(sweep/loft/…)直接作 spine。'wire' 形态丢弃孔环(扫掠脊柱为单闭合轮廓)。\n */\n as?: 'face' | 'wire'\n}\n\n// ── 参数自校验 ──\n\n/**\n * Validate sketch parameters: `contours` must be a non-empty array of loops,\n * each with at least one segment.\n * @param params the raw sketch operation parameters.\n */\nexport function assertSketchParams(params: Record<string, unknown>): void {\n const contours = params.contours\n if (!Array.isArray(contours) || contours.length === 0) {\n throw new Error('E_SKETCH_NO_CONTOURS: sketch requires at least one contour')\n }\n for (const loop of contours) {\n if (!loop || typeof loop !== 'object' || !Array.isArray((loop as SketchLoop).segments)) {\n throw new Error('E_SKETCH_BAD_LOOP: each contour must have a segments array')\n }\n if ((loop as SketchLoop).segments.length === 0) {\n throw new Error('E_SKETCH_EMPTY_LOOP: a contour must have at least one segment')\n }\n }\n}\n\n/** 单环 shoelace 面积(带符号)。 */\nfunction loopSignedArea(loop: SketchLoop): number {\n const pts: Array<[number, number]> = []\n for (const seg of loop.segments) {\n pts.push([seg.x1, seg.y1])\n }\n let a = 0\n for (let i = 0; i < pts.length; i++) {\n const [x1, y1] = pts[i]!\n const [x2, y2] = pts[(i + 1) % pts.length]!\n a += x1 * y2 - x2 * y1\n }\n return a / 2\n}\n\n/** 圆弧 → 一条或两条 makeArcEdge(整圆拆分)。 */\nfunction arcToHandles(\n kernel: BrepEngineApi,\n seg: SketchArcSeg,\n): ReturnType<BrepEngineApi['makeArcEdge']>[] {\n const { cx, cy, radius, startAngle, endAngle } = seg\n let sweep = endAngle - startAngle\n // 归一化到 (0, 2π],处理角度回绕\n while (sweep <= 0) sweep += 2 * Math.PI\n while (sweep > 2 * Math.PI) sweep -= 2 * Math.PI\n\n const makeOne = (a0: number, a1: number): ReturnType<BrepEngineApi['makeArcEdge']> => {\n const mid = (a0 + a1) / 2\n const start = { x: cx + radius * Math.cos(a0), y: cy + radius * Math.sin(a0), z: 0 }\n const m = { x: cx + radius * Math.cos(mid), y: cy + radius * Math.sin(mid), z: 0 }\n const end = { x: cx + radius * Math.cos(a1), y: cy + radius * Math.sin(a1), z: 0 }\n return kernel.makeArcEdge(start, m, end)\n }\n\n // 整圆(sweep≈2π):拆成两段半圆,避免 makeArcEdge 起点≈终点退化\n if (sweep >= 2 * Math.PI - 1e-9) {\n const half = 2 * Math.PI / 2\n return [makeOne(startAngle, startAngle + half), makeOne(startAngle + half, startAngle + 2 * Math.PI)]\n }\n return [makeOne(startAngle, endAngle)]\n}\n\n/** 单环 → wire handle(仅构面,不释放中间句柄,遵循现有惯例)。 */\nfunction loopToWire(kernel: BrepEngineApi, loop: SketchLoop): ReturnType<BrepEngineApi['makeWire']> {\n const edges: ReturnType<BrepEngineApi['makeLineEdge']>[] = []\n for (const seg of loop.segments) {\n if (seg.kind === 'line') {\n edges.push(kernel.makeLineEdge({ x: seg.x1, y: seg.y1, z: 0 }, { x: seg.x2, y: seg.y2, z: 0 }))\n } else {\n // 极小扫角(退化弧)→ 退化为线段,避免构边失败\n let sweep = seg.endAngle - seg.startAngle\n while (sweep <= 0) sweep += 2 * Math.PI\n while (sweep > 2 * Math.PI) sweep -= 2 * Math.PI\n if (sweep < 1e-9) {\n edges.push(kernel.makeLineEdge({ x: seg.x1, y: seg.y1, z: 0 }, { x: seg.x2, y: seg.y2, z: 0 }))\n } else {\n edges.push(...arcToHandles(kernel, seg))\n }\n }\n }\n return kernel.makeWire(edges as ReturnType<BrepEngineApi['makeLineEdge']>[])\n}\n\n/** BREP 路径:2D 轮廓 → planar face(外环 + 孔),或 'wire' 形态仅交外环 wire。 */\nfunction sketchBrep(params: Record<string, unknown>): Shape {\n const kernel = getBrepApi()\n const as = (params.as as 'face' | 'wire' | undefined) ?? 'face'\n\n const loops = (params.contours as SketchLoop[]).map((loop) => ({ loop, area: Math.abs(loopSignedArea(loop)) }))\n // 面积最大者为外环,其余为孔\n let outerIdx = 0\n for (let i = 1; i < loops.length; i++) {\n if (loops[i]!.area > loops[outerIdx]!.area) outerIdx = i\n }\n\n const outerWire = loopToWire(kernel, loops[outerIdx]!.loop)\n\n // 'wire' 形态:只交外环 wire(1D 曲线),不构面 —— 供扫掠族作 spine。\n if (as === 'wire') {\n return fromBrepCurve(solidToShape(kernel, outerWire), { solid: outerWire })\n }\n\n const face = kernel.makeFace(outerWire)\n\n const holeWires: ReturnType<BrepEngineApi['makeWire']>[] = []\n for (let i = 0; i < loops.length; i++) {\n if (i === outerIdx) continue\n holeWires.push(loopToWire(kernel, loops[i]!.loop))\n }\n if (holeWires.length > 0) {\n const faced = kernel.addHolesInFace(face, holeWires)\n kernel.release(face)\n return fromBrep(solidToShape(kernel, faced), { solid: faced })\n }\n\n kernel.release(outerWire)\n return fromBrep(solidToShape(kernel, face), { solid: face })\n}\n\n/**\n * 从 2D 轮廓构造平面(creator,无输入)。仅 BREP 可用。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sketch\n * @returns Shape 平面几何(mesh 三角化 + BREP 句柄);`as:'wire'` 时返回 1D 曲线(kind:'curve')。\n * @param params.contours - 有序 2D 轮廓(线段/圆弧;外环 + 孔)。type:SketchLoop[] required:true\n * @param params.as - 产物形态:'face'(默认)构面;'wire' 只交外环 wire(1D 曲线)。type:'face'|'wire' required:false\n * @example\n * const f = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }] })\n * const w = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }], as: 'wire' })\n */\nexport const sketch = defineOp({\n capabilities: ['directEdit'],\n brep(params: Record<string, unknown>) {\n assertSketchParams(params)\n return sketchBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib splitByPlane — 平面二分:把 solid 沿无限平面切成两半(手写中立 op,Phase 6.1)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `splitByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
|
|
5
|
+
* 真实现(occt-kernel/occt-primitives.ts / brepkit-kernel/brepkitKernel.ts)⇒
|
|
6
|
+
* 走 `getBrepApi()`(D12),不声明 engines(实现只经 L1 契约面)。
|
|
7
|
+
*
|
|
8
|
+
* 产物形态(设计原则 5):两半不是数组,是具名 `outputs: ['positive','negative']`
|
|
9
|
+
* ——法向正侧 = positive(L1 契约 §3.7 口径,occt 适配器按质心投影分类)。
|
|
10
|
+
* 先例:occt 适配器的 splitByPlane 直接返回 `{positive, negative}`。
|
|
11
|
+
*/
|
|
12
|
+
import type { Shape } from '../mesh/types.js';
|
|
13
|
+
type Vec3 = [number, number, number];
|
|
14
|
+
/** `cad.splitByPlane` 参数。 */
|
|
15
|
+
export interface SplitByPlaneParams {
|
|
16
|
+
/** 平面上一点(mm)。 */
|
|
17
|
+
point: Vec3;
|
|
18
|
+
/** 平面法向(不必单位化;其正侧为 `positive`)。 */
|
|
19
|
+
normal: Vec3;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 沿无限平面把实体切成两半,返回法向正/负两半(具名产物)。
|
|
23
|
+
* @group 特征
|
|
24
|
+
* @inputs 1
|
|
25
|
+
* @async true
|
|
26
|
+
* @qual ok
|
|
27
|
+
* @name splitByPlane
|
|
28
|
+
* @note 中立 op:L1 splitByPlane 两引擎同实现。产物是具名两半
|
|
29
|
+
* `{ positive, negative }`(不是数组);法向正侧 = positive。
|
|
30
|
+
* @returns 具名产物 positive/negative。
|
|
31
|
+
* @param input - 目标实体。type:Shape required:true
|
|
32
|
+
* @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
|
|
33
|
+
* @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
|
|
34
|
+
* @example
|
|
35
|
+
* const { positive, negative } = await cad.splitByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
|
|
36
|
+
*/
|
|
37
|
+
export declare const splitByPlane: ((input: Shape, params: SplitByPlaneParams) => Promise<Record<string, Shape>>) & {
|
|
38
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
39
|
+
};
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=split-by-plane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-by-plane.d.ts","sourceRoot":"","sources":["../../src/api/split-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEpC,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,KAAK,EAAE,IAAI,CAAA;IACX,mCAAmC;IACnC,MAAM,EAAE,IAAI,CAAA;CACb;AAuBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY;;CAOvB,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib splitByPlane — 平面二分:把 solid 沿无限平面切成两半(手写中立 op,Phase 6.1)
|
|
3
|
+
*
|
|
4
|
+
* 中立 op:L1 `splitByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
|
|
5
|
+
* 真实现(occt-kernel/occt-primitives.ts / brepkit-kernel/brepkitKernel.ts)⇒
|
|
6
|
+
* 走 `getBrepApi()`(D12),不声明 engines(实现只经 L1 契约面)。
|
|
7
|
+
*
|
|
8
|
+
* 产物形态(设计原则 5):两半不是数组,是具名 `outputs: ['positive','negative']`
|
|
9
|
+
* ——法向正侧 = positive(L1 契约 §3.7 口径,occt 适配器按质心投影分类)。
|
|
10
|
+
* 先例:occt 适配器的 splitByPlane 直接返回 `{positive, negative}`。
|
|
11
|
+
*/
|
|
12
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
13
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
14
|
+
import { brepOf, fromBrep } from '../shape.js';
|
|
15
|
+
import { defineOp } from '../sdk.js';
|
|
16
|
+
/** 元组 → BrepVec3 对象(GOTCHA:L1 向量形参是 {x,y,z} 对象,元组会被读成零向量)。 */
|
|
17
|
+
function toVec3(v) {
|
|
18
|
+
if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
|
|
19
|
+
throw new Error('E_SPLIT_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers');
|
|
20
|
+
}
|
|
21
|
+
return { x: v[0], y: v[1], z: v[2] };
|
|
22
|
+
}
|
|
23
|
+
/** BREP 路径:L1 splitByPlane → 两半各自收养。 */
|
|
24
|
+
function splitByPlaneBrep(input, params) {
|
|
25
|
+
const { point, normal } = params ?? {};
|
|
26
|
+
const kernel = getBrepApi();
|
|
27
|
+
const solid = brepOf(input);
|
|
28
|
+
if (!solid)
|
|
29
|
+
throw new Error('E_SPLIT_BY_PLANE_NO_BREP: splitByPlane input is not BREP');
|
|
30
|
+
const halves = kernel.splitByPlane(solid, toVec3(point), toVec3(normal));
|
|
31
|
+
return {
|
|
32
|
+
positive: fromBrep(solidToShape(kernel, halves.positive), { solid: halves.positive }),
|
|
33
|
+
negative: fromBrep(solidToShape(kernel, halves.negative), { solid: halves.negative }),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 沿无限平面把实体切成两半,返回法向正/负两半(具名产物)。
|
|
38
|
+
* @group 特征
|
|
39
|
+
* @inputs 1
|
|
40
|
+
* @async true
|
|
41
|
+
* @qual ok
|
|
42
|
+
* @name splitByPlane
|
|
43
|
+
* @note 中立 op:L1 splitByPlane 两引擎同实现。产物是具名两半
|
|
44
|
+
* `{ positive, negative }`(不是数组);法向正侧 = positive。
|
|
45
|
+
* @returns 具名产物 positive/negative。
|
|
46
|
+
* @param input - 目标实体。type:Shape required:true
|
|
47
|
+
* @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
|
|
48
|
+
* @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
|
|
49
|
+
* @example
|
|
50
|
+
* const { positive, negative } = await cad.splitByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
|
|
51
|
+
*/
|
|
52
|
+
export const splitByPlane = defineOp({
|
|
53
|
+
capabilities: ['directEdit'],
|
|
54
|
+
outputs: ['positive', 'negative'],
|
|
55
|
+
brep(input, params) {
|
|
56
|
+
return splitByPlaneBrep(input, params);
|
|
57
|
+
},
|
|
58
|
+
naming: { kind: 'subdivide' },
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=split-by-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-by-plane.js","sourceRoot":"","sources":["../../src/api/split-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAajC,8DAA8D;AAC9D,SAAS,MAAM,CAAC,CAAO;IACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtC,CAAC;AAED,wCAAwC;AACxC,SAAS,gBAAgB,CAAC,KAAY,EAAE,MAA0B;IAChE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAK,EAAyB,CAAA;IAC9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IACvF,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACxE,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrF,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;KACtF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IACjC,IAAI,CAAC,KAAY,EAAE,MAA0B;QAC3C,OAAO,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAgB;CAC5C,CAAC,CAAA","sourcesContent":["/**\n * stdlib splitByPlane — 平面二分:把 solid 沿无限平面切成两半(手写中立 op,Phase 6.1)\n *\n * 中立 op:L1 `splitByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有\n * 真实现(occt-kernel/occt-primitives.ts / brepkit-kernel/brepkitKernel.ts)⇒\n * 走 `getBrepApi()`(D12),不声明 engines(实现只经 L1 契约面)。\n *\n * 产物形态(设计原则 5):两半不是数组,是具名 `outputs: ['positive','negative']`\n * ——法向正侧 = positive(L1 契约 §3.7 口径,occt 适配器按质心投影分类)。\n * 先例:occt 适配器的 splitByPlane 直接返回 `{positive, negative}`。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\ntype Vec3 = [number, number, number]\n\n/** `cad.splitByPlane` 参数。 */\nexport interface SplitByPlaneParams {\n /** 平面上一点(mm)。 */\n point: Vec3\n /** 平面法向(不必单位化;其正侧为 `positive`)。 */\n normal: Vec3\n}\n\n/** 元组 → BrepVec3 对象(GOTCHA:L1 向量形参是 {x,y,z} 对象,元组会被读成零向量)。 */\nfunction toVec3(v: Vec3): BrepVec3 {\n if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {\n throw new Error('E_SPLIT_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers')\n }\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** BREP 路径:L1 splitByPlane → 两半各自收养。 */\nfunction splitByPlaneBrep(input: Shape, params: SplitByPlaneParams): Record<string, Shape> {\n const { point, normal } = params ?? ({} as SplitByPlaneParams)\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_SPLIT_BY_PLANE_NO_BREP: splitByPlane input is not BREP')\n const halves = kernel.splitByPlane(solid, toVec3(point), toVec3(normal))\n return {\n positive: fromBrep(solidToShape(kernel, halves.positive), { solid: halves.positive }),\n negative: fromBrep(solidToShape(kernel, halves.negative), { solid: halves.negative }),\n }\n}\n\n/**\n * 沿无限平面把实体切成两半,返回法向正/负两半(具名产物)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name splitByPlane\n * @note 中立 op:L1 splitByPlane 两引擎同实现。产物是具名两半\n * `{ positive, negative }`(不是数组);法向正侧 = positive。\n * @returns 具名产物 positive/negative。\n * @param input - 目标实体。type:Shape required:true\n * @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true\n * @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true\n * @example\n * const { positive, negative } = await cad.splitByPlane(part0, { point: [0,0,5], normal: [0,0,1] })\n */\nexport const splitByPlane = defineOp({\n capabilities: ['directEdit'],\n outputs: ['positive', 'negative'],\n brep(input: Shape, params: SplitByPlaneParams) {\n return splitByPlaneBrep(input, params)\n },\n naming: { kind: 'subdivide' } as Provenance,\n})\n"]}
|