@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
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib sweep — 扫掠:截面沿脊柱路径生成扫掠体(手写平台 op,Phase 4 → G5 core 直连)
|
|
3
|
+
*
|
|
4
|
+
* @platform occt — 实现走 core 自有 `brep-mirror/sweepFns.ts#sweepBrep`
|
|
5
|
+
* (occt-wasm simplePipe / sweepPipeShell;engine-method-map 里 `sweep` 为
|
|
6
|
+
* occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。
|
|
7
|
+
*
|
|
8
|
+
* 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是
|
|
9
|
+
* `cad.sketch(...)`(产出 **face**),需「面 → 外环」输入适配
|
|
10
|
+
* (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把
|
|
11
|
+
* 脊柱基对象 sketch 整圈外廓当路径)。
|
|
12
|
+
*
|
|
13
|
+
* core-decouple G5:vendored `sweep`(brepjs)替换为 brep-mirror 自有实现直连,
|
|
14
|
+
* 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
|
|
15
|
+
*/
|
|
16
|
+
import type { Shape } from '../mesh/types.js';
|
|
17
|
+
/** 扫掠配置(与 vendored SweepOptions 同形;本文件自持,去 brepjs 依赖)。 */
|
|
18
|
+
export interface SweepOptions {
|
|
19
|
+
/** Frenet 参考系(默认 false)。 */
|
|
20
|
+
frenet?: boolean;
|
|
21
|
+
/** 扫掠模式:'simple'(MakePipe)或 undefined(PipeShell)。 */
|
|
22
|
+
mode?: 'simple';
|
|
23
|
+
/** 过渡模式:仅支持默认 'right'(selfhost 后限制,见 sweepFns)。 */
|
|
24
|
+
transitionMode?: string;
|
|
25
|
+
/** 公差等其余 vendored 字段(保留以兼容调用方)。 */
|
|
26
|
+
tolerance?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 扫掠:截面沿脊柱路径生成扫掠体。
|
|
30
|
+
* @group 特征
|
|
31
|
+
* @inputs 2
|
|
32
|
+
* @async true
|
|
33
|
+
* @qual ok
|
|
34
|
+
* @name sweep
|
|
35
|
+
* @note 平台 op:仅 occt 引擎(BRepOffsetAPI_MakePipeShell / MakePipe)。截面接受
|
|
36
|
+
* wire 或面(面取其外环);脊柱必须为 wire。非 occt 引擎执行前报错;
|
|
37
|
+
* brep_mock 不拦截。`shellMode` 不暴露(元组产物跨不过单产物边界)。
|
|
38
|
+
* @returns Shape 扫掠体。
|
|
39
|
+
* @param profile - 截面几何(wire 或面;面取其外环)。type:Shape required:true
|
|
40
|
+
* @param spine - 脊柱路径(wire)。type:Shape required:true
|
|
41
|
+
* @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false
|
|
42
|
+
* @example
|
|
43
|
+
* const path = cad.wire([[0, 0, 0], [0, 0, 50]])
|
|
44
|
+
* const section = cad.sketch({ contours: [{ segments: [
|
|
45
|
+
* { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },
|
|
46
|
+
* { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },
|
|
47
|
+
* { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },
|
|
48
|
+
* { kind: 'line', x1: -4, y1: 4, x2: -4, y2: -4 },
|
|
49
|
+
* ] }] })
|
|
50
|
+
* const body = await cad.sweep(section, path)
|
|
51
|
+
*/
|
|
52
|
+
export declare const sweep: ((profile: Shape, spine: Shape, opts?: SweepOptions | undefined) => Promise<Shape>) & {
|
|
53
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=sweep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../src/api/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAW1C,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,qDAAqD;IACrD,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,KAAK;;CAOhB,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib sweep — 扫掠:截面沿脊柱路径生成扫掠体(手写平台 op,Phase 4 → G5 core 直连)
|
|
3
|
+
*
|
|
4
|
+
* @platform occt — 实现走 core 自有 `brep-mirror/sweepFns.ts#sweepBrep`
|
|
5
|
+
* (occt-wasm simplePipe / sweepPipeShell;engine-method-map 里 `sweep` 为
|
|
6
|
+
* occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。
|
|
7
|
+
*
|
|
8
|
+
* 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是
|
|
9
|
+
* `cad.sketch(...)`(产出 **face**),需「面 → 外环」输入适配
|
|
10
|
+
* (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把
|
|
11
|
+
* 脊柱基对象 sketch 整圈外廓当路径)。
|
|
12
|
+
*
|
|
13
|
+
* core-decouple G5:vendored `sweep`(brepjs)替换为 brep-mirror 自有实现直连,
|
|
14
|
+
* 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
|
|
15
|
+
*/
|
|
16
|
+
import { defineOp } from '../sdk.js';
|
|
17
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
18
|
+
import { fromBrep } from '../shape.js';
|
|
19
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
20
|
+
import { sweepBrep as selfhostedSweep } from './brep-mirror/sweepFns.js';
|
|
21
|
+
import { toProfileWireView } from './internal/profile-wire.js';
|
|
22
|
+
import { unwrapResult } from './internal/result-unwrap.js';
|
|
23
|
+
/** BREP 路径:截面沿脊柱扫掠(wire 视图 → brep-mirror 直连 → fromBrep 收养)。 */
|
|
24
|
+
function sweepBrep(profile, spine, opts) {
|
|
25
|
+
if (!profile)
|
|
26
|
+
throw new Error('E_SWEEP_NO_PROFILE: sweep requires a profile (section) shape');
|
|
27
|
+
if (!spine)
|
|
28
|
+
throw new Error('E_SWEEP_NO_SPINE: sweep requires a spine (path) shape');
|
|
29
|
+
// 截面 / 脊柱:wire 直用;面取外环(孔环不参与扫掠)。
|
|
30
|
+
const profileWire = toProfileWireView(profile);
|
|
31
|
+
const spineWire = toProfileWireView(spine);
|
|
32
|
+
const r = selfhostedSweep(profileWire, spineWire, opts ?? {}, false);
|
|
33
|
+
const h = unwrapResult(r, 'sweep');
|
|
34
|
+
const kernel = getBrepApi();
|
|
35
|
+
try {
|
|
36
|
+
return fromBrep(solidToShape(kernel, h), { solid: h });
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
// 面→外环产出的 wire 是 arena 新句柄(曲线借用不 release)
|
|
40
|
+
if (!profileWire.borrowed) {
|
|
41
|
+
try {
|
|
42
|
+
kernel.release(profileWire.wrapped);
|
|
43
|
+
}
|
|
44
|
+
catch { /* 已释放 */ }
|
|
45
|
+
}
|
|
46
|
+
if (!spineWire.borrowed) {
|
|
47
|
+
try {
|
|
48
|
+
kernel.release(spineWire.wrapped);
|
|
49
|
+
}
|
|
50
|
+
catch { /* 已释放 */ }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 扫掠:截面沿脊柱路径生成扫掠体。
|
|
56
|
+
* @group 特征
|
|
57
|
+
* @inputs 2
|
|
58
|
+
* @async true
|
|
59
|
+
* @qual ok
|
|
60
|
+
* @name sweep
|
|
61
|
+
* @note 平台 op:仅 occt 引擎(BRepOffsetAPI_MakePipeShell / MakePipe)。截面接受
|
|
62
|
+
* wire 或面(面取其外环);脊柱必须为 wire。非 occt 引擎执行前报错;
|
|
63
|
+
* brep_mock 不拦截。`shellMode` 不暴露(元组产物跨不过单产物边界)。
|
|
64
|
+
* @returns Shape 扫掠体。
|
|
65
|
+
* @param profile - 截面几何(wire 或面;面取其外环)。type:Shape required:true
|
|
66
|
+
* @param spine - 脊柱路径(wire)。type:Shape required:true
|
|
67
|
+
* @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false
|
|
68
|
+
* @example
|
|
69
|
+
* const path = cad.wire([[0, 0, 0], [0, 0, 50]])
|
|
70
|
+
* const section = cad.sketch({ contours: [{ segments: [
|
|
71
|
+
* { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },
|
|
72
|
+
* { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },
|
|
73
|
+
* { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },
|
|
74
|
+
* { kind: 'line', x1: -4, y1: 4, x2: -4, y2: -4 },
|
|
75
|
+
* ] }] })
|
|
76
|
+
* const body = await cad.sweep(section, path)
|
|
77
|
+
*/
|
|
78
|
+
export const sweep = defineOp({
|
|
79
|
+
name: 'sweep',
|
|
80
|
+
brep(profile, spine, opts) {
|
|
81
|
+
return sweepBrep(profile, spine, opts);
|
|
82
|
+
},
|
|
83
|
+
engines: ['occt'],
|
|
84
|
+
naming: { kind: 'unmodeled', reason: 'swept-body face vocabulary not defined' },
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/api/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAevD,+DAA+D;AAC/D,SAAS,SAAS,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;IAClE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IAC7F,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACpF,iCAAiC;IACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAe,CAAA;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACxD,CAAC;YAAS,CAAC;QACT,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,OAAO;IACb,IAAI,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;QACpD,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,wCAAwC,EAAgB;CAC9F,CAAC,CAAA","sourcesContent":["/**\n * stdlib sweep — 扫掠:截面沿脊柱路径生成扫掠体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 core 自有 `brep-mirror/sweepFns.ts#sweepBrep`\n * (occt-wasm simplePipe / sweepPipeShell;engine-method-map 里 `sweep` 为\n * occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。\n *\n * 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是\n * `cad.sketch(...)`(产出 **face**),需「面 → 外环」输入适配\n * (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把\n * 脊柱基对象 sketch 整圈外廓当路径)。\n *\n * core-decouple G5:vendored `sweep`(brepjs)替换为 brep-mirror 自有实现直连,\n * 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { sweepBrep as selfhostedSweep } from './brep-mirror/sweepFns'\nimport { toProfileWireView } from './internal/profile-wire'\nimport { unwrapResult } from './internal/result-unwrap'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 扫掠配置(与 vendored SweepOptions 同形;本文件自持,去 brepjs 依赖)。 */\nexport interface SweepOptions {\n /** Frenet 参考系(默认 false)。 */\n frenet?: boolean\n /** 扫掠模式:'simple'(MakePipe)或 undefined(PipeShell)。 */\n mode?: 'simple'\n /** 过渡模式:仅支持默认 'right'(selfhost 后限制,见 sweepFns)。 */\n transitionMode?: string\n /** 公差等其余 vendored 字段(保留以兼容调用方)。 */\n tolerance?: number\n}\n\n/** BREP 路径:截面沿脊柱扫掠(wire 视图 → brep-mirror 直连 → fromBrep 收养)。 */\nfunction sweepBrep(profile: Shape, spine: Shape, opts?: SweepOptions): Shape {\n if (!profile) throw new Error('E_SWEEP_NO_PROFILE: sweep requires a profile (section) shape')\n if (!spine) throw new Error('E_SWEEP_NO_SPINE: sweep requires a spine (path) shape')\n // 截面 / 脊柱:wire 直用;面取外环(孔环不参与扫掠)。\n const profileWire = toProfileWireView(profile)\n const spineWire = toProfileWireView(spine)\n const r = selfhostedSweep(profileWire, spineWire, opts ?? {}, false)\n const h = unwrapResult(r, 'sweep') as BrepHandle\n const kernel = getBrepApi()\n try {\n return fromBrep(solidToShape(kernel, h), { solid: h })\n } finally {\n // 面→外环产出的 wire 是 arena 新句柄(曲线借用不 release)\n if (!profileWire.borrowed) {\n try { kernel.release(profileWire.wrapped) } catch { /* 已释放 */ }\n }\n if (!spineWire.borrowed) {\n try { kernel.release(spineWire.wrapped) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 扫掠:截面沿脊柱路径生成扫掠体。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name sweep\n * @note 平台 op:仅 occt 引擎(BRepOffsetAPI_MakePipeShell / MakePipe)。截面接受\n * wire 或面(面取其外环);脊柱必须为 wire。非 occt 引擎执行前报错;\n * brep_mock 不拦截。`shellMode` 不暴露(元组产物跨不过单产物边界)。\n * @returns Shape 扫掠体。\n * @param profile - 截面几何(wire 或面;面取其外环)。type:Shape required:true\n * @param spine - 脊柱路径(wire)。type:Shape required:true\n * @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false\n * @example\n * const path = cad.wire([[0, 0, 0], [0, 0, 50]])\n * const section = cad.sketch({ contours: [{ segments: [\n * { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },\n * { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },\n * { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },\n * { kind: 'line', x1: -4, y1: 4, x2: -4, y2: -4 },\n * ] }] })\n * const body = await cad.sweep(section, path)\n */\nexport const sweep = defineOp({\n name: 'sweep',\n brep(profile: Shape, spine: Shape, opts?: SweepOptions) {\n return sweepBrep(profile, spine, opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'swept-body face vocabulary not defined' } as Provenance,\n})\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib thicken — 加厚:把面(或壳)沿法向偏置成等厚实体(手写平台 op,Phase 4 → G5 core 直连)
|
|
3
|
+
*
|
|
4
|
+
* @platform occt — 实现走 occt-wasm 原生 `thicken`(BRepOffsetAPI_MakeThickSolid;
|
|
5
|
+
* engine-method-map 里 `thicken` 为 occt-only)⇒ 平台 op:defineOp 声明
|
|
6
|
+
* `engines: ['occt']`(D11)。
|
|
7
|
+
*
|
|
8
|
+
* core-decouple G5:vendored `thicken`(brepjs modifierFns,thickenWithHistory)
|
|
9
|
+
* 替换为 occt-wasm 原生直连,产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
|
|
10
|
+
*/
|
|
11
|
+
import type { Shape } from '../mesh/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* 加厚:把面(或壳)沿法向偏置成等厚实体。
|
|
14
|
+
* @group 特征
|
|
15
|
+
* @inputs 1
|
|
16
|
+
* @async true
|
|
17
|
+
* @qual ok
|
|
18
|
+
* @name thicken
|
|
19
|
+
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.sketch 产物);
|
|
20
|
+
* 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
21
|
+
* @returns Shape 加厚后的实体。
|
|
22
|
+
* @param input - 面/壳几何(cad.sketch 产物等)。type:Shape required:true
|
|
23
|
+
* @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true
|
|
24
|
+
* @example
|
|
25
|
+
* const face = cad.sketch({ contours: [{ segments: [
|
|
26
|
+
* { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },
|
|
27
|
+
* { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },
|
|
28
|
+
* { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },
|
|
29
|
+
* { kind: 'line', x1: -10, y1: 10, x2: -10, y2: -10 },
|
|
30
|
+
* ] }] })
|
|
31
|
+
* const solid = await cad.thicken(face, 2)
|
|
32
|
+
*/
|
|
33
|
+
export declare const thicken: ((input: Shape, thickness: number) => Promise<Shape>) & {
|
|
34
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=thicken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thicken.d.ts","sourceRoot":"","sources":["../../src/api/thicken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAS1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO;;CAelB,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib thicken — 加厚:把面(或壳)沿法向偏置成等厚实体(手写平台 op,Phase 4 → G5 core 直连)
|
|
3
|
+
*
|
|
4
|
+
* @platform occt — 实现走 occt-wasm 原生 `thicken`(BRepOffsetAPI_MakeThickSolid;
|
|
5
|
+
* engine-method-map 里 `thicken` 为 occt-only)⇒ 平台 op:defineOp 声明
|
|
6
|
+
* `engines: ['occt']`(D11)。
|
|
7
|
+
*
|
|
8
|
+
* core-decouple G5:vendored `thicken`(brepjs modifierFns,thickenWithHistory)
|
|
9
|
+
* 替换为 occt-wasm 原生直连,产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
|
|
10
|
+
*/
|
|
11
|
+
import { defineOp } from '../sdk.js';
|
|
12
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
13
|
+
import { brepOf, fromBrep } from '../shape.js';
|
|
14
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
15
|
+
import { getOcctKernel } from '../occt-kernel/occtKernel.js';
|
|
16
|
+
/**
|
|
17
|
+
* 加厚:把面(或壳)沿法向偏置成等厚实体。
|
|
18
|
+
* @group 特征
|
|
19
|
+
* @inputs 1
|
|
20
|
+
* @async true
|
|
21
|
+
* @qual ok
|
|
22
|
+
* @name thicken
|
|
23
|
+
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.sketch 产物);
|
|
24
|
+
* 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
25
|
+
* @returns Shape 加厚后的实体。
|
|
26
|
+
* @param input - 面/壳几何(cad.sketch 产物等)。type:Shape required:true
|
|
27
|
+
* @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true
|
|
28
|
+
* @example
|
|
29
|
+
* const face = cad.sketch({ contours: [{ segments: [
|
|
30
|
+
* { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },
|
|
31
|
+
* { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },
|
|
32
|
+
* { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },
|
|
33
|
+
* { kind: 'line', x1: -10, y1: 10, x2: -10, y2: -10 },
|
|
34
|
+
* ] }] })
|
|
35
|
+
* const solid = await cad.thicken(face, 2)
|
|
36
|
+
*/
|
|
37
|
+
export const thicken = defineOp({
|
|
38
|
+
name: 'thicken',
|
|
39
|
+
brep(input, thickness) {
|
|
40
|
+
if (!input)
|
|
41
|
+
throw new Error('E_THICKEN_NO_SHAPE: thicken requires a face/shell shape');
|
|
42
|
+
if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness === 0) {
|
|
43
|
+
throw new Error('E_THICKEN_BAD_THICKNESS: thicken.thickness must be a non-zero number');
|
|
44
|
+
}
|
|
45
|
+
const kernel = getBrepApi();
|
|
46
|
+
const handle = brepOf(input);
|
|
47
|
+
if (!handle)
|
|
48
|
+
throw new Error('[thicken] input is not BREP');
|
|
49
|
+
const h = getOcctKernel().thicken(handle, thickness, 1e-6);
|
|
50
|
+
return fromBrep(solidToShape(kernel, h), { solid: h });
|
|
51
|
+
},
|
|
52
|
+
engines: ['occt'],
|
|
53
|
+
naming: { kind: 'unmodeled', reason: 'thickened-body face vocabulary not defined' },
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=thicken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thicken.js","sourceRoot":"","sources":["../../src/api/thicken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAGzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,SAAS;IACf,IAAI,CAAC,KAAY,EAAE,SAAiB;QAClC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;QACtF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACzF,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC,MAAe,EAAE,SAAS,EAAE,IAAI,CAA0B,CAAA;QAC5F,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAU,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,4CAA4C,EAAgB;CAClG,CAAC,CAAA","sourcesContent":["/**\n * stdlib thicken — 加厚:把面(或壳)沿法向偏置成等厚实体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 occt-wasm 原生 `thicken`(BRepOffsetAPI_MakeThickSolid;\n * engine-method-map 里 `thicken` 为 occt-only)⇒ 平台 op:defineOp 声明\n * `engines: ['occt']`(D11)。\n *\n * core-decouple G5:vendored `thicken`(brepjs modifierFns,thickenWithHistory)\n * 替换为 occt-wasm 原生直连,产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * 加厚:把面(或壳)沿法向偏置成等厚实体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name thicken\n * @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.sketch 产物);\n * 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 加厚后的实体。\n * @param input - 面/壳几何(cad.sketch 产物等)。type:Shape required:true\n * @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true\n * @example\n * const face = cad.sketch({ contours: [{ segments: [\n * { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },\n * { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },\n * { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },\n * { kind: 'line', x1: -10, y1: 10, x2: -10, y2: -10 },\n * ] }] })\n * const solid = await cad.thicken(face, 2)\n */\nexport const thicken = defineOp({\n name: 'thicken',\n brep(input: Shape, thickness: number) {\n if (!input) throw new Error('E_THICKEN_NO_SHAPE: thicken requires a face/shell shape')\n if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness === 0) {\n throw new Error('E_THICKEN_BAD_THICKNESS: thicken.thickness must be a non-zero number')\n }\n const kernel = getBrepApi()\n const handle = brepOf(input) as BrepHandle | undefined\n if (!handle) throw new Error('[thicken] input is not BREP')\n const h = getOcctKernel().thicken(handle as never, thickness, 1e-6) as unknown as BrepHandle\n return fromBrep(solidToShape(kernel, h), { solid: h }) as Shape\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'thickened-body face vocabulary not defined' } as Provenance,\n})\n"]}
|
package/dist/api/transform.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)
|
|
3
3
|
*
|
|
4
|
+
* 平台分层(narrowing plan Phase 5,D11):
|
|
5
|
+
* - `translate` / `scale`:**平台 op(occt)**——权威面演化走
|
|
6
|
+
* `translateWithHistory` / `scaleWithHistory`(occt-only,face-evolution.ts 的
|
|
7
|
+
* translateWithHashEvolution/scaleWithHashEvolution 经 getOcctKernel() 调用)→
|
|
8
|
+
* `engines: ['occt']`。
|
|
9
|
+
* - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达
|
|
10
|
+
* (任意欧拉+pivot / 非等比),退回 `identityHashEvolution` + `rotateBrep`/
|
|
11
|
+
* `scaleBrep`(只用 L1:transform/generalTransform/subShapeHashes),不声明 engines。
|
|
4
12
|
*
|
|
5
13
|
* dispatchPath 静态判定 brep/mesh,
|
|
6
14
|
* BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAmBhD,oDAAoD;AAEpD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKxE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQvE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQzE;AA+DD;;;;;;;;;;;;;IAaI;AACJ,eAAO,MAAM,SAAS;;CAkBpB,CAAA;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY;;CAevB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAoBhB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO;;CAkBlB,CAAA"}
|
package/dist/api/transform.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)
|
|
3
3
|
*
|
|
4
|
+
* 平台分层(narrowing plan Phase 5,D11):
|
|
5
|
+
* - `translate` / `scale`:**平台 op(occt)**——权威面演化走
|
|
6
|
+
* `translateWithHistory` / `scaleWithHistory`(occt-only,face-evolution.ts 的
|
|
7
|
+
* translateWithHashEvolution/scaleWithHashEvolution 经 getOcctKernel() 调用)→
|
|
8
|
+
* `engines: ['occt']`。
|
|
9
|
+
* - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达
|
|
10
|
+
* (任意欧拉+pivot / 非等比),退回 `identityHashEvolution` + `rotateBrep`/
|
|
11
|
+
* `scaleBrep`(只用 L1:transform/generalTransform/subShapeHashes),不声明 engines。
|
|
4
12
|
*
|
|
5
13
|
* dispatchPath 静态判定 brep/mesh,
|
|
6
14
|
* BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。
|
|
@@ -8,7 +16,7 @@
|
|
|
8
16
|
import { cad } from '../mesh/index.js';
|
|
9
17
|
import { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops.js';
|
|
10
18
|
import { identityEvolution, identityHashEvolution, scaleWithHashEvolution, translateWithHashEvolution, } from '../brep/face-evolution.js';
|
|
11
|
-
import {
|
|
19
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
12
20
|
import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
|
|
13
21
|
import { propagateAllOrigins } from '../topology/naming/roles.js';
|
|
14
22
|
import { defineOp } from '../sdk.js';
|
|
@@ -72,9 +80,8 @@ export function assertScale3dParams(params) {
|
|
|
72
80
|
* @returns the transformed Shape.
|
|
73
81
|
*/
|
|
74
82
|
function transformBrep(op, input, params) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
throw new Error('[stdlib/transform] no OCCT kernel');
|
|
83
|
+
// L1 面:rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。
|
|
84
|
+
const kernel = getBrepApi();
|
|
78
85
|
const inputSolid = brepOf(input);
|
|
79
86
|
if (!inputSolid)
|
|
80
87
|
throw new Error('[stdlib/transform] input is not BREP');
|
|
@@ -146,6 +153,8 @@ export const translate = defineOp({
|
|
|
146
153
|
// D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;
|
|
147
154
|
// `offset` is a vec3 slot sitting after the single leading Shape argument.
|
|
148
155
|
slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },
|
|
156
|
+
// 平台 op:权威面演化依赖 occt-only translateWithHistory(face-evolution.ts,D3)。
|
|
157
|
+
engines: ['occt'],
|
|
149
158
|
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
150
159
|
});
|
|
151
160
|
/**
|
|
@@ -218,6 +227,8 @@ export const scale = defineOp({
|
|
|
218
227
|
// D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options
|
|
219
228
|
// ({center})经 dual-form-args 尾参合并并入。
|
|
220
229
|
slotMap: { keys: ['factor'], shapeArity: 1 },
|
|
230
|
+
// 平台 op:权威面演化依赖 occt-only scaleWithHistory(face-evolution.ts,D3)。
|
|
231
|
+
engines: ['occt'],
|
|
221
232
|
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
222
233
|
});
|
|
223
234
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport {\n identityEvolution,\n identityHashEvolution,\n scaleWithHashEvolution,\n translateWithHashEvolution,\n} from '../brep/face-evolution'\nimport type { HashEvolution } from '../brep/face-evolution'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\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 { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/**\n * BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。\n *\n * Phase 0.3:优先走内核**权威**面演化(`translateWithHistory` / `scaleWithHistory`);\n * 内核无法单次表达的(`rotate_euler` 任意欧拉+pivot、`scale3d` 非等比)退回\n * `identityHashEvolution`,其\"面枚举序号在变换后保持\"的假设由\n * `brep/face-evolution.ordering.test.ts` 实测钉住。\n * @param op - the transform operation name.\n * @param input - the input geometry.\n * @param params - the operation parameters.\n * @returns the transformed Shape.\n */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/transform] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n let resultSolid: BrepHandle\n let hashEvolution: HashEvolution\n\n if (op === 'translate') {\n // 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)\n const r = translateWithHashEvolution(kernel, inputSolid, params.offset as Vec3)\n resultSolid = r.result\n hashEvolution = r.evolution\n } else if (op === 'scale') {\n // 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)\n const r = scaleWithHashEvolution(\n kernel,\n inputSolid,\n (params.center as Vec3 | undefined) ?? [0, 0, 0],\n params.factor as number,\n )\n resultSolid = r.result\n hashEvolution = r.evolution\n } else {\n // rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达\n if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n hashEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n\n // §2.4/§3.3:刚体变换面 1:1 保留 —— 沿演化传播 roleTable(所有 origin)\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, hashEvolution)\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换不改变拓扑,面 ordinal 不变(与旧路径一致)\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 translate\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n * 平台分层(narrowing plan Phase 5,D11):\n * - `translate` / `scale`:**平台 op(occt)**——权威面演化走\n * `translateWithHistory` / `scaleWithHistory`(occt-only,face-evolution.ts 的\n * translateWithHashEvolution/scaleWithHashEvolution 经 getOcctKernel() 调用)→\n * `engines: ['occt']`。\n * - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达\n * (任意欧拉+pivot / 非等比),退回 `identityHashEvolution` + `rotateBrep`/\n * `scaleBrep`(只用 L1:transform/generalTransform/subShapeHashes),不声明 engines。\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport {\n identityEvolution,\n identityHashEvolution,\n scaleWithHashEvolution,\n translateWithHashEvolution,\n} from '../brep/face-evolution'\nimport type { HashEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\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 { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/**\n * BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。\n *\n * Phase 0.3:优先走内核**权威**面演化(`translateWithHistory` / `scaleWithHistory`);\n * 内核无法单次表达的(`rotate_euler` 任意欧拉+pivot、`scale3d` 非等比)退回\n * `identityHashEvolution`,其\"面枚举序号在变换后保持\"的假设由\n * `brep/face-evolution.ordering.test.ts` 实测钉住。\n * @param op - the transform operation name.\n * @param input - the input geometry.\n * @param params - the operation parameters.\n * @returns the transformed Shape.\n */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n let resultSolid: BrepHandle\n let hashEvolution: HashEvolution\n\n if (op === 'translate') {\n // 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)\n const r = translateWithHashEvolution(kernel, inputSolid, params.offset as Vec3)\n resultSolid = r.result\n hashEvolution = r.evolution\n } else if (op === 'scale') {\n // 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)\n const r = scaleWithHashEvolution(\n kernel,\n inputSolid,\n (params.center as Vec3 | undefined) ?? [0, 0, 0],\n params.factor as number,\n )\n resultSolid = r.result\n hashEvolution = r.evolution\n } else {\n // rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达\n if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n hashEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n\n // §2.4/§3.3:刚体变换面 1:1 保留 —— 沿演化传播 roleTable(所有 origin)\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, hashEvolution)\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换不改变拓扑,面 ordinal 不变(与旧路径一致)\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 translate\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n // 平台 op:权威面演化依赖 occt-only translateWithHistory(face-evolution.ts,D3)。\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n // 平台 op:权威面演化依赖 occt-only scaleWithHistory(face-evolution.ts,D3)。\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional camera API — plain immutable Camera objects for 3D projection.
|
|
3
|
+
*
|
|
4
|
+
* 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs
|
|
5
|
+
* `src/projection/cameraFns.ts`(同源复制,签名不变);import 来源改为 compat
|
|
6
|
+
* 面第一方模块与 `result/` 第一方模块。`projectEdges`(依赖
|
|
7
|
+
* `makeProjectedEdges`)不在内联范围,已裁剪——faijs 视图投影执行面
|
|
8
|
+
* (projectView/projectSheet)另行处理。
|
|
9
|
+
*/
|
|
10
|
+
import type { Vec3 } from '../brepjs-compat/types.js';
|
|
11
|
+
import type { ProjectionPlane } from './projectionPlanes.js';
|
|
12
|
+
import { type Result } from '../../result/result.js';
|
|
13
|
+
/**
|
|
14
|
+
* Immutable plain-object representation of a projection camera.
|
|
15
|
+
*/
|
|
16
|
+
export interface Camera {
|
|
17
|
+
readonly position: Vec3;
|
|
18
|
+
readonly direction: Vec3;
|
|
19
|
+
readonly xAxis: Vec3;
|
|
20
|
+
readonly yAxis: Vec3;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a camera from position, direction, and an optional X-axis.
|
|
24
|
+
*
|
|
25
|
+
* If `xAxis` is omitted, it is derived automatically from the direction.
|
|
26
|
+
*
|
|
27
|
+
* @param position - Camera position in world coordinates.
|
|
28
|
+
* @param direction - View direction (camera looks along this vector).
|
|
29
|
+
* @param xAxis - Optional horizontal axis; derived automatically if not provided.
|
|
30
|
+
* @returns `Result<Camera>` -- an error if direction is zero-length.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createCamera(position?: Vec3, direction?: Vec3, xAxis?: Vec3): Result<Camera>;
|
|
33
|
+
/**
|
|
34
|
+
* Create a new camera oriented to look at a target point from the current position.
|
|
35
|
+
*
|
|
36
|
+
* @param camera - Existing camera whose position is preserved.
|
|
37
|
+
* @param target - World-space point to look at.
|
|
38
|
+
* @returns `Result<Camera>` with updated direction and derived axes.
|
|
39
|
+
*/
|
|
40
|
+
export declare function cameraLookAt(camera: Camera, target: Vec3): Result<Camera>;
|
|
41
|
+
/**
|
|
42
|
+
* Create a camera positioned at the origin, looking along a named projection plane.
|
|
43
|
+
*
|
|
44
|
+
* @param planeName - Named projection direction (e.g., `'front'`, `'top'`).
|
|
45
|
+
* @returns `Result<Camera>` configured for that standard view.
|
|
46
|
+
*/
|
|
47
|
+
export declare function cameraFromPlane(planeName: ProjectionPlane): Result<Camera>;
|
|
48
|
+
//# sourceMappingURL=cameraFns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cameraFns.d.ts","sourceRoot":"","sources":["../../../src/api/view/cameraFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,qBAAqB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,GAAE,IAAgB,EAC1B,SAAS,GAAE,IAAgB,EAC3B,KAAK,CAAC,EAAE,IAAI,GACX,MAAM,CAAC,MAAM,CAAC,CA+BhB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAGzE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAG1E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional camera API — plain immutable Camera objects for 3D projection.
|
|
3
|
+
*
|
|
4
|
+
* 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs
|
|
5
|
+
* `src/projection/cameraFns.ts`(同源复制,签名不变);import 来源改为 compat
|
|
6
|
+
* 面第一方模块与 `result/` 第一方模块。`projectEdges`(依赖
|
|
7
|
+
* `makeProjectedEdges`)不在内联范围,已裁剪——faijs 视图投影执行面
|
|
8
|
+
* (projectView/projectSheet)另行处理。
|
|
9
|
+
*/
|
|
10
|
+
import { vecCross, vecNormalize, vecSub, vecLength } from '../brepjs-compat/vecOps.js';
|
|
11
|
+
import { PROJECTION_PLANES } from './projectionPlanes.js';
|
|
12
|
+
import { ok, err } from '../../result/result.js';
|
|
13
|
+
import { validationError } from '../../result/errors.js';
|
|
14
|
+
/**
|
|
15
|
+
* Create a camera from position, direction, and an optional X-axis.
|
|
16
|
+
*
|
|
17
|
+
* If `xAxis` is omitted, it is derived automatically from the direction.
|
|
18
|
+
*
|
|
19
|
+
* @param position - Camera position in world coordinates.
|
|
20
|
+
* @param direction - View direction (camera looks along this vector).
|
|
21
|
+
* @param xAxis - Optional horizontal axis; derived automatically if not provided.
|
|
22
|
+
* @returns `Result<Camera>` -- an error if direction is zero-length.
|
|
23
|
+
*/
|
|
24
|
+
export function createCamera(position = [0, 0, 0], direction = [0, 0, 1], xAxis) {
|
|
25
|
+
// Validate direction is not zero-length
|
|
26
|
+
const dirLength = vecLength(direction);
|
|
27
|
+
if (dirLength < 1e-12) {
|
|
28
|
+
return err(validationError('CAMERA_ZERO_DIRECTION', 'Camera direction cannot be a zero-length vector'));
|
|
29
|
+
}
|
|
30
|
+
let resolvedXAxis;
|
|
31
|
+
if (xAxis) {
|
|
32
|
+
resolvedXAxis = vecNormalize(xAxis);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Derive xAxis from direction
|
|
36
|
+
// Try crossing with Z-axis first, then Y-axis, then X-axis as fallbacks
|
|
37
|
+
let cross = vecCross([0, 0, 1], direction);
|
|
38
|
+
if (vecLength(cross) < 1e-12) {
|
|
39
|
+
cross = vecCross([0, 1, 0], direction);
|
|
40
|
+
}
|
|
41
|
+
if (vecLength(cross) < 1e-12) {
|
|
42
|
+
cross = vecCross([1, 0, 0], direction);
|
|
43
|
+
}
|
|
44
|
+
resolvedXAxis = vecNormalize(cross);
|
|
45
|
+
}
|
|
46
|
+
const yAxis = vecNormalize(vecCross(direction, resolvedXAxis));
|
|
47
|
+
return ok({
|
|
48
|
+
position,
|
|
49
|
+
direction: vecNormalize(direction),
|
|
50
|
+
xAxis: resolvedXAxis,
|
|
51
|
+
yAxis,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a new camera oriented to look at a target point from the current position.
|
|
56
|
+
*
|
|
57
|
+
* @param camera - Existing camera whose position is preserved.
|
|
58
|
+
* @param target - World-space point to look at.
|
|
59
|
+
* @returns `Result<Camera>` with updated direction and derived axes.
|
|
60
|
+
*/
|
|
61
|
+
export function cameraLookAt(camera, target) {
|
|
62
|
+
const direction = vecNormalize(vecSub(camera.position, target));
|
|
63
|
+
return createCamera(camera.position, direction);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a camera positioned at the origin, looking along a named projection plane.
|
|
67
|
+
*
|
|
68
|
+
* @param planeName - Named projection direction (e.g., `'front'`, `'top'`).
|
|
69
|
+
* @returns `Result<Camera>` configured for that standard view.
|
|
70
|
+
*/
|
|
71
|
+
export function cameraFromPlane(planeName) {
|
|
72
|
+
const config = PROJECTION_PLANES[planeName];
|
|
73
|
+
return createCamera([0, 0, 0], config.dir, config.xAxis);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=cameraFns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cameraFns.js","sourceRoot":"","sources":["../../../src/api/view/cameraFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAe,EAAE,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAYtD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,YAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3B,KAAY;IAEZ,wCAAwC;IACxC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QACtB,OAAO,GAAG,CACR,eAAe,CAAC,uBAAuB,EAAE,iDAAiD,CAAC,CAC5F,CAAC;IACJ,CAAC;IAED,IAAI,aAAmB,CAAC;IACxB,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,wEAAwE;QACxE,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;YAC7B,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;YAC7B,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC;QACR,QAAQ;QACR,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;QAClC,KAAK,EAAE,aAAa;QACpB,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAAY;IACvD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,OAAO,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAA0B;IACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Functional camera API — plain immutable Camera objects for 3D projection.\n *\n * 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs\n * `src/projection/cameraFns.ts`(同源复制,签名不变);import 来源改为 compat\n * 面第一方模块与 `result/` 第一方模块。`projectEdges`(依赖\n * `makeProjectedEdges`)不在内联范围,已裁剪——faijs 视图投影执行面\n * (projectView/projectSheet)另行处理。\n */\n\nimport type { Vec3 } from '../brepjs-compat/types';\nimport { vecCross, vecNormalize, vecSub, vecLength } from '../brepjs-compat/vecOps';\nimport type { ProjectionPlane } from './projectionPlanes';\nimport { PROJECTION_PLANES } from './projectionPlanes';\nimport { type Result, ok, err } from '../../result/result';\nimport { validationError } from '../../result/errors';\n\n/**\n * Immutable plain-object representation of a projection camera.\n */\nexport interface Camera {\n readonly position: Vec3;\n readonly direction: Vec3;\n readonly xAxis: Vec3;\n readonly yAxis: Vec3;\n}\n\n/**\n * Create a camera from position, direction, and an optional X-axis.\n *\n * If `xAxis` is omitted, it is derived automatically from the direction.\n *\n * @param position - Camera position in world coordinates.\n * @param direction - View direction (camera looks along this vector).\n * @param xAxis - Optional horizontal axis; derived automatically if not provided.\n * @returns `Result<Camera>` -- an error if direction is zero-length.\n */\nexport function createCamera(\n position: Vec3 = [0, 0, 0],\n direction: Vec3 = [0, 0, 1],\n xAxis?: Vec3\n): Result<Camera> {\n // Validate direction is not zero-length\n const dirLength = vecLength(direction);\n if (dirLength < 1e-12) {\n return err(\n validationError('CAMERA_ZERO_DIRECTION', 'Camera direction cannot be a zero-length vector')\n );\n }\n\n let resolvedXAxis: Vec3;\n if (xAxis) {\n resolvedXAxis = vecNormalize(xAxis);\n } else {\n // Derive xAxis from direction\n // Try crossing with Z-axis first, then Y-axis, then X-axis as fallbacks\n let cross = vecCross([0, 0, 1], direction);\n if (vecLength(cross) < 1e-12) {\n cross = vecCross([0, 1, 0], direction);\n }\n if (vecLength(cross) < 1e-12) {\n cross = vecCross([1, 0, 0], direction);\n }\n resolvedXAxis = vecNormalize(cross);\n }\n const yAxis = vecNormalize(vecCross(direction, resolvedXAxis));\n return ok({\n position,\n direction: vecNormalize(direction),\n xAxis: resolvedXAxis,\n yAxis,\n });\n}\n\n/**\n * Create a new camera oriented to look at a target point from the current position.\n *\n * @param camera - Existing camera whose position is preserved.\n * @param target - World-space point to look at.\n * @returns `Result<Camera>` with updated direction and derived axes.\n */\nexport function cameraLookAt(camera: Camera, target: Vec3): Result<Camera> {\n const direction = vecNormalize(vecSub(camera.position, target));\n return createCamera(camera.position, direction);\n}\n\n/**\n * Create a camera positioned at the origin, looking along a named projection plane.\n *\n * @param planeName - Named projection direction (e.g., `'front'`, `'top'`).\n * @returns `Result<Camera>` configured for that standard view.\n */\nexport function cameraFromPlane(planeName: ProjectionPlane): Result<Camera> {\n const config = PROJECTION_PLANES[planeName];\n return createCamera([0, 0, 0], config.dir, config.xAxis);\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared projection plane definitions used by cameraFns(faijs 视图投影,路径 A)。
|
|
3
|
+
*
|
|
4
|
+
* 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs
|
|
5
|
+
* `src/projection/projectionPlanes.ts`(同源复制,签名不变)。
|
|
6
|
+
*/
|
|
7
|
+
import type { Vec3 } from '../brepjs-compat/types.js';
|
|
8
|
+
/** Named face of an axis-aligned bounding cube. */
|
|
9
|
+
export type CubeFace = 'front' | 'back' | 'top' | 'bottom' | 'left' | 'right';
|
|
10
|
+
/** Named projection plane — axis pairs or cube face names. */
|
|
11
|
+
export type ProjectionPlane = 'XY' | 'XZ' | 'YZ' | 'YX' | 'ZX' | 'ZY' | 'front' | 'back' | 'top' | 'bottom' | 'left' | 'right';
|
|
12
|
+
/** Camera direction and X axis for a projection plane. */
|
|
13
|
+
export interface PlaneConfig {
|
|
14
|
+
readonly dir: Vec3;
|
|
15
|
+
readonly xAxis: Vec3;
|
|
16
|
+
}
|
|
17
|
+
/** Lookup table mapping each {@link ProjectionPlane} to its camera configuration. */
|
|
18
|
+
export declare const PROJECTION_PLANES: Record<ProjectionPlane, PlaneConfig>;
|
|
19
|
+
/** Type guard — check if a value is a valid {@link ProjectionPlane} name.
|
|
20
|
+
*
|
|
21
|
+
* @param plane - Value to test.
|
|
22
|
+
* @returns True if `plane` is a valid projection plane name.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isProjectionPlane(plane: unknown): plane is ProjectionPlane;
|
|
25
|
+
//# sourceMappingURL=projectionPlanes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectionPlanes.d.ts","sourceRoot":"","sources":["../../../src/api/view/projectionPlanes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,mDAAmD;AACnD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9E,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GACzB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnG,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,WAAW,CAclE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E"}
|