@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE3D,uCAAuC;AACvC,MAAM,WAAW,QAAQ;IACvB,yBAAyB;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,oBAAoB,CAAA;QAC1B,qDAAqD;QACrD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B;;;;;;;;WAQG;QACH,gBAAgB,CAAC,EAAE;YACjB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;YAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;YACd,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,UAAU,CAAC,EAAE,OAAO,CAAA;YACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;SACnB,CAAA;QACD,aAAa,CAAC,EAAE;YAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAA;KACzF,CAAA;IACD,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;QAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;QACjC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAAA;KAClC,CAAA;IACD,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,CAAC,EAAE,eAAe,CAAA;CAC/B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAA;AAEjC,0CAA0C;AAC1C,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;AAElD,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAM9E;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAA;gBACnB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe;CAKpD;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAA;gBACnB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe;CAKpD;AAID;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,iCAAiC;IACjC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC9B,8BAA8B;IAC9B,WAAW,EAAE,eAAe,GAAG,SAAS,CAAA;IACxC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACjC,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/C,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC;AAWD,uDAAuD;AACvD,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,EAAE,CAIlD;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAIrC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AASD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAKrF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAS5G;AAOD,gGAAgG;AAChG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3C;AAED,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;AAKvE;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAGrF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAS3G;AAKD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAsBnD;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAMtC;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAQtE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,eAAe,GAAG,SAAS,CAE5D;AAID;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE3D;AAID;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAInF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAErD"}
|
|
1
|
+
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * runtime-state — 全局运行时状态锚点(零依赖层)\n *\n *\n * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api,原 stdlib)与\n * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:\n * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。\n *\n * 承载三类状态:\n * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 标准库命名空间)\n * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)\n * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查\n *\n * ⚠️ 依赖方向红线:本文件不得 import 任何 src/ 下的模块(只可 import type)。\n */\n\nimport type { PartName, StmtId } from './identity'\n\n/**\n * Lightweight execution anchor — carries only the fields consumed by\n * library functions via getCurrentStmt(): `id` (StmtId), `outputs` (PartName[]),\n * `callee`, and `hasAssignment`. The DirectExecutor creates these from\n * line-number + writes.\n */\nexport interface ExecutionAnchor {\n readonly id: string\n readonly outputs: PartName[]\n readonly callee?: string\n readonly hasAssignment?: boolean\n}\n\n// ── 后端配置(宿主注入的环境资源)──\n\n/**\n * 执行模式(与 src/cad-runtime/ports.ts 的 ExecutionMode 保持一致)。\n *\n * 此处重复定义是为了保持本模块零依赖。一致性由 `cad-runtime/runtime.ts:460`\n * (`mode: this.mode`,`ExecutionMode` → 本类型的赋值)在编译期间接钉住:\n * 只给 `ExecutionMode` 加成员而不加到这里 → 该行 tsc 报错。\n * (2026-09-22 核实:无独立守卫测试。)\n */\nexport type RuntimeExecutionMode = 'auto' | 'brep' | 'mesh'\n\n/** 宿主注入的环境资源。字段类型用宽松结构,避免本模块依赖具体实现。 */\nexport interface Backends {\n /** 契约版本(装配期校验,不兼容即抛错) */\n readonly contractVersion: number\n /** 执行配置(可变对象,宿主可在运行期切换) */\n readonly config: {\n mode: RuntimeExecutionMode\n /** 当前 BREP 引擎 id(注册表首个注册者;未注册为 null)。能力路由读(§8.4)。 */\n brepEngineId?: string | null\n /**\n * 当前引擎能力声明(宽松结构,零依赖)。能力路由读(§8.4)。\n *\n * `evolution` = 本引擎**实际提供**的 `*WithHistory` 核函数名名单\n * (`brep/engine/types.ts` 的 `BrepEvolutionKind`)。**不是**族级布尔——\n * 族级布尔会多报能力、使静态判定失效(Phase 0.2)。\n * 本模块须零依赖,故此处只写 `readonly string[]`;权威类型见\n * `BrepCapabilities`,消费侧由 `backend-dispatch.engineCapabilitySet` 归一化。\n */\n brepCapabilities?: {\n evolution?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n }\n partTransform?: { position: [number, number, number]; scale?: [number, number, number] }\n }\n /** 几何后端。brep 引擎异步初始化 → 用 getter。 */\n readonly kernel: {\n readonly brep: unknown | null\n readonly csg: unknown | undefined\n readonly sdf: unknown | undefined\n }\n /** 宿主端口(透传 HostPorts) */\n readonly fonts: unknown\n readonly texture: unknown\n readonly assets: unknown\n readonly events: unknown\n /** faijs 自带标准库命名空间(引擎不区分它与第三方库——都是库函数;P5 起由宿主注入,core 不默认装配) */\n readonly cad?: StdlibNamespace\n}\n\n/**\n * 契约版本。破坏性变更 +1。加载第三方库时校验,不兼容即抛错。\n *\n * v3(P23,§5.2 / D11):`defineOp` 的实现边界统一为 Result 语义——实现可返回\n * `Result`(边界 unwrap,`err` → 抛错)、可抛错(归一为带 op 名的错误),\n * 也可照旧返回裸产物(透传);并新增 D11 `positional` 位置形态声明。\n * v2 → v3 是破坏性变更:按 v2 契约构建的库必须重新构建。\n */\nexport const CONTRACT_VERSION = 3\n\n/** 库函数签名(引擎视角:任意参数的普通函数,信息均匀化,不按名字分支)。 */\nexport type StdlibFn = (...args: any[]) => unknown\n\n/** 库命名空间:函数名 → 库函数(faijs 自带标准库与第三方库同构)。 */\nexport interface StdlibNamespace {\n [name: string]: StdlibFn\n}\n\n/**\n * 契约版本校验(P7 第三方库通道):加载时校验,不兼容即抛错(不静默降级)。\n * 第三方库模块若带 contractVersion 字段(与 CONTRACT_VERSION 对齐),必须匹配。\n *\n * @param lib - the library module whose contractVersion field is validated.\n */\nexport function assertContractVersion(lib: { contractVersion?: unknown }): void {\n if (lib.contractVersion !== undefined && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library contract version mismatch: got ${String(lib.contractVersion)}, expected ${CONTRACT_VERSION}`,\n )\n }\n}\n\n/**\n * brep 强制模式下的不支持错误(mesh-only 函数 / 输入不在 BREP 链)。\n *\n * 由分派路径抛出,CadRuntime 捕获后转换为 ExecutionResult.failedAt\n * (与旧解释器\"brep 模式立即返回 E_BREP_UNSUPPORTED,不静默回退 mesh\"的语义一致)。\n * P2 起定义在本层(零依赖),L3 API 命名空间与引擎共享同一类(instanceof 判定)。\n */\nexport class BrepUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'BrepUnsupportedError'\n this.stmt = stmt\n }\n}\n\n/**\n * Unsupported error for mesh-forced mode (brep-only functions, or auto-mode\n * brep-only functions with a broken input chain).\n *\n * Symmetric to BrepUnsupportedError: thrown statically by the dispatch path,\n * caught by CadRuntime and converted into ExecutionResult.failedAt. A brep-only\n * function being unavailable in mesh mode is expected behavior (mode ×\n * implementation-set mismatch), not a bug fallback — the static-dispatch red\n * line (no try-catch, no runtime fallback) is unchanged.\n */\nexport class MeshUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'MeshUnsupportedError'\n this.stmt = stmt\n }\n}\n\n// ── 状态容器 ──\n\n/**\n * The global runtime state singleton: backend configuration, the currently\n * executing statement, and the Shape identity tables (constructor registry,\n * identity slots, and Shape → PartName reverse lookup).\n */\nexport interface FaijsRuntimeState {\n readonly stateVersion: number\n /** 后端配置(configureBackends 写入) */\n backends: Backends | undefined\n /** 当前执行语句锚点(引擎在语句 fn 之前设置) */\n currentStmt: ExecutionAnchor | undefined\n /** Shape 构造器登记(isShape 的唯一依据) */\n readonly created: WeakSet<object>\n /** Shape 身份槽 */\n readonly slots: WeakMap<object, ShapeSlot>\n /** Shape → PartName 反查(keep 与 dependentsOf 用) */\n readonly shapeToName: WeakMap<object, PartName>\n /** 同语句 lineage 去重标记(define-op 写入;语句边界 setCurrentStmt 重置)。 */\n registeredStmtId: StmtId | undefined\n}\n\n// ── 函数 BREP 域(控制流放松方案 §5.6 / D13) ──\n// 本机函数体内的瞬态 BREP 句柄:进入函数时开启登记域,op 输出句柄写入时经\n// registerFunctionBrep 登记;函数返回后引擎取走域、释放除返回值可到达句柄外的全部\n// (对齐「调用方负责句柄生命周期」brep-ops.ts 与 meshesToStep 的 finally 模式)。\n// 全局计数与 DirectExecutor.userFunctionDepth 同步(单 runtime 场景,与 setCurrentStmt 同构)。\n\nlet functionBrepDepth = 0\nconst functionBrepDomain: unknown[] = []\n\n/** 进入函数 BREP 域(DirectExecutor 执行 local 语句 fn 之前调用)。 */\nexport function enterFunctionBrep(): void {\n if (functionBrepDepth === 0) functionBrepDomain.length = 0\n functionBrepDepth++\n}\n\n/** 退出函数 BREP 域(fn 结束后调用)。 */\nexport function exitFunctionBrep(): void {\n functionBrepDepth = Math.max(0, functionBrepDepth - 1)\n}\n\n/**\n * 登记函数域内新产生的 BREP 句柄(hook 点在 op 输出 shape 槽位写入处——fromBrep)。\n * 非函数域(depth = 0)时 no-op(零开销,现状路径不变)。\n * @param solid - 新产生的 OCCT 句柄。\n */\nexport function registerFunctionBrep(solid: unknown): void {\n if (functionBrepDepth > 0) functionBrepDomain.push(solid)\n}\n\n/**\n * 取走当前函数域的句柄登记表并清空(引擎在 fn 结束后调用,随后释放非返回值句柄)。\n * @returns 当前函数域的句柄登记表快照。\n */\nexport function takeFunctionBrepDomain(): unknown[] {\n const domain = [...functionBrepDomain]\n functionBrepDomain.length = 0\n return domain\n}\n\n/** Shape 身份槽(OCCT 句柄 + 面演化 + 拓扑命名 + 装配行为)。 */\nexport interface ShapeSlot {\n solid?: unknown\n faceEvolution?: Map<number, number[]>\n // 1.10 前置③:roleTable 槽字段已删除——权威落点在血缘图旁挂\n // (topology/naming/lineage.ts 的 recordOutput / tableOfPart),\n // 解析缓存 miss 由回走重算恢复(api/topo-resolve.ts)。\n /** mesh/primitive 面 hint 快照(§3.6 setTopology 注入时由 runtime 提炼写入,解析兜底用)。 */\n faceHints?: unknown\n behavior?: unknown\n}\n\n/**\n * 装配变换(引擎应用):求解在库(solveTransforms),应用与下游失效在引擎(P6)。\n * index = 成员下标(compound.children 内)。\n */\nexport interface AssemblyTransform {\n index: number\n quaternion: [number, number, number, number]\n pivot: [number, number, number]\n translation: [number, number, number]\n rotationMatrix: number[]\n}\n\n/**\n * do_assemble 的待应用变换登记(P6:求解 ≠ 传播)。\n * 库只把求解结果写到这里;引擎在语句执行后取走并应用 + 失效下游。\n */\nconst pendingAssemblyKeys = new Set<object>()\nconst pendingAssemblyTransforms = new WeakMap<object, AssemblyTransform[]>()\n\n/**\n * Register a compound's pending assembly transforms (called from the\n * do_assemble method body; accumulates across calls).\n *\n * @param c - the compound object that owns the transforms.\n * @param ts - the assembly transforms to append.\n */\nexport function setPendingAssemblyTransforms(c: object, ts: AssemblyTransform[]): void {\n if (ts.length === 0) return\n pendingAssemblyKeys.add(c)\n const existing = pendingAssemblyTransforms.get(c) ?? []\n pendingAssemblyTransforms.set(c, [...existing, ...ts])\n}\n\n/**\n * Take all pending assembly transforms and clear them (called by the engine's\n * afterStatement hook; consumed exactly once).\n *\n * @returns the list of compounds with their accumulated transforms.\n */\nexport function takePendingAssemblyTransforms(): Array<{ compound: object; transforms: AssemblyTransform[] }> {\n const out: Array<{ compound: object; transforms: AssemblyTransform[] }> = []\n for (const c of pendingAssemblyKeys) {\n const ts = pendingAssemblyTransforms.get(c)\n if (ts && ts.length > 0) out.push({ compound: c, transforms: ts })\n pendingAssemblyTransforms.delete(c)\n }\n pendingAssemblyKeys.clear()\n return out\n}\n\n// ── P3:运动副位姿登记(ExecutionResult.kinematics)──\n// 与 pendingAssemblyTransforms 同模式:库只把 solveKinematics 的 per-member 位姿\n// 写到这里,引擎在语句执行后取走并放入 ExecutionResult.kinematics(宿主动画/导出\n// 从 ExecutionResult 读取,不新增返回值消费语义)。\n\n/** 单个成员的位姿(position + faijs [x,y,z,w] rotation;与 api/assembly/joints 的 KinematicsPose 结构一致)。 */\nexport interface AssemblyKinematicsPose {\n position: [number, number, number]\n rotation: [number, number, number, number]\n}\n\n/** 位姿键:成员名 → AssemblyKinematicsPose(含恒等链根;键 = PartName)。 */\nexport type AssemblyKinematics = Record<string, AssemblyKinematicsPose>\n\nconst pendingKinematicsKeys = new Set<object>()\nconst pendingAssemblyKinematics = new WeakMap<object, AssemblyKinematics>()\n\n/**\n * Register a compound's pending assembly kinematics (P3; called from the\n * do_assemble/solve method body; accumulates across calls).\n *\n * @param c - the compound object that owns the kinematics.\n * @param kin - per-member poses keyed by member name (all members, incl. identity).\n */\nexport function setPendingAssemblyKinematics(c: object, kin: AssemblyKinematics): void {\n pendingKinematicsKeys.add(c)\n pendingAssemblyKinematics.set(c, kin)\n}\n\n/**\n * Take all pending assembly kinematics and clear them (called by the engine after\n * an assembly statement; consumed exactly once).\n *\n * @returns the list of compounds with their per-member kinematics.\n */\nexport function takePendingAssemblyKinematics(): Array<{ compound: object; kinematics: AssemblyKinematics }> {\n const out: Array<{ compound: object; kinematics: AssemblyKinematics }> = []\n for (const c of pendingKinematicsKeys) {\n const kin = pendingAssemblyKinematics.get(c)\n if (kin) out.push({ compound: c, kinematics: kin })\n pendingAssemblyKinematics.delete(c)\n }\n pendingKinematicsKeys.clear()\n return out\n}\n\nconst STATE_VERSION = 1\nconst KEY = '__FAICAD_FAIJS_RUNTIME__'\n\n/**\n * 获取全局状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 打进一份)共享同一份状态——两份 WeakSet 会导致 Shape 身份不通(几何孤岛)。\n * 构建期去重(external)是主手段,这里是兜底。\n *\n * @returns the shared global runtime state singleton.\n */\nexport function getRuntimeState(): FaijsRuntimeState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[KEY] as FaijsRuntimeState | undefined\n if (existing) {\n if (existing.stateVersion !== STATE_VERSION) {\n throw new Error(\n `[faijs] runtime state version mismatch: loaded=${existing.stateVersion}, expected=${STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: FaijsRuntimeState = {\n stateVersion: STATE_VERSION,\n backends: undefined,\n currentStmt: undefined,\n created: new WeakSet<object>(),\n slots: new WeakMap<object, ShapeSlot>(),\n shapeToName: new WeakMap<object, PartName>(),\n registeredStmtId: undefined,\n }\n g[KEY] = created\n return created\n}\n\n// ── 后端配置读写 ──\n\n/**\n * 宿主在启动时调用一次,注入环境资源。\n *\n * @param backends - the host-injected environment resources.\n */\nexport function configureBackends(backends: Backends): void {\n getRuntimeState().backends = backends\n}\n\n/**\n * 读取后端配置。库函数通过它获取内核与宿主端口。\n *\n * 未配置时抛错——不要返回默认值兜底(配置是宿主的责任,缺失必须暴露)。\n *\n * @returns the configured backend resources.\n */\nexport function getBackends(): Backends {\n const b = getRuntimeState().backends\n if (!b) {\n throw new Error('[faijs] backends not configured: call configureBackends() before executing')\n }\n return b\n}\n\n// ── 当前执行语句(引擎内部状态)──\n\n/**\n * 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。\n *\n * @param stmt - the statement currently being executed.\n */\nexport function setCurrentStmt(stmt: ExecutionAnchor | undefined): void {\n const s = getRuntimeState()\n // 语句边界:锚点变化(含语句结束置 undefined)时解除同语句 lineage 去重标记,\n // 使下一条语句(或同 id 复跑)重新获得注册资格;同一条语句内 TS 库函数\n // (如 cq-compat Workplane op)连续调用多个 defineOp 时共享锚点,标记保持\n // 生效,嵌套调用正确跳过注册(见 define-op 的 isOuter 判定)。\n if (s.currentStmt?.id !== stmt?.id) s.registeredStmtId = undefined\n s.currentStmt = stmt\n}\n\n/**\n * 读取当前执行语句。库函数不应调用它(F1)。\n *\n * @returns the currently executing statement, or undefined if none.\n */\nexport function getCurrentStmt(): ExecutionAnchor | undefined {\n return getRuntimeState().currentStmt\n}\n\n// ── Shape 身份表 ──\n\n/**\n * Shape → 变量名反查(keep 与 dependentsOf 依赖)。\n *\n * @param shape - the shape to look up.\n * @returns the part name registered for the shape, or undefined.\n */\nexport function nameOf(shape: object): PartName | undefined {\n return getRuntimeState().shapeToName.get(shape)\n}\n\n/**\n * 登记 Shape → 变量名映射。\n *\n * @param shape - the shape to register.\n * @param name - the part name to associate with the shape.\n */\nexport function setName(shape: object, name: PartName): void {\n getRuntimeState().shapeToName.set(shape, name)\n}\n\n// ── keep 声明(库函数体调用)──\n\n/**\n * 登记回调类型。由 DirectExecutor 在装配时注入(保持 runtime-state 零依赖)。\n */\nexport type KeepSink = (stmtId: string, names: PartName[], hidden: boolean) => void\n\nlet keepSink: KeepSink | undefined\n\n/**\n * 引擎装配 keep 的落地目标(DirectExecutor.registerKeep)。\n *\n * @param sink - the keep callback registered by the engine, or undefined to clear.\n */\nexport function setKeepSink(sink: KeepSink | undefined): void {\n keepSink = sink\n}\n\n/**\n * 函数体 keep 声明:声明保留这些 Shape 对应的变量(可见)。\n *\n * 库作者在库函数体内调用:\n * ```ts\n * import { keep } from '@faicad/faijs'\n * export function group(params) {\n * keep(...params.members)\n * return compound(params.members)\n * }\n * ```\n *\n * 归属到\"当前正在执行的语句\"(引擎在 fn 之前 setCurrentStmt)。\n * 未登记在 shapeToName 的对象(库内部的自定义对象)被忽略——这是刻意的静默。\n *\n * @param shapes - the shapes whose corresponding variables should be kept.\n */\nexport function keep(...shapes: unknown[]): void {\n registerKeep(shapes, false)\n}\n\n/**\n * 函数体 keep 声明:保留但 canvas 不渲染(布尔系函数的源)。\n *\n * @param shapes - the shapes whose corresponding variables should be kept hidden.\n */\nexport function keepHidden(...shapes: unknown[]): void {\n registerKeep(shapes, true)\n}\n\nfunction registerKeep(shapes: unknown[], hidden: boolean): void {\n const stmt = getRuntimeState().currentStmt\n if (!stmt || !keepSink) return\n const names: PartName[] = []\n for (const s of shapes) {\n if (s === null || typeof s !== 'object') continue\n const n = nameOf(s)\n if (n !== undefined) names.push(n)\n }\n if (names.length === 0) return\n keepSink(String(stmt.id), names, hidden)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiFH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAUjC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAkC;IACtE,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,GAAG,CAAC,eAAe,KAAK,gBAAgB,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,kDAAkD,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,cAAc,gBAAgB,EAAE,CAC9G,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,8EAA8E;IACrE,IAAI,CAAkB;IAC/B,YAAY,OAAe,EAAE,IAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,8EAA8E;IACrE,IAAI,CAAkB;IAC/B,YAAY,OAAe,EAAE,IAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAyBD,sCAAsC;AACtC,2CAA2C;AAC3C,qDAAqD;AACrD,4DAA4D;AAC5D,+EAA+E;AAE/E,IAAI,iBAAiB,GAAG,CAAC,CAAA;AACzB,MAAM,kBAAkB,GAAc,EAAE,CAAA;AAExC,uDAAuD;AACvD,MAAM,UAAU,iBAAiB;IAC/B,IAAI,iBAAiB,KAAK,CAAC;QAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAC1D,iBAAiB,EAAE,CAAA;AACrB,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,gBAAgB;IAC9B,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,iBAAiB,GAAG,CAAC;QAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,MAAM,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAA;IACtC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAA;AACf,CAAC;AA0BD;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAA;AAC7C,MAAM,yBAAyB,GAAG,IAAI,OAAO,EAA+B,CAAA;AAE5E;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,CAAS,EAAE,EAAuB;IAC7E,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC3B,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,yBAAyB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,GAAG,GAAiE,EAAE,CAAA;IAC5E,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC3C,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;QAClE,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,mBAAmB,CAAC,KAAK,EAAE,CAAA;IAC3B,OAAO,GAAG,CAAA;AACZ,CAAC;AAgBD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAA;AAC/C,MAAM,yBAAyB,GAAG,IAAI,OAAO,EAA8B,CAAA;AAE3E;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,CAAS,EAAE,GAAuB;IAC7E,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5B,yBAAyB,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,GAAG,GAAgE,EAAE,CAAA;IAC3E,KAAK,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5C,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;QACnD,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,qBAAqB,CAAC,KAAK,EAAE,CAAA;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,MAAM,GAAG,GAAG,0BAA0B,CAAA;AAEtC;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,UAAgD,CAAA;IAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAkC,CAAA;IACxD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,CAAC,YAAY,cAAc,aAAa,EAAE,CACrG,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,OAAO,GAAsB;QACjC,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,IAAI,OAAO,EAAU;QAC9B,KAAK,EAAE,IAAI,OAAO,EAAqB;QACvC,WAAW,EAAE,IAAI,OAAO,EAAoB;QAC5C,gBAAgB,EAAE,SAAS;KAC5B,CAAA;IACD,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;IAChB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,eAAe;AAEf;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,eAAe,EAAE,CAAC,QAAQ,GAAG,QAAQ,CAAA;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC,QAAQ,CAAA;IACpC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;IAC/F,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,sBAAsB;AAEtB;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiC;IAC9D,MAAM,CAAC,GAAG,eAAe,EAAE,CAAA;IAC3B,kDAAkD;IAClD,yCAAyC;IACzC,uDAAuD;IACvD,2CAA2C;IAC3C,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE;QAAE,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAA;IAClE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAA;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,eAAe,EAAE,CAAC,WAAW,CAAA;AACtC,CAAC;AAED,kBAAkB;AAElB;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,eAAe,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,IAAc;IACnD,eAAe,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAChD,CAAC;AASD,IAAI,QAA8B,CAAA;AAElC;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAA0B;IACpD,QAAQ,GAAG,IAAI,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,MAAiB;IACvC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAG,MAAiB;IAC7C,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,MAAiB,EAAE,MAAe;IACtD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC,WAAW,CAAA;IAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAM;IAC9B,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAQ;QACjD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC9B,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AAC1C,CAAC","sourcesContent":["/**\n * runtime-state — 全局运行时状态锚点(零依赖层)\n *\n *\n * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api,原 stdlib)与\n * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:\n * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。\n *\n * 承载三类状态:\n * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 标准库命名空间)\n * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)\n * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查\n *\n * ⚠️ 依赖方向红线:本文件不得 import 任何 src/ 下的模块(只可 import type)。\n */\n\nimport type { PartName, StmtId } from './identity'\n\n/**\n * Lightweight execution anchor — carries only the fields consumed by\n * library functions via getCurrentStmt(): `id` (StmtId), `outputs` (PartName[]),\n * `callee`, and `hasAssignment`. The DirectExecutor creates these from\n * line-number + writes.\n */\nexport interface ExecutionAnchor {\n readonly id: string\n readonly outputs: PartName[]\n readonly callee?: string\n readonly hasAssignment?: boolean\n}\n\n// ── 后端配置(宿主注入的环境资源)──\n\n/**\n * 执行模式(与 src/cad-runtime/ports.ts 的 ExecutionMode 保持一致)。\n *\n * 此处重复定义是为了保持本模块零依赖。一致性由 `cad-runtime/runtime.ts:460`\n * (`mode: this.mode`,`ExecutionMode` → 本类型的赋值)在编译期间接钉住:\n * 只给 `ExecutionMode` 加成员而不加到这里 → 该行 tsc 报错。\n * (2026-09-22 核实:无独立守卫测试。)\n */\nexport type RuntimeExecutionMode = 'auto' | 'brep' | 'mesh'\n\n/** 宿主注入的环境资源。字段类型用宽松结构,避免本模块依赖具体实现。 */\nexport interface Backends {\n /** 契约版本(装配期校验,不兼容即抛错) */\n readonly contractVersion: number\n /** 执行配置(可变对象,宿主可在运行期切换) */\n readonly config: {\n mode: RuntimeExecutionMode\n /** 当前 BREP 引擎 id(注册表首个注册者;未注册为 null)。能力路由读(§8.4)。 */\n brepEngineId?: string | null\n /**\n * 当前引擎能力声明(宽松结构,零依赖)。能力路由读(§8.4)。\n *\n * `evolution` = 本引擎**实际提供**的 `*WithHistory` 核函数名名单\n * (`brep/engine/types.ts` 的 `BrepEvolutionKind`)。**不是**族级布尔——\n * 族级布尔会多报能力、使静态判定失效(Phase 0.2)。\n * 本模块须零依赖,故此处只写 `readonly string[]`;权威类型见\n * `BrepCapabilities`,消费侧由 `backend-dispatch.engineCapabilitySet` 归一化。\n */\n brepCapabilities?: {\n evolution?: readonly string[]\n /**\n * 非演化内核方法名(D5):本引擎**实际提供**的 L1 中立方法名\n * (`getBoundingBox` / `getVolume` / `getSurfaceArea` / `getLength` /\n * `getCenterOfMass` 等)。2026-09-24 narrowing plan §2.4:与\n * `backend-dispatch.EngineCapabilitiesLike` 对齐(该类型有 `methods`,\n * 运行时配置镜像此前缺失——非字面量赋值不做 excess property 检查,\n * `methods` 判定\"能用但没被契约钉住\")。\n */\n methods?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n }\n partTransform?: { position: [number, number, number]; scale?: [number, number, number] }\n }\n /** 几何后端。brep 引擎异步初始化 → 用 getter。 */\n readonly kernel: {\n readonly brep: unknown | null\n readonly csg: unknown | undefined\n readonly sdf: unknown | undefined\n }\n /** 宿主端口(透传 HostPorts) */\n readonly fonts: unknown\n readonly texture: unknown\n readonly assets: unknown\n readonly events: unknown\n /** faijs 自带标准库命名空间(引擎不区分它与第三方库——都是库函数;P5 起由宿主注入,core 不默认装配) */\n readonly cad?: StdlibNamespace\n}\n\n/**\n * 契约版本。破坏性变更 +1。加载第三方库时校验,不兼容即抛错。\n *\n * v3(P23,§5.2 / D11):`defineOp` 的实现边界统一为 Result 语义——实现可返回\n * `Result`(边界 unwrap,`err` → 抛错)、可抛错(归一为带 op 名的错误),\n * 也可照旧返回裸产物(透传);并新增 D11 `positional` 位置形态声明。\n * v2 → v3 是破坏性变更:按 v2 契约构建的库必须重新构建。\n */\nexport const CONTRACT_VERSION = 3\n\n/** 库函数签名(引擎视角:任意参数的普通函数,信息均匀化,不按名字分支)。 */\nexport type StdlibFn = (...args: any[]) => unknown\n\n/** 库命名空间:函数名 → 库函数(faijs 自带标准库与第三方库同构)。 */\nexport interface StdlibNamespace {\n [name: string]: StdlibFn\n}\n\n/**\n * 契约版本校验(P7 第三方库通道):加载时校验,不兼容即抛错(不静默降级)。\n * 第三方库模块若带 contractVersion 字段(与 CONTRACT_VERSION 对齐),必须匹配。\n *\n * @param lib - the library module whose contractVersion field is validated.\n */\nexport function assertContractVersion(lib: { contractVersion?: unknown }): void {\n if (lib.contractVersion !== undefined && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library contract version mismatch: got ${String(lib.contractVersion)}, expected ${CONTRACT_VERSION}`,\n )\n }\n}\n\n/**\n * brep 强制模式下的不支持错误(mesh-only 函数 / 输入不在 BREP 链)。\n *\n * 由分派路径抛出,CadRuntime 捕获后转换为 ExecutionResult.failedAt\n * (与旧解释器\"brep 模式立即返回 E_BREP_UNSUPPORTED,不静默回退 mesh\"的语义一致)。\n * P2 起定义在本层(零依赖),L3 API 命名空间与引擎共享同一类(instanceof 判定)。\n */\nexport class BrepUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'BrepUnsupportedError'\n this.stmt = stmt\n }\n}\n\n/**\n * Unsupported error for mesh-forced mode (brep-only functions, or auto-mode\n * brep-only functions with a broken input chain).\n *\n * Symmetric to BrepUnsupportedError: thrown statically by the dispatch path,\n * caught by CadRuntime and converted into ExecutionResult.failedAt. A brep-only\n * function being unavailable in mesh mode is expected behavior (mode ×\n * implementation-set mismatch), not a bug fallback — the static-dispatch red\n * line (no try-catch, no runtime fallback) is unchanged.\n */\nexport class MeshUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'MeshUnsupportedError'\n this.stmt = stmt\n }\n}\n\n// ── 状态容器 ──\n\n/**\n * The global runtime state singleton: backend configuration, the currently\n * executing statement, and the Shape identity tables (constructor registry,\n * identity slots, and Shape → PartName reverse lookup).\n */\nexport interface FaijsRuntimeState {\n readonly stateVersion: number\n /** 后端配置(configureBackends 写入) */\n backends: Backends | undefined\n /** 当前执行语句锚点(引擎在语句 fn 之前设置) */\n currentStmt: ExecutionAnchor | undefined\n /** Shape 构造器登记(isShape 的唯一依据) */\n readonly created: WeakSet<object>\n /** Shape 身份槽 */\n readonly slots: WeakMap<object, ShapeSlot>\n /** Shape → PartName 反查(keep 与 dependentsOf 用) */\n readonly shapeToName: WeakMap<object, PartName>\n /** 同语句 lineage 去重标记(define-op 写入;语句边界 setCurrentStmt 重置)。 */\n registeredStmtId: StmtId | undefined\n}\n\n// ── 函数 BREP 域(控制流放松方案 §5.6 / D13) ──\n// 本机函数体内的瞬态 BREP 句柄:进入函数时开启登记域,op 输出句柄写入时经\n// registerFunctionBrep 登记;函数返回后引擎取走域、释放除返回值可到达句柄外的全部\n// (对齐「调用方负责句柄生命周期」brep-ops.ts 与 meshesToStep 的 finally 模式)。\n// 全局计数与 DirectExecutor.userFunctionDepth 同步(单 runtime 场景,与 setCurrentStmt 同构)。\n\nlet functionBrepDepth = 0\nconst functionBrepDomain: unknown[] = []\n\n/** 进入函数 BREP 域(DirectExecutor 执行 local 语句 fn 之前调用)。 */\nexport function enterFunctionBrep(): void {\n if (functionBrepDepth === 0) functionBrepDomain.length = 0\n functionBrepDepth++\n}\n\n/** 退出函数 BREP 域(fn 结束后调用)。 */\nexport function exitFunctionBrep(): void {\n functionBrepDepth = Math.max(0, functionBrepDepth - 1)\n}\n\n/**\n * 登记函数域内新产生的 BREP 句柄(hook 点在 op 输出 shape 槽位写入处——fromBrep)。\n * 非函数域(depth = 0)时 no-op(零开销,现状路径不变)。\n * @param solid - 新产生的 OCCT 句柄。\n */\nexport function registerFunctionBrep(solid: unknown): void {\n if (functionBrepDepth > 0) functionBrepDomain.push(solid)\n}\n\n/**\n * 取走当前函数域的句柄登记表并清空(引擎在 fn 结束后调用,随后释放非返回值句柄)。\n * @returns 当前函数域的句柄登记表快照。\n */\nexport function takeFunctionBrepDomain(): unknown[] {\n const domain = [...functionBrepDomain]\n functionBrepDomain.length = 0\n return domain\n}\n\n/** Shape 身份槽(OCCT 句柄 + 面演化 + 拓扑命名 + 装配行为)。 */\nexport interface ShapeSlot {\n solid?: unknown\n faceEvolution?: Map<number, number[]>\n // 1.10 前置③:roleTable 槽字段已删除——权威落点在血缘图旁挂\n // (topology/naming/lineage.ts 的 recordOutput / tableOfPart),\n // 解析缓存 miss 由回走重算恢复(api/topo-resolve.ts)。\n /** mesh/primitive 面 hint 快照(§3.6 setTopology 注入时由 runtime 提炼写入,解析兜底用)。 */\n faceHints?: unknown\n behavior?: unknown\n}\n\n/**\n * 装配变换(引擎应用):求解在库(solveTransforms),应用与下游失效在引擎(P6)。\n * index = 成员下标(compound.children 内)。\n */\nexport interface AssemblyTransform {\n index: number\n quaternion: [number, number, number, number]\n pivot: [number, number, number]\n translation: [number, number, number]\n rotationMatrix: number[]\n}\n\n/**\n * do_assemble 的待应用变换登记(P6:求解 ≠ 传播)。\n * 库只把求解结果写到这里;引擎在语句执行后取走并应用 + 失效下游。\n */\nconst pendingAssemblyKeys = new Set<object>()\nconst pendingAssemblyTransforms = new WeakMap<object, AssemblyTransform[]>()\n\n/**\n * Register a compound's pending assembly transforms (called from the\n * do_assemble method body; accumulates across calls).\n *\n * @param c - the compound object that owns the transforms.\n * @param ts - the assembly transforms to append.\n */\nexport function setPendingAssemblyTransforms(c: object, ts: AssemblyTransform[]): void {\n if (ts.length === 0) return\n pendingAssemblyKeys.add(c)\n const existing = pendingAssemblyTransforms.get(c) ?? []\n pendingAssemblyTransforms.set(c, [...existing, ...ts])\n}\n\n/**\n * Take all pending assembly transforms and clear them (called by the engine's\n * afterStatement hook; consumed exactly once).\n *\n * @returns the list of compounds with their accumulated transforms.\n */\nexport function takePendingAssemblyTransforms(): Array<{ compound: object; transforms: AssemblyTransform[] }> {\n const out: Array<{ compound: object; transforms: AssemblyTransform[] }> = []\n for (const c of pendingAssemblyKeys) {\n const ts = pendingAssemblyTransforms.get(c)\n if (ts && ts.length > 0) out.push({ compound: c, transforms: ts })\n pendingAssemblyTransforms.delete(c)\n }\n pendingAssemblyKeys.clear()\n return out\n}\n\n// ── P3:运动副位姿登记(ExecutionResult.kinematics)──\n// 与 pendingAssemblyTransforms 同模式:库只把 solveKinematics 的 per-member 位姿\n// 写到这里,引擎在语句执行后取走并放入 ExecutionResult.kinematics(宿主动画/导出\n// 从 ExecutionResult 读取,不新增返回值消费语义)。\n\n/** 单个成员的位姿(position + faijs [x,y,z,w] rotation;与 api/assembly/joints 的 KinematicsPose 结构一致)。 */\nexport interface AssemblyKinematicsPose {\n position: [number, number, number]\n rotation: [number, number, number, number]\n}\n\n/** 位姿键:成员名 → AssemblyKinematicsPose(含恒等链根;键 = PartName)。 */\nexport type AssemblyKinematics = Record<string, AssemblyKinematicsPose>\n\nconst pendingKinematicsKeys = new Set<object>()\nconst pendingAssemblyKinematics = new WeakMap<object, AssemblyKinematics>()\n\n/**\n * Register a compound's pending assembly kinematics (P3; called from the\n * do_assemble/solve method body; accumulates across calls).\n *\n * @param c - the compound object that owns the kinematics.\n * @param kin - per-member poses keyed by member name (all members, incl. identity).\n */\nexport function setPendingAssemblyKinematics(c: object, kin: AssemblyKinematics): void {\n pendingKinematicsKeys.add(c)\n pendingAssemblyKinematics.set(c, kin)\n}\n\n/**\n * Take all pending assembly kinematics and clear them (called by the engine after\n * an assembly statement; consumed exactly once).\n *\n * @returns the list of compounds with their per-member kinematics.\n */\nexport function takePendingAssemblyKinematics(): Array<{ compound: object; kinematics: AssemblyKinematics }> {\n const out: Array<{ compound: object; kinematics: AssemblyKinematics }> = []\n for (const c of pendingKinematicsKeys) {\n const kin = pendingAssemblyKinematics.get(c)\n if (kin) out.push({ compound: c, kinematics: kin })\n pendingAssemblyKinematics.delete(c)\n }\n pendingKinematicsKeys.clear()\n return out\n}\n\nconst STATE_VERSION = 1\nconst KEY = '__FAICAD_FAIJS_RUNTIME__'\n\n/**\n * 获取全局状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 打进一份)共享同一份状态——两份 WeakSet 会导致 Shape 身份不通(几何孤岛)。\n * 构建期去重(external)是主手段,这里是兜底。\n *\n * @returns the shared global runtime state singleton.\n */\nexport function getRuntimeState(): FaijsRuntimeState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[KEY] as FaijsRuntimeState | undefined\n if (existing) {\n if (existing.stateVersion !== STATE_VERSION) {\n throw new Error(\n `[faijs] runtime state version mismatch: loaded=${existing.stateVersion}, expected=${STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: FaijsRuntimeState = {\n stateVersion: STATE_VERSION,\n backends: undefined,\n currentStmt: undefined,\n created: new WeakSet<object>(),\n slots: new WeakMap<object, ShapeSlot>(),\n shapeToName: new WeakMap<object, PartName>(),\n registeredStmtId: undefined,\n }\n g[KEY] = created\n return created\n}\n\n// ── 后端配置读写 ──\n\n/**\n * 宿主在启动时调用一次,注入环境资源。\n *\n * @param backends - the host-injected environment resources.\n */\nexport function configureBackends(backends: Backends): void {\n getRuntimeState().backends = backends\n}\n\n/**\n * 读取后端配置。库函数通过它获取内核与宿主端口。\n *\n * 未配置时抛错——不要返回默认值兜底(配置是宿主的责任,缺失必须暴露)。\n *\n * @returns the configured backend resources.\n */\nexport function getBackends(): Backends {\n const b = getRuntimeState().backends\n if (!b) {\n throw new Error('[faijs] backends not configured: call configureBackends() before executing')\n }\n return b\n}\n\n// ── 当前执行语句(引擎内部状态)──\n\n/**\n * 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。\n *\n * @param stmt - the statement currently being executed.\n */\nexport function setCurrentStmt(stmt: ExecutionAnchor | undefined): void {\n const s = getRuntimeState()\n // 语句边界:锚点变化(含语句结束置 undefined)时解除同语句 lineage 去重标记,\n // 使下一条语句(或同 id 复跑)重新获得注册资格;同一条语句内 TS 库函数\n // (如 cq-compat Workplane op)连续调用多个 defineOp 时共享锚点,标记保持\n // 生效,嵌套调用正确跳过注册(见 define-op 的 isOuter 判定)。\n if (s.currentStmt?.id !== stmt?.id) s.registeredStmtId = undefined\n s.currentStmt = stmt\n}\n\n/**\n * 读取当前执行语句。库函数不应调用它(F1)。\n *\n * @returns the currently executing statement, or undefined if none.\n */\nexport function getCurrentStmt(): ExecutionAnchor | undefined {\n return getRuntimeState().currentStmt\n}\n\n// ── Shape 身份表 ──\n\n/**\n * Shape → 变量名反查(keep 与 dependentsOf 依赖)。\n *\n * @param shape - the shape to look up.\n * @returns the part name registered for the shape, or undefined.\n */\nexport function nameOf(shape: object): PartName | undefined {\n return getRuntimeState().shapeToName.get(shape)\n}\n\n/**\n * 登记 Shape → 变量名映射。\n *\n * @param shape - the shape to register.\n * @param name - the part name to associate with the shape.\n */\nexport function setName(shape: object, name: PartName): void {\n getRuntimeState().shapeToName.set(shape, name)\n}\n\n// ── keep 声明(库函数体调用)──\n\n/**\n * 登记回调类型。由 DirectExecutor 在装配时注入(保持 runtime-state 零依赖)。\n */\nexport type KeepSink = (stmtId: string, names: PartName[], hidden: boolean) => void\n\nlet keepSink: KeepSink | undefined\n\n/**\n * 引擎装配 keep 的落地目标(DirectExecutor.registerKeep)。\n *\n * @param sink - the keep callback registered by the engine, or undefined to clear.\n */\nexport function setKeepSink(sink: KeepSink | undefined): void {\n keepSink = sink\n}\n\n/**\n * 函数体 keep 声明:声明保留这些 Shape 对应的变量(可见)。\n *\n * 库作者在库函数体内调用:\n * ```ts\n * import { keep } from '@faicad/faijs'\n * export function group(params) {\n * keep(...params.members)\n * return compound(params.members)\n * }\n * ```\n *\n * 归属到\"当前正在执行的语句\"(引擎在 fn 之前 setCurrentStmt)。\n * 未登记在 shapeToName 的对象(库内部的自定义对象)被忽略——这是刻意的静默。\n *\n * @param shapes - the shapes whose corresponding variables should be kept.\n */\nexport function keep(...shapes: unknown[]): void {\n registerKeep(shapes, false)\n}\n\n/**\n * 函数体 keep 声明:保留但 canvas 不渲染(布尔系函数的源)。\n *\n * @param shapes - the shapes whose corresponding variables should be kept hidden.\n */\nexport function keepHidden(...shapes: unknown[]): void {\n registerKeep(shapes, true)\n}\n\nfunction registerKeep(shapes: unknown[], hidden: boolean): void {\n const stmt = getRuntimeState().currentStmt\n if (!stmt || !keepSink) return\n const names: PartName[] = []\n for (const s of shapes) {\n if (s === null || typeof s !== 'object') continue\n const n = nameOf(s)\n if (n !== undefined) names.push(n)\n }\n if (names.length === 0) return\n keepSink(String(stmt.id), names, hidden)\n}\n"]}
|
package/dist/sdk.d.ts
CHANGED
|
@@ -22,8 +22,10 @@ export type { SolidShape, CompoundShape, ShapeKind, StdShape, BrepHolder, } from
|
|
|
22
22
|
export type { Shape } from './mesh/types.js';
|
|
23
23
|
export { keep, keepHidden, getBackends, configureBackends, assertContractVersion, CONTRACT_VERSION, BrepUnsupportedError, MeshUnsupportedError, } from './runtime-state.js';
|
|
24
24
|
export type { Backends, RuntimeExecutionMode, StdlibFn, StdlibNamespace, ShapeSlot, KeepSink, } from './runtime-state.js';
|
|
25
|
-
export { getKernel, meshHandle, fromHandle } from './brep/handle-bridge.js';
|
|
25
|
+
export { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge.js';
|
|
26
26
|
export type { MeshHandleOptions } from './brep/handle-bridge.js';
|
|
27
|
+
export { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types.js';
|
|
28
|
+
export type { BrepEngineApi } from './brep/engine/primitives.js';
|
|
27
29
|
export { defineOp, assertLibConforms, hasDualOp, DUAL_OP_META } from './define-op.js';
|
|
28
30
|
export type { DualOpMeta, DualOpOptions, DualOpImpls, MeshImpl, BrepImpl, MeshData, BrepResult, } from './define-op.js';
|
|
29
31
|
export type { BrepCapabilityName } from './cad-runtime/backend-dispatch.js';
|
package/dist/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAIzC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAIzC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClF,YAAY,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA"}
|
package/dist/sdk.js
CHANGED
|
@@ -24,7 +24,8 @@ export { keep, keepHidden, getBackends, configureBackends, assertContractVersion
|
|
|
24
24
|
// ── BREP 桥接(B1:第三方库造 BREP 产物的三角化入口) ──
|
|
25
25
|
// handle-bridge 只 import runtime-state / stdlib/shape / type-only mesh/types,
|
|
26
26
|
// 零 heavy 依赖——dist/sdk.js 守卫测试继续通过。
|
|
27
|
-
export { getKernel, meshHandle, fromHandle } from './brep/handle-bridge.js';
|
|
27
|
+
export { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge.js';
|
|
28
|
+
export { BREP_ENGINE_IDS } from './brep/engine/types.js';
|
|
28
29
|
// ── 双路径实现声明(D 面契约:mesh 必选、BREP 可选;几何函数专用) ──
|
|
29
30
|
// define-op 只依赖 runtime-state / stdlib/shape / handle-bridge / backend-dispatch
|
|
30
31
|
// 与 type-only mesh、brep 类型——零 heavy 依赖,dist/sdk.js 守卫继续通过。
|
package/dist/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iDAAiD;AAEjD,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAUhB,oDAAoD;AAEpD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAUxB,wCAAwC;AACxC,8EAA8E;AAC9E,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iDAAiD;AAEjD,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAUhB,oDAAoD;AAEpD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAUxB,wCAAwC;AACxC,8EAA8E;AAC9E,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEpF,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAA;AAGzF,8CAA8C;AAC9C,gFAAgF;AAChF,2DAA2D;AAC3D,gDAAgD;AAChD,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * sdk — 第三方库开发面(F3 / roadmap V2.2)\n *\n *\n * 第三方库模块(`import * as gear from 'my-lib'` 的目标)用它开发:\n * ```ts\n * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'\n * export const contractVersion = CONTRACT_VERSION\n * export function makeSpurGear(params) { ... }\n * ```\n *\n * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)\n * 与 stdlib/shape(构造器 + 身份表,仅 type-import mesh 类型)。\n * 值导入闭包不含 three / occt-wasm / manifold / node:*——由守卫测试保证\n * (dist/sdk.js 静态 import 扫描)。\n *\n * 与主入口的关系:sdk 是主入口的**子集 + 极薄 re-export**,供库作者按需导入;\n * 主入口 / browser / stdlib 不受影响(additive)。\n */\n\n// ── 构造器与身份表(stdlib/shape:类型化构造器 + BREP 句柄登记) ──\n\nexport {\n solid,\n fromBrep,\n compound,\n isShape,\n isCompound,\n hasBrep,\n brepOf,\n nameOfShapes,\n getSlot,\n ensureSlot,\n} from './shape'\nexport type {\n SolidShape,\n CompoundShape,\n ShapeKind,\n StdShape,\n BrepHolder,\n} from './shape'\nexport type { Shape } from './mesh/types'\n\n// ── 运行时状态锚点(零依赖层:keep / backends / 契约版本 / 错误类型) ──\n\nexport {\n keep,\n keepHidden,\n getBackends,\n configureBackends,\n assertContractVersion,\n CONTRACT_VERSION,\n BrepUnsupportedError,\n MeshUnsupportedError,\n} from './runtime-state'\nexport type {\n Backends,\n RuntimeExecutionMode,\n StdlibFn,\n StdlibNamespace,\n ShapeSlot,\n KeepSink,\n} from './runtime-state'\n\n// ── BREP 桥接(B1:第三方库造 BREP 产物的三角化入口) ──\n// handle-bridge 只 import runtime-state / stdlib/shape / type-only mesh/types,\n// 零 heavy 依赖——dist/sdk.js 守卫测试继续通过。\n\nexport { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge'\nexport type { MeshHandleOptions } from './brep/handle-bridge'\nexport { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types'\nexport type { BrepEngineApi } from './brep/engine/primitives'\n\n// ── 双路径实现声明(D 面契约:mesh 必选、BREP 可选;几何函数专用) ──\n// define-op 只依赖 runtime-state / stdlib/shape / handle-bridge / backend-dispatch\n// 与 type-only mesh、brep 类型——零 heavy 依赖,dist/sdk.js 守卫继续通过。\n// 第三方库作者用 defineOp 声明实现集合;dispatchPath 不再直接导出——\n// 分派由 defineOp 包装器内部调用(规则仍是引擎 backend-dispatch.ts 单点)。\n\nexport { defineOp, assertLibConforms, hasDualOp, DUAL_OP_META } from './define-op'\nexport type {\n DualOpMeta,\n DualOpOptions,\n DualOpImpls,\n MeshImpl,\n BrepImpl,\n MeshData,\n BrepResult,\n} from './define-op'\nexport type { BrepCapabilityName } from './cad-runtime/backend-dispatch'\n"]}
|
package/dist/shape.d.ts
CHANGED
|
@@ -22,8 +22,18 @@ export interface CompoundShape {
|
|
|
22
22
|
kind: 'compound';
|
|
23
23
|
children: Shape[];
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 1D 曲线 Shape(wire / helix / edge-loop 等无三角载荷的 1D 几何)。
|
|
27
|
+
*
|
|
28
|
+
* `kind: 'curve'` 表达「无三角载荷」,与 `'solid'` 对称(见 `curve()` /
|
|
29
|
+
* `fromBrepCurve()`)。执行链路照走 `solidToShape`(wire → 空 0/0 载荷,不抛),
|
|
30
|
+
* 显示经 `wireframe`。
|
|
31
|
+
*/
|
|
32
|
+
export interface CurveShape extends Shape {
|
|
33
|
+
kind: 'curve';
|
|
34
|
+
}
|
|
25
35
|
/** A shape that the stdlib exports as a finished result. */
|
|
26
|
-
export type StdShape = SolidShape | CompoundShape;
|
|
36
|
+
export type StdShape = SolidShape | CompoundShape | CurveShape;
|
|
27
37
|
/**
|
|
28
38
|
* 实体 Shape 构造器:mesh 产物必须经此创建。
|
|
29
39
|
*
|
|
@@ -31,6 +41,16 @@ export type StdShape = SolidShape | CompoundShape;
|
|
|
31
41
|
* @returns the created solid shape.
|
|
32
42
|
*/
|
|
33
43
|
export declare function solid(mesh: Shape): SolidShape;
|
|
44
|
+
/**
|
|
45
|
+
* 1D 曲线 Shape 构造器(wire / helix / edge-loop 等 1D 产物)。
|
|
46
|
+
*
|
|
47
|
+
* 与 `solid` 对称:登记到 identity 表(供 `isShape` 识别),`kind` 设为 `'curve'`
|
|
48
|
+
* 以表达「无三角载荷的 1D 几何」(执行链路照走 `solidToShape`,显示经 `wireframe`)。
|
|
49
|
+
*
|
|
50
|
+
* @param mesh - the mesh payload (positions/indices) to wrap as a curve.
|
|
51
|
+
* @returns the created curve shape.
|
|
52
|
+
*/
|
|
53
|
+
export declare function curve(mesh: Shape): CurveShape;
|
|
34
54
|
/**
|
|
35
55
|
* BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。
|
|
36
56
|
*
|
|
@@ -47,6 +67,16 @@ export declare function solid(mesh: Shape): SolidShape;
|
|
|
47
67
|
* @returns the created solid shape with the BREP handle attached.
|
|
48
68
|
*/
|
|
49
69
|
export declare function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape;
|
|
70
|
+
/**
|
|
71
|
+
* 1D 曲线产物的 BREP 登记构造器:与 `fromBrep` 对称,但 `kind` 取 `'curve'`
|
|
72
|
+
* (维持既有「有无三角载荷」语义——1D 几何无三角载荷,不得报 `'solid'`)。
|
|
73
|
+
* 登记逻辑与 `fromBrep` 共用 `attachBrep`,保证两种形态走同一份身份/血缘/释放语义。
|
|
74
|
+
*
|
|
75
|
+
* @param mesh - the mesh payload (positions/indices) to wrap as a curve.
|
|
76
|
+
* @param holder - the BREP holder providing the OCCT handle and optional face evolution.
|
|
77
|
+
* @returns the created curve shape with the BREP handle attached.
|
|
78
|
+
*/
|
|
79
|
+
export declare function fromBrepCurve(mesh: Shape, holder: BrepHolder): CurveShape;
|
|
50
80
|
/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */
|
|
51
81
|
export interface BrepHolder {
|
|
52
82
|
solid: unknown;
|
|
@@ -86,6 +116,18 @@ export declare function isCompound(v: unknown): v is CompoundShape;
|
|
|
86
116
|
* @returns true if the value has compound shape structure.
|
|
87
117
|
*/
|
|
88
118
|
export declare function isCompoundLike(v: unknown): v is CompoundShape;
|
|
119
|
+
/**
|
|
120
|
+
* 1D 曲线判定(1D 判别位,Phase 3):`kind === 'curve'`。
|
|
121
|
+
*
|
|
122
|
+
* 面消费 op(extrude / revolve / sweep 等)用它做**执行前**输入维度预检——
|
|
123
|
+
* 1D 产物(wire / helix / sketch as:'wire')喂给面 op 时必须是明确的预检失败,
|
|
124
|
+
* 不得落进内核深层才报「操作失败」。与 SDK 的 WeakSet 严格 `isShape` 不同,
|
|
125
|
+
* 本判定是结构判定(与 `isCompoundLike` 同族),对跨库产物零要求。
|
|
126
|
+
*
|
|
127
|
+
* @param v - the value to test.
|
|
128
|
+
* @returns true when the value is a 1D curve shape.
|
|
129
|
+
*/
|
|
130
|
+
export declare function isCurveShape(v: unknown): v is CurveShape;
|
|
89
131
|
export type { ShapeSlot };
|
|
90
132
|
/**
|
|
91
133
|
* 读取 Shape 的身份槽(无则 undefined)。
|
package/dist/shape.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAM/G,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAElE,oDAAoD;AACpD,MAAM,WAAW,UAAW,SAAQ,KAAK;IACvC,IAAI,EAAE,OAAO,CAAA;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,KAAK,EAAE,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAM/G,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAElE,oDAAoD;AACpD,MAAM,WAAW,UAAW,SAAQ,KAAK;IACvC,IAAI,EAAE,OAAO,CAAA;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,KAAK,EAAE,CAAA;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAW,SAAQ,KAAK;IACvC,IAAI,EAAE,OAAO,CAAA;CACd;AAED,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAA;AAE9D;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAI7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAI7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAIpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAIzE;AAoCD,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAI7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAExD;AAID,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAGjE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAEtD"}
|
package/dist/shape.js
CHANGED
|
@@ -23,6 +23,20 @@ export function solid(mesh) {
|
|
|
23
23
|
getRuntimeState().created.add(s);
|
|
24
24
|
return s;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* 1D 曲线 Shape 构造器(wire / helix / edge-loop 等 1D 产物)。
|
|
28
|
+
*
|
|
29
|
+
* 与 `solid` 对称:登记到 identity 表(供 `isShape` 识别),`kind` 设为 `'curve'`
|
|
30
|
+
* 以表达「无三角载荷的 1D 几何」(执行链路照走 `solidToShape`,显示经 `wireframe`)。
|
|
31
|
+
*
|
|
32
|
+
* @param mesh - the mesh payload (positions/indices) to wrap as a curve.
|
|
33
|
+
* @returns the created curve shape.
|
|
34
|
+
*/
|
|
35
|
+
export function curve(mesh) {
|
|
36
|
+
const s = { ...mesh, kind: 'curve' };
|
|
37
|
+
getRuntimeState().created.add(s);
|
|
38
|
+
return s;
|
|
39
|
+
}
|
|
26
40
|
/**
|
|
27
41
|
* BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。
|
|
28
42
|
*
|
|
@@ -40,6 +54,35 @@ export function solid(mesh) {
|
|
|
40
54
|
*/
|
|
41
55
|
export function fromBrep(mesh, holder) {
|
|
42
56
|
const s = solid(mesh);
|
|
57
|
+
attachBrep(s, holder);
|
|
58
|
+
return s;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 1D 曲线产物的 BREP 登记构造器:与 `fromBrep` 对称,但 `kind` 取 `'curve'`
|
|
62
|
+
* (维持既有「有无三角载荷」语义——1D 几何无三角载荷,不得报 `'solid'`)。
|
|
63
|
+
* 登记逻辑与 `fromBrep` 共用 `attachBrep`,保证两种形态走同一份身份/血缘/释放语义。
|
|
64
|
+
*
|
|
65
|
+
* @param mesh - the mesh payload (positions/indices) to wrap as a curve.
|
|
66
|
+
* @param holder - the BREP holder providing the OCCT handle and optional face evolution.
|
|
67
|
+
* @returns the created curve shape with the BREP handle attached.
|
|
68
|
+
*/
|
|
69
|
+
export function fromBrepCurve(mesh, holder) {
|
|
70
|
+
const s = curve(mesh);
|
|
71
|
+
attachBrep(s, holder);
|
|
72
|
+
return s;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 把 BREP 句柄登记到已构造的 Shape(由 `solid` / `curve` 产出)。
|
|
76
|
+
*
|
|
77
|
+
* 集中 brep 登记的四步(identity 槽登记已由构造器完成;此处只补:① 身份槽挂载
|
|
78
|
+
* 句柄 / ② 血缘图语句键旁挂 roleTable / ③ 函数 BREP 域登记)。供 `fromBrep` /
|
|
79
|
+
* `fromBrepCurve` 共用——禁止绕开本函数手写登记(否则等于复制一整套身份、血缘与
|
|
80
|
+
* 释放语义)。
|
|
81
|
+
*
|
|
82
|
+
* @param s - the already-constructed shape (solid or curve).
|
|
83
|
+
* @param holder - the BREP holder to attach.
|
|
84
|
+
*/
|
|
85
|
+
function attachBrep(s, holder) {
|
|
43
86
|
const state = getRuntimeState();
|
|
44
87
|
const slot = state.slots.get(s) ?? {};
|
|
45
88
|
slot.solid = holder.solid;
|
|
@@ -57,7 +100,6 @@ export function fromBrep(mesh, holder) {
|
|
|
57
100
|
}
|
|
58
101
|
// 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放
|
|
59
102
|
registerFunctionBrep(holder.solid);
|
|
60
|
-
return s;
|
|
61
103
|
}
|
|
62
104
|
/**
|
|
63
105
|
* compound Shape 构造器:结构(层级)而非新几何。
|
|
@@ -100,6 +142,20 @@ export function isCompoundLike(v) {
|
|
|
100
142
|
&& v.kind === 'compound'
|
|
101
143
|
&& Array.isArray(v.children);
|
|
102
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* 1D 曲线判定(1D 判别位,Phase 3):`kind === 'curve'`。
|
|
147
|
+
*
|
|
148
|
+
* 面消费 op(extrude / revolve / sweep 等)用它做**执行前**输入维度预检——
|
|
149
|
+
* 1D 产物(wire / helix / sketch as:'wire')喂给面 op 时必须是明确的预检失败,
|
|
150
|
+
* 不得落进内核深层才报「操作失败」。与 SDK 的 WeakSet 严格 `isShape` 不同,
|
|
151
|
+
* 本判定是结构判定(与 `isCompoundLike` 同族),对跨库产物零要求。
|
|
152
|
+
*
|
|
153
|
+
* @param v - the value to test.
|
|
154
|
+
* @returns true when the value is a 1D curve shape.
|
|
155
|
+
*/
|
|
156
|
+
export function isCurveShape(v) {
|
|
157
|
+
return !!v && typeof v === 'object' && v.kind === 'curve';
|
|
158
|
+
}
|
|
103
159
|
/**
|
|
104
160
|
* 读取 Shape 的身份槽(无则 undefined)。
|
|
105
161
|
*
|
package/dist/shape.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, getCurrentStmt, type ShapeSlot } from './runtime-state'\nimport { asStmtId } from './identity'\nimport { runtimeLineage } from './topology/naming/lineage'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n // 1.10 前置③:roleTable **不再写 slot**(字段已删)——权威落点是下方血缘图\n // 旁挂(语句键 + part 键),解析缓存 miss 由回走重算恢复。\n state.slots.set(s, slot)\n // 1.10 前置③:roleTable 权威旁挂(**语句键**)在血缘图。part 键的记录在\n // define-op.wrapped(impl 返回后 anchor.outputs 名字已定)——此处 shape 还未\n // 被 executor 命名,nameOf(s) 为 undefined,不能在这里记 part 键。\n const stmt = getCurrentStmt()\n if (stmt && (holder.roleTable || holder.solid !== undefined)) {\n runtimeLineage.recordOutput(\n asStmtId(stmt.id),\n holder.roleTable as ReadonlyMap<string, ReadonlyMap<string, readonly number[]>> | undefined,\n holder.solid,\n )\n }\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n return s\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n /**\n * 1.10 前置③:产形 op 交付 role 表的唯一入口。fromBrep 把它**旁挂到血缘图**\n * (语句键 + part 键);slot 侧的缓存存储已删(ShapeSlot 不再有该字段)。\n */\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。\n *\n * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂\n * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined\n * (mesh 产物 / 无命名)。\n *\n * @param shape - the input shape whose role table to read.\n * @returns the role table (unknown — callers assert their table type), or undefined.\n */\nexport function inputRoleTable(shape: object): unknown | undefined {\n const name = nameOf(shape)\n return name ? runtimeLineage.tableOfPart(name) : undefined\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, getCurrentStmt, type ShapeSlot } from './runtime-state'\nimport { asStmtId } from './identity'\nimport { runtimeLineage } from './topology/naming/lineage'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/**\n * 1D 曲线 Shape(wire / helix / edge-loop 等无三角载荷的 1D 几何)。\n *\n * `kind: 'curve'` 表达「无三角载荷」,与 `'solid'` 对称(见 `curve()` /\n * `fromBrepCurve()`)。执行链路照走 `solidToShape`(wire → 空 0/0 载荷,不抛),\n * 显示经 `wireframe`。\n */\nexport interface CurveShape extends Shape {\n kind: 'curve'\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape | CurveShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * 1D 曲线 Shape 构造器(wire / helix / edge-loop 等 1D 产物)。\n *\n * 与 `solid` 对称:登记到 identity 表(供 `isShape` 识别),`kind` 设为 `'curve'`\n * 以表达「无三角载荷的 1D 几何」(执行链路照走 `solidToShape`,显示经 `wireframe`)。\n *\n * @param mesh - the mesh payload (positions/indices) to wrap as a curve.\n * @returns the created curve shape.\n */\nexport function curve(mesh: Shape): CurveShape {\n const s: CurveShape = { ...mesh, kind: 'curve' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n attachBrep(s, holder)\n return s\n}\n\n/**\n * 1D 曲线产物的 BREP 登记构造器:与 `fromBrep` 对称,但 `kind` 取 `'curve'`\n * (维持既有「有无三角载荷」语义——1D 几何无三角载荷,不得报 `'solid'`)。\n * 登记逻辑与 `fromBrep` 共用 `attachBrep`,保证两种形态走同一份身份/血缘/释放语义。\n *\n * @param mesh - the mesh payload (positions/indices) to wrap as a curve.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created curve shape with the BREP handle attached.\n */\nexport function fromBrepCurve(mesh: Shape, holder: BrepHolder): CurveShape {\n const s = curve(mesh)\n attachBrep(s, holder)\n return s\n}\n\n/**\n * 把 BREP 句柄登记到已构造的 Shape(由 `solid` / `curve` 产出)。\n *\n * 集中 brep 登记的四步(identity 槽登记已由构造器完成;此处只补:① 身份槽挂载\n * 句柄 / ② 血缘图语句键旁挂 roleTable / ③ 函数 BREP 域登记)。供 `fromBrep` /\n * `fromBrepCurve` 共用——禁止绕开本函数手写登记(否则等于复制一整套身份、血缘与\n * 释放语义)。\n *\n * @param s - the already-constructed shape (solid or curve).\n * @param holder - the BREP holder to attach.\n */\nfunction attachBrep(s: Shape, holder: BrepHolder): void {\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n // 1.10 前置③:roleTable **不再写 slot**(字段已删)——权威落点是下方血缘图\n // 旁挂(语句键 + part 键),解析缓存 miss 由回走重算恢复。\n state.slots.set(s, slot)\n // 1.10 前置③:roleTable 权威旁挂(**语句键**)在血缘图。part 键的记录在\n // define-op.wrapped(impl 返回后 anchor.outputs 名字已定)——此处 shape 还未\n // 被 executor 命名,nameOf(s) 为 undefined,不能在这里记 part 键。\n const stmt = getCurrentStmt()\n if (stmt && (holder.roleTable || holder.solid !== undefined)) {\n runtimeLineage.recordOutput(\n asStmtId(stmt.id),\n holder.roleTable as ReadonlyMap<string, ReadonlyMap<string, readonly number[]>> | undefined,\n holder.solid,\n )\n }\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n /**\n * 1.10 前置③:产形 op 交付 role 表的唯一入口。fromBrep 把它**旁挂到血缘图**\n * (语句键 + part 键);slot 侧的缓存存储已删(ShapeSlot 不再有该字段)。\n */\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n/**\n * 1D 曲线判定(1D 判别位,Phase 3):`kind === 'curve'`。\n *\n * 面消费 op(extrude / revolve / sweep 等)用它做**执行前**输入维度预检——\n * 1D 产物(wire / helix / sketch as:'wire')喂给面 op 时必须是明确的预检失败,\n * 不得落进内核深层才报「操作失败」。与 SDK 的 WeakSet 严格 `isShape` 不同,\n * 本判定是结构判定(与 `isCompoundLike` 同族),对跨库产物零要求。\n *\n * @param v - the value to test.\n * @returns true when the value is a 1D curve shape.\n */\nexport function isCurveShape(v: unknown): v is CurveShape {\n return !!v && typeof v === 'object' && (v as { kind?: string }).kind === 'curve'\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。\n *\n * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂\n * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined\n * (mesh 产物 / 无命名)。\n *\n * @param shape - the input shape whose role table to read.\n * @returns the role table (unknown — callers assert their table type), or undefined.\n */\nexport function inputRoleTable(shape: object): unknown | undefined {\n const name = nameOf(shape)\n return name ? runtimeLineage.tableOfPart(name) : undefined\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
|
|
@@ -115,7 +115,7 @@ export function captureFaceHint(kernel, face) {
|
|
|
115
115
|
const u = (uv.uMin + uv.uMax) / 2;
|
|
116
116
|
const v = (uv.vMin + uv.vMax) / 2;
|
|
117
117
|
const normal = kernel.surfaceNormal(face, u, v);
|
|
118
|
-
const center = kernel.
|
|
118
|
+
const center = kernel.surfaceCenterOfMass(face);
|
|
119
119
|
// P0 装配前置:圆柱面采集轴 hint(其余面类型缺省——平面用 center+normal 即可)
|
|
120
120
|
const axis = surfaceType === 'cylinder' ? captureCylinderFaceAxis(kernel, face) : undefined;
|
|
121
121
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geom-hint.js","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geom-hint.ts — 几何 hint 捕获(§3.1)\n *\n * 两路:\n * - `captureFaceHint(kernel, faceHandle)`:BREP 现场面 → FaceHint(assignRoles 用)。\n * - `faceRowToHint(row)`:面行/FaceRow → FaceHint(primitive/mesh 命名槽快照用)。\n *\n * hint 字段与 SelectorRuntime 的 FaceRow(surfaceType/area/center/normal)同源\n * (§2.2),保证 BREP 现场与面行快照两条打分路径口径一致。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { FaceHint, EdgeHint, AxisHint } from './types'\n\n/** 归一化向量(axis 采集内部用;零向量返回 null,调用方放弃采集)。 */\nfunction normalizedAxis(v: [number, number, number]): [number, number, number] | null {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-12 || !Number.isFinite(len)) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/**\n * BREP 现场圆柱面 → 轴 hint(P0 装配前置)。\n *\n * 算法与 occt-kernel/topologyExt.ts getSurfaceParams 的 cylinder 分支同源:\n * direction = normalize(S(u,v+1) − S(u,v))(V 向即轴向);origin = P − R·外法向\n *(surfaceNormal 含朝向,reversed 面先取反修正)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the cylindrical face handle.\n * @returns the axis hint, or undefined when the axis cannot be derived.\n */\nfunction captureCylinderFaceAxis(kernel: BrepEngineApi, face: BrepHandle): AxisHint | undefined {\n try {\n const uv = kernel.uvBounds(face)\n const p0 = kernel.pointOnSurface(face, uv.uMin, uv.vMin)\n const p1 = kernel.pointOnSurface(face, uv.uMin, uv.vMin + 1)\n const direction = normalizedAxis([p1.x - p0.x, p1.y - p0.y, p1.z - p0.z])\n const cyl = kernel.getFaceCylinderData(face)\n if (!direction || !cyl) return undefined\n let sn = kernel.surfaceNormal(face, uv.uMin, uv.vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n const origin: [number, number, number] = [\n p0.x - cyl.radius * sn.x,\n p0.y - cyl.radius * sn.y,\n p0.z - cyl.radius * sn.z,\n ]\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场圆边 → 轴 hint(origin = 圆心,direction = 所在平面法向;P0 装配前置)。\n *\n * 用曲线上三个不同参数的采样点做外接圆圆心(三点定圆,精确、无弧长近似),\n * 法向取 (p1−p0)×(p2−p0) 归一化。只用 curvePointAtParam/curveParameters 等既有\n * 公开内核 API(与 getCurveParams 的 circle 分支同一能力面),不新增内核方法。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the circular edge handle.\n * @returns the axis hint, or undefined when sampling fails.\n */\nfunction captureCircleEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (!Number.isFinite(first) || !Number.isFinite(last)) return undefined\n const d = (last - first) / 3\n const pa = kernel.curvePointAtParam(edge, first)\n const pb = kernel.curvePointAtParam(edge, first + d)\n const pc = kernel.curvePointAtParam(edge, first + 2 * d)\n const e1: [number, number, number] = [pb.x - pa.x, pb.y - pa.y, pb.z - pa.z]\n const e2: [number, number, number] = [pc.x - pa.x, pc.y - pa.y, pc.z - pa.z]\n // 三点外接圆:解 o = a + α·e1 + β·e2,满足 |o−a| = |o−b| = |o−c|\n const e11 = e1[0] * e1[0] + e1[1] * e1[1] + e1[2] * e1[2]\n const e22 = e2[0] * e2[0] + e2[1] * e2[1] + e2[2] * e2[2]\n const e12 = e1[0] * e2[0] + e1[1] * e2[1] + e1[2] * e2[2]\n const denom = e11 * e22 - e12 * e12\n if (Math.abs(denom) < 1e-18) return undefined\n const alpha = (e11 * e22 - e22 * e12) / (2 * denom)\n const beta = (e22 * e11 - e11 * e12) / (2 * denom)\n const origin: [number, number, number] = [\n pa.x + alpha * e1[0] + beta * e2[0],\n pa.y + alpha * e1[1] + beta * e2[1],\n pa.z + alpha * e1[2] + beta * e2[2],\n ]\n const direction = normalizedAxis([\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ])\n if (!direction) return undefined\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场面 → FaceHint。\n *\n * 面积在 occt-wasm 无公开 API(queryBatch 仅测试用),故现场路径不填 area——\n * 打分器对缺失 area 不扣分(scorerArea 双 undefined 跳过)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the face handle to snapshot.\n * @returns the captured FaceHint.\n */\nexport function captureFaceHint(kernel: BrepEngineApi, face: BrepHandle): FaceHint {\n const surfaceType = kernel.surfaceType(face)\n const uv = kernel.uvBounds(face)\n const u = (uv.uMin + uv.uMax) / 2\n const v = (uv.vMin + uv.vMax) / 2\n const normal = kernel.surfaceNormal(face, u, v)\n const center = kernel.getSurfaceCenterOfMass(face)\n // P0 装配前置:圆柱面采集轴 hint(其余面类型缺省——平面用 center+normal 即可)\n const axis = surfaceType === 'cylinder' ? captureCylinderFaceAxis(kernel, face) : undefined\n return {\n kind: 'face',\n surfaceType,\n normal: [normal.x, normal.y, normal.z],\n center: [center.x, center.y, center.z],\n ...(axis ? { axis } : {}),\n }\n}\n\n/**\n * 面行 → FaceHint(mesh/primitive 命名槽快照路径;§3.6 setTopology 注入用)。\n * 面行的 surfaceType/normal/center/area 与 BREP 现场同口径(§1.1 事实)。\n *\n * @param row - a FaceRow (or shape-compatible object) from the selector manifest.\n * @returns the FaceHint derived from the row.\n */\nexport function faceRowToHint(row: {\n surfaceType?: string\n normal?: readonly number[] | null\n center?: readonly number[] | null\n area?: number\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): FaceHint {\n const hint: FaceHint = {\n kind: 'face',\n ...(row.surfaceType !== undefined ? { surfaceType: row.surfaceType } : {}),\n ...(row.normal && row.normal.length === 3 ? { normal: [row.normal[0], row.normal[1], row.normal[2]] as [number, number, number] } : {}),\n ...(row.center && row.center.length === 3 ? { center: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.area !== undefined && Number.isFinite(row.area) ? { area: row.area } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * 边行 → EdgeHint(mesh/primitive 命名槽快照路径;§3.7 edgeNaming 用)。\n * EdgeRow.center 与 EdgeHint.midpoint 同口径(§3.7:边 midpoint 与 EdgeRow.center\n * 同口径,geom-hint.ts 统一采集)。\n *\n * @param row - an EdgeRow (or shape-compatible object) from the selector manifest.\n * @returns the EdgeHint derived from the row.\n */\nexport function edgeRowToHint(row: {\n length?: number\n center?: readonly number[] | null\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): EdgeHint {\n const hint: EdgeHint = {\n kind: 'edge',\n ...(row.length !== undefined && Number.isFinite(row.length) ? { length: row.length } : {}),\n ...(row.center && row.center.length === 3 ? { midpoint: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * BREP 现场边 → EdgeHint。\n *\n * hint 是「并列裁决者」而非身份本身(§1.2),只在两邻面多公共边时用于打分。\n * length 用 `kernel.curveLength(edge)`;midpoint 取曲线参数中点的点坐标\n * (与 face 的 curvePointAtParam 同口径;屏蔽封闭/退化边的采样退化)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle to snapshot.\n * @returns the captured EdgeHint.\n */\n/**\n * BREP 现场边 → 轴 hint(装配约束的边实体来源;P0 前置)。\n *\n * 直边:origin = 曲线起点,direction = 起点切向;\n * 圆边:origin = 圆心(三点定圆),direction = 所在平面法向;\n * 其它曲线类型 → undefined(不静默造轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle.\n * @returns the axis hint, or undefined for unsupported curves / sampling failure.\n */\nexport function captureEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const curveType = kernel.curveType(edge)\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n const origin = kernel.curvePointAtParam(edge, first)\n const tangent = kernel.curveTangent(edge, first)\n const direction = normalizedAxis([tangent.x, tangent.y, tangent.z])\n if (Number.isFinite(origin.x) && Number.isFinite(origin.y) && Number.isFinite(origin.z) && direction) {\n return { origin: [origin.x, origin.y, origin.z], direction }\n }\n } else if (curveType === 'circle') {\n return captureCircleEdgeAxis(kernel, edge)\n }\n } catch {\n // 曲线类型读取失败 → 无 axis hint(调用方按缺省处理,不静默造轴)\n }\n return undefined\n}\n\n/**\n * 采集棱边 hint(长度 / 中点 / 轴)。\n *\n * P0 装配前置:直边(起点 + 切向)与圆边(圆心 + 所在平面法向)产出 axis hint;\n * 退化或非线/圆曲线不产出 axis(调用方按缺省处理,不静默造轴)。\n *\n * @param kernel - the BREP engine API.\n * @param edge - the edge handle.\n * @returns the captured edge hint.\n */\nexport function captureEdgeHint(kernel: BrepEngineApi, edge: BrepHandle): EdgeHint {\n const length = kernel.curveLength(edge)\n const hint: { kind: 'edge'; length?: number; midpoint?: [number, number, number]; axis?: AxisHint } = { kind: 'edge' }\n if (Number.isFinite(length) && length > 0) hint.length = length\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (Number.isFinite(first) && Number.isFinite(last)) {\n const mid = kernel.curvePointAtParam(edge, (first + last) / 2)\n if (Number.isFinite(mid.x) && Number.isFinite(mid.y) && Number.isFinite(mid.z)) {\n hint.midpoint = [mid.x, mid.y, mid.z]\n }\n }\n } catch {\n // 退化边(如长度 0)读曲线参数失败 → 只留 length,不发散\n }\n // P0 装配前置:直边(起点+切向)/ 圆边(圆心+法向)采集轴 hint\n const axis = captureEdgeAxis(kernel, edge)\n if (axis) hint.axis = axis\n return hint\n}\n"]}
|
|
1
|
+
{"version":3,"file":"geom-hint.js","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geom-hint.ts — 几何 hint 捕获(§3.1)\n *\n * 两路:\n * - `captureFaceHint(kernel, faceHandle)`:BREP 现场面 → FaceHint(assignRoles 用)。\n * - `faceRowToHint(row)`:面行/FaceRow → FaceHint(primitive/mesh 命名槽快照用)。\n *\n * hint 字段与 SelectorRuntime 的 FaceRow(surfaceType/area/center/normal)同源\n * (§2.2),保证 BREP 现场与面行快照两条打分路径口径一致。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { FaceHint, EdgeHint, AxisHint } from './types'\n\n/** 归一化向量(axis 采集内部用;零向量返回 null,调用方放弃采集)。 */\nfunction normalizedAxis(v: [number, number, number]): [number, number, number] | null {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-12 || !Number.isFinite(len)) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/**\n * BREP 现场圆柱面 → 轴 hint(P0 装配前置)。\n *\n * 算法与 occt-kernel/topologyExt.ts getSurfaceParams 的 cylinder 分支同源:\n * direction = normalize(S(u,v+1) − S(u,v))(V 向即轴向);origin = P − R·外法向\n *(surfaceNormal 含朝向,reversed 面先取反修正)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the cylindrical face handle.\n * @returns the axis hint, or undefined when the axis cannot be derived.\n */\nfunction captureCylinderFaceAxis(kernel: BrepEngineApi, face: BrepHandle): AxisHint | undefined {\n try {\n const uv = kernel.uvBounds(face)\n const p0 = kernel.pointOnSurface(face, uv.uMin, uv.vMin)\n const p1 = kernel.pointOnSurface(face, uv.uMin, uv.vMin + 1)\n const direction = normalizedAxis([p1.x - p0.x, p1.y - p0.y, p1.z - p0.z])\n const cyl = kernel.getFaceCylinderData(face)\n if (!direction || !cyl) return undefined\n let sn = kernel.surfaceNormal(face, uv.uMin, uv.vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n const origin: [number, number, number] = [\n p0.x - cyl.radius * sn.x,\n p0.y - cyl.radius * sn.y,\n p0.z - cyl.radius * sn.z,\n ]\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场圆边 → 轴 hint(origin = 圆心,direction = 所在平面法向;P0 装配前置)。\n *\n * 用曲线上三个不同参数的采样点做外接圆圆心(三点定圆,精确、无弧长近似),\n * 法向取 (p1−p0)×(p2−p0) 归一化。只用 curvePointAtParam/curveParameters 等既有\n * 公开内核 API(与 getCurveParams 的 circle 分支同一能力面),不新增内核方法。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the circular edge handle.\n * @returns the axis hint, or undefined when sampling fails.\n */\nfunction captureCircleEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (!Number.isFinite(first) || !Number.isFinite(last)) return undefined\n const d = (last - first) / 3\n const pa = kernel.curvePointAtParam(edge, first)\n const pb = kernel.curvePointAtParam(edge, first + d)\n const pc = kernel.curvePointAtParam(edge, first + 2 * d)\n const e1: [number, number, number] = [pb.x - pa.x, pb.y - pa.y, pb.z - pa.z]\n const e2: [number, number, number] = [pc.x - pa.x, pc.y - pa.y, pc.z - pa.z]\n // 三点外接圆:解 o = a + α·e1 + β·e2,满足 |o−a| = |o−b| = |o−c|\n const e11 = e1[0] * e1[0] + e1[1] * e1[1] + e1[2] * e1[2]\n const e22 = e2[0] * e2[0] + e2[1] * e2[1] + e2[2] * e2[2]\n const e12 = e1[0] * e2[0] + e1[1] * e2[1] + e1[2] * e2[2]\n const denom = e11 * e22 - e12 * e12\n if (Math.abs(denom) < 1e-18) return undefined\n const alpha = (e11 * e22 - e22 * e12) / (2 * denom)\n const beta = (e22 * e11 - e11 * e12) / (2 * denom)\n const origin: [number, number, number] = [\n pa.x + alpha * e1[0] + beta * e2[0],\n pa.y + alpha * e1[1] + beta * e2[1],\n pa.z + alpha * e1[2] + beta * e2[2],\n ]\n const direction = normalizedAxis([\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ])\n if (!direction) return undefined\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场面 → FaceHint。\n *\n * 面积在 occt-wasm 无公开 API(queryBatch 仅测试用),故现场路径不填 area——\n * 打分器对缺失 area 不扣分(scorerArea 双 undefined 跳过)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the face handle to snapshot.\n * @returns the captured FaceHint.\n */\nexport function captureFaceHint(kernel: BrepEngineApi, face: BrepHandle): FaceHint {\n const surfaceType = kernel.surfaceType(face)\n const uv = kernel.uvBounds(face)\n const u = (uv.uMin + uv.uMax) / 2\n const v = (uv.vMin + uv.vMax) / 2\n const normal = kernel.surfaceNormal(face, u, v)\n const center = kernel.surfaceCenterOfMass(face)\n // P0 装配前置:圆柱面采集轴 hint(其余面类型缺省——平面用 center+normal 即可)\n const axis = surfaceType === 'cylinder' ? captureCylinderFaceAxis(kernel, face) : undefined\n return {\n kind: 'face',\n surfaceType,\n normal: [normal.x, normal.y, normal.z],\n center: [center.x, center.y, center.z],\n ...(axis ? { axis } : {}),\n }\n}\n\n/**\n * 面行 → FaceHint(mesh/primitive 命名槽快照路径;§3.6 setTopology 注入用)。\n * 面行的 surfaceType/normal/center/area 与 BREP 现场同口径(§1.1 事实)。\n *\n * @param row - a FaceRow (or shape-compatible object) from the selector manifest.\n * @returns the FaceHint derived from the row.\n */\nexport function faceRowToHint(row: {\n surfaceType?: string\n normal?: readonly number[] | null\n center?: readonly number[] | null\n area?: number\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): FaceHint {\n const hint: FaceHint = {\n kind: 'face',\n ...(row.surfaceType !== undefined ? { surfaceType: row.surfaceType } : {}),\n ...(row.normal && row.normal.length === 3 ? { normal: [row.normal[0], row.normal[1], row.normal[2]] as [number, number, number] } : {}),\n ...(row.center && row.center.length === 3 ? { center: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.area !== undefined && Number.isFinite(row.area) ? { area: row.area } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * 边行 → EdgeHint(mesh/primitive 命名槽快照路径;§3.7 edgeNaming 用)。\n * EdgeRow.center 与 EdgeHint.midpoint 同口径(§3.7:边 midpoint 与 EdgeRow.center\n * 同口径,geom-hint.ts 统一采集)。\n *\n * @param row - an EdgeRow (or shape-compatible object) from the selector manifest.\n * @returns the EdgeHint derived from the row.\n */\nexport function edgeRowToHint(row: {\n length?: number\n center?: readonly number[] | null\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): EdgeHint {\n const hint: EdgeHint = {\n kind: 'edge',\n ...(row.length !== undefined && Number.isFinite(row.length) ? { length: row.length } : {}),\n ...(row.center && row.center.length === 3 ? { midpoint: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * BREP 现场边 → EdgeHint。\n *\n * hint 是「并列裁决者」而非身份本身(§1.2),只在两邻面多公共边时用于打分。\n * length 用 `kernel.curveLength(edge)`;midpoint 取曲线参数中点的点坐标\n * (与 face 的 curvePointAtParam 同口径;屏蔽封闭/退化边的采样退化)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle to snapshot.\n * @returns the captured EdgeHint.\n */\n/**\n * BREP 现场边 → 轴 hint(装配约束的边实体来源;P0 前置)。\n *\n * 直边:origin = 曲线起点,direction = 起点切向;\n * 圆边:origin = 圆心(三点定圆),direction = 所在平面法向;\n * 其它曲线类型 → undefined(不静默造轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle.\n * @returns the axis hint, or undefined for unsupported curves / sampling failure.\n */\nexport function captureEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const curveType = kernel.curveType(edge)\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n const origin = kernel.curvePointAtParam(edge, first)\n const tangent = kernel.curveTangent(edge, first)\n const direction = normalizedAxis([tangent.x, tangent.y, tangent.z])\n if (Number.isFinite(origin.x) && Number.isFinite(origin.y) && Number.isFinite(origin.z) && direction) {\n return { origin: [origin.x, origin.y, origin.z], direction }\n }\n } else if (curveType === 'circle') {\n return captureCircleEdgeAxis(kernel, edge)\n }\n } catch {\n // 曲线类型读取失败 → 无 axis hint(调用方按缺省处理,不静默造轴)\n }\n return undefined\n}\n\n/**\n * 采集棱边 hint(长度 / 中点 / 轴)。\n *\n * P0 装配前置:直边(起点 + 切向)与圆边(圆心 + 所在平面法向)产出 axis hint;\n * 退化或非线/圆曲线不产出 axis(调用方按缺省处理,不静默造轴)。\n *\n * @param kernel - the BREP engine API.\n * @param edge - the edge handle.\n * @returns the captured edge hint.\n */\nexport function captureEdgeHint(kernel: BrepEngineApi, edge: BrepHandle): EdgeHint {\n const length = kernel.curveLength(edge)\n const hint: { kind: 'edge'; length?: number; midpoint?: [number, number, number]; axis?: AxisHint } = { kind: 'edge' }\n if (Number.isFinite(length) && length > 0) hint.length = length\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (Number.isFinite(first) && Number.isFinite(last)) {\n const mid = kernel.curvePointAtParam(edge, (first + last) / 2)\n if (Number.isFinite(mid.x) && Number.isFinite(mid.y) && Number.isFinite(mid.z)) {\n hint.midpoint = [mid.x, mid.y, mid.z]\n }\n }\n } catch {\n // 退化边(如长度 0)读曲线参数失败 → 只留 length,不发散\n }\n // P0 装配前置:直边(起点+切向)/ 圆边(圆心+法向)采集轴 hint\n const axis = captureEdgeAxis(kernel, edge)\n if (axis) hint.axis = axis\n return hint\n}\n"]}
|
|
@@ -22,7 +22,7 @@ export const AMBIGUITY_THRESHOLD = 0.1;
|
|
|
22
22
|
/** 从候选读取几何量的统一入口(handle 优先,row 兜底)。 */
|
|
23
23
|
function candidateGeometry(kernel, candidate) {
|
|
24
24
|
if (candidate.handle !== undefined && kernel) {
|
|
25
|
-
const center = kernel.
|
|
25
|
+
const center = kernel.surfaceCenterOfMass(candidate.handle);
|
|
26
26
|
const uv = kernel.uvBounds(candidate.handle);
|
|
27
27
|
const u = (uv.uMin + uv.uMax) / 2;
|
|
28
28
|
const v = (uv.vMin + uv.vMax) / 2;
|