@faicad/faijs 0.29.3 → 0.30.9
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/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +136 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +228 -0
- package/dist/api/appearance.js.map +1 -0
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +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 +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +28 -0
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +19 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +31 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +91 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +97 -0
- package/dist/api/meta.js.map +1 -0
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +124 -8
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +204 -13
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +8 -8
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +268 -25
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +65 -3
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +90 -29
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/types.d.ts +5 -6
- package/dist/lang/types.d.ts.map +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +39 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +151 -22
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +42 -7
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +37 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +205 -14
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +43 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +32 -5
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +35 -3
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +44 -2
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +9 -11
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。
|
|
3
|
+
*
|
|
4
|
+
* 独立成模块使 `export-model.ts`(ExportModel 入口)与 `step.ts`
|
|
5
|
+
* (exportStepFromSolids)都能复用,避免 `export-model → export → export-model`
|
|
6
|
+
* 的循环依赖:本模块只依赖 `../../api/meta` 的 `FileMeta` 类型(type-only)。
|
|
7
|
+
*
|
|
8
|
+
* 设计文档 2026-10-05-meta §6.2 第 6 步:`exportModel` 已有 SI_UNIT 声明重写的先例
|
|
9
|
+
* ——同样只对 header 里 FILE_NAME(...)/FILE_DESCRIPTION(...) 行做文本替换,绝不碰
|
|
10
|
+
* DATA 段几何实体(红线 §10.3 3a:文本层只改声明/元数据,坐标不动)。
|
|
11
|
+
*
|
|
12
|
+
* FILE_NAME(name, time_stamp, author, organization, preprocessor_version, ...)
|
|
13
|
+
* FILE_DESCRIPTION(description_list, implementation_level)
|
|
14
|
+
* 映射(§3.3):title→name, creationDate→time_stamp, designer/author→author,
|
|
15
|
+
* organization→organization, application→preprocessor, description→description。
|
|
16
|
+
* 无对应位置的字段(copyright/licenseTerms/rating/modificationDate)**不写**
|
|
17
|
+
* (STEP 无标准位置,不发明)。
|
|
18
|
+
*
|
|
19
|
+
* 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态
|
|
20
|
+
* 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。
|
|
21
|
+
*/
|
|
22
|
+
import type { FileMeta } from '../../api/meta.js';
|
|
23
|
+
/**
|
|
24
|
+
* FileMeta 是否含可映射到 STEP header 的字段(避免对无 header 字段的 fileMeta
|
|
25
|
+
* 做无谓解码重写)。
|
|
26
|
+
*
|
|
27
|
+
* @param f 文件级元数据;undefined 视为无 header 字段。
|
|
28
|
+
* @returns 存在任一可映射字段时为 true。
|
|
29
|
+
*/
|
|
30
|
+
export declare function fileMetaHasHeaderFields(f: FileMeta | undefined): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* STEP 文件级元数据 → P21 header 重写:仅碰 `FILE_NAME`/`FILE_DESCRIPTION` 两处
|
|
33
|
+
* 标准实体,其余文本(含 DATA 段几何)原样保留。
|
|
34
|
+
*
|
|
35
|
+
* @param stepText 内核产出的 STEP 全文(ISO-10303-21)。
|
|
36
|
+
* @param fileMeta 目标文件级元数据。
|
|
37
|
+
* @returns 改写后的 STEP 文本。
|
|
38
|
+
*/
|
|
39
|
+
export declare function rewriteStepHeader(stepText: string, fileMeta: FileMeta): string;
|
|
40
|
+
/**
|
|
41
|
+
* 用 replacement 替换字符串 [start, end) 区间,返回新字符串(不可变,纯函数)。
|
|
42
|
+
*
|
|
43
|
+
* @param s 原始字符串。
|
|
44
|
+
* @param start 替换区起始偏移(含)。
|
|
45
|
+
* @param end 替换区结束偏移(不含)。
|
|
46
|
+
* @param replacement 替换内容。
|
|
47
|
+
* @returns 替换后的新字符串。
|
|
48
|
+
*/
|
|
49
|
+
export declare function splice(s: string, start: number, end: number, replacement: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* 旧名别名:正文使用 {@link rewriteStepHeader}。保留导出以免破坏既有调用/test 引用。
|
|
52
|
+
*
|
|
53
|
+
* @param stepText 内核产出的 STEP 全文(ISO-10303-21)。
|
|
54
|
+
* @param fileMeta 目标文件级元数据。
|
|
55
|
+
* @returns 改写后的 STEP 文本。
|
|
56
|
+
*/
|
|
57
|
+
export declare const rewriteFileMetaHeader: (stepText: string, fileMeta: FileMeta) => string;
|
|
58
|
+
/**
|
|
59
|
+
* 在文本中定位 `NAME(` … 匹配的 `)` (引号忽略、内层括号计入)并返回
|
|
60
|
+
* `{ start, end, inner }`;找不到返回 null。start/end 是 `NAME(` 起始/闭合 `)` 之后
|
|
61
|
+
* 一位的偏移,供调用方做字符串拼接替换(不做正则整行匹配——行内可含 `;` 等字符)。
|
|
62
|
+
*
|
|
63
|
+
* @param text 待搜索的 STEP 全文。
|
|
64
|
+
* @param name 实体名(如 `FILE_NAME`),大小写敏感。
|
|
65
|
+
* @returns 匹配区间 `{ start, end, inner }`;未找到时 null。
|
|
66
|
+
*/
|
|
67
|
+
export declare function matchEntity(text: string, name: string): {
|
|
68
|
+
start: number;
|
|
69
|
+
end: number;
|
|
70
|
+
inner: string;
|
|
71
|
+
} | null;
|
|
72
|
+
/** 把一层参数(逗号分隔,忽略括号与字符串内的逗号)拆分(trim,原样保留字面量)。 */
|
|
73
|
+
/**
|
|
74
|
+
* 把一层 P21 参数(逗号分隔,忽略括号与字符串内的逗号)拆成数组;每项 trim,
|
|
75
|
+
* 字符串字面量原样保留(不做解引号)。
|
|
76
|
+
*
|
|
77
|
+
* @param inner 实体括号内、不含首尾括号的原文(如 `matchEntity` 返回的 `inner`)。
|
|
78
|
+
* @returns 拆解后的参数数组(可能为空数组)。
|
|
79
|
+
*/
|
|
80
|
+
export declare function splitP21Params(inner: string): string[];
|
|
81
|
+
/**
|
|
82
|
+
* 单个 P21 字符串字面量的未转义内容(剥离包裹引号与 `''` 转义)。
|
|
83
|
+
*
|
|
84
|
+
* @param p 可能带包裹引号的 P21 字符串字面量(含 trim),或 undefined。
|
|
85
|
+
* @returns 未转义内容;非字面量/undefined 时返回 undefined。
|
|
86
|
+
*/
|
|
87
|
+
export declare function paramStr(p: string | undefined): string | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* 单个 P21 字符串字面量(已转义)。
|
|
90
|
+
*
|
|
91
|
+
* @param v 原始字符串内容(未转义)。
|
|
92
|
+
* @returns 包裹单引号并按 P21 规则转义后的字面量(如 `'a''b'`)。
|
|
93
|
+
*/
|
|
94
|
+
export declare function stepStr(v: string): string;
|
|
95
|
+
/**
|
|
96
|
+
* P21 列表字面量:把多项字符串转为带外层圆括号的字面量列表。
|
|
97
|
+
*
|
|
98
|
+
* @param items 待序列化的字符串数组。
|
|
99
|
+
* @returns 形如 `('a','b')` 的 P21 列表字面量。
|
|
100
|
+
*/
|
|
101
|
+
export declare function p21List(items: string[]): string;
|
|
102
|
+
//# sourceMappingURL=step-meta-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-meta-header.d.ts","sourceRoot":"","sources":["../../../src/brep/export/step-meta-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAIxE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA6C9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,MAA0B,CAAA;AAExG;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsB5G;AAED,gDAAgD;AAChD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BtD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。
|
|
3
|
+
*
|
|
4
|
+
* 独立成模块使 `export-model.ts`(ExportModel 入口)与 `step.ts`
|
|
5
|
+
* (exportStepFromSolids)都能复用,避免 `export-model → export → export-model`
|
|
6
|
+
* 的循环依赖:本模块只依赖 `../../api/meta` 的 `FileMeta` 类型(type-only)。
|
|
7
|
+
*
|
|
8
|
+
* 设计文档 2026-10-05-meta §6.2 第 6 步:`exportModel` 已有 SI_UNIT 声明重写的先例
|
|
9
|
+
* ——同样只对 header 里 FILE_NAME(...)/FILE_DESCRIPTION(...) 行做文本替换,绝不碰
|
|
10
|
+
* DATA 段几何实体(红线 §10.3 3a:文本层只改声明/元数据,坐标不动)。
|
|
11
|
+
*
|
|
12
|
+
* FILE_NAME(name, time_stamp, author, organization, preprocessor_version, ...)
|
|
13
|
+
* FILE_DESCRIPTION(description_list, implementation_level)
|
|
14
|
+
* 映射(§3.3):title→name, creationDate→time_stamp, designer/author→author,
|
|
15
|
+
* organization→organization, application→preprocessor, description→description。
|
|
16
|
+
* 无对应位置的字段(copyright/licenseTerms/rating/modificationDate)**不写**
|
|
17
|
+
* (STEP 无标准位置,不发明)。
|
|
18
|
+
*
|
|
19
|
+
* 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态
|
|
20
|
+
* 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* FileMeta 是否含可映射到 STEP header 的字段(避免对无 header 字段的 fileMeta
|
|
24
|
+
* 做无谓解码重写)。
|
|
25
|
+
*
|
|
26
|
+
* @param f 文件级元数据;undefined 视为无 header 字段。
|
|
27
|
+
* @returns 存在任一可映射字段时为 true。
|
|
28
|
+
*/
|
|
29
|
+
export function fileMetaHasHeaderFields(f) {
|
|
30
|
+
if (!f)
|
|
31
|
+
return false;
|
|
32
|
+
return !!(f.title || f.description || f.designer || f.author || f.organization || f.application
|
|
33
|
+
|| f.creationDate || f.modificationDate);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* STEP 文件级元数据 → P21 header 重写:仅碰 `FILE_NAME`/`FILE_DESCRIPTION` 两处
|
|
37
|
+
* 标准实体,其余文本(含 DATA 段几何)原样保留。
|
|
38
|
+
*
|
|
39
|
+
* @param stepText 内核产出的 STEP 全文(ISO-10303-21)。
|
|
40
|
+
* @param fileMeta 目标文件级元数据。
|
|
41
|
+
* @returns 改写后的 STEP 文本。
|
|
42
|
+
*/
|
|
43
|
+
export function rewriteStepHeader(stepText, fileMeta) {
|
|
44
|
+
let out = stepText;
|
|
45
|
+
const title = fileMeta.title && fileMeta.title.length > 0 ? fileMeta.title : undefined;
|
|
46
|
+
const ts = fileMeta.creationDate && fileMeta.creationDate.length > 0
|
|
47
|
+
? fileMeta.creationDate
|
|
48
|
+
: (fileMeta.modificationDate && fileMeta.modificationDate.length > 0 ? fileMeta.modificationDate : undefined);
|
|
49
|
+
const authorList = fileMeta.author && fileMeta.author.length > 0 ? [fileMeta.author] : [];
|
|
50
|
+
const org = fileMeta.organization && fileMeta.organization.length > 0 ? fileMeta.organization : undefined;
|
|
51
|
+
const preproc = fileMeta.application && fileMeta.application.length > 0 ? fileMeta.application : undefined;
|
|
52
|
+
const designer = fileMeta.designer && fileMeta.designer.length > 0 ? fileMeta.designer : undefined;
|
|
53
|
+
const desc = fileMeta.description && fileMeta.description.length > 0 ? fileMeta.description : undefined;
|
|
54
|
+
// 1) FILE_NAME(用平衡括号/引号感知的枚举,整块替换 —— 逐参安全,不依赖行结构)。
|
|
55
|
+
const fn = matchEntity(out, 'FILE_NAME');
|
|
56
|
+
if (fn) {
|
|
57
|
+
const params = splitP21Params(fn.inner);
|
|
58
|
+
const next = [];
|
|
59
|
+
if (title !== undefined || ts !== undefined || authorList.length > 0 || org !== undefined || preproc !== undefined || designer !== undefined) {
|
|
60
|
+
next.push(stepStr(title ?? paramStr(params[0]) ?? 'STEP File'));
|
|
61
|
+
next.push(stepStr(ts ?? paramStr(params[1]) ?? ''));
|
|
62
|
+
next.push(authorList.length > 0 ? p21List(authorList) : (params[2] ?? "('')"));
|
|
63
|
+
next.push(org !== undefined ? p21List([org]) : (params[3] ?? "('')"));
|
|
64
|
+
// 保留内核写出的后续参数原样(preprocessor_version / originating_system /
|
|
65
|
+
// authorisation)——FILE_NAME 可带 6..7 参,不丢既有值。
|
|
66
|
+
next.push(preproc !== undefined ? stepStr(preproc) : (params[4] ?? ''));
|
|
67
|
+
next.push(designer !== undefined ? stepStr(designer) : (params[5] ?? ''));
|
|
68
|
+
for (let i = 6; i < params.length; i++)
|
|
69
|
+
next.push(params[i]);
|
|
70
|
+
// 末尾空参保留则拼 ',' 会使整行以 ',' 结尾 → 过滤空的尾部。
|
|
71
|
+
while (next.length > 0 && next[next.length - 1] === '')
|
|
72
|
+
next.pop();
|
|
73
|
+
out = splice(out, fn.start, fn.end, `FILE_NAME(${next.join(',')})`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 2) FILE_DESCRIPTION(description_list, implementation_level):替换描述列表。
|
|
77
|
+
const fd = matchEntity(out, 'FILE_DESCRIPTION');
|
|
78
|
+
if (fd) {
|
|
79
|
+
const params = splitP21Params(fd.inner);
|
|
80
|
+
if (desc !== undefined && params.length > 0) {
|
|
81
|
+
const impl = params[params.length - 1];
|
|
82
|
+
out = splice(out, fd.start, fd.end, `FILE_DESCRIPTION((${stepStr(desc)}),${impl})`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 用 replacement 替换字符串 [start, end) 区间,返回新字符串(不可变,纯函数)。
|
|
89
|
+
*
|
|
90
|
+
* @param s 原始字符串。
|
|
91
|
+
* @param start 替换区起始偏移(含)。
|
|
92
|
+
* @param end 替换区结束偏移(不含)。
|
|
93
|
+
* @param replacement 替换内容。
|
|
94
|
+
* @returns 替换后的新字符串。
|
|
95
|
+
*/
|
|
96
|
+
export function splice(s, start, end, replacement) {
|
|
97
|
+
return s.slice(0, start) + replacement + s.slice(end);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 旧名别名:正文使用 {@link rewriteStepHeader}。保留导出以免破坏既有调用/test 引用。
|
|
101
|
+
*
|
|
102
|
+
* @param stepText 内核产出的 STEP 全文(ISO-10303-21)。
|
|
103
|
+
* @param fileMeta 目标文件级元数据。
|
|
104
|
+
* @returns 改写后的 STEP 文本。
|
|
105
|
+
*/
|
|
106
|
+
export const rewriteFileMetaHeader = rewriteStepHeader;
|
|
107
|
+
/**
|
|
108
|
+
* 在文本中定位 `NAME(` … 匹配的 `)` (引号忽略、内层括号计入)并返回
|
|
109
|
+
* `{ start, end, inner }`;找不到返回 null。start/end 是 `NAME(` 起始/闭合 `)` 之后
|
|
110
|
+
* 一位的偏移,供调用方做字符串拼接替换(不做正则整行匹配——行内可含 `;` 等字符)。
|
|
111
|
+
*
|
|
112
|
+
* @param text 待搜索的 STEP 全文。
|
|
113
|
+
* @param name 实体名(如 `FILE_NAME`),大小写敏感。
|
|
114
|
+
* @returns 匹配区间 `{ start, end, inner }`;未找到时 null。
|
|
115
|
+
*/
|
|
116
|
+
export function matchEntity(text, name) {
|
|
117
|
+
const re = new RegExp(`${name}\\s*\\(`);
|
|
118
|
+
const m = re.exec(text);
|
|
119
|
+
if (!m)
|
|
120
|
+
return null;
|
|
121
|
+
const start = m.index;
|
|
122
|
+
const head = m.index + m[0].length;
|
|
123
|
+
let depth = 1;
|
|
124
|
+
let i = head;
|
|
125
|
+
for (; i < text.length && depth > 0; i++) {
|
|
126
|
+
const c = text[i];
|
|
127
|
+
if (c === `'`) {
|
|
128
|
+
// 跳过字符串字面量(含 ISO10303-21 双引号转义)
|
|
129
|
+
i++;
|
|
130
|
+
while (i < text.length) {
|
|
131
|
+
if (text[i] === `'` && text[i + 1] === `'`) {
|
|
132
|
+
i += 2;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (text[i] === `'`)
|
|
136
|
+
break;
|
|
137
|
+
i++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (c === '(')
|
|
141
|
+
depth++;
|
|
142
|
+
else if (c === ')')
|
|
143
|
+
depth--;
|
|
144
|
+
}
|
|
145
|
+
return { start, end: i - 1, inner: text.slice(head, i - 1) };
|
|
146
|
+
}
|
|
147
|
+
/** 把一层参数(逗号分隔,忽略括号与字符串内的逗号)拆分(trim,原样保留字面量)。 */
|
|
148
|
+
/**
|
|
149
|
+
* 把一层 P21 参数(逗号分隔,忽略括号与字符串内的逗号)拆成数组;每项 trim,
|
|
150
|
+
* 字符串字面量原样保留(不做解引号)。
|
|
151
|
+
*
|
|
152
|
+
* @param inner 实体括号内、不含首尾括号的原文(如 `matchEntity` 返回的 `inner`)。
|
|
153
|
+
* @returns 拆解后的参数数组(可能为空数组)。
|
|
154
|
+
*/
|
|
155
|
+
export function splitP21Params(inner) {
|
|
156
|
+
const out = [];
|
|
157
|
+
let cur = '';
|
|
158
|
+
let depth = 0;
|
|
159
|
+
for (let i = 0; i < inner.length; i++) {
|
|
160
|
+
const c = inner[i];
|
|
161
|
+
if (c === `'`) {
|
|
162
|
+
// 字符串字面量:整体吸收(含 ISO10303-21 转义 ''),不拆其内逗号/括号。
|
|
163
|
+
const start = i;
|
|
164
|
+
i++;
|
|
165
|
+
while (i < inner.length) {
|
|
166
|
+
if (inner[i] === `'` && inner[i + 1] === `'`) {
|
|
167
|
+
i += 2;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (inner[i] === `'`) {
|
|
171
|
+
i++;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
i++;
|
|
175
|
+
}
|
|
176
|
+
cur += inner.slice(start, i);
|
|
177
|
+
i--; // for 循环还会 +1,落到字符串结束引号后一个字符
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (c === '(')
|
|
181
|
+
depth++;
|
|
182
|
+
else if (c === ')')
|
|
183
|
+
depth--;
|
|
184
|
+
if (c === ',' && depth === 0) {
|
|
185
|
+
out.push(cur.trim());
|
|
186
|
+
cur = '';
|
|
187
|
+
}
|
|
188
|
+
else
|
|
189
|
+
cur += c;
|
|
190
|
+
}
|
|
191
|
+
if (cur.trim() !== '')
|
|
192
|
+
out.push(cur.trim());
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 单个 P21 字符串字面量的未转义内容(剥离包裹引号与 `''` 转义)。
|
|
197
|
+
*
|
|
198
|
+
* @param p 可能带包裹引号的 P21 字符串字面量(含 trim),或 undefined。
|
|
199
|
+
* @returns 未转义内容;非字面量/undefined 时返回 undefined。
|
|
200
|
+
*/
|
|
201
|
+
export function paramStr(p) {
|
|
202
|
+
if (p === undefined)
|
|
203
|
+
return undefined;
|
|
204
|
+
const m = /^'((?:[^']|'')*)'$/.exec(p.trim());
|
|
205
|
+
return m ? m[1].replace(/''/g, `'`) : undefined;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 单个 P21 字符串字面量(已转义)。
|
|
209
|
+
*
|
|
210
|
+
* @param v 原始字符串内容(未转义)。
|
|
211
|
+
* @returns 包裹单引号并按 P21 规则转义后的字面量(如 `'a''b'`)。
|
|
212
|
+
*/
|
|
213
|
+
export function stepStr(v) {
|
|
214
|
+
return `'${v.replace(/'/g, "''")}'`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* P21 列表字面量:把多项字符串转为带外层圆括号的字面量列表。
|
|
218
|
+
*
|
|
219
|
+
* @param items 待序列化的字符串数组。
|
|
220
|
+
* @returns 形如 `('a','b')` 的 P21 列表字面量。
|
|
221
|
+
*/
|
|
222
|
+
export function p21List(items) {
|
|
223
|
+
return `(${items.map(stepStr).join(',')})`;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=step-meta-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-meta-header.js","sourceRoot":"","sources":["../../../src/brep/export/step-meta-header.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。\n *\n * 独立成模块使 `export-model.ts`(ExportModel 入口)与 `step.ts`\n * (exportStepFromSolids)都能复用,避免 `export-model → export → export-model`\n * 的循环依赖:本模块只依赖 `../../api/meta` 的 `FileMeta` 类型(type-only)。\n *\n * 设计文档 2026-10-05-meta §6.2 第 6 步:`exportModel` 已有 SI_UNIT 声明重写的先例\n * ——同样只对 header 里 FILE_NAME(...)/FILE_DESCRIPTION(...) 行做文本替换,绝不碰\n * DATA 段几何实体(红线 §10.3 3a:文本层只改声明/元数据,坐标不动)。\n *\n * FILE_NAME(name, time_stamp, author, organization, preprocessor_version, ...)\n * FILE_DESCRIPTION(description_list, implementation_level)\n * 映射(§3.3):title→name, creationDate→time_stamp, designer/author→author,\n * organization→organization, application→preprocessor, description→description。\n * 无对应位置的字段(copyright/licenseTerms/rating/modificationDate)**不写**\n * (STEP 无标准位置,不发明)。\n *\n * 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态\n * 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。\n */\n\nimport type { FileMeta } from '../../api/meta'\n\n/**\n * FileMeta 是否含可映射到 STEP header 的字段(避免对无 header 字段的 fileMeta\n * 做无谓解码重写)。\n *\n * @param f 文件级元数据;undefined 视为无 header 字段。\n * @returns 存在任一可映射字段时为 true。\n */\nexport function fileMetaHasHeaderFields(f: FileMeta | undefined): boolean {\n if (!f) return false\n return !!(f.title || f.description || f.designer || f.author || f.organization || f.application\n || f.creationDate || f.modificationDate)\n}\n\n/**\n * STEP 文件级元数据 → P21 header 重写:仅碰 `FILE_NAME`/`FILE_DESCRIPTION` 两处\n * 标准实体,其余文本(含 DATA 段几何)原样保留。\n *\n * @param stepText 内核产出的 STEP 全文(ISO-10303-21)。\n * @param fileMeta 目标文件级元数据。\n * @returns 改写后的 STEP 文本。\n */\nexport function rewriteStepHeader(stepText: string, fileMeta: FileMeta): string {\n let out = stepText\n\n const title = fileMeta.title && fileMeta.title.length > 0 ? fileMeta.title : undefined\n const ts = fileMeta.creationDate && fileMeta.creationDate.length > 0\n ? fileMeta.creationDate\n : (fileMeta.modificationDate && fileMeta.modificationDate.length > 0 ? fileMeta.modificationDate : undefined)\n const authorList = fileMeta.author && fileMeta.author.length > 0 ? [fileMeta.author] : []\n const org = fileMeta.organization && fileMeta.organization.length > 0 ? fileMeta.organization : undefined\n const preproc = fileMeta.application && fileMeta.application.length > 0 ? fileMeta.application : undefined\n const designer = fileMeta.designer && fileMeta.designer.length > 0 ? fileMeta.designer : undefined\n const desc = fileMeta.description && fileMeta.description.length > 0 ? fileMeta.description : undefined\n\n // 1) FILE_NAME(用平衡括号/引号感知的枚举,整块替换 —— 逐参安全,不依赖行结构)。\n const fn = matchEntity(out, 'FILE_NAME')\n if (fn) {\n const params = splitP21Params(fn.inner)\n const next: string[] = []\n if (title !== undefined || ts !== undefined || authorList.length > 0 || org !== undefined || preproc !== undefined || designer !== undefined) {\n next.push(stepStr(title ?? paramStr(params[0]) ?? 'STEP File'))\n next.push(stepStr(ts ?? paramStr(params[1]) ?? ''))\n next.push(authorList.length > 0 ? p21List(authorList) : (params[2] ?? \"('')\"))\n next.push(org !== undefined ? p21List([org]) : (params[3] ?? \"('')\"))\n // 保留内核写出的后续参数原样(preprocessor_version / originating_system /\n // authorisation)——FILE_NAME 可带 6..7 参,不丢既有值。\n next.push(preproc !== undefined ? stepStr(preproc) : (params[4] ?? ''))\n next.push(designer !== undefined ? stepStr(designer) : (params[5] ?? ''))\n for (let i = 6; i < params.length; i++) next.push(params[i])\n // 末尾空参保留则拼 ',' 会使整行以 ',' 结尾 → 过滤空的尾部。\n while (next.length > 0 && next[next.length - 1] === '') next.pop()\n out = splice(out, fn.start, fn.end, `FILE_NAME(${next.join(',')})`)\n }\n }\n\n // 2) FILE_DESCRIPTION(description_list, implementation_level):替换描述列表。\n const fd = matchEntity(out, 'FILE_DESCRIPTION')\n if (fd) {\n const params = splitP21Params(fd.inner)\n if (desc !== undefined && params.length > 0) {\n const impl = params[params.length - 1]\n out = splice(out, fd.start, fd.end, `FILE_DESCRIPTION((${stepStr(desc)}),${impl})`)\n }\n }\n\n return out\n}\n\n/**\n * 用 replacement 替换字符串 [start, end) 区间,返回新字符串(不可变,纯函数)。\n *\n * @param s 原始字符串。\n * @param start 替换区起始偏移(含)。\n * @param end 替换区结束偏移(不含)。\n * @param replacement 替换内容。\n * @returns 替换后的新字符串。\n */\nexport function splice(s: string, start: number, end: number, replacement: string): string {\n return s.slice(0, start) + replacement + s.slice(end)\n}\n\n/**\n * 旧名别名:正文使用 {@link rewriteStepHeader}。保留导出以免破坏既有调用/test 引用。\n *\n * @param stepText 内核产出的 STEP 全文(ISO-10303-21)。\n * @param fileMeta 目标文件级元数据。\n * @returns 改写后的 STEP 文本。\n */\nexport const rewriteFileMetaHeader: (stepText: string, fileMeta: FileMeta) => string = rewriteStepHeader\n\n/**\n * 在文本中定位 `NAME(` … 匹配的 `)` (引号忽略、内层括号计入)并返回\n * `{ start, end, inner }`;找不到返回 null。start/end 是 `NAME(` 起始/闭合 `)` 之后\n * 一位的偏移,供调用方做字符串拼接替换(不做正则整行匹配——行内可含 `;` 等字符)。\n *\n * @param text 待搜索的 STEP 全文。\n * @param name 实体名(如 `FILE_NAME`),大小写敏感。\n * @returns 匹配区间 `{ start, end, inner }`;未找到时 null。\n */\nexport function matchEntity(text: string, name: string): { start: number; end: number; inner: string } | null {\n const re = new RegExp(`${name}\\\\s*\\\\(`)\n const m = re.exec(text)\n if (!m) return null\n const start = m.index\n const head = m.index + m[0].length\n let depth = 1\n let i = head\n for (; i < text.length && depth > 0; i++) {\n const c = text[i]\n if (c === `'`) {\n // 跳过字符串字面量(含 ISO10303-21 双引号转义)\n i++\n while (i < text.length) {\n if (text[i] === `'` && text[i + 1] === `'`) { i += 2; continue }\n if (text[i] === `'`) break\n i++\n }\n } else if (c === '(') depth++\n else if (c === ')') depth--\n }\n return { start, end: i - 1, inner: text.slice(head, i - 1) }\n}\n\n/** 把一层参数(逗号分隔,忽略括号与字符串内的逗号)拆分(trim,原样保留字面量)。 */\n/**\n * 把一层 P21 参数(逗号分隔,忽略括号与字符串内的逗号)拆成数组;每项 trim,\n * 字符串字面量原样保留(不做解引号)。\n *\n * @param inner 实体括号内、不含首尾括号的原文(如 `matchEntity` 返回的 `inner`)。\n * @returns 拆解后的参数数组(可能为空数组)。\n */\nexport function splitP21Params(inner: string): string[] {\n const out: string[] = []\n let cur = ''\n let depth = 0\n for (let i = 0; i < inner.length; i++) {\n const c = inner[i]\n if (c === `'`) {\n // 字符串字面量:整体吸收(含 ISO10303-21 转义 ''),不拆其内逗号/括号。\n const start = i\n i++\n while (i < inner.length) {\n if (inner[i] === `'` && inner[i + 1] === `'`) { i += 2; continue }\n if (inner[i] === `'`) { i++; break }\n i++\n }\n cur += inner.slice(start, i)\n i-- // for 循环还会 +1,落到字符串结束引号后一个字符\n continue\n }\n if (c === '(') depth++\n else if (c === ')') depth--\n if (c === ',' && depth === 0) { out.push(cur.trim()); cur = '' }\n else cur += c\n }\n if (cur.trim() !== '') out.push(cur.trim())\n return out\n}\n\n/**\n * 单个 P21 字符串字面量的未转义内容(剥离包裹引号与 `''` 转义)。\n *\n * @param p 可能带包裹引号的 P21 字符串字面量(含 trim),或 undefined。\n * @returns 未转义内容;非字面量/undefined 时返回 undefined。\n */\nexport function paramStr(p: string | undefined): string | undefined {\n if (p === undefined) return undefined\n const m = /^'((?:[^']|'')*)'$/.exec(p.trim())\n return m ? m[1].replace(/''/g, `'`) : undefined\n}\n\n/**\n * 单个 P21 字符串字面量(已转义)。\n *\n * @param v 原始字符串内容(未转义)。\n * @returns 包裹单引号并按 P21 规则转义后的字面量(如 `'a''b'`)。\n */\nexport function stepStr(v: string): string {\n return `'${v.replace(/'/g, \"''\")}'`\n}\n\n/**\n * P21 列表字面量:把多项字符串转为带外层圆括号的字面量列表。\n *\n * @param items 待序列化的字符串数组。\n * @returns 形如 `('a','b')` 的 P21 列表字面量。\n */\nexport function p21List(items: string[]): string {\n return `(${items.map(stepStr).join(',')})`\n}"]}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { BrepHandle } from '../engine/types.js';
|
|
16
16
|
import type { BrepEngineApi } from '../engine/primitives.js';
|
|
17
|
+
import type { FileMeta } from '../../api/meta.js';
|
|
17
18
|
/** STEP 导出条目:一个 part(精确 BREP 形状或三角网格,二选一)。 */
|
|
18
19
|
export interface StepExportEntry {
|
|
19
20
|
/** 精确 BREP 形状(solid/shell/face/compound,来自宿主导出缓存)。与 mesh 二选一,solid 优先。 */
|
|
@@ -34,10 +35,13 @@ export interface StepExportEntry {
|
|
|
34
35
|
*
|
|
35
36
|
* @param kernel OCCT kernel (must match the one that created the solids)
|
|
36
37
|
* @param entries parts to export; each becomes its own XCAF label
|
|
38
|
+
* @param fileMeta optional file-level metadata; mapped to the P21 header
|
|
39
|
+
* (`FILE_NAME`/`FILE_DESCRIPTION`) via text rewrite
|
|
40
|
+
* (`rewriteStepHeader`). No effect on geometry/DATA entities.
|
|
37
41
|
* @returns STEP file content as ArrayBuffer
|
|
38
42
|
* @throws if entries is empty, or a mesh entry fails to reconstruct
|
|
39
43
|
*/
|
|
40
|
-
export declare function exportStepFromSolids(kernel: BrepEngineApi, entries: StepExportEntry[]): ArrayBuffer;
|
|
44
|
+
export declare function exportStepFromSolids(kernel: BrepEngineApi, entries: StepExportEntry[], fileMeta?: FileMeta): ArrayBuffer;
|
|
41
45
|
/**
|
|
42
46
|
* Export a BREP solid (OCCT native) to STEP format.
|
|
43
47
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../../src/brep/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../../src/brep/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAG9C,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,0DAA0D;IAC1D,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,WAAW,CAAA;KAAE,CAAA;IACxD,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAmFb;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,aAAa,GACpB,WAAW,CAEb"}
|
package/dist/brep/export/step.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { reconstructSolidFromMesh } from '../../occt-kernel/meshReconstruct.js';
|
|
16
16
|
import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
|
|
17
|
+
import { rewriteStepHeader, fileMetaHasHeaderFields } from './step-meta-header.js';
|
|
17
18
|
/**
|
|
18
19
|
* sRGB → linear 转换。
|
|
19
20
|
*
|
|
@@ -33,10 +34,13 @@ function srgbToLinear(c) {
|
|
|
33
34
|
*
|
|
34
35
|
* @param kernel OCCT kernel (must match the one that created the solids)
|
|
35
36
|
* @param entries parts to export; each becomes its own XCAF label
|
|
37
|
+
* @param fileMeta optional file-level metadata; mapped to the P21 header
|
|
38
|
+
* (`FILE_NAME`/`FILE_DESCRIPTION`) via text rewrite
|
|
39
|
+
* (`rewriteStepHeader`). No effect on geometry/DATA entities.
|
|
36
40
|
* @returns STEP file content as ArrayBuffer
|
|
37
41
|
* @throws if entries is empty, or a mesh entry fails to reconstruct
|
|
38
42
|
*/
|
|
39
|
-
export function exportStepFromSolids(kernel, entries) {
|
|
43
|
+
export function exportStepFromSolids(kernel, entries, fileMeta) {
|
|
40
44
|
if (entries.length === 0) {
|
|
41
45
|
throw new Error('No exportable geometry');
|
|
42
46
|
}
|
|
@@ -99,7 +103,12 @@ export function exportStepFromSolids(kernel, entries) {
|
|
|
99
103
|
}
|
|
100
104
|
// 3. 导出(每个 label 一个独立 PRODUCT,保留名称/颜色)
|
|
101
105
|
const stepText = doc.exportSTEP();
|
|
102
|
-
|
|
106
|
+
// 文件级 meta → P21 header 重写(title/creationDate/createor/author/org/
|
|
107
|
+
// application/description)。无 header 字段时不重写。文本层只改声明不碰几何。
|
|
108
|
+
const out = fileMeta && fileMetaHasHeaderFields(fileMeta)
|
|
109
|
+
? rewriteStepHeader(stepText, fileMeta)
|
|
110
|
+
: stepText;
|
|
111
|
+
return new TextEncoder().encode(out).buffer;
|
|
103
112
|
}
|
|
104
113
|
finally {
|
|
105
114
|
// 4. 释放顺序:先关文档,再释放本函数创建的句柄
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../../src/brep/export/step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAoB,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../../src/brep/export/step.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * exportStepFromSolids — L1 STEP 导出(从 OCCT solid 句柄,多实体、零 fuse)\n *\n * @platform occt — 本文件 import occt-kernel(createXCAFDocument/XCAF label 写入是\n * occt-only 平台面,D3)。文件级标注满足守卫①(平台 import 自证身份)。\n *\n * 每个 entry 作为 STEP 中一个独立实体(独立 XCAF label / PRODUCT)导出,\n * 保留名称与颜色。多实体之间绝不 fuse —— 这是硬性约定:\n * fuse 只允许作为用户脚本里的几何布尔运算,禁止作为导出时的实体合并手段。\n *\n * 导出 → 再导入身份闭环:导入侧 importAssemblyFromStep(XCAF)会把\n * 多实体 STEP 还原为多个 part;多 solid compound 拆分出的子节点命名为\n * `name [n]`,与本节点的展平命名规则一致。\n */\n\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { reconstructSolidFromMesh } from '../../occt-kernel/meshReconstruct'\nimport { getOcctKernel, type ShapeHandle } from '../../occt-kernel/occtKernel'\nimport type { FileMeta } from '../../api/meta'\nimport { rewriteStepHeader, fileMetaHasHeaderFields } from './step-meta-header'\n\n/** STEP 导出条目:一个 part(精确 BREP 形状或三角网格,二选一)。 */\nexport interface StepExportEntry {\n /** 精确 BREP 形状(solid/shell/face/compound,来自宿主导出缓存)。与 mesh 二选一,solid 优先。 */\n solid?: BrepHandle\n /** 三角网格(世界坐标、已按单位缩放),经 reconstructSolidFromMesh 重建为实体。 */\n mesh?: { positions: Float32Array; indices: Uint32Array }\n /** 实体名称(写入 label name,导出为 PRODUCT 名称)。 */\n name?: string\n /** RGB 0..1 颜色(sRGB 编码,如宿主材质 base color)。写入前转 linear。 */\n color?: [number, number, number]\n}\n\n/**\n * sRGB → linear 转换。\n *\n * OCCT XCAF 内部按 linear RGB 存储颜色,STEP writer(xcafExportSTEP)\n * 导出时做 linear→sRGB 编码写 COLOUR_RGB。为了让\"宿主传入的 sRGB 颜色 ==\n * STEP 文件中的 COLOUR_RGB == 回读颜色\",写入前必须先转 linear。\n *\n * @param c sRGB 编码值(0..1)\n * @returns linear 值(0..1)\n */\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n}\n\n/**\n * Export multiple BREP solids (and/or triangle meshes) to STEP, one\n * independent entity per entry — no fuse, no string splicing.\n *\n * @param kernel OCCT kernel (must match the one that created the solids)\n * @param entries parts to export; each becomes its own XCAF label\n * @param fileMeta optional file-level metadata; mapped to the P21 header\n * (`FILE_NAME`/`FILE_DESCRIPTION`) via text rewrite\n * (`rewriteStepHeader`). No effect on geometry/DATA entities.\n * @returns STEP file content as ArrayBuffer\n * @throws if entries is empty, or a mesh entry fails to reconstruct\n */\nexport function exportStepFromSolids(\n kernel: BrepEngineApi,\n entries: StepExportEntry[],\n fileMeta?: FileMeta,\n): ArrayBuffer {\n if (entries.length === 0) {\n throw new Error('No exportable geometry')\n }\n\n const doc = getOcctKernel().createXCAFDocument()\n // 本函数创建的句柄(展平出的子 solid + mesh 重建的 solid),导出后释放。\n // 缓存里的原 solid(entry.solid)绝不释放,归调用方/缓存所有。\n const ownedHandles: BrepHandle[] = []\n\n try {\n for (const entry of entries) {\n // 1. 解析 solid:优先用精确 solid;无则从三角网格重建\n let solid = entry.solid\n if (!solid) {\n if (!entry.mesh) {\n throw new Error('StepExportEntry must provide either solid or mesh')\n }\n solid = reconstructSolidFromMesh(kernel, entry.mesh.positions, entry.mesh.indices)\n ownedHandles.push(solid)\n }\n\n // 2. 展平 Compound(多 solid 导入的 part 其 solid 是 Compound);\n // 纯 solid 时 getSubShapes('solid') 返回 [自身]。\n // 形状类型分派:solid → shell → face → edge。ref 侧(cadquery\n // Shape.exportStep)可导出任意类型的形状,面/壳/边 compound(如\n // Shape.faces('>Z') / shape.edges('>Z') 的结果)同样要能写进\n // STEP(U22,2026-09-09)。\n let subs = kernel.getSubShapes(solid, 'solid')\n if (subs.length === 0) {\n subs = kernel.getSubShapes(solid, 'shell')\n }\n if (subs.length === 0) {\n subs = kernel.getSubShapes(solid, 'face')\n }\n if (subs.length === 0) {\n subs = kernel.getSubShapes(solid, 'edge')\n }\n if (subs.length === 0) {\n // wasm getSubShapes 不展开 compound 层(TopExp_Explorer 默认跳过),\n // 纯面/壳/边 compound(如 Shape.siblings / faces('>Z') 结果)在这里\n // 拿不到子形状。把 compound 整体作为单个 XCAF label 写入(STEP\n // writer 支持 compound 形状,与 ref 侧 cadquery Shape.exportStep\n // 对 faces/edges compound 的行为一致)。\n subs = [solid]\n }\n for (let si = 0; si < subs.length; si++) {\n const sub = subs[si]\n // 展平出的子句柄若不属于调用方缓存,记入 ownedHandles\n if (solid !== sub) ownedHandles.push(sub)\n const name = subs.length > 1\n ? `${entry.name ?? 'part'} [${si + 1}]`\n : entry.name\n // sRGB → linear:XCAF 按 linear 存储,STEP writer 输出时线性→sRGB,\n // 转换后 STEP 文件里的 COLOUR_RGB 才是宿主传入的原始 sRGB 值。\n const color: [number, number, number] | undefined = entry.color\n ? [srgbToLinear(entry.color[0]), srgbToLinear(entry.color[1]), srgbToLinear(entry.color[2])]\n : undefined\n // 平台面(D3):XCAF label 写入是 occt-only。BrepHandle ↔ ShapeHandle\n // 运行时同构,品牌转换只发生在平台边界。\n doc.addShape(sub as unknown as ShapeHandle, { name, color })\n }\n }\n\n // 3. 导出(每个 label 一个独立 PRODUCT,保留名称/颜色)\n const stepText = doc.exportSTEP()\n // 文件级 meta → P21 header 重写(title/creationDate/createor/author/org/\n // application/description)。无 header 字段时不重写。文本层只改声明不碰几何。\n const out = fileMeta && fileMetaHasHeaderFields(fileMeta)\n ? rewriteStepHeader(stepText, fileMeta)\n : stepText\n return new TextEncoder().encode(out).buffer\n } finally {\n // 4. 释放顺序:先关文档,再释放本函数创建的句柄\n doc.close()\n for (const h of ownedHandles) {\n try {\n kernel.release(h)\n } catch {\n // already released\n }\n }\n }\n}\n\n/**\n * Export a BREP solid (OCCT native) to STEP format.\n *\n * 单实体导出 = exportStepFromSolids 的单条目特例(同一实现,无第二真源)。\n *\n * @param solid OCCT solid handle\n * @param kernel OCCT kernel (must match the one that created the solid)\n * @returns STEP file content as ArrayBuffer\n */\nexport function exportStepFromSolid(\n solid: BrepHandle,\n kernel: BrepEngineApi,\n): ArrayBuffer {\n return exportStepFromSolids(kernel, [{ solid }])\n}"]}
|
|
@@ -19,7 +19,7 @@ import type { BrepEngineApi } from './engine/primitives.js';
|
|
|
19
19
|
* ("OCCT kernel") no longer matches what it returns — the current engine's raw
|
|
20
20
|
* kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,
|
|
21
21
|
* same file) for neutral ops; platform-only code (L2 face) should use
|
|
22
|
-
* `getOcctKernel()` (D3). Kept for
|
|
22
|
+
* `getOcctKernel()` (D3). Kept for compat-face bridging and existing tests.
|
|
23
23
|
* @returns the current BREP engine's kernel instance.
|
|
24
24
|
* @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.
|
|
25
25
|
*/
|
|
@@ -48,7 +48,7 @@ export interface MeshHandleOptions {
|
|
|
48
48
|
/**
|
|
49
49
|
* OCC 句柄身份契约判别(单一真源)。
|
|
50
50
|
*
|
|
51
|
-
* occt-wasm 的 `handle()` 工厂(
|
|
51
|
+
* occt-wasm 的 `handle()` 工厂(occtWasm helpers.ts:25)构造的句柄对象
|
|
52
52
|
* 统一携带 `__occtWasm: true`。本叶子是 faijs 侧唯一允许的判据:
|
|
53
53
|
* define-op 的 `wrapBrepOne` 用它区分"几何句柄"与"纯数据记录",本文件
|
|
54
54
|
* `fromHandle`/`meshHandle` 入口用它做形态断言。禁止在其他文件硬编码
|
|
@@ -18,7 +18,7 @@ import { fromBrep } from '../shape.js';
|
|
|
18
18
|
* ("OCCT kernel") no longer matches what it returns — the current engine's raw
|
|
19
19
|
* kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,
|
|
20
20
|
* same file) for neutral ops; platform-only code (L2 face) should use
|
|
21
|
-
* `getOcctKernel()` (D3). Kept for
|
|
21
|
+
* `getOcctKernel()` (D3). Kept for compat-face bridging and existing tests.
|
|
22
22
|
* @returns the current BREP engine's kernel instance.
|
|
23
23
|
* @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.
|
|
24
24
|
*/
|
|
@@ -50,7 +50,7 @@ export function getBrepApi() {
|
|
|
50
50
|
/**
|
|
51
51
|
* OCC 句柄身份契约判别(单一真源)。
|
|
52
52
|
*
|
|
53
|
-
* occt-wasm 的 `handle()` 工厂(
|
|
53
|
+
* occt-wasm 的 `handle()` 工厂(occtWasm helpers.ts:25)构造的句柄对象
|
|
54
54
|
* 统一携带 `__occtWasm: true`。本叶子是 faijs 侧唯一允许的判据:
|
|
55
55
|
* define-op 的 `wrapBrepOne` 用它区分"几何句柄"与"纯数据记录",本文件
|
|
56
56
|
* `fromHandle`/`meshHandle` 入口用它做形态断言。禁止在其他文件硬编码
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;IACH,CAAC;IACD,OAAO,MAAuB,CAAA;AAChC,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAA8B,CAAC,UAAU,KAAK,IAAI,CAAA;AACnG,CAAC;AAED;0CAC0C;AAC1C,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,MAAc;IACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,yDAAyD;YAC/E,kCAAkC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,IAAI;YAC9E,wDAAwD,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,SAAS,EAAoB,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,GAAG;QAC/C,iBAAiB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,OAAO;QACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAA4B,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * handle-bridge — OCCT 句柄 → faijs Shape 的 SDK 桥接(B1)\n *\n *\n * 第三方库要造 BREP 产物,需要\"OCCT handle → mesh\"。`src/brep/brep-ops.ts:17`\n * 有 `import * as THREE from 'three'`,SDK 绝不能 import 它(会把 three 拉进\n * SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的\n * 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。\n *\n * 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only\n * `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** 结构化内核接口(不 import occt-wasm,只做结构匹配,避免 heavy 依赖) */\ninterface MeshableKernel {\n meshShape(\n handle: unknown,\n opts: { linearDeflection: number; angularDeflection: number },\n ): { positions: ArrayLike<number>; indices: ArrayLike<number> }\n}\n\n/**\n * Get the currently injected BREP kernel instance (untyped escape hatch).\n * @deprecated D12: this exit predates the engine-neutral L1 surface and its name\n * (\"OCCT kernel\") no longer matches what it returns — the current engine's raw\n * kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,\n * same file) for neutral ops; platform-only code (L2 face) should use\n * `getOcctKernel()` (D3). Kept for
|
|
1
|
+
{"version":3,"file":"handle-bridge.js","sourceRoot":"","sources":["../../src/brep/handle-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAWnC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAA;IAC5G,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAA;IACH,CAAC;IACD,OAAO,MAAuB,CAAA;AAChC,CAAC;AAYD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAA8B,CAAC,UAAU,KAAK,IAAI,CAAA;AACnG,CAAC;AAED;0CAC0C;AAC1C,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,MAAc;IACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,yDAAyD;YAC/E,kCAAkC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,IAAI;YAC9E,wDAAwD,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,SAAS,EAAoB,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACpC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,GAAG;QAC/C,iBAAiB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,OAAO;QACL,SAAS,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAA8B,CAAC;QAChE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAA4B,CAAC;KAC5D,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe,EAAE,IAAwB;IAClE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * handle-bridge — OCCT 句柄 → faijs Shape 的 SDK 桥接(B1)\n *\n *\n * 第三方库要造 BREP 产物,需要\"OCCT handle → mesh\"。`src/brep/brep-ops.ts:17`\n * 有 `import * as THREE from 'three'`,SDK 绝不能 import 它(会把 three 拉进\n * SDK bundle,违反 `src/sdk.test.ts` 的零 heavy 依赖守卫)。本文件在**新建的\n * 零依赖模块**中实现,直接调运行时注入的 `kernel.meshShape`。\n *\n * 依赖约束(硬性):只允许 import `runtime-state`、`api/shape`、type-only\n * `mesh/types`——任何新增依赖必须保持 dist/sdk.js 零 heavy 依赖守卫通过。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from './engine/primitives'\n\n/** 结构化内核接口(不 import occt-wasm,只做结构匹配,避免 heavy 依赖) */\ninterface MeshableKernel {\n meshShape(\n handle: unknown,\n opts: { linearDeflection: number; angularDeflection: number },\n ): { positions: ArrayLike<number>; indices: ArrayLike<number> }\n}\n\n/**\n * Get the currently injected BREP kernel instance (untyped escape hatch).\n * @deprecated D12: this exit predates the engine-neutral L1 surface and its name\n * (\"OCCT kernel\") no longer matches what it returns — the current engine's raw\n * kernel, whatever engine that is. Prefer `getBrepApi()` (typed, engine-neutral,\n * same file) for neutral ops; platform-only code (L2 face) should use\n * `getOcctKernel()` (D3). Kept for compat-face bridging and existing tests.\n * @returns the current BREP engine's kernel instance.\n * @throws when the kernel is not ready (mesh mode or uninitialized) — never silently returns null.\n */\nexport function getKernel(): unknown {\n const kernel = getBackends().kernel.brep\n if (!kernel) {\n throw new Error('[faijs/bridge] OCCT kernel not available: BREP operations require an initialized kernel')\n }\n return kernel\n}\n\n/**\n * Get the current BREP engine as the **L1 core surface** (`BrepEngineApi`).\n *\n * 2026-09-24 narrowing plan(D12):中立 op 的取内核唯一出口——取代\n * `getBackends().kernel.brep as BrepEngineApi` 的逐点断言。本文件是 L1 契约\n * 的注册点(`registerBrepEngine` 注入的就是 `BrepEngineApi` 实例),此处断言\n * 诚实;平台面(L1 之外的 occt 独有能力)仍走 `getOcctKernel()`(D3)。\n *\n * @returns the current engine's L1 contract surface (`BrepEngineApi`) — typed, engine-neutral.\n * @throws when no BREP engine is registered (uninitialized) — never silently returns null.\n */\nexport function getBrepApi(): BrepEngineApi {\n const kernel = getBackends().kernel.brep\n if (!kernel) {\n throw new Error(\n '[faijs/bridge] BREP engine API not available: BREP operations require an initialized engine',\n )\n }\n return kernel as BrepEngineApi\n}\n\n/**\n * Options controlling how a handle is tessellated.\n */\nexport interface MeshHandleOptions {\n /** linear deflection (mm), default 0.1 — matches the built-in ops (src/brep/brep-ops.ts:27). */\n linearDeflection?: number\n /** angular segment count, default 32 — angularDeflection = 2π / segments. */\n segments?: number\n}\n\n/**\n * OCC 句柄身份契约判别(单一真源)。\n *\n * occt-wasm 的 `handle()` 工厂(occtWasm helpers.ts:25)构造的句柄对象\n * 统一携带 `__occtWasm: true`。本叶子是 faijs 侧唯一允许的判据:\n * define-op 的 `wrapBrepOne` 用它区分\"几何句柄\"与\"纯数据记录\",本文件\n * `fromHandle`/`meshHandle` 入口用它做形态断言。禁止在其他文件硬编码\n * `'__occtWasm' in v` 字符串直查——句柄/数据判定的任何新消费点都必须引用本叶子。\n * @param v - 待判别的值。\n * @returns `true` 当且仅当 `v` 是携带 `__occtWasm: true` 标记的句柄对象。\n */\nexport function isOcctHandle(v: unknown): boolean {\n return typeof v === 'object' && v !== null && (v as { __occtWasm?: unknown }).__occtWasm === true\n}\n\n/** 合法句柄输入:branded numeric id(occt-wasm 的 `ShapeHandle` 运行时形态)或\n * `__occtWasm` 标记对象(`handle()` 工厂产物)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'number' || isOcctHandle(v)\n}\n\n/**\n * 入口形态断言:拒绝把纯数据记录当句柄三角化。\n * 纯数据记录(无 `__occtWasm` 标记的 plain object,如 sheetmetal part 数据)\n * 必须在 SDK 边界被显式拒绝(E_BAD_HANDLE),而不是在 kernel 深处以\n * `OcctError: meshShape: Invalid shape ID 0` 崩溃——define-op 的 wrapBrepOne\n * 已在第一道透传过滤,本断言是第二道防线(防未来未带标记的新句柄形态漏网)。\n */\nfunction requireHandle(handle: unknown, caller: string): void {\n if (!isHandleLike(handle)) {\n throw new Error(\n `[faijs/bridge] ${caller}: E_BAD_HANDLE: expected an OCCT handle (numeric id or ` +\n `__occtWasm-tagged object); got ${handle === null ? 'null' : typeof handle}. ` +\n `Plain data records must not be tessellated as handles.`,\n )\n }\n}\n\n/**\n * Tessellate an OCCT handle into a Shape (without registering a BREP slot).\n * @param handle - the OCCT solid handle to tessellate (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the tessellated Shape.\n */\nexport function meshHandle(handle: unknown, opts?: MeshHandleOptions): Shape {\n requireHandle(handle, 'meshHandle')\n const kernel = getKernel() as MeshableKernel\n const mesh = kernel.meshShape(handle, {\n linearDeflection: opts?.linearDeflection ?? 0.1,\n angularDeflection: (2 * Math.PI) / Math.max(3, opts?.segments ?? 32),\n })\n return {\n positions: new Float32Array(mesh.positions as ArrayLike<number>),\n indices: new Uint32Array(mesh.indices as ArrayLike<number>),\n }\n}\n\n/**\n * Default path (recommended): tessellate + register the BREP slot in one step.\n * Equivalent to meshHandle(h) + fromBrep(sh, { solid: h }).\n * Library authors only fall back to the meshHandle + fromBrep combination when\n * they need custom tessellation precision.\n * @param handle - the OCCT solid handle to bridge (numeric id or `__occtWasm`-tagged object).\n * @param opts - optional tessellation options.\n * @returns the registered Shape, as returned by fromBrep.\n */\nexport function fromHandle(handle: unknown, opts?: MeshHandleOptions): ReturnType<typeof fromBrep> {\n requireHandle(handle, 'fromHandle')\n return fromBrep(meshHandle(handle, opts), { solid: handle })\n}\n"]}
|
package/dist/brep/index.d.ts
CHANGED
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
* - brep-ops.ts: 核心 BREP 操作(变换、布尔、钻孔、分割、拉伸)
|
|
6
6
|
* - brep-chain.ts: BREP 链状态管理
|
|
7
7
|
* - brep-utils.ts: 通用工具
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
8
|
+
* - brep-topology.ts / primitives-brep.ts / mesh-solid.ts: 拓扑查询、原型、实体化
|
|
9
|
+
* - face-evolution.ts / handle-bridge.ts / effective-deflection.ts: 面演化、句柄桥、偏转
|
|
10
|
+
* - engine/: BREP 引擎注册表与适配器(adapters/ 下 occt、brepkit、brep-mock)
|
|
11
|
+
* - export/: 导出(stl.ts、step.ts、export-model.ts)
|
|
12
|
+
* - svg/: SVG → 实体
|
|
13
|
+
* - text/: 文字 BREP(fontRegistry.ts、text-to-solid.ts)
|
|
11
14
|
*/
|
|
12
15
|
export { solidToShape, translateBrep, rotateBrep, scaleBrep, fuseBrep, cutBrep, commonBrep, drillBrep, splitBrep, extrudeBrep, loadBrep, matrixToArray, type DrillBrepParams, type SplitBrepParams, type SplitBrepResult, type ExtrudeBrepParams, } from './brep-ops.js';
|
|
13
16
|
export { type BrepChainState, createBrepChainState, initBrepChainState, releaseBrepChainState, isCadFormat, } from './brep-chain.js';
|
package/dist/brep/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brep/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/brep/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EAAE,UAAU,EAAE,SAAS,EACpC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAC7B,SAAS,EAAE,SAAS,EAAE,WAAW,EACjC,QAAQ,EAAE,aAAa,EACvB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,GACzF,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,KAAK,cAAc,EACnB,oBAAoB,EAAE,kBAAkB,EACxC,qBAAqB,EACrB,WAAW,GACZ,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/brep/index.js
CHANGED
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
* - brep-ops.ts: 核心 BREP 操作(变换、布尔、钻孔、分割、拉伸)
|
|
6
6
|
* - brep-chain.ts: BREP 链状态管理
|
|
7
7
|
* - brep-utils.ts: 通用工具
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
8
|
+
* - brep-topology.ts / primitives-brep.ts / mesh-solid.ts: 拓扑查询、原型、实体化
|
|
9
|
+
* - face-evolution.ts / handle-bridge.ts / effective-deflection.ts: 面演化、句柄桥、偏转
|
|
10
|
+
* - engine/: BREP 引擎注册表与适配器(adapters/ 下 occt、brepkit、brep-mock)
|
|
11
|
+
* - export/: 导出(stl.ts、step.ts、export-model.ts)
|
|
12
|
+
* - svg/: SVG → 实体
|
|
13
|
+
* - text/: 文字 BREP(fontRegistry.ts、text-to-solid.ts)
|
|
11
14
|
*/
|
|
12
15
|
// 核心 BREP 操作
|
|
13
16
|
export { solidToShape, translateBrep, rotateBrep, scaleBrep, fuseBrep, cutBrep, commonBrep, drillBrep, splitBrep, extrudeBrep, loadBrep, matrixToArray, } from './brep-ops.js';
|
package/dist/brep/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brep/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brep/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,aAAa;AACb,OAAO,EACL,YAAY,EACZ,aAAa,EAAE,UAAU,EAAE,SAAS,EACpC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAC7B,SAAS,EAAE,SAAS,EAAE,WAAW,EACjC,QAAQ,EAAE,aAAa,GAExB,MAAM,YAAY,CAAA;AAEnB,aAAa;AACb,OAAO,EAEL,oBAAoB,EAAE,kBAAkB,EACxC,qBAAqB,EACrB,WAAW,GACZ,MAAM,cAAc,CAAA;AAErB,OAAO;AACP,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,yDAAyD;AACzD,oFAAoF","sourcesContent":["/**\n * BREP 操作统一导出\n *\n * 目录结构:\n * - brep-ops.ts: 核心 BREP 操作(变换、布尔、钻孔、分割、拉伸)\n * - brep-chain.ts: BREP 链状态管理\n * - brep-utils.ts: 通用工具\n * - brep-topology.ts / primitives-brep.ts / mesh-solid.ts: 拓扑查询、原型、实体化\n * - face-evolution.ts / handle-bridge.ts / effective-deflection.ts: 面演化、句柄桥、偏转\n * - engine/: BREP 引擎注册表与适配器(adapters/ 下 occt、brepkit、brep-mock)\n * - export/: 导出(stl.ts、step.ts、export-model.ts)\n * - svg/: SVG → 实体\n * - text/: 文字 BREP(fontRegistry.ts、text-to-solid.ts)\n */\n\n// 核心 BREP 操作\nexport {\n solidToShape,\n translateBrep, rotateBrep, scaleBrep,\n fuseBrep, cutBrep, commonBrep,\n drillBrep, splitBrep, extrudeBrep,\n loadBrep, matrixToArray,\n type DrillBrepParams, type SplitBrepParams, type SplitBrepResult, type ExtrudeBrepParams,\n} from './brep-ops'\n\n// BREP 链状态管理\nexport {\n type BrepChainState,\n createBrepChainState, initBrepChainState,\n releaseBrepChainState,\n isCadFormat,\n} from './brep-chain'\n\n// 通用工具\nexport { getSolidBoundingBox } from './brep-utils'\n\n// F4 修复:不再反向 re-export executeStatement(ops/dispatcher)。\n// brep/ 不应 re-export ops/ 的符号。宿主从 @faicad/faijs/browser 直接 import executeStatement。\n"]}
|