@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
|
@@ -1,91 +1,124 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* L3 bridge — faijs Shape ⇄
|
|
2
|
+
* L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
|
|
3
3
|
*
|
|
4
4
|
* 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
|
|
5
5
|
*
|
|
6
|
-
* 桥接事实(2026-09-02
|
|
6
|
+
* 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
|
|
7
7
|
* - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
|
|
8
8
|
* shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图
|
|
10
|
+
* (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
|
|
11
|
+
* 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
|
|
12
|
+
* 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
|
|
13
|
+
* 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
* 1. faijs Shape →
|
|
15
|
-
* 2.
|
|
16
|
-
* 3.
|
|
15
|
+
* 因此投影一个库函数只需三件事:
|
|
16
|
+
* 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
|
|
17
|
+
* 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
|
|
18
|
+
* 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
|
|
17
19
|
* (meshHandle + 身份槽登记,所有权转入 faijs)。
|
|
18
20
|
*
|
|
19
21
|
* 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /
|
|
20
|
-
* handle-bridge /
|
|
21
|
-
*
|
|
22
|
-
* 层的内核桥读取器(`getBrepjsKernel`),保持 dist/sdk.js 零 heavy 依赖。
|
|
22
|
+
* handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖
|
|
23
|
+
* (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。
|
|
23
24
|
*/
|
|
24
25
|
import type { Shape } from '../../mesh/types.js';
|
|
25
|
-
|
|
26
|
+
/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */
|
|
27
|
+
export interface BorrowedShapeHandle {
|
|
28
|
+
/** The raw kernel shape handle */
|
|
29
|
+
readonly wrapped: unknown;
|
|
30
|
+
/** Manual dispose(borrowed 视图为 no-op) */
|
|
31
|
+
[Symbol.dispose](): void;
|
|
32
|
+
/** Alias for Symbol.dispose */
|
|
33
|
+
delete(): void;
|
|
34
|
+
/** Always false for a borrowed view */
|
|
35
|
+
readonly disposed: boolean;
|
|
36
|
+
/** Borrowed views never dispose, so callbacks never fire(no-op)。 */
|
|
37
|
+
onDispose(callback: () => void): void;
|
|
38
|
+
}
|
|
39
|
+
/** occt-wasm 句柄对象视图(type + id,delete no-op)。 */
|
|
40
|
+
export interface OcctWasmHandleView {
|
|
41
|
+
__occtWasm: true;
|
|
42
|
+
type: string;
|
|
43
|
+
id: number;
|
|
44
|
+
delete(): void;
|
|
45
|
+
HashCode(upperBound: number): number;
|
|
46
|
+
IsNull(): boolean;
|
|
47
|
+
}
|
|
26
48
|
/**
|
|
27
|
-
* Borrow a faijs Shape's OCCT handle as a
|
|
49
|
+
* Borrow a faijs Shape's OCCT handle as a library-side shape handle.
|
|
28
50
|
*
|
|
29
|
-
* No ownership transfer: the
|
|
51
|
+
* No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
|
|
30
52
|
* same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
|
|
31
|
-
*
|
|
53
|
+
* compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
|
|
32
54
|
*
|
|
33
55
|
* `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
|
|
34
|
-
* branded number), but
|
|
35
|
-
*
|
|
36
|
-
* `shape.type` reads
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* the
|
|
41
|
-
* slot and its ownership are untouched).
|
|
56
|
+
* branded number), but library code consumes shapes as *objects* (the
|
|
57
|
+
* shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
|
|
58
|
+
* `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
|
|
59
|
+
* map key"). The id is therefore wrapped into a structurally valid
|
|
60
|
+
* `OcctWasmHandleView`: the type is queried from the bound occt kernel through
|
|
61
|
+
* `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
|
|
62
|
+
* the arena slot and its ownership are untouched).
|
|
42
63
|
*
|
|
43
64
|
* @param s - the faijs Shape whose brep slot is borrowed.
|
|
44
|
-
* @returns a
|
|
65
|
+
* @returns a library-side ShapeHandle view of the same occt shape.
|
|
45
66
|
* @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
|
|
46
67
|
*/
|
|
47
|
-
export declare function borrowBrepjsShape(s: Shape):
|
|
68
|
+
export declare function borrowBrepjsShape(s: Shape): BorrowedShapeHandle;
|
|
48
69
|
/**
|
|
49
|
-
* Adopt a
|
|
70
|
+
* Adopt a library-side product into a faijs Shape.
|
|
50
71
|
*
|
|
51
72
|
* Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'
|
|
52
|
-
* identity slot via `fromHandle` — ownership transfers to faijs, and the
|
|
73
|
+
* identity slot via `fromHandle` — ownership transfers to faijs, and the library
|
|
53
74
|
* wrapper must not dispose it afterwards (projected ops return it directly).
|
|
54
75
|
*
|
|
55
|
-
* @param product - a
|
|
56
|
-
* @param segments - optional tessellation segments
|
|
57
|
-
*
|
|
76
|
+
* @param product - a library-side shape (ShapeHandle / AnyShape family).
|
|
77
|
+
* @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;
|
|
78
|
+
* 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).
|
|
58
79
|
* @returns the faijs Shape wrapping the same occt solid.
|
|
59
80
|
*/
|
|
60
81
|
export declare function adoptBrepjsProduct(product: unknown, segments?: number): Shape;
|
|
61
82
|
/**
|
|
62
|
-
* Call a
|
|
83
|
+
* Call a library function with a rebuilt positional argument list.
|
|
63
84
|
*
|
|
64
85
|
* Generated wrappers build `__args` positionally (borrowing geometry inputs,
|
|
65
86
|
* passing value params through); a plain `fn(...args: unknown[])` spread fails
|
|
66
|
-
* TS2556 against
|
|
87
|
+
* TS2556 against fixed-arity signatures, so the call goes through this
|
|
67
88
|
* rest-typed bridge that preserves the function's own `ReturnType` (so a
|
|
68
89
|
* `Result` return keeps `.ok`/`.value` for the generated unwrap code).
|
|
69
90
|
*
|
|
70
|
-
* @param fn the
|
|
91
|
+
* @param fn the library function.
|
|
71
92
|
* @param args the rebuilt positional argument list (borrowed handles + value params).
|
|
72
|
-
* @returns whatever the
|
|
93
|
+
* @returns whatever the function returns (typed via ReturnType).
|
|
73
94
|
*/
|
|
74
95
|
export declare function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F>;
|
|
75
96
|
/**
|
|
76
|
-
*
|
|
97
|
+
* Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。
|
|
98
|
+
*
|
|
99
|
+
* 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法
|
|
100
|
+
* (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,
|
|
101
|
+
* D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前
|
|
102
|
+
* 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。
|
|
103
|
+
*
|
|
104
|
+
* @param opName - op 名(报错文案)。
|
|
105
|
+
* @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。
|
|
106
|
+
* @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。
|
|
107
|
+
*/
|
|
108
|
+
export declare function assertEngineFor(opName: string, engines: readonly string[]): void;
|
|
109
|
+
/**
|
|
110
|
+
* Adopt a library handle as a faijs Shape (compatOp step 5's only adoption
|
|
77
111
|
* entry point).
|
|
78
112
|
*
|
|
79
113
|
* ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);
|
|
80
114
|
* ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY
|
|
81
115
|
* (v1 boundary rejection, R4; the brand is a compile-time phantom type —
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* ③ entities (solid/compound) → unregisterFromCleanup
|
|
85
|
-
* finalizer
|
|
86
|
-
* already adopted when the wrapping object gets GC'd) → adoptBrepjsProduct.
|
|
116
|
+
* the runtime kind is read from the occt-wasm handle's own `type` field,
|
|
117
|
+
* same as the kernel getShapeType helpers);
|
|
118
|
+
* ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs
|
|
119
|
+
* finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.
|
|
87
120
|
*
|
|
88
|
-
* @param product - the
|
|
121
|
+
* @param product - the library result (handle or plain data record).
|
|
89
122
|
* @param opName - the op name (error messages).
|
|
90
123
|
* @param segments - optional tessellation segments (compat `segments?`).
|
|
91
124
|
* @returns the adopted faijs Shape, or the plain data untouched.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAY7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,IAAI,IAAI,CAAA;IACd,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IACpC,MAAM,IAAI,OAAO,CAAA;CAClB;AA8CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAY/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
|
|
@@ -1,52 +1,88 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* L3 bridge — faijs Shape ⇄
|
|
2
|
+
* L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
|
|
3
3
|
*
|
|
4
4
|
* 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
|
|
5
5
|
*
|
|
6
|
-
* 桥接事实(2026-09-02
|
|
6
|
+
* 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
|
|
7
7
|
* - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
|
|
8
8
|
* shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图
|
|
10
|
+
* (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
|
|
11
|
+
* 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
|
|
12
|
+
* 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
|
|
13
|
+
* 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
* 1. faijs Shape →
|
|
15
|
-
* 2.
|
|
16
|
-
* 3.
|
|
15
|
+
* 因此投影一个库函数只需三件事:
|
|
16
|
+
* 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
|
|
17
|
+
* 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
|
|
18
|
+
* 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
|
|
17
19
|
* (meshHandle + 身份槽登记,所有权转入 faijs)。
|
|
18
20
|
*
|
|
19
21
|
* 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /
|
|
20
|
-
* handle-bridge /
|
|
21
|
-
*
|
|
22
|
-
* 层的内核桥读取器(`getBrepjsKernel`),保持 dist/sdk.js 零 heavy 依赖。
|
|
22
|
+
* handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖
|
|
23
|
+
* (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。
|
|
23
24
|
*/
|
|
24
25
|
import { brepOf } from '../../shape.js';
|
|
25
|
-
import { fromHandle } from '../../brep/handle-bridge.js';
|
|
26
|
-
import {
|
|
27
|
-
import { unregisterFromCleanup } from '../../vendored/brepjs/core/disposal.js';
|
|
28
|
-
import { handle as occtWasmHandleView, isOcctWasmHandle } from '../../vendored/brepjs/kernel/occtWasm/helpers.js';
|
|
29
|
-
import { getBrepjsKernel } from '../occt-kernel-bridge.js';
|
|
26
|
+
import { fromHandle, getBrepApi } from '../../brep/handle-bridge.js';
|
|
27
|
+
import { getBackends } from '../../runtime-state.js';
|
|
30
28
|
import { OpError } from './result-unwrap.js';
|
|
29
|
+
const noopFn = () => { };
|
|
30
|
+
/** Build an opaque kernel handle for an arena-allocated WASM shape. */
|
|
31
|
+
function occtWasmHandleView(type, id) {
|
|
32
|
+
return {
|
|
33
|
+
__occtWasm: true,
|
|
34
|
+
type,
|
|
35
|
+
id,
|
|
36
|
+
delete: noopFn,
|
|
37
|
+
HashCode(upperBound) {
|
|
38
|
+
return id % upperBound;
|
|
39
|
+
},
|
|
40
|
+
IsNull() {
|
|
41
|
+
return false;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function isOcctWasmHandle(shape) {
|
|
46
|
+
return typeof shape === 'object' && shape !== null && shape.__occtWasm === true;
|
|
47
|
+
}
|
|
48
|
+
/** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */
|
|
49
|
+
function createBorrowedHandle(ocShape) {
|
|
50
|
+
return {
|
|
51
|
+
get wrapped() {
|
|
52
|
+
return ocShape;
|
|
53
|
+
},
|
|
54
|
+
get disposed() {
|
|
55
|
+
return false;
|
|
56
|
+
},
|
|
57
|
+
[Symbol.dispose]: noopFn,
|
|
58
|
+
delete: noopFn,
|
|
59
|
+
// Intentionally a no-op: a borrowed view never disposes, so a callback would
|
|
60
|
+
// never fire. Tie dependent lifetimes to the owning parent's handle instead.
|
|
61
|
+
onDispose: noopFn,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */
|
|
65
|
+
function unregisterFromCleanup(_deletable) {
|
|
66
|
+
// no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)
|
|
67
|
+
}
|
|
31
68
|
/**
|
|
32
|
-
* Borrow a faijs Shape's OCCT handle as a
|
|
69
|
+
* Borrow a faijs Shape's OCCT handle as a library-side shape handle.
|
|
33
70
|
*
|
|
34
|
-
* No ownership transfer: the
|
|
71
|
+
* No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
|
|
35
72
|
* same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
|
|
36
|
-
*
|
|
73
|
+
* compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
|
|
37
74
|
*
|
|
38
75
|
* `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
|
|
39
|
-
* branded number), but
|
|
40
|
-
*
|
|
41
|
-
* `shape.type` reads
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* the
|
|
46
|
-
* slot and its ownership are untouched).
|
|
76
|
+
* branded number), but library code consumes shapes as *objects* (the
|
|
77
|
+
* shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
|
|
78
|
+
* `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
|
|
79
|
+
* map key"). The id is therefore wrapped into a structurally valid
|
|
80
|
+
* `OcctWasmHandleView`: the type is queried from the bound occt kernel through
|
|
81
|
+
* `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
|
|
82
|
+
* the arena slot and its ownership are untouched).
|
|
47
83
|
*
|
|
48
84
|
* @param s - the faijs Shape whose brep slot is borrowed.
|
|
49
|
-
* @returns a
|
|
85
|
+
* @returns a library-side ShapeHandle view of the same occt shape.
|
|
50
86
|
* @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
|
|
51
87
|
*/
|
|
52
88
|
export function borrowBrepjsShape(s) {
|
|
@@ -57,26 +93,26 @@ export function borrowBrepjsShape(s) {
|
|
|
57
93
|
}
|
|
58
94
|
const kernelShape = isOcctWasmHandle(solid)
|
|
59
95
|
? solid
|
|
60
|
-
: occtWasmHandleView(
|
|
96
|
+
: occtWasmHandleView(getBrepApi().shapeType(solid), solid);
|
|
61
97
|
return createBorrowedHandle(kernelShape);
|
|
62
98
|
}
|
|
63
99
|
/**
|
|
64
|
-
* Adopt a
|
|
100
|
+
* Adopt a library-side product into a faijs Shape.
|
|
65
101
|
*
|
|
66
102
|
* Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'
|
|
67
|
-
* identity slot via `fromHandle` — ownership transfers to faijs, and the
|
|
103
|
+
* identity slot via `fromHandle` — ownership transfers to faijs, and the library
|
|
68
104
|
* wrapper must not dispose it afterwards (projected ops return it directly).
|
|
69
105
|
*
|
|
70
|
-
* @param product - a
|
|
71
|
-
* @param segments - optional tessellation segments
|
|
72
|
-
*
|
|
106
|
+
* @param product - a library-side shape (ShapeHandle / AnyShape family).
|
|
107
|
+
* @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;
|
|
108
|
+
* 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).
|
|
73
109
|
* @returns the faijs Shape wrapping the same occt solid.
|
|
74
110
|
*/
|
|
75
111
|
export function adoptBrepjsProduct(product, segments) {
|
|
76
112
|
if (product === null || typeof product !== 'object' || !('wrapped' in product)) {
|
|
77
|
-
throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the
|
|
113
|
+
throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine');
|
|
78
114
|
}
|
|
79
|
-
//
|
|
115
|
+
// library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;
|
|
80
116
|
// faijs' kernel meshShape expects the numeric shape id (fromHandle).
|
|
81
117
|
const wrappedAny = product.wrapped;
|
|
82
118
|
const rawId = typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny
|
|
@@ -86,39 +122,58 @@ export function adoptBrepjsProduct(product, segments) {
|
|
|
86
122
|
return fromHandle(wrapped, segments === undefined ? undefined : { segments });
|
|
87
123
|
}
|
|
88
124
|
/**
|
|
89
|
-
* Call a
|
|
125
|
+
* Call a library function with a rebuilt positional argument list.
|
|
90
126
|
*
|
|
91
127
|
* Generated wrappers build `__args` positionally (borrowing geometry inputs,
|
|
92
128
|
* passing value params through); a plain `fn(...args: unknown[])` spread fails
|
|
93
|
-
* TS2556 against
|
|
129
|
+
* TS2556 against fixed-arity signatures, so the call goes through this
|
|
94
130
|
* rest-typed bridge that preserves the function's own `ReturnType` (so a
|
|
95
131
|
* `Result` return keeps `.ok`/`.value` for the generated unwrap code).
|
|
96
132
|
*
|
|
97
|
-
* @param fn the
|
|
133
|
+
* @param fn the library function.
|
|
98
134
|
* @param args the rebuilt positional argument list (borrowed handles + value params).
|
|
99
|
-
* @returns whatever the
|
|
135
|
+
* @returns whatever the function returns (typed via ReturnType).
|
|
100
136
|
*/
|
|
101
137
|
export function callBrepjs(fn, args) {
|
|
102
138
|
return fn(...args);
|
|
103
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。
|
|
142
|
+
*
|
|
143
|
+
* 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法
|
|
144
|
+
* (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,
|
|
145
|
+
* D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前
|
|
146
|
+
* 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。
|
|
147
|
+
*
|
|
148
|
+
* @param opName - op 名(报错文案)。
|
|
149
|
+
* @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。
|
|
150
|
+
* @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。
|
|
151
|
+
*/
|
|
152
|
+
export function assertEngineFor(opName, engines) {
|
|
153
|
+
const current = getBackends().config.brepEngineId;
|
|
154
|
+
if (current === null || current === undefined || !engines.some((e) => e === current)) {
|
|
155
|
+
const e = new Error(`E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`);
|
|
156
|
+
e.name = 'BrepUnsupportedError';
|
|
157
|
+
throw e;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
104
160
|
// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────
|
|
105
|
-
/** Already-adopted handle dedup table: the same
|
|
161
|
+
/** Already-adopted handle dedup table: the same library handle adopted twice →
|
|
106
162
|
* the same faijs Shape (prevents double ownership / double dispose, R6). */
|
|
107
163
|
const adoptedMap = new WeakMap();
|
|
108
164
|
/**
|
|
109
|
-
* Adopt a
|
|
165
|
+
* Adopt a library handle as a faijs Shape (compatOp step 5's only adoption
|
|
110
166
|
* entry point).
|
|
111
167
|
*
|
|
112
168
|
* ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);
|
|
113
169
|
* ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY
|
|
114
170
|
* (v1 boundary rejection, R4; the brand is a compile-time phantom type —
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* ③ entities (solid/compound) → unregisterFromCleanup
|
|
118
|
-
* finalizer
|
|
119
|
-
* already adopted when the wrapping object gets GC'd) → adoptBrepjsProduct.
|
|
171
|
+
* the runtime kind is read from the occt-wasm handle's own `type` field,
|
|
172
|
+
* same as the kernel getShapeType helpers);
|
|
173
|
+
* ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs
|
|
174
|
+
* finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.
|
|
120
175
|
*
|
|
121
|
-
* @param product - the
|
|
176
|
+
* @param product - the library result (handle or plain data record).
|
|
122
177
|
* @param opName - the op name (error messages).
|
|
123
178
|
* @param segments - optional tessellation segments (compat `segments?`).
|
|
124
179
|
* @returns the adopted faijs Shape, or the plain data untouched.
|
|
@@ -135,7 +190,7 @@ export function adoptEntity(product, opName, segments) {
|
|
|
135
190
|
throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
|
|
136
191
|
'must not cross the library boundary; return entity solids or plain data');
|
|
137
192
|
}
|
|
138
|
-
unregisterFromCleanup(h); // ★ R1:
|
|
193
|
+
unregisterFromCleanup(h); // ★ R1: no-op(brepjs registry 已删除)
|
|
139
194
|
const s = adoptBrepjsProduct(h, segments); // fromHandle: tessellation + identity + BREP slots
|
|
140
195
|
adoptedMap.set(h, s);
|
|
141
196
|
return s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAE9E,OAAO,EAAE,MAAM,IAAI,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAA;AACjH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAQ;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAA2B,CAAA;IACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,+CAA+C,CAClD,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC;QACzC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,KAAc,CAAC,EAAE,KAAc,CAAC,CAAA;IACnF,OAAO,oBAAoB,CAAC,WAAoB,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,QAAiB;IACpE,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,CAAC;IACD,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,UAAU,GAAI,OAAgC,CAAC,OAAO,CAAA;IAC5D,MAAM,KAAK,GACT,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,UAAU;QACzE,CAAC,CAAE,UAA6B,CAAC,EAAE;QACnC,CAAC,CAAE,UAAqB,CAAA;IAC5B,MAAM,OAAO,GAAG,KAAmB,CAAA;IACnC,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAuC,EAAK,EAAE,IAAe;IACrF,OAAO,EAAE,CAAC,GAAI,IAAgB,CAAkB,CAAA;AAClD,CAAC;AAED,gFAAgF;AAEhF;6EAC6E;AAC7E,MAAM,UAAU,GAAG,IAAI,OAAO,EAAiB,CAAA;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAc,EAAE,QAAiB;IAC7E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IAC9F,MAAM,CAAC,GAAG,OAAsB,CAAA;IAChC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9B,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,IAAI,GAAI,CAAC,CAAC,OAA6B,CAAC,IAAI,CAAA;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,OAAO,CACf,MAAM,EACN,qBAAqB,EACrB,yBAAyB,MAAM,6CAA6C,IAAI,KAAK;YACnF,yEAAyE,CAC5E,CAAA;IACH,CAAC;IACD,qBAAqB,CAAC,CAAC,CAAC,CAAA,CAAC,4DAA4D;IACrF,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA,CAAC,mDAAmD;IAC7F,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ vendored brepjs shape(生成层共用,E5 模板)\n *\n * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5\n *\n * 桥接事实(2026-09-02 实测):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - vendored brepjs 的 `ShapeHandle.wrapped`(`core/disposal.ts`)运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例(`api/occt-kernel-bridge.ts`)\n * 保证两者共享同一 wasm,句柄空间一致,**零拷贝互操作**。\n *\n * 因此投影一个 brepjs op 只需三件事:\n * 1. faijs Shape → brepjs 输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);\n * 2. 调 vendored 函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. brepjs 产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / vendored disposal 的类型与借入工具 / vendored occtWasm helpers\n * 的句柄视图工厂(`handle`/`isOcctWasmHandle`,纯对象工厂无 wasm 依赖)/ `api/`\n * 层的内核桥读取器(`getBrepjsKernel`),保持 dist/sdk.js 零 heavy 依赖。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { fromHandle } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { createBorrowedHandle } from '../../vendored/brepjs/core/disposal.js'\nimport { unregisterFromCleanup } from '../../vendored/brepjs/core/disposal.js'\nimport type { ShapeHandle } from '../../vendored/brepjs/core/disposal.js'\nimport { handle as occtWasmHandleView, isOcctWasmHandle } from '../../vendored/brepjs/kernel/occtWasm/helpers.js'\nimport { getBrepjsKernel } from '../occt-kernel-bridge'\nimport { OpError } from './result-unwrap'\n\n/**\n * Borrow a faijs Shape's OCCT handle as a vendored brepjs shape handle.\n *\n * No ownership transfer: the brepjs-side borrow is a no-op-dispose view of the\n * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to\n * vendored functions that take `Shapeable<T>` / `AnyShape`.\n *\n * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a\n * branded number), but the vendored code consumes `KernelShape` as an *object*\n * (the shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct\n * `shape.type` reads in `topologyOps.shapeType`) — a raw number crashes there\n * (\"Invalid value used as weak map key\"). The id is therefore wrapped into a\n * structurally valid `OcctWasmHandle` view: the type is queried from the bound\n * kernel through the numeric fallback branch of `topologyOps.shapeType`, and\n * the `handle()` factory keeps `delete` a no-op (non-owning view — the arena\n * slot and its ownership are untouched).\n *\n * @param s - the faijs Shape whose brep slot is borrowed.\n * @returns a vendored brepjs ShapeHandle view of the same occt shape.\n * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).\n */\nexport function borrowBrepjsShape(s: Shape): ShapeHandle {\n const solid = brepOf(s) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot run on the brep path)',\n )\n }\n const kernelShape = isOcctWasmHandle(solid)\n ? solid\n : occtWasmHandleView(getBrepjsKernel().shapeType(solid as never), solid as never)\n return createBorrowedHandle(kernelShape as never)\n}\n\n/**\n * Adopt a vendored brepjs product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the brepjs\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a vendored brepjs shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments (brepjs 投影侧 `segments?`,\n * 裁决 1;透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the vendored engine')\n }\n // vendored `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a vendored brepjs function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (borrowing geometry inputs,\n * passing value params through); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against brepjs' fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the vendored brepjs function.\n * @param args the rebuilt positional argument list (borrowed handles + value params).\n * @returns whatever the vendored function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same vendored handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a vendored handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * shapeTypes.ts:93-95 — so the runtime kind is read from the occt-wasm\n * handle's own `type` field, same as the kernel getShapeType helpers.ts:77-79);\n * ③ entities (solid/compound) → unregisterFromCleanup (★ R1: drop the\n * finalizer, otherwise disposal.ts:117-124 disposes the slot faijs has\n * already adopted when the wrapping object gets GC'd) → adoptBrepjsProduct.\n *\n * @param product - the vendored result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as ShapeHandle\n const prev = adoptedMap.get(h)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h) // ★ R1: one-line fix replacing gear-lib-demo's pinned array\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h, s)\n return s\n}\n"]}
|
|
1
|
+
{"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AA+BzC,MAAM,MAAM,GAAG,GAAS,EAAE,GAAE,CAAC,CAAA;AAE7B,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,IAAY,EAAE,EAAU;IAClD,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,IAAI;QACJ,EAAE;QACF,MAAM,EAAE,MAAM;QACd,QAAQ,CAAC,UAAkB;YACzB,OAAO,EAAE,GAAG,UAAU,CAAA;QACxB,CAAC;QACD,MAAM;YACJ,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA4B,CAAC,UAAU,KAAK,IAAI,CAAA;AACzG,CAAC;AAED,6EAA6E;AAC7E,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,KAAK,CAAA;QACd,CAAC;QACD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM;QACxB,MAAM,EAAE,MAAM;QACd,6EAA6E;QAC7E,6EAA6E;QAC7E,SAAS,EAAE,MAAM;KAClB,CAAA;AACH,CAAC;AAED,uDAAuD;AACvD,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,uEAAuE;AACzE,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAQ;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAA2B,CAAA;IACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,+CAA+C,CAClD,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC;QACzC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,KAAc,CAAC,EAAE,KAAe,CAAC,CAAA;IAC/E,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,QAAiB;IACpE,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,uEAAuE;IACvE,qEAAqE;IACrE,MAAM,UAAU,GAAI,OAAgC,CAAC,OAAO,CAAA;IAC5D,MAAM,KAAK,GACT,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,UAAU;QACzE,CAAC,CAAE,UAA6B,CAAC,EAAE;QACnC,CAAC,CAAE,UAAqB,CAAA;IAC5B,MAAM,OAAO,GAAG,KAAmB,CAAA;IACnC,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAuC,EAAK,EAAE,IAAe;IACrF,OAAO,EAAE,CAAC,GAAI,IAAgB,CAAkB,CAAA;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAA0B;IACxE,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAA;IACjD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,GAAG,IAAI,KAAK,CACjB,2BAA2B,MAAM,qBAAqB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,OAAO,IAAI,QAAQ,GAAG,CAC9G,CAAA;QACD,CAAC,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAC/B,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;6EAC6E;AAC7E,MAAM,UAAU,GAAG,IAAI,OAAO,EAAiB,CAAA;AAE/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAc,EAAE,QAAiB;IAC7E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IAC9F,MAAM,CAAC,GAAG,OAA8B,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAW,CAAC,CAAA;IACxC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,IAAI,GAAI,CAAC,CAAC,OAA6B,CAAC,IAAI,CAAA;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QAClE,MAAM,IAAI,OAAO,CACf,MAAM,EACN,qBAAqB,EACrB,yBAAyB,MAAM,6CAA6C,IAAI,KAAK;YACnF,yEAAyE,CAC5E,CAAA;IACH,CAAC;IACD,qBAAqB,CAAC,CAAW,CAAC,CAAA,CAAC,mCAAmC;IACtE,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA,CAAC,mDAAmD;IAC7F,UAAU,CAAC,GAAG,CAAC,CAAW,EAAE,CAAC,CAAC,CAAA;IAC9B,OAAO,CAAC,CAAA;AACV,CAAC","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { fromHandle, getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(createBorrowedHandle /\n// unregisterFromCleanup / ShapeHandle)与 kernel/occtWasm/helpers.js\n// (handle / isOcctWasmHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** occt-wasm 句柄对象视图(type + id,delete no-op)。 */\nexport interface OcctWasmHandleView {\n __occtWasm: true\n type: string\n id: number\n delete(): void\n HashCode(upperBound: number): number\n IsNull(): boolean\n}\n\nconst noopFn = (): void => {}\n\n/** Build an opaque kernel handle for an arena-allocated WASM shape. */\nfunction occtWasmHandleView(type: string, id: number): OcctWasmHandleView {\n return {\n __occtWasm: true,\n type,\n id,\n delete: noopFn,\n HashCode(upperBound: number) {\n return id % upperBound\n },\n IsNull() {\n return false\n },\n }\n}\n\nfunction isOcctWasmHandle(shape: unknown): shape is OcctWasmHandleView {\n return typeof shape === 'object' && shape !== null && (shape as OcctWasmHandleView).__occtWasm === true\n}\n\n/** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */\nfunction createBorrowedHandle(ocShape: unknown): BorrowedShapeHandle {\n return {\n get wrapped() {\n return ocShape\n },\n get disposed() {\n return false\n },\n [Symbol.dispose]: noopFn,\n delete: noopFn,\n // Intentionally a no-op: a borrowed view never disposes, so a callback would\n // never fire. Tie dependent lifetimes to the owning parent's handle instead.\n onDispose: noopFn,\n }\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Borrow a faijs Shape's OCCT handle as a library-side shape handle.\n *\n * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the\n * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to\n * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.\n *\n * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a\n * branded number), but library code consumes shapes as *objects* (the\n * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct\n * `shape.type` reads) — a raw number crashes there (\"Invalid value used as weak\n * map key\"). The id is therefore wrapped into a structurally valid\n * `OcctWasmHandleView`: the type is queried from the bound occt kernel through\n * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —\n * the arena slot and its ownership are untouched).\n *\n * @param s - the faijs Shape whose brep slot is borrowed.\n * @returns a library-side ShapeHandle view of the same occt shape.\n * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).\n */\nexport function borrowBrepjsShape(s: Shape): BorrowedShapeHandle {\n const solid = brepOf(s) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot run on the brep path)',\n )\n }\n const kernelShape = isOcctWasmHandle(solid)\n ? solid\n : occtWasmHandleView(getBrepApi().shapeType(solid as never), solid as number)\n return createBorrowedHandle(kernelShape)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (borrowing geometry inputs,\n * passing value params through); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (borrowed handles + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)
|
|
3
|
+
*
|
|
4
|
+
* `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.sketch(...)`(产出 **face**),
|
|
5
|
+
* 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。
|
|
6
|
+
* 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。
|
|
7
|
+
*
|
|
8
|
+
* 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:
|
|
9
|
+
* - 1D 截面(`cad.wire` / `cad.helix` / `cad.sketch({as:'wire'})`)→ 借用原句柄;
|
|
10
|
+
* - 2D 截面(`cad.sketch` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
|
|
11
|
+
*
|
|
12
|
+
* core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
|
|
13
|
+
* (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
|
|
14
|
+
* arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
|
|
15
|
+
* 曲线借用(borrowed=true)不 release。
|
|
16
|
+
*/
|
|
17
|
+
import type { Shape } from '../../mesh/types.js';
|
|
18
|
+
import type { BrepHandle } from '../../brep/engine/types.js';
|
|
19
|
+
/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */
|
|
20
|
+
export interface WireView {
|
|
21
|
+
wrapped: BrepHandle;
|
|
22
|
+
/** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */
|
|
23
|
+
borrowed: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** 截面 Shape → wire 视图(面取其外环)。
|
|
26
|
+
*
|
|
27
|
+
* @param section - Section shape (curve or face) to adapt.
|
|
28
|
+
* @returns The wire view wrapping the handle and its ownership flag.
|
|
29
|
+
*/
|
|
30
|
+
export declare function toProfileWireView(section: Shape): WireView;
|
|
31
|
+
//# sourceMappingURL=profile-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-wire.d.ts","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAG7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,UAAU,CAAA;IACnB,qEAAqE;IACrE,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,GAAG,QAAQ,CAS1D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)
|
|
3
|
+
*
|
|
4
|
+
* `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.sketch(...)`(产出 **face**),
|
|
5
|
+
* 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。
|
|
6
|
+
* 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。
|
|
7
|
+
*
|
|
8
|
+
* 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:
|
|
9
|
+
* - 1D 截面(`cad.wire` / `cad.helix` / `cad.sketch({as:'wire'})`)→ 借用原句柄;
|
|
10
|
+
* - 2D 截面(`cad.sketch` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
|
|
11
|
+
*
|
|
12
|
+
* core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
|
|
13
|
+
* (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
|
|
14
|
+
* arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
|
|
15
|
+
* 曲线借用(borrowed=true)不 release。
|
|
16
|
+
*/
|
|
17
|
+
import { brepOf, isCurveShape } from '../../shape.js';
|
|
18
|
+
import { getBrepApi } from '../../brep/handle-bridge.js';
|
|
19
|
+
/** 截面 Shape → wire 视图(面取其外环)。
|
|
20
|
+
*
|
|
21
|
+
* @param section - Section shape (curve or face) to adapt.
|
|
22
|
+
* @returns The wire view wrapping the handle and its ownership flag.
|
|
23
|
+
*/
|
|
24
|
+
export function toProfileWireView(section) {
|
|
25
|
+
const handle = brepOf(section);
|
|
26
|
+
if (isCurveShape(section))
|
|
27
|
+
return { wrapped: handle, borrowed: true };
|
|
28
|
+
const kernel = getBrepApi();
|
|
29
|
+
const faces = kernel.getSubShapes(handle, 'face');
|
|
30
|
+
if (faces.length === 0)
|
|
31
|
+
return { wrapped: handle, borrowed: true };
|
|
32
|
+
const wires = kernel.getSubShapes(faces[0], 'wire');
|
|
33
|
+
if (wires.length === 0)
|
|
34
|
+
return { wrapped: handle, borrowed: true };
|
|
35
|
+
return { wrapped: wires[0], borrowed: false };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=profile-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-wire.js","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAUrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAe,CAAA;IAC5C,IAAI,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["/**\n * profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)\n *\n * `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.sketch(...)`(产出 **face**),\n * 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。\n * 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。\n *\n * 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:\n * - 1D 截面(`cad.wire` / `cad.helix` / `cad.sketch({as:'wire'})`)→ 借用原句柄;\n * - 2D 截面(`cad.sketch` 的面)→ 取**外环**(孔环不参与扫掠/放样)。\n *\n * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`\n * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是\n * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;\n * 曲线借用(borrowed=true)不 release。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf, isCurveShape } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */\nexport interface WireView {\n wrapped: BrepHandle\n /** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */\n borrowed: boolean\n}\n\n/** 截面 Shape → wire 视图(面取其外环)。\n *\n * @param section - Section shape (curve or face) to adapt.\n * @returns The wire view wrapping the handle and its ownership flag.\n */\nexport function toProfileWireView(section: Shape): WireView {\n const handle = brepOf(section) as BrepHandle\n if (isCurveShape(section)) return { wrapped: handle, borrowed: true }\n const kernel = getBrepApi()\n const faces = kernel.getSubShapes(handle, 'face')\n if (faces.length === 0) return { wrapped: handle, borrowed: true }\n const wires = kernel.getSubShapes(faces[0], 'wire')\n if (wires.length === 0) return { wrapped: handle, borrowed: true }\n return { wrapped: wires[0], borrowed: false }\n}\n"]}
|
|
@@ -37,10 +37,10 @@ export function buildReplicaRoleTable(kernel, input, resultSolid, replicas, outS
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
const inputFaces = kernel.getSubShapes(inputSolid, 'face');
|
|
40
|
-
const inputCentroids = inputFaces.map((f) => kernel.
|
|
40
|
+
const inputCentroids = inputFaces.map((f) => kernel.surfaceCenterOfMass(f));
|
|
41
41
|
const resultHashes = getFaceHashes(kernel, resultSolid);
|
|
42
42
|
const resultFaces = kernel.getSubShapes(resultSolid, 'face');
|
|
43
|
-
const resultCentroids = resultFaces.map((f) => kernel.
|
|
43
|
+
const resultCentroids = resultFaces.map((f) => kernel.surfaceCenterOfMass(f));
|
|
44
44
|
const roleTable = new Map();
|
|
45
45
|
const inner = new Map();
|
|
46
46
|
for (let i = 0; i < resultHashes.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replica-role-table.js","sourceRoot":"","sources":["../../../src/api/internal/replica-role-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAUzD;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAqB,EACrB,KAAY,EACZ,WAAuB,EACvB,QAA4B,EAC5B,OAAe;IAEf,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAe,CAAA;IAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAA0B,CAAA;IAEjE,mDAAmD;IACnD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK;gBAAE,KAAK,MAAM,CAAC,IAAI,MAAM;oBAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC1F,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"replica-role-table.js","sourceRoot":"","sources":["../../../src/api/internal/replica-role-table.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * replica-role-table — generalized replica[k] role-table builder (Phase 3 L3).\n *\n * Shared by the handwritten replicate ops (circularPattern / gridPattern /\n * rectangularPattern / mirrorJoin). Every replica is a rigid transform T_k of\n * the input; result faces = ∪ T_k(input faces). For each result face, its\n * centroid is mapped back through T_k⁻¹ into input coordinates and matched to\n * the nearest input-face centroid, recovering the input role, prefixed with\n * the replica label: `replica[k]/<inner>`.\n *\n * Same mechanism as pattern.ts linearPattern (centroid clustering), generalized\n * from a projection along one direction to arbitrary per-replica inverses.\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle, BrepVec3 } from '../../brep/engine/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { RoleTable } from '../../topology/naming/types'\nimport { brepOf, inputRoleTable } from '../../shape'\nimport { getFaceHashes } from '../../brep/face-evolution'\n\n/** One replica: role-table label prefix + inverse of its placement transform. */\nexport interface ReplicaTransform {\n /** Label prefix, e.g. 'replica[2]' / 'replica[1_0]'. */\n label: string\n /** Map a result-face centroid back into the input coordinate frame (T_k⁻¹). */\n inverse: (c: BrepVec3) => BrepVec3\n}\n\n/**\n * Build the `replica[*]/<inner>` role table for a fused multi-replica result.\n *\n * @param kernel - the BREP engine api.\n * @param input - the source Shape (its role table provides inner roles).\n * @param resultSolid - the fused result handle.\n * @param replicas - per-replica label + inverse transform.\n * @param outStmt - the output statement id (role-table key).\n * @returns the role table keyed by outStmt.\n */\nexport function buildReplicaRoleTable(\n kernel: BrepEngineApi,\n input: Shape,\n resultSolid: BrepHandle,\n replicas: ReplicaTransform[],\n outStmt: string,\n): RoleTable {\n const inputSolid = brepOf(input) as BrepHandle\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n\n // input face hash → role (for inner-role recovery)\n const inputHashes = getFaceHashes(kernel, inputSolid)\n const inputHashToRole = new Map<number, string>()\n if (inputTable) {\n for (const roles of inputTable.values()) {\n for (const [role, hashes] of roles) for (const h of hashes) inputHashToRole.set(h, role)\n }\n }\n const inputFaces = kernel.getSubShapes(inputSolid, 'face')\n const inputCentroids = inputFaces.map((f) => kernel.surfaceCenterOfMass(f))\n\n const resultHashes = getFaceHashes(kernel, resultSolid)\n const resultFaces = kernel.getSubShapes(resultSolid, 'face')\n const resultCentroids = resultFaces.map((f) => kernel.surfaceCenterOfMass(f))\n\n const roleTable = new Map<string, Map<string, number[]>>()\n const inner = new Map<string, number[]>()\n for (let i = 0; i < resultHashes.length; i++) {\n const c = resultCentroids[i]!\n // Try every replica inverse; the one mapping closest to an input face\n // centroid wins (identifies both the replica k and the inner role).\n let bestLabel = replicas[0]!.label\n let bestRole: string | undefined\n let bestDist = Infinity\n for (const r of replicas) {\n const p = r.inverse(c)\n for (let j = 0; j < inputCentroids.length; j++) {\n const ic = inputCentroids[j]!\n const d = (p.x - ic.x) ** 2 + (p.y - ic.y) ** 2 + (p.z - ic.z) ** 2\n if (d < bestDist) {\n bestDist = d\n bestLabel = r.label\n bestRole = inputHashToRole.get(inputHashes[j]!)\n }\n }\n }\n const role = `${bestLabel}/${bestRole ?? 'face'}`\n if (!inner.has(role)) inner.set(role, [])\n inner.get(role)!.push(resultHashes[i]!)\n }\n roleTable.set(outStmt as never, inner)\n return roleTable as unknown as RoleTable\n}\n"]}
|