@faicad/faijs 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +4 -5
- package/NOTICE +5 -6
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +19 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.d.ts.map +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +2 -2
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +2 -2
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/lower.d.ts +1 -1
- package/dist/api/assembly/lower.d.ts.map +1 -1
- package/dist/api/assembly/lower.js.map +1 -1
- package/dist/api/assembly/pose.d.ts +3 -3
- package/dist/api/assembly/pose.d.ts.map +1 -1
- package/dist/api/assembly/pose.js +1 -1
- package/dist/api/assembly/pose.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.d.ts.map +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js +3 -3
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
- package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
- package/dist/api/assembly/solvers/assembly-tree.js +130 -0
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.js +330 -0
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
- package/dist/api/assembly/solvers/global-solver.js +2 -2
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
- package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
- package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
- package/dist/api/assembly/solvers/quat.d.ts +35 -0
- package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
- package/dist/api/assembly/solvers/quat.js +84 -0
- package/dist/api/assembly/solvers/quat.js.map +1 -0
- package/dist/api/assembly/solvers/types.d.ts +33 -0
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +3 -4
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
- package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/booleanFns.js +99 -0
- package/dist/api/brep-mirror/booleanFns.js.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.js +131 -0
- package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
- package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
- package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/compoundFns.js +300 -0
- package/dist/api/brep-mirror/compoundFns.js.map +1 -0
- package/dist/api/brep-mirror/healingFns.d.ts +78 -0
- package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/healingFns.js +294 -0
- package/dist/api/brep-mirror/healingFns.js.map +1 -0
- package/dist/api/brep-mirror/hullFns.d.ts +20 -0
- package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/hullFns.js +46 -0
- package/dist/api/brep-mirror/hullFns.js.map +1 -0
- package/dist/api/brep-mirror/patternFns.d.ts +43 -0
- package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/patternFns.js +178 -0
- package/dist/api/brep-mirror/patternFns.js.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.js +104 -0
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
- package/dist/api/brep-mirror/roofFns.d.ts +24 -0
- package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/roofFns.js +229 -0
- package/dist/api/brep-mirror/roofFns.js.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.js +443 -0
- package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
- package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
- package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/sweepFns.js +200 -0
- package/dist/api/brep-mirror/sweepFns.js.map +1 -0
- package/dist/api/brep-mirror/threadFns.d.ts +15 -0
- package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
- package/dist/api/brep-mirror/threadFns.js +37 -2
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
- package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/topologyFns.js +273 -0
- package/dist/api/brep-mirror/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +190 -0
- package/dist/api/brep-topology.d.ts.map +1 -0
- package/dist/api/brep-topology.js +337 -0
- package/dist/api/brep-topology.js.map +1 -0
- package/dist/api/brepjs-compat/constants.d.ts +11 -0
- package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
- package/dist/api/brepjs-compat/constants.js +11 -0
- package/dist/api/brepjs-compat/constants.js.map +1 -0
- package/dist/api/brepjs-compat/index.d.ts +19 -232
- package/dist/api/brepjs-compat/index.d.ts.map +1 -1
- package/dist/api/brepjs-compat/index.js +19 -286
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
- package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeOps.js +170 -0
- package/dist/api/brepjs-compat/planeOps.js.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.js +8 -0
- package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
- package/dist/api/brepjs-compat/types.d.ts +64 -0
- package/dist/api/brepjs-compat/types.d.ts.map +1 -0
- package/dist/api/brepjs-compat/types.js +48 -0
- package/dist/api/brepjs-compat/types.js.map +1 -0
- package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
- package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/vecOps.js +202 -0
- package/dist/api/brepjs-compat/vecOps.js.map +1 -0
- package/dist/api/chamfer.d.ts +5 -0
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +13 -8
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts.map +1 -1
- package/dist/api/compound-geom.js +8 -2
- package/dist/api/compound-geom.js.map +1 -1
- package/dist/api/draft.d.ts +69 -0
- package/dist/api/draft.d.ts.map +1 -0
- package/dist/api/draft.js +109 -0
- package/dist/api/draft.js.map +1 -0
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +2 -2
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +2 -3
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +28 -13
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +2 -2
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +137 -0
- package/dist/api/feature-repair.d.ts.map +1 -0
- package/dist/api/feature-repair.js +221 -0
- package/dist/api/feature-repair.js.map +1 -0
- package/dist/api/fillet-variable.d.ts +35 -0
- package/dist/api/fillet-variable.d.ts.map +1 -0
- package/dist/api/fillet-variable.js +71 -0
- package/dist/api/fillet-variable.js.map +1 -0
- package/dist/api/fillet.d.ts +3 -0
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +7 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +1 -13
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +6 -1
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/brepjs/index.d.ts +298 -298
- package/dist/api/generated/brepjs/index.d.ts.map +1 -1
- package/dist/api/generated/brepjs/index.js +183 -183
- package/dist/api/generated/brepjs/index.js.map +1 -1
- package/dist/api/generated/core.d.ts +3 -123
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +2 -81
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +1 -15
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +6 -3
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +1 -13
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +6 -1
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +1 -39
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +6 -4
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +53 -97
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +48 -143
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +1 -10
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +2 -10
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +65 -110
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +132 -80
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +1 -8
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +6 -4
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +1 -9
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +6 -1
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +2 -0
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +34 -22
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +52 -27
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +18 -4
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +4 -7
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +10 -8
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +1 -6
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +6 -3
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +77 -175
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +172 -131
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +2 -2
- package/dist/api/geom.js.map +1 -1
- package/dist/api/helix.d.ts +51 -0
- package/dist/api/helix.d.ts.map +1 -0
- package/dist/api/helix.js +63 -0
- package/dist/api/helix.js.map +1 -0
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +6 -2
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +18 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +29 -12
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +10 -0
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +9 -3
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +4 -4
- package/dist/api/internal/compat-projection.js +7 -7
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +75 -42
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +105 -50
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +31 -0
- package/dist/api/internal/profile-wire.d.ts.map +1 -0
- package/dist/api/internal/profile-wire.js +37 -0
- package/dist/api/internal/profile-wire.js.map +1 -0
- package/dist/api/internal/replica-role-table.js +2 -2
- package/dist/api/internal/replica-role-table.js.map +1 -1
- package/dist/api/loft.d.ts +66 -0
- package/dist/api/loft.d.ts.map +1 -0
- package/dist/api/loft.js +111 -0
- package/dist/api/loft.js.map +1 -0
- package/dist/api/measurement/index.d.ts +51 -0
- package/dist/api/measurement/index.d.ts.map +1 -0
- package/dist/api/measurement/index.js +71 -0
- package/dist/api/measurement/index.js.map +1 -0
- package/dist/api/occt-kernel-bridge.d.ts +5 -8
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +18 -14
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +3 -4
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.d.ts.map +1 -1
- package/dist/api/place.js +2 -4
- package/dist/api/place.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +3 -4
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +28 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +29 -19
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +6 -11
- package/dist/api/result.d.ts.map +1 -1
- package/dist/api/result.js +6 -11
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts.map +1 -1
- package/dist/api/revolve.js +15 -14
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +3 -0
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +9 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts +1 -1
- package/dist/api/section-by-plane.d.ts +42 -0
- package/dist/api/section-by-plane.d.ts.map +1 -0
- package/dist/api/section-by-plane.js +61 -0
- package/dist/api/section-by-plane.js.map +1 -0
- package/dist/api/shell.d.ts +45 -0
- package/dist/api/shell.d.ts.map +1 -0
- package/dist/api/shell.js +73 -0
- package/dist/api/shell.js.map +1 -0
- package/dist/api/sketch.d.ts +8 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +12 -7
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split-by-plane.d.ts +41 -0
- package/dist/api/split-by-plane.d.ts.map +1 -0
- package/dist/api/split-by-plane.js +60 -0
- package/dist/api/split-by-plane.js.map +1 -0
- package/dist/api/split.d.ts +6 -1
- package/dist/api/split.d.ts.map +1 -1
- package/dist/api/split.js +23 -9
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +22 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +723 -476
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +55 -0
- package/dist/api/sweep.d.ts.map +1 -0
- package/dist/api/sweep.js +86 -0
- package/dist/api/sweep.js.map +1 -0
- package/dist/api/thicken.d.ts +36 -0
- package/dist/api/thicken.d.ts.map +1 -0
- package/dist/api/thicken.js +55 -0
- package/dist/api/thicken.js.map +1 -0
- package/dist/api/transform.d.ts +8 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +15 -4
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +48 -0
- package/dist/api/view/cameraFns.d.ts.map +1 -0
- package/dist/api/view/cameraFns.js +75 -0
- package/dist/api/view/cameraFns.js.map +1 -0
- package/dist/api/view/projectionPlanes.d.ts +25 -0
- package/dist/api/view/projectionPlanes.d.ts.map +1 -0
- package/dist/api/view/projectionPlanes.js +30 -0
- package/dist/api/view/projectionPlanes.js.map +1 -0
- package/dist/api/view/view-camera.d.ts +2 -2
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +3 -3
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +9 -6
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +132 -65
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/wire.d.ts +45 -0
- package/dist/api/wire.d.ts.map +1 -0
- package/dist/api/wire.js +96 -0
- package/dist/api/wire.js.map +1 -0
- package/dist/boolean/creased-normals.d.ts +50 -0
- package/dist/boolean/creased-normals.d.ts.map +1 -0
- package/dist/boolean/creased-normals.js +114 -0
- package/dist/boolean/creased-normals.js.map +1 -0
- package/dist/boolean/deriveNormals.d.ts +4 -1
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +5 -2
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +6 -0
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +11 -2
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +4 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +4 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +79 -59
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +7 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +15 -7
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +52 -167
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +93 -130
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +9 -7
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +14 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js +11 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts +3 -0
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +7 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +8 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +15 -3
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +20 -2
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +25 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +336 -144
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +5 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +32 -2
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +8 -2
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +3 -0
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +3 -1
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +18 -2
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +29 -1
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +3 -0
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +7 -0
- package/dist/env-agnostic.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +28 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +29 -1
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +6 -3
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +31 -0
- package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
- package/dist/occt-kernel/hullGeometry.js +319 -0
- package/dist/occt-kernel/hullGeometry.js.map +1 -0
- package/dist/occt-kernel/hullOps.d.ts +24 -0
- package/dist/occt-kernel/hullOps.d.ts.map +1 -0
- package/dist/occt-kernel/hullOps.js +52 -0
- package/dist/occt-kernel/hullOps.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts +14 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
- package/dist/occt-kernel/occt-primitives.js +351 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -0
- package/dist/occt-kernel/occtKernel.d.ts +14 -6
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +11 -3
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/topologyExt.js +2 -2
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/primitives/brep-primitives.d.ts +4 -0
- package/dist/primitives/brep-primitives.d.ts.map +1 -1
- package/dist/primitives/brep-primitives.js +4 -0
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +22 -0
- package/dist/result/bug.d.ts.map +1 -0
- package/dist/result/bug.js +28 -0
- package/dist/result/bug.js.map +1 -0
- package/dist/result/errors.d.ts +270 -0
- package/dist/result/errors.d.ts.map +1 -0
- package/dist/result/errors.js +317 -0
- package/dist/result/errors.js.map +1 -0
- package/dist/result/kernelErrorTranslation.d.ts +21 -0
- package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
- package/dist/result/kernelErrorTranslation.js +102 -0
- package/dist/result/kernelErrorTranslation.js.map +1 -0
- package/dist/result/result.d.ts +213 -0
- package/dist/result/result.d.ts.map +1 -0
- package/dist/result/result.js +336 -0
- package/dist/result/result.js.map +1 -0
- package/dist/result/vec3.d.ts +12 -0
- package/dist/result/vec3.d.ts.map +1 -0
- package/dist/result/vec3.js +14 -0
- package/dist/result/vec3.js.map +1 -0
- package/dist/runtime-state.d.ts +9 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +3 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +2 -1
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +43 -1
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +57 -1
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/geom-hint.js +1 -1
- package/dist/topology/naming/geom-hint.js.map +1 -1
- package/dist/topology/naming/score.js +1 -1
- package/dist/topology/naming/score.js.map +1 -1
- package/package.json +6 -16
package/dist/api/pattern.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGjC,OAAO,EAAE,qBAAqB,EAAyB,MAAM,+BAA+B,CAAA;AAE5F,+BAA+B;AAC/B,SAAS,IAAI,CAAC,CAAO;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED,kDAAkD;AAClD,SAAS,iBAAiB,CAAC,KAAY,EAAE,SAAe,EAAE,KAAa,EAAE,OAAe;IACtF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IAC1D,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAEtE,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,sEAAsE;IACtE,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IAEjG,IAAI,WAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAuB,EAAE,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,CAAA;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,KAAK,EAAE,WAAW,CAAC,GAAG;YACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1F,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEtF,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;AACvF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;IACpC,IAAI,CAAC,KAAY,EAAE,SAAe,EAAE,KAAa,EAAE,OAAe;QAChE,uEAAuE;QACvE,IAAI,CAAC,KAAK,CAAC,CAAA;QACX,OAAO,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IACD,oDAAoD;IACpD,gDAAgD;IAChD,YAAY,EAAE,CAAC,eAAe,CAAC;IAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAgB;CAClD,CAAC,CAAA","sourcesContent":["/**\n * stdlib pattern — linearPattern(手写覆盖生成投影,Phase 3: L3 `replica[k]` 角色表)\n *\n * 生成投影是 brep-only compatOp,不带角色表;本文件手写 defineOp,BREP 路径\n * 用质心聚类把结果面按份数 k 分组、回投影到输入面角色,产出 `replica[k]/<inner>`。\n *\n * 机制(无内核历史,纯几何推理):pattern 的每份副本都是输入的精确平移,副本面\n * 几何相同但质心不同。结果面沿 pattern 方向投影得到份数坐标 t,四舍五入到 spacing\n * 倍数即得 k;再按「面内坐标」(centroid − t·dir)匹配输入面对应面,回投其 inner role。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getCurrentStmt, keep } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\n\n/** 归一化向量(零向量 → [0,0,1] 兜底)。 */\nfunction norm(v: Vec3): [number, number, number] {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-9) return [0, 0, 1]\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/** BREP 路径:沿 direction 复制 count 份,质心聚类回投输入面角色。 */\nfunction linearPatternBrep(input: Shape, direction: Vec3, count: number, spacing: number): Shape {\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/pattern] input is not BREP')\n\n // Phase 1.6:origin = 本次语句 StmtId。\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n // 取 count 份副本。Phase 2:BrepEngineApi.linearPattern 契约统一返回 BrepHandle[]\n // (两内核原生都返回 compound,由适配器拆成数组)——不再有「单句柄 fused」形态。\n const dir = norm(direction)\n const raw = kernel.linearPattern(inputSolid, { x: dir[0], y: dir[1], z: dir[2] }, spacing, count)\n\n let resultSolid: BrepHandle\n try {\n resultSolid = kernel.fuseAll(raw)\n } finally {\n for (const c of raw) kernel.release(c)\n }\n\n // 第 k 份副本是输入沿 dir 平移 k*spacing:质心反投回输入坐标系(T_k⁻¹)。\n const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const off = k * spacing\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => ({ x: c.x - off * dir[0], y: c.y - off * dir[1], z: c.z - off * dir[2] }),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n}\n\n/**\n * 线性阵列:沿 direction 复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name linearPattern\n * @note BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。结果面按份数 k 回投影到输入面\n * 角色,产出 `replica[k]/<inner>`(Phase 3 L3 抗重放词汇)。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param direction - 阵列方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param spacing - 副本间距。type:number required:true\n * @example\n * const p = await cad.linearPattern(part0, [1, 0, 0], 3, 20)\n */\nexport const linearPattern = defineOp({\n brep(input: Shape, direction: Vec3, count: number, spacing: number) {\n // copy-like keep semantics: replicate ops preserve their source shape.\n keep(input)\n return linearPatternBrep(input, direction, count, spacing)\n },\n // Phase 1(Brep 引擎可切换重构):能力前置判定——linearPattern 需要内核的\n // 线性阵列方法(BrepMethodKind),brepkit 装配下缺失时执行前静态报错。\n capabilities: ['linearPattern'],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n"]}
|
package/dist/api/place.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"place.d.ts","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"place.d.ts","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAyE1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,KAAK;;CAgBhB,CAAA"}
|
package/dist/api/place.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* 变换不改变拓扑,面 ordinal 不变——roleTable 恒等传播(与 transform.ts 同)。
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
18
18
|
import { fromBrep, brepOf, inputRoleTable, isCompoundLike } from '../shape.js';
|
|
19
19
|
import { solidToShape, applyTransformBrep } from '../brep/brep-ops.js';
|
|
20
20
|
import { applyTransform } from '../mesh/rigid-transform.js';
|
|
@@ -59,9 +59,7 @@ function placeMesh(input, rotation, position, mat3) {
|
|
|
59
59
|
}
|
|
60
60
|
/** brep 路径:刚体变换实体 + 恒等面演化 + 恒等 roleTable 传播 + 三角化 + fromBrep 登记。 */
|
|
61
61
|
function placeBrep(input, rotation, position) {
|
|
62
|
-
const kernel =
|
|
63
|
-
if (!kernel)
|
|
64
|
-
throw new Error('[api/place] no OCCT kernel');
|
|
62
|
+
const kernel = getBrepApi();
|
|
65
63
|
const inputSolid = brepOf(input);
|
|
66
64
|
if (!inputSolid)
|
|
67
65
|
throw new Error('[api/place] input is not BREP');
|
package/dist/api/place.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"place.js","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"place.js","sourceRoot":"","sources":["../../src/api/place.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib place — 平台刚性放置 op(H11 / 方案 §4.3)\n *\n *\n * 一个刚体变换:先绕局部原点按 `rotation`(四元数)旋转,再平移 `position`\n * (= FreeCAD `Placement` 的 T(P)∘R(Q))。不接受 pivot——FCStd 语义就是绕局部原点。\n *\n * 路径:\n * - brep 路径:`applyTransformBrep(kernel, solid, quat, [0,0,0], position)`\n * (复用 api/compound 装配求解已标定的代码,矩阵约定见 §4.3 必做标定)。\n * - mesh 路径:`applyTransform`(与 brep 路径同数学:p' = R·(p−0) + 0 + t)。\n * 四元数→row-major 3×3 用手动 Hamilton 公式(与 THREE / FreeCAD gp_Quaternion\n * 同约定),不引入 three 依赖。\n *\n * 变换不改变拓扑,面 ordinal 不变——roleTable 恒等传播(与 transform.ts 同)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf, inputRoleTable, isCompoundLike } from '../shape'\nimport { solidToShape, applyTransformBrep } from '../brep/brep-ops'\nimport { applyTransform } from '../mesh/rigid-transform'\nimport { identityEvolution, identityHashEvolution } from '../brep/face-evolution'\nimport { propagateAllOrigins } from '../topology/naming/roles'\nimport type { RoleTable } from '../topology/naming/types'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 四元数 (x,y,z,w) → row-major 3×3 旋转矩阵(Hamilton,与 THREE/FreeCAD 同约定)。 */\nfunction quatToMat3(q: [number, number, number, number]): number[] {\n const [x, y, z, w] = q\n const x2 = x * x\n const y2 = y * y\n const z2 = z * z\n return [\n 1 - 2 * (y2 + z2), 2 * (x * y - w * z), 2 * (x * z + w * y),\n 2 * (x * y + w * z), 1 - 2 * (x2 + z2), 2 * (y * z - w * x),\n 2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x2 + y2),\n ]\n}\n\n/** mesh 路径:展平结构 compound 子节点,逐子 mesh 变换后合并。 */\nfunction placeMesh(\n input: Shape,\n rotation: [number, number, number, number],\n position: [number, number, number],\n mat3: number[],\n): Shape {\n const collect = (s: Shape, out: Shape[]): void => {\n if (isCompoundLike(s) && (s as { children?: Shape[] }).children) {\n for (const c of (s as { children: Shape[] }).children) collect(c, out)\n return\n }\n if (s.positions && s.indices) out.push(s)\n }\n const subs: Shape[] = []\n collect(input, subs)\n const positions: number[] = []\n const indices: number[] = []\n for (const sub of subs) {\n const t = applyTransform(sub, rotation, [0, 0, 0], position, mat3)\n const base = positions.length / 3\n positions.push(...t.positions)\n for (let i = 0; i < t.indices.length; i++) indices.push(t.indices[i] + base)\n }\n return { positions: new Float32Array(positions), indices: new Uint32Array(indices) }\n}\n\n/** brep 路径:刚体变换实体 + 恒等面演化 + 恒等 roleTable 传播 + 三角化 + fromBrep 登记。 */\nfunction placeBrep(input: Shape, rotation: [number, number, number, number], position: [number, number, number]): Shape {\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[api/place] input is not BREP')\n\n const resultSolid = applyTransformBrep(kernel, inputSolid, rotation, [0, 0, 0], position)\n\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, resultSolid))\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 刚性放置几何体:旋转(四元数,绕局部原点)后平移。两者皆可缺省 = 恒等。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name place\n * @returns Shape 放置后的几何(持 OCCT 句柄,可继续变换/导出)。\n * @param input - 目标几何。type:Shape required:true\n * @param params.rotation - 旋转四元数 [x,y,z,w](Hamilton,绕局部原点)。type:[number,number,number,number]\n * @param params.position - 平移向量 [x,y,z](mm)。type:[number,number,number]\n * @example\n * const p = cad.place(part0, { rotation: [0, 0, Math.sin(Math.PI/4), Math.cos(Math.PI/4)], position: [10, 0, 0] })\n */\nexport const place = defineOp({\n name: 'place',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[api/place] no input geometry')\n const rotation = (params.rotation as [number, number, number, number]) ?? [0, 0, 0, 1]\n const position = (params.position as [number, number, number]) ?? [0, 0, 0]\n return placeMesh(input, rotation, position, quatToMat3(rotation))\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[api/place] no input geometry')\n const rotation = (params.rotation as [number, number, number, number]) ?? [0, 0, 0, 1]\n const position = (params.position as [number, number, number]) ?? [0, 0, 0]\n return placeBrep(input, rotation, position)\n },\n schema: { position: 'vec3?', rotation: 'quat?' },\n naming: { kind: 'identity' } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAgB1C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS1E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvE;
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAgB1C;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAExE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS1E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvE;AAmBD;;;;;;;;;;;;;;;;;;;;;KAqBK;AACL,eAAO,MAAM,GAAG;;CAuBd,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,MAAM;;CAejB,CAAA;AAWF;;;;;;;;;;;;;;;;;;;;;;IAsBI;AACJ,eAAO,MAAM,QAAQ;;CAenB,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;IAsBI;AACJ,eAAO,MAAM,IAAI;;CAsBf,CAAA;AAEF;;;;;;;;;;;;;;;;IAgBI;AACJ,eAAO,MAAM,KAAK;;CAahB,CAAA"}
|
package/dist/api/primitives.js
CHANGED
|
@@ -8,7 +8,8 @@ import { clampNRad } from '../mesh/types.js';
|
|
|
8
8
|
import { cad } from '../mesh/index.js';
|
|
9
9
|
import { primitiveToBrepSolid } from '../primitives/brep-primitives.js';
|
|
10
10
|
import { solidToShape } from '../brep/brep-ops.js';
|
|
11
|
-
import {
|
|
11
|
+
import { getCurrentStmt } from '../runtime-state.js';
|
|
12
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
12
13
|
import { fromBrep } from '../shape.js';
|
|
13
14
|
import { assignRoles } from '../topology/naming/roles.js';
|
|
14
15
|
import { asPartName } from '../identity.js';
|
|
@@ -83,9 +84,7 @@ export function assertWedgeParams(params) {
|
|
|
83
84
|
}
|
|
84
85
|
/** BREP 路径:OCCT 精确构造 + 三角化 + fromBrep 登记(基本体无面演化;链根建 roleTable)。 */
|
|
85
86
|
function primitiveBrep(op, params) {
|
|
86
|
-
const kernel =
|
|
87
|
-
if (!kernel)
|
|
88
|
-
throw new Error('[stdlib/box] no OCCT kernel');
|
|
87
|
+
const kernel = getBrepApi();
|
|
89
88
|
const type = op === 'box' ? 'cube' : op;
|
|
90
89
|
const result = primitiveToBrepSolid(kernel, type, params);
|
|
91
90
|
// §3.2:链根建表——语义命名器按 op 类型给面命名(semantic 'top'/'lateral' 等,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib primitives — 基本体创建库函数(box/sphere/cylinder/cone/wedge)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { clampNRad } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { primitiveToBrepSolid } from '../primitives/brep-primitives'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { assignRoles } from '../topology/naming/roles'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { asPartName } from '../identity'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber, assertNonNegativeNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate box parameters (brepjs contract, §4.1 A 决策): `width`, `depth` and\n * `height` must be positive numbers. The legacy `{ size }` object form is\n * removed — any call still passing `size` throws an explicit `E_ARGS_FORM`\n * error pointing at the new signature (error hint ≠ compatibility).\n * @param params - the raw box operation parameters.\n */\nexport function assertBoxParams(params: Record<string, unknown>): void {\n if (params.size !== undefined) {\n throw new Error(\n '[faijs/args] box: E_ARGS_FORM: the `box({ size })` object form is removed. ' +\n 'box now uses `box(width, depth, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.width, 'box.width')\n assertPositiveNumber(params.depth, 'box.depth')\n assertPositiveNumber(params.height, 'box.height')\n}\n\n/**\n * Validate sphere parameters: `radius` must be a positive number.\n * @param params - the raw sphere operation parameters.\n */\nexport function assertSphereParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.radius, 'sphere.radius')\n}\n\n/**\n * Validate cylinder parameters (brepjs contract, §4.3 A 决策): `radius` and\n * `height` must be positive. The legacy `{ center }` object key is removed — any\n * call still passing `center` throws an explicit `E_ARGS_FORM` error pointing at\n * the new signature (error hint ≠ compatibility, 裁决 3).\n * @param params - the raw cylinder operation parameters.\n */\nexport function assertCylinderParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cylinder: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cylinder now uses `cylinder(radius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radius, 'cylinder.radius')\n assertPositiveNumber(params.height, 'cylinder.height')\n}\n\n/**\n * Validate cone parameters (brepjs contract, §4.1 P 决策): `radiusBottom` and\n * `height` must be positive, `radiusTop` must be non-negative. The legacy\n * `{ center }` object key is removed — any call still passing `center` throws an\n * explicit `E_ARGS_FORM` error pointing at the new signature (error hint ≠\n * compatibility, 裁决 3).\n * @param params - the raw cone operation parameters.\n */\nexport function assertConeParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cone: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cone now uses `cone(bottomRadius, topRadius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radiusBottom, 'cone.radiusBottom')\n assertNonNegativeNumber(params.radiusTop, 'cone.radiusTop')\n assertPositiveNumber(params.height, 'cone.height')\n}\n\n/**\n * Validate wedge parameters: `width`, `height`, `angle`, and `length` must be\n * positive numbers.\n * @param params - the raw wedge operation parameters.\n */\nexport function assertWedgeParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.width, 'wedge.width')\n assertPositiveNumber(params.height, 'wedge.height')\n assertPositiveNumber(params.angle, 'wedge.angle')\n assertPositiveNumber(params.length, 'wedge.length')\n}\n\n/** BREP 路径:OCCT 精确构造 + 三角化 + fromBrep 登记(基本体无面演化;链根建 roleTable)。 */\nfunction primitiveBrep(op: string, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/box] no OCCT kernel')\n const type = op === 'box' ? 'cube' : op\n const result = primitiveToBrepSolid(kernel, type as 'cube' | 'sphere' | 'cylinder' | 'cone' | 'wedge', params as never)\n // §3.2:链根建表——语义命名器按 op 类型给面命名(semantic 'top'/'lateral' 等,\n // Phase 1.7 已删 'box:' 前缀与位置兜底)。\n // Phase 1.6:origin 用链根语句的 StmtId(当前语句 id,§2.2/§4.1)——变量名会被\n // 改名/复用,StmtId 全局唯一,保证多个同类型 primitive 不撞 origin。\n const origin = String(getCurrentStmt()?.id ?? op)\n const roles = assignRoles(kernel, result.solid, op)\n return fromBrep(\n solidToShape(kernel, result.solid, clampNRad((params.nRad ?? params.segments) as number)),\n { solid: result.solid, roleTable: new Map([[asPartName(origin), roles]]) },\n )\n}\n\n/**\n * 创建长方体(brepjs 契约,§4.1 A 决策)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name box\n * @returns Shape 长方体几何,可作为后续 op 的输入。\n * @param params.width - X 方向边长(mm)。type:number required:true\n * @param params.depth - Y 方向边长(mm)。type:number required:true\n * @param params.height - Z 方向边长(mm)。type:number required:true\n * @param params.at - 中心点(CENTER 语义,优先于 centered)。type:[x,y,z] 可选\n * @param params.centered - 无 at 时是否居中到原点(type:boolean 默认 false,角点在原点)。\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const part0 = cad.box(10, 20, 30)\n * const part1 = cad.box(30, 20, 10, { centered: true, at: [1, 2, 3], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`box(width, depth, height)` 与 `box(10, 20, 30, {centered:true})`\n * 归一到同一对象(D11 位置→对象 + 尾参 options 合并)。旧 `{ size }` 对象形态已废弃(裁决 3),\n * 传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.1)。\n */\nexport const box = defineOp({\n name: 'box',\n mesh: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return cad.box(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return primitiveBrep('box', params)\n },\n // schema feeds codegen/UI parameter panels.\n schema: {\n width: 'number',\n depth: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11 位置→对象(§4.1/§6.2):三个标量装箱成 { width, depth, height },尾参\n // options 经 dual-form-args 的尾参合并(§6.2)并入。\n slotMap: { keys: ['width', 'depth', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'front' }, { kind: 'semantic', name: 'back' }, { kind: 'semantic', name: 'left' }, { kind: 'semantic', name: 'right' }] } } as Provenance,\n})\n\n/**\n * 创建球体。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sphere\n * @returns Shape 球体几何,可作为后续 op 的输入。\n * @param params.radius - 半径(mm)。type:number required:true\n * @param params.segments - 细分度(影响面数)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @param params.center - 球心位置(at 的同义别名)。type:[x,y,z] 默认 [0,0,0](原点)。\n * @param params.at - 球心位置(center 的同义别名,brepjs 契约;裁决 4 双形态合法)。\n * @example\n * const r = cad.sphere({ radius: 10 })\n * const r = cad.sphere(10, { at: [0, 0, 10], segments: 64 })\n * const r = cad.sphere({ radius: 10, segments: 64, center: [0,0,10] })\n */\nexport const sphere = defineOp({\n name: 'sphere',\n mesh: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return cad.sphere(centerParams(params) as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return primitiveBrep('sphere', centerParams(params))\n },\n schema: { radius: 'number', segments: 'number?', center: 'vec3?', at: 'vec3?' },\n // D11: `sphere(10)` == `sphere({ radius: 10 })`; 尾参 options({at, segments})\n // 经 dual-form-args 的尾参合并规则归一(裁决 4,§6.2)。\n slotMap: { keys: ['radius'] },\n naming: { kind: 'unmodeled', reason: 'sphere face vocabulary pending Phase 3' } as Provenance,\n})\n\n/**\n * 位置归一:把 brepjs 契约的 `at`(= faijs 的 `center`,球心语义)归一为一个\n * `center` 输入,mesh/brep 两条消费路径共用(裁决 1/4,§4.2)。\n */\nfunction centerParams(params: Record<string, unknown>): Record<string, unknown> {\n if (params.at !== undefined) return { ...params, center: params.at }\n return params\n}\n\n/**\n * 创建圆柱体(brepjs 契约,§4.3 A 决策)。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cylinder\n * @returns Shape 圆柱体几何,可作为后续 op 的输入。\n * @param params.radius - 底面半径(mm)。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面中心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cylinder(5, 40)\n * const c = cad.cylinder(5, 40, { centered: true, at: [0, 0, 20], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`cylinder(5, 40)` 与 `cylinder(5, 40, {centered:true})`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }` 对象形态已废弃\n * (裁决 3),传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.3)。\n */\nexport const cylinder = defineOp({\n name: 'cylinder',\n mesh: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return cad.cylinder(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return primitiveBrep('cylinder', params)\n },\n schema: { radius: 'number', height: 'number', at: 'vec3?', centered: 'boolean?', segments: 'number?' },\n // D11(§4.1/§6.2):`cylinder(5, 40)` 两个标量装箱成 { radius, height };尾参 options\n // 经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radius', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建圆锥体(brepjs 契约,§4.1 P 决策)。radiusTop 等于 radiusBottom 时即圆柱,0 为尖锥。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cone\n * @returns Shape 圆锥体几何,可作为后续 op 的输入。\n * @param params.radiusBottom - 底半径(mm)。type:number required:true\n * @param params.radiusTop - 顶半径(mm),0 为尖锥,非负,等于 radiusBottom 得圆柱。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面轴心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cone(10, 4, 30)\n * const c = cad.cone(10, 0, 30, { centered: true, at: [0, 0, 20], segments: 64 })\n * 位置原生(§4.1/§6.2):`cone(10, 4, 30)` 与 `cone(10, 4, 30, { centered: true })`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }`/`{ size }` 对象形态\n * 已废弃(裁决 3),传入会抛 E_ARGS_FORM(错误提示 ≠ 兼容)。\n */\nexport const cone = defineOp({\n name: 'cone',\n mesh: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return cad.cone(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return primitiveBrep('cone', params)\n },\n schema: {\n radiusBottom: 'number',\n radiusTop: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11(§4.1/§6.2): `cone(10, 4, 30)` 三个标量装箱成 { radiusBottom, radiusTop, height }。\n // 尾参 options({at, centered, segments})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radiusBottom', 'radiusTop', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建楔形体。唯一契约是 width/height/angle/length(width/height/angle 为正数,length 沿切割方向),\n * 旧文档的 size 形态已废弃,传 { size } 会抛错。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name wedge\n * @note 曾与 UI 面板的 `size` 形态并存并写入文档,但断言层确认唯一合法契约是 width/height/angle/length;传 `{ size }` 直接抛错。已按真源收敛。\n * @returns Shape 楔形体几何,可作为后续 op 的输入。\n * @param params.width - 底面宽度(mm)。type:number required:true\n * @param params.height - 高度(mm)。type:number required:true\n * @param params.angle - 楔形角度(度)。type:number required:true\n * @param params.length - 沿切割方向的长度(mm)。type:number required:true\n * @example\n * const w = cad.wedge({ width: 30, height: 20, angle: 45, length: 10 })\n */\nexport const wedge = defineOp({\n name: 'wedge',\n mesh: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return cad.wedge(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return primitiveBrep('wedge', params)\n },\n // D11: `wedge(30, 20, 45, 10)` == `wedge({ width: 30, height: 20, angle: 45, length: 10 })`.\n slotMap: { keys: ['width', 'height', 'angle', 'length'] },\n naming: { kind: 'unmodeled', reason: 'wedge face vocabulary pending Phase 3' } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/api/primitives.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib primitives — 基本体创建库函数(box/sphere/cylinder/cone/wedge)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { clampNRad } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { primitiveToBrepSolid } from '../primitives/brep-primitives'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getCurrentStmt } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { assignRoles } from '../topology/naming/roles'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { asPartName } from '../identity'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber, assertNonNegativeNumber } from './assert'\n\n// ── per-op 参数自校验(Phase 2.2;stdlib 被直接 import 时的防御层) ──\n\n/**\n * Validate box parameters (brepjs contract, §4.1 A 决策): `width`, `depth` and\n * `height` must be positive numbers. The legacy `{ size }` object form is\n * removed — any call still passing `size` throws an explicit `E_ARGS_FORM`\n * error pointing at the new signature (error hint ≠ compatibility).\n * @param params - the raw box operation parameters.\n */\nexport function assertBoxParams(params: Record<string, unknown>): void {\n if (params.size !== undefined) {\n throw new Error(\n '[faijs/args] box: E_ARGS_FORM: the `box({ size })` object form is removed. ' +\n 'box now uses `box(width, depth, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.width, 'box.width')\n assertPositiveNumber(params.depth, 'box.depth')\n assertPositiveNumber(params.height, 'box.height')\n}\n\n/**\n * Validate sphere parameters: `radius` must be a positive number.\n * @param params - the raw sphere operation parameters.\n */\nexport function assertSphereParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.radius, 'sphere.radius')\n}\n\n/**\n * Validate cylinder parameters (brepjs contract, §4.3 A 决策): `radius` and\n * `height` must be positive. The legacy `{ center }` object key is removed — any\n * call still passing `center` throws an explicit `E_ARGS_FORM` error pointing at\n * the new signature (error hint ≠ compatibility, 裁决 3).\n * @param params - the raw cylinder operation parameters.\n */\nexport function assertCylinderParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cylinder: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cylinder now uses `cylinder(radius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radius, 'cylinder.radius')\n assertPositiveNumber(params.height, 'cylinder.height')\n}\n\n/**\n * Validate cone parameters (brepjs contract, §4.1 P 决策): `radiusBottom` and\n * `height` must be positive, `radiusTop` must be non-negative. The legacy\n * `{ center }` object key is removed — any call still passing `center` throws an\n * explicit `E_ARGS_FORM` error pointing at the new signature (error hint ≠\n * compatibility, 裁决 3).\n * @param params - the raw cone operation parameters.\n */\nexport function assertConeParams(params: Record<string, unknown>): void {\n if (params.center !== undefined || params.size !== undefined) {\n throw new Error(\n '[faijs/args] cone: E_ARGS_FORM: the legacy object form is removed. ' +\n 'cone now uses `cone(bottomRadius, topRadius, height, { at?, centered?, segments? })`.',\n )\n }\n assertPositiveNumber(params.radiusBottom, 'cone.radiusBottom')\n assertNonNegativeNumber(params.radiusTop, 'cone.radiusTop')\n assertPositiveNumber(params.height, 'cone.height')\n}\n\n/**\n * Validate wedge parameters: `width`, `height`, `angle`, and `length` must be\n * positive numbers.\n * @param params - the raw wedge operation parameters.\n */\nexport function assertWedgeParams(params: Record<string, unknown>): void {\n assertPositiveNumber(params.width, 'wedge.width')\n assertPositiveNumber(params.height, 'wedge.height')\n assertPositiveNumber(params.angle, 'wedge.angle')\n assertPositiveNumber(params.length, 'wedge.length')\n}\n\n/** BREP 路径:OCCT 精确构造 + 三角化 + fromBrep 登记(基本体无面演化;链根建 roleTable)。 */\nfunction primitiveBrep(op: string, params: Record<string, unknown>): Shape {\n const kernel = getBrepApi()\n const type = op === 'box' ? 'cube' : op\n const result = primitiveToBrepSolid(kernel, type as 'cube' | 'sphere' | 'cylinder' | 'cone' | 'wedge', params as never)\n // §3.2:链根建表——语义命名器按 op 类型给面命名(semantic 'top'/'lateral' 等,\n // Phase 1.7 已删 'box:' 前缀与位置兜底)。\n // Phase 1.6:origin 用链根语句的 StmtId(当前语句 id,§2.2/§4.1)——变量名会被\n // 改名/复用,StmtId 全局唯一,保证多个同类型 primitive 不撞 origin。\n const origin = String(getCurrentStmt()?.id ?? op)\n const roles = assignRoles(kernel, result.solid, op)\n return fromBrep(\n solidToShape(kernel, result.solid, clampNRad((params.nRad ?? params.segments) as number)),\n { solid: result.solid, roleTable: new Map([[asPartName(origin), roles]]) },\n )\n}\n\n/**\n * 创建长方体(brepjs 契约,§4.1 A 决策)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name box\n * @returns Shape 长方体几何,可作为后续 op 的输入。\n * @param params.width - X 方向边长(mm)。type:number required:true\n * @param params.depth - Y 方向边长(mm)。type:number required:true\n * @param params.height - Z 方向边长(mm)。type:number required:true\n * @param params.at - 中心点(CENTER 语义,优先于 centered)。type:[x,y,z] 可选\n * @param params.centered - 无 at 时是否居中到原点(type:boolean 默认 false,角点在原点)。\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const part0 = cad.box(10, 20, 30)\n * const part1 = cad.box(30, 20, 10, { centered: true, at: [1, 2, 3], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`box(width, depth, height)` 与 `box(10, 20, 30, {centered:true})`\n * 归一到同一对象(D11 位置→对象 + 尾参 options 合并)。旧 `{ size }` 对象形态已废弃(裁决 3),\n * 传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.1)。\n */\nexport const box = defineOp({\n name: 'box',\n mesh: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return cad.box(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertBoxParams(params)\n return primitiveBrep('box', params)\n },\n // schema feeds codegen/UI parameter panels.\n schema: {\n width: 'number',\n depth: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11 位置→对象(§4.1/§6.2):三个标量装箱成 { width, depth, height },尾参\n // options 经 dual-form-args 的尾参合并(§6.2)并入。\n slotMap: { keys: ['width', 'depth', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'front' }, { kind: 'semantic', name: 'back' }, { kind: 'semantic', name: 'left' }, { kind: 'semantic', name: 'right' }] } } as Provenance,\n})\n\n/**\n * 创建球体。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name sphere\n * @returns Shape 球体几何,可作为后续 op 的输入。\n * @param params.radius - 半径(mm)。type:number required:true\n * @param params.segments - 细分度(影响面数)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @param params.center - 球心位置(at 的同义别名)。type:[x,y,z] 默认 [0,0,0](原点)。\n * @param params.at - 球心位置(center 的同义别名,brepjs 契约;裁决 4 双形态合法)。\n * @example\n * const r = cad.sphere({ radius: 10 })\n * const r = cad.sphere(10, { at: [0, 0, 10], segments: 64 })\n * const r = cad.sphere({ radius: 10, segments: 64, center: [0,0,10] })\n */\nexport const sphere = defineOp({\n name: 'sphere',\n mesh: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return cad.sphere(centerParams(params) as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertSphereParams(params)\n return primitiveBrep('sphere', centerParams(params))\n },\n schema: { radius: 'number', segments: 'number?', center: 'vec3?', at: 'vec3?' },\n // D11: `sphere(10)` == `sphere({ radius: 10 })`; 尾参 options({at, segments})\n // 经 dual-form-args 的尾参合并规则归一(裁决 4,§6.2)。\n slotMap: { keys: ['radius'] },\n naming: { kind: 'unmodeled', reason: 'sphere face vocabulary pending Phase 3' } as Provenance,\n})\n\n/**\n * 位置归一:把 brepjs 契约的 `at`(= faijs 的 `center`,球心语义)归一为一个\n * `center` 输入,mesh/brep 两条消费路径共用(裁决 1/4,§4.2)。\n */\nfunction centerParams(params: Record<string, unknown>): Record<string, unknown> {\n if (params.at !== undefined) return { ...params, center: params.at }\n return params\n}\n\n/**\n * 创建圆柱体(brepjs 契约,§4.3 A 决策)。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cylinder\n * @returns Shape 圆柱体几何,可作为后续 op 的输入。\n * @param params.radius - 底面半径(mm)。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面中心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cylinder(5, 40)\n * const c = cad.cylinder(5, 40, { centered: true, at: [0, 0, 20], segments: 64 })\n *\n * 位置原生(§4.1/§6.2):`cylinder(5, 40)` 与 `cylinder(5, 40, {centered:true})`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }` 对象形态已废弃\n * (裁决 3),传入会抛 `E_ARGS_FORM`(错误提示 ≠ 兼容,§4.3)。\n */\nexport const cylinder = defineOp({\n name: 'cylinder',\n mesh: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return cad.cylinder(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertCylinderParams(params)\n return primitiveBrep('cylinder', params)\n },\n schema: { radius: 'number', height: 'number', at: 'vec3?', centered: 'boolean?', segments: 'number?' },\n // D11(§4.1/§6.2):`cylinder(5, 40)` 两个标量装箱成 { radius, height };尾参 options\n // 经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radius', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建圆锥体(brepjs 契约,§4.1 P 决策)。radiusTop 等于 radiusBottom 时即圆柱,0 为尖锥。\n * 锚点:`at` 是**底面轴心**(BASE 语义,默认 [0,0,0],底面在原点、+Z 延伸);`centered:true`\n * 指底面落到 −h/2(无 at 时居中到原点;与 `at` 同给时以 `at` 为中心)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name cone\n * @returns Shape 圆锥体几何,可作为后续 op 的输入。\n * @param params.radiusBottom - 底半径(mm)。type:number required:true\n * @param params.radiusTop - 顶半径(mm),0 为尖锥,非负,等于 radiusBottom 得圆柱。type:number required:true\n * @param params.height - 高度(mm),沿 +Z 轴。type:number required:true\n * @param params.at - 底面轴心(BASE 语义)。type:[x,y,z] 可选\n * @param params.centered - 是否居中(底面 −h/2;与 at 同给时以 at 为中心)。type:boolean 默认 false\n * @param params.segments - 细分度(影响三角化)。type:number 默认 64(= brepjs standard 等效,P0 §5.0/§5.1)\n * @example\n * const c = cad.cone(10, 4, 30)\n * const c = cad.cone(10, 0, 30, { centered: true, at: [0, 0, 20], segments: 64 })\n * 位置原生(§4.1/§6.2):`cone(10, 4, 30)` 与 `cone(10, 4, 30, { centered: true })`\n * 归一到同一对象(D11 位置→装箱 + 尾参 options 合并)。旧 `{ center }`/`{ size }` 对象形态\n * 已废弃(裁决 3),传入会抛 E_ARGS_FORM(错误提示 ≠ 兼容)。\n */\nexport const cone = defineOp({\n name: 'cone',\n mesh: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return cad.cone(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertConeParams(params)\n return primitiveBrep('cone', params)\n },\n schema: {\n radiusBottom: 'number',\n radiusTop: 'number',\n height: 'number',\n at: 'vec3?',\n centered: 'boolean?',\n segments: 'number?',\n },\n // D11(§4.1/§6.2): `cone(10, 4, 30)` 三个标量装箱成 { radiusBottom, radiusTop, height }。\n // 尾参 options({at, centered, segments})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['radiusBottom', 'radiusTop', 'height'] },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'semantic', name: 'lateral' }] } } as Provenance,\n})\n\n/**\n * 创建楔形体。唯一契约是 width/height/angle/length(width/height/angle 为正数,length 沿切割方向),\n * 旧文档的 size 形态已废弃,传 { size } 会抛错。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name wedge\n * @note 曾与 UI 面板的 `size` 形态并存并写入文档,但断言层确认唯一合法契约是 width/height/angle/length;传 `{ size }` 直接抛错。已按真源收敛。\n * @returns Shape 楔形体几何,可作为后续 op 的输入。\n * @param params.width - 底面宽度(mm)。type:number required:true\n * @param params.height - 高度(mm)。type:number required:true\n * @param params.angle - 楔形角度(度)。type:number required:true\n * @param params.length - 沿切割方向的长度(mm)。type:number required:true\n * @example\n * const w = cad.wedge({ width: 30, height: 20, angle: 45, length: 10 })\n */\nexport const wedge = defineOp({\n name: 'wedge',\n mesh: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return cad.wedge(params as never)\n },\n brep: (params: Record<string, unknown>) => {\n assertWedgeParams(params)\n return primitiveBrep('wedge', params)\n },\n // D11: `wedge(30, 20, 45, 10)` == `wedge({ width: 30, height: 20, angle: 45, length: 10 })`.\n slotMap: { keys: ['width', 'height', 'angle', 'length'] },\n naming: { kind: 'unmodeled', reason: 'wedge face vocabulary pending Phase 3' } as Provenance,\n})\n"]}
|
package/dist/api/replicate.d.ts
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
* replicate — handwritten overrides for the copy-family ops (keep semantics +
|
|
3
3
|
* replica[k] role tables).
|
|
4
4
|
*
|
|
5
|
+
* @platform occt — 本文件 import occt-kernel(mirrorJoin 走 `mirrorWithHistory`
|
|
6
|
+
* 平台面,D3)。文件级标注满足守卫①(平台 import 自证身份);文件内的**中立 op**
|
|
7
|
+
* (circularPattern/gridPattern/rectangularPattern/clone 只用 L1 核心面)不声明
|
|
8
|
+
* engines,运行时不拦截——标注只约束平台 import,不改变函数级中立性
|
|
9
|
+
* (与 face-evolution.ts 同口径)。
|
|
10
|
+
*
|
|
5
11
|
* All 9 copy-like ops must NOT consume their input (same as `copy`): each brep
|
|
6
12
|
* body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),
|
|
7
13
|
* so the source stays a live terminal in both runtime and UI.
|
|
@@ -17,9 +23,30 @@
|
|
|
17
23
|
*
|
|
18
24
|
* The generated files stay untouched; overrides win via api-namespace spread
|
|
19
25
|
* (same precedent as cut / split / linearPattern).
|
|
26
|
+
*
|
|
27
|
+
* 平台分层(narrowing plan Phase 5,D11):
|
|
28
|
+
* - mirrorJoin / mirror:平台 op(依赖 occt-only `mirrorWithHistory`)→
|
|
29
|
+
* `engines: ['occt']`,不声明 capabilities(能力由平台身份本身界定)。
|
|
30
|
+
* - circularPattern / gridPattern / rectangularPattern / clone:中立 op(实现
|
|
31
|
+
* 只用 L1 核心面)→ capabilities 收窄到真实 L1 名(删除 isNull/iterShapes/
|
|
32
|
+
* section/translateWithHistory 等 occt-only 虚名,capability-map 实证实现不依赖)。
|
|
20
33
|
*/
|
|
21
34
|
import type { Shape, Vec3 } from '../mesh/types.js';
|
|
22
|
-
|
|
35
|
+
/** 镜像面参数(与 vendored MirrorOptions 同形;G5 去 brepjs 依赖后本地自持)。 */
|
|
36
|
+
interface MirrorOptions {
|
|
37
|
+
/** 镜像面法向。默认 [0,0,1]。 */
|
|
38
|
+
normal?: readonly [number, number, number] | {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
z: number;
|
|
42
|
+
};
|
|
43
|
+
/** 镜像面过点。默认 [0,0,0]。 */
|
|
44
|
+
at?: readonly [number, number, number] | {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
z: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
23
50
|
/**
|
|
24
51
|
* 环形阵列:绕 axis 均分 fullAngle(度,缺省 360)复制 count 份(含原位置)。
|
|
25
52
|
* @group 特征
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicate.d.ts","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"replicate.d.ts","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAmBhD,8DAA8D;AAC9D,UAAU,aAAa;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChF,wBAAwB;IACxB,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7E;AAgDD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,eAAe;;CAuC1B,CAAA;AAIF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW;;CAuDtB,CAAA;AAIF,UAAU,yBAAyB;IACjC,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB;;CAqD7B,CAAA;AAIF,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,EAAE,CAAC,EAAE,IAAI,CAAA;CACV;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU;;CAiCrB,CAAA;AAIF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;CASjB,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,KAAK;;CAOhB,CAAA"}
|
package/dist/api/replicate.js
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
* replicate — handwritten overrides for the copy-family ops (keep semantics +
|
|
3
3
|
* replica[k] role tables).
|
|
4
4
|
*
|
|
5
|
+
* @platform occt — 本文件 import occt-kernel(mirrorJoin 走 `mirrorWithHistory`
|
|
6
|
+
* 平台面,D3)。文件级标注满足守卫①(平台 import 自证身份);文件内的**中立 op**
|
|
7
|
+
* (circularPattern/gridPattern/rectangularPattern/clone 只用 L1 核心面)不声明
|
|
8
|
+
* engines,运行时不拦截——标注只约束平台 import,不改变函数级中立性
|
|
9
|
+
* (与 face-evolution.ts 同口径)。
|
|
10
|
+
*
|
|
5
11
|
* All 9 copy-like ops must NOT consume their input (same as `copy`): each brep
|
|
6
12
|
* body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),
|
|
7
13
|
* so the source stays a live terminal in both runtime and UI.
|
|
@@ -17,12 +23,21 @@
|
|
|
17
23
|
*
|
|
18
24
|
* The generated files stay untouched; overrides win via api-namespace spread
|
|
19
25
|
* (same precedent as cut / split / linearPattern).
|
|
26
|
+
*
|
|
27
|
+
* 平台分层(narrowing plan Phase 5,D11):
|
|
28
|
+
* - mirrorJoin / mirror:平台 op(依赖 occt-only `mirrorWithHistory`)→
|
|
29
|
+
* `engines: ['occt']`,不声明 capabilities(能力由平台身份本身界定)。
|
|
30
|
+
* - circularPattern / gridPattern / rectangularPattern / clone:中立 op(实现
|
|
31
|
+
* 只用 L1 核心面)→ capabilities 收窄到真实 L1 名(删除 isNull/iterShapes/
|
|
32
|
+
* section/translateWithHistory 等 occt-only 虚名,capability-map 实证实现不依赖)。
|
|
20
33
|
*/
|
|
21
34
|
import { solidToShape } from '../brep/brep-ops.js';
|
|
22
35
|
import { getFaceHashes, HASH_UPPER_BOUND } from '../brep/face-evolution.js';
|
|
23
|
-
import {
|
|
36
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
37
|
+
import { getCurrentStmt, keep } from '../runtime-state.js';
|
|
24
38
|
import { fromBrep, brepOf } from '../shape.js';
|
|
25
39
|
import { defineOp } from '../sdk.js';
|
|
40
|
+
import { getOcctKernel } from '../occt-kernel/occtKernel.js';
|
|
26
41
|
import { buildReplicaRoleTable } from './internal/replica-role-table.js';
|
|
27
42
|
// Generated compatOps (delegation targets for the thin single-copy overrides).
|
|
28
43
|
// NOTE: transformCopy is NOT a script-face op (arg-spec skip: ComposedTransform
|
|
@@ -38,11 +53,9 @@ function norm(v) {
|
|
|
38
53
|
function toBrepVec(v) {
|
|
39
54
|
return { x: v[0], y: v[1], z: v[2] };
|
|
40
55
|
}
|
|
41
|
-
/** Shared prelude: kernel
|
|
56
|
+
/** Shared prelude: L1 kernel(getBrepApi,D12)+ BREP input handle + output statement id. */
|
|
42
57
|
function prelude(input, tag) {
|
|
43
|
-
const kernel =
|
|
44
|
-
if (!kernel)
|
|
45
|
-
throw new Error(`[stdlib/${tag}] no OCCT kernel`);
|
|
58
|
+
const kernel = getBrepApi();
|
|
46
59
|
const solid = brepOf(input);
|
|
47
60
|
if (!solid)
|
|
48
61
|
throw new Error(`[stdlib/${tag}] input is not BREP`);
|
|
@@ -115,15 +128,13 @@ export const circularPattern = defineOp({
|
|
|
115
128
|
const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt);
|
|
116
129
|
return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable });
|
|
117
130
|
},
|
|
118
|
-
//
|
|
131
|
+
// 中立 op(D11):capabilities 收窄到实现真实调用的 L1 名(删除 isNull/iterShapes/
|
|
132
|
+
// section 等 occt-only 虚名——实现只调 kernel.circularPattern/fuseAll)。
|
|
119
133
|
capabilities: [
|
|
120
134
|
'circularPattern',
|
|
121
135
|
'dispose',
|
|
122
136
|
'fuseAll',
|
|
123
137
|
'hashCode',
|
|
124
|
-
'isNull',
|
|
125
|
-
'iterShapes',
|
|
126
|
-
'section',
|
|
127
138
|
'surfaceCenterOfMass',
|
|
128
139
|
'surfaceNormal',
|
|
129
140
|
'surfaceType',
|
|
@@ -182,10 +193,7 @@ export const gridPattern = defineOp({
|
|
|
182
193
|
'fuseAll',
|
|
183
194
|
'gridPattern',
|
|
184
195
|
'hashCode',
|
|
185
|
-
'isNull',
|
|
186
|
-
'iterShapes',
|
|
187
196
|
'linearPattern',
|
|
188
|
-
'section',
|
|
189
197
|
'surfaceCenterOfMass',
|
|
190
198
|
'surfaceNormal',
|
|
191
199
|
'surfaceType',
|
|
@@ -255,13 +263,9 @@ export const rectangularPattern = defineOp({
|
|
|
255
263
|
'fuseAll',
|
|
256
264
|
'fuseWithHistory',
|
|
257
265
|
'hashCode',
|
|
258
|
-
'isNull',
|
|
259
|
-
'iterShapes',
|
|
260
|
-
'section',
|
|
261
266
|
'surfaceCenterOfMass',
|
|
262
267
|
'surfaceNormal',
|
|
263
268
|
'surfaceType',
|
|
264
|
-
'translateWithHistory',
|
|
265
269
|
'uvBounds',
|
|
266
270
|
],
|
|
267
271
|
naming: { kind: 'replicate', k: 0 },
|
|
@@ -287,7 +291,9 @@ export const mirrorJoin = defineOp({
|
|
|
287
291
|
const n = norm(options?.normal ?? [1, 0, 0]);
|
|
288
292
|
const o = toBrepVec(options?.at ?? [0, 0, 0]);
|
|
289
293
|
const inputHashes = getFaceHashes(kernel, solid);
|
|
290
|
-
|
|
294
|
+
// 平台面(D3):mirrorWithHistory 是 occt-only。BrepHandle ↔ ShapeHandle 运行时
|
|
295
|
+
// 同构,品牌转换只发生在平台边界。
|
|
296
|
+
const mirrored = getOcctKernel().mirrorWithHistory(solid, o, toBrepVec(n), inputHashes, HASH_UPPER_BOUND);
|
|
291
297
|
try {
|
|
292
298
|
const resultSolid = kernel.fuse(solid, mirrored.result);
|
|
293
299
|
const replicas = [
|
|
@@ -301,7 +307,9 @@ export const mirrorJoin = defineOp({
|
|
|
301
307
|
kernel.release(mirrored.result);
|
|
302
308
|
}
|
|
303
309
|
},
|
|
304
|
-
|
|
310
|
+
// 平台 op(D11):实现依赖 occt-only `mirrorWithHistory`(D3 原生面)——
|
|
311
|
+
// 声明 engines;不声明 capabilities(能力由平台身份本身界定)。
|
|
312
|
+
engines: ['occt'],
|
|
305
313
|
naming: { kind: 'replicate', k: 2 },
|
|
306
314
|
});
|
|
307
315
|
// ── single-copy thin overrides(keep + 委托生成 op)─────────────────────────
|
|
@@ -324,7 +332,9 @@ export const mirror = defineOp({
|
|
|
324
332
|
keep(input);
|
|
325
333
|
return (await generatedMirror(input, options));
|
|
326
334
|
},
|
|
327
|
-
|
|
335
|
+
// 平台 op(D11):委托 generatedMirror(vendored 实现调 occt-only
|
|
336
|
+
// `mirrorWithHistory`,capability-map 实证)——声明 engines,不声明 capabilities。
|
|
337
|
+
engines: ['occt'],
|
|
328
338
|
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
329
339
|
});
|
|
330
340
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replicate.js","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * replicate — handwritten overrides for the copy-family ops (keep semantics +\n * replica[k] role tables).\n *\n * All 9 copy-like ops must NOT consume their input (same as `copy`): each brep\n * body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),\n * so the source stays a live terminal in both runtime and UI.\n *\n * Two groups:\n * - Multi-replica patterns (circularPattern / gridPattern / rectangularPattern /\n * mirrorJoin): promoted from generated compatOps to handwritten defineOps that\n * also build `replica[*]/<inner>` role tables (same treatment as linearPattern,\n * via the shared buildReplicaRoleTable helper).\n * - Single-copy ops (mirror / clone / transformCopy): thin overrides that keep\n * the input and delegate to the generated compatOp (borrow/adopt/capabilities/\n * naming preserved).\n *\n * The generated files stay untouched; overrides win via api-namespace spread\n * (same precedent as cut / split / linearPattern).\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getFaceHashes, HASH_UPPER_BOUND } from '../brep/face-evolution'\nimport { getBackends, getCurrentStmt, keep } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\n// Generated compatOps (delegation targets for the thin single-copy overrides).\n// NOTE: transformCopy is NOT a script-face op (arg-spec skip: ComposedTransform\n// is not constructible in .fai.js); it stays a TS-library-only re-export.\nimport {\n mirror as generatedMirror,\n clone as generatedClone,\n} from './generated/topology'\nimport type { MirrorOptions } from '../vendored/brepjs/topology/api'\n\n/** Normalize a vector (zero vector → [0,0,1] fallback, same as pattern.ts). */\nfunction norm(v: Vec3): Vec3 {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-9) return [0, 0, 1]\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\nfunction toBrepVec(v: Vec3): BrepVec3 {\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** Shared prelude: kernel + BREP input handle + output statement id. */\nfunction prelude(input: Shape, tag: string): { kernel: BrepEngineApi; solid: BrepHandle; outStmt: string } {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error(`[stdlib/${tag}] no OCCT kernel`)\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error(`[stdlib/${tag}] input is not BREP`)\n return { kernel, solid, outStmt: String(getCurrentStmt()?.id ?? '') }\n}\n\n/** Rotate point p around the axis line (point `center`, unit direction `u`) by theta radians. */\nfunction rotateAroundAxis(p: BrepVec3, center: BrepVec3, u: Vec3, theta: number): BrepVec3 {\n const vx = p.x - center.x\n const vy = p.y - center.y\n const vz = p.z - center.z\n const cos = Math.cos(theta)\n const sin = Math.sin(theta)\n const dot = vx * u[0] + vy * u[1] + vz * u[2]\n // u × v\n const cx = u[1] * vz - u[2] * vy\n const cy = u[2] * vx - u[0] * vz\n const cz = u[0] * vy - u[1] * vx\n return {\n x: center.x + vx * cos + cx * sin + u[0] * dot * (1 - cos),\n y: center.y + vy * cos + cy * sin + u[1] * dot * (1 - cos),\n z: center.z + vz * cos + cz * sin + u[2] * dot * (1 - cos),\n }\n}\n\n/** Reflect point p across the plane (point `o`, unit normal `n`). Self-inverse. */\nfunction reflectAcrossPlane(p: BrepVec3, o: BrepVec3, n: Vec3): BrepVec3 {\n const d = (p.x - o.x) * n[0] + (p.y - o.y) * n[1] + (p.z - o.z) * n[2]\n return { x: p.x - 2 * d * n[0], y: p.y - 2 * d * n[1], z: p.z - 2 * d * n[2] }\n}\n\n// ── circularPattern ─────────────────────────────────────────────────────────\n\n/**\n * 环形阵列:绕 axis 均分 fullAngle(度,缺省 360)复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name circularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[k]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param axis - 旋转轴方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param fullAngle - 总角度(度,缺省 360)。type:number required:false\n * @param center - 旋转轴上一点(缺省原点)。type:[x,y,z] required:false\n * @example\n * const p = await cad.circularPattern(part0, [0, 0, 1], 6)\n */\nexport const circularPattern = defineOp({\n brep(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n const raw = kernel.circularPattern(solid, toBrepVec(center), toBrepVec(u), step, count)\n\n let resultSolid: BrepHandle\n try {\n resultSolid = kernel.fuseAll(raw)\n } finally {\n for (const c of raw) kernel.release(c)\n }\n\n const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const theta = (-k * step * Math.PI) / 180\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => rotateAroundAxis(c, toBrepVec(center), u, theta),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // Capabilities copied verbatim from the generated compatOp this overrides.\n capabilities: [\n 'circularPattern',\n 'dispose',\n 'fuseAll',\n 'hashCode',\n 'isNull',\n 'iterShapes',\n 'section',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── gridPattern ─────────────────────────────────────────────────────────────\n\n/**\n * 二维栅格阵列:沿 directionX × directionY 复制 countX×countY 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name gridPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 全部副本的 compound。\n * @param input - 目标几何。type:Shape required:true\n * @param directionX - 第一方向。type:[x,y,z] required:true\n * @param directionY - 第二方向。type:[x,y,z] required:true\n * @param countX - X 向副本数。type:number required:true\n * @param countY - Y 向副本数。type:number required:true\n * @param spacingX - X 向间距。type:number required:true\n * @param spacingY - Y 向间距。type:number required:true\n * @example\n * const p = await cad.gridPattern(part0, [1, 0, 0], [0, 1, 0], 3, 2, 20, 20)\n */\nexport const gridPattern = defineOp({\n brep(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // kernel.gridPattern 返回 compound 单句柄(含全部副本),无需 fuse。\n const resultSolid = kernel.gridPattern(\n solid,\n toBrepVec(dx),\n toBrepVec(dy),\n spacingX,\n spacingY,\n countX,\n countY,\n )\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n capabilities: [\n 'dispose',\n 'fuseAll',\n 'gridPattern',\n 'hashCode',\n 'isNull',\n 'iterShapes',\n 'linearPattern',\n 'section',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── rectangularPattern ──────────────────────────────────────────────────────\n\ninterface RectangularPatternOptions {\n xDir: Vec3\n xCount: number\n xSpacing: number\n yDir: Vec3\n yCount: number\n ySpacing: number\n}\n\n/**\n * 矩形阵列:按 options(xDir/xCount/xSpacing/yDir/yCount/ySpacing)复制并 fuse。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name rectangularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - 阵列参数。type:RectangularPatternOptions required:true\n * @example\n * const p = await cad.rectangularPattern(part0, { xDir: [1,0,0], xCount: 3, xSpacing: 20, yDir: [0,1,0], yCount: 2, ySpacing: 15 })\n */\nexport const rectangularPattern = defineOp({\n brep(input: Shape, options: RectangularPatternOptions) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // vendored rectangularPattern 是纯 JS 组合(translate + fuseAll),内核不声明\n // 该方法——与 vendored 同口径:逐份 translate 再 fuseAll。\n const copies: BrepHandle[] = []\n try {\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(kernel.translate(solid, ox * dx[0] + oy * dy[0], ox * dx[1] + oy * dy[1], ox * dx[2] + oy * dy[2]))\n }\n }\n const resultSolid = kernel.fuseAll(copies)\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n for (const c of copies) kernel.release(c)\n }\n },\n capabilities: [\n 'dispose',\n 'fuse',\n 'fuseAll',\n 'fuseWithHistory',\n 'hashCode',\n 'isNull',\n 'iterShapes',\n 'section',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'translateWithHistory',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── mirrorJoin ──────────────────────────────────────────────────────────────\n\ninterface MirrorJoinOptions {\n normal?: Vec3\n at?: Vec3\n}\n\n/**\n * 镜像并融合:原物(replica[0])+ 沿平面镜像(replica[1])fuse 成一体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirrorJoin\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[0|1]/<inner>`。\n * @returns Shape fuse 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面法向与面上一点。type:MirrorJoinOptions required:false\n * @example\n * const p = await cad.mirrorJoin(part0, { normal: [1, 0, 0] })\n */\nexport const mirrorJoin = defineOp({\n brep(input: Shape, options?: MirrorJoinOptions) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'mirrorJoin')\n const n = norm(options?.normal ?? [1, 0, 0])\n const o = toBrepVec(options?.at ?? [0, 0, 0])\n const inputHashes = getFaceHashes(kernel, solid)\n const mirrored = kernel.mirrorWithHistory(solid, o, toBrepVec(n), inputHashes, HASH_UPPER_BOUND)\n try {\n const resultSolid = kernel.fuse(solid, mirrored.result)\n\n const replicas: ReplicaTransform[] = [\n { label: 'replica[0]', inverse: (c) => ({ x: c.x, y: c.y, z: c.z }) },\n { label: 'replica[1]', inverse: (c) => reflectAcrossPlane(c, o, n) },\n ]\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n kernel.release(mirrored.result)\n }\n },\n capabilities: ['dispose', 'fuse', 'fuseWithHistory', 'isNull', 'mirrorWithHistory'],\n naming: { kind: 'replicate', k: 2 } as Provenance,\n})\n\n// ── single-copy thin overrides(keep + 委托生成 op)─────────────────────────\n\n/**\n * 镜像:返回镜像后的新 Shape(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirror\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 镜像后的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面。type:MirrorOptions required:false\n * @example\n * const p = await cad.mirror(part0, { normal: [1, 0, 0] })\n */\nexport const mirror = defineOp({\n async brep(input: Shape, options?: MirrorOptions) {\n keep(input)\n return (await generatedMirror(input, options)) as Shape\n },\n capabilities: ['dispose', 'mirrorWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 深拷贝句柄:返回独立副本(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name clone\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 克隆的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const p = await cad.clone(part0)\n */\nexport const clone = defineOp({\n async brep(input: Shape) {\n keep(input)\n return (await generatedClone(input)) as Shape\n },\n capabilities: ['copyShape', 'dispose'],\n naming: { kind: 'identity' } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"replicate.js","sourceRoot":"","sources":["../../src/api/replicate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * replicate — handwritten overrides for the copy-family ops (keep semantics +\n * replica[k] role tables).\n *\n * @platform occt — 本文件 import occt-kernel(mirrorJoin 走 `mirrorWithHistory`\n * 平台面,D3)。文件级标注满足守卫①(平台 import 自证身份);文件内的**中立 op**\n * (circularPattern/gridPattern/rectangularPattern/clone 只用 L1 核心面)不声明\n * engines,运行时不拦截——标注只约束平台 import,不改变函数级中立性\n * (与 face-evolution.ts 同口径)。\n *\n * All 9 copy-like ops must NOT consume their input (same as `copy`): each brep\n * body declares `keep(input)` (function-body keep → KeepRegistry → live-shapes),\n * so the source stays a live terminal in both runtime and UI.\n *\n * Two groups:\n * - Multi-replica patterns (circularPattern / gridPattern / rectangularPattern /\n * mirrorJoin): promoted from generated compatOps to handwritten defineOps that\n * also build `replica[*]/<inner>` role tables (same treatment as linearPattern,\n * via the shared buildReplicaRoleTable helper).\n * - Single-copy ops (mirror / clone / transformCopy): thin overrides that keep\n * the input and delegate to the generated compatOp (borrow/adopt/capabilities/\n * naming preserved).\n *\n * The generated files stay untouched; overrides win via api-namespace spread\n * (same precedent as cut / split / linearPattern).\n *\n * 平台分层(narrowing plan Phase 5,D11):\n * - mirrorJoin / mirror:平台 op(依赖 occt-only `mirrorWithHistory`)→\n * `engines: ['occt']`,不声明 capabilities(能力由平台身份本身界定)。\n * - circularPattern / gridPattern / rectangularPattern / clone:中立 op(实现\n * 只用 L1 核心面)→ capabilities 收窄到真实 L1 名(删除 isNull/iterShapes/\n * section/translateWithHistory 等 occt-only 虚名,capability-map 实证实现不依赖)。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getFaceHashes, HASH_UPPER_BOUND } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt, keep } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../occt-kernel/occtKernel'\nimport { buildReplicaRoleTable, type ReplicaTransform } from './internal/replica-role-table'\n// Generated compatOps (delegation targets for the thin single-copy overrides).\n// NOTE: transformCopy is NOT a script-face op (arg-spec skip: ComposedTransform\n// is not constructible in .fai.js); it stays a TS-library-only re-export.\nimport {\n mirror as generatedMirror,\n clone as generatedClone,\n} from './generated/topology'\n/** 镜像面参数(与 vendored MirrorOptions 同形;G5 去 brepjs 依赖后本地自持)。 */\ninterface MirrorOptions {\n /** 镜像面法向。默认 [0,0,1]。 */\n normal?: readonly [number, number, number] | { x: number; y: number; z: number }\n /** 镜像面过点。默认 [0,0,0]。 */\n at?: readonly [number, number, number] | { x: number; y: number; z: number }\n}\n\n/** Normalize a vector (zero vector → [0,0,1] fallback, same as pattern.ts). */\nfunction norm(v: Vec3): Vec3 {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-9) return [0, 0, 1]\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\nfunction toBrepVec(v: Vec3): BrepVec3 {\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** Shared prelude: L1 kernel(getBrepApi,D12)+ BREP input handle + output statement id. */\nfunction prelude(input: Shape, tag: string): { kernel: BrepEngineApi; solid: BrepHandle; outStmt: string } {\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error(`[stdlib/${tag}] input is not BREP`)\n return { kernel, solid, outStmt: String(getCurrentStmt()?.id ?? '') }\n}\n\n/** Rotate point p around the axis line (point `center`, unit direction `u`) by theta radians. */\nfunction rotateAroundAxis(p: BrepVec3, center: BrepVec3, u: Vec3, theta: number): BrepVec3 {\n const vx = p.x - center.x\n const vy = p.y - center.y\n const vz = p.z - center.z\n const cos = Math.cos(theta)\n const sin = Math.sin(theta)\n const dot = vx * u[0] + vy * u[1] + vz * u[2]\n // u × v\n const cx = u[1] * vz - u[2] * vy\n const cy = u[2] * vx - u[0] * vz\n const cz = u[0] * vy - u[1] * vx\n return {\n x: center.x + vx * cos + cx * sin + u[0] * dot * (1 - cos),\n y: center.y + vy * cos + cy * sin + u[1] * dot * (1 - cos),\n z: center.z + vz * cos + cz * sin + u[2] * dot * (1 - cos),\n }\n}\n\n/** Reflect point p across the plane (point `o`, unit normal `n`). Self-inverse. */\nfunction reflectAcrossPlane(p: BrepVec3, o: BrepVec3, n: Vec3): BrepVec3 {\n const d = (p.x - o.x) * n[0] + (p.y - o.y) * n[1] + (p.z - o.z) * n[2]\n return { x: p.x - 2 * d * n[0], y: p.y - 2 * d * n[1], z: p.z - 2 * d * n[2] }\n}\n\n// ── circularPattern ─────────────────────────────────────────────────────────\n\n/**\n * 环形阵列:绕 axis 均分 fullAngle(度,缺省 360)复制 count 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name circularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[k]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param axis - 旋转轴方向。type:[x,y,z] required:true\n * @param count - 副本总数(含原位置)。type:number required:true\n * @param fullAngle - 总角度(度,缺省 360)。type:number required:false\n * @param center - 旋转轴上一点(缺省原点)。type:[x,y,z] required:false\n * @example\n * const p = await cad.circularPattern(part0, [0, 0, 1], 6)\n */\nexport const circularPattern = defineOp({\n brep(input: Shape, axis: Vec3, count: number, fullAngle: number = 360, center: Vec3 = [0, 0, 0]) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'circularPattern')\n const u = norm(axis)\n const step = fullAngle / count\n const raw = kernel.circularPattern(solid, toBrepVec(center), toBrepVec(u), step, count)\n\n let resultSolid: BrepHandle\n try {\n resultSolid = kernel.fuseAll(raw)\n } finally {\n for (const c of raw) kernel.release(c)\n }\n\n const replicas: ReplicaTransform[] = []\n for (let k = 0; k < count; k++) {\n const theta = (-k * step * Math.PI) / 180\n replicas.push({\n label: `replica[${k}]`,\n inverse: (c) => rotateAroundAxis(c, toBrepVec(center), u, theta),\n })\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n // 中立 op(D11):capabilities 收窄到实现真实调用的 L1 名(删除 isNull/iterShapes/\n // section 等 occt-only 虚名——实现只调 kernel.circularPattern/fuseAll)。\n capabilities: [\n 'circularPattern',\n 'dispose',\n 'fuseAll',\n 'hashCode',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── gridPattern ─────────────────────────────────────────────────────────────\n\n/**\n * 二维栅格阵列:沿 directionX × directionY 复制 countX×countY 份(含原位置)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name gridPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 全部副本的 compound。\n * @param input - 目标几何。type:Shape required:true\n * @param directionX - 第一方向。type:[x,y,z] required:true\n * @param directionY - 第二方向。type:[x,y,z] required:true\n * @param countX - X 向副本数。type:number required:true\n * @param countY - Y 向副本数。type:number required:true\n * @param spacingX - X 向间距。type:number required:true\n * @param spacingY - Y 向间距。type:number required:true\n * @example\n * const p = await cad.gridPattern(part0, [1, 0, 0], [0, 1, 0], 3, 2, 20, 20)\n */\nexport const gridPattern = defineOp({\n brep(\n input: Shape,\n directionX: Vec3,\n directionY: Vec3,\n countX: number,\n countY: number,\n spacingX: number,\n spacingY: number,\n ) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'gridPattern')\n const dx = norm(directionX)\n const dy = norm(directionY)\n // kernel.gridPattern 返回 compound 单句柄(含全部副本),无需 fuse。\n const resultSolid = kernel.gridPattern(\n solid,\n toBrepVec(dx),\n toBrepVec(dy),\n spacingX,\n spacingY,\n countX,\n countY,\n )\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < countX; ix++) {\n for (let iy = 0; iy < countY; iy++) {\n const ox = ix * spacingX\n const oy = iy * spacingY\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n },\n capabilities: [\n 'dispose',\n 'fuseAll',\n 'gridPattern',\n 'hashCode',\n 'linearPattern',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── rectangularPattern ──────────────────────────────────────────────────────\n\ninterface RectangularPatternOptions {\n xDir: Vec3\n xCount: number\n xSpacing: number\n yDir: Vec3\n yCount: number\n ySpacing: number\n}\n\n/**\n * 矩形阵列:按 options(xDir/xCount/xSpacing/yDir/yCount/ySpacing)复制并 fuse。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name rectangularPattern\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[ix_iy]/<inner>`。\n * @returns Shape 所有副本 fused 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - 阵列参数。type:RectangularPatternOptions required:true\n * @example\n * const p = await cad.rectangularPattern(part0, { xDir: [1,0,0], xCount: 3, xSpacing: 20, yDir: [0,1,0], yCount: 2, ySpacing: 15 })\n */\nexport const rectangularPattern = defineOp({\n brep(input: Shape, options: RectangularPatternOptions) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'rectangularPattern')\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = options\n const dx = norm(xDir)\n const dy = norm(yDir)\n // vendored rectangularPattern 是纯 JS 组合(translate + fuseAll),内核不声明\n // 该方法——与 vendored 同口径:逐份 translate 再 fuseAll。\n const copies: BrepHandle[] = []\n try {\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n copies.push(kernel.translate(solid, ox * dx[0] + oy * dy[0], ox * dx[1] + oy * dy[1], ox * dx[2] + oy * dy[2]))\n }\n }\n const resultSolid = kernel.fuseAll(copies)\n\n const replicas: ReplicaTransform[] = []\n for (let ix = 0; ix < xCount; ix++) {\n for (let iy = 0; iy < yCount; iy++) {\n const ox = ix * xSpacing\n const oy = iy * ySpacing\n replicas.push({\n label: `replica[${ix}_${iy}]`,\n inverse: (c) => ({\n x: c.x - (ox * dx[0] + oy * dy[0]),\n y: c.y - (ox * dx[1] + oy * dy[1]),\n z: c.z - (ox * dx[2] + oy * dy[2]),\n }),\n })\n }\n }\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n for (const c of copies) kernel.release(c)\n }\n },\n capabilities: [\n 'dispose',\n 'fuse',\n 'fuseAll',\n 'fuseWithHistory',\n 'hashCode',\n 'surfaceCenterOfMass',\n 'surfaceNormal',\n 'surfaceType',\n 'uvBounds',\n ],\n naming: { kind: 'replicate', k: 0 } as Provenance,\n})\n\n// ── mirrorJoin ──────────────────────────────────────────────────────────────\n\ninterface MirrorJoinOptions {\n normal?: Vec3\n at?: Vec3\n}\n\n/**\n * 镜像并融合:原物(replica[0])+ 沿平面镜像(replica[1])fuse 成一体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirrorJoin\n * @note BREP-only。keep 语义:不消费输入。结果面回投输入面角色,产出 `replica[0|1]/<inner>`。\n * @returns Shape fuse 后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面法向与面上一点。type:MirrorJoinOptions required:false\n * @example\n * const p = await cad.mirrorJoin(part0, { normal: [1, 0, 0] })\n */\nexport const mirrorJoin = defineOp({\n brep(input: Shape, options?: MirrorJoinOptions) {\n keep(input)\n const { kernel, solid, outStmt } = prelude(input, 'mirrorJoin')\n const n = norm(options?.normal ?? [1, 0, 0])\n const o = toBrepVec(options?.at ?? [0, 0, 0])\n const inputHashes = getFaceHashes(kernel, solid)\n // 平台面(D3):mirrorWithHistory 是 occt-only。BrepHandle ↔ ShapeHandle 运行时\n // 同构,品牌转换只发生在平台边界。\n const mirrored = getOcctKernel().mirrorWithHistory(\n solid as unknown as ShapeHandle,\n o,\n toBrepVec(n),\n inputHashes,\n HASH_UPPER_BOUND,\n )\n try {\n const resultSolid = kernel.fuse(solid, mirrored.result as unknown as BrepHandle)\n\n const replicas: ReplicaTransform[] = [\n { label: 'replica[0]', inverse: (c) => ({ x: c.x, y: c.y, z: c.z }) },\n { label: 'replica[1]', inverse: (c) => reflectAcrossPlane(c, o, n) },\n ]\n const roleTable = buildReplicaRoleTable(kernel, input, resultSolid, replicas, outStmt)\n return fromBrep(solidToShape(kernel, resultSolid), { solid: resultSolid, roleTable })\n } finally {\n kernel.release(mirrored.result as unknown as BrepHandle)\n }\n },\n // 平台 op(D11):实现依赖 occt-only `mirrorWithHistory`(D3 原生面)——\n // 声明 engines;不声明 capabilities(能力由平台身份本身界定)。\n engines: ['occt'],\n naming: { kind: 'replicate', k: 2 } as Provenance,\n})\n\n// ── single-copy thin overrides(keep + 委托生成 op)─────────────────────────\n\n/**\n * 镜像:返回镜像后的新 Shape(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name mirror\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 镜像后的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @param options - { normal?, at? } 镜像面。type:MirrorOptions required:false\n * @example\n * const p = await cad.mirror(part0, { normal: [1, 0, 0] })\n */\nexport const mirror = defineOp({\n async brep(input: Shape, options?: MirrorOptions) {\n keep(input)\n return (await generatedMirror(input, options)) as Shape\n },\n // 平台 op(D11):委托 generatedMirror(vendored 实现调 occt-only\n // `mirrorWithHistory`,capability-map 实证)——声明 engines,不声明 capabilities。\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 深拷贝句柄:返回独立副本(源保留)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name clone\n * @note BREP-only。keep 语义:不消费输入(薄 override 委托生成 op,行为不变)。\n * @returns Shape 克隆的新几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const p = await cad.clone(part0)\n */\nexport const clone = defineOp({\n async brep(input: Shape) {\n keep(input)\n return (await generatedClone(input)) as Shape\n },\n capabilities: ['copyShape', 'dispose'],\n naming: { kind: 'identity' } as Provenance,\n})\n"]}
|
package/dist/api/result.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Platform Result face
|
|
3
|
-
* code to reach the vendored `Result` implementation.
|
|
2
|
+
* Platform Result face — the first-party Result implementation.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `../vendored/brepjs/core/result.js` directly.
|
|
10
|
-
*
|
|
11
|
-
* Projection only — no reimplementation: the vendored module stays the single
|
|
12
|
-
* source of truth for the Result semantics shared with the compat face.
|
|
4
|
+
* 2026-09-25 core-decouple Phase 1:从「vendored 投影」(旧 `export * from
|
|
5
|
+
* '@faicad/faijs-brepjs/core/result.js'`)改为 core 第一方模块 `result/result.ts`
|
|
6
|
+
* (同源复制,签名不变)。`@faicad/faijs/api/result` 深路径保持可用
|
|
7
|
+
* (fcstd 等下游按此 import)。
|
|
13
8
|
*/
|
|
14
|
-
export * from '../
|
|
9
|
+
export * from '../result/result.js';
|
|
15
10
|
//# sourceMappingURL=result.d.ts.map
|
package/dist/api/result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/api/result.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/api/result.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,kBAAkB,CAAA"}
|