@faicad/faijs 0.22.2 → 0.29.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -28
- package/dist/api/api-namespace.d.ts +5 -5
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +4 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assert.d.ts +2 -2
- package/dist/api/assert.js +8 -8
- package/dist/api/assert.js.map +1 -1
- package/dist/api/asset.d.ts +1 -1
- package/dist/api/asset.js +2 -2
- package/dist/api/asset.js.map +1 -1
- package/dist/api/boolean.d.ts +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +128 -16
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts +14 -0
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/borrow-bridge.js +52 -0
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -0
- package/dist/api/cadquery-selectors/edge.d.ts +40 -0
- package/dist/api/cadquery-selectors/edge.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/edge.js +70 -0
- package/dist/api/cadquery-selectors/edge.js.map +1 -0
- package/dist/api/cadquery-selectors/entity.d.ts +121 -0
- package/dist/api/cadquery-selectors/entity.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/entity.js +167 -0
- package/dist/api/cadquery-selectors/entity.js.map +1 -0
- package/dist/api/cadquery-selectors/face.d.ts +33 -0
- package/dist/api/cadquery-selectors/face.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/face.js +353 -0
- package/dist/api/cadquery-selectors/face.js.map +1 -0
- package/dist/api/cadquery-selectors/grammar.d.ts +50 -0
- package/dist/api/cadquery-selectors/grammar.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/grammar.js +345 -0
- package/dist/api/cadquery-selectors/grammar.js.map +1 -0
- package/dist/api/cadquery-selectors/index.d.ts +18 -0
- package/dist/api/cadquery-selectors/index.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/index.js +17 -0
- package/dist/api/cadquery-selectors/index.js.map +1 -0
- package/dist/api/cadquery-selectors/predicates.d.ts +76 -0
- package/dist/api/cadquery-selectors/predicates.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/predicates.js +85 -0
- package/dist/api/cadquery-selectors/predicates.js.map +1 -0
- package/dist/api/cadquery-selectors/resolve.d.ts +41 -0
- package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/resolve.js +243 -0
- package/dist/api/cadquery-selectors/resolve.js.map +1 -0
- package/dist/api/cadquery-selectors/types.d.ts +96 -0
- package/dist/api/cadquery-selectors/types.d.ts.map +1 -0
- package/dist/api/cadquery-selectors/types.js +11 -0
- package/dist/api/cadquery-selectors/types.js.map +1 -0
- package/dist/api/chamfer.d.ts +13 -5
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +63 -7
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +1 -1
- package/dist/api/compound-geom.js +1 -1
- package/dist/api/compound-geom.js.map +1 -1
- package/dist/api/draft.d.ts +1 -1
- package/dist/api/draft.js +1 -1
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.d.ts +1 -1
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +11 -3
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts +1 -1
- package/dist/api/engrave.js +7 -7
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts +6 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +59 -5
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts +1 -1
- package/dist/api/face-ref.js +1 -1
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.js +1 -1
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +1 -1
- package/dist/api/fillet-variable.js +1 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +28 -8
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +64 -9
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/geom.d.ts +1 -1
- package/dist/api/geom.js +1 -1
- package/dist/api/geom.js.map +1 -1
- package/dist/api/helix.d.ts +1 -1
- package/dist/api/helix.js +1 -1
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-brep.d.ts +20 -2
- package/dist/api/import-brep.d.ts.map +1 -1
- package/dist/api/import-brep.js +28 -3
- package/dist/api/import-brep.js.map +1 -1
- package/dist/api/import-step.d.ts +17 -2
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +23 -3
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.d.ts +2 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +5 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.js +1 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/mesh-solid-op.d.ts +236 -0
- package/dist/api/internal/mesh-solid-op.d.ts.map +1 -0
- package/dist/api/internal/mesh-solid-op.js +352 -0
- package/dist/api/internal/mesh-solid-op.js.map +1 -0
- package/dist/api/internal/svg-asset-resolver.d.ts +1 -1
- package/dist/api/internal/svg-asset-resolver.js +1 -1
- package/dist/api/internal/svg-asset-resolver.js.map +1 -1
- package/dist/api/knurl.d.ts +1 -1
- package/dist/api/knurl.js +2 -2
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +1 -1
- package/dist/api/loft.js +1 -1
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +9 -5
- package/dist/api/measurement/index.d.ts.map +1 -1
- package/dist/api/measurement/index.js +47 -20
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/pattern.d.ts +5 -3
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +32 -4
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.d.ts +1 -1
- package/dist/api/place.js +1 -1
- package/dist/api/place.js.map +1 -1
- package/dist/api/primitives.d.ts +1 -1
- package/dist/api/primitives.js +2 -2
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts +39 -12
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +4 -4
- package/dist/api/profile.js.map +1 -1
- package/dist/api/reconcile.d.ts +1 -1
- package/dist/api/reconcile.js +1 -1
- package/dist/api/reconcile.js.map +1 -1
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +122 -1
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.js +3 -3
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts +1 -1
- package/dist/api/sdf.js +2 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/section-by-plane.d.ts +1 -1
- package/dist/api/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +2 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.d.ts +11 -4
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +53 -7
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +41 -0
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +100 -1
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts +7 -5
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +6 -7
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/split-by-plane.d.ts +1 -1
- package/dist/api/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +2 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +2 -2
- package/dist/api/split.js.map +1 -1
- package/dist/api/sweep.d.ts +1 -1
- package/dist/api/sweep.js +1 -1
- 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/topo-resolve.d.ts +74 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +180 -2
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +5 -1
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +62 -11
- package/dist/api/transform.js.map +1 -1
- package/dist/api/wire.d.ts +1 -1
- package/dist/api/wire.js +1 -1
- package/dist/api/wire.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +9 -7
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +23 -24
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +5 -4
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +6 -5
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/effective-deflection.d.ts +35 -0
- package/dist/brep/effective-deflection.d.ts.map +1 -0
- package/dist/brep/effective-deflection.js +49 -0
- package/dist/brep/effective-deflection.js.map +1 -0
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +27 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +18 -0
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +46 -1
- 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 +3 -1
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +29 -7
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +24 -1
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +24 -0
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +54 -3
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js +10 -0
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +6 -5
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +1 -1
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +20 -1
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +1 -1
- package/dist/brep/handle-bridge.js +1 -1
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/mesh-solid.d.ts +218 -0
- package/dist/brep/mesh-solid.d.ts.map +1 -0
- package/dist/brep/mesh-solid.js +229 -0
- package/dist/brep/mesh-solid.js.map +1 -0
- package/dist/brep/text/fontRegistry.d.ts +32 -1
- package/dist/brep/text/fontRegistry.d.ts.map +1 -1
- package/dist/brep/text/fontRegistry.js +51 -1
- package/dist/brep/text/fontRegistry.js.map +1 -1
- package/dist/brep/text/text-to-solid.d.ts.map +1 -1
- package/dist/brep/text/text-to-solid.js +8 -3
- package/dist/brep/text/text-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +18 -2
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +449 -123
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +8 -0
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +10 -0
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/browser-host/browser-font-provider.d.ts +12 -0
- package/dist/browser-host/browser-font-provider.d.ts.map +1 -1
- package/dist/browser-host/browser-font-provider.js +25 -0
- package/dist/browser-host/browser-font-provider.js.map +1 -1
- package/dist/browser.d.ts +6 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +10 -3
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +28 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +119 -4
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +15 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +33 -1
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/preview-exec.d.ts +4 -4
- package/dist/cad-runtime/preview-exec.js +2 -2
- package/dist/cad-runtime/preview-exec.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +42 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +68 -5
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +15 -1
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +10 -1
- 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/adapt.d.ts +39 -4
- package/dist/geometry2d/adapt.d.ts.map +1 -1
- package/dist/geometry2d/adapt.js +14 -3
- package/dist/geometry2d/adapt.js.map +1 -1
- package/dist/geometry2d/blueprint.d.ts +2 -2
- package/dist/geometry2d/blueprint.js +2 -2
- package/dist/geometry2d/blueprint.js.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +18 -8
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.js +65 -12
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +17 -0
- package/dist/geometry2d/bridge/plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/plane.js +22 -0
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +25 -0
- package/dist/geometry2d/curve2d.d.ts.map +1 -1
- package/dist/geometry2d/curve2d.js +41 -5
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/io/bytes-node.d.ts +11 -0
- package/dist/io/bytes-node.d.ts.map +1 -0
- package/dist/io/bytes-node.js +28 -0
- package/dist/io/bytes-node.js.map +1 -0
- package/dist/io/bytes.d.ts +33 -0
- package/dist/io/bytes.d.ts.map +1 -0
- package/dist/io/bytes.js +41 -0
- package/dist/io/bytes.js.map +1 -0
- package/dist/io/fai-zip/container-read.d.ts +102 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -0
- package/dist/io/fai-zip/container-read.js +305 -0
- package/dist/io/fai-zip/container-read.js.map +1 -0
- package/dist/io/fai-zip/container-write.d.ts +70 -0
- package/dist/io/fai-zip/container-write.d.ts.map +1 -0
- package/dist/io/fai-zip/container-write.js +186 -0
- package/dist/io/fai-zip/container-write.js.map +1 -0
- package/dist/io/fai-zip/container.d.ts +107 -0
- package/dist/io/fai-zip/container.d.ts.map +1 -0
- package/dist/io/fai-zip/container.js +89 -0
- package/dist/io/fai-zip/container.js.map +1 -0
- package/dist/io/fai-zip/index.d.ts +18 -0
- package/dist/io/fai-zip/index.d.ts.map +1 -0
- package/dist/io/fai-zip/index.js +4 -0
- package/dist/io/fai-zip/index.js.map +1 -0
- package/dist/io/index.d.ts +10 -0
- package/dist/io/index.d.ts.map +1 -0
- package/dist/io/index.js +13 -0
- package/dist/io/index.js.map +1 -0
- package/dist/io/zip.d.ts +68 -0
- package/dist/io/zip.d.ts.map +1 -0
- package/dist/io/zip.js +147 -0
- package/dist/io/zip.js.map +1 -0
- package/dist/lang/code-to-args.d.ts +1 -1
- package/dist/lang/code-to-args.js +1 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/statement-summary.d.ts +1 -1
- package/dist/lang/statement-summary.js +1 -1
- package/dist/lang/statement-summary.js.map +1 -1
- package/dist/lang/types.d.ts +1 -1
- package/dist/lang/types.js +1 -1
- package/dist/lang/types.js.map +1 -1
- package/dist/mesh/index.d.ts +2 -1
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +2 -1
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +7 -0
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +14 -17
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/reconcile.d.ts +1 -1
- package/dist/mesh/reconcile.js +1 -1
- package/dist/mesh/reconcile.js.map +1 -1
- package/dist/mesh/rigid-transform.d.ts +3 -3
- package/dist/mesh/rigid-transform.js +3 -3
- package/dist/mesh/rigid-transform.js.map +1 -1
- package/dist/mesh/stl-unit.d.ts +24 -0
- package/dist/mesh/stl-unit.d.ts.map +1 -0
- package/dist/mesh/stl-unit.js +17 -0
- package/dist/mesh/stl-unit.js.map +1 -0
- package/dist/mesh/threemf-bambu.d.ts +142 -0
- package/dist/mesh/threemf-bambu.d.ts.map +1 -0
- package/dist/mesh/threemf-bambu.js +334 -0
- package/dist/mesh/threemf-bambu.js.map +1 -0
- package/dist/mesh/threemf-loader.d.ts +42 -7
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +565 -100
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/threemf-view.d.ts +71 -0
- package/dist/mesh/threemf-view.d.ts.map +1 -0
- package/dist/mesh/threemf-view.js +100 -0
- package/dist/mesh/threemf-view.js.map +1 -0
- package/dist/node-host/cli.d.ts +44 -6
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +76 -26
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/font-family-index.d.ts +93 -0
- package/dist/node-host/font-family-index.d.ts.map +1 -0
- package/dist/node-host/font-family-index.js +273 -0
- package/dist/node-host/font-family-index.js.map +1 -0
- package/dist/node-host/fs-asset-resolver.d.ts +8 -3
- package/dist/node-host/fs-asset-resolver.d.ts.map +1 -1
- package/dist/node-host/fs-asset-resolver.js +13 -5
- package/dist/node-host/fs-asset-resolver.js.map +1 -1
- package/dist/node-host/index.d.ts +8 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +1 -0
- package/dist/node-host/index.js.map +1 -1
- package/dist/node-host/node-font-provider.d.ts +28 -0
- package/dist/node-host/node-font-provider.d.ts.map +1 -1
- package/dist/node-host/node-font-provider.js +49 -0
- package/dist/node-host/node-font-provider.js.map +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +35 -2
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +18 -13
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +18 -31
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-kernel/stepColorParser.d.ts +18 -0
- package/dist/occt-kernel/stepColorParser.d.ts.map +1 -1
- package/dist/occt-kernel/stepColorParser.js +38 -0
- package/dist/occt-kernel/stepColorParser.js.map +1 -1
- package/dist/occt-kernel/topologyExt.d.ts +1 -1
- package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
- package/dist/occt-kernel/topologyExt.js +4 -5
- package/dist/occt-kernel/topologyExt.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +2 -15
- package/dist/primitives/text/cjk-font.d.ts.map +1 -1
- package/dist/primitives/text/cjk-font.js +13 -1
- package/dist/primitives/text/cjk-font.js.map +1 -1
- package/dist/runtime-state.d.ts +85 -9
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +72 -2
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +3 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +5 -5
- package/dist/sdk.js.map +1 -1
- package/dist/shape.d.ts +97 -2
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +126 -1
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/lineage.d.ts +6 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js +8 -0
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/topology/naming/resolve-edge.d.ts +20 -1
- package/dist/topology/naming/resolve-edge.d.ts.map +1 -1
- package/dist/topology/naming/resolve-edge.js +54 -20
- package/dist/topology/naming/resolve-edge.js.map +1 -1
- package/dist/weapp.d.ts +6 -2
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +7 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +18 -2
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
const KNOWN_EXTENSIONS = new Set(['stl', 'step', 'stp', '3mf']);
|
|
2
|
+
/** Remove a known 3D file extension from a filename.
|
|
3
|
+
*
|
|
4
|
+
* @param name - the entry name, possibly ending in `.3mf`, `.stl`, `.step`, `.stp`
|
|
5
|
+
* (optionally suffixed `_<n>` for multi-plate objects).
|
|
6
|
+
* @returns the name without the known extension.
|
|
7
|
+
*/
|
|
8
|
+
export function stripExtension(name) {
|
|
9
|
+
const extPattern = Array.from(KNOWN_EXTENSIONS).join('|');
|
|
10
|
+
const multiRe = new RegExp(`^(.+)\\.(?:${extPattern})_(\\d+)$`, 'i');
|
|
11
|
+
const multiMatch = name.match(multiRe);
|
|
12
|
+
if (multiMatch)
|
|
13
|
+
return `${multiMatch[1]}_${multiMatch[2]}`;
|
|
14
|
+
const singleRe = new RegExp(`^(.+)\\.(?:${extPattern})$`, 'i');
|
|
15
|
+
const singleMatch = name.match(singleRe);
|
|
16
|
+
if (singleMatch)
|
|
17
|
+
return singleMatch[1];
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
/** Parse `<build>` section object IDs and transforms from 3D/3dmodel.model XML.
|
|
21
|
+
*
|
|
22
|
+
* @param xml - the raw 3D model XML text.
|
|
23
|
+
* @returns the build items (objectId + optional print transform).
|
|
24
|
+
*/
|
|
25
|
+
export function parse3mfBuild(xml) {
|
|
26
|
+
const items = [];
|
|
27
|
+
const itemRe = /<item\s+objectid="(\d+)"[^>]*\/?>/g;
|
|
28
|
+
let m;
|
|
29
|
+
while ((m = itemRe.exec(xml)) !== null) {
|
|
30
|
+
const objectId = m[1];
|
|
31
|
+
const transformMatch = m[0].match(/transform="([^"]*)"/);
|
|
32
|
+
const transform = transformMatch ? transformMatch[1].split(/\s+/).map(Number) : null;
|
|
33
|
+
items.push({ objectId, transform });
|
|
34
|
+
}
|
|
35
|
+
return items;
|
|
36
|
+
}
|
|
37
|
+
/** Parse model-level `<metadata name="...">…</metadata>` tags (3MF standard).
|
|
38
|
+
*
|
|
39
|
+
* @param xml - the raw 3D model XML text.
|
|
40
|
+
* @returns the recognised model meta fields plus every raw metadata entry.
|
|
41
|
+
*/
|
|
42
|
+
export function parseModelMeta(xml) {
|
|
43
|
+
const meta = {};
|
|
44
|
+
const entries = [];
|
|
45
|
+
const re = /<metadata\s+name="([^"]*)"[^>]*>([\s\S]*?)<\/metadata>/gi;
|
|
46
|
+
let m;
|
|
47
|
+
while ((m = re.exec(xml)) !== null) {
|
|
48
|
+
const name = m[1];
|
|
49
|
+
const value = m[2].trim();
|
|
50
|
+
entries.push({ name, value });
|
|
51
|
+
if (name === 'Title')
|
|
52
|
+
meta.title = value;
|
|
53
|
+
else if (name === 'Designer')
|
|
54
|
+
meta.designer = value;
|
|
55
|
+
else if (name === 'Description')
|
|
56
|
+
meta.description = value;
|
|
57
|
+
else if (name === 'License')
|
|
58
|
+
meta.license = value;
|
|
59
|
+
}
|
|
60
|
+
return { modelMeta: Object.keys(meta).length > 0 ? meta : undefined, metadataEntries: entries };
|
|
61
|
+
}
|
|
62
|
+
/** Known 3MF thumbnail PNG paths, in priority order. */
|
|
63
|
+
const THUMBNAIL_PATHS = [
|
|
64
|
+
'MetaData/thumbnail.png',
|
|
65
|
+
'Auxiliaries/.thumbnails/thumbnail_3mf.png',
|
|
66
|
+
'Auxiliaries/.thumbnails/thumbnail_middle.png',
|
|
67
|
+
'Auxiliaries/.thumbnails/thumbnail_small.png',
|
|
68
|
+
];
|
|
69
|
+
/** Extract a standard 3MF thumbnail PNG from an entry table (raw bytes).
|
|
70
|
+
*
|
|
71
|
+
* @param entries - the unzipped 3MF entry table (path -> bytes).
|
|
72
|
+
* @returns the PNG bytes of the first matching thumbnail, or undefined.
|
|
73
|
+
*/
|
|
74
|
+
export function extractThumbnailBytes(entries) {
|
|
75
|
+
const keys = [...entries.keys()];
|
|
76
|
+
for (const path of THUMBNAIL_PATHS) {
|
|
77
|
+
const entry = keys.find(k => k === path);
|
|
78
|
+
if (entry)
|
|
79
|
+
return entries.get(entry);
|
|
80
|
+
}
|
|
81
|
+
const metaDataEntry = keys.find(k => /^metadata\/thumbnail\.png$/i.test(k));
|
|
82
|
+
if (metaDataEntry)
|
|
83
|
+
return entries.get(metaDataEntry);
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
/** Parse Bambu Lab metadata from an already-unzipped entry table.
|
|
87
|
+
*
|
|
88
|
+
* @param extraEntries - the 3MF entry table excluding the geometry model shared
|
|
89
|
+
* with `parseThreemf` (project_settings / model_settings configs + thumbnails).
|
|
90
|
+
* @returns the resolved `Bambu3mfMetadata`.
|
|
91
|
+
*/
|
|
92
|
+
export function parseBambu3mfFromEntries(extraEntries) {
|
|
93
|
+
const decoder = new TextDecoder();
|
|
94
|
+
const filamentColors = [];
|
|
95
|
+
const filamentTypes = [];
|
|
96
|
+
const objects = new Map();
|
|
97
|
+
const plates = new Map();
|
|
98
|
+
const objectParts = new Map();
|
|
99
|
+
const assembleTransforms = new Map();
|
|
100
|
+
const importTransforms = new Map();
|
|
101
|
+
// ---- 1. project_settings.config (JSON) ----
|
|
102
|
+
let bedSize;
|
|
103
|
+
const projKey = [...extraEntries.keys()].find(f => f.endsWith('project_settings.config'));
|
|
104
|
+
if (projKey) {
|
|
105
|
+
try {
|
|
106
|
+
const json = JSON.parse(decoder.decode(extraEntries.get(projKey)));
|
|
107
|
+
const rawColors = json.filament_colour ?? json.filament_color ?? [];
|
|
108
|
+
const cArr = Array.isArray(rawColors) ? rawColors : [rawColors];
|
|
109
|
+
for (const c of cArr) {
|
|
110
|
+
filamentColors.push(typeof c === 'string' ? c.replace(/^"(.*)"$/, '$1').trim() : String(c));
|
|
111
|
+
}
|
|
112
|
+
const fTypes = json.filament_type ?? [];
|
|
113
|
+
if (Array.isArray(fTypes)) {
|
|
114
|
+
for (const t of fTypes)
|
|
115
|
+
filamentTypes.push(typeof t === 'string' ? t : String(t));
|
|
116
|
+
}
|
|
117
|
+
if (json.printable_area) {
|
|
118
|
+
const area = Array.isArray(json.printable_area) ? json.printable_area : [json.printable_area];
|
|
119
|
+
let maxX = 0;
|
|
120
|
+
let maxY = 0;
|
|
121
|
+
for (const pt of area) {
|
|
122
|
+
const parts = String(pt).split('x');
|
|
123
|
+
if (parts.length === 2) {
|
|
124
|
+
const x = parseFloat(parts[0]);
|
|
125
|
+
const y = parseFloat(parts[1]);
|
|
126
|
+
if (Number.isFinite(x) && x > maxX)
|
|
127
|
+
maxX = x;
|
|
128
|
+
if (Number.isFinite(y) && y > maxY)
|
|
129
|
+
maxY = y;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const height = parseFloat(String(json.printable_height ?? '0'));
|
|
133
|
+
if (maxX > 0 && maxY > 0 && Number.isFinite(height) && height > 0) {
|
|
134
|
+
bedSize = { width: maxX, depth: maxY, height };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* ignore malformed project settings */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ---- 2. model_settings.config (XML) ----
|
|
143
|
+
const msKey = [...extraEntries.keys()].find(f => f.endsWith('model_settings.config'));
|
|
144
|
+
if (msKey) {
|
|
145
|
+
const xml = decoder.decode(extraEntries.get(msKey));
|
|
146
|
+
const objBlockRe = /<object\s+id="(\d+)"[^>]*>([\s\S]*?)<\/object>/gi;
|
|
147
|
+
let objMatch;
|
|
148
|
+
while ((objMatch = objBlockRe.exec(xml)) !== null) {
|
|
149
|
+
const oid = objMatch[1];
|
|
150
|
+
const body = objMatch[2];
|
|
151
|
+
const topLevel = body.replace(/<part[^>]*>[\s\S]*?<\/part>/gi, '');
|
|
152
|
+
let objName = '';
|
|
153
|
+
let objExtruder = 1;
|
|
154
|
+
const metaRe = /<metadata\s+key="([^"]*)"\s+value="([^"]*)"\s*\/?>/gi;
|
|
155
|
+
let mm;
|
|
156
|
+
while ((mm = metaRe.exec(topLevel)) !== null) {
|
|
157
|
+
if (mm[1] === 'name')
|
|
158
|
+
objName = mm[2];
|
|
159
|
+
if (mm[1] === 'extruder')
|
|
160
|
+
objExtruder = parseInt(mm[2], 10) || 1;
|
|
161
|
+
}
|
|
162
|
+
objects.set(oid, { objectId: oid, name: objName, extruder: objExtruder, plateId: 0 });
|
|
163
|
+
const partList = [];
|
|
164
|
+
const partBlockRe = /<part\s+id="(\d+)"[^>]*>([\s\S]*?)<\/part>/gi;
|
|
165
|
+
let pm;
|
|
166
|
+
while ((pm = partBlockRe.exec(body)) !== null) {
|
|
167
|
+
const pid = pm[1];
|
|
168
|
+
const partBody = pm[2];
|
|
169
|
+
let partName = objName;
|
|
170
|
+
let partExtruder = objExtruder;
|
|
171
|
+
const pmRe = /<metadata\s+key="([^"]*)"\s+value="([^"]*)"\s*\/?>/gi;
|
|
172
|
+
let pmm;
|
|
173
|
+
while ((pmm = pmRe.exec(partBody)) !== null) {
|
|
174
|
+
if (pmm[1] === 'name')
|
|
175
|
+
partName = pmm[2];
|
|
176
|
+
if (pmm[1] === 'extruder')
|
|
177
|
+
partExtruder = parseInt(pmm[2], 10) || objExtruder;
|
|
178
|
+
}
|
|
179
|
+
partList.push({ partId: pid, name: partName, extruder: partExtruder });
|
|
180
|
+
}
|
|
181
|
+
if (partList.length === 0) {
|
|
182
|
+
partList.push({ partId: '0', name: objName, extruder: objExtruder });
|
|
183
|
+
}
|
|
184
|
+
objectParts.set(oid, partList);
|
|
185
|
+
}
|
|
186
|
+
// 2c. <plate> blocks
|
|
187
|
+
const plateBlockRe = /<plate>([\s\S]*?)<\/plate>/gi;
|
|
188
|
+
let plateMatch;
|
|
189
|
+
while ((plateMatch = plateBlockRe.exec(xml)) !== null) {
|
|
190
|
+
const plateBody = plateMatch[1];
|
|
191
|
+
let platerId = 0;
|
|
192
|
+
let platerName = '';
|
|
193
|
+
const pmRe2 = /<metadata\s+key="([^"]*)"\s+value="([^"]*)"\s*\/?>/gi;
|
|
194
|
+
let m2;
|
|
195
|
+
while ((m2 = pmRe2.exec(plateBody)) !== null) {
|
|
196
|
+
if (m2[1] === 'plater_id')
|
|
197
|
+
platerId = parseInt(m2[2], 10) || 0;
|
|
198
|
+
if (m2[1] === 'plater_name')
|
|
199
|
+
platerName = m2[2];
|
|
200
|
+
}
|
|
201
|
+
if (platerId > 0) {
|
|
202
|
+
plates.set(platerId, { plateId: platerId, plateName: platerName, size: bedSize });
|
|
203
|
+
}
|
|
204
|
+
const instRe = /<model_instance>([\s\S]*?)<\/model_instance>/gi;
|
|
205
|
+
let im;
|
|
206
|
+
while ((im = instRe.exec(plateBody)) !== null) {
|
|
207
|
+
const oidMatch = /<metadata\s+key="object_id"\s+value="(\d+)"\s*\/?>/i.exec(im[1]);
|
|
208
|
+
if (oidMatch) {
|
|
209
|
+
const obj = objects.get(oidMatch[1]);
|
|
210
|
+
if (obj)
|
|
211
|
+
obj.plateId = platerId;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// 2d. <assemble> — assembly transforms
|
|
216
|
+
const assembleBlock = xml.match(/<assemble>([\s\S]*?)<\/assemble>/i);
|
|
217
|
+
if (assembleBlock) {
|
|
218
|
+
const assembleItemRe = /<assemble_item\s+([^>]*)\/?>/gi;
|
|
219
|
+
let am;
|
|
220
|
+
while ((am = assembleItemRe.exec(assembleBlock[1])) !== null) {
|
|
221
|
+
const attrs = am[1];
|
|
222
|
+
const oidMatch = /object_id="(\d+)"/.exec(attrs);
|
|
223
|
+
const xformMatch = /transform="([^"]*)"/.exec(attrs);
|
|
224
|
+
const offsetMatch = /offset="([^"]*)"/.exec(attrs);
|
|
225
|
+
const oid = oidMatch?.[1];
|
|
226
|
+
if (oid && xformMatch) {
|
|
227
|
+
const xform = xformMatch[1].split(/\s+/).map(Number);
|
|
228
|
+
const offsetArr = offsetMatch ? offsetMatch[1].split(/\s+/).map(Number) : [0, 0, 0];
|
|
229
|
+
if (xform.length === 12 && offsetArr.length === 3) {
|
|
230
|
+
assembleTransforms.set(oid, {
|
|
231
|
+
objectId: oid,
|
|
232
|
+
transform: xform,
|
|
233
|
+
offset: offsetArr,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// 2e. <part> matrix metadata (per-part import transforms)
|
|
240
|
+
const importObjBlockRe = /<object\s+id="(\d+)"[^>]*>([\s\S]*?)<\/object>/gi;
|
|
241
|
+
let importObjMatch;
|
|
242
|
+
while ((importObjMatch = importObjBlockRe.exec(xml)) !== null) {
|
|
243
|
+
const oid = importObjMatch[1];
|
|
244
|
+
const body = importObjMatch[2];
|
|
245
|
+
const importPartRe = /<part\s+id="(\d+)"[^>]*>([\s\S]*?)<\/part>/gi;
|
|
246
|
+
let ipm;
|
|
247
|
+
while ((ipm = importPartRe.exec(body)) !== null) {
|
|
248
|
+
const pid = ipm[1];
|
|
249
|
+
let matrix;
|
|
250
|
+
let sox = 0;
|
|
251
|
+
let soy = 0;
|
|
252
|
+
let soz = 0;
|
|
253
|
+
const imRe = /<metadata\s+key="([^"]*)"\s+value="([^"]*)"\s*\/?>/gi;
|
|
254
|
+
let imm;
|
|
255
|
+
while ((imm = imRe.exec(ipm[2])) !== null) {
|
|
256
|
+
if (imm[1] === 'matrix')
|
|
257
|
+
matrix = imm[2].split(/\s+/).map(Number);
|
|
258
|
+
if (imm[1] === 'source_offset_x')
|
|
259
|
+
sox = parseFloat(imm[2]) || 0;
|
|
260
|
+
if (imm[1] === 'source_offset_y')
|
|
261
|
+
soy = parseFloat(imm[2]) || 0;
|
|
262
|
+
if (imm[1] === 'source_offset_z')
|
|
263
|
+
soz = parseFloat(imm[2]) || 0;
|
|
264
|
+
}
|
|
265
|
+
if (matrix && matrix.length === 16) {
|
|
266
|
+
importTransforms.set(`${oid}:${pid}`, {
|
|
267
|
+
objectId: oid,
|
|
268
|
+
partId: pid,
|
|
269
|
+
matrix,
|
|
270
|
+
sourceOffset: [sox, soy, soz],
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// ---- 3. Model-level metadata + build items from 3D/3dmodel.model ----
|
|
277
|
+
const thumbnailBytes = extractThumbnailBytes(extraEntries);
|
|
278
|
+
let modelMeta;
|
|
279
|
+
let metadataEntries = [];
|
|
280
|
+
let buildItems = [];
|
|
281
|
+
const modelFile = [...extraEntries.keys()].find(f => f.endsWith('/3dmodel.model') || f === '3D/3dmodel.model');
|
|
282
|
+
if (modelFile) {
|
|
283
|
+
const modelXml = decoder.decode(extraEntries.get(modelFile));
|
|
284
|
+
const resourcesStart = modelXml.indexOf('<resources>');
|
|
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);
|
|
290
|
+
modelMeta = { ...parsedHead.modelMeta, ...parsedTail.modelMeta };
|
|
291
|
+
metadataEntries = [...parsedHead.metadataEntries, ...parsedTail.metadataEntries];
|
|
292
|
+
buildItems = parse3mfBuild(tail);
|
|
293
|
+
}
|
|
294
|
+
// ---- 4. Ordered flat parts list ----
|
|
295
|
+
const parts = [];
|
|
296
|
+
let partIndex = 0;
|
|
297
|
+
for (const item of buildItems) {
|
|
298
|
+
const oid = item.objectId;
|
|
299
|
+
const objMeta = objects.get(oid);
|
|
300
|
+
const partList = objectParts.get(oid) ?? [];
|
|
301
|
+
for (const p of partList) {
|
|
302
|
+
parts.push({
|
|
303
|
+
partIndex: partIndex++,
|
|
304
|
+
objectId: oid,
|
|
305
|
+
partId: p.partId,
|
|
306
|
+
name: stripExtension(p.name),
|
|
307
|
+
extruder: p.extruder,
|
|
308
|
+
plateId: objMeta?.plateId ?? 0,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
filamentColors,
|
|
314
|
+
filamentTypes,
|
|
315
|
+
objects,
|
|
316
|
+
parts,
|
|
317
|
+
plates,
|
|
318
|
+
modelMeta: modelMeta && Object.keys(modelMeta).length > 0 ? modelMeta : undefined,
|
|
319
|
+
metadataEntries,
|
|
320
|
+
thumbnailBytes,
|
|
321
|
+
assembleTransforms: assembleTransforms.size > 0 ? assembleTransforms : undefined,
|
|
322
|
+
importTransforms: importTransforms.size > 0 ? importTransforms : undefined,
|
|
323
|
+
buildItems: buildItems.length > 0 ? buildItems : undefined,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/** Parse Bambu metadata from a `ThreemfArchive`'s `extraEntries`.
|
|
327
|
+
*
|
|
328
|
+
* @param archive - a `ThreemfArchive` produced by `parseThreemf`.
|
|
329
|
+
* @returns the resolved `Bambu3mfMetadata`.
|
|
330
|
+
*/
|
|
331
|
+
export function parseBambu3mfFromArchive(archive) {
|
|
332
|
+
return parseBambu3mfFromEntries(archive.extraEntries);
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=threemf-bambu.js.map
|
|
@@ -0,0 +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,15 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { type UnitName } from '../units.js';
|
|
2
|
+
/** One parsed 3MF object instance: triangle soup in mm base (unit-scaled). */
|
|
3
|
+
export interface ThreemfObject {
|
|
4
|
+
/** The `<object id>` this instance instantiates. */
|
|
5
|
+
id: number;
|
|
6
|
+
/** The object's `<object name>` (Bambu exports a human label here). */
|
|
7
|
+
name?: string;
|
|
3
8
|
positions: Float32Array;
|
|
4
9
|
indices: Uint32Array;
|
|
5
|
-
/**
|
|
6
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Basematerials display color, `[r, g, b]` in 0..1 (sRGB components as
|
|
12
|
+
* written in the file, matching the host's `setStyle(…, SRGBColorSpace)`).
|
|
13
|
+
* Set when every triangle of the object references the *same* base index;
|
|
14
|
+
* multi-base objects cannot be expressed by a single color → undefined
|
|
15
|
+
* (host falls back to the default material).
|
|
16
|
+
*/
|
|
17
|
+
baseColor?: readonly [number, number, number];
|
|
18
|
+
/**
|
|
19
|
+
* Colorgroup vertex colors, one RGB triple per emitted vertex — the geometry
|
|
20
|
+
* is *expanded* (each triangle owns 3 independent vertices, indices are
|
|
21
|
+
* sequential) whenever a colorgroup is referenced, so per-triangle
|
|
22
|
+
* p1/p2/p3 colors survive without shared-vertex conflicts. Length equals
|
|
23
|
+
* `positions.length`.
|
|
24
|
+
*/
|
|
25
|
+
vertexColors?: Float32Array;
|
|
26
|
+
}
|
|
27
|
+
/** Structured 3MF parse result. */
|
|
28
|
+
export interface ThreemfArchive {
|
|
29
|
+
/** The declared `<model unit>` mapped to a faijs UnitName. */
|
|
30
|
+
unit: UnitName;
|
|
31
|
+
/** One object per build `<item>` (transform baked), or per `<resources>` object. */
|
|
32
|
+
objects: ThreemfObject[];
|
|
33
|
+
/** Every non-model archive entry (key → raw bytes) for downstream consumers. */
|
|
34
|
+
extraEntries: Map<string, Uint8Array>;
|
|
7
35
|
}
|
|
8
36
|
/**
|
|
9
|
-
* Parse 3MF bytes into a
|
|
37
|
+
* Parse 3MF bytes into a structured archive.
|
|
38
|
+
*
|
|
39
|
+
* Supports Bambu's multi-file layout: `3D/3dmodel.model` (root, holds the
|
|
40
|
+
* `<build>` and component-container skeletons) plus per-object sub-models
|
|
41
|
+
* `3D/Objects/*.model` whose `<resources>` are merged by object id
|
|
42
|
+
* (sub-models first, root last — root wins collisions).
|
|
43
|
+
*
|
|
10
44
|
* @param buffer - the raw .3mf (ZIP) bytes.
|
|
11
|
-
* @returns
|
|
45
|
+
* @returns an `ThreemfArchive` with mm-base per-instance objects, the declared
|
|
46
|
+
* source unit, and every non-model archive entry.
|
|
12
47
|
* @throws when the buffer is not a 3MF/ZIP archive or the unit is invalid.
|
|
13
48
|
*/
|
|
14
|
-
export declare function parseThreemf(buffer: ArrayBuffer): Promise<
|
|
49
|
+
export declare function parseThreemf(buffer: ArrayBuffer): Promise<ThreemfArchive>;
|
|
15
50
|
//# sourceMappingURL=threemf-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threemf-loader.d.ts","sourceRoot":"","sources":["../../src/mesh/threemf-loader.ts"],"names":[],"mappings":"
|
|
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;AAmHpD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,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;CAC5B;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;CACtC;AA8dD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAgC/E"}
|