@faicad/faijs 0.29.5 → 0.31.1
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/align/index.d.ts +64 -0
- package/dist/api/align/index.d.ts.map +1 -0
- package/dist/api/align/index.js +101 -0
- package/dist/api/align/index.js.map +1 -0
- package/dist/api/api-namespace.d.ts +6 -5
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +89 -5
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +0 -2
- package/dist/api/appearance.d.ts.map +1 -1
- package/dist/api/appearance.js +0 -2
- package/dist/api/appearance.js.map +1 -1
- 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-op/index.d.ts +65 -0
- package/dist/api/boolean-op/index.d.ts.map +1 -0
- package/dist/api/boolean-op/index.js +113 -0
- package/dist/api/boolean-op/index.js.map +1 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +22 -33
- 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 +91 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +321 -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 +111 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +300 -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/chamfer.d.ts +5 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -11
- package/dist/api/chamfer.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 +493 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +1 -3
- package/dist/api/draft.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +6 -15
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.d.ts +73 -0
- package/dist/api/export-3mf.d.ts.map +1 -0
- package/dist/api/export-3mf.js +121 -0
- package/dist/api/export-3mf.js.map +1 -0
- package/dist/api/export-brep.d.ts +47 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +67 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-step.d.ts +67 -0
- package/dist/api/export-step.d.ts.map +1 -0
- package/dist/api/export-step.js +98 -0
- package/dist/api/export-step.js.map +1 -0
- package/dist/api/export-stl.d.ts +58 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +114 -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/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +1 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +2 -3
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +5 -7
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +5 -8
- 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 +58 -54
- 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/script-face-manifest.d.ts +1 -1
- package/dist/api/generated/script-face-manifest.js +3 -3
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -1
- package/dist/api/generated/script-face.js +1 -1
- package/dist/api/generated/script-face.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 +8 -4
- 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 +77 -73
- 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 +11 -2
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +20 -4
- package/dist/api/helix.js.map +1 -1
- package/dist/api/index.d.ts +19 -7
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +44 -11
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +10 -36
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +17 -51
- 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/export-members.d.ts +80 -0
- package/dist/api/internal/export-members.d.ts.map +1 -0
- package/dist/api/internal/export-members.js +104 -0
- package/dist/api/internal/export-members.js.map +1 -0
- package/dist/api/internal/l3-bridge.d.ts +22 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +30 -77
- 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/measure-query/index.d.ts +262 -0
- package/dist/api/measure-query/index.d.ts.map +1 -0
- package/dist/api/measure-query/index.js +390 -0
- package/dist/api/measure-query/index.js.map +1 -0
- 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 +0 -2
- package/dist/api/meta.d.ts.map +1 -1
- package/dist/api/meta.js +0 -2
- package/dist/api/meta.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/api/pattern.js +3 -6
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts +6 -6
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +19 -17
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +0 -1
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +0 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +6 -8
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +27 -65
- 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/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +0 -1
- package/dist/api/section-by-plane.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.d.ts.map +1 -1
- package/dist/api/shell.js +12 -3
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +3 -3
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +6 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +0 -1
- package/dist/api/sketch-on-plane.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/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +0 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +37 -44
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +224 -233
- 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 +71 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +13 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.d.ts.map +1 -1
- package/dist/api/thicken.js +12 -3
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +8 -8
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +58 -27
- 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/boolean/index.d.ts +23 -0
- package/dist/boolean/index.d.ts.map +1 -0
- package/dist/boolean/index.js +27 -0
- package/dist/boolean/index.js.map +1 -0
- package/dist/brep/brep-chain.d.ts +1 -19
- package/dist/brep/brep-chain.d.ts.map +1 -1
- package/dist/brep/brep-chain.js +0 -1
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +93 -2
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +185 -15
- 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/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +0 -3
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +4 -98
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +4 -148
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/native-history.d.ts +27 -0
- package/dist/brep/engine/native-history.d.ts.map +1 -0
- package/dist/brep/engine/native-history.js +54 -0
- package/dist/brep/engine/native-history.js.map +1 -0
- 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 +3 -5
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +2 -2
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +35 -77
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +21 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +171 -73
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step.d.ts +17 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +133 -0
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/export/stl.d.ts +22 -1
- package/dist/brep/export/stl.d.ts.map +1 -1
- package/dist/brep/export/stl.js +58 -10
- package/dist/brep/export/stl.js.map +1 -1
- package/dist/brep/export/transform12.d.ts +47 -0
- package/dist/brep/export/transform12.d.ts.map +1 -0
- package/dist/brep/export/transform12.js +87 -0
- package/dist/brep/export/transform12.js.map +1 -0
- package/dist/brep/face-evolution.d.ts +53 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +65 -0
- package/dist/brep/face-evolution.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-host/index.d.ts +4 -1
- package/dist/browser-host/index.d.ts.map +1 -1
- package/dist/browser-host/index.js +7 -1
- package/dist/browser-host/index.js.map +1 -1
- package/dist/browser.d.ts +5 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -26
- 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.d.ts +13 -58
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +34 -83
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/content-key.d.ts +3 -3
- package/dist/cad-runtime/content-key.js +3 -3
- package/dist/cad-runtime/content-key.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 +31 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +54 -19
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +89 -54
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +10 -14
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +5 -22
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +2 -2
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +1 -1
- package/dist/env-agnostic.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 +14 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -70
- 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 +88 -8
- 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 +53 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +53 -0
- package/dist/lang/symbol-table.generated.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 -63
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -72
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +62 -17
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +210 -41
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.js +1 -1
- 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 +52 -5
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +139 -41
- 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 +35 -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 +56 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +47 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node-host/index.d.ts +1 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +4 -0
- package/dist/node-host/index.js.map +1 -1
- 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/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 +31 -4
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +18 -0
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- 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/primitives/index.d.ts +19 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +21 -0
- package/dist/primitives/index.js.map +1 -0
- 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 +79 -29
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +84 -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/sdf/index.d.ts +12 -0
- package/dist/sdf/index.d.ts.map +1 -0
- package/dist/sdf/index.js +13 -0
- package/dist/sdf/index.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +24 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +40 -0
- package/dist/shape.js.map +1 -1
- 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 +3 -3
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +2 -2
- package/dist/weapp.js.map +1 -1
- package/package.json +283 -44
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-model.js","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * exportModel — 统一导出入口(unit-system §10.6 二 / R11 / 裁决 J)\n *\n * 单一真源:坐标单位换算与文件单位声明由**同一次换算**产出(§10.3 规则 3),\n * 声明与坐标必须同源。CLI(writeOutput)与宿主(3d_editor)共用本入口。\n *\n * 格式分派(§10.6 表):\n * - stl:坐标缩放到 unit 刻度,无声明(格式不支持)。\n * - step:预缩放 + 文本层只改写单位实体(§10.3 规则 3a;OCCT 恒写\n * SI_UNIT(.MILLI.,.METRE.),坐标预先缩放到目标刻度后声明必须跟上)。\n * - 3mf:坐标缩放到 unit 刻度 + <model unit> 与坐标同源;yard 不在 3MF\n * 枚举 → 成对回落到 mm(§10.3 规则 2)。\n *\n * 红线(§10.3 3a):绝不文本级改坐标 — 坐标只在几何层缩放,文本层只碰单位实体。\n */\n\nimport { buildStlBufferFromMesh } from './stl'\nimport { writeZipEntries } from '../../io/zip'\nimport { UNIT_SCALE, type UnitName } from '../../units'\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getBrepApi } from '../handle-bridge'\nimport { exportStepFromSolids, type StepExportEntry } from './step'\nimport { detectStepUnit, STEP_UNIT_SCAN_PREFIX } from '../../mesh/io'\nimport type { PbrAppearance } from '../../api/appearance'\nimport type { ShapeMeta, FileMeta } from '../../api/meta'\n\n/** 导出条目:一个 part 的几何来源。精确 BREP 与三角网格二选一,solid 优先。 */\nexport interface ExportEntry {\n /** 精确 BREP 句柄(来自 brep 链,导出 ADVANCED_FACE)。 */\n solid?: BrepHandle\n /** 三角网格(基准单位刻度;调用方只做世界变换烘焙,不做单位缩放)。 */\n mesh?: { positions: Float32Array; indices: Uint32Array }\n /** 实体名(写 STEP PRODUCT 名 / 3MF <object name>)。 */\n name?: string\n /** sRGB 0..1 颜色(STEP 走 XCAF COLOUR_RGB,3MF 走 basematerials)。 */\n color?: readonly [number, number, number]\n /**\n * 逐三角形材质分组(P4,3MF 走多 basematerials + `<triangle pid p1..p3>`):\n * start/count 为**三角形索引**区间,appearance.color 为该组基色。\n */\n materialGroups?: Array<{ start: number; count: number; appearance: PbrAppearance }>\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §6.1):写 3MF\n * `<object name/partnumber>` + `<metadatagroup>`;STEP 走 PRODUCT name(既有)。\n */\n meta?: ShapeMeta\n}\n\n/** Output formats supported by the unified {@link exportModel} entry. */\nexport type ExportFormat = 'stl' | 'step' | '3mf'\n\n/**\n * Options controlling {@link exportModel}/{@link exportModelSync} output\n * (unit-system §10.3): the declared target unit and optional 3MF print config.\n */\nexport interface ExportOptions {\n /**\n * 目标长度单位。缺省 'mm'。语义是「文件里声明的单位」——\n * 实现负责把坐标换算到该单位刻度并与声明成对写出(§10.3)。\n */\n unit?: UnitName\n /** 3MF 打印配置(可选,原样进 model 层)。 */\n printConfig?: unknown\n /** 整体级元数据(设计文档 2026-10-05-meta §6.1):3MF 写 `<model>` 级 `<metadata>`。 */\n fileMeta?: FileMeta\n}\n\n/** UnitName → 3MF <model unit> 枚举全名(唯一真源;yard 无对应值)。 */\nexport const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter'>> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n micron: 'micron',\n inch: 'inch',\n foot: 'foot',\n // yard 无 3MF 枚举值 — 调用方必须先成对回落到 mm(§10.3 规则 2)。\n}\n\n/** 缩放 Float32 positions 到目标单位刻度(基准值 ÷ unitScale(unit))。 */\nfunction scalePositions(positions: Float32Array, scale: number): Float32Array {\n if (scale === 1) return positions\n const out = new Float32Array(positions.length)\n for (let i = 0; i < positions.length; i++) out[i] = positions[i] * scale\n return out\n}\n\n/** STEP 单位声明改写:SI_UNIT(.MILLI.,.METRE.) → 目标单位实体(只碰单位实体,红线)。 */\nfunction rewriteStepUnitEntities(stepText: string, unit: UnitName): string {\n // mm 是 OCCT 的原生写出形态,无需改写。\n if (unit === 'mm') return stepText\n\n // SI 面积/体积单位实体的前缀同样要跟着换(LENGTH/AREA/VOLUME 挂同一前缀链),\n // 但坐标已缩放 → 只需把 LENGTH 链上的前缀换掉;面积/体积单位在 STEP 里由\n // SI_UNIT 前缀 + 幂次表达,XCAF 写出的实体形态是 SI_UNIT(.MILLI.,.METRE.)\n // 挂在长度、平方与立方三条依赖链上。为保守起见只改写显式 LENGTH_UNIT 链上的\n // SI_UNIT —— 具体做法:全局替换 SI_UNIT 前缀(同一文件里坐标相关单位恒为\n // 长度链;角度 SI_UNIT(.RADIAN.) 不含 METRE 不会被命中)。\n let out = stepText\n\n if (unit === 'cm' || unit === 'm' || unit === 'micron') {\n const prefix = unit === 'cm' ? '.CENTI.' : unit === 'm' ? '$' : '.MICRO.'\n // OCCT 写出恒为 SI_UNIT(.MILLI.,.METRE.)(实测);$ 前缀形态(无前缀=米)\n // 在 OCCT 输出中不会出现,但容错处理(若上游将来变化)。\n out = out.replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/g,\n prefix === '$' ? 'SI_UNIT($,.METRE.)' : `SI_UNIT(${prefix},.METRE.)`)\n return out\n }\n\n // inch / foot:CONVERSION_BASED_UNIT 形态。需要注入换算因子实体并替换\n // LENGTH_UNIT 依赖。最简形态:把 SI_UNIT(.MILLI.,.METRE.) 替换为\n // CONVERSION_BASED_UNIT('INCH', #factor),并附加 MEASURE_WITH_UNIT 实体。\n // 实体编号:取文件内最大 #n + 1、+2(附加实体挂在文件尾部 DATA 段内合法)。\n const inchFactor = unit === 'inch' ? 25.4 : 304.8\n const name = unit === 'inch' ? 'INCH' : 'FOOT'\n\n // 1) 收集现有最大实体编号\n let maxId = 0\n for (const m of out.matchAll(/#(\\d+)\\s*=/g)) {\n const id = Number(m[1])\n if (id > maxId) maxId = id\n }\n const lenId = maxId + 1\n const convId = maxId + 2\n\n // 2) 找到 LENGTH_UNIT() 里挂 SI_UNIT 的实体行,替换为 CONVERSION_BASED_UNIT\n // 并把 SI_UNIT 挂到 LENGTH_MEASURE 上。OCCT 输出形态(实测):\n // #n=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n const siLine = out.match(/#(\\d+)\\s*=\\s*\\([^)]*SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)[^)]*\\)\\s*;/)\n if (!siLine) {\n throw new Error(`[export/step] no SI_UNIT(.MILLI.,.METRE.) entity found; cannot rewrite declaration to ${name}`)\n }\n\n // 3) 替换原 SI_UNIT 实体为 CONVERSION_BASED_UNIT,插入换算因子与基准米实体:\n // #si=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));\n // → #si=(LENGTH_UNIT()NAMED_UNIT(*)CONVERSION_BASED_UNIT('INCH',#conv));\n // #conv=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#len);\n // #len=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));\n out = out.replace(siLine[0], siLine[0].replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/, `CONVERSION_BASED_UNIT('${name}',#${convId})`))\n // 在 DATA 段结束前(ENDSEC;)插入新实体。\n const insert = [\n `#${convId}=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(${inchFactor}),#${lenId});`,\n `#${lenId}=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));`,\n ].join('\\n')\n out = out.replace(/ENDSEC\\s*;/, `${insert}\\nENDSEC;`)\n return out\n}\n\n/**\n * STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。\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, author|designer→author 列表,\n * organization→organization, application→preprocessor, description→description。\n * 无对应的字段(copyright/licenseTerms/rating/modificationDate)**不写**(§5.3 头:\n * STEP 无标准位置,不发明)。\n *\n * 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态\n * 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。\n *\n * @param stepText 内核产出的 STEP 全文(ISO-10303-21)。\n * @param fileMeta 目标文件级元数据。\n * @returns 改写后的 STEP 文本。\n */\nexport function rewriteFileMetaHeader(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/** [start, end) 区间替换为 replacement(end 为闭合括号后一位,仍保留其后的 `;`)。 */\nfunction splice(s: string, start: number, end: number, replacement: string): string {\n return s.slice(0, start) + replacement + s.slice(end)\n}\n\n/** FileMeta 是否含可映射到 STEP header 的字段(避免对无 header 字段的 fileMeta 做无谓解码重写)。 */\nfunction fileMetaHasHeaderFields(f: FileMeta): boolean {\n return !!(f.title || f.description || f.designer || f.author || f.organization || f.application\n || f.creationDate || f.modificationDate)\n}\n\n/**\n * 在文本中定位 `NAME(` … 匹配的 `)` (引号忽略、内层括号计入)并返回\n * `{ start, end, inner }`;找不到返回 null。start/end 是 `NAME(` 起始/闭合 `)` 之后\n * 一位的偏移,供调用方做字符串拼接替换(不做正则整行匹配——行内可含 `;` 等字符)。\n */\nfunction 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,原样保留字面量)。 */\nfunction 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/** 单个 P21 字符串字面量的未转义内容(剥离包裹引号与 '' 转义)。 */\nfunction 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/** 单个 P21 字符串字面量(已转义)。 */\nfunction stepStr(v: string): string {\n return `'${v.replace(/'/g, \"''\")}'`\n}\n\n/** P21 列表字面量:(['a','b']) → `('a','b')`。 */\nfunction p21List(items: string[]): string {\n return `(${items.map(stepStr).join(',')})`\n}\n\n/** 3MF写出:最小 ZIP 容器(deflate),落 3D/3dmodel.model + [Content_Types].xml + _rels。 */\nfunction build3mfBuffer(modelXml: string): ArrayBuffer {\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"/></Types>`\n const rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\"/></Relationships>`\n\n const zipped = writeZipEntries({\n '[Content_Types].xml': new TextEncoder().encode(contentTypes),\n '_rels/.rels': new TextEncoder().encode(rels),\n '3D/3dmodel.model': new TextEncoder().encode(modelXml),\n })\n return zipped.buffer.slice(zipped.byteOffset, zipped.byteOffset + zipped.byteLength) as ArrayBuffer\n}\n\n/** 组 3MF <model> XML:单位声明与坐标由同一 scale 变量产出(同源,§10.3 规则 3)。 */\nfunction build3mfModelXml(entries: ExportEntry[], unit: UnitName, scale: number, printConfig?: unknown, fileMeta?: FileMeta): string {\n const unitAttr = UNIT_NAME_TO_3MF[unit]\n if (!unitAttr) {\n // 调用方(exportModel)保证 unit 已成对回落;直接到这里 = 内部错误。\n throw new Error(`[export/3mf] unit ${unit} has no 3MF enum value`)\n }\n const objs: string[] = []\n const mats: string[] = []\n const items: string[] = []\n let nextMatId = entries.length + 1\n entries.forEach((e, i) => {\n if (!e.mesh) return\n const pos = scalePositions(e.mesh.positions, scale)\n const verts: string[] = []\n for (let v = 0; v < pos.length; v += 3) {\n verts.push(`<vertex x=\"${pos[v]}\" y=\"${pos[v + 1]}\" z=\"${pos[v + 2]}\"/>`)\n }\n // P4(3MF Core 逐三角形材质):materialGroups(appearance.color)→ 每组\n // 一个独立 basematerials 资源(id 与对象 id 错开,P3 曾与对象共用 id、\n // 违反 resources 内 id 唯一),分组三角形用 `<triangle pid p1..p3>` 引用。\n const groupPids: number[] = []\n const groups = (e.materialGroups ?? []).filter((g) => g.appearance?.color)\n for (const g of groups) {\n groupPids.push(nextMatId)\n mats.push(\n `<basematerials id=\"${nextMatId}\"><base name=\"${xmlAttr(`${e.name ?? `part${i + 1}`}_g${groupPids.length}`)}\" displaycolor=\"${hexColor(g.appearance.color!)}\"/></basematerials>`,\n )\n nextMatId++\n }\n const tris: string[] = []\n const triCount = e.mesh.indices.length / 3\n let gi = 0\n for (let t = 0; t < triCount; t++) {\n while (gi < groups.length && t >= groups[gi].start + groups[gi].count) gi++\n const inGroup = gi < groups.length && t >= groups[gi].start\n const matAttr = inGroup ? ` pid=\"${groupPids[gi]}\" p1=\"0\" p2=\"0\" p3=\"0\"` : ''\n tris.push(\n `<triangle v1=\"${e.mesh.indices[t * 3]}\" v2=\"${e.mesh.indices[t * 3 + 1]}\" v3=\"${e.mesh.indices[t * 3 + 2]}\"${matAttr}/>`,\n )\n }\n // P3(v2 §8 3MF 行,Core 规范):basematerials 必须声明在 <resources>,\n // object 用 pid/pindex 引用——此前内联在 <object> 内的写法解析器(\n // parseThreemf 只读 resources)不识别,导入→导出→导入颜色丢失。\n if (e.color) {\n mats.push(`<basematerials id=\"${i + 1}\"><base name=\"${xmlAttr(e.name ?? 'p' + i)}\" displaycolor=\"${hexColor(e.color)}\"/></basematerials>`)\n }\n // 零件级元数据(设计文档 2026-10-05-meta §6.1):partnumber 属性 +\n // `<metadatagroup><metadata>`(3MF 自定义标签须带命名空间前缀;faijs\n // 无前缀键一律补 `faijs:` 前缀,跨工具链兼容)。description 3MF 无对象级\n // 标准位 → 写 `faijs:description`(规范允许 vendor 前缀名)。\n const partnumberAttr = e.meta?.partNumber ? ` partnumber=\"${xmlAttr(e.meta.partNumber)}\"` : ''\n const metadatas: string[] = []\n const meta = e.meta\n if (meta) {\n const metaPairs: Array<[string, string]> = []\n if (meta.description !== undefined && meta.description !== '') metaPairs.push(['faijs:description', meta.description])\n if (meta.metadata) {\n for (const [k, v] of Object.entries(meta.metadata)) {\n metaPairs.push([k.includes(':') ? k : `faijs:${k}`, v])\n }\n }\n // 同键不重复(首见保留)。\n const seen = new Set<string>()\n for (const [k, v] of metaPairs) {\n if (seen.has(k)) continue\n seen.add(k)\n metadatas.push(`<metadata name=\"${xmlAttr(k)}\">${xmlAttr(v)}</metadata>`)\n }\n }\n const metadatagroup = metadatas.length > 0 ? `<metadatagroup>${metadatas.join('')}</metadatagroup>` : ''\n objs.push(`<object id=\"${i + 1}\" type=\"model\" name=\"${xmlAttr(e.name ?? `part${i + 1}`)}\"${partnumberAttr}${e.color ? ` pid=\"${i + 1}\" pindex=\"0\"` : ''}>${metadatagroup}<mesh><vertices>${verts.join('')}</vertices><triangles>${tris.join('')}</triangles></mesh></object>`)\n items.push(`<item objectid=\"${i + 1}\"/>`)\n })\n // 整体级元数据(`<model>` 直接子级 `<metadata>`):well-known 名经映射写标准\n // 3MF 名,vendor 名写 `faijs:` 前缀。排在 `<resources>` 之前(3MF Core)。\n const modelMetas: string[] = []\n if (fileMeta) {\n const wellKnown: Array<[Exclude<keyof FileMeta, 'metadata'>, string]> = [\n ['title', 'Title'],\n ['designer', 'Designer'],\n ['description', 'Description'],\n ['copyright', 'Copyright'],\n ['licenseTerms', 'LicenseTerms'],\n ['rating', 'Rating'],\n ['creationDate', 'CreationDate'],\n ['modificationDate', 'ModificationDate'],\n ['application', 'Application'],\n ]\n for (const [field, name] of wellKnown) {\n if (fileMeta[field] !== undefined) modelMetas.push(`<metadata name=\"${name}\">${xmlAttr(String(fileMeta[field]))}</metadata>`)\n }\n if (fileMeta.metadata) {\n for (const [k, v] of Object.entries(fileMeta.metadata)) {\n modelMetas.push(`<metadata name=\"${xmlAttr(k.includes(':') ? k : `faijs:${k}`)}\">${xmlAttr(v)}</metadata>`)\n }\n }\n }\n const pc = printConfig ? `<metadata name=\"printConfig\">${xmlAttr(String(printConfig))}</metadata>` : ''\n return `<model unit=\"${unitAttr}\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:faijs=\"http://schemas.faicad.dev/3mf/2026/10\">${pc}${modelMetas.join('')}<resources>${mats.join('')}${objs.join('')}</resources><build>${items.join('')}</build></model>`\n}\n\nfunction xmlAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\nfunction hexColor(c: readonly [number, number, number]): string {\n const h = (v: number) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')\n return `#${h(c[0])}${h(c[1])}${h(c[2])}`\n}\n\n/**\n * Synchronous twin of {@link exportModel} for hosts already holding a live\n * kernel (CLI, in-process consumers). Same invariants: declared unit ==\n * written coordinate scale. Only 'stl' / 'step' (3mf is also sync but is\n * routed through the same code path below).\n *\n * @param entries - the shapes to export (BREP solids preferred, mesh fallback).\n * @param format - output format: 'stl' | 'step' | '3mf'.\n * @param opts - optional target unit and 3MF print config.\n * @returns the serialized file bytes (ArrayBuffer).\n */\nexport function exportModelSync(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): ArrayBuffer {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) unit = 'mm'\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n const bufs = entries.filter((e) => e.mesh).map((e) => ({ pos: scalePositions(e.mesh!.positions, scale), idx: e.mesh!.indices }))\n if (bufs.length === 0) throw new Error('[export/stl] no mesh entries')\n if (bufs.length === 1) return buildStlBufferFromMesh(bufs[0]!.pos, bufs[0]!.idx)\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n const kernel = getBrepApi()\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n const buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换 header 声明/元数据(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n const applyTextRewrites = (buf: ArrayBuffer): ArrayBuffer => {\n let text = new TextDecoder().decode(new Uint8Array(buf))\n if (unit !== 'mm') text = rewriteStepUnitEntities(text, unit)\n if (opts?.fileMeta && fileMetaHasHeaderFields(opts.fileMeta)) text = rewriteFileMetaHeader(text, opts.fileMeta)\n return new TextEncoder().encode(text).buffer\n }\n return applyTextRewrites(buffer)\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig, opts?.fileMeta))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 统一导出入口:按 format 分派到各写出器。\n * **内部不变式:写出的坐标刻度 == 文件声明的单位。** 这是本 API 存在的唯一理由。\n * @param entries - 待导出的几何条目(BREP solid 优先,缺则走 mesh)。\n * @param format - 输出格式:'stl' | 'step' | '3mf'。\n * @param opts - 可选的目标单位与 3MF 打印配置。\n * @returns 文件字节\n * @throws 目标单位该格式不支持且无法回落时(不静默降级)\n */\nexport async function exportModel(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): Promise<ArrayBuffer> {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n\n // 3MF 枚举回落(§10.3 规则 2):yard 不在枚举 → 成对回落到 mm(坐标+声明)。\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) {\n unit = 'mm'\n }\n\n // scale = 基准值 → 目标单位刻度(fromBase(1, unit, 'length') 的表实现)。\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n // STL 无声明:坐标按 unit 刻度写出,调用方保证 unit 语义(当前文档单位)。\n const parts: ArrayBuffer[] = []\n for (const e of entries) {\n if (!e.mesh) continue // STL 只吃 mesh;solid 条目由宿主先三角化\n parts.push(buildStlBufferFromMesh(scalePositions(e.mesh.positions, scale), e.mesh.indices))\n }\n if (parts.length === 0) throw new Error('[export/stl] no mesh entries')\n if (parts.length === 1) return parts[0]!\n // 多 mesh:合并顶点后再写(binary STL 无对象概念,多实体合一个 soup)。\n const bufs = entries.filter((e) => e.mesh).map((e) => {\n const pos = scalePositions(e.mesh!.positions, scale)\n return { pos, idx: e.mesh!.indices }\n })\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n // 同一 scale 变量喂两类条目(§10.3 规则 7,修 E4):mesh 缩放 positions,\n // solid 用 owned copy 做 kernel.scale —— 不释放调用方缓存里的原句柄。\n // 先过门禁再取内核(同同步分支:拒绝理由与引擎装配状态无关)。\n const kernel = (await import('../handle-bridge')).getBrepApi() as BrepEngineApi\n const ownedHandles: BrepHandle[] = []\n const stepEntries: StepExportEntry[] = entries.map((e) => {\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...(e.name ? { name: e.name } : {}), ...(e.color ? { color: [...e.color] as [number, number, number] } : {}) }\n }\n return {\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n })\n const buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换 header 声明/元数据(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n let text = new TextDecoder().decode(new Uint8Array(buffer))\n if (unit !== 'mm') text = rewriteStepUnitEntities(text, unit)\n if (opts?.fileMeta && fileMetaHasHeaderFields(opts.fileMeta)) text = rewriteFileMetaHeader(text, opts.fileMeta)\n return new TextEncoder().encode(text).buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig, opts?.fileMeta))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 导出后回读声明单位(自检与验收用;与 detectStepUnit 互为对偶)。\n * @param data - the exported file bytes (ArrayBuffer or decoded Uint8Array).\n * @param format - the format the bytes were produced in.\n * @returns the declared unit, or null when the format cannot declare one (STL)\n * or the declaration cannot be parsed.\n */\nexport function readDeclaredUnit(data: ArrayBuffer | Uint8Array, format: ExportFormat): UnitName | null {\n if (format === 'stl') return null\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n const text = new TextDecoder().decode(bytes).slice(0, STEP_UNIT_SCAN_PREFIX)\n\n if (format === '3mf') {\n const m = text.match(/<model[^>]*\\sunit=\"([^\"]+)\"/)\n if (!m) return null\n for (const [name, val] of Object.entries(UNIT_NAME_TO_3MF)) {\n if (val === m[1]) return name as UnitName\n }\n return null\n }\n\n // step\n return detectStepUnit(text)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"export-model.js","sourceRoot":"","sources":["../../../src/brep/export/export-model.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * exportModel — 统一导出入口(unit-system §10.6 二 / R11 / 裁决 J)\n *\n * 单一真源:坐标单位换算与文件单位声明由**同一次换算**产出(§10.3 规则 3),\n * 声明与坐标必须同源。CLI(writeOutput)与宿主(3d_editor)共用本入口。\n *\n * 格式分派(§10.6 表):\n * - stl:坐标缩放到 unit 刻度,无声明(格式不支持)。\n * - step:预缩放 + 文本层只改写单位实体(§10.3 规则 3a;OCCT 恒写\n * SI_UNIT(.MILLI.,.METRE.),坐标预先缩放到目标刻度后声明必须跟上)。\n * - 3mf:坐标缩放到 unit 刻度 + <model unit> 与坐标同源;yard 不在 3MF\n * 枚举 → 成对回落到 mm(§10.3 规则 2)。\n *\n * 红线(§10.3 3a):绝不文本级改坐标 — 坐标只在几何层缩放,文本层只碰单位实体。\n */\n\nimport { buildStlBufferFromMesh, composeMatrix12, bakeMatrix12ToPositions } from './stl'\nimport { writeZipEntries } from '../../io/zip'\nimport { UNIT_SCALE, type UnitName } from '../../units'\nimport type { Vec3 } from '../../mesh/types'\nimport type { BrepHandle } from '../engine/types'\nimport type { BrepEngineApi } from '../engine/primitives'\nimport { getBrepApi } from '../handle-bridge'\nimport { getBackends, BrepUnsupportedError } from '../../runtime-state'\nimport { exportStepFromSolids, type StepExportEntry } from './step'\nimport { detectStepUnit, STEP_UNIT_SCAN_PREFIX } from '../../mesh/io'\nimport type { PbrAppearance } from '../../api/appearance'\nimport type { ShapeMeta, FileMeta } from '../../api/meta'\n\n/** 导出条目:一个 part 的几何来源。精确 BREP 与三角网格二选一,solid 优先。 */\nexport interface ExportEntry {\n /** 精确 BREP 句柄(来自 brep 链,导出 ADVANCED_FACE)。 */\n solid?: BrepHandle\n /** 三角网格(基准单位刻度;调用方只做世界变换烘焙,不做单位缩放)。 */\n mesh?: { positions: Float32Array; indices: Uint32Array }\n /** 实体名(写 STEP PRODUCT 名 / 3MF <object name>)。 */\n name?: string\n /** sRGB 0..1 颜色(STEP 走 XCAF COLOUR_RGB,3MF 走 basematerials)。 */\n color?: readonly [number, number, number]\n /**\n * 逐三角形材质分组(P4,3MF 走多 basematerials + `<triangle pid p1..p3>`):\n * start/count 为**三角形索引**区间,appearance.color 为该组基色。\n */\n materialGroups?: Array<{ start: number; count: number; appearance: PbrAppearance }>\n /**\n * 零件级说明性元数据(设计文档 2026-10-05-meta §6.1):写 3MF\n * `<object name/partnumber>` + `<metadatagroup>`;STEP 走 PRODUCT name(既有)。\n */\n meta?: ShapeMeta\n /**\n * 装配子节点(方案 2026-10-08 §2.1 / 第 4 步):存在时本条目是装配容器,写出器据此\n * 生成 3MF `<components>`(每个 child 一个 `<component objectid>`,子节点的 `transform`\n * 写进 `<component transform>`);STL / STEP 分支忽略此字段或将其展平(逐层烘焙 /\n * 逐实体通道,第 5、7 步)。\n */\n children?: ExportEntry[]\n /**\n * 本节点相对父的位姿(与 `Shape.transform` 同形态,方案 §2.1)。写出器消费:3MF 写\n * `<component transform>`、STEP 写 XCAF location(第 7 步)、STL 顶点烘焙(第 5 步)。\n */\n transform?: { translate?: Vec3; rotate?: { angle: number; axis?: Vec3 }; matrix?: number[] }\n}\n\n/** Output formats supported by the unified {@link exportModel} entry. */\nexport type ExportFormat = 'stl' | 'step' | '3mf'\n\n/**\n * Options controlling {@link exportModel}/{@link exportModelSync} output\n * (unit-system §10.3): the declared target unit and optional 3MF print config.\n */\nexport interface ExportOptions {\n /**\n * 目标长度单位。缺省 'mm'。语义是「文件里声明的单位」——\n * 实现负责把坐标换算到该单位刻度并与声明成对写出(§10.3)。\n */\n unit?: UnitName\n /** 3MF 打印配置(可选,原样进 model 层)。 */\n printConfig?: unknown\n /** 整体级元数据(设计文档 2026-10-05-meta §6.1):3MF 写 `<model>` 级 `<metadata>`。 */\n fileMeta?: FileMeta\n}\n\n/** UnitName → 3MF <model unit> 枚举全名(唯一真源;yard 无对应值)。 */\nexport const UNIT_NAME_TO_3MF: Partial<Record<UnitName, 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter'>> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n micron: 'micron',\n inch: 'inch',\n foot: 'foot',\n // yard 无 3MF 枚举值 — 调用方必须先成对回落到 mm(§10.3 规则 2)。\n}\n\n/** 缩放 Float32 positions 到目标单位刻度(基准值 ÷ unitScale(unit))。 */\nfunction scalePositions(positions: Float32Array, scale: number): Float32Array {\n if (scale === 1) return positions\n const out = new Float32Array(positions.length)\n for (let i = 0; i < positions.length; i++) out[i] = positions[i] * scale\n return out\n}\n\n/** STEP 单位声明改写:SI_UNIT(.MILLI.,.METRE.) → 目标单位实体(只碰单位实体,红线)。 */\nfunction rewriteStepUnitEntities(stepText: string, unit: UnitName): string {\n // mm 是 OCCT 的原生写出形态,无需改写。\n if (unit === 'mm') return stepText\n\n // SI 面积/体积单位实体的前缀同样要跟着换(LENGTH/AREA/VOLUME 挂同一前缀链),\n // 但坐标已缩放 → 只需把 LENGTH 链上的前缀换掉;面积/体积单位在 STEP 里由\n // SI_UNIT 前缀 + 幂次表达,XCAF 写出的实体形态是 SI_UNIT(.MILLI.,.METRE.)\n // 挂在长度、平方与立方三条依赖链上。为保守起见只改写显式 LENGTH_UNIT 链上的\n // SI_UNIT —— 具体做法:全局替换 SI_UNIT 前缀(同一文件里坐标相关单位恒为\n // 长度链;角度 SI_UNIT(.RADIAN.) 不含 METRE 不会被命中)。\n let out = stepText\n\n if (unit === 'cm' || unit === 'm' || unit === 'micron') {\n const prefix = unit === 'cm' ? '.CENTI.' : unit === 'm' ? '$' : '.MICRO.'\n // OCCT 写出恒为 SI_UNIT(.MILLI.,.METRE.)(实测);$ 前缀形态(无前缀=米)\n // 在 OCCT 输出中不会出现,但容错处理(若上游将来变化)。\n out = out.replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/g,\n prefix === '$' ? 'SI_UNIT($,.METRE.)' : `SI_UNIT(${prefix},.METRE.)`)\n return out\n }\n\n // inch / foot:CONVERSION_BASED_UNIT 形态。需要注入换算因子实体并替换\n // LENGTH_UNIT 依赖。最简形态:把 SI_UNIT(.MILLI.,.METRE.) 替换为\n // CONVERSION_BASED_UNIT('INCH', #factor),并附加 MEASURE_WITH_UNIT 实体。\n // 实体编号:取文件内最大 #n + 1、+2(附加实体挂在文件尾部 DATA 段内合法)。\n const inchFactor = unit === 'inch' ? 25.4 : 304.8\n const name = unit === 'inch' ? 'INCH' : 'FOOT'\n\n // 1) 收集现有最大实体编号\n let maxId = 0\n for (const m of out.matchAll(/#(\\d+)\\s*=/g)) {\n const id = Number(m[1])\n if (id > maxId) maxId = id\n }\n const lenId = maxId + 1\n const convId = maxId + 2\n\n // 2) 存在性守卫:必须至少有一条 LENGTH_UNIT 挂 SI_UNIT(.MILLI.,.METRE.),否则\n // 没有可改写的声明(凭空插入单位声明 = 伪造文件单位)。\n // OCCT 实测形态(实体括号内还有 LENGTH_UNIT() / NAMED_UNIT(*) 的括号,且\n // `=`、`)` 前后都有空格):\n // #346 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );\n // 故实体体的字符类用 [^;](STEP 实体行内不含分号)而不是 [^)]——后者跨不过\n // `LENGTH_UNIT()` 与 `NAMED_UNIT(*)` 自带的括号,整段永远匹配不上。\n const siDecl = out.match(/#(\\d+)\\s*=\\s*\\([^;]*?SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)[^;]*?\\)\\s*;/)\n if (!siDecl) {\n throw new Error(`[export/step] no SI_UNIT(.MILLI.,.METRE.) entity found; cannot rewrite declaration to ${name}`)\n }\n\n // 3) 把**全部** SI_UNIT(.MILLI.,.METRE.) 换成 CONVERSION_BASED_UNIT(各 context\n // 共享同一份换算因子实体),插入换算因子与基准米实体:\n // #si=( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );\n // → #si=( LENGTH_UNIT() NAMED_UNIT(*) CONVERSION_BASED_UNIT('INCH',#conv) );\n // #conv=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(25.4),#len);\n // #len=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));\n // 全局替换而不是只改第一条:多零件导出会写出多条 LENGTH_UNIT 声明(每个 part 一个\n // context,实测 2 个 part → #346 与 #690),只改第一条会让同一文件里并存两种长度\n // 单位声明——而坐标是按同一 scale 换算过的。\n out = out.replace(/SI_UNIT\\s*\\(\\s*\\.MILLI\\.\\s*,\\s*\\.METRE\\.\\s*\\)/g, `CONVERSION_BASED_UNIT('${name}',#${convId})`)\n // 在 DATA 段结束前(ENDSEC;)插入新实体。\n const insert = [\n `#${convId}=LENGTH_MEASURE_WITH_UNIT(LENGTH_MEASURE(${inchFactor}),#${lenId});`,\n `#${lenId}=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT($,.METRE.));`,\n ].join('\\n')\n out = out.replace(/ENDSEC\\s*;/, `${insert}\\nENDSEC;`)\n return out\n}\n\n/**\n * STEP 文件级元数据 → P21 header 重写(`FILE_NAME`/`FILE_DESCRIPTION`)。\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, author|designer→author 列表,\n * organization→organization, application→preprocessor, description→description。\n * 无对应的字段(copyright/licenseTerms/rating/modificationDate)**不写**(§5.3 头:\n * STEP 无标准位置,不发明)。\n *\n * 宽容失败:找不到 FILE_NAME/FILE_DESCRIPTION 行则留空(P21 头由内核写出,形态\n * 已知为 `FILE_DESCRIPTION(('Open CASCADE Model'),'2;1');` 一行,但在字符串内)。\n *\n * @param stepText 内核产出的 STEP 全文(ISO-10303-21)。\n * @param fileMeta 目标文件级元数据。\n * @returns 改写后的 STEP 文本。\n */\nexport function rewriteFileMetaHeader(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/** [start, end) 区间替换为 replacement(end 为闭合括号后一位,仍保留其后的 `;`)。 */\nfunction splice(s: string, start: number, end: number, replacement: string): string {\n return s.slice(0, start) + replacement + s.slice(end)\n}\n\n/** FileMeta 是否含可映射到 STEP header 的字段(避免对无 header 字段的 fileMeta 做无谓解码重写)。 */\nfunction fileMetaHasHeaderFields(f: FileMeta): boolean {\n return !!(f.title || f.description || f.designer || f.author || f.organization || f.application\n || f.creationDate || f.modificationDate)\n}\n\n/**\n * 在文本中定位 `NAME(` … 匹配的 `)` (引号忽略、内层括号计入)并返回\n * `{ start, end, inner }`;找不到返回 null。start/end 是 `NAME(` 起始/闭合 `)` 之后\n * 一位的偏移,供调用方做字符串拼接替换(不做正则整行匹配——行内可含 `;` 等字符)。\n */\nfunction 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,原样保留字面量)。 */\nfunction 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/** 单个 P21 字符串字面量的未转义内容(剥离包裹引号与 '' 转义)。 */\nfunction 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/** 单个 P21 字符串字面量(已转义)。 */\nfunction stepStr(v: string): string {\n return `'${v.replace(/'/g, \"''\")}'`\n}\n\n/** P21 列表字面量:(['a','b']) → `('a','b')`。 */\nfunction p21List(items: string[]): string {\n return `(${items.map(stepStr).join(',')})`\n}\n\n/** 3MF写出:最小 ZIP 容器(deflate),落 3D/3dmodel.model + [Content_Types].xml + _rels。 */\nfunction build3mfBuffer(modelXml: string): ArrayBuffer {\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"/></Types>`\n const rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\"/></Relationships>`\n\n const zipped = writeZipEntries({\n '[Content_Types].xml': new TextEncoder().encode(contentTypes),\n '_rels/.rels': new TextEncoder().encode(rels),\n '3D/3dmodel.model': new TextEncoder().encode(modelXml),\n })\n return zipped.buffer.slice(zipped.byteOffset, zipped.byteOffset + zipped.byteLength) as ArrayBuffer\n}\n\n/** 组 3MF <model> XML:单位声明与坐标由同一 scale 变量产出(同源,§10.3 规则 3)。 */\nfunction build3mfModelXml(entries: ExportEntry[], unit: UnitName, scale: number, printConfig?: unknown, fileMeta?: FileMeta): string {\n const unitAttr = UNIT_NAME_TO_3MF[unit]\n if (!unitAttr) {\n // 调用方(exportModel)保证 unit 已成对回落;直接到这里 = 内部错误。\n throw new Error(`[export/3mf] unit ${unit} has no 3MF enum value`)\n }\n const objs: string[] = []\n const mats: string[] = []\n const items: string[] = []\n let nextObjId = 1\n // 逐三角形材质分组的 basematerials id 从「顶层条目数 + 1」起,与 object id(1..N)\n // 错开(P3:resources 内 id 唯一)。对象级颜色 basematerials 复用其 object id。\n let nextMatId = entries.length + 1\n\n // 递归发射一个节点为 <object>(叶带 mesh、容器带 <components>),返回其 object id。\n function emitObject(e: ExportEntry): number | undefined {\n // P8 契约(库面):无 mesh 且无子节点的条目 → 静默跳过(不发射 <object>/<item>),\n // 与 op 层「无三角载荷即 E_EXPORT_3MF_EMPTY 显式报错」形成双值防护。显式容器\n // (children 已声明,即便为空 [])仍发射,以便装配层级(含空装配)可写。\n const isContainer = e.children !== undefined\n if (!e.mesh && !isContainer) return undefined\n const id = nextObjId++\n let meshXml = ''\n if (e.mesh) {\n const pos = scalePositions(e.mesh.positions, scale)\n const verts: string[] = []\n for (let v = 0; v < pos.length; v += 3) {\n verts.push(`<vertex x=\"${pos[v]}\" y=\"${pos[v + 1]}\" z=\"${pos[v + 2]}\"/>`)\n }\n // P4(3MF Core 逐三角形材质):materialGroups(appearance.color)→ 每组\n // 一个独立 basematerials 资源(id 与对象 id 错开,P3 曾与对象共用 id、\n // 违反 resources 内 id 唯一),分组三角形用 `<triangle pid p1..p3>` 引用。\n const groupPids: number[] = []\n const groups = (e.materialGroups ?? []).filter((g) => g.appearance?.color)\n for (const g of groups) {\n groupPids.push(nextMatId)\n mats.push(\n `<basematerials id=\"${nextMatId}\"><base name=\"${xmlAttr(`${e.name ?? `part${id}`}_g${groupPids.length}`)}\" displaycolor=\"${hexColor(g.appearance.color!)}\"/></basematerials>`,\n )\n nextMatId++\n }\n const tris: string[] = []\n const triCount = e.mesh.indices.length / 3\n let gi = 0\n for (let t = 0; t < triCount; t++) {\n while (gi < groups.length && t >= groups[gi].start + groups[gi].count) gi++\n const inGroup = gi < groups.length && t >= groups[gi].start\n const matAttr = inGroup ? ` pid=\"${groupPids[gi]}\" p1=\"0\" p2=\"0\" p3=\"0\"` : ''\n tris.push(\n `<triangle v1=\"${e.mesh.indices[t * 3]}\" v2=\"${e.mesh.indices[t * 3 + 1]}\" v3=\"${e.mesh.indices[t * 3 + 2]}\"${matAttr}/>`,\n )\n }\n meshXml = `<mesh><vertices>${verts.join('')}</vertices><triangles>${tris.join('')}</triangles></mesh>`\n }\n // 对象级颜色 basematerials:复用 object id(既有契约,解析器按 id 取首个资源)。\n let pidAttr = ''\n if (e.color) {\n mats.push(`<basematerials id=\"${id}\"><base name=\"${xmlAttr(e.name ?? 'p' + id)}\" displaycolor=\"${hexColor(e.color)}\"/></basematerials>`)\n pidAttr = ` pid=\"${id}\" pindex=\"0\"`\n }\n // 装配层级 → <components>(子节点递归;<component transform> 写相对父位姿)。\n let compXml = ''\n if (e.children && e.children.length > 0) {\n const comps = e.children.map((child) => {\n const cid = emitObject(child)\n if (cid === undefined) return ''\n const tf = child.transform ? ` transform=\"${matrix12ToAttr(transformToMatrix12(child.transform))}\"` : ''\n return `<component objectid=\"${cid}\"${tf}/>`\n }).filter((s) => s !== '')\n compXml = comps.length > 0 ? `<components>${comps.join('')}</components>` : ''\n }\n // 零件级元数据(设计文档 2026-10-05-meta §6.1):partnumber 属性 +\n // `<metadatagroup><metadata>`(3MF 自定义标签须带命名空间前缀;faijs\n // 无前缀键一律补 `faijs:` 前缀,跨工具链兼容)。description 3MF 无对象级\n // 标准位 → 写 `faijs:description`(规范允许 vendor 前缀名)。\n const partnumberAttr = e.meta?.partNumber ? ` partnumber=\"${xmlAttr(e.meta.partNumber)}\"` : ''\n const metadatas: string[] = []\n const meta = e.meta\n if (meta) {\n const metaPairs: Array<[string, string]> = []\n if (meta.description !== undefined && meta.description !== '') metaPairs.push(['faijs:description', meta.description])\n if (meta.metadata) {\n for (const [k, v] of Object.entries(meta.metadata)) {\n metaPairs.push([k.includes(':') ? k : `faijs:${k}`, v])\n }\n }\n // 同键不重复(首见保留)。\n const seen = new Set<string>()\n for (const [k, v] of metaPairs) {\n if (seen.has(k)) continue\n seen.add(k)\n metadatas.push(`<metadata name=\"${xmlAttr(k)}\">${xmlAttr(v)}</metadata>`)\n }\n }\n const metadatagroup = metadatas.length > 0 ? `<metadatagroup>${metadatas.join('')}</metadatagroup>` : ''\n const nameAttr = xmlAttr(e.name ?? `part${id}`)\n objs.push(`<object id=\"${id}\" type=\"model\" name=\"${nameAttr}\"${partnumberAttr}${pidAttr}>${metadatagroup}${meshXml}${compXml}</object>`)\n return id\n }\n\n for (const e of entries) {\n const id = emitObject(e)\n if (id === undefined) continue\n const tf = e.transform ? ` transform=\"${matrix12ToAttr(transformToMatrix12(e.transform))}\"` : ''\n items.push(`<item objectid=\"${id}\"${tf}/>`)\n }\n // 整体级元数据(`<model>` 直接子级 `<metadata>`):well-known 名经映射写标准\n // 3MF 名,vendor 名写 `faijs:` 前缀。排在 `<resources>` 之前(3MF Core)。\n const modelMetas: string[] = []\n if (fileMeta) {\n const wellKnown: Array<[Exclude<keyof FileMeta, 'metadata'>, string]> = [\n ['title', 'Title'],\n ['designer', 'Designer'],\n ['description', 'Description'],\n ['copyright', 'Copyright'],\n ['licenseTerms', 'LicenseTerms'],\n ['rating', 'Rating'],\n ['creationDate', 'CreationDate'],\n ['modificationDate', 'ModificationDate'],\n ['application', 'Application'],\n ]\n for (const [field, name] of wellKnown) {\n if (fileMeta[field] !== undefined) modelMetas.push(`<metadata name=\"${name}\">${xmlAttr(String(fileMeta[field]))}</metadata>`)\n }\n if (fileMeta.metadata) {\n for (const [k, v] of Object.entries(fileMeta.metadata)) {\n modelMetas.push(`<metadata name=\"${xmlAttr(k.includes(':') ? k : `faijs:${k}`)}\">${xmlAttr(v)}</metadata>`)\n }\n }\n }\n const pc = printConfig ? `<metadata name=\"printConfig\">${xmlAttr(String(printConfig))}</metadata>` : ''\n return `<model unit=\"${unitAttr}\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:faijs=\"http://schemas.faicad.dev/3mf/2026/10\">${pc}${modelMetas.join('')}<resources>${mats.join('')}${objs.join('')}</resources><build>${items.join('')}</build></model>`\n}\n\nfunction xmlAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\nfunction hexColor(c: readonly [number, number, number]): string {\n const h = (v: number) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, '0')\n return `#${h(c[0])}${h(c[1])}${h(c[2])}`\n}\n\nexport { transformToMatrix12 } from './transform12'\nimport { scaleTransform, transformToMatrix12 } from './transform12'\n\n/**\n * ExportEntry → StepExportEntry 的递归映射器(step 分支同步/异步共用,单一真源)。\n * 容器只传名/色与子节点(compound 几何 == 成员并集,写出会重复);位姿平移按\n * 单位刻度换算,与几何缩放同一 scale 因子(「声明单位 == 坐标刻度」对组件位姿\n * 同样成立)。solid 经 kernel.scale 的 owned copy 缩放,入 ownedHandles 由调用方\n * 统一释放。\n */\nfunction makeStepEntryMapper(\n kernel: BrepEngineApi,\n scale: number,\n ownedHandles: BrepHandle[],\n): (e: ExportEntry) => StepExportEntry {\n const toStepEntry = (e: ExportEntry): StepExportEntry => {\n const head = {\n ...(e.name ? { name: e.name } : {}),\n ...(e.color ? { color: [...e.color] as [number, number, number] } : {}),\n }\n const transform = e.transform ? scaleTransform(e.transform, scale) : undefined\n if (e.children && e.children.length > 0) {\n return {\n ...head,\n ...(transform ? { transform } : {}),\n children: e.children.map(toStepEntry),\n }\n }\n if (e.solid) {\n if (scale === 1) return { solid: e.solid, ...head }\n const scaled = kernel.scale(e.solid, { x: 0, y: 0, z: 0 }, scale)\n ownedHandles.push(scaled)\n return { solid: scaled, ...head }\n }\n return {\n ...head,\n ...(e.mesh ? { mesh: { positions: scalePositions(e.mesh.positions, scale), indices: e.mesh.indices } } : {}),\n }\n }\n return toStepEntry\n}\n\nfunction fmtNum(v: number): string {\n if (Number.isInteger(v)) return String(v)\n return String(Math.round(v * 1e6) / 1e6)\n}\n\nfunction matrix12ToAttr(m: number[]): string {\n return m.map(fmtNum).join(' ')\n}\n\n/**\n * Synchronous twin of {@link exportModel} for hosts already holding a live\n * kernel (CLI, in-process consumers). Same invariants: declared unit ==\n * written coordinate scale. Only 'stl' / 'step' (3mf is also sync but is\n * routed through the same code path below).\n *\n * @param entries - the shapes to export (BREP solids preferred, mesh fallback).\n * @param format - output format: 'stl' | 'step' | '3mf'.\n * @param opts - optional target unit and 3MF print config.\n * @returns the serialized file bytes (ArrayBuffer).\n */\nexport function exportModelSync(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): ArrayBuffer {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) unit = 'mm'\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n // 步骤 5(方案 §2.1 / §4.3 L1-5):装配展平 + 顶点烘焙。递归把 children 拍平成叶,\n // 每个叶的世界变换 = 父世界变换 ∘ 本节点局部 transform(row-major 3×4,平移在末列)。\n // 先在世界空间烘焙 transform,再按单位换算缩放坐标(缩放同时作用于平移分量,坐标与声明成对)。\n const flatten = (\n list: ExportEntry[],\n accTf: number[] | null,\n ): Array<{ pos: Float32Array; idx: Uint32Array }> => {\n const out: Array<{ pos: Float32Array; idx: Uint32Array }> = []\n for (const e of list) {\n const tf = e.transform ? transformToMatrix12(e.transform) : null\n const world = tf && accTf ? composeMatrix12(accTf, tf) : tf ?? accTf ?? null\n if (e.children && e.children.length > 0) {\n out.push(...flatten(e.children, world))\n continue\n }\n if (!e.mesh) continue\n let pos = e.mesh.positions\n if (world) pos = bakeMatrix12ToPositions(pos, world)\n pos = scalePositions(pos, scale)\n out.push({ pos, idx: e.mesh.indices })\n }\n return out\n }\n const bufs = flatten(entries, null)\n if (bufs.length === 0) throw new Error('[export/stl] no mesh entries')\n if (bufs.length === 1) return buildStlBufferFromMesh(bufs[0]!.pos, bufs[0]!.idx)\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n // 步骤 6(方案 §2.3 / P1):STEP 装配层级走 XCAF,仅 occt 具备;非 occt 引擎在\n // 触碰任何句柄之前报 E_BREP_UNSUPPORTED(带当前引擎名),不落入 getBrepApi 的\n // 未初始化异常,也不把 brepkit 句柄交给 occt 内核(句柄不得跨引擎传递)。\n const engineId = getBackends().config.brepEngineId\n if (engineId !== 'occt') {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: op 'exportModel:step' requires engine occt (current=${engineId ?? '<none>'})`,\n )\n }\n const kernel = getBrepApi()\n const ownedHandles: BrepHandle[] = []\n // 层级映射(步骤 7 / P3):ExportEntry 树 → StepExportEntry 树(映射器见\n // makeStepEntryMapper——同步/异步分支共用,单一真源)。\n const stepEntries: StepExportEntry[] = entries.map(makeStepEntryMapper(kernel, scale, ownedHandles))\n const buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换 header 声明/元数据(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n const applyTextRewrites = (buf: ArrayBuffer): ArrayBuffer => {\n let text = new TextDecoder().decode(new Uint8Array(buf))\n if (unit !== 'mm') text = rewriteStepUnitEntities(text, unit)\n if (opts?.fileMeta && fileMetaHasHeaderFields(opts.fileMeta)) text = rewriteFileMetaHeader(text, opts.fileMeta)\n return new TextEncoder().encode(text).buffer\n }\n return applyTextRewrites(buffer)\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig, opts?.fileMeta))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 统一导出入口:按 format 分派到各写出器。\n * **内部不变式:写出的坐标刻度 == 文件声明的单位。** 这是本 API 存在的唯一理由。\n * @param entries - 待导出的几何条目(BREP solid 优先,缺则走 mesh)。\n * @param format - 输出格式:'stl' | 'step' | '3mf'。\n * @param opts - 可选的目标单位与 3MF 打印配置。\n * @returns 文件字节\n * @throws 目标单位该格式不支持且无法回落时(不静默降级)\n */\nexport async function exportModel(\n entries: ExportEntry[],\n format: ExportFormat,\n opts?: ExportOptions,\n): Promise<ArrayBuffer> {\n if (entries.length === 0) throw new Error('[export] no exportable entries')\n\n let unit = opts?.unit ?? 'mm'\n\n // 3MF 枚举回落(§10.3 规则 2):yard 不在枚举 → 成对回落到 mm(坐标+声明)。\n if (format === '3mf' && !UNIT_NAME_TO_3MF[unit]) {\n unit = 'mm'\n }\n\n // scale = 基准值 → 目标单位刻度(fromBase(1, unit, 'length') 的表实现)。\n const scale = 1 / UNIT_SCALE[unit]\n\n if (format === 'stl') {\n // STL 无声明:坐标按 unit 刻度写出,调用方保证 unit 语义(当前文档单位)。\n const parts: ArrayBuffer[] = []\n for (const e of entries) {\n if (!e.mesh) continue // STL 只吃 mesh;solid 条目由宿主先三角化\n parts.push(buildStlBufferFromMesh(scalePositions(e.mesh.positions, scale), e.mesh.indices))\n }\n if (parts.length === 0) throw new Error('[export/stl] no mesh entries')\n if (parts.length === 1) return parts[0]!\n // 多 mesh:合并顶点后再写(binary STL 无对象概念,多实体合一个 soup)。\n const bufs = entries.filter((e) => e.mesh).map((e) => {\n const pos = scalePositions(e.mesh!.positions, scale)\n return { pos, idx: e.mesh!.indices }\n })\n const totalTris = bufs.reduce((n, b) => n + b.idx.length / 3, 0)\n const mergedPos = new Float32Array(bufs.reduce((n, b) => n + b.pos.length, 0))\n const mergedIdx = new Uint32Array(totalTris * 3)\n let po = 0\n let io2 = 0\n let base = 0\n for (const b of bufs) {\n mergedPos.set(b.pos, po)\n for (let i = 0; i < b.idx.length; i++) mergedIdx[io2++] = b.idx[i] + base\n base += b.pos.length / 3\n po += b.pos.length\n }\n return buildStlBufferFromMesh(mergedPos, mergedIdx)\n }\n\n if (format === 'step') {\n // 步骤 6(方案 §2.3 / P1):同同步分支,取内核前先断言 occt 引擎身份。\n const engineId = getBackends().config.brepEngineId\n if (engineId !== 'occt') {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: op 'exportModel:step' requires engine occt (current=${engineId ?? '<none>'})`,\n )\n }\n // 同一 scale 变量喂两类条目(§10.3 规则 7,修 E4):mesh 缩放 positions,\n // solid 用 owned copy 做 kernel.scale —— 不释放调用方缓存里的原句柄。\n // 先过门禁再取内核(同同步分支:拒绝理由与引擎装配状态无关)。\n const kernel = (await import('../handle-bridge')).getBrepApi() as BrepEngineApi\n const ownedHandles: BrepHandle[] = []\n // 同步分支同一映射器(单一真源)。\n const stepEntries: StepExportEntry[] = entries.map(makeStepEntryMapper(kernel, scale, ownedHandles))\n const buffer = exportStepFromSolids(kernel, stepEntries)\n for (const h of ownedHandles) {\n try { kernel.release(h) } catch { /* already released */ }\n }\n // 文本层只替换 header 声明/元数据(红线:绝不文本级改坐标——坐标已在几何层缩放)。\n let text = new TextDecoder().decode(new Uint8Array(buffer))\n if (unit !== 'mm') text = rewriteStepUnitEntities(text, unit)\n if (opts?.fileMeta && fileMetaHasHeaderFields(opts.fileMeta)) text = rewriteFileMetaHeader(text, opts.fileMeta)\n return new TextEncoder().encode(text).buffer\n }\n\n if (format === '3mf') {\n return build3mfBuffer(build3mfModelXml(entries, unit, scale, opts?.printConfig, opts?.fileMeta))\n }\n\n throw new Error(`[export] unsupported format: ${format}`)\n}\n\n/**\n * 导出后回读声明单位(自检与验收用;与 detectStepUnit 互为对偶)。\n * @param data - the exported file bytes (ArrayBuffer or decoded Uint8Array).\n * @param format - the format the bytes were produced in.\n * @returns the declared unit, or null when the format cannot declare one (STL)\n * or the declaration cannot be parsed.\n */\nexport function readDeclaredUnit(data: ArrayBuffer | Uint8Array, format: ExportFormat): UnitName | null {\n if (format === 'stl') return null\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data)\n const text = new TextDecoder().decode(bytes).slice(0, STEP_UNIT_SCAN_PREFIX)\n\n if (format === '3mf') {\n const m = text.match(/<model[^>]*\\sunit=\"([^\"]+)\"/)\n if (!m) return null\n for (const [name, val] of Object.entries(UNIT_NAME_TO_3MF)) {\n if (val === m[1]) return name as UnitName\n }\n return null\n }\n\n // step\n return detectStepUnit(text)\n}\n"]}
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
import type { BrepHandle } from '../engine/types.js';
|
|
16
16
|
import type { BrepEngineApi } from '../engine/primitives.js';
|
|
17
17
|
import type { FileMeta } from '../../api/meta.js';
|
|
18
|
-
|
|
18
|
+
import { type NodeTransform } from './transform12.js';
|
|
19
|
+
/** STEP 导出条目:一个 part(精确 BREP 形状或三角网格,二选一)或一个装配容器。 */
|
|
19
20
|
export interface StepExportEntry {
|
|
20
21
|
/** 精确 BREP 形状(solid/shell/face/compound,来自宿主导出缓存)。与 mesh 二选一,solid 优先。 */
|
|
21
22
|
solid?: BrepHandle;
|
|
@@ -28,6 +29,21 @@ export interface StepExportEntry {
|
|
|
28
29
|
name?: string;
|
|
29
30
|
/** RGB 0..1 颜色(sRGB 编码,如宿主材质 base color)。写入前转 linear。 */
|
|
30
31
|
color?: [number, number, number];
|
|
32
|
+
/**
|
|
33
|
+
* 装配子节点(方案 2026-10-08 步骤 7 / P3):非空时本条目按**真装配容器**写出
|
|
34
|
+
* (XCAF assembly + component),不再展平为平级 PRODUCT。容器自身不贡献几何
|
|
35
|
+
* (compound 几何 == 成员并集,写出会重复)。
|
|
36
|
+
*
|
|
37
|
+
* 写出语义:直接子叶的完整位姿(平移 + 旋转)走 XCAF component location;
|
|
38
|
+
* 首叶位姿烘进晋升几何;嵌套容器的叶递归收集后作为顶层容器的直接组件
|
|
39
|
+
* (子装配分组待 wasm 提供空装配 label 原语后升级)。
|
|
40
|
+
*/
|
|
41
|
+
children?: StepExportEntry[];
|
|
42
|
+
/**
|
|
43
|
+
* 本节点相对父的位姿(与 `Shape.transform` 同形态,坐标已按单位刻度换算)。
|
|
44
|
+
* 直接子节点写 XCAF component location;更深层的叶子烘进几何。
|
|
45
|
+
*/
|
|
46
|
+
transform?: NodeTransform;
|
|
31
47
|
}
|
|
32
48
|
/**
|
|
33
49
|
* Export multiple BREP solids (and/or triangle meshes) to STEP, one
|
|
@@ -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;AAIzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAA;AAGvE,qDAAqD;AACrD,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;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;CAC1B;AAuJD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAwFb;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,aAAa,GACpB,WAAW,CAEb"}
|
package/dist/brep/export/step.js
CHANGED
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
import { reconstructSolidFromMesh } from '../../occt-kernel/meshReconstruct.js';
|
|
16
16
|
import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
|
|
17
17
|
import { rewriteStepHeader, fileMetaHasHeaderFields } from './step-meta-header.js';
|
|
18
|
+
import { transformToMatrix12 } from './transform12.js';
|
|
19
|
+
import { composeMatrix12 } from './stl.js';
|
|
18
20
|
/**
|
|
19
21
|
* sRGB → linear 转换。
|
|
20
22
|
*
|
|
@@ -28,6 +30,132 @@ import { rewriteStepHeader, fileMetaHasHeaderFields } from './step-meta-header.j
|
|
|
28
30
|
function srgbToLinear(c) {
|
|
29
31
|
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* 3×3 行主序旋转矩阵 → Euler 角(弧度)。
|
|
35
|
+
*
|
|
36
|
+
* 约定 **R = Rz(rz)·Ry(ry)·Rx(rx)**(X 先转,Z 最后)——这是 occt-wasm
|
|
37
|
+
* `xcafAddComponent` 的合成约定(`trsf = rotZ * rotY * rotX`),由
|
|
38
|
+
* `xcaf-step-assembly-fidelity.test.ts`(occt-wasm 仓)的 Rz/Rx 往返测试与
|
|
39
|
+
* 本仓 step-export 装配测试共同钉住:若 wasm 侧改约定,两边测试先红。
|
|
40
|
+
*/
|
|
41
|
+
function rotationToEuler(m) {
|
|
42
|
+
const ry = -Math.asin(Math.max(-1, Math.min(1, m[8])));
|
|
43
|
+
if (Math.abs(m[8]) < 0.999999) {
|
|
44
|
+
return { rx: Math.atan2(m[9], m[10]), ry, rz: Math.atan2(m[4], m[0]) };
|
|
45
|
+
}
|
|
46
|
+
// 万向锁:m[8] = ±1 时 rx/rz 耦合,取 rz = 0 的退化解。
|
|
47
|
+
return { rx: Math.atan2(-m[6], m[5]), ry, rz: 0 };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 节点位姿 → wasm `addChild({location})` 的分量形态:平移 + Euler 角(弧度)。
|
|
51
|
+
*
|
|
52
|
+
* 完整位姿走 location(旋转分量经 occt-wasm `xcaf-step-assembly-fidelity`
|
|
53
|
+
* 往返测试证实保真,不再烘进几何)。坐标刻度由调用方保证(export-model
|
|
54
|
+
* 映射时已按单位换算平移分量)。
|
|
55
|
+
*/
|
|
56
|
+
function transformToLocation(t) {
|
|
57
|
+
if (!t)
|
|
58
|
+
return undefined;
|
|
59
|
+
const m = transformToMatrix12(t);
|
|
60
|
+
const { rx, ry, rz } = rotationToEuler(m);
|
|
61
|
+
return { tx: m[3], ty: m[7], tz: m[11], rx, ry, rz };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 装配容器的叶子收集:嵌套容器递归展开,位姿沿树复合(行主序 3×4)。
|
|
65
|
+
* `nested` = 该叶经过了嵌套容器(非顶层容器的直接子节点)。
|
|
66
|
+
*/
|
|
67
|
+
function collectAssemblyLeaves(list, parentM, out) {
|
|
68
|
+
for (const c of list) {
|
|
69
|
+
const m = c.transform ? transformToMatrix12(c.transform) : null;
|
|
70
|
+
const world = m && parentM ? composeMatrix12(parentM, m) : m ?? parentM;
|
|
71
|
+
if (c.children && c.children.length > 0) {
|
|
72
|
+
collectAssemblyLeaves(c.children, world, out);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
out.push({ entry: c, world, nested: parentM !== null });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function isIdentity12(m) {
|
|
80
|
+
return m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 0
|
|
81
|
+
&& m[4] === 0 && m[5] === 1 && m[6] === 0 && m[7] === 0
|
|
82
|
+
&& m[8] === 0 && m[9] === 0 && m[10] === 1 && m[11] === 0;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 写一个装配容器为真装配(XCAF assembly + component,方案步骤 7 / P3)。
|
|
86
|
+
*
|
|
87
|
+
* XCAF 原语约束:`addChild` 只收 shape 句柄、且「part 在首个 child 加入时转为
|
|
88
|
+
* assembly,原几何移入 identity 首组件」。因此:
|
|
89
|
+
* - 首叶几何升起为容器 label 的初始 part,其位姿烘进几何(晋升强制 identity
|
|
90
|
+
* location,首叶位姿只能烘焙);
|
|
91
|
+
* - 其余**直接**子叶经 `addChild({location})` 写**完整位姿**(平移 + 旋转);
|
|
92
|
+
* - 嵌套容器的叶(`nested`)位姿复合后烘进几何、以 identity 位置加入——几何与
|
|
93
|
+
* 名色保真,子装配分组待 wasm 提供空装配 label 原语后升级。
|
|
94
|
+
*
|
|
95
|
+
* 名字保真:容器名优先升起为容器/原型名;容器名与首叶名不同时,在晋升完成后
|
|
96
|
+
* 把首叶名补写回首组件及其原型(setName 必须在 addChild 之后调用——晋升发生
|
|
97
|
+
* 在首个 addChild,此前 getChildren 为空)。组件名与原型名均过 STEP 往返
|
|
98
|
+
* (occt-wasm `xcaf-step-assembly-fidelity.test.ts` 钉住)。
|
|
99
|
+
*/
|
|
100
|
+
function writeAssemblyContainer(kernel, doc, entry, ownedHandles) {
|
|
101
|
+
const resolveSolid = (e) => {
|
|
102
|
+
if (e.solid)
|
|
103
|
+
return e.solid;
|
|
104
|
+
if (!e.mesh)
|
|
105
|
+
throw new Error('StepExportEntry must provide either solid or mesh');
|
|
106
|
+
const s = reconstructSolidFromMesh(kernel, e.mesh.positions, e.mesh.indices);
|
|
107
|
+
ownedHandles.push(s);
|
|
108
|
+
return s;
|
|
109
|
+
};
|
|
110
|
+
const bake = (e, m) => {
|
|
111
|
+
const base = resolveSolid(e);
|
|
112
|
+
if (!m || isIdentity12(m))
|
|
113
|
+
return base;
|
|
114
|
+
const placed = kernel.transform(base, m);
|
|
115
|
+
ownedHandles.push(placed);
|
|
116
|
+
return placed;
|
|
117
|
+
};
|
|
118
|
+
const linear = (c) => c ? [srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2])] : undefined;
|
|
119
|
+
const leaves = [];
|
|
120
|
+
collectAssemblyLeaves(entry.children ?? [], null, leaves);
|
|
121
|
+
if (leaves.length === 0)
|
|
122
|
+
throw new Error('Assembly container has no leaf geometry');
|
|
123
|
+
const [first, ...rest] = leaves;
|
|
124
|
+
const label = doc.addShape(bake(first.entry, first.world), {
|
|
125
|
+
name: entry.name ?? first.entry.name,
|
|
126
|
+
color: linear(entry.color ?? first.entry.color),
|
|
127
|
+
});
|
|
128
|
+
// 名字保真:容器名优先升起为容器/原型名;容器名与首叶名不同时,晋升完成后
|
|
129
|
+
// 把首叶名补写回首组件及其原型(必须在 addChild 之后——晋升发生在首个
|
|
130
|
+
// addChild,此前 getChildren 为空,过早调用是空操作)。
|
|
131
|
+
for (const leaf of rest) {
|
|
132
|
+
let solid;
|
|
133
|
+
let location;
|
|
134
|
+
if (leaf.nested) {
|
|
135
|
+
// 嵌套容器的叶:位姿全量复合后烘进几何,identity 位置加入。
|
|
136
|
+
solid = bake(leaf.entry, leaf.world);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// 直接子叶:完整位姿走 location(旋转经 Euler 分解,wasm 按 Rz·Ry·Rx 合成)。
|
|
140
|
+
solid = resolveSolid(leaf.entry);
|
|
141
|
+
location = transformToLocation(leaf.entry.transform);
|
|
142
|
+
}
|
|
143
|
+
doc.addChild(label, solid, {
|
|
144
|
+
...(leaf.entry.name === undefined ? {} : { name: leaf.entry.name }),
|
|
145
|
+
...(leaf.entry.color === undefined ? {} : { color: linear(leaf.entry.color) }),
|
|
146
|
+
...(location === undefined ? {} : { location }),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (entry.name && first.entry.name && entry.name !== first.entry.name) {
|
|
150
|
+
const own = doc.getChildren(label)[0];
|
|
151
|
+
if (own) {
|
|
152
|
+
doc.setName(own, first.entry.name);
|
|
153
|
+
const proto = doc.getReferredLabel(own);
|
|
154
|
+
if (proto)
|
|
155
|
+
doc.setName(proto, first.entry.name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
31
159
|
/**
|
|
32
160
|
* Export multiple BREP solids (and/or triangle meshes) to STEP, one
|
|
33
161
|
* independent entity per entry — no fuse, no string splicing.
|
|
@@ -50,6 +178,11 @@ export function exportStepFromSolids(kernel, entries, fileMeta) {
|
|
|
50
178
|
const ownedHandles = [];
|
|
51
179
|
try {
|
|
52
180
|
for (const entry of entries) {
|
|
181
|
+
// 0. 装配容器 → 真装配写入(XCAF assembly + component,步骤 7 / P3)。
|
|
182
|
+
if (entry.children && entry.children.length > 0) {
|
|
183
|
+
writeAssemblyContainer(kernel, doc, entry, ownedHandles);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
53
186
|
// 1. 解析 solid:优先用精确 solid;无则从三角网格重建
|
|
54
187
|
let solid = entry.solid;
|
|
55
188
|
if (!solid) {
|
|
@@ -1 +1 @@
|
|
|
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}"]}
|
|
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 type { XCAFDocument } from 'occt-wasm'\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'\nimport { transformToMatrix12, type NodeTransform } from './transform12'\nimport { composeMatrix12 } from './stl'\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 * 装配子节点(方案 2026-10-08 步骤 7 / P3):非空时本条目按**真装配容器**写出\n * (XCAF assembly + component),不再展平为平级 PRODUCT。容器自身不贡献几何\n * (compound 几何 == 成员并集,写出会重复)。\n *\n * 写出语义:直接子叶的完整位姿(平移 + 旋转)走 XCAF component location;\n * 首叶位姿烘进晋升几何;嵌套容器的叶递归收集后作为顶层容器的直接组件\n * (子装配分组待 wasm 提供空装配 label 原语后升级)。\n */\n children?: StepExportEntry[]\n /**\n * 本节点相对父的位姿(与 `Shape.transform` 同形态,坐标已按单位刻度换算)。\n * 直接子节点写 XCAF component location;更深层的叶子烘进几何。\n */\n transform?: NodeTransform\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 * 3×3 行主序旋转矩阵 → Euler 角(弧度)。\n *\n * 约定 **R = Rz(rz)·Ry(ry)·Rx(rx)**(X 先转,Z 最后)——这是 occt-wasm\n * `xcafAddComponent` 的合成约定(`trsf = rotZ * rotY * rotX`),由\n * `xcaf-step-assembly-fidelity.test.ts`(occt-wasm 仓)的 Rz/Rx 往返测试与\n * 本仓 step-export 装配测试共同钉住:若 wasm 侧改约定,两边测试先红。\n */\nfunction rotationToEuler(m: number[]): { rx: number; ry: number; rz: number } {\n const ry = -Math.asin(Math.max(-1, Math.min(1, m[8]!)))\n if (Math.abs(m[8]!) < 0.999999) {\n return { rx: Math.atan2(m[9]!, m[10]!), ry, rz: Math.atan2(m[4]!, m[0]!) }\n }\n // 万向锁:m[8] = ±1 时 rx/rz 耦合,取 rz = 0 的退化解。\n return { rx: Math.atan2(-m[6]!, m[5]!), ry, rz: 0 }\n}\n\n/**\n * 节点位姿 → wasm `addChild({location})` 的分量形态:平移 + Euler 角(弧度)。\n *\n * 完整位姿走 location(旋转分量经 occt-wasm `xcaf-step-assembly-fidelity`\n * 往返测试证实保真,不再烘进几何)。坐标刻度由调用方保证(export-model\n * 映射时已按单位换算平移分量)。\n */\nfunction transformToLocation(t: NodeTransform | undefined): { tx: number; ty: number; tz: number; rx: number; ry: number; rz: number } | undefined {\n if (!t) return undefined\n const m = transformToMatrix12(t)\n const { rx, ry, rz } = rotationToEuler(m)\n return { tx: m[3]!, ty: m[7]!, tz: m[11]!, rx, ry, rz }\n}\n\n/**\n * 装配容器的叶子收集:嵌套容器递归展开,位姿沿树复合(行主序 3×4)。\n * `nested` = 该叶经过了嵌套容器(非顶层容器的直接子节点)。\n */\nfunction collectAssemblyLeaves(\n list: StepExportEntry[],\n parentM: number[] | null,\n out: Array<{ entry: StepExportEntry; world: number[] | null; nested: boolean }>,\n): void {\n for (const c of list) {\n const m = c.transform ? transformToMatrix12(c.transform) : null\n const world = m && parentM ? composeMatrix12(parentM, m) : m ?? parentM\n if (c.children && c.children.length > 0) {\n collectAssemblyLeaves(c.children, world, out)\n } else {\n out.push({ entry: c, world, nested: parentM !== null })\n }\n }\n}\n\nfunction isIdentity12(m: number[]): boolean {\n return m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 0\n && m[4] === 0 && m[5] === 1 && m[6] === 0 && m[7] === 0\n && m[8] === 0 && m[9] === 0 && m[10] === 1 && m[11] === 0\n}\n\n/**\n * 写一个装配容器为真装配(XCAF assembly + component,方案步骤 7 / P3)。\n *\n * XCAF 原语约束:`addChild` 只收 shape 句柄、且「part 在首个 child 加入时转为\n * assembly,原几何移入 identity 首组件」。因此:\n * - 首叶几何升起为容器 label 的初始 part,其位姿烘进几何(晋升强制 identity\n * location,首叶位姿只能烘焙);\n * - 其余**直接**子叶经 `addChild({location})` 写**完整位姿**(平移 + 旋转);\n * - 嵌套容器的叶(`nested`)位姿复合后烘进几何、以 identity 位置加入——几何与\n * 名色保真,子装配分组待 wasm 提供空装配 label 原语后升级。\n *\n * 名字保真:容器名优先升起为容器/原型名;容器名与首叶名不同时,在晋升完成后\n * 把首叶名补写回首组件及其原型(setName 必须在 addChild 之后调用——晋升发生\n * 在首个 addChild,此前 getChildren 为空)。组件名与原型名均过 STEP 往返\n * (occt-wasm `xcaf-step-assembly-fidelity.test.ts` 钉住)。\n */\nfunction writeAssemblyContainer(\n kernel: BrepEngineApi,\n doc: XCAFDocument,\n entry: StepExportEntry,\n ownedHandles: BrepHandle[],\n): void {\n const resolveSolid = (e: StepExportEntry): BrepHandle => {\n if (e.solid) return e.solid\n if (!e.mesh) throw new Error('StepExportEntry must provide either solid or mesh')\n const s = reconstructSolidFromMesh(kernel, e.mesh.positions, e.mesh.indices)\n ownedHandles.push(s)\n return s\n }\n const bake = (e: StepExportEntry, m: number[] | null): BrepHandle => {\n const base = resolveSolid(e)\n if (!m || isIdentity12(m)) return base\n const placed = kernel.transform(base, m)\n ownedHandles.push(placed)\n return placed\n }\n const linear = (c: [number, number, number] | undefined): [number, number, number] | undefined =>\n c ? [srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2])] : undefined\n\n const leaves: Array<{ entry: StepExportEntry; world: number[] | null; nested: boolean }> = []\n collectAssemblyLeaves(entry.children ?? [], null, leaves)\n if (leaves.length === 0) throw new Error('Assembly container has no leaf geometry')\n\n const [first, ...rest] = leaves\n const label = doc.addShape(bake(first!.entry, first!.world) as unknown as ShapeHandle, {\n name: entry.name ?? first!.entry.name,\n color: linear(entry.color ?? first!.entry.color),\n })\n // 名字保真:容器名优先升起为容器/原型名;容器名与首叶名不同时,晋升完成后\n // 把首叶名补写回首组件及其原型(必须在 addChild 之后——晋升发生在首个\n // addChild,此前 getChildren 为空,过早调用是空操作)。\n for (const leaf of rest) {\n let solid: BrepHandle\n let location: { tx: number; ty: number; tz: number; rx: number; ry: number; rz: number } | undefined\n if (leaf.nested) {\n // 嵌套容器的叶:位姿全量复合后烘进几何,identity 位置加入。\n solid = bake(leaf.entry, leaf.world)\n } else {\n // 直接子叶:完整位姿走 location(旋转经 Euler 分解,wasm 按 Rz·Ry·Rx 合成)。\n solid = resolveSolid(leaf.entry)\n location = transformToLocation(leaf.entry.transform)\n }\n doc.addChild(label, solid as unknown as ShapeHandle, {\n ...(leaf.entry.name === undefined ? {} : { name: leaf.entry.name }),\n ...(leaf.entry.color === undefined ? {} : { color: linear(leaf.entry.color) }),\n ...(location === undefined ? {} : { location }),\n })\n }\n if (entry.name && first!.entry.name && entry.name !== first!.entry.name) {\n const own = doc.getChildren(label)[0]\n if (own) {\n doc.setName(own, first!.entry.name)\n const proto = doc.getReferredLabel(own)\n if (proto) doc.setName(proto, first!.entry.name)\n }\n }\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 // 0. 装配容器 → 真装配写入(XCAF assembly + component,步骤 7 / P3)。\n if (entry.children && entry.children.length > 0) {\n writeAssemblyContainer(kernel, doc, entry, ownedHandles)\n continue\n }\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}"]}
|
|
@@ -16,12 +16,33 @@
|
|
|
16
16
|
* - vertex3: 3 × float32 (12 bytes)
|
|
17
17
|
* - attr: 2 bytes (0)
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* Compose two row-major 3×4 affine matrices (implicit homogeneous row [0,0,0,1]).
|
|
21
|
+
* Returns B∘A: apply A first, then B. Used to accumulate a node's local transform
|
|
22
|
+
* onto its parent's world transform during assembly flattening (方案 §2.1 / §5).
|
|
23
|
+
*
|
|
24
|
+
* @param a - 先应用的内层矩阵(子节点局部 transform)。
|
|
25
|
+
* @param b - 后应用的外层矩阵(父节点累积 transform)。
|
|
26
|
+
* @returns 复合后的行主序 3×4 仿射矩阵(12 元组)。
|
|
27
|
+
*/
|
|
28
|
+
export declare function composeMatrix12(a: number[], b: number[]): number[];
|
|
29
|
+
/**
|
|
30
|
+
* Apply a row-major 3×4 affine matrix (implicit homogeneous [0,0,0,1]) to every
|
|
31
|
+
* vertex of an interleaved position buffer, returning a new buffer (STL 顶点烘焙).
|
|
32
|
+
*
|
|
33
|
+
* @param positions - 交错的顶点坐标缓冲(每顶点 x,y,z)。
|
|
34
|
+
* @param m - 行主序 3×4 仿射矩阵(12 元组,隐式齐次行 [0,0,0,1])。
|
|
35
|
+
* @returns 烘焙后的新缓冲(不修改入参)。
|
|
36
|
+
*/
|
|
37
|
+
export declare function bakeMatrix12ToPositions(positions: Float32Array, m: number[]): Float32Array;
|
|
19
38
|
/**
|
|
20
39
|
* Build a binary STL buffer from raw positions and indices (no THREE dependency).
|
|
21
40
|
* @param positions - the interleaved vertex positions (x,y,z per vertex).
|
|
22
41
|
* @param indices - the triangle indices (3 indices per triangle).
|
|
23
42
|
* @param header - optional 80-byte header text (defaults to 'Faicad STL').
|
|
43
|
+
* @param transform - optional row-major 3×4 affine matrix (12-tuple). When given,
|
|
44
|
+
* every vertex is baked through it before writing (STL 顶点烘焙, 方案 §2.1 / §5).
|
|
24
45
|
* @returns an ArrayBuffer holding the binary STL data.
|
|
25
46
|
*/
|
|
26
|
-
export declare function buildStlBufferFromMesh(positions: Float32Array, indices: Uint32Array, header?: string): ArrayBuffer;
|
|
47
|
+
export declare function buildStlBufferFromMesh(positions: Float32Array, indices: Uint32Array, header?: string, transform?: number[]): ArrayBuffer;
|
|
27
48
|
//# sourceMappingURL=stl.d.ts.map
|