@faicad/faijs 0.29.3 → 0.30.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +136 -0
- package/dist/api/appearance.d.ts.map +1 -0
- package/dist/api/appearance.js +228 -0
- package/dist/api/appearance.js.map +1 -0
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +28 -0
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +19 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +31 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +91 -0
- package/dist/api/meta.d.ts.map +1 -0
- package/dist/api/meta.js +97 -0
- package/dist/api/meta.js.map +1 -0
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +124 -8
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +204 -13
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +8 -8
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +40 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +268 -25
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-meta-header.d.ts +102 -0
- package/dist/brep/export/step-meta-header.d.ts.map +1 -0
- package/dist/brep/export/step-meta-header.js +225 -0
- package/dist/brep/export/step-meta-header.js.map +1 -0
- package/dist/brep/export/step.d.ts +5 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +11 -2
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +65 -3
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +90 -29
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/types.d.ts +5 -6
- package/dist/lang/types.d.ts.map +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +39 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +151 -22
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +42 -7
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +37 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +205 -14
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +43 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/highLevelApi.d.ts +4 -1
- package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
- package/dist/occt-kernel/highLevelApi.js +4 -2
- package/dist/occt-kernel/highLevelApi.js.map +1 -1
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +32 -5
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +19 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
- package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
- package/dist/occt-kernel/stepMetaParser.js +166 -0
- package/dist/occt-kernel/stepMetaParser.js.map +1 -0
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +35 -3
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +44 -2
- package/dist/shape.js.map +1 -1
- package/dist/step/stepMetaParser.d.ts +55 -0
- package/dist/step/stepMetaParser.d.ts.map +1 -0
- package/dist/step/stepMetaParser.js +177 -0
- package/dist/step/stepMetaParser.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +9 -11
|
@@ -87,9 +87,12 @@ export function extractThumbnailBytes(entries) {
|
|
|
87
87
|
*
|
|
88
88
|
* @param extraEntries - the 3MF entry table excluding the geometry model shared
|
|
89
89
|
* with `parseThreemf` (project_settings / model_settings configs + thumbnails).
|
|
90
|
+
* @param modelXml - P4:根 model 文档(3D/3dmodel.model)XML;3MF 标准把
|
|
91
|
+
* `<build>` 放在 `<resources>` 前,必须全量解析。缺省时回退到
|
|
92
|
+
* extraEntries 里查找(兼容旧调用方)。
|
|
90
93
|
* @returns the resolved `Bambu3mfMetadata`.
|
|
91
94
|
*/
|
|
92
|
-
export function parseBambu3mfFromEntries(extraEntries) {
|
|
95
|
+
export function parseBambu3mfFromEntries(extraEntries, modelXml) {
|
|
93
96
|
const decoder = new TextDecoder();
|
|
94
97
|
const filamentColors = [];
|
|
95
98
|
const filamentTypes = [];
|
|
@@ -98,6 +101,8 @@ export function parseBambu3mfFromEntries(extraEntries) {
|
|
|
98
101
|
const objectParts = new Map();
|
|
99
102
|
const assembleTransforms = new Map();
|
|
100
103
|
const importTransforms = new Map();
|
|
104
|
+
// P4:父对象(model_settings id)→ 3MF components 子 id 列表(打印单元关联)。
|
|
105
|
+
const parentComponents = new Map();
|
|
101
106
|
// ---- 1. project_settings.config (JSON) ----
|
|
102
107
|
let bedSize;
|
|
103
108
|
const projKey = [...extraEntries.keys()].find(f => f.endsWith('project_settings.config'));
|
|
@@ -274,39 +279,85 @@ export function parseBambu3mfFromEntries(extraEntries) {
|
|
|
274
279
|
}
|
|
275
280
|
}
|
|
276
281
|
// ---- 3. Model-level metadata + build items from 3D/3dmodel.model ----
|
|
282
|
+
// P4:根 model XML 由 parseThreemf 经 ThreemfArchive.modelXml 直传(根 model
|
|
283
|
+
// 不在 extraEntries);`<build>` 可能位于 `<resources>` 之前(3MF 标准顺序),
|
|
284
|
+
// 故 buildItems 全量解析整个 modelXml,不再只查 resources 之后的 tail。
|
|
277
285
|
const thumbnailBytes = extractThumbnailBytes(extraEntries);
|
|
278
286
|
let modelMeta;
|
|
279
287
|
let metadataEntries = [];
|
|
280
288
|
let buildItems = [];
|
|
281
|
-
const modelFile =
|
|
289
|
+
const modelFile = modelXml ?? (() => {
|
|
290
|
+
const f = [...extraEntries.keys()].find(k => k.endsWith('/3dmodel.model') || k === '3D/3dmodel.model');
|
|
291
|
+
return f ? decoder.decode(extraEntries.get(f)) : undefined;
|
|
292
|
+
})();
|
|
282
293
|
if (modelFile) {
|
|
283
|
-
const
|
|
284
|
-
const
|
|
285
|
-
const resourcesEnd = modelXml.indexOf('</resources>');
|
|
286
|
-
const head = resourcesStart >= 0 ? modelXml.slice(0, resourcesStart) : modelXml;
|
|
287
|
-
const tail = resourcesEnd >= 0 ? modelXml.slice(resourcesEnd) : '';
|
|
288
|
-
const parsedHead = parseModelMeta(head);
|
|
289
|
-
const parsedTail = parseModelMeta(tail);
|
|
294
|
+
const parsedHead = parseModelMeta(modelFile);
|
|
295
|
+
const parsedTail = parseModelMeta(modelFile);
|
|
290
296
|
modelMeta = { ...parsedHead.modelMeta, ...parsedTail.modelMeta };
|
|
291
297
|
metadataEntries = [...parsedHead.metadataEntries, ...parsedTail.metadataEntries];
|
|
292
|
-
buildItems = parse3mfBuild(
|
|
298
|
+
buildItems = parse3mfBuild(modelFile);
|
|
299
|
+
// P4:父对象 components(父 object id → 子 id 列表)——build item 引用父
|
|
300
|
+
// 对象,实际网格在子(叶子)里;打印单元 = 父 × components。
|
|
301
|
+
const parentObjRe = /<object\b[^>]*\bid="(\d+)"[^>]*>([\s\S]*?)<\/object>/gi;
|
|
302
|
+
let pom;
|
|
303
|
+
while ((pom = parentObjRe.exec(modelFile)) !== null) {
|
|
304
|
+
const body = pom[2];
|
|
305
|
+
if (!body.includes('<components>'))
|
|
306
|
+
continue;
|
|
307
|
+
const childIds = [];
|
|
308
|
+
const compRe = /<component\b[^>]*\bobjectid="(\d+)"/g;
|
|
309
|
+
let cm;
|
|
310
|
+
while ((cm = compRe.exec(body)) !== null) {
|
|
311
|
+
const cid = Number(cm[1]);
|
|
312
|
+
if (Number.isFinite(cid))
|
|
313
|
+
childIds.push(cid);
|
|
314
|
+
}
|
|
315
|
+
if (childIds.length > 0)
|
|
316
|
+
parentComponents.set(pom[1], childIds);
|
|
317
|
+
}
|
|
293
318
|
}
|
|
294
|
-
// ---- 4.
|
|
319
|
+
// ---- 4. 打印单元表(build items × 父对象 components 展开) ----
|
|
320
|
+
// P4 修正:3MF `<object id>`(叶子实例,含子文件内局部 id)与
|
|
321
|
+
// model_settings.config 的 `<object id>`(父对象)是两套编号。关联必须走
|
|
322
|
+
// 父对象 `<components>`(component objectid = 叶子 id);每个父对象的每个
|
|
323
|
+
// component = 一个可打印单元(part)。Bambu 导出惯例:component 序 ↔
|
|
324
|
+
// 父对象 part 列表序(partId 同源)。
|
|
325
|
+
// 表序 = build item 序 × components 序 = parseThreemf 叶子实例序(meshIndex
|
|
326
|
+
// 契约:ModelGroup 按 meshIndex 取 parts[i] 做 view delta / 多盘布局)。
|
|
295
327
|
const parts = [];
|
|
328
|
+
const leafParts = new Map();
|
|
296
329
|
let partIndex = 0;
|
|
297
330
|
for (const item of buildItems) {
|
|
298
331
|
const oid = item.objectId;
|
|
299
332
|
const objMeta = objects.get(oid);
|
|
300
333
|
const partList = objectParts.get(oid) ?? [];
|
|
301
|
-
|
|
334
|
+
const compIds = parentComponents.get(oid) ?? [];
|
|
335
|
+
if (compIds.length === 0) {
|
|
336
|
+
// 父对象无 components(单网格对象):1 个打印单元,partId 取第一个 part。
|
|
337
|
+
const p = partList[0];
|
|
302
338
|
parts.push({
|
|
303
339
|
partIndex: partIndex++,
|
|
304
340
|
objectId: oid,
|
|
305
|
-
partId: p
|
|
306
|
-
name: stripExtension(p
|
|
307
|
-
extruder: p
|
|
341
|
+
partId: p?.partId ?? '0',
|
|
342
|
+
name: stripExtension(p?.name ?? objMeta?.name ?? ''),
|
|
343
|
+
extruder: p?.extruder ?? objMeta?.extruder ?? 1,
|
|
308
344
|
plateId: objMeta?.plateId ?? 0,
|
|
309
345
|
});
|
|
346
|
+
leafParts.set(`${oid}:1`, parts[parts.length - 1]);
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
for (let ci = 0; ci < compIds.length; ci++) {
|
|
350
|
+
const p = partList[ci];
|
|
351
|
+
const meta = {
|
|
352
|
+
partIndex: partIndex++,
|
|
353
|
+
objectId: oid,
|
|
354
|
+
partId: p?.partId ?? String(ci + 1),
|
|
355
|
+
name: stripExtension(p?.name ?? objMeta?.name ?? ''),
|
|
356
|
+
extruder: p?.extruder ?? objMeta?.extruder ?? 1,
|
|
357
|
+
plateId: objMeta?.plateId ?? 0,
|
|
358
|
+
};
|
|
359
|
+
parts.push(meta);
|
|
360
|
+
leafParts.set(`${oid}:${ci + 1}`, meta);
|
|
310
361
|
}
|
|
311
362
|
}
|
|
312
363
|
return {
|
|
@@ -321,6 +372,7 @@ export function parseBambu3mfFromEntries(extraEntries) {
|
|
|
321
372
|
assembleTransforms: assembleTransforms.size > 0 ? assembleTransforms : undefined,
|
|
322
373
|
importTransforms: importTransforms.size > 0 ? importTransforms : undefined,
|
|
323
374
|
buildItems: buildItems.length > 0 ? buildItems : undefined,
|
|
375
|
+
leafParts,
|
|
324
376
|
};
|
|
325
377
|
}
|
|
326
378
|
/** Parse Bambu metadata from a `ThreemfArchive`'s `extraEntries`.
|
|
@@ -329,6 +381,6 @@ export function parseBambu3mfFromEntries(extraEntries) {
|
|
|
329
381
|
* @returns the resolved `Bambu3mfMetadata`.
|
|
330
382
|
*/
|
|
331
383
|
export function parseBambu3mfFromArchive(archive) {
|
|
332
|
-
return parseBambu3mfFromEntries(archive.extraEntries);
|
|
384
|
+
return parseBambu3mfFromEntries(archive.extraEntries, archive.modelXml);
|
|
333
385
|
}
|
|
334
386
|
//# sourceMappingURL=threemf-bambu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threemf-bambu.js","sourceRoot":"","sources":["../../src/mesh/threemf-bambu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * threemf-bambu — Bambu Lab private 3MF extensions (moved up from 3d_editor,\n * plan §8 decision 2).\n *\n * Bambu Studio stores non-standard metadata in:\n * - `Metadata/project_settings.config` (JSON — filament colours/types, bed)\n * - `Metadata/model_settings.config` (XML — objects, parts, plates,\n * assemble/import transforms)\n * plus standard 3MF `<metadata>` / thumbnails.\n *\n * This module parses those from an already-unzipped entry table so the host's\n * single `parseThreemf` unzip feeds both the geometry and the Bambu metadata\n * layer (one unzip, two consumer chains — plan D4). Everything here is\n * environment-agnostic: no three.js, no `Blob`, no browser globals — the thumb\n * is returned as bytes and the host wraps it. Matrix helpers return plain 16x4\n * row-major number arrays (host converts to THREE.Matrix4).\n *\n * The parser mirrors the behaviour of the retired 3d_editor `bambu-3mf.ts` and\n * `viewTransforms.ts` so ModelGroup / DesktopLayout keep working unchanged\n * apart from the import source.\n */\nimport type { ThreemfArchive } from './threemf-loader'\n\nconst KNOWN_EXTENSIONS = new Set(['stl', 'step', 'stp', '3mf'])\n\n/** Remove a known 3D file extension from a filename.\n *\n * @param name - the entry name, possibly ending in `.3mf`, `.stl`, `.step`, `.stp`\n * (optionally suffixed `_<n>` for multi-plate objects).\n * @returns the name without the known extension.\n */\nexport function stripExtension(name: string): string {\n const extPattern = Array.from(KNOWN_EXTENSIONS).join('|')\n const multiRe = new RegExp(`^(.+)\\\\.(?:${extPattern})_(\\\\d+)$`, 'i')\n const multiMatch = name.match(multiRe)\n if (multiMatch) return `${multiMatch[1]}_${multiMatch[2]}`\n const singleRe = new RegExp(`^(.+)\\\\.(?:${extPattern})$`, 'i')\n const singleMatch = name.match(singleRe)\n if (singleMatch) return singleMatch[1]\n return name\n}\n\n/** A Bambu model object (an `<object>` in model_settings.config). */\nexport interface BambuObjectMeta {\n objectId: string\n name: string\n extruder: number\n plateId: number\n}\n\n/** A part inside a Bambu object (a `<part>` in model_settings.config). */\nexport interface BambuPartMeta {\n partIndex: number\n objectId: string\n partId: string\n name: string\n extruder: number\n plateId: number\n}\n\n/** Build-plate printable-area size, in millimetres. */\nexport interface BambuPlateSize {\n width: number\n depth: number\n height: number\n}\n\n/** A build plate in the project (id + display name + optional size). */\nexport interface BambuPlateInfo {\n plateId: number\n plateName: string\n size?: BambuPlateSize\n}\n\n/** Model-level descriptive metadata (Title/Designer/Description/License). */\nexport interface BambuModelMeta {\n title?: string\n designer?: string\n description?: string\n license?: string\n}\n\n/** A `<build>-section `<item> entry: object id and its print transform. */\nexport interface BuildItem {\n objectId: string\n transform: number[] | null\n}\n\n/** An assembly pose for a Bambu object (an `<assemble_item` entry). */\nexport interface AssembleItemTransform {\n objectId: string\n /** 12-value 4×3 matrix (same format as build `<item transform>`). */\n transform: number[]\n /** Additional fine-tune translation [tx, ty, tz]. */\n offset: [number, number, number]\n}\n\n/** A per-part import pose (4×4 matrix from model_settings.config). */\nexport interface PartImportTransform {\n objectId: string\n partId: string\n /** 16-value 4×4 matrix (row-major). */\n matrix: number[]\n /** Additional import translation offset. */\n sourceOffset: [number, number, number]\n}\n\n/** Everything parsed from a Bambu-labelled 3MF's private metadata layer. */\nexport interface Bambu3mfMetadata {\n filamentColors: string[]\n filamentTypes: string[]\n objects: Map<string, BambuObjectMeta>\n parts: BambuPartMeta[]\n plates: Map<number, BambuPlateInfo>\n modelMeta?: BambuModelMeta\n metadataEntries: Array<{ name: string; value: string }>\n /** Raw thumbnail PNG bytes, or undefined when absent. */\n thumbnailBytes?: Uint8Array\n assembleTransforms?: Map<string, AssembleItemTransform>\n importTransforms?: Map<string, PartImportTransform>\n buildItems?: BuildItem[]\n}\n\n/** Parse `<build>` section object IDs and transforms from 3D/3dmodel.model XML.\n *\n * @param xml - the raw 3D model XML text.\n * @returns the build items (objectId + optional print transform).\n */\nexport function parse3mfBuild(xml: string): BuildItem[] {\n const items: BuildItem[] = []\n const itemRe = /<item\\s+objectid=\"(\\d+)\"[^>]*\\/?>/g\n let m: RegExpExecArray | null\n while ((m = itemRe.exec(xml)) !== null) {\n const objectId = m[1]\n const transformMatch = m[0].match(/transform=\"([^\"]*)\"/)\n const transform = transformMatch ? transformMatch[1].split(/\\s+/).map(Number) : null\n items.push({ objectId, transform })\n }\n return items\n}\n\n/** Parse model-level `<metadata name=\"...\">…</metadata>` tags (3MF standard).\n *\n * @param xml - the raw 3D model XML text.\n * @returns the recognised model meta fields plus every raw metadata entry.\n */\nexport function parseModelMeta(xml: string): {\n modelMeta: BambuModelMeta | undefined\n metadataEntries: Array<{ name: string; value: string }>\n} {\n const meta: BambuModelMeta = {}\n const entries: Array<{ name: string; value: string }> = []\n const re = /<metadata\\s+name=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/metadata>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(xml)) !== null) {\n const name = m[1]\n const value = m[2].trim()\n entries.push({ name, value })\n if (name === 'Title') meta.title = value\n else if (name === 'Designer') meta.designer = value\n else if (name === 'Description') meta.description = value\n else if (name === 'License') meta.license = value\n }\n return { modelMeta: Object.keys(meta).length > 0 ? meta : undefined, metadataEntries: entries }\n}\n\n/** Known 3MF thumbnail PNG paths, in priority order. */\nconst THUMBNAIL_PATHS = [\n 'MetaData/thumbnail.png',\n 'Auxiliaries/.thumbnails/thumbnail_3mf.png',\n 'Auxiliaries/.thumbnails/thumbnail_middle.png',\n 'Auxiliaries/.thumbnails/thumbnail_small.png',\n]\n\n/** Extract a standard 3MF thumbnail PNG from an entry table (raw bytes).\n *\n * @param entries - the unzipped 3MF entry table (path -> bytes).\n * @returns the PNG bytes of the first matching thumbnail, or undefined.\n */\nexport function extractThumbnailBytes(\n entries: Map<string, Uint8Array>,\n): Uint8Array | undefined {\n const keys = [...entries.keys()]\n for (const path of THUMBNAIL_PATHS) {\n const entry = keys.find(k => k === path)\n if (entry) return entries.get(entry)\n }\n const metaDataEntry = keys.find(k => /^metadata\\/thumbnail\\.png$/i.test(k))\n if (metaDataEntry) return entries.get(metaDataEntry)\n return undefined\n}\n\n/** Parse Bambu Lab metadata from an already-unzipped entry table.\n *\n * @param extraEntries - the 3MF entry table excluding the geometry model shared\n * with `parseThreemf` (project_settings / model_settings configs + thumbnails).\n * @returns the resolved `Bambu3mfMetadata`.\n */\nexport function parseBambu3mfFromEntries(\n extraEntries: Map<string, Uint8Array>,\n): Bambu3mfMetadata {\n const decoder = new TextDecoder()\n\n const filamentColors: string[] = []\n const filamentTypes: string[] = []\n const objects = new Map<string, BambuObjectMeta>()\n const plates = new Map<number, BambuPlateInfo>()\n const objectParts = new Map<string, { partId: string; name: string; extruder: number }[]>()\n const assembleTransforms = new Map<string, AssembleItemTransform>()\n const importTransforms = new Map<string, PartImportTransform>()\n\n // ---- 1. project_settings.config (JSON) ----\n let bedSize: BambuPlateSize | undefined\n const projKey = [...extraEntries.keys()].find(f => f.endsWith('project_settings.config'))\n if (projKey) {\n try {\n const json = JSON.parse(decoder.decode(extraEntries.get(projKey)!))\n const rawColors = json.filament_colour ?? json.filament_color ?? []\n const cArr = Array.isArray(rawColors) ? rawColors : [rawColors]\n for (const c of cArr) {\n filamentColors.push(typeof c === 'string' ? c.replace(/^\"(.*)\"$/, '$1').trim() : String(c))\n }\n const fTypes = json.filament_type ?? []\n if (Array.isArray(fTypes)) {\n for (const t of fTypes) filamentTypes.push(typeof t === 'string' ? t : String(t))\n }\n if (json.printable_area) {\n const area = Array.isArray(json.printable_area) ? json.printable_area : [json.printable_area]\n let maxX = 0\n let maxY = 0\n for (const pt of area) {\n const parts = String(pt).split('x')\n if (parts.length === 2) {\n const x = parseFloat(parts[0])\n const y = parseFloat(parts[1])\n if (Number.isFinite(x) && x > maxX) maxX = x\n if (Number.isFinite(y) && y > maxY) maxY = y\n }\n }\n const height = parseFloat(String(json.printable_height ?? '0'))\n if (maxX > 0 && maxY > 0 && Number.isFinite(height) && height > 0) {\n bedSize = { width: maxX, depth: maxY, height }\n }\n }\n } catch {\n /* ignore malformed project settings */\n }\n }\n\n // ---- 2. model_settings.config (XML) ----\n const msKey = [...extraEntries.keys()].find(f => f.endsWith('model_settings.config'))\n if (msKey) {\n const xml = decoder.decode(extraEntries.get(msKey)!)\n\n const objBlockRe = /<object\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/object>/gi\n let objMatch: RegExpExecArray | null\n while ((objMatch = objBlockRe.exec(xml)) !== null) {\n const oid = objMatch[1]\n const body = objMatch[2]\n const topLevel = body.replace(/<part[^>]*>[\\s\\S]*?<\\/part>/gi, '')\n let objName = ''\n let objExtruder = 1\n const metaRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let mm: RegExpExecArray | null\n while ((mm = metaRe.exec(topLevel)) !== null) {\n if (mm[1] === 'name') objName = mm[2]\n if (mm[1] === 'extruder') objExtruder = parseInt(mm[2], 10) || 1\n }\n objects.set(oid, { objectId: oid, name: objName, extruder: objExtruder, plateId: 0 })\n\n const partList: { partId: string; name: string; extruder: number }[] = []\n const partBlockRe = /<part\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/part>/gi\n let pm: RegExpExecArray | null\n while ((pm = partBlockRe.exec(body)) !== null) {\n const pid = pm[1]\n const partBody = pm[2]\n let partName = objName\n let partExtruder = objExtruder\n const pmRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let pmm: RegExpExecArray | null\n while ((pmm = pmRe.exec(partBody)) !== null) {\n if (pmm[1] === 'name') partName = pmm[2]\n if (pmm[1] === 'extruder') partExtruder = parseInt(pmm[2], 10) || objExtruder\n }\n partList.push({ partId: pid, name: partName, extruder: partExtruder })\n }\n if (partList.length === 0) {\n partList.push({ partId: '0', name: objName, extruder: objExtruder })\n }\n objectParts.set(oid, partList)\n }\n\n // 2c. <plate> blocks\n const plateBlockRe = /<plate>([\\s\\S]*?)<\\/plate>/gi\n let plateMatch: RegExpExecArray | null\n while ((plateMatch = plateBlockRe.exec(xml)) !== null) {\n const plateBody = plateMatch[1]\n let platerId = 0\n let platerName = ''\n const pmRe2 = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let m2: RegExpExecArray | null\n while ((m2 = pmRe2.exec(plateBody)) !== null) {\n if (m2[1] === 'plater_id') platerId = parseInt(m2[2], 10) || 0\n if (m2[1] === 'plater_name') platerName = m2[2]\n }\n if (platerId > 0) {\n plates.set(platerId, { plateId: platerId, plateName: platerName, size: bedSize })\n }\n const instRe = /<model_instance>([\\s\\S]*?)<\\/model_instance>/gi\n let im: RegExpExecArray | null\n while ((im = instRe.exec(plateBody)) !== null) {\n const oidMatch = /<metadata\\s+key=\"object_id\"\\s+value=\"(\\d+)\"\\s*\\/?>/i.exec(im[1])\n if (oidMatch) {\n const obj = objects.get(oidMatch[1])\n if (obj) obj.plateId = platerId\n }\n }\n }\n\n // 2d. <assemble> — assembly transforms\n const assembleBlock = xml.match(/<assemble>([\\s\\S]*?)<\\/assemble>/i)\n if (assembleBlock) {\n const assembleItemRe = /<assemble_item\\s+([^>]*)\\/?>/gi\n let am: RegExpExecArray | null\n while ((am = assembleItemRe.exec(assembleBlock[1])) !== null) {\n const attrs = am[1]\n const oidMatch = /object_id=\"(\\d+)\"/.exec(attrs)\n const xformMatch = /transform=\"([^\"]*)\"/.exec(attrs)\n const offsetMatch = /offset=\"([^\"]*)\"/.exec(attrs)\n const oid = oidMatch?.[1]\n if (oid && xformMatch) {\n const xform = xformMatch[1].split(/\\s+/).map(Number)\n const offsetArr = offsetMatch ? offsetMatch[1].split(/\\s+/).map(Number) : [0, 0, 0]\n if (xform.length === 12 && offsetArr.length === 3) {\n assembleTransforms.set(oid, {\n objectId: oid,\n transform: xform,\n offset: offsetArr as [number, number, number],\n })\n }\n }\n }\n }\n\n // 2e. <part> matrix metadata (per-part import transforms)\n const importObjBlockRe = /<object\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/object>/gi\n let importObjMatch: RegExpExecArray | null\n while ((importObjMatch = importObjBlockRe.exec(xml)) !== null) {\n const oid = importObjMatch[1]\n const body = importObjMatch[2]\n const importPartRe = /<part\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/part>/gi\n let ipm: RegExpExecArray | null\n while ((ipm = importPartRe.exec(body)) !== null) {\n const pid = ipm[1]\n let matrix: number[] | undefined\n let sox = 0; let soy = 0; let soz = 0\n const imRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let imm: RegExpExecArray | null\n while ((imm = imRe.exec(ipm[2])) !== null) {\n if (imm[1] === 'matrix') matrix = imm[2].split(/\\s+/).map(Number)\n if (imm[1] === 'source_offset_x') sox = parseFloat(imm[2]) || 0\n if (imm[1] === 'source_offset_y') soy = parseFloat(imm[2]) || 0\n if (imm[1] === 'source_offset_z') soz = parseFloat(imm[2]) || 0\n }\n if (matrix && matrix.length === 16) {\n importTransforms.set(`${oid}:${pid}`, {\n objectId: oid,\n partId: pid,\n matrix,\n sourceOffset: [sox, soy, soz],\n })\n }\n }\n }\n }\n\n // ---- 3. Model-level metadata + build items from 3D/3dmodel.model ----\n const thumbnailBytes = extractThumbnailBytes(extraEntries)\n let modelMeta: BambuModelMeta | undefined\n let metadataEntries: Array<{ name: string; value: string }> = []\n let buildItems: BuildItem[] = []\n\n const modelFile = [...extraEntries.keys()].find(\n f => f.endsWith('/3dmodel.model') || f === '3D/3dmodel.model',\n )\n if (modelFile) {\n const modelXml = decoder.decode(extraEntries.get(modelFile)!)\n const resourcesStart = modelXml.indexOf('<resources>')\n const resourcesEnd = modelXml.indexOf('</resources>')\n const head = resourcesStart >= 0 ? modelXml.slice(0, resourcesStart) : modelXml\n const tail = resourcesEnd >= 0 ? modelXml.slice(resourcesEnd) : ''\n const parsedHead = parseModelMeta(head)\n const parsedTail = parseModelMeta(tail)\n modelMeta = { ...parsedHead.modelMeta, ...parsedTail.modelMeta }\n metadataEntries = [...parsedHead.metadataEntries, ...parsedTail.metadataEntries]\n buildItems = parse3mfBuild(tail)\n }\n\n // ---- 4. Ordered flat parts list ----\n const parts: BambuPartMeta[] = []\n let partIndex = 0\n for (const item of buildItems) {\n const oid = item.objectId\n const objMeta = objects.get(oid)\n const partList = objectParts.get(oid) ?? []\n for (const p of partList) {\n parts.push({\n partIndex: partIndex++,\n objectId: oid,\n partId: p.partId,\n name: stripExtension(p.name),\n extruder: p.extruder,\n plateId: objMeta?.plateId ?? 0,\n })\n }\n }\n\n return {\n filamentColors,\n filamentTypes,\n objects,\n parts,\n plates,\n modelMeta: modelMeta && Object.keys(modelMeta).length > 0 ? modelMeta : undefined,\n metadataEntries,\n thumbnailBytes,\n assembleTransforms: assembleTransforms.size > 0 ? assembleTransforms : undefined,\n importTransforms: importTransforms.size > 0 ? importTransforms : undefined,\n buildItems: buildItems.length > 0 ? buildItems : undefined,\n }\n}\n\n/** Parse Bambu metadata from a `ThreemfArchive`'s `extraEntries`.\n *\n * @param archive - a `ThreemfArchive` produced by `parseThreemf`.\n * @returns the resolved `Bambu3mfMetadata`.\n */\nexport function parseBambu3mfFromArchive(archive: ThreemfArchive): Bambu3mfMetadata {\n return parseBambu3mfFromEntries(archive.extraEntries)\n}"]}
|
|
1
|
+
{"version":3,"file":"threemf-bambu.js","sourceRoot":"","sources":["../../src/mesh/threemf-bambu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * threemf-bambu — Bambu Lab private 3MF extensions (moved up from 3d_editor,\n * plan §8 decision 2).\n *\n * Bambu Studio stores non-standard metadata in:\n * - `Metadata/project_settings.config` (JSON — filament colours/types, bed)\n * - `Metadata/model_settings.config` (XML — objects, parts, plates,\n * assemble/import transforms)\n * plus standard 3MF `<metadata>` / thumbnails.\n *\n * This module parses those from an already-unzipped entry table so the host's\n * single `parseThreemf` unzip feeds both the geometry and the Bambu metadata\n * layer (one unzip, two consumer chains — plan D4). Everything here is\n * environment-agnostic: no three.js, no `Blob`, no browser globals — the thumb\n * is returned as bytes and the host wraps it. Matrix helpers return plain 16x4\n * row-major number arrays (host converts to THREE.Matrix4).\n *\n * The parser mirrors the behaviour of the retired 3d_editor `bambu-3mf.ts` and\n * `viewTransforms.ts` so ModelGroup / DesktopLayout keep working unchanged\n * apart from the import source.\n */\nimport type { ThreemfArchive } from './threemf-loader'\n\nconst KNOWN_EXTENSIONS = new Set(['stl', 'step', 'stp', '3mf'])\n\n/** Remove a known 3D file extension from a filename.\n *\n * @param name - the entry name, possibly ending in `.3mf`, `.stl`, `.step`, `.stp`\n * (optionally suffixed `_<n>` for multi-plate objects).\n * @returns the name without the known extension.\n */\nexport function stripExtension(name: string): string {\n const extPattern = Array.from(KNOWN_EXTENSIONS).join('|')\n const multiRe = new RegExp(`^(.+)\\\\.(?:${extPattern})_(\\\\d+)$`, 'i')\n const multiMatch = name.match(multiRe)\n if (multiMatch) return `${multiMatch[1]}_${multiMatch[2]}`\n const singleRe = new RegExp(`^(.+)\\\\.(?:${extPattern})$`, 'i')\n const singleMatch = name.match(singleRe)\n if (singleMatch) return singleMatch[1]\n return name\n}\n\n/** A Bambu model object (an `<object>` in model_settings.config). */\nexport interface BambuObjectMeta {\n objectId: string\n name: string\n extruder: number\n plateId: number\n}\n\n/** A part inside a Bambu object (a `<part>` in model_settings.config). */\nexport interface BambuPartMeta {\n partIndex: number\n objectId: string\n partId: string\n name: string\n extruder: number\n plateId: number\n}\n\n/** Build-plate printable-area size, in millimetres. */\nexport interface BambuPlateSize {\n width: number\n depth: number\n height: number\n}\n\n/** A build plate in the project (id + display name + optional size). */\nexport interface BambuPlateInfo {\n plateId: number\n plateName: string\n size?: BambuPlateSize\n}\n\n/** Model-level descriptive metadata (Title/Designer/Description/License). */\nexport interface BambuModelMeta {\n title?: string\n designer?: string\n description?: string\n license?: string\n}\n\n/** A `<build>-section `<item> entry: object id and its print transform. */\nexport interface BuildItem {\n objectId: string\n transform: number[] | null\n}\n\n/** An assembly pose for a Bambu object (an `<assemble_item` entry). */\nexport interface AssembleItemTransform {\n objectId: string\n /** 12-value 4×3 matrix (same format as build `<item transform>`). */\n transform: number[]\n /** Additional fine-tune translation [tx, ty, tz]. */\n offset: [number, number, number]\n}\n\n/** A per-part import pose (4×4 matrix from model_settings.config). */\nexport interface PartImportTransform {\n objectId: string\n partId: string\n /** 16-value 4×4 matrix (row-major). */\n matrix: number[]\n /** Additional import translation offset. */\n sourceOffset: [number, number, number]\n}\n\n/** Everything parsed from a Bambu-labelled 3MF's private metadata layer. */\nexport interface Bambu3mfMetadata {\n filamentColors: string[]\n filamentTypes: string[]\n objects: Map<string, BambuObjectMeta>\n /** 打印单元表(序 = build items × 父对象 components = 叶子实例序)。 */\n parts: BambuPartMeta[]\n /**\n * P4:叶子实例(3MF `<object id>`,含子文件内局部 id)→ Bambu 身份。\n * 键 = `${父objectId}:${componentIndex}`(ThreemfObject.parentObjectId/\n * componentIndex 同源);3MF object id 与 model_settings id 两套编号,\n * 必须经父对象 components 关联。\n */\n leafParts: Map<string, BambuPartMeta>\n plates: Map<number, BambuPlateInfo>\n modelMeta?: BambuModelMeta\n metadataEntries: Array<{ name: string; value: string }>\n /** Raw thumbnail PNG bytes, or undefined when absent. */\n thumbnailBytes?: Uint8Array\n assembleTransforms?: Map<string, AssembleItemTransform>\n importTransforms?: Map<string, PartImportTransform>\n buildItems?: BuildItem[]\n}\n\n/** Parse `<build>` section object IDs and transforms from 3D/3dmodel.model XML.\n *\n * @param xml - the raw 3D model XML text.\n * @returns the build items (objectId + optional print transform).\n */\nexport function parse3mfBuild(xml: string): BuildItem[] {\n const items: BuildItem[] = []\n const itemRe = /<item\\s+objectid=\"(\\d+)\"[^>]*\\/?>/g\n let m: RegExpExecArray | null\n while ((m = itemRe.exec(xml)) !== null) {\n const objectId = m[1]\n const transformMatch = m[0].match(/transform=\"([^\"]*)\"/)\n const transform = transformMatch ? transformMatch[1].split(/\\s+/).map(Number) : null\n items.push({ objectId, transform })\n }\n return items\n}\n\n/** Parse model-level `<metadata name=\"...\">…</metadata>` tags (3MF standard).\n *\n * @param xml - the raw 3D model XML text.\n * @returns the recognised model meta fields plus every raw metadata entry.\n */\nexport function parseModelMeta(xml: string): {\n modelMeta: BambuModelMeta | undefined\n metadataEntries: Array<{ name: string; value: string }>\n} {\n const meta: BambuModelMeta = {}\n const entries: Array<{ name: string; value: string }> = []\n const re = /<metadata\\s+name=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/metadata>/gi\n let m: RegExpExecArray | null\n while ((m = re.exec(xml)) !== null) {\n const name = m[1]\n const value = m[2].trim()\n entries.push({ name, value })\n if (name === 'Title') meta.title = value\n else if (name === 'Designer') meta.designer = value\n else if (name === 'Description') meta.description = value\n else if (name === 'License') meta.license = value\n }\n return { modelMeta: Object.keys(meta).length > 0 ? meta : undefined, metadataEntries: entries }\n}\n\n/** Known 3MF thumbnail PNG paths, in priority order. */\nconst THUMBNAIL_PATHS = [\n 'MetaData/thumbnail.png',\n 'Auxiliaries/.thumbnails/thumbnail_3mf.png',\n 'Auxiliaries/.thumbnails/thumbnail_middle.png',\n 'Auxiliaries/.thumbnails/thumbnail_small.png',\n]\n\n/** Extract a standard 3MF thumbnail PNG from an entry table (raw bytes).\n *\n * @param entries - the unzipped 3MF entry table (path -> bytes).\n * @returns the PNG bytes of the first matching thumbnail, or undefined.\n */\nexport function extractThumbnailBytes(\n entries: Map<string, Uint8Array>,\n): Uint8Array | undefined {\n const keys = [...entries.keys()]\n for (const path of THUMBNAIL_PATHS) {\n const entry = keys.find(k => k === path)\n if (entry) return entries.get(entry)\n }\n const metaDataEntry = keys.find(k => /^metadata\\/thumbnail\\.png$/i.test(k))\n if (metaDataEntry) return entries.get(metaDataEntry)\n return undefined\n}\n\n/** Parse Bambu Lab metadata from an already-unzipped entry table.\n *\n * @param extraEntries - the 3MF entry table excluding the geometry model shared\n * with `parseThreemf` (project_settings / model_settings configs + thumbnails).\n * @param modelXml - P4:根 model 文档(3D/3dmodel.model)XML;3MF 标准把\n * `<build>` 放在 `<resources>` 前,必须全量解析。缺省时回退到\n * extraEntries 里查找(兼容旧调用方)。\n * @returns the resolved `Bambu3mfMetadata`.\n */\nexport function parseBambu3mfFromEntries(\n extraEntries: Map<string, Uint8Array>,\n modelXml?: string,\n): Bambu3mfMetadata {\n const decoder = new TextDecoder()\n\n const filamentColors: string[] = []\n const filamentTypes: string[] = []\n const objects = new Map<string, BambuObjectMeta>()\n const plates = new Map<number, BambuPlateInfo>()\n const objectParts = new Map<string, { partId: string; name: string; extruder: number }[]>()\n const assembleTransforms = new Map<string, AssembleItemTransform>()\n const importTransforms = new Map<string, PartImportTransform>()\n // P4:父对象(model_settings id)→ 3MF components 子 id 列表(打印单元关联)。\n const parentComponents = new Map<string, number[]>()\n\n // ---- 1. project_settings.config (JSON) ----\n let bedSize: BambuPlateSize | undefined\n const projKey = [...extraEntries.keys()].find(f => f.endsWith('project_settings.config'))\n if (projKey) {\n try {\n const json = JSON.parse(decoder.decode(extraEntries.get(projKey)!))\n const rawColors = json.filament_colour ?? json.filament_color ?? []\n const cArr = Array.isArray(rawColors) ? rawColors : [rawColors]\n for (const c of cArr) {\n filamentColors.push(typeof c === 'string' ? c.replace(/^\"(.*)\"$/, '$1').trim() : String(c))\n }\n const fTypes = json.filament_type ?? []\n if (Array.isArray(fTypes)) {\n for (const t of fTypes) filamentTypes.push(typeof t === 'string' ? t : String(t))\n }\n if (json.printable_area) {\n const area = Array.isArray(json.printable_area) ? json.printable_area : [json.printable_area]\n let maxX = 0\n let maxY = 0\n for (const pt of area) {\n const parts = String(pt).split('x')\n if (parts.length === 2) {\n const x = parseFloat(parts[0])\n const y = parseFloat(parts[1])\n if (Number.isFinite(x) && x > maxX) maxX = x\n if (Number.isFinite(y) && y > maxY) maxY = y\n }\n }\n const height = parseFloat(String(json.printable_height ?? '0'))\n if (maxX > 0 && maxY > 0 && Number.isFinite(height) && height > 0) {\n bedSize = { width: maxX, depth: maxY, height }\n }\n }\n } catch {\n /* ignore malformed project settings */\n }\n }\n\n // ---- 2. model_settings.config (XML) ----\n const msKey = [...extraEntries.keys()].find(f => f.endsWith('model_settings.config'))\n if (msKey) {\n const xml = decoder.decode(extraEntries.get(msKey)!)\n\n const objBlockRe = /<object\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/object>/gi\n let objMatch: RegExpExecArray | null\n while ((objMatch = objBlockRe.exec(xml)) !== null) {\n const oid = objMatch[1]\n const body = objMatch[2]\n const topLevel = body.replace(/<part[^>]*>[\\s\\S]*?<\\/part>/gi, '')\n let objName = ''\n let objExtruder = 1\n const metaRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let mm: RegExpExecArray | null\n while ((mm = metaRe.exec(topLevel)) !== null) {\n if (mm[1] === 'name') objName = mm[2]\n if (mm[1] === 'extruder') objExtruder = parseInt(mm[2], 10) || 1\n }\n objects.set(oid, { objectId: oid, name: objName, extruder: objExtruder, plateId: 0 })\n\n const partList: { partId: string; name: string; extruder: number }[] = []\n const partBlockRe = /<part\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/part>/gi\n let pm: RegExpExecArray | null\n while ((pm = partBlockRe.exec(body)) !== null) {\n const pid = pm[1]\n const partBody = pm[2]\n let partName = objName\n let partExtruder = objExtruder\n const pmRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let pmm: RegExpExecArray | null\n while ((pmm = pmRe.exec(partBody)) !== null) {\n if (pmm[1] === 'name') partName = pmm[2]\n if (pmm[1] === 'extruder') partExtruder = parseInt(pmm[2], 10) || objExtruder\n }\n partList.push({ partId: pid, name: partName, extruder: partExtruder })\n }\n if (partList.length === 0) {\n partList.push({ partId: '0', name: objName, extruder: objExtruder })\n }\n objectParts.set(oid, partList)\n }\n\n // 2c. <plate> blocks\n const plateBlockRe = /<plate>([\\s\\S]*?)<\\/plate>/gi\n let plateMatch: RegExpExecArray | null\n while ((plateMatch = plateBlockRe.exec(xml)) !== null) {\n const plateBody = plateMatch[1]\n let platerId = 0\n let platerName = ''\n const pmRe2 = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let m2: RegExpExecArray | null\n while ((m2 = pmRe2.exec(plateBody)) !== null) {\n if (m2[1] === 'plater_id') platerId = parseInt(m2[2], 10) || 0\n if (m2[1] === 'plater_name') platerName = m2[2]\n }\n if (platerId > 0) {\n plates.set(platerId, { plateId: platerId, plateName: platerName, size: bedSize })\n }\n const instRe = /<model_instance>([\\s\\S]*?)<\\/model_instance>/gi\n let im: RegExpExecArray | null\n while ((im = instRe.exec(plateBody)) !== null) {\n const oidMatch = /<metadata\\s+key=\"object_id\"\\s+value=\"(\\d+)\"\\s*\\/?>/i.exec(im[1])\n if (oidMatch) {\n const obj = objects.get(oidMatch[1])\n if (obj) obj.plateId = platerId\n }\n }\n }\n\n // 2d. <assemble> — assembly transforms\n const assembleBlock = xml.match(/<assemble>([\\s\\S]*?)<\\/assemble>/i)\n if (assembleBlock) {\n const assembleItemRe = /<assemble_item\\s+([^>]*)\\/?>/gi\n let am: RegExpExecArray | null\n while ((am = assembleItemRe.exec(assembleBlock[1])) !== null) {\n const attrs = am[1]\n const oidMatch = /object_id=\"(\\d+)\"/.exec(attrs)\n const xformMatch = /transform=\"([^\"]*)\"/.exec(attrs)\n const offsetMatch = /offset=\"([^\"]*)\"/.exec(attrs)\n const oid = oidMatch?.[1]\n if (oid && xformMatch) {\n const xform = xformMatch[1].split(/\\s+/).map(Number)\n const offsetArr = offsetMatch ? offsetMatch[1].split(/\\s+/).map(Number) : [0, 0, 0]\n if (xform.length === 12 && offsetArr.length === 3) {\n assembleTransforms.set(oid, {\n objectId: oid,\n transform: xform,\n offset: offsetArr as [number, number, number],\n })\n }\n }\n }\n }\n\n // 2e. <part> matrix metadata (per-part import transforms)\n const importObjBlockRe = /<object\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/object>/gi\n let importObjMatch: RegExpExecArray | null\n while ((importObjMatch = importObjBlockRe.exec(xml)) !== null) {\n const oid = importObjMatch[1]\n const body = importObjMatch[2]\n const importPartRe = /<part\\s+id=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/part>/gi\n let ipm: RegExpExecArray | null\n while ((ipm = importPartRe.exec(body)) !== null) {\n const pid = ipm[1]\n let matrix: number[] | undefined\n let sox = 0; let soy = 0; let soz = 0\n const imRe = /<metadata\\s+key=\"([^\"]*)\"\\s+value=\"([^\"]*)\"\\s*\\/?>/gi\n let imm: RegExpExecArray | null\n while ((imm = imRe.exec(ipm[2])) !== null) {\n if (imm[1] === 'matrix') matrix = imm[2].split(/\\s+/).map(Number)\n if (imm[1] === 'source_offset_x') sox = parseFloat(imm[2]) || 0\n if (imm[1] === 'source_offset_y') soy = parseFloat(imm[2]) || 0\n if (imm[1] === 'source_offset_z') soz = parseFloat(imm[2]) || 0\n }\n if (matrix && matrix.length === 16) {\n importTransforms.set(`${oid}:${pid}`, {\n objectId: oid,\n partId: pid,\n matrix,\n sourceOffset: [sox, soy, soz],\n })\n }\n }\n }\n }\n\n // ---- 3. Model-level metadata + build items from 3D/3dmodel.model ----\n // P4:根 model XML 由 parseThreemf 经 ThreemfArchive.modelXml 直传(根 model\n // 不在 extraEntries);`<build>` 可能位于 `<resources>` 之前(3MF 标准顺序),\n // 故 buildItems 全量解析整个 modelXml,不再只查 resources 之后的 tail。\n const thumbnailBytes = extractThumbnailBytes(extraEntries)\n let modelMeta: BambuModelMeta | undefined\n let metadataEntries: Array<{ name: string; value: string }> = []\n let buildItems: BuildItem[] = []\n\n const modelFile = modelXml ?? (() => {\n const f = [...extraEntries.keys()].find(\n k => k.endsWith('/3dmodel.model') || k === '3D/3dmodel.model',\n )\n return f ? decoder.decode(extraEntries.get(f)!) : undefined\n })()\n if (modelFile) {\n const parsedHead = parseModelMeta(modelFile)\n const parsedTail = parseModelMeta(modelFile)\n modelMeta = { ...parsedHead.modelMeta, ...parsedTail.modelMeta }\n metadataEntries = [...parsedHead.metadataEntries, ...parsedTail.metadataEntries]\n buildItems = parse3mfBuild(modelFile)\n // P4:父对象 components(父 object id → 子 id 列表)——build item 引用父\n // 对象,实际网格在子(叶子)里;打印单元 = 父 × components。\n const parentObjRe = /<object\\b[^>]*\\bid=\"(\\d+)\"[^>]*>([\\s\\S]*?)<\\/object>/gi\n let pom: RegExpExecArray | null\n while ((pom = parentObjRe.exec(modelFile)) !== null) {\n const body = pom[2]\n if (!body.includes('<components>')) continue\n const childIds: number[] = []\n const compRe = /<component\\b[^>]*\\bobjectid=\"(\\d+)\"/g\n let cm: RegExpExecArray | null\n while ((cm = compRe.exec(body)) !== null) {\n const cid = Number(cm[1])\n if (Number.isFinite(cid)) childIds.push(cid)\n }\n if (childIds.length > 0) parentComponents.set(pom[1], childIds)\n }\n }\n\n // ---- 4. 打印单元表(build items × 父对象 components 展开) ----\n // P4 修正:3MF `<object id>`(叶子实例,含子文件内局部 id)与\n // model_settings.config 的 `<object id>`(父对象)是两套编号。关联必须走\n // 父对象 `<components>`(component objectid = 叶子 id);每个父对象的每个\n // component = 一个可打印单元(part)。Bambu 导出惯例:component 序 ↔\n // 父对象 part 列表序(partId 同源)。\n // 表序 = build item 序 × components 序 = parseThreemf 叶子实例序(meshIndex\n // 契约:ModelGroup 按 meshIndex 取 parts[i] 做 view delta / 多盘布局)。\n const parts: BambuPartMeta[] = []\n const leafParts = new Map<string, BambuPartMeta>()\n let partIndex = 0\n for (const item of buildItems) {\n const oid = item.objectId\n const objMeta = objects.get(oid)\n const partList = objectParts.get(oid) ?? []\n const compIds = parentComponents.get(oid) ?? []\n if (compIds.length === 0) {\n // 父对象无 components(单网格对象):1 个打印单元,partId 取第一个 part。\n const p = partList[0]\n parts.push({\n partIndex: partIndex++,\n objectId: oid,\n partId: p?.partId ?? '0',\n name: stripExtension(p?.name ?? objMeta?.name ?? ''),\n extruder: p?.extruder ?? objMeta?.extruder ?? 1,\n plateId: objMeta?.plateId ?? 0,\n })\n leafParts.set(`${oid}:1`, parts[parts.length - 1])\n continue\n }\n for (let ci = 0; ci < compIds.length; ci++) {\n const p = partList[ci]\n const meta: BambuPartMeta = {\n partIndex: partIndex++,\n objectId: oid,\n partId: p?.partId ?? String(ci + 1),\n name: stripExtension(p?.name ?? objMeta?.name ?? ''),\n extruder: p?.extruder ?? objMeta?.extruder ?? 1,\n plateId: objMeta?.plateId ?? 0,\n }\n parts.push(meta)\n leafParts.set(`${oid}:${ci + 1}`, meta)\n }\n }\n\n return {\n filamentColors,\n filamentTypes,\n objects,\n parts,\n plates,\n modelMeta: modelMeta && Object.keys(modelMeta).length > 0 ? modelMeta : undefined,\n metadataEntries,\n thumbnailBytes,\n assembleTransforms: assembleTransforms.size > 0 ? assembleTransforms : undefined,\n importTransforms: importTransforms.size > 0 ? importTransforms : undefined,\n buildItems: buildItems.length > 0 ? buildItems : undefined,\n leafParts,\n }\n}\n\n/** Parse Bambu metadata from a `ThreemfArchive`'s `extraEntries`.\n *\n * @param archive - a `ThreemfArchive` produced by `parseThreemf`.\n * @returns the resolved `Bambu3mfMetadata`.\n */\nexport function parseBambu3mfFromArchive(archive: ThreemfArchive): Bambu3mfMetadata {\n return parseBambu3mfFromEntries(archive.extraEntries, archive.modelXml)\n}"]}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import { type UnitName } from '../units.js';
|
|
2
|
+
import type { ShapeMeta, FileMeta } from '../api/meta.js';
|
|
2
3
|
/** One parsed 3MF object instance: triangle soup in mm base (unit-scaled). */
|
|
3
4
|
export interface ThreemfObject {
|
|
4
|
-
/** The `<object id>` this instance instantiates. */
|
|
5
|
+
/** The `<object id>` this instance instantiates (leaf object id). */
|
|
5
6
|
id: number;
|
|
7
|
+
/**
|
|
8
|
+
* P4 Bambu:实例所属的最上层 build-item 父对象 id(组件容器逐层展开时保留
|
|
9
|
+
* 顶层父)。非 Bambu / resources 直出实例为 undefined。宿主据此把叶子
|
|
10
|
+
* object 关联到 model_settings.config 的 Bambu 对象(objectId 同源)。
|
|
11
|
+
*/
|
|
12
|
+
parentObjectId?: number;
|
|
13
|
+
/**
|
|
14
|
+
* P4 Bambu:父对象 `<components>` 中的 1-based 序号(父对象多子时区分)。
|
|
15
|
+
* 与 Bambu part 序号同源(Bambu 导出惯例:component 序 ↔ part 序)。
|
|
16
|
+
*/
|
|
17
|
+
componentIndex?: number;
|
|
6
18
|
/** The object's `<object name>` (Bambu exports a human label here). */
|
|
7
19
|
name?: string;
|
|
8
20
|
positions: Float32Array;
|
|
@@ -23,6 +35,26 @@ export interface ThreemfObject {
|
|
|
23
35
|
* `positions.length`.
|
|
24
36
|
*/
|
|
25
37
|
vertexColors?: Float32Array;
|
|
38
|
+
/**
|
|
39
|
+
* Per-triangle base-material groups (P4, 3MF Core `<triangle pid p1..p3>`
|
|
40
|
+
* with p1=p2=p3 referencing a `<basematerials>` base): maximal runs of
|
|
41
|
+
* consecutive triangles sharing one base index, each with that base's
|
|
42
|
+
* display color. Triangles with mixed p1/p2/p3 (vertex-attribute
|
|
43
|
+
* interpolation) are skipped. Multi-base objects surface here instead of a
|
|
44
|
+
* single `baseColor`.
|
|
45
|
+
*/
|
|
46
|
+
materialGroups?: Array<{
|
|
47
|
+
start: number;
|
|
48
|
+
count: number;
|
|
49
|
+
color: [number, number, number];
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* 零件级说明性元数据(设计文档 2026-10-05-meta §5.1):`name` 来自
|
|
53
|
+
* `<object name>`;`partNumber` 来自 `<object partnumber>`;`metadata` 来自
|
|
54
|
+
* `<object><metadatagroup><metadata name>…`(键保留命名空间前缀)。组件实例
|
|
55
|
+
* (component 容器)只带对所引用对象的 meta 拷贝。
|
|
56
|
+
*/
|
|
57
|
+
meta?: ShapeMeta;
|
|
26
58
|
}
|
|
27
59
|
/** Structured 3MF parse result. */
|
|
28
60
|
export interface ThreemfArchive {
|
|
@@ -32,6 +64,10 @@ export interface ThreemfArchive {
|
|
|
32
64
|
objects: ThreemfObject[];
|
|
33
65
|
/** Every non-model archive entry (key → raw bytes) for downstream consumers. */
|
|
34
66
|
extraEntries: Map<string, Uint8Array>;
|
|
67
|
+
/** P4:根 model 文档(3D/3dmodel.model)XML——Bambu 层解析 build/组件结构用。 */
|
|
68
|
+
modelXml?: string;
|
|
69
|
+
/** 整体级元数据(设计文档 2026-10-meta 表中的 3MF model context;`<model><metadata>`)。 */
|
|
70
|
+
fileMeta?: FileMeta;
|
|
35
71
|
}
|
|
36
72
|
/**
|
|
37
73
|
* Parse 3MF bytes into a structured archive.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threemf-loader.d.ts","sourceRoot":"","sources":["../../src/mesh/threemf-loader.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"threemf-loader.d.ts","sourceRoot":"","sources":["../../src/mesh/threemf-loader.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAyHtD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAA;IACV;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;IACpB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IACzF;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,IAAI,EAAE,QAAQ,CAAA;IACd,oFAAoF;IACpF,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,gFAAgF;IAChF,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACrC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAwpBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAwC/E"}
|