@faicad/faijs 0.16.1 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +4 -5
- package/NOTICE +5 -6
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +19 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.d.ts.map +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +2 -2
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +2 -2
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/lower.d.ts +1 -1
- package/dist/api/assembly/lower.d.ts.map +1 -1
- package/dist/api/assembly/lower.js.map +1 -1
- package/dist/api/assembly/pose.d.ts +3 -3
- package/dist/api/assembly/pose.d.ts.map +1 -1
- package/dist/api/assembly/pose.js +1 -1
- package/dist/api/assembly/pose.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.d.ts.map +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js +3 -3
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
- package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
- package/dist/api/assembly/solvers/assembly-tree.js +130 -0
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
- package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
- package/dist/api/assembly/solvers/chain-solver.js +330 -0
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
- package/dist/api/assembly/solvers/global-solver.js +2 -2
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
- package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
- package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
- package/dist/api/assembly/solvers/quat.d.ts +35 -0
- package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
- package/dist/api/assembly/solvers/quat.js +84 -0
- package/dist/api/assembly/solvers/quat.js.map +1 -0
- package/dist/api/assembly/solvers/types.d.ts +33 -0
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +3 -4
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
- package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/booleanFns.js +99 -0
- package/dist/api/brep-mirror/booleanFns.js.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
- package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-mirror/brepHelpers.js +131 -0
- package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
- package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
- package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/compoundFns.js +300 -0
- package/dist/api/brep-mirror/compoundFns.js.map +1 -0
- package/dist/api/brep-mirror/healingFns.d.ts +78 -0
- package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/healingFns.js +294 -0
- package/dist/api/brep-mirror/healingFns.js.map +1 -0
- package/dist/api/brep-mirror/hullFns.d.ts +20 -0
- package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/hullFns.js +46 -0
- package/dist/api/brep-mirror/hullFns.js.map +1 -0
- package/dist/api/brep-mirror/patternFns.d.ts +43 -0
- package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/patternFns.js +178 -0
- package/dist/api/brep-mirror/patternFns.js.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
- package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/primitiveFns.js +104 -0
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
- package/dist/api/brep-mirror/roofFns.d.ts +24 -0
- package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/roofFns.js +229 -0
- package/dist/api/brep-mirror/roofFns.js.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-mirror/straightSkeleton.js +443 -0
- package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
- package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
- package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/sweepFns.js +200 -0
- package/dist/api/brep-mirror/sweepFns.js.map +1 -0
- package/dist/api/brep-mirror/threadFns.d.ts +15 -0
- package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
- package/dist/api/brep-mirror/threadFns.js +37 -2
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
- package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-mirror/topologyFns.js +273 -0
- package/dist/api/brep-mirror/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +190 -0
- package/dist/api/brep-topology.d.ts.map +1 -0
- package/dist/api/brep-topology.js +337 -0
- package/dist/api/brep-topology.js.map +1 -0
- package/dist/api/brepjs-compat/constants.d.ts +11 -0
- package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
- package/dist/api/brepjs-compat/constants.js +11 -0
- package/dist/api/brepjs-compat/constants.js.map +1 -0
- package/dist/api/brepjs-compat/index.d.ts +19 -232
- package/dist/api/brepjs-compat/index.d.ts.map +1 -1
- package/dist/api/brepjs-compat/index.js +19 -286
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
- package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeOps.js +170 -0
- package/dist/api/brepjs-compat/planeOps.js.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
- package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
- package/dist/api/brepjs-compat/planeTypes.js +8 -0
- package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
- package/dist/api/brepjs-compat/types.d.ts +64 -0
- package/dist/api/brepjs-compat/types.d.ts.map +1 -0
- package/dist/api/brepjs-compat/types.js +48 -0
- package/dist/api/brepjs-compat/types.js.map +1 -0
- package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
- package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
- package/dist/api/brepjs-compat/vecOps.js +202 -0
- package/dist/api/brepjs-compat/vecOps.js.map +1 -0
- package/dist/api/chamfer.d.ts +5 -0
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +13 -8
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts.map +1 -1
- package/dist/api/compound-geom.js +8 -2
- package/dist/api/compound-geom.js.map +1 -1
- package/dist/api/draft.d.ts +69 -0
- package/dist/api/draft.d.ts.map +1 -0
- package/dist/api/draft.js +109 -0
- package/dist/api/draft.js.map +1 -0
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +2 -2
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +2 -3
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +28 -13
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +2 -2
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +137 -0
- package/dist/api/feature-repair.d.ts.map +1 -0
- package/dist/api/feature-repair.js +221 -0
- package/dist/api/feature-repair.js.map +1 -0
- package/dist/api/fillet-variable.d.ts +35 -0
- package/dist/api/fillet-variable.d.ts.map +1 -0
- package/dist/api/fillet-variable.js +71 -0
- package/dist/api/fillet-variable.js.map +1 -0
- package/dist/api/fillet.d.ts +3 -0
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +7 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +1 -13
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +6 -1
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/brepjs/index.d.ts +298 -298
- package/dist/api/generated/brepjs/index.d.ts.map +1 -1
- package/dist/api/generated/brepjs/index.js +183 -183
- package/dist/api/generated/brepjs/index.js.map +1 -1
- package/dist/api/generated/core.d.ts +3 -123
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +2 -81
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +1 -15
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +6 -3
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +1 -13
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +6 -1
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +1 -39
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +6 -4
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +53 -97
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +48 -143
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +1 -10
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +2 -10
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +65 -110
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +132 -80
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +1 -8
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +6 -4
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +1 -9
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +6 -1
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +2 -0
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +34 -22
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +52 -27
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +18 -4
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +4 -7
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +10 -8
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +1 -6
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +6 -3
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +77 -175
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +172 -131
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +2 -2
- package/dist/api/geom.js.map +1 -1
- package/dist/api/helix.d.ts +51 -0
- package/dist/api/helix.d.ts.map +1 -0
- package/dist/api/helix.js +63 -0
- package/dist/api/helix.js.map +1 -0
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +6 -2
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +18 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +29 -12
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +10 -0
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +9 -3
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +4 -4
- package/dist/api/internal/compat-projection.js +7 -7
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +75 -42
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +105 -50
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +31 -0
- package/dist/api/internal/profile-wire.d.ts.map +1 -0
- package/dist/api/internal/profile-wire.js +37 -0
- package/dist/api/internal/profile-wire.js.map +1 -0
- package/dist/api/internal/replica-role-table.js +2 -2
- package/dist/api/internal/replica-role-table.js.map +1 -1
- package/dist/api/loft.d.ts +66 -0
- package/dist/api/loft.d.ts.map +1 -0
- package/dist/api/loft.js +111 -0
- package/dist/api/loft.js.map +1 -0
- package/dist/api/measurement/index.d.ts +51 -0
- package/dist/api/measurement/index.d.ts.map +1 -0
- package/dist/api/measurement/index.js +71 -0
- package/dist/api/measurement/index.js.map +1 -0
- package/dist/api/occt-kernel-bridge.d.ts +5 -8
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +18 -14
- package/dist/api/occt-kernel-bridge.js.map +1 -1
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +3 -4
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.d.ts.map +1 -1
- package/dist/api/place.js +2 -4
- package/dist/api/place.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +3 -4
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +28 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +29 -19
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +6 -11
- package/dist/api/result.d.ts.map +1 -1
- package/dist/api/result.js +6 -11
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts.map +1 -1
- package/dist/api/revolve.js +15 -14
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +3 -0
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +9 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts +1 -1
- package/dist/api/section-by-plane.d.ts +42 -0
- package/dist/api/section-by-plane.d.ts.map +1 -0
- package/dist/api/section-by-plane.js +61 -0
- package/dist/api/section-by-plane.js.map +1 -0
- package/dist/api/shell.d.ts +45 -0
- package/dist/api/shell.d.ts.map +1 -0
- package/dist/api/shell.js +73 -0
- package/dist/api/shell.js.map +1 -0
- package/dist/api/sketch.d.ts +8 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +12 -7
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split-by-plane.d.ts +41 -0
- package/dist/api/split-by-plane.d.ts.map +1 -0
- package/dist/api/split-by-plane.js +60 -0
- package/dist/api/split-by-plane.js.map +1 -0
- package/dist/api/split.d.ts +6 -1
- package/dist/api/split.d.ts.map +1 -1
- package/dist/api/split.js +23 -9
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +22 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +723 -476
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +55 -0
- package/dist/api/sweep.d.ts.map +1 -0
- package/dist/api/sweep.js +86 -0
- package/dist/api/sweep.js.map +1 -0
- package/dist/api/thicken.d.ts +36 -0
- package/dist/api/thicken.d.ts.map +1 -0
- package/dist/api/thicken.js +55 -0
- package/dist/api/thicken.js.map +1 -0
- package/dist/api/transform.d.ts +8 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +15 -4
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +48 -0
- package/dist/api/view/cameraFns.d.ts.map +1 -0
- package/dist/api/view/cameraFns.js +75 -0
- package/dist/api/view/cameraFns.js.map +1 -0
- package/dist/api/view/projectionPlanes.d.ts +25 -0
- package/dist/api/view/projectionPlanes.d.ts.map +1 -0
- package/dist/api/view/projectionPlanes.js +30 -0
- package/dist/api/view/projectionPlanes.js.map +1 -0
- package/dist/api/view/view-camera.d.ts +2 -2
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +3 -3
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +9 -6
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +132 -65
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/wire.d.ts +45 -0
- package/dist/api/wire.d.ts.map +1 -0
- package/dist/api/wire.js +96 -0
- package/dist/api/wire.js.map +1 -0
- package/dist/boolean/creased-normals.d.ts +50 -0
- package/dist/boolean/creased-normals.d.ts.map +1 -0
- package/dist/boolean/creased-normals.js +114 -0
- package/dist/boolean/creased-normals.js.map +1 -0
- package/dist/boolean/deriveNormals.d.ts +4 -1
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +5 -2
- package/dist/boolean/deriveNormals.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +6 -0
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +11 -2
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +4 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +4 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +79 -59
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +7 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +15 -7
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +52 -167
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +93 -130
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +9 -7
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +14 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js +11 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts +3 -0
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +7 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +8 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +15 -3
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +20 -2
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +25 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +336 -144
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +5 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +32 -2
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +8 -2
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +3 -0
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +3 -1
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +18 -2
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +29 -1
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +3 -0
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +7 -0
- package/dist/env-agnostic.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +28 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +29 -1
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +6 -3
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +31 -0
- package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
- package/dist/occt-kernel/hullGeometry.js +319 -0
- package/dist/occt-kernel/hullGeometry.js.map +1 -0
- package/dist/occt-kernel/hullOps.d.ts +24 -0
- package/dist/occt-kernel/hullOps.d.ts.map +1 -0
- package/dist/occt-kernel/hullOps.js +52 -0
- package/dist/occt-kernel/hullOps.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts +14 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
- package/dist/occt-kernel/occt-primitives.js +351 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -0
- package/dist/occt-kernel/occtKernel.d.ts +14 -6
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +11 -3
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/topologyExt.js +2 -2
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/primitives/brep-primitives.d.ts +4 -0
- package/dist/primitives/brep-primitives.d.ts.map +1 -1
- package/dist/primitives/brep-primitives.js +4 -0
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +22 -0
- package/dist/result/bug.d.ts.map +1 -0
- package/dist/result/bug.js +28 -0
- package/dist/result/bug.js.map +1 -0
- package/dist/result/errors.d.ts +270 -0
- package/dist/result/errors.d.ts.map +1 -0
- package/dist/result/errors.js +317 -0
- package/dist/result/errors.js.map +1 -0
- package/dist/result/kernelErrorTranslation.d.ts +21 -0
- package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
- package/dist/result/kernelErrorTranslation.js +102 -0
- package/dist/result/kernelErrorTranslation.js.map +1 -0
- package/dist/result/result.d.ts +213 -0
- package/dist/result/result.d.ts.map +1 -0
- package/dist/result/result.js +336 -0
- package/dist/result/result.js.map +1 -0
- package/dist/result/vec3.d.ts +12 -0
- package/dist/result/vec3.d.ts.map +1 -0
- package/dist/result/vec3.js +14 -0
- package/dist/result/vec3.js.map +1 -0
- package/dist/runtime-state.d.ts +9 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +3 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +2 -1
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +43 -1
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +57 -1
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/geom-hint.js +1 -1
- package/dist/topology/naming/geom-hint.js.map +1 -1
- package/dist/topology/naming/score.js +1 -1
- package/dist/topology/naming/score.js.map +1 -1
- package/package.json +6 -16
package/dist/api/extrude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extrude.js","sourceRoot":"","sources":["../../src/api/extrude.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib extrude — `cad.extrude`(平台 parity op,BREP-only)\n *\n * 归属(分层红线):`cad.extrude` 是「面 → 棱柱」的**平台** op,FCStd Pad/Pocket\n * 链路与 TS 面共用它(docs/plans/2026-09-15-fcstd-to-faijs-port-plan.md M4.6:\n * 「原 `cad.fai_extrude` 路线废弃」)。up-to(拉伸到面 / 到支持体端面)属\n * CadQuery `until=` 同族语义,因此落在**本 op**;`fai_extrude`(`fai_` 前缀的\n * faijs 扩展 op,与 fai_drill / fai_split 同族)不得承载它。\n *\n * 为什么是手写 op 而不是继续用生成投影:生成投影\n * `compatOp(projectBrepOp('extrude', ['face','height'], 'A', vendoredExtrude))`\n * 有两个硬约束——\n * ① 参数表只有位置形参;D11 归一化只在「单 plain-object 形态」下按 params 表\n * 映射(api/internal/dual-form-args.ts),`(face, { upTo })` 属位置形态 →\n * 原样喂给 vendored extrude → 报错,无法表达对象形态;\n * ② compatOp 的入参先经 `borrowDeep` 借成 brepjs 视图(api/internal/compat-op.ts),\n * 在那一层 `brepOf()` 取不到 → 依赖 faceRef / brepOf / 内核直调的 up-to 实现\n * 必然走空(同 AGENTS.md 记录的「compatOp 自动提升边界」)。\n * 先例:arg-spec 的 `fillet` 条目(faijs 侧由手写 dual-op 覆盖,生成模块符号为\n * 孤儿 by design)。\n *\n * 长度形态**委托给生成投影**(`projectedExtrude`):vendored 仍是唯一拉伸引擎,\n * 既有 `cad.extrude(face, [x,y,z])` 语义零漂移。\n */\n\nimport { extrude as projectedExtrude } from './generated/operations'\nimport * as THREE from 'three'\nimport { solidToShape, matrixToArray } from '../brep/brep-ops'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf } from '../shape'\nimport { formatRoleName, semantic, wall } from '../topology/naming/role-name'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber } from './assert'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { FaceTopoRef } from '../topology/naming'\nimport { TopoRefError } from '../topology/naming'\n\n/**\n\n * extrude 的 construct 词汇表(计划 §4.4):`cap:bottom` / `cap:top` / `wall:<i>`。\n *\n * 判定口径:\n * - 拉伸方向取自一对平面端面法向的**带符号差**(两法向指向相反)——不依赖脚本\n * 怎么写方向,现场几何是唯一真值;\n * - 面法向与拉伸轴 |cos| ≈ 1 → 端面:中心沿轴分量小者 `cap:bottom`、大者 `cap:top`;\n * - 面法向与拉伸轴 |cos| ≈ 0 → 侧面 `wall:<i>`,i = 该面在侧面枚举中的相对序\n * (OCCT prism 的侧面顺序 = profile wire 的边序——makeWire 按构造顺序收边,\n * prism 不重排;G3-L1 改参重放依赖该稳定性);\n * - 非平面/无法向的面不进表:缺身份是显式状态(naming 行 role=null),不伪造。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the extruded solid.\n * @returns role(线格式串)→ hash 子表。\n */\nfunction extrudeConstructRoles(kernel: BrepEngineApi, solid: BrepHandle): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const faceHandles = kernel.getSubShapes(solid, 'face')\n try {\n const hashes = kernel.subShapeHashes(solid, 'face', 2147483647)\n // 每面的法向(仅平面;侧面可能是圆柱/其它——wall 只挂平面侧面的前提是\n // 直拉伸,斜面/圆柱侧面留待 3.1 的完整枚举器)\n const normals: (readonly [number, number, number] | undefined)[] = faceHandles.map((f) => {\n if (kernel.surfaceType(f) !== 'plane') return undefined\n const uv = kernel.uvBounds(f)\n const n = kernel.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z] as const\n })\n const centers = faceHandles.map((f) => {\n const c = kernel.getSurfaceCenterOfMass(f)\n return [c.x, c.y, c.z] as const\n })\n\n // 拉伸轴:找一对 |cos| ≈ 1 的反平行平面法向 → 带符号单位方向\n let axis: readonly [number, number, number] | undefined\n for (let i = 0; i < normals.length && !axis; i++) {\n const a = normals[i]\n if (!a) continue\n for (let j = i + 1; j < normals.length; j++) {\n const b = normals[j]\n if (!b) continue\n const lenA = Math.hypot(a[0], a[1], a[2])\n const lenB = Math.hypot(b[0], b[1], b[2])\n if (lenA < 1e-9 || lenB < 1e-9) continue\n const cos = (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]) / (lenA * lenB)\n if (Math.abs(cos) > 0.999) {\n // b 反向即「从 i 面指向 j 面」的方向\n axis = [b[0] - a[0], b[1] - a[1], b[2] - a[2]] as const\n break\n }\n }\n }\n const axisLen = axis ? Math.hypot(axis[0], axis[1], axis[2]) : 0\n if (axis && axisLen > 1e-9) {\n const ax: readonly [number, number, number] = [axis[0] / axisLen, axis[1] / axisLen, axis[2] / axisLen]\n // 端面:沿轴投影最小者 = cap:bottom,最大者 = cap:top\n const capCandidates: { idx: number; t: number }[] = []\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i]\n if (!n) continue\n const len = Math.hypot(n[0], n[1], n[2]) || 1\n const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len\n if (cos > 0.999) {\n capCandidates.push({ idx: i, t: centers[i]![0] * ax[0] + centers[i]![1] * ax[1] + centers[i]![2] * ax[2] })\n }\n }\n if (capCandidates.length >= 2) {\n capCandidates.sort((p, q) => p.t - q.t)\n const bottom = capCandidates[0]!\n const top = capCandidates[capCandidates.length - 1]!\n // 端面词汇用 semantic('bottom'/'top'——与 box 同形)。计划 §4.4 写的\n // `cap:<name>` 前缀形态与 RoleName 契约冲突(semantic 名不允许 ':',\n // role-name.ts SEMANTIC_NAME_RE),落地以契约为准:semantic 直名。\n if (hashes[bottom.idx] !== undefined) roles.set(formatRoleName(semantic('bottom')), [hashes[bottom.idx]!])\n if (hashes[top.idx] !== undefined) roles.set(formatRoleName(semantic('top')), [hashes[top.idx]!])\n }\n // 侧面:|cos| ≈ 0,按枚举序编号(= profile 边序)\n let wallIdx = 0\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i]\n if (!n || hashes[i] === undefined) continue\n const len = Math.hypot(n[0], n[1], n[2]) || 1\n const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len\n if (cos < 0.001) {\n roles.set(formatRoleName(wall(wallIdx)), [hashes[i]!])\n wallIdx++\n }\n }\n }\n return roles\n } finally {\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/** 显式平面目标(up-to 截断面):点 + 法向(点在平面上即可,无需共面于面边界)。 */\nexport interface UpToPlaneSpec {\n /** 平面上一点(世界坐标)。type:[x,y,z] */\n point: Vec3\n /** 平面法向(世界坐标,方向仅定半空间语义,截断取两侧之一)。type:[x,y,z] */\n normal: Vec3\n}\n\n/** up-to 目标:显式面引用 / 显式平面 / 支持体沿拉伸方向的远端(last)/近端(first)端面。 */\nexport type ExtrudeUpTo = FaceTopoRef | 'last' | 'first' | { plane: UpToPlaneSpec }\n\n/** `cad.extrude` 的对象形态参数(位置形态由 {@link normalizeExtrudeOptions} 归一到这里)。 */\nexport interface ExtrudeOptions {\n /** 拉伸量(mm,>0)。up-to 模式下无需给。 */\n length?: number\n /** 拉伸方向(世界坐标);缺省 [0,0,1]。 */\n normal?: Vec3\n /** 沿 normal 的前进方向;缺省 'forward'('backward' 等价于方向取反)。 */\n mode?: 'forward' | 'backward'\n /** 拉伸到面 / 到支持体端面;提供时忽略 length。 */\n upTo?: ExtrudeUpTo\n /** upTo 'last'/'first' 的支持体(累积支持体,由转换器显式传入)。 */\n baseFeature?: Shape\n /** 截断面沿其法向的偏移(mm);缺省 0。 */\n offset?: number\n}\n\n/** 判定是否为朴素对象(对象形态判别器,避免误吞 Shape / 数组)。 */\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 归一化 `cad.extrude` 的两种调用形态。\n *\n * - 位置形态(与生成投影同款,历史产物在用):`cad.extrude(face, 10)` /\n * `cad.extrude(face, [x,y,z])`——向量即「方向 × 长度」,恒为沿该方向前进。\n * - 对象形态(faijs 面):`cad.extrude(face, { length, normal, mode, upTo, ... })`。\n *\n * @param params - 调用点第二实参(数字 / 向量 / 对象)。\n * @returns 归一化后的对象形态参数。\n * @throws Error 参数既非数字 / 向量 / 朴素对象时(不猜)。\n */\nfunction normalizeExtrudeOptions(params: unknown): ExtrudeOptions {\n if (isPlainObject(params)) return params as ExtrudeOptions\n if (Array.isArray(params)) {\n const v = params as Vec3\n const len = Math.hypot(v[0] ?? 0, v[1] ?? 0, v[2] ?? 0)\n if (!Number.isFinite(len) || len < 1e-12) {\n throw new Error('E_EXTRUDE_ZERO_VECTOR: extrude direction vector has zero length')\n }\n return { length: len, normal: [v[0] / len, v[1] / len, v[2] / len], mode: 'forward' }\n }\n if (typeof params === 'number') return { length: params, normal: [0, 0, 1], mode: 'forward' }\n throw new Error('E_EXTRUDE_BAD_PARAMS: extrude expects (face, number | [x,y,z] | { length | upTo, ... })')\n}\n\n/**\n * 参数自校验:up-to 模式下无需 length;否则 length 必须为正数。\n *\n * @param o - 归一化后的参数。\n */\nfunction assertExtrudeOptions(o: ExtrudeOptions): void {\n if (o.upTo !== undefined) return // up-to 模式:长度由目标面决定\n assertPositiveNumber(o.length, 'extrude.length')\n}\n\n/** bbox 对角线长度(长试探的余量基数)。 */\nfunction bboxDiag(bbox: { min: Vec3; max: Vec3 }): number {\n return Math.hypot(bbox.max[0] - bbox.min[0], bbox.max[1] - bbox.min[1], bbox.max[2] - bbox.min[2])\n}\n\n/**\n * 目标面法向负侧的半空间覆盖盒(截断长拉伸用)——定向版。\n *\n * GOTCHA(PadTest Pad001 斜置基准面实测):轴对齐盒的边界不是斜面本身,\n * 截断呈台阶而非精确斜平面(体积 7076 vs 真值 4860)。正确做法:在局部基\n * (u, v, n) 里构造盒(深度沿 −n 伸出 R、横向 ±R),再用 kernel.transform\n * 旋到世界系——盒的 n=R 端面就是精确的目标平面。\n *\n * @param kernel - BREP 内核。\n * @param faceCenter - 目标面中心(世界坐标,盒的 n=0 端面过此点)。\n * @param faceNormal - 目标面法向(半空间保留 −n 侧…即盒占据 −n 侧深度)。\n * @param reach - 覆盖半径 R。\n * @returns 定向半空间盒的 brep 句柄。\n */\nfunction farSideBox(kernel: BrepEngineApi, faceCenter: Vec3, faceNormal: Vec3, reach: number): BrepHandle {\n const unit = new THREE.Vector3(...faceNormal).normalize()\n const center = new THREE.Vector3(...faceCenter)\n // 与 n 正交的正交基 u,v\n const aux = Math.abs(unit.y) < 0.9 ? new THREE.Vector3(0, 1, 0) : new THREE.Vector3(1, 0, 0)\n const u = new THREE.Vector3().crossVectors(unit, aux).normalize()\n const v = new THREE.Vector3().crossVectors(unit, u).normalize()\n const R = reach\n // 局部系盒:x∈[−R,R] (u), y∈[−R,R] (v), z∈[−R,0] (n 深度侧)\n const box = kernel.makeBoxFromCorners(\n { x: -R, y: -R, z: -R },\n { x: R, y: R, z: 0 },\n )\n // 旋转矩阵:列 = u, v, n;平移 = center(局部 z=0 端面落到过 center 的目标平面)\n const m = new THREE.Matrix4().makeBasis(u, v, unit).setPosition(center)\n return kernel.transform(box, matrixToArray(m))\n}\n\n/**\n * up-to 拉伸:occt-wasm 未暴露 `BRepFeat_MakePrism`,用「长拉伸 → 与目标面侧\n * 半空间盒求交」等价组合;长试探上限只作布尔构造辅助,不进入结果几何。\n *\n * @param kernel - BREP 内核。\n * @param inputSolid - 轮廓实体句柄。\n * @param o - 归一化参数(需带 upTo)。\n * @returns 截断后的实体句柄。\n * @throws Error E_UP_TO_* 系列:缺支持体 / 方向与目标面平行 / 不相交(禁静默)。\n */\nfunction extrudeUpToSolid(kernel: BrepEngineApi, inputSolid: BrepHandle, o: ExtrudeOptions): BrepHandle {\n const normal = new THREE.Vector3(...(o.normal ?? [0, 0, 1])).normalize()\n const offset = o.offset ?? 0\n const upTo = o.upTo as ExtrudeUpTo\n\n // 1) 方向目标:FaceTopoRef → 现场面几何;'last'/'first' → baseFeature 支持体\n // 沿拉伸方向的端面(远端 last / 近端 first)。\n let targetCenter: Vec3\n let targetNormal: Vec3\n if (typeof upTo === 'string') {\n const base = o.baseFeature\n const baseSolid = base ? (brepOf(base) as BrepHandle | undefined) : undefined\n if (!baseSolid) {\n throw new Error('E_UP_TO_NO_BASE: upTo \"last\"/\"first\" requires a baseFeature shape')\n }\n // 支持体 bbox 沿拉伸方向的远端/近端平面(R-C:baseFeature 显式传参)\n const bbox = getSolidBoundingBox(kernel, baseSolid)\n const pick = (which: 'max' | 'min'): Vec3 => {\n const c: Vec3 = [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n const extent = which === 'max' ? 1 : -1\n const proj =\n (bbox.max[0] - bbox.min[0]) * Math.abs(normal.x) +\n (bbox.max[1] - bbox.min[1]) * Math.abs(normal.y) +\n (bbox.max[2] - bbox.min[2]) * Math.abs(normal.z)\n return [\n c[0] + ((normal.x * proj) / 2) * extent,\n c[1] + ((normal.y * proj) / 2) * extent,\n c[2] + ((normal.z * proj) / 2) * extent,\n ]\n }\n targetCenter = pick(upTo === 'last' ? 'max' : 'min')\n targetNormal = [normal.x, normal.y, normal.z]\n } else if (upTo && typeof upTo === 'object' && 'plane' in upTo) {\n // 显式平面目标(datum plane 等无限平面:截断面由平面方程决定,不受\n // 目标面边界限制——斜置基准面时顶面是斜的,定长路径语义错误)。\n targetCenter = [...upTo.plane.point] as Vec3\n targetNormal = [...upTo.plane.normal] as Vec3\n } else {\n // GOTCHA(探针实测):FaceTopoRef 携带的 hint 是 faceRef 现场捕获的\n // center/normal 快照,直接使用;不要对拉伸轮廓(sketch 面)做二次\n // resolveFaceGeometry——引用的面在目标体上、不在轮廓上,会 E_TOPO_NOT_FOUND。\n if (upTo.hint.center && upTo.hint.normal) {\n targetCenter = [...upTo.hint.center] as Vec3\n targetNormal = [...upTo.hint.normal] as Vec3\n } else {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'extrude upTo: face ref hint has no center/normal snapshot')\n }\n }\n\n // 2) 长试探长度:GOTCHA(探针实测)——不能按轮廓自身 bbox 对角线算(小轮廓够不到\n // 远处目标面);必须取「截断平面沿拉伸方向的投影距离」加余量,保证长拉伸至\n // 少穿过目标面。\n const bbox = getSolidBoundingBox(kernel, inputSolid)\n const shiftedCenter0: Vec3 = [\n targetCenter[0] + targetNormal[0] * offset,\n targetCenter[1] + targetNormal[1] * offset,\n targetCenter[2] + targetNormal[2] * offset,\n ]\n // 自动定向(仅 { plane } 目标):FreeCAD UpToFace 朝目标面所在方向拉伸。\n // GOTCHA(PadTest Pad001 实测,probe 探针):斜置基准面在草图局部坐标里\n // 位于轮廓的反方向(圆心处平面交点 t=−26 而非 +26),固定沿 +Z 拉截不到\n // 平面(体积 597 ≠ 真值 4860)。轮廓 bbox 中心到截断平面的有向投影与\n // 拉伸方向异号 → 翻转拉伸方向(就地翻转 Vector3,后续 tMax/keepSide 自洽)。\n if (upTo && typeof upTo === 'object' && 'plane' in upTo) {\n const c0: Vec3 = [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n const tnAuto = new THREE.Vector3(...targetNormal).normalize()\n const dAuto =\n (c0[0] - shiftedCenter0[0]) * tnAuto.x +\n (c0[1] - shiftedCenter0[1]) * tnAuto.y +\n (c0[2] - shiftedCenter0[2]) * tnAuto.z\n // 沿拉伸方向到平面的有向交点参数:t = −((c0−plane)·n) / (dir·n)。\n // t<0 → 平面在行进反方向 → 翻转(FreeCAD UpToFace 朝平面拉伸)。\n const tAuto = -dAuto / normal.dot(tnAuto)\n if (tAuto < 0) {\n normal.multiplyScalar(-1)\n }\n }\n const cornerProjections = [\n [bbox.min[0], bbox.min[1], bbox.min[2]],\n [bbox.max[0], bbox.min[1], bbox.min[2]],\n [bbox.min[0], bbox.max[1], bbox.min[2]],\n [bbox.min[0], bbox.min[1], bbox.max[2]],\n [bbox.max[0], bbox.max[1], bbox.min[2]],\n [bbox.max[0], bbox.min[1], bbox.max[2]],\n [bbox.min[0], bbox.max[1], bbox.max[2]],\n [bbox.max[0], bbox.max[1], bbox.max[2]],\n ] as Vec3[]\n const planePoint0 = new THREE.Vector3(...shiftedCenter0)\n const tn0 = new THREE.Vector3(...targetNormal).normalize()\n const planeD = planePoint0.dot(tn0)\n const dirD = normal.dot(tn0)\n if (Math.abs(dirD) < 1e-9) {\n throw new Error('E_UP_TO_PARALLEL: extrude direction is parallel to the target face plane')\n }\n const tMax = cornerProjections\n .map((p) => (planeD - new THREE.Vector3(...p).dot(tn0)) / dirD)\n .reduce((a, b) => Math.max(a, b), 0)\n const L = tMax + Math.abs(offset) + bboxDiag(bbox) * 0.1 + 1\n const longSolid = kernel.extrude(inputSolid, normal.x * L, normal.y * L, normal.z * L)\n\n // 3) 截断平面 = 目标面 + offset(沿面法向)。GOTCHA(探针实测):半空间侧不能固定\n // 取「法向负侧」——目标面法向朝向与拉伸方向无必然关系。正确语义:保留「包含\n // 拉伸起点」的那一侧。farSideBox 覆盖「传入法向的反侧」,因此传 -keepSide。\n const tn = tn0\n const startCenter = new THREE.Vector3(\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n )\n const planePoint = new THREE.Vector3(...shiftedCenter0)\n const d = startCenter.sub(planePoint).dot(tn)\n // 保留侧法向:起点所在侧(d 与 tn 同号 → 正侧;异号 → 负侧);d≈0 时退化为\n // 拉伸方向(起点在面上时按拉伸方向截)\n const keepSide = Math.abs(d) < 1e-9 ? normal.clone() : tn.clone().multiplyScalar(Math.sign(d))\n // GOTCHA(PadTest Pad001 斜置基准面实测):targetCenter 可以是平面上离轮廓\n // 很远的任意一点(基准面 point 在草图局部坐标里横向偏 ~100),reach 若只取\n // L(按轮廓到截断面的投影距离)则半空间盒横向盖不住长拉伸体 → common 为空。\n // reach 必须 ≥ 平面点到拉伸体的距离 + 体对角线(全方向覆盖)。\n const reach =\n new THREE.Vector3(...shiftedCenter0).distanceTo(\n new THREE.Vector3((bbox.min[0] + bbox.max[0]) / 2, (bbox.min[1] + bbox.max[1]) / 2, (bbox.min[2] + bbox.max[2]) / 2),\n ) + bboxDiag(bbox) + Math.abs(offset) + 1\n const halfspace = farSideBox(kernel, shiftedCenter0, [-keepSide.x, -keepSide.y, -keepSide.z], reach)\n\n // 4) 求交:长拉伸 ∩ 半空间盒\n const clipped = kernel.common(longSolid, halfspace)\n kernel.release(longSolid)\n kernel.release(halfspace)\n\n // 预检:方向上不相交 → 显式报错(禁静默)\n const clippedBBox = getSolidBoundingBox(kernel, clipped)\n if (!Number.isFinite(bboxDiag(clippedBBox)) || bboxDiag(clippedBBox) < 1e-9) {\n kernel.release(clipped)\n throw new Error('E_UP_TO_NO_INTERSECTION: extrude direction does not reach the target face')\n }\n return clipped\n}\n\n/**\n * 沿 normal 拉伸几何(面 → 棱柱)。\n *\n * up-to 模式(`upTo`)与长度模式(`length`)二选一;长度模式委托生成投影\n * (vendored extrude 为唯一引擎),up-to 模式走半空间组合。\n *\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name extrude\n * @returns Shape 拉伸后的几何。\n * @param input - 目标几何(平面面)。type:Shape required:true\n * @param params.length - 总拉伸量(mm,>0)。up-to 模式下无需给。type:number\n * @param params.normal - 拉伸方向(世界坐标)。type:[x,y,z] 默认 [0,0,1]\n * @param params.mode - 沿 normal 的前进方向:forward 正向 / backward 反向。type:'forward' | 'backward' 默认 'forward'\n * @param params.upTo - 拉伸到面:FaceTopoRef 指定面 / 'last' 支持体远端面 / 'first' 近端面(需 baseFeature)。提供时忽略 length。type:'last' | 'first' | FaceTopoRef\n * @param params.baseFeature - upTo 'last'/'first' 的支持体几何(累积支持体)。type:Shape\n * @param params.offset - 截断面沿其法向的偏移(mm)。type:number 默认 0\n * @example\n * const p = await cad.extrude(part0, [0, 0, 10])\n * const p = await cad.extrude(part0, { length: 10 })\n * const p = await cad.extrude(sk, { upTo: cad.faceRef(part0, 3) })\n * const p = await cad.extrude(sk, { upTo: 'last', baseFeature: part0 })\n */\nexport const extrude = defineOp({\n name: 'extrude',\n brep: async (input: Shape, params: unknown): Promise<Shape> => {\n if (!input) throw new Error('[stdlib/extrude] no input geometry')\n const o = normalizeExtrudeOptions(params)\n assertExtrudeOptions(o)\n\n if (o.upTo !== undefined) {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/extrude] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/extrude] input is not BREP')\n const clipped = extrudeUpToSolid(kernel, inputSolid, o)\n // 3.2: inlined registerExtrudeRoles — origin = StmtId, roles from construct enumerator\n const origin = String(getCurrentStmt()?.id ?? '')\n return fromBrep(solidToShape(kernel, clipped), {\n solid: clipped,\n roleTable: new Map([[origin, extrudeConstructRoles(kernel, clipped)]]),\n })\n }\n\n // 长度形态:委托生成投影(生成投影自带借入 / Result 翻转 / 收养)\n const normal = new THREE.Vector3(...(o.normal ?? [0, 0, 1])).normalize()\n const sign = o.mode === 'backward' ? -1 : 1\n const v: Vec3 = [normal.x * o.length! * sign, normal.y * o.length! * sign, normal.z * o.length! * sign]\n const result = (await projectedExtrude(input, v)) as Shape\n // E3 后续:委托路径同样要建链根表(投影只给几何,命名是 faijs 语义)。\n // 3.2: inlined registerExtrudeRoles — origin = StmtId, roles from construct enumerator\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n const solid = kernel ? (brepOf(result) as BrepHandle | undefined) : undefined\n if (kernel && solid) {\n const origin = String(getCurrentStmt()?.id ?? '')\n return fromBrep(solidToShape(kernel, solid), {\n solid,\n roleTable: new Map([[origin, extrudeConstructRoles(kernel, solid)]]),\n })\n }\n return result\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'wall', index: 0 }] } } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"extrude.js","sourceRoot":"","sources":["../../src/api/extrude.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib extrude — `cad.extrude`(平台 parity op,BREP-only)\n *\n * 归属(分层红线):`cad.extrude` 是「面 → 棱柱」的**平台** op,FCStd Pad/Pocket\n * 链路与 TS 面共用它(docs/plans/2026-09-15-fcstd-to-faijs-port-plan.md M4.6:\n * 「原 `cad.fai_extrude` 路线废弃」)。up-to(拉伸到面 / 到支持体端面)属\n * CadQuery `until=` 同族语义,因此落在**本 op**;`fai_extrude`(`fai_` 前缀的\n * faijs 扩展 op,与 fai_drill / fai_split 同族)不得承载它。\n *\n * 为什么是手写 op 而不是继续用生成投影:生成投影\n * `compatOp(projectBrepOp('extrude', ['face','height'], 'A', vendoredExtrude))`\n * 有两个硬约束——\n * ① 参数表只有位置形参;D11 归一化只在「单 plain-object 形态」下按 params 表\n * 映射(api/internal/dual-form-args.ts),`(face, { upTo })` 属位置形态 →\n * 原样喂给 vendored extrude → 报错,无法表达对象形态;\n * ② compatOp 的入参先经 `borrowDeep` 借成 brepjs 视图(api/internal/compat-op.ts),\n * 在那一层 `brepOf()` 取不到 → 依赖 faceRef / brepOf / 内核直调的 up-to 实现\n * 必然走空(同 AGENTS.md 记录的「compatOp 自动提升边界」)。\n * 先例:arg-spec 的 `fillet` 条目(faijs 侧由手写 dual-op 覆盖,生成模块符号为\n * 孤儿 by design)。\n *\n * 长度形态**委托给生成投影**(`projectedExtrude`):vendored 仍是唯一拉伸引擎,\n * 既有 `cad.extrude(face, [x,y,z])` 语义零漂移。\n */\n\nimport { extrude as projectedExtrude } from './generated/operations'\nimport * as THREE from 'three'\nimport { solidToShape, matrixToArray } from '../brep/brep-ops'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { getCurrentStmt } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf, isCurveShape } from '../shape'\nimport { runtimeLineage } from '../topology/naming/lineage'\nimport { formatRoleName, semantic, wall } from '../topology/naming/role-name'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport { assertPositiveNumber } from './assert'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { FaceTopoRef } from '../topology/naming'\nimport { TopoRefError } from '../topology/naming'\n\n/**\n\n * extrude 的 construct 词汇表(计划 §4.4):`cap:bottom` / `cap:top` / `wall:<i>`。\n *\n * 判定口径:\n * - 拉伸方向取自一对平面端面法向的**带符号差**(两法向指向相反)——不依赖脚本\n * 怎么写方向,现场几何是唯一真值;\n * - 面法向与拉伸轴 |cos| ≈ 1 → 端面:中心沿轴分量小者 `cap:bottom`、大者 `cap:top`;\n * - 面法向与拉伸轴 |cos| ≈ 0 → 侧面 `wall:<i>`,i = 该面在侧面枚举中的相对序\n * (OCCT prism 的侧面顺序 = profile wire 的边序——makeWire 按构造顺序收边,\n * prism 不重排;G3-L1 改参重放依赖该稳定性);\n * - 非平面/无法向的面不进表:缺身份是显式状态(naming 行 role=null),不伪造。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the extruded solid.\n * @returns role(线格式串)→ hash 子表。\n */\nfunction extrudeConstructRoles(kernel: BrepEngineApi, solid: BrepHandle): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const faceHandles = kernel.getSubShapes(solid, 'face')\n try {\n const hashes = kernel.subShapeHashes(solid, 'face', 2147483647)\n // 每面的法向(仅平面;侧面可能是圆柱/其它——wall 只挂平面侧面的前提是\n // 直拉伸,斜面/圆柱侧面留待 3.1 的完整枚举器)\n const normals: (readonly [number, number, number] | undefined)[] = faceHandles.map((f) => {\n if (kernel.surfaceType(f) !== 'plane') return undefined\n const uv = kernel.uvBounds(f)\n const n = kernel.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z] as const\n })\n const centers = faceHandles.map((f) => {\n const c = kernel.surfaceCenterOfMass(f)\n return [c.x, c.y, c.z] as const\n })\n\n // 拉伸轴:找一对 |cos| ≈ 1 的反平行平面法向 → 带符号单位方向\n let axis: readonly [number, number, number] | undefined\n for (let i = 0; i < normals.length && !axis; i++) {\n const a = normals[i]\n if (!a) continue\n for (let j = i + 1; j < normals.length; j++) {\n const b = normals[j]\n if (!b) continue\n const lenA = Math.hypot(a[0], a[1], a[2])\n const lenB = Math.hypot(b[0], b[1], b[2])\n if (lenA < 1e-9 || lenB < 1e-9) continue\n const cos = (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]) / (lenA * lenB)\n if (Math.abs(cos) > 0.999) {\n // b 反向即「从 i 面指向 j 面」的方向\n axis = [b[0] - a[0], b[1] - a[1], b[2] - a[2]] as const\n break\n }\n }\n }\n const axisLen = axis ? Math.hypot(axis[0], axis[1], axis[2]) : 0\n if (axis && axisLen > 1e-9) {\n const ax: readonly [number, number, number] = [axis[0] / axisLen, axis[1] / axisLen, axis[2] / axisLen]\n // 端面:沿轴投影最小者 = cap:bottom,最大者 = cap:top\n const capCandidates: { idx: number; t: number }[] = []\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i]\n if (!n) continue\n const len = Math.hypot(n[0], n[1], n[2]) || 1\n const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len\n if (cos > 0.999) {\n capCandidates.push({ idx: i, t: centers[i]![0] * ax[0] + centers[i]![1] * ax[1] + centers[i]![2] * ax[2] })\n }\n }\n if (capCandidates.length >= 2) {\n capCandidates.sort((p, q) => p.t - q.t)\n const bottom = capCandidates[0]!\n const top = capCandidates[capCandidates.length - 1]!\n // 端面词汇用 semantic('bottom'/'top'——与 box 同形)。计划 §4.4 写的\n // `cap:<name>` 前缀形态与 RoleName 契约冲突(semantic 名不允许 ':',\n // role-name.ts SEMANTIC_NAME_RE),落地以契约为准:semantic 直名。\n if (hashes[bottom.idx] !== undefined) roles.set(formatRoleName(semantic('bottom')), [hashes[bottom.idx]!])\n if (hashes[top.idx] !== undefined) roles.set(formatRoleName(semantic('top')), [hashes[top.idx]!])\n }\n // 侧面:|cos| ≈ 0,按枚举序编号(= profile 边序)\n let wallIdx = 0\n for (let i = 0; i < normals.length; i++) {\n const n = normals[i]\n if (!n || hashes[i] === undefined) continue\n const len = Math.hypot(n[0], n[1], n[2]) || 1\n const cos = Math.abs(n[0] * ax[0] + n[1] * ax[1] + n[2] * ax[2]) / len\n if (cos < 0.001) {\n roles.set(formatRoleName(wall(wallIdx)), [hashes[i]!])\n wallIdx++\n }\n }\n }\n return roles\n } finally {\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/** 显式平面目标(up-to 截断面):点 + 法向(点在平面上即可,无需共面于面边界)。 */\nexport interface UpToPlaneSpec {\n /** 平面上一点(世界坐标)。type:[x,y,z] */\n point: Vec3\n /** 平面法向(世界坐标,方向仅定半空间语义,截断取两侧之一)。type:[x,y,z] */\n normal: Vec3\n}\n\n/** up-to 目标:显式面引用 / 显式平面 / 支持体沿拉伸方向的远端(last)/近端(first)端面。 */\nexport type ExtrudeUpTo = FaceTopoRef | 'last' | 'first' | { plane: UpToPlaneSpec }\n\n/** `cad.extrude` 的对象形态参数(位置形态由 {@link normalizeExtrudeOptions} 归一到这里)。 */\nexport interface ExtrudeOptions {\n /** 拉伸量(mm,>0)。up-to 模式下无需给。 */\n length?: number\n /** 拉伸方向(世界坐标);缺省 [0,0,1]。 */\n normal?: Vec3\n /** 沿 normal 的前进方向;缺省 'forward'('backward' 等价于方向取反)。 */\n mode?: 'forward' | 'backward'\n /** 拉伸到面 / 到支持体端面;提供时忽略 length。 */\n upTo?: ExtrudeUpTo\n /** upTo 'last'/'first' 的支持体(累积支持体,由转换器显式传入)。 */\n baseFeature?: Shape\n /** 截断面沿其法向的偏移(mm);缺省 0。 */\n offset?: number\n}\n\n/** 判定是否为朴素对象(对象形态判别器,避免误吞 Shape / 数组)。 */\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 归一化 `cad.extrude` 的两种调用形态。\n *\n * - 位置形态(与生成投影同款,历史产物在用):`cad.extrude(face, 10)` /\n * `cad.extrude(face, [x,y,z])`——向量即「方向 × 长度」,恒为沿该方向前进。\n * - 对象形态(faijs 面):`cad.extrude(face, { length, normal, mode, upTo, ... })`。\n *\n * @param params - 调用点第二实参(数字 / 向量 / 对象)。\n * @returns 归一化后的对象形态参数。\n * @throws Error 参数既非数字 / 向量 / 朴素对象时(不猜)。\n */\nfunction normalizeExtrudeOptions(params: unknown): ExtrudeOptions {\n if (isPlainObject(params)) return params as ExtrudeOptions\n if (Array.isArray(params)) {\n const v = params as Vec3\n const len = Math.hypot(v[0] ?? 0, v[1] ?? 0, v[2] ?? 0)\n if (!Number.isFinite(len) || len < 1e-12) {\n throw new Error('E_EXTRUDE_ZERO_VECTOR: extrude direction vector has zero length')\n }\n return { length: len, normal: [v[0] / len, v[1] / len, v[2] / len], mode: 'forward' }\n }\n if (typeof params === 'number') return { length: params, normal: [0, 0, 1], mode: 'forward' }\n throw new Error('E_EXTRUDE_BAD_PARAMS: extrude expects (face, number | [x,y,z] | { length | upTo, ... })')\n}\n\n/**\n * 参数自校验:up-to 模式下无需 length;否则 length 必须为正数。\n *\n * @param o - 归一化后的参数。\n */\nfunction assertExtrudeOptions(o: ExtrudeOptions): void {\n if (o.upTo !== undefined) return // up-to 模式:长度由目标面决定\n assertPositiveNumber(o.length, 'extrude.length')\n}\n\n/** bbox 对角线长度(长试探的余量基数)。 */\nfunction bboxDiag(bbox: { min: Vec3; max: Vec3 }): number {\n return Math.hypot(bbox.max[0] - bbox.min[0], bbox.max[1] - bbox.min[1], bbox.max[2] - bbox.min[2])\n}\n\n/**\n * 目标面法向负侧的半空间覆盖盒(截断长拉伸用)——定向版。\n *\n * GOTCHA(PadTest Pad001 斜置基准面实测):轴对齐盒的边界不是斜面本身,\n * 截断呈台阶而非精确斜平面(体积 7076 vs 真值 4860)。正确做法:在局部基\n * (u, v, n) 里构造盒(深度沿 −n 伸出 R、横向 ±R),再用 kernel.transform\n * 旋到世界系——盒的 n=R 端面就是精确的目标平面。\n *\n * @param kernel - BREP 内核。\n * @param faceCenter - 目标面中心(世界坐标,盒的 n=0 端面过此点)。\n * @param faceNormal - 目标面法向(半空间保留 −n 侧…即盒占据 −n 侧深度)。\n * @param reach - 覆盖半径 R。\n * @returns 定向半空间盒的 brep 句柄。\n */\nfunction farSideBox(kernel: BrepEngineApi, faceCenter: Vec3, faceNormal: Vec3, reach: number): BrepHandle {\n const unit = new THREE.Vector3(...faceNormal).normalize()\n const center = new THREE.Vector3(...faceCenter)\n // 与 n 正交的正交基 u,v\n const aux = Math.abs(unit.y) < 0.9 ? new THREE.Vector3(0, 1, 0) : new THREE.Vector3(1, 0, 0)\n const u = new THREE.Vector3().crossVectors(unit, aux).normalize()\n const v = new THREE.Vector3().crossVectors(unit, u).normalize()\n const R = reach\n // 局部系盒:x∈[−R,R] (u), y∈[−R,R] (v), z∈[−R,0] (n 深度侧)\n const box = kernel.makeBoxFromCorners(\n { x: -R, y: -R, z: -R },\n { x: R, y: R, z: 0 },\n )\n // 旋转矩阵:列 = u, v, n;平移 = center(局部 z=0 端面落到过 center 的目标平面)\n const m = new THREE.Matrix4().makeBasis(u, v, unit).setPosition(center)\n return kernel.transform(box, matrixToArray(m))\n}\n\n/**\n * up-to 拉伸:occt-wasm 未暴露 `BRepFeat_MakePrism`,用「长拉伸 → 与目标面侧\n * 半空间盒求交」等价组合;长试探上限只作布尔构造辅助,不进入结果几何。\n *\n * @param kernel - BREP 内核。\n * @param inputSolid - 轮廓实体句柄。\n * @param o - 归一化参数(需带 upTo)。\n * @returns 截断后的实体句柄。\n * @throws Error E_UP_TO_* 系列:缺支持体 / 方向与目标面平行 / 不相交(禁静默)。\n */\nfunction extrudeUpToSolid(kernel: BrepEngineApi, inputSolid: BrepHandle, o: ExtrudeOptions): BrepHandle {\n const normal = new THREE.Vector3(...(o.normal ?? [0, 0, 1])).normalize()\n const offset = o.offset ?? 0\n const upTo = o.upTo as ExtrudeUpTo\n\n // 1) 方向目标:FaceTopoRef → 现场面几何;'last'/'first' → baseFeature 支持体\n // 沿拉伸方向的端面(远端 last / 近端 first)。\n let targetCenter: Vec3\n let targetNormal: Vec3\n if (typeof upTo === 'string') {\n const base = o.baseFeature\n const baseSolid = base ? (brepOf(base) as BrepHandle | undefined) : undefined\n if (!baseSolid) {\n throw new Error('E_UP_TO_NO_BASE: upTo \"last\"/\"first\" requires a baseFeature shape')\n }\n // 支持体 bbox 沿拉伸方向的远端/近端平面(R-C:baseFeature 显式传参)\n const bbox = getSolidBoundingBox(kernel, baseSolid)\n const pick = (which: 'max' | 'min'): Vec3 => {\n const c: Vec3 = [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n const extent = which === 'max' ? 1 : -1\n const proj =\n (bbox.max[0] - bbox.min[0]) * Math.abs(normal.x) +\n (bbox.max[1] - bbox.min[1]) * Math.abs(normal.y) +\n (bbox.max[2] - bbox.min[2]) * Math.abs(normal.z)\n return [\n c[0] + ((normal.x * proj) / 2) * extent,\n c[1] + ((normal.y * proj) / 2) * extent,\n c[2] + ((normal.z * proj) / 2) * extent,\n ]\n }\n targetCenter = pick(upTo === 'last' ? 'max' : 'min')\n targetNormal = [normal.x, normal.y, normal.z]\n } else if (upTo && typeof upTo === 'object' && 'plane' in upTo) {\n // 显式平面目标(datum plane 等无限平面:截断面由平面方程决定,不受\n // 目标面边界限制——斜置基准面时顶面是斜的,定长路径语义错误)。\n targetCenter = [...upTo.plane.point] as Vec3\n targetNormal = [...upTo.plane.normal] as Vec3\n } else {\n // GOTCHA(探针实测):FaceTopoRef 携带的 hint 是 faceRef 现场捕获的\n // center/normal 快照,直接使用;不要对拉伸轮廓(sketch 面)做二次\n // resolveFaceGeometry——引用的面在目标体上、不在轮廓上,会 E_TOPO_NOT_FOUND。\n if (upTo.hint.center && upTo.hint.normal) {\n targetCenter = [...upTo.hint.center] as Vec3\n targetNormal = [...upTo.hint.normal] as Vec3\n } else {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'extrude upTo: face ref hint has no center/normal snapshot')\n }\n }\n\n // 2) 长试探长度:GOTCHA(探针实测)——不能按轮廓自身 bbox 对角线算(小轮廓够不到\n // 远处目标面);必须取「截断平面沿拉伸方向的投影距离」加余量,保证长拉伸至\n // 少穿过目标面。\n const bbox = getSolidBoundingBox(kernel, inputSolid)\n const shiftedCenter0: Vec3 = [\n targetCenter[0] + targetNormal[0] * offset,\n targetCenter[1] + targetNormal[1] * offset,\n targetCenter[2] + targetNormal[2] * offset,\n ]\n // 自动定向(仅 { plane } 目标):FreeCAD UpToFace 朝目标面所在方向拉伸。\n // GOTCHA(PadTest Pad001 实测,probe 探针):斜置基准面在草图局部坐标里\n // 位于轮廓的反方向(圆心处平面交点 t=−26 而非 +26),固定沿 +Z 拉截不到\n // 平面(体积 597 ≠ 真值 4860)。轮廓 bbox 中心到截断平面的有向投影与\n // 拉伸方向异号 → 翻转拉伸方向(就地翻转 Vector3,后续 tMax/keepSide 自洽)。\n if (upTo && typeof upTo === 'object' && 'plane' in upTo) {\n const c0: Vec3 = [\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n ]\n const tnAuto = new THREE.Vector3(...targetNormal).normalize()\n const dAuto =\n (c0[0] - shiftedCenter0[0]) * tnAuto.x +\n (c0[1] - shiftedCenter0[1]) * tnAuto.y +\n (c0[2] - shiftedCenter0[2]) * tnAuto.z\n // 沿拉伸方向到平面的有向交点参数:t = −((c0−plane)·n) / (dir·n)。\n // t<0 → 平面在行进反方向 → 翻转(FreeCAD UpToFace 朝平面拉伸)。\n const tAuto = -dAuto / normal.dot(tnAuto)\n if (tAuto < 0) {\n normal.multiplyScalar(-1)\n }\n }\n const cornerProjections = [\n [bbox.min[0], bbox.min[1], bbox.min[2]],\n [bbox.max[0], bbox.min[1], bbox.min[2]],\n [bbox.min[0], bbox.max[1], bbox.min[2]],\n [bbox.min[0], bbox.min[1], bbox.max[2]],\n [bbox.max[0], bbox.max[1], bbox.min[2]],\n [bbox.max[0], bbox.min[1], bbox.max[2]],\n [bbox.min[0], bbox.max[1], bbox.max[2]],\n [bbox.max[0], bbox.max[1], bbox.max[2]],\n ] as Vec3[]\n const planePoint0 = new THREE.Vector3(...shiftedCenter0)\n const tn0 = new THREE.Vector3(...targetNormal).normalize()\n const planeD = planePoint0.dot(tn0)\n const dirD = normal.dot(tn0)\n if (Math.abs(dirD) < 1e-9) {\n throw new Error('E_UP_TO_PARALLEL: extrude direction is parallel to the target face plane')\n }\n const tMax = cornerProjections\n .map((p) => (planeD - new THREE.Vector3(...p).dot(tn0)) / dirD)\n .reduce((a, b) => Math.max(a, b), 0)\n const L = tMax + Math.abs(offset) + bboxDiag(bbox) * 0.1 + 1\n const longSolid = kernel.extrude(inputSolid, normal.x * L, normal.y * L, normal.z * L)\n\n // 3) 截断平面 = 目标面 + offset(沿面法向)。GOTCHA(探针实测):半空间侧不能固定\n // 取「法向负侧」——目标面法向朝向与拉伸方向无必然关系。正确语义:保留「包含\n // 拉伸起点」的那一侧。farSideBox 覆盖「传入法向的反侧」,因此传 -keepSide。\n const tn = tn0\n const startCenter = new THREE.Vector3(\n (bbox.min[0] + bbox.max[0]) / 2,\n (bbox.min[1] + bbox.max[1]) / 2,\n (bbox.min[2] + bbox.max[2]) / 2,\n )\n const planePoint = new THREE.Vector3(...shiftedCenter0)\n const d = startCenter.sub(planePoint).dot(tn)\n // 保留侧法向:起点所在侧(d 与 tn 同号 → 正侧;异号 → 负侧);d≈0 时退化为\n // 拉伸方向(起点在面上时按拉伸方向截)\n const keepSide = Math.abs(d) < 1e-9 ? normal.clone() : tn.clone().multiplyScalar(Math.sign(d))\n // GOTCHA(PadTest Pad001 斜置基准面实测):targetCenter 可以是平面上离轮廓\n // 很远的任意一点(基准面 point 在草图局部坐标里横向偏 ~100),reach 若只取\n // L(按轮廓到截断面的投影距离)则半空间盒横向盖不住长拉伸体 → common 为空。\n // reach 必须 ≥ 平面点到拉伸体的距离 + 体对角线(全方向覆盖)。\n const reach =\n new THREE.Vector3(...shiftedCenter0).distanceTo(\n new THREE.Vector3((bbox.min[0] + bbox.max[0]) / 2, (bbox.min[1] + bbox.max[1]) / 2, (bbox.min[2] + bbox.max[2]) / 2),\n ) + bboxDiag(bbox) + Math.abs(offset) + 1\n const halfspace = farSideBox(kernel, shiftedCenter0, [-keepSide.x, -keepSide.y, -keepSide.z], reach)\n\n // 4) 求交:长拉伸 ∩ 半空间盒\n const clipped = kernel.common(longSolid, halfspace)\n kernel.release(longSolid)\n kernel.release(halfspace)\n\n // 预检:方向上不相交 → 显式报错(禁静默)\n const clippedBBox = getSolidBoundingBox(kernel, clipped)\n if (!Number.isFinite(bboxDiag(clippedBBox)) || bboxDiag(clippedBBox) < 1e-9) {\n kernel.release(clipped)\n throw new Error('E_UP_TO_NO_INTERSECTION: extrude direction does not reach the target face')\n }\n return clipped\n}\n\n/**\n * 沿 normal 拉伸几何(面 → 棱柱)。\n *\n * up-to 模式(`upTo`)与长度模式(`length`)二选一;长度模式委托生成投影\n * (vendored extrude 为唯一引擎),up-to 模式走半空间组合。\n *\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name extrude\n * @returns Shape 拉伸后的几何。\n * @param input - 目标几何(平面面)。type:Shape required:true\n * @param params.length - 总拉伸量(mm,>0)。up-to 模式下无需给。type:number\n * @param params.normal - 拉伸方向(世界坐标)。type:[x,y,z] 默认 [0,0,1]\n * @param params.mode - 沿 normal 的前进方向:forward 正向 / backward 反向。type:'forward' | 'backward' 默认 'forward'\n * @param params.upTo - 拉伸到面:FaceTopoRef 指定面 / 'last' 支持体远端面 / 'first' 近端面(需 baseFeature)。提供时忽略 length。type:'last' | 'first' | FaceTopoRef\n * @param params.baseFeature - upTo 'last'/'first' 的支持体几何(累积支持体)。type:Shape\n * @param params.offset - 截断面沿其法向的偏移(mm)。type:number 默认 0\n * @example\n * const p = await cad.extrude(part0, [0, 0, 10])\n * const p = await cad.extrude(part0, { length: 10 })\n * const p = await cad.extrude(sk, { upTo: cad.faceRef(part0, 3) })\n * const p = await cad.extrude(sk, { upTo: 'last', baseFeature: part0 })\n */\nexport const extrude = defineOp({\n name: 'extrude',\n brep: async (input: Shape, params: unknown): Promise<Shape> => {\n if (!input) throw new Error('[stdlib/extrude] no input geometry')\n // Phase 3 执行前预检:1D 曲线(wire / helix / sketch as:'wire')不是面,不得落进\n // 内核深层才报「操作失败」——维度不符在调用内核前明确拒绝(1D 判别位 kind='curve')。\n if (isCurveShape(input)) {\n throw new Error(\n 'E_EXTRUDE_NEEDS_FACE: extrude requires a 2D face input, got a 1D curve (kind=\"curve\")',\n )\n }\n const o = normalizeExtrudeOptions(params)\n assertExtrudeOptions(o)\n\n if (o.upTo !== undefined) {\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/extrude] input is not BREP')\n const clipped = extrudeUpToSolid(kernel, inputSolid, o)\n // E3-b(2026-09-23,同 revolve 修法):不能对投影产物再走一次 fromBrep——\n // 同语句 registeredStmtId 去重会吞掉第二次登记(part 键保持空表,下游\n // fillet/chamfer 的 edgeRef 报 nameless shape)。upTo 路径不经过投影/\n // adoptOut,fromBrep 只在此走一次,roleTable 直挂 + solid 句柄登记。\n const origin = String(getCurrentStmt()?.id ?? '')\n return fromBrep(solidToShape(kernel, clipped), {\n solid: clipped,\n roleTable: new Map([[origin, extrudeConstructRoles(kernel, clipped)]]),\n })\n }\n\n // 长度形态:委托生成投影(生成投影自带借入 / Result 翻转 / 收养)\n const normal = new THREE.Vector3(...(o.normal ?? [0, 0, 1])).normalize()\n const sign = o.mode === 'backward' ? -1 : 1\n const v: Vec3 = [normal.x * o.length! * sign, normal.y * o.length! * sign, normal.z * o.length! * sign]\n const result = (await projectedExtrude(input, v)) as Shape\n // E3 后续:委托路径同样要建链根表(投影只给几何,命名是 faijs 语义)。\n // E3-b(2026-09-23,同 revolve 修法):不能对投影产物再走一次 fromBrep——\n // 同语句 registeredStmtId 去重会吞掉第二次登记(part 键保持空表,下游\n // fillet/chamfer 的 edgeRef 报 `input shape has no role table`)。改经\n // runtimeLineage.recordOutput 落语句键表 + part 键权威位。\n // D12(2026-09-24):取内核走 getBrepApi;引擎未初始化 → 跳过建表(纯 mesh 结果)。\n let kernel: BrepEngineApi | null = null\n try { kernel = getBrepApi() } catch { /* no engine -> skip role table */ }\n const solid = kernel ? (brepOf(result) as BrepHandle | undefined) : undefined\n if (kernel && solid) {\n const origin = String(getCurrentStmt()?.id ?? '')\n const table = new Map([[origin, extrudeConstructRoles(kernel, solid)]])\n const part = getCurrentStmt()?.outputs?.[0]\n runtimeLineage.recordOutput(origin as never, table, solid as never, part as never)\n }\n return result\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [{ kind: 'semantic', name: 'top' }, { kind: 'semantic', name: 'bottom' }, { kind: 'wall', index: 0 }] } } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-ref.d.ts","sourceRoot":"","sources":["../../src/api/face-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"face-ref.d.ts","sourceRoot":"","sources":["../../src/api/face-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAI1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,CAmCnE"}
|
package/dist/api/face-ref.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 纯查询:同步、无副作用、不改 Shape;定不了案一律抛 `TopoRefError`,
|
|
15
15
|
* 绝不静默拿序号硬取。
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
17
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
18
18
|
import { brepOf } from '../shape.js';
|
|
19
19
|
import { captureFaceHint, findOriginRole, TopoRefError } from '../topology/naming/index.js';
|
|
20
20
|
import { buildEdgeResolutionContext } from './topo-resolve.js';
|
|
@@ -39,7 +39,7 @@ export function faceRef(of, faceOrdinal) {
|
|
|
39
39
|
if (!Number.isInteger(faceOrdinal) || faceOrdinal < 1) {
|
|
40
40
|
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceRef: faceOrdinal must be an integer >= 1 (got ${faceOrdinal})`);
|
|
41
41
|
}
|
|
42
|
-
const kernel =
|
|
42
|
+
const kernel = getBrepApi();
|
|
43
43
|
// Phase 1.9(D6/§3):mesh 路径不支持拓扑引用——静态判定、显式抛错,不静默降级
|
|
44
44
|
if (!kernel) {
|
|
45
45
|
throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'face', 'faceRef: topology references are BREP-only (mesh path unsupported)');
|
package/dist/api/face-ref.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-ref.js","sourceRoot":"","sources":["../../src/api/face-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"face-ref.js","sourceRoot":"","sources":["../../src/api/face-ref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAElF,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CAAC,EAAS,EAAE,WAAmB;IACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,qDAAqD,WAAW,GAAG,CAAC,CAAA;IACzH,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,mDAAmD;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,MAAM,EAAE,oEAAoE,CAAC,CAAA;IACjI,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,MAAM,EAAE,qFAAqF,CAAC,CAAA;IAClJ,CAAC;IAED,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,EAAY,CAAC,CAAA;IAC5D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,2CAA2C,CAAC,CAAA;IAEzG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAA;IAC7D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,MAAM,EACN,yBAAyB,WAAW,qBAAqB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAC7E,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAA;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,yDAAyD,CAAC,CAAA;IAC/G,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,yBAAyB,WAAW,sBAAsB,CAAC,CAAA;IAChH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7G,CAAC","sourcesContent":["/**\n * stdlib face-ref — 面引用查询:把「面序号」解析成 `FaceTopoRef`(1 起)\n *\n * extrude 的 `upTo` 参数(拉伸到面,PadTest UpToFace 链路)需要指向\n * 「某个实体上第 N 张面」的引用。外部格式(FCStd 的 `UpToFace` LinkSub 等)\n * 只给序号,本模块与 `edge-ref.ts` 同构:在内核现场枚举里取第 N 张面,\n * 经输入 Shape 的命名槽(RoleTable + subShapeHashes)反查它的\n * `{origin, role}` 血统,合成 `FaceTopoRef`。\n *\n * 序号语义(GOTCHA):与 `edgeRef` 一致,1 起 == FreeCAD 的 `FaceN`\n * (`getSubShapes(solid,'face')` 用 TopExp::MapShapes + IndexedMap 枚举,\n * 与 `edge-ref.ts` 头注同源已记档)。\n *\n * 纯查询:同步、无副作用、不改 Shape;定不了案一律抛 `TopoRefError`,\n * 绝不静默拿序号硬取。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf } from '../shape'\nimport { captureFaceHint, findOriginRole, TopoRefError } from '../topology/naming'\nimport type { FaceTopoRef } from '../topology/naming'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n/**\n * 查询几何体第 N 张面的 `FaceTopoRef`,供 `cad.extrude` 的 `upTo` 等参数使用:\n * `cad.extrude(part0, { upTo: cad.faceRef(part0, 3) })`。\n *\n * 定不了案(无 BREP / 序号越界 / 面无 role 血统)抛 `TopoRefError`。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name faceRef\n * @returns FaceTopoRef 该面的拓扑引用(origin/role 血统 + 几何 hint)。\n * @param of - 目标几何(BREP 实体所在的 Shape)。type:Shape required:true\n * @param faceOrdinal - 面序号(1 起;等于 FreeCAD 的 `FaceN`)。type:number required:true\n * @note 序号 1 起,与命名层 `TopoRef.ordinal` 及 FreeCAD `FaceN` 同序(`getSubShapes(solid,'face')` 用 TopExp::MapShapes + IndexedMap 枚举)。\n * @example\n * const part1 = cad.extrude(sk, { upTo: cad.faceRef(part0, 3) })\n */\nexport function faceRef(of: Shape, faceOrdinal: number): FaceTopoRef {\n if (!Number.isInteger(faceOrdinal) || faceOrdinal < 1) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceRef: faceOrdinal must be an integer >= 1 (got ${faceOrdinal})`)\n }\n const kernel = getBrepApi()\n // Phase 1.9(D6/§3):mesh 路径不支持拓扑引用——静态判定、显式抛错,不静默降级\n if (!kernel) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'face', 'faceRef: topology references are BREP-only (mesh path unsupported)')\n }\n if (!brepOf(of)) {\n throw new TopoRefError('E_TOPO_MESH_UNSUPPORTED', 'face', 'faceRef: input shape has no BREP solid (mesh shapes do not carry topology identity)')\n }\n\n const ctx = buildEdgeResolutionContext(kernel, of as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'faceRef: input has no BREP naming context')\n\n const face = ctx.faces.find((f) => f.ordinal === faceOrdinal)\n if (!face || face.handle === undefined) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `faceRef: face ordinal ${faceOrdinal} out of range [1, ${ctx.faces.length}]`,\n )\n }\n\n const table = ctx.roleTable\n if (!table) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'faceRef: input shape has no role table (nameless shape)')\n }\n const found = findOriginRole(table, ctx.faces.map((f) => f.hash ?? 0), faceOrdinal)\n if (!found) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `faceRef: face ordinal ${faceOrdinal} has no role lineage`)\n }\n\n return { kind: 'face', origin: found.origin, role: found.role, hint: captureFaceHint(kernel, face.handle) }\n}\n"]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib feature-repair — L1 薄包装族(手写 op,Phase 5)
|
|
3
|
+
*
|
|
4
|
+
* 六条 L1 已有动作的手写薄包装,全部走 `getBrepApi()`(D12):
|
|
5
|
+
* - `defeature(shape, faces)` — 移除特征面(孔/凸台等)
|
|
6
|
+
* - `removeHolesFromFace(face)` — 移除面上的孔
|
|
7
|
+
* - `reverseShape(shape)` — 反转壳体朝向 —— **occt-only**(见下)
|
|
8
|
+
* - `unifySameDomain(shape)` — 合并同域面/边
|
|
9
|
+
* - `sew(shapes, tolerance?)` — 缝合壳
|
|
10
|
+
* - `sewAndSolidify(shapes, tolerance?)` — 缝合并固化为实体
|
|
11
|
+
*
|
|
12
|
+
* 每条都极薄:解析入参 → 直调 L1 → 收养。选面口径与 `shell`/`draft` 一致
|
|
13
|
+
* (FaceTopoRef[],设计原则 4)。
|
|
14
|
+
*
|
|
15
|
+
* 引擎声明(**逐条判定,不整族一刀切**):
|
|
16
|
+
* - `reverseShape` 声明 `engines: ['occt']` —— 实证收窄:brepkit 实测在 **op 级**
|
|
17
|
+
* 失败(`invalid solid handle: index N is out of bounds`,callee = reverseShape,
|
|
18
|
+
* 非输入构造侧),静态门须在执行前拒绝。
|
|
19
|
+
* - 其余五条保持中立(声明 `capabilities: ['directEdit']`,无 engines)。
|
|
20
|
+
* 注意 `unifySameDomain` 在 brepkit 上**可用但语义有差**(会把体重新居中),
|
|
21
|
+
* 未收窄 —— 缺证据表明它不可用,不擅自扩大范围。
|
|
22
|
+
*
|
|
23
|
+
* 未覆盖(诚实留档,本轮未验):`defeature` / `sew` / `sewAndSolidify` /
|
|
24
|
+
* `removeHolesFromFace` 在 brepkit 上的 op 级行为未取得干净证据(探针的面输入
|
|
25
|
+
* 先撞到 faceRef/输入构造侧限制),故不做引擎声明。
|
|
26
|
+
*/
|
|
27
|
+
import type { Shape } from '../mesh/types.js';
|
|
28
|
+
import type { FaceTopoRef } from '../topology/naming/index.js';
|
|
29
|
+
/**
|
|
30
|
+
* 移除特征面(孔/凸台等),恢复基础形状。
|
|
31
|
+
* @group 修复
|
|
32
|
+
* @inputs 1
|
|
33
|
+
* @async true
|
|
34
|
+
* @qual ok
|
|
35
|
+
* @name defeature
|
|
36
|
+
* @note 中立 op:L1 defeature 两引擎同实现。仅 BREP 可用。
|
|
37
|
+
* @returns Shape 移除特征后的几何。
|
|
38
|
+
* @param input - 目标几何。type:Shape required:true
|
|
39
|
+
* @param faces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
|
|
40
|
+
* @example
|
|
41
|
+
* const base = await cad.defeature(part0, [cad.faceRef(part0, 5)])
|
|
42
|
+
*/
|
|
43
|
+
export declare const defeature: ((input: Shape, faces: FaceTopoRef[]) => Promise<Shape>) & {
|
|
44
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* 反转壳体朝向(内表面 ↔ 外表面)。
|
|
48
|
+
* @group 修复
|
|
49
|
+
* @inputs 1
|
|
50
|
+
* @async true
|
|
51
|
+
* @qual ok
|
|
52
|
+
* @name reverseShape
|
|
53
|
+
* @note **occt-only**(`engines: ['occt']`,实证收窄):brepkit 实测在 op 级抛
|
|
54
|
+
* `invalid solid handle: index N is out of bounds`(非输入侧失败),
|
|
55
|
+
* 故由静态门在执行前拒绝而非等到运行时。产物 `getVolume` 返回**有向**体积
|
|
56
|
+
* (朝向反转 ⇒ 符号翻转)。仅 BREP 可用。
|
|
57
|
+
* @returns Shape 朝向反转后的几何。
|
|
58
|
+
* @param input - 目标几何。type:Shape required:true
|
|
59
|
+
* @example
|
|
60
|
+
* const flipped = await cad.reverseShape(sh)
|
|
61
|
+
*/
|
|
62
|
+
export declare const reverseShape: ((input: Shape) => Promise<Shape>) & {
|
|
63
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* 合并同域面/边(去除被分割成多片的冗余细分)。
|
|
67
|
+
* @group 修复
|
|
68
|
+
* @inputs 1
|
|
69
|
+
* @async true
|
|
70
|
+
* @qual ok
|
|
71
|
+
* @name unifySameDomain
|
|
72
|
+
* @note 中立 op:L1 unifySameDomain 两引擎同实现。仅 BREP 可用。
|
|
73
|
+
* @returns Shape 合并后的几何。
|
|
74
|
+
* @param input - 目标几何。type:Shape required:true
|
|
75
|
+
* @example
|
|
76
|
+
* const merged = await cad.unifySameDomain(part0)
|
|
77
|
+
*/
|
|
78
|
+
export declare const unifySameDomain: ((input: Shape) => Promise<Shape>) & {
|
|
79
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
80
|
+
};
|
|
81
|
+
/** `cad.sew` / `cad.sewAndSolidify` 公共参数。 */
|
|
82
|
+
export interface SewParams {
|
|
83
|
+
/** 缝合容差(mm,可选)。 */
|
|
84
|
+
tolerance?: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 缝合:把一组面/壳沿公共边缝成一张壳。
|
|
88
|
+
* @group 修复
|
|
89
|
+
* @inputs 1
|
|
90
|
+
* @async true
|
|
91
|
+
* @qual ok
|
|
92
|
+
* @name sew
|
|
93
|
+
* @note 中立 op:L1 sew 两引擎同实现。产物是壳(不保证闭合);要实体用 sewAndSolidify。
|
|
94
|
+
* @returns Shape 缝合后的壳。
|
|
95
|
+
* @param shapes - 面/壳集合。type:Shape[] required:true
|
|
96
|
+
* @param params.tolerance - 缝合容差(mm)。type:number required:false
|
|
97
|
+
* @example
|
|
98
|
+
* const shellShape = await cad.sew([f1, f2, f3], { tolerance: 1e-5 })
|
|
99
|
+
*/
|
|
100
|
+
export declare const sew: ((shapes: Shape[], params?: SewParams | undefined) => Promise<Shape>) & {
|
|
101
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* 缝合并固化为实体:缝合后若闭合则生成 solid。
|
|
105
|
+
* @group 修复
|
|
106
|
+
* @inputs 1
|
|
107
|
+
* @async true
|
|
108
|
+
* @qual ok
|
|
109
|
+
* @name sewAndSolidify
|
|
110
|
+
* @note 中立 op:L1 sewAndSolidify 两引擎同实现。仅 BREP 可用。
|
|
111
|
+
* @returns Shape 缝合固化后的实体。
|
|
112
|
+
* @param shapes - 面/壳集合。type:Shape[] required:true
|
|
113
|
+
* @param params.tolerance - 缝合容差(mm)。type:number required:false
|
|
114
|
+
* @example
|
|
115
|
+
* const solid = await cad.sewAndSolidify([f1, f2, f3, f4, f5, f6])
|
|
116
|
+
*/
|
|
117
|
+
export declare const sewAndSolidify: ((shapes: Shape[], params?: SewParams | undefined) => Promise<Shape>) & {
|
|
118
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* 移除面(或实体某面)上的孔。
|
|
122
|
+
* @group 修复
|
|
123
|
+
* @inputs 1
|
|
124
|
+
* @async true
|
|
125
|
+
* @qual ok
|
|
126
|
+
* @name removeHolesFromFace
|
|
127
|
+
* @note 中立 op:L1 removeHolesFromFace 两引擎同实现。入参为含孔的面 Shape
|
|
128
|
+
* (L1 形参是面句柄;借入输入 Shape 的 BREP 槽位句柄)。
|
|
129
|
+
* @returns Shape 去孔后的面。
|
|
130
|
+
* @param face - 含孔的面几何。type:Shape required:true
|
|
131
|
+
* @example
|
|
132
|
+
* const plain = await cad.removeHolesFromFace(faceWithHoles)
|
|
133
|
+
*/
|
|
134
|
+
export declare const removeHolesFromFace: ((face: Shape) => Promise<Shape>) & {
|
|
135
|
+
__faijs__dualOp?: import("../define-op.js").DualOpMeta;
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=feature-repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-repair.d.ts","sourceRoot":"","sources":["../../src/api/feature-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAgDrD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS;;CAYpB,CAAA;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY;;CAUvB,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe;;CAQ1B,CAAA;AAEF,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,GAAG;;CAQd,CAAA;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc;;CAQzB,CAAA;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB;;CAU9B,CAAA"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdlib feature-repair — L1 薄包装族(手写 op,Phase 5)
|
|
3
|
+
*
|
|
4
|
+
* 六条 L1 已有动作的手写薄包装,全部走 `getBrepApi()`(D12):
|
|
5
|
+
* - `defeature(shape, faces)` — 移除特征面(孔/凸台等)
|
|
6
|
+
* - `removeHolesFromFace(face)` — 移除面上的孔
|
|
7
|
+
* - `reverseShape(shape)` — 反转壳体朝向 —— **occt-only**(见下)
|
|
8
|
+
* - `unifySameDomain(shape)` — 合并同域面/边
|
|
9
|
+
* - `sew(shapes, tolerance?)` — 缝合壳
|
|
10
|
+
* - `sewAndSolidify(shapes, tolerance?)` — 缝合并固化为实体
|
|
11
|
+
*
|
|
12
|
+
* 每条都极薄:解析入参 → 直调 L1 → 收养。选面口径与 `shell`/`draft` 一致
|
|
13
|
+
* (FaceTopoRef[],设计原则 4)。
|
|
14
|
+
*
|
|
15
|
+
* 引擎声明(**逐条判定,不整族一刀切**):
|
|
16
|
+
* - `reverseShape` 声明 `engines: ['occt']` —— 实证收窄:brepkit 实测在 **op 级**
|
|
17
|
+
* 失败(`invalid solid handle: index N is out of bounds`,callee = reverseShape,
|
|
18
|
+
* 非输入构造侧),静态门须在执行前拒绝。
|
|
19
|
+
* - 其余五条保持中立(声明 `capabilities: ['directEdit']`,无 engines)。
|
|
20
|
+
* 注意 `unifySameDomain` 在 brepkit 上**可用但语义有差**(会把体重新居中),
|
|
21
|
+
* 未收窄 —— 缺证据表明它不可用,不擅自扩大范围。
|
|
22
|
+
*
|
|
23
|
+
* 未覆盖(诚实留档,本轮未验):`defeature` / `sew` / `sewAndSolidify` /
|
|
24
|
+
* `removeHolesFromFace` 在 brepkit 上的 op 级行为未取得干净证据(探针的面输入
|
|
25
|
+
* 先撞到 faceRef/输入构造侧限制),故不做引擎声明。
|
|
26
|
+
*/
|
|
27
|
+
import { solidToShape } from '../brep/brep-ops.js';
|
|
28
|
+
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
29
|
+
import { brepOf, fromBrep } from '../shape.js';
|
|
30
|
+
import { defineOp } from '../sdk.js';
|
|
31
|
+
import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
|
|
32
|
+
import { buildEdgeResolutionContext } from './topo-resolve.js';
|
|
33
|
+
/** BREP 输入守卫:取 BREP 句柄,无则报错。 */
|
|
34
|
+
function requireBrep(input, op) {
|
|
35
|
+
const handle = brepOf(input);
|
|
36
|
+
if (!handle)
|
|
37
|
+
throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} input is not BREP`);
|
|
38
|
+
return handle;
|
|
39
|
+
}
|
|
40
|
+
/** 解析 FaceTopoRef[] → 句柄数组(shell/draft 同款口径)。 */
|
|
41
|
+
function resolveFaces(kernel, input, refs, op) {
|
|
42
|
+
const ctx = buildEdgeResolutionContext(kernel, input);
|
|
43
|
+
if (!ctx)
|
|
44
|
+
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `${op}: input has no BREP naming context`);
|
|
45
|
+
return refs.map((ref) => {
|
|
46
|
+
if (!ref || ref.kind !== 'face') {
|
|
47
|
+
throw new Error(`E_${op.toUpperCase()}_BAD_FACE_REF: every faces entry must be a FaceTopoRef (cad.faceRef)`);
|
|
48
|
+
}
|
|
49
|
+
const r = resolveTopoRef(ref, ctx);
|
|
50
|
+
if (r.handle === undefined) {
|
|
51
|
+
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `${op}: face resolved without handle (${ref.origin}/${ref.role})`);
|
|
52
|
+
}
|
|
53
|
+
return r.handle;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** 借入一组输入 Shape → 句柄数组(sew 族)。 */
|
|
57
|
+
function borrowHandles(shapes, op) {
|
|
58
|
+
if (!Array.isArray(shapes) || shapes.length === 0) {
|
|
59
|
+
throw new Error(`E_${op.toUpperCase()}_NO_SHAPES: ${op} requires a non-empty array of shapes`);
|
|
60
|
+
}
|
|
61
|
+
return shapes.map((s) => {
|
|
62
|
+
const h = brepOf(s);
|
|
63
|
+
if (!h)
|
|
64
|
+
throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} input shape is not BREP`);
|
|
65
|
+
return h;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function adopt(kernel, handle) {
|
|
69
|
+
return fromBrep(solidToShape(kernel, handle), { solid: handle });
|
|
70
|
+
}
|
|
71
|
+
const kernelNaming = { kind: 'kernel', newFaces: { via: 'byAdjacency' } };
|
|
72
|
+
/**
|
|
73
|
+
* 移除特征面(孔/凸台等),恢复基础形状。
|
|
74
|
+
* @group 修复
|
|
75
|
+
* @inputs 1
|
|
76
|
+
* @async true
|
|
77
|
+
* @qual ok
|
|
78
|
+
* @name defeature
|
|
79
|
+
* @note 中立 op:L1 defeature 两引擎同实现。仅 BREP 可用。
|
|
80
|
+
* @returns Shape 移除特征后的几何。
|
|
81
|
+
* @param input - 目标几何。type:Shape required:true
|
|
82
|
+
* @param faces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
|
|
83
|
+
* @example
|
|
84
|
+
* const base = await cad.defeature(part0, [cad.faceRef(part0, 5)])
|
|
85
|
+
*/
|
|
86
|
+
export const defeature = defineOp({
|
|
87
|
+
capabilities: ['directEdit'],
|
|
88
|
+
brep(input, faces) {
|
|
89
|
+
if (!Array.isArray(faces) || faces.length === 0) {
|
|
90
|
+
throw new Error('E_DEFEATURE_NO_FACES: defeature requires at least one FaceTopoRef');
|
|
91
|
+
}
|
|
92
|
+
const kernel = getBrepApi();
|
|
93
|
+
const solid = requireBrep(input, 'defeature');
|
|
94
|
+
const handles = resolveFaces(kernel, input, faces, 'defeature');
|
|
95
|
+
return adopt(kernel, kernel.defeature(solid, handles));
|
|
96
|
+
},
|
|
97
|
+
naming: kernelNaming,
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* 反转壳体朝向(内表面 ↔ 外表面)。
|
|
101
|
+
* @group 修复
|
|
102
|
+
* @inputs 1
|
|
103
|
+
* @async true
|
|
104
|
+
* @qual ok
|
|
105
|
+
* @name reverseShape
|
|
106
|
+
* @note **occt-only**(`engines: ['occt']`,实证收窄):brepkit 实测在 op 级抛
|
|
107
|
+
* `invalid solid handle: index N is out of bounds`(非输入侧失败),
|
|
108
|
+
* 故由静态门在执行前拒绝而非等到运行时。产物 `getVolume` 返回**有向**体积
|
|
109
|
+
* (朝向反转 ⇒ 符号翻转)。仅 BREP 可用。
|
|
110
|
+
* @returns Shape 朝向反转后的几何。
|
|
111
|
+
* @param input - 目标几何。type:Shape required:true
|
|
112
|
+
* @example
|
|
113
|
+
* const flipped = await cad.reverseShape(sh)
|
|
114
|
+
*/
|
|
115
|
+
export const reverseShape = defineOp({
|
|
116
|
+
capabilities: ['directEdit'],
|
|
117
|
+
// 实证收窄(2026-09-24):brepkit op 级失败 → 静态门提前拒绝。
|
|
118
|
+
engines: ['occt'],
|
|
119
|
+
brep(input) {
|
|
120
|
+
const kernel = getBrepApi();
|
|
121
|
+
const solid = requireBrep(input, 'reverseShape');
|
|
122
|
+
return adopt(kernel, kernel.reverseShape(solid));
|
|
123
|
+
},
|
|
124
|
+
naming: kernelNaming,
|
|
125
|
+
});
|
|
126
|
+
/**
|
|
127
|
+
* 合并同域面/边(去除被分割成多片的冗余细分)。
|
|
128
|
+
* @group 修复
|
|
129
|
+
* @inputs 1
|
|
130
|
+
* @async true
|
|
131
|
+
* @qual ok
|
|
132
|
+
* @name unifySameDomain
|
|
133
|
+
* @note 中立 op:L1 unifySameDomain 两引擎同实现。仅 BREP 可用。
|
|
134
|
+
* @returns Shape 合并后的几何。
|
|
135
|
+
* @param input - 目标几何。type:Shape required:true
|
|
136
|
+
* @example
|
|
137
|
+
* const merged = await cad.unifySameDomain(part0)
|
|
138
|
+
*/
|
|
139
|
+
export const unifySameDomain = defineOp({
|
|
140
|
+
capabilities: ['directEdit'],
|
|
141
|
+
brep(input) {
|
|
142
|
+
const kernel = getBrepApi();
|
|
143
|
+
const solid = requireBrep(input, 'unifySameDomain');
|
|
144
|
+
return adopt(kernel, kernel.unifySameDomain(solid));
|
|
145
|
+
},
|
|
146
|
+
naming: kernelNaming,
|
|
147
|
+
});
|
|
148
|
+
/**
|
|
149
|
+
* 缝合:把一组面/壳沿公共边缝成一张壳。
|
|
150
|
+
* @group 修复
|
|
151
|
+
* @inputs 1
|
|
152
|
+
* @async true
|
|
153
|
+
* @qual ok
|
|
154
|
+
* @name sew
|
|
155
|
+
* @note 中立 op:L1 sew 两引擎同实现。产物是壳(不保证闭合);要实体用 sewAndSolidify。
|
|
156
|
+
* @returns Shape 缝合后的壳。
|
|
157
|
+
* @param shapes - 面/壳集合。type:Shape[] required:true
|
|
158
|
+
* @param params.tolerance - 缝合容差(mm)。type:number required:false
|
|
159
|
+
* @example
|
|
160
|
+
* const shellShape = await cad.sew([f1, f2, f3], { tolerance: 1e-5 })
|
|
161
|
+
*/
|
|
162
|
+
export const sew = defineOp({
|
|
163
|
+
capabilities: ['directEdit'],
|
|
164
|
+
brep(shapes, params) {
|
|
165
|
+
const kernel = getBrepApi();
|
|
166
|
+
const handles = borrowHandles(shapes, 'sew');
|
|
167
|
+
return adopt(kernel, kernel.sew(handles, params?.tolerance));
|
|
168
|
+
},
|
|
169
|
+
naming: kernelNaming,
|
|
170
|
+
});
|
|
171
|
+
/**
|
|
172
|
+
* 缝合并固化为实体:缝合后若闭合则生成 solid。
|
|
173
|
+
* @group 修复
|
|
174
|
+
* @inputs 1
|
|
175
|
+
* @async true
|
|
176
|
+
* @qual ok
|
|
177
|
+
* @name sewAndSolidify
|
|
178
|
+
* @note 中立 op:L1 sewAndSolidify 两引擎同实现。仅 BREP 可用。
|
|
179
|
+
* @returns Shape 缝合固化后的实体。
|
|
180
|
+
* @param shapes - 面/壳集合。type:Shape[] required:true
|
|
181
|
+
* @param params.tolerance - 缝合容差(mm)。type:number required:false
|
|
182
|
+
* @example
|
|
183
|
+
* const solid = await cad.sewAndSolidify([f1, f2, f3, f4, f5, f6])
|
|
184
|
+
*/
|
|
185
|
+
export const sewAndSolidify = defineOp({
|
|
186
|
+
capabilities: ['directEdit'],
|
|
187
|
+
brep(shapes, params) {
|
|
188
|
+
const kernel = getBrepApi();
|
|
189
|
+
const handles = borrowHandles(shapes, 'sewAndSolidify');
|
|
190
|
+
return adopt(kernel, kernel.sewAndSolidify(handles, params?.tolerance));
|
|
191
|
+
},
|
|
192
|
+
naming: kernelNaming,
|
|
193
|
+
});
|
|
194
|
+
/**
|
|
195
|
+
* 移除面(或实体某面)上的孔。
|
|
196
|
+
* @group 修复
|
|
197
|
+
* @inputs 1
|
|
198
|
+
* @async true
|
|
199
|
+
* @qual ok
|
|
200
|
+
* @name removeHolesFromFace
|
|
201
|
+
* @note 中立 op:L1 removeHolesFromFace 两引擎同实现。入参为含孔的面 Shape
|
|
202
|
+
* (L1 形参是面句柄;借入输入 Shape 的 BREP 槽位句柄)。
|
|
203
|
+
* @returns Shape 去孔后的面。
|
|
204
|
+
* @param face - 含孔的面几何。type:Shape required:true
|
|
205
|
+
* @example
|
|
206
|
+
* const plain = await cad.removeHolesFromFace(faceWithHoles)
|
|
207
|
+
*/
|
|
208
|
+
export const removeHolesFromFace = defineOp({
|
|
209
|
+
capabilities: ['directEdit'],
|
|
210
|
+
brep(face) {
|
|
211
|
+
if (!face)
|
|
212
|
+
throw new Error('E_REMOVEHOLES_NO_FACE: removeHolesFromFace requires a face shape');
|
|
213
|
+
const kernel = getBrepApi();
|
|
214
|
+
const handle = brepOf(face);
|
|
215
|
+
if (!handle)
|
|
216
|
+
throw new Error('E_REMOVEHOLES_NO_BREP: removeHolesFromFace input is not BREP');
|
|
217
|
+
return adopt(kernel, kernel.removeHolesFromFace(handle));
|
|
218
|
+
},
|
|
219
|
+
naming: kernelNaming,
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=feature-repair.js.map
|