@onerjs/serializers 8.45.9 → 8.46.2

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.
Files changed (117) hide show
  1. package/3MF/3mfSerializer.js.map +1 -1
  2. package/3MF/core/model/3mf.builder.d.ts +4 -7
  3. package/3MF/core/model/3mf.builder.js +2 -1
  4. package/3MF/core/model/3mf.builder.js.map +1 -1
  5. package/3MF/core/model/3mf.d.ts +1 -2
  6. package/3MF/core/model/3mf.js +1 -1
  7. package/3MF/core/model/3mf.js.map +1 -1
  8. package/3MF/core/model/3mf.opc.d.ts +2 -2
  9. package/3MF/core/model/3mf.opc.interfaces.d.ts +1 -1
  10. package/3MF/core/model/3mf.opc.interfaces.js.map +1 -1
  11. package/3MF/core/model/3mf.opc.js +1 -1
  12. package/3MF/core/model/3mf.opc.js.map +1 -1
  13. package/3MF/core/model/3mf.serializer.d.ts +1 -2
  14. package/3MF/core/model/3mf.serializer.js.map +1 -1
  15. package/3MF/core/xml/xml.builder.bytes.d.ts +1 -1
  16. package/3MF/core/xml/xml.builder.bytes.js.map +1 -1
  17. package/3MF/core/xml/xml.builder.d.ts +1 -1
  18. package/3MF/core/xml/xml.builder.js.map +1 -1
  19. package/3MF/core/xml/xml.builder.string.d.ts +1 -1
  20. package/3MF/core/xml/xml.builder.string.js.map +1 -1
  21. package/3MF/core/xml/xml.interfaces.d.ts +1 -1
  22. package/3MF/core/xml/xml.interfaces.js.map +1 -1
  23. package/3MF/core/xml/xml.serializer.format.d.ts +1 -1
  24. package/3MF/core/xml/xml.serializer.format.js.map +1 -1
  25. package/BVH/bvhSerializer.d.ts +1 -1
  26. package/BVH/bvhSerializer.js.map +1 -1
  27. package/OBJ/objSerializer.d.ts +1 -1
  28. package/OBJ/objSerializer.js.map +1 -1
  29. package/USDZ/usdzExporter.d.ts +2 -2
  30. package/USDZ/usdzExporter.js.map +1 -1
  31. package/exportUtils.d.ts +1 -1
  32. package/exportUtils.js.map +1 -1
  33. package/glTF/2.0/Extensions/EXT_lights_area.d.ts +4 -4
  34. package/glTF/2.0/Extensions/EXT_lights_area.js.map +1 -1
  35. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +5 -5
  36. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  37. package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +1 -1
  38. package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -1
  39. package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +1 -1
  40. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  41. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +3 -3
  42. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  43. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +4 -4
  44. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  45. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +4 -4
  46. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  47. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +4 -4
  48. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  49. package/glTF/2.0/Extensions/KHR_materials_coat.d.ts +4 -4
  50. package/glTF/2.0/Extensions/KHR_materials_coat.js.map +1 -1
  51. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.d.ts +4 -4
  52. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -1
  53. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +4 -4
  54. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +3 -3
  56. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  57. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +3 -3
  58. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  59. package/glTF/2.0/Extensions/KHR_materials_fuzz.d.ts +4 -4
  60. package/glTF/2.0/Extensions/KHR_materials_fuzz.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +3 -3
  62. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  63. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +4 -4
  64. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  65. package/glTF/2.0/Extensions/KHR_materials_openpbr.d.ts +3 -3
  66. package/glTF/2.0/Extensions/KHR_materials_openpbr.js.map +1 -1
  67. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +4 -4
  68. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  69. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +4 -4
  70. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  71. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +4 -4
  72. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  73. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +3 -3
  74. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  75. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +4 -4
  76. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  77. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +4 -4
  78. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +1 -1
  79. package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +1 -1
  80. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  81. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +3 -3
  82. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  83. package/glTF/2.0/bufferManager.d.ts +2 -2
  84. package/glTF/2.0/bufferManager.js.map +1 -1
  85. package/glTF/2.0/dataWriter.d.ts +1 -1
  86. package/glTF/2.0/dataWriter.js.map +1 -1
  87. package/glTF/2.0/glTFAnimation.d.ts +5 -6
  88. package/glTF/2.0/glTFAnimation.js.map +1 -1
  89. package/glTF/2.0/glTFData.js.map +1 -1
  90. package/glTF/2.0/glTFExporter.d.ts +7 -7
  91. package/glTF/2.0/glTFExporter.js.map +1 -1
  92. package/glTF/2.0/glTFExporterExtension.d.ts +8 -8
  93. package/glTF/2.0/glTFExporterExtension.js.map +1 -1
  94. package/glTF/2.0/glTFMaterialExporter.d.ts +5 -5
  95. package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
  96. package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +4 -4
  97. package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -1
  98. package/glTF/2.0/glTFSerializer.d.ts +4 -4
  99. package/glTF/2.0/glTFSerializer.js.map +1 -1
  100. package/glTF/2.0/glTFUtilities.d.ts +7 -9
  101. package/glTF/2.0/glTFUtilities.js.map +1 -1
  102. package/legacy/legacy-3mfSerializer.js +3 -3
  103. package/legacy/legacy-3mfSerializer.js.map +1 -1
  104. package/legacy/legacy-bvhSerializer.js +3 -3
  105. package/legacy/legacy-bvhSerializer.js.map +1 -1
  106. package/legacy/legacy-glTF2Serializer.js +5 -4
  107. package/legacy/legacy-glTF2Serializer.js.map +1 -1
  108. package/legacy/legacy-objSerializer.js +3 -3
  109. package/legacy/legacy-objSerializer.js.map +1 -1
  110. package/legacy/legacy-stlSerializer.js +3 -3
  111. package/legacy/legacy-stlSerializer.js.map +1 -1
  112. package/legacy/legacy-usdzSerializer.js +3 -3
  113. package/legacy/legacy-usdzSerializer.js.map +1 -1
  114. package/legacy/legacy.js +0 -1
  115. package/legacy/legacy.js.map +1 -1
  116. package/package.json +4 -4
  117. package/stl/stlSerializer.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"3mfSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/3MF/3mfSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["// Babylonjs\r\nimport type { SubMesh } from \"core/Meshes\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { Matrix } from \"core/Maths/math\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n// 3MF\r\nimport { ThreeMfMeshBuilder, type ThreeMfModelBuilder } from \"./core/model/3mf.builder\";\r\nimport { Matrix3d } from \"./core/model/3mf\";\r\n\r\nimport { ST_Unit, type I3mfModel, type I3mfObject } from \"./core/model/3mf.interfaces\";\r\nimport type { I3mfVertexData } from \"./core/model/3mf.types\";\r\nimport { AbstractThreeMfSerializer, type IThreeMfSerializerBaseOptions } from \"./core/model/3mf.serializer\";\r\nimport { ThreeMfSerializerGlobalConfiguration } from \"./3mfSerializer.configuration\";\r\n\r\n/**\r\n * Factory for generating sequential resource IDs for 3MF objects.\r\n */\r\nclass IncrementalIdFactory {\r\n private _from: number;\r\n private _to: number;\r\n private _step: number;\r\n private _i: number;\r\n\r\n /**\r\n * Creates an ID factory with the specified range and increment.\r\n * @param from - Starting ID value\r\n * @param to - Minimum bound for ID generation (throws if exceeded)\r\n * @param step - Increment value for each ID\r\n */\r\n public constructor(from: number = 0, to: number = Number.MIN_SAFE_INTEGER, step: number = 1) {\r\n this._from = from;\r\n this._to = to;\r\n this._step = step;\r\n this._i = from;\r\n }\r\n\r\n /**\r\n * Generates the next ID in the sequence.\r\n * @returns The next ID value\r\n * @throws Error if ID generation exceeds the configured bounds\r\n */\r\n public next(): number {\r\n if (this._i < this._to) {\r\n throw new Error(\"ST_ResourceID out of bound\");\r\n }\r\n const v = this._i;\r\n this._i += this._step;\r\n return v;\r\n }\r\n\r\n /**\r\n * Resets the factory to start generating from the initial value again.\r\n * @returns This factory instance for chaining\r\n */\r\n public reset(): IncrementalIdFactory {\r\n this._i = this._from;\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Options controlling how meshes are exported into the 3MF model.\r\n *\r\n * Notes:\r\n * - These flags are kept generic here and are expected to be interpreted by the concrete serializer/model builder.\r\n * - Defaults are set in AbstractThreeMfSerializer.DEFAULT_3MF_EXPORTER_OPTIONS.\r\n */\r\nexport interface IThreeMfSerializerOptions extends IThreeMfSerializerBaseOptions {\r\n /**\r\n * If true, export mesh instances (multiple references to the same geometry) when supported.\r\n * If false, geometry may be duplicated depending on the concrete implementation.\r\n */\r\n exportInstances?: boolean;\r\n}\r\n\r\n/**\r\n * Babylon.js to 3MF serializer.\r\n *\r\n * This serializer converts Babylon meshes into a 3MF model, then relies on the base class\r\n * (AbstractThreeMfSerializer) to package the OPC parts into a zip stream.\r\n *\r\n * Design notes:\r\n * - First pass: export \"source\" meshes (non-instances) and build an index to map Babylon mesh/submesh to 3MF object id.\r\n * - Second pass (optional): export instances as additional build items referencing the original object ids.\r\n * - Submesh export is handled by extracting per-submesh vertex/index buffers so materials/colors can be preserved\r\n * by downstream steps that attach per-object properties.\r\n */\r\nexport class ThreeMfSerializer extends AbstractThreeMfSerializer<Mesh | InstancedMesh, IThreeMfSerializerOptions> {\r\n /**\r\n * Default serialization options: meter units, no instance export.\r\n */\r\n static DefaultOptions: IThreeMfSerializerOptions = { unit: ST_Unit.meter, exportInstances: false };\r\n\r\n /**\r\n * Babylon's vertex buffer semantic for positions.\r\n * Babylon uses string-based \"kind\" keys for vertex buffers.\r\n */\r\n private static _PositionKind = \"position\";\r\n\r\n /**\r\n * Cached promise so we only attempt to load fflate once.\r\n * This prevents multiple concurrent LoadScriptAsync calls.\r\n */\r\n private _fflateReadyPromise?: Promise<any>;\r\n\r\n /**\r\n * @param opts serializer options (merged with defaults in base class).\r\n */\r\n public constructor(opts: Partial<IThreeMfSerializerOptions> = {}) {\r\n super({ ...ThreeMfSerializer.DefaultOptions, ...opts });\r\n }\r\n\r\n /**\r\n * Build a 3MF model from Babylon meshes.\r\n *\r\n * Important: this method should not allocate huge intermediate data unless needed.\r\n * Submesh extraction does allocate new position/index arrays for each exported submesh.\r\n * @param builder\r\n * @param meshes\r\n * @returns\r\n */\r\n public override toModel(builder: ThreeMfModelBuilder, ...meshes: Array<Mesh | InstancedMesh>): I3mfModel {\r\n // avoid parasits..\r\n meshes = meshes.filter((m) => m instanceof Mesh || m instanceof InstancedMesh);\r\n\r\n const idFactory = new IncrementalIdFactory();\r\n\r\n const modelBuilder = builder;\r\n\r\n /**\r\n * Index mapping Babylon elements to the created 3MF object.\r\n *\r\n * Why:\r\n * - Instances need to reference the base object id.\r\n * - When exporting submeshes, instances should reference per-submesh objects rather than the whole mesh.\r\n *\r\n * Key type:\r\n * - When exportSubmeshes is true: we store entries for each SubMesh.\r\n * - Otherwise: we store entries for each Mesh.\r\n */\r\n const index = new Map<Mesh | SubMesh, I3mfObject>();\r\n\r\n /**\r\n * If exportInstances is enabled, we collect instanced meshes during the first pass and process them later.\r\n * If exportInstances is disabled, instances are ignored (they will not appear in the output).\r\n */\r\n const instances: Array<InstancedMesh> | null = this.options.exportInstances ? [] : null;\r\n\r\n // First pass: export base meshes (non-instances).\r\n // This creates the \"resource objects\" referenced by build items.\r\n for (let j = 0; j < meshes.length; j++) {\r\n const babylonMesh = meshes[j];\r\n if (babylonMesh instanceof InstancedMesh) {\r\n // Defer instance handling to the second pass.\r\n instances?.push(babylonMesh);\r\n continue;\r\n }\r\n\r\n const objectName = babylonMesh.name || `mesh${j}`;\r\n\r\n // Convert Babylon world matrix to 3MF build transform (3x4).\r\n // This transform will be attached to the build item referencing the created object.\r\n const worldTransform = babylonMesh.getWorldMatrix();\r\n const buildTransform = this._handleBabylonTo3mfMatrixTransformToRef(worldTransform, Matrix3d.Zero());\r\n\r\n // Submeshes can carry material/color boundaries in Babylon.\r\n // When exportSubmeshes is enabled, we export each submesh as its own 3MF object so\r\n // consumers can attach per-object properties (e.g. colors) later.\r\n const subMeshes = babylonMesh.subMeshes;\r\n if (subMeshes === undefined) {\r\n // very unlikely...\r\n continue;\r\n }\r\n\r\n // Babylon.js automatically creates one SubMesh covering the whole mesh if you don’t define any.\r\n const isStandalone = subMeshes.length == 1;\r\n for (let k = 0; k < subMeshes.length; k++) {\r\n const subMesh = subMeshes[k];\r\n\r\n const data = this._extractSubMesh(babylonMesh, subMesh);\r\n\r\n if (data) {\r\n const submeshName = isStandalone ? `${objectName}` : `${objectName}_${k}`;\r\n\r\n const object = new ThreeMfMeshBuilder(idFactory.next()).withData(data).withName(submeshName).build();\r\n\r\n // Add object to resources.\r\n modelBuilder.withMesh(object);\r\n\r\n // Add a build item referencing the object at the mesh world transform.\r\n modelBuilder.withBuild(object.id, buildTransform);\r\n\r\n // Cache mapping for instances (instances will reference this object id).\r\n index.set(subMesh, object);\r\n }\r\n }\r\n }\r\n\r\n // Second pass: export instances as additional build items.\r\n //\r\n // In 3MF terms:\r\n // - We do not duplicate geometry for each instance.\r\n // - We emit multiple build items referencing the same object id, each with its own transform.\r\n if (instances && instances.length) {\r\n // Group instances by their source mesh to keep related builds close in the XML.\r\n const grouped = this._groupBy(instances, (i) => i.sourceMesh);\r\n\r\n for (const [_babylonMesh, _instances] of Array.from(grouped.entries())) {\r\n if (!_instances || !_instances.length) {\r\n continue;\r\n }\r\n\r\n for (let j = 0; j < _instances.length; j++) {\r\n const mesh = _instances[j];\r\n const worldTransform = mesh.getWorldMatrix();\r\n\r\n // If we exported submeshes, the base \"resource objects\" are per-submesh.\r\n // For an instance we emit a build item per submesh object.\r\n const subMeshes = _babylonMesh.subMeshes;\r\n\r\n for (let k = 0; k < subMeshes.length; k++) {\r\n const subMesh = subMeshes[k];\r\n\r\n // Look up the 3MF object created for this submesh in the first pass.\r\n const objectRef = index.get(subMesh);\r\n\r\n if (objectRef) {\r\n modelBuilder.withBuild(objectRef.id, this._handleBabylonTo3mfMatrixTransformToRef(worldTransform, Matrix3d.Zero()));\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return modelBuilder.build();\r\n }\r\n\r\n /**\r\n * Ensure the zip library (fflate) is available in the current runtime.\r\n *\r\n * Host assumptions:\r\n * - This implementation relies on fflate being exposed on globalThis.fflate.\r\n * - If it is not present, it loads a script from ThreeMfSerializerGlobalConfiguration.FFLATEUrl using Babylon Tools.LoadScriptAsync.\r\n * @returns\r\n */\r\n public override async ensureZipLibReadyAsync(): Promise<any> {\r\n if (this._fflateReadyPromise) {\r\n return await this._fflateReadyPromise;\r\n }\r\n\r\n this._fflateReadyPromise = (async () => {\r\n // globalThis is the global object in all modern JS runtimes (browser, workers, Node, etc.).\r\n const g = globalThis as any;\r\n\r\n // If fflate is not already present, load it dynamically.\r\n // This assumes the loaded script sets globalThis.fflate.\r\n if (!g.fflate) {\r\n await Tools.LoadScriptAsync(ThreeMfSerializerGlobalConfiguration.FFLATEUrl);\r\n }\r\n\r\n return g.fflate;\r\n })();\r\n\r\n return await this._fflateReadyPromise;\r\n }\r\n\r\n /**\r\n * Extract a single SubMesh into a standalone vertex/index buffer pair.\r\n *\r\n * Why:\r\n * - 3MF mesh objects typically reference a contiguous vertex array and triangle indices.\r\n * - Babylon SubMesh references a slice of the global index buffer, but shares the vertex buffer.\r\n * - To serialize each submesh independently, we build a compacted vertex buffer containing only the used vertices\r\n * and remap indices accordingly.\r\n *\r\n * Complexity:\r\n * - O(indexCount) time, O(uniqueVerticesInSubmesh) additional memory.\r\n * @param mesh\r\n * @param sm\r\n * @returns\r\n */\r\n private _extractSubMesh(mesh: Mesh, sm: SubMesh): I3mfVertexData | undefined {\r\n const allInd = mesh.getIndices();\r\n if (!allInd) {\r\n return undefined;\r\n }\r\n\r\n const allPos = mesh.getVerticesData(ThreeMfSerializer._PositionKind);\r\n if (!allPos) {\r\n return undefined;\r\n }\r\n\r\n // Fast path: the submesh covers the full index buffer, so reuse the original arrays.\r\n // Note: This returns Babylon-owned arrays; if callers mutate, they will affect source mesh data.\r\n // Kept as-is to avoid extra allocations.\r\n if (sm.indexStart == 0 && sm.indexCount == allInd.length) {\r\n return {\r\n positions: allPos,\r\n indices: allInd,\r\n };\r\n }\r\n\r\n const indStart = sm.indexStart;\r\n\r\n // Map old vertex index -> new compacted vertex index.\r\n const map = new Map<number, number>();\r\n\r\n // Compacted positions (x,y,z repeated). We assemble into number[] then convert to Float32Array at the end.\r\n const newPositions: number[] = [];\r\n\r\n // Indices for the compacted vertex buffer.\r\n // Uint32Array is used to support large meshes; ensure downstream 3MF writer supports 32-bit indices if needed.\r\n const newIndices = new Uint32Array(sm.indexCount);\r\n\r\n for (let i = 0; i < sm.indexCount; i++) {\r\n const oldVi = allInd[indStart + i];\r\n\r\n let newVi = map.get(oldVi);\r\n if (newVi === undefined) {\r\n newVi = map.size;\r\n map.set(oldVi, newVi);\r\n\r\n // Copy the corresponding position (assumes positions are 3-floats per vertex).\r\n // If the source mesh uses a different stride or includes morph targets, this ignores them.\r\n const p = oldVi * 3;\r\n newPositions.push(allPos[p], allPos[p + 1], allPos[p + 2]);\r\n }\r\n\r\n newIndices[i] = newVi;\r\n }\r\n\r\n return {\r\n positions: new Float32Array(newPositions),\r\n indices: newIndices,\r\n };\r\n }\r\n\r\n /**\r\n * Group items by a computed key.\r\n * Used to group instances by sourceMesh so the resulting XML is easier to read and debug.\r\n * @param items\r\n * @param key\r\n * @returns\r\n */\r\n private _groupBy<T, K>(items: readonly T[], key: (v: T) => K): Map<K, T[]> {\r\n const m = new Map<K, T[]>();\r\n for (const it of items) {\r\n const k = key(it);\r\n const arr = m.get(k);\r\n if (arr) {\r\n arr.push(it);\r\n } else {\r\n m.set(k, [it]);\r\n }\r\n }\r\n return m;\r\n }\r\n\r\n /**\r\n * Basis conversion from Babylon coordinate system to the expected 3MF coordinate system.\r\n *\r\n * Here we rotate +90 degrees around X:\r\n * - This is commonly used to convert between Y-up and Z-up conventions.\r\n * - Verify this matches your pipeline (Babylon is typically left-handed Y-up).\r\n */\r\n private static readonly _R_BJS_TO_3MF = Matrix.RotationX(Math.PI / 2).multiply(Matrix.Scaling(1, -1, 1));\r\n\r\n /**\r\n * Converts a Babylon.js 4x4 matrix into a 3MF 3x4 transform matrix and writes the result into ref.\r\n *\r\n * Babylon.js conventions:\r\n * - Babylon exposes matrices with logical row/column indexing (M(row, column)).\r\n * - It stores the 16 coefficients in a contiguous array in row-major order:\r\n * [ M00, M01, M02, M03,\r\n * M10, M11, M12, M13,\r\n * M20, M21, M22, M23,\r\n * M30, M31, M32, M33 ]\r\n *\r\n * 3MF expectation:\r\n * - 3MF uses an affine transform represented as a 3x4 matrix (12 values).\r\n * - The values are taken from the first 3 columns of the 4x4 matrix, across the 4 rows:\r\n * m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32\r\n *\r\n * Steps:\r\n * 1) Compose Babylon transform with the basis change:\r\n * tmp = tBjs * _R_BJS_TO_3MF\r\n * 2) Extract the 12 coefficients in 3MF order from tmp.m.\r\n *\r\n * Interop note:\r\n * - Do not transpose here. We only reorder values to match the 3MF 3x4 serialization order.\r\n * - Transposition is only relevant when interfacing with code that assumes column-major storage.\r\n *\r\n * @param tBjs Babylon.js 4x4 matrix.\r\n * @param ref Output 3MF 3x4 matrix container (ref.values assigned).\r\n * @returns ref, for chaining.\r\n */\r\n private _handleBabylonTo3mfMatrixTransformToRef(tBjs: Matrix, ref: Matrix3d): Matrix3d {\r\n const tmp = tBjs.multiplyToRef(ThreeMfSerializer._R_BJS_TO_3MF, Matrix.Zero());\r\n const a = tmp.m;\r\n\r\n // a is Babylon row-major storage. Extract rows 0..3, cols 0..2 in 3MF order.\r\n // 3MF order: m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32\r\n ref.values = [a[0], a[1], a[2], a[4], a[5], a[6], a[8], a[9], a[10], a[12], a[13], a[14]];\r\n return ref;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"3mfSerializer.js","sourceRoot":"","sources":["../../../../dev/serializers/src/3MF/3mfSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["// Babylonjs\r\nimport { type SubMesh } from \"core/Meshes\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { InstancedMesh } from \"core/Meshes/instancedMesh\";\r\nimport { Matrix } from \"core/Maths/math\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n// 3MF\r\nimport { ThreeMfMeshBuilder, type ThreeMfModelBuilder } from \"./core/model/3mf.builder\";\r\nimport { Matrix3d } from \"./core/model/3mf\";\r\n\r\nimport { ST_Unit, type I3mfModel, type I3mfObject } from \"./core/model/3mf.interfaces\";\r\nimport { type I3mfVertexData } from \"./core/model/3mf.types\";\r\nimport { AbstractThreeMfSerializer, type IThreeMfSerializerBaseOptions } from \"./core/model/3mf.serializer\";\r\nimport { ThreeMfSerializerGlobalConfiguration } from \"./3mfSerializer.configuration\";\r\n\r\n/**\r\n * Factory for generating sequential resource IDs for 3MF objects.\r\n */\r\nclass IncrementalIdFactory {\r\n private _from: number;\r\n private _to: number;\r\n private _step: number;\r\n private _i: number;\r\n\r\n /**\r\n * Creates an ID factory with the specified range and increment.\r\n * @param from - Starting ID value\r\n * @param to - Minimum bound for ID generation (throws if exceeded)\r\n * @param step - Increment value for each ID\r\n */\r\n public constructor(from: number = 0, to: number = Number.MIN_SAFE_INTEGER, step: number = 1) {\r\n this._from = from;\r\n this._to = to;\r\n this._step = step;\r\n this._i = from;\r\n }\r\n\r\n /**\r\n * Generates the next ID in the sequence.\r\n * @returns The next ID value\r\n * @throws Error if ID generation exceeds the configured bounds\r\n */\r\n public next(): number {\r\n if (this._i < this._to) {\r\n throw new Error(\"ST_ResourceID out of bound\");\r\n }\r\n const v = this._i;\r\n this._i += this._step;\r\n return v;\r\n }\r\n\r\n /**\r\n * Resets the factory to start generating from the initial value again.\r\n * @returns This factory instance for chaining\r\n */\r\n public reset(): IncrementalIdFactory {\r\n this._i = this._from;\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * Options controlling how meshes are exported into the 3MF model.\r\n *\r\n * Notes:\r\n * - These flags are kept generic here and are expected to be interpreted by the concrete serializer/model builder.\r\n * - Defaults are set in AbstractThreeMfSerializer.DEFAULT_3MF_EXPORTER_OPTIONS.\r\n */\r\nexport interface IThreeMfSerializerOptions extends IThreeMfSerializerBaseOptions {\r\n /**\r\n * If true, export mesh instances (multiple references to the same geometry) when supported.\r\n * If false, geometry may be duplicated depending on the concrete implementation.\r\n */\r\n exportInstances?: boolean;\r\n}\r\n\r\n/**\r\n * Babylon.js to 3MF serializer.\r\n *\r\n * This serializer converts Babylon meshes into a 3MF model, then relies on the base class\r\n * (AbstractThreeMfSerializer) to package the OPC parts into a zip stream.\r\n *\r\n * Design notes:\r\n * - First pass: export \"source\" meshes (non-instances) and build an index to map Babylon mesh/submesh to 3MF object id.\r\n * - Second pass (optional): export instances as additional build items referencing the original object ids.\r\n * - Submesh export is handled by extracting per-submesh vertex/index buffers so materials/colors can be preserved\r\n * by downstream steps that attach per-object properties.\r\n */\r\nexport class ThreeMfSerializer extends AbstractThreeMfSerializer<Mesh | InstancedMesh, IThreeMfSerializerOptions> {\r\n /**\r\n * Default serialization options: meter units, no instance export.\r\n */\r\n static DefaultOptions: IThreeMfSerializerOptions = { unit: ST_Unit.meter, exportInstances: false };\r\n\r\n /**\r\n * Babylon's vertex buffer semantic for positions.\r\n * Babylon uses string-based \"kind\" keys for vertex buffers.\r\n */\r\n private static _PositionKind = \"position\";\r\n\r\n /**\r\n * Cached promise so we only attempt to load fflate once.\r\n * This prevents multiple concurrent LoadScriptAsync calls.\r\n */\r\n private _fflateReadyPromise?: Promise<any>;\r\n\r\n /**\r\n * @param opts serializer options (merged with defaults in base class).\r\n */\r\n public constructor(opts: Partial<IThreeMfSerializerOptions> = {}) {\r\n super({ ...ThreeMfSerializer.DefaultOptions, ...opts });\r\n }\r\n\r\n /**\r\n * Build a 3MF model from Babylon meshes.\r\n *\r\n * Important: this method should not allocate huge intermediate data unless needed.\r\n * Submesh extraction does allocate new position/index arrays for each exported submesh.\r\n * @param builder\r\n * @param meshes\r\n * @returns\r\n */\r\n public override toModel(builder: ThreeMfModelBuilder, ...meshes: Array<Mesh | InstancedMesh>): I3mfModel {\r\n // avoid parasits..\r\n meshes = meshes.filter((m) => m instanceof Mesh || m instanceof InstancedMesh);\r\n\r\n const idFactory = new IncrementalIdFactory();\r\n\r\n const modelBuilder = builder;\r\n\r\n /**\r\n * Index mapping Babylon elements to the created 3MF object.\r\n *\r\n * Why:\r\n * - Instances need to reference the base object id.\r\n * - When exporting submeshes, instances should reference per-submesh objects rather than the whole mesh.\r\n *\r\n * Key type:\r\n * - When exportSubmeshes is true: we store entries for each SubMesh.\r\n * - Otherwise: we store entries for each Mesh.\r\n */\r\n const index = new Map<Mesh | SubMesh, I3mfObject>();\r\n\r\n /**\r\n * If exportInstances is enabled, we collect instanced meshes during the first pass and process them later.\r\n * If exportInstances is disabled, instances are ignored (they will not appear in the output).\r\n */\r\n const instances: Array<InstancedMesh> | null = this.options.exportInstances ? [] : null;\r\n\r\n // First pass: export base meshes (non-instances).\r\n // This creates the \"resource objects\" referenced by build items.\r\n for (let j = 0; j < meshes.length; j++) {\r\n const babylonMesh = meshes[j];\r\n if (babylonMesh instanceof InstancedMesh) {\r\n // Defer instance handling to the second pass.\r\n instances?.push(babylonMesh);\r\n continue;\r\n }\r\n\r\n const objectName = babylonMesh.name || `mesh${j}`;\r\n\r\n // Convert Babylon world matrix to 3MF build transform (3x4).\r\n // This transform will be attached to the build item referencing the created object.\r\n const worldTransform = babylonMesh.getWorldMatrix();\r\n const buildTransform = this._handleBabylonTo3mfMatrixTransformToRef(worldTransform, Matrix3d.Zero());\r\n\r\n // Submeshes can carry material/color boundaries in Babylon.\r\n // When exportSubmeshes is enabled, we export each submesh as its own 3MF object so\r\n // consumers can attach per-object properties (e.g. colors) later.\r\n const subMeshes = babylonMesh.subMeshes;\r\n if (subMeshes === undefined) {\r\n // very unlikely...\r\n continue;\r\n }\r\n\r\n // Babylon.js automatically creates one SubMesh covering the whole mesh if you don’t define any.\r\n const isStandalone = subMeshes.length == 1;\r\n for (let k = 0; k < subMeshes.length; k++) {\r\n const subMesh = subMeshes[k];\r\n\r\n const data = this._extractSubMesh(babylonMesh, subMesh);\r\n\r\n if (data) {\r\n const submeshName = isStandalone ? `${objectName}` : `${objectName}_${k}`;\r\n\r\n const object = new ThreeMfMeshBuilder(idFactory.next()).withData(data).withName(submeshName).build();\r\n\r\n // Add object to resources.\r\n modelBuilder.withMesh(object);\r\n\r\n // Add a build item referencing the object at the mesh world transform.\r\n modelBuilder.withBuild(object.id, buildTransform);\r\n\r\n // Cache mapping for instances (instances will reference this object id).\r\n index.set(subMesh, object);\r\n }\r\n }\r\n }\r\n\r\n // Second pass: export instances as additional build items.\r\n //\r\n // In 3MF terms:\r\n // - We do not duplicate geometry for each instance.\r\n // - We emit multiple build items referencing the same object id, each with its own transform.\r\n if (instances && instances.length) {\r\n // Group instances by their source mesh to keep related builds close in the XML.\r\n const grouped = this._groupBy(instances, (i) => i.sourceMesh);\r\n\r\n for (const [_babylonMesh, _instances] of Array.from(grouped.entries())) {\r\n if (!_instances || !_instances.length) {\r\n continue;\r\n }\r\n\r\n for (let j = 0; j < _instances.length; j++) {\r\n const mesh = _instances[j];\r\n const worldTransform = mesh.getWorldMatrix();\r\n\r\n // If we exported submeshes, the base \"resource objects\" are per-submesh.\r\n // For an instance we emit a build item per submesh object.\r\n const subMeshes = _babylonMesh.subMeshes;\r\n\r\n for (let k = 0; k < subMeshes.length; k++) {\r\n const subMesh = subMeshes[k];\r\n\r\n // Look up the 3MF object created for this submesh in the first pass.\r\n const objectRef = index.get(subMesh);\r\n\r\n if (objectRef) {\r\n modelBuilder.withBuild(objectRef.id, this._handleBabylonTo3mfMatrixTransformToRef(worldTransform, Matrix3d.Zero()));\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return modelBuilder.build();\r\n }\r\n\r\n /**\r\n * Ensure the zip library (fflate) is available in the current runtime.\r\n *\r\n * Host assumptions:\r\n * - This implementation relies on fflate being exposed on globalThis.fflate.\r\n * - If it is not present, it loads a script from ThreeMfSerializerGlobalConfiguration.FFLATEUrl using Babylon Tools.LoadScriptAsync.\r\n * @returns\r\n */\r\n public override async ensureZipLibReadyAsync(): Promise<any> {\r\n if (this._fflateReadyPromise) {\r\n return await this._fflateReadyPromise;\r\n }\r\n\r\n this._fflateReadyPromise = (async () => {\r\n // globalThis is the global object in all modern JS runtimes (browser, workers, Node, etc.).\r\n const g = globalThis as any;\r\n\r\n // If fflate is not already present, load it dynamically.\r\n // This assumes the loaded script sets globalThis.fflate.\r\n if (!g.fflate) {\r\n await Tools.LoadScriptAsync(ThreeMfSerializerGlobalConfiguration.FFLATEUrl);\r\n }\r\n\r\n return g.fflate;\r\n })();\r\n\r\n return await this._fflateReadyPromise;\r\n }\r\n\r\n /**\r\n * Extract a single SubMesh into a standalone vertex/index buffer pair.\r\n *\r\n * Why:\r\n * - 3MF mesh objects typically reference a contiguous vertex array and triangle indices.\r\n * - Babylon SubMesh references a slice of the global index buffer, but shares the vertex buffer.\r\n * - To serialize each submesh independently, we build a compacted vertex buffer containing only the used vertices\r\n * and remap indices accordingly.\r\n *\r\n * Complexity:\r\n * - O(indexCount) time, O(uniqueVerticesInSubmesh) additional memory.\r\n * @param mesh\r\n * @param sm\r\n * @returns\r\n */\r\n private _extractSubMesh(mesh: Mesh, sm: SubMesh): I3mfVertexData | undefined {\r\n const allInd = mesh.getIndices();\r\n if (!allInd) {\r\n return undefined;\r\n }\r\n\r\n const allPos = mesh.getVerticesData(ThreeMfSerializer._PositionKind);\r\n if (!allPos) {\r\n return undefined;\r\n }\r\n\r\n // Fast path: the submesh covers the full index buffer, so reuse the original arrays.\r\n // Note: This returns Babylon-owned arrays; if callers mutate, they will affect source mesh data.\r\n // Kept as-is to avoid extra allocations.\r\n if (sm.indexStart == 0 && sm.indexCount == allInd.length) {\r\n return {\r\n positions: allPos,\r\n indices: allInd,\r\n };\r\n }\r\n\r\n const indStart = sm.indexStart;\r\n\r\n // Map old vertex index -> new compacted vertex index.\r\n const map = new Map<number, number>();\r\n\r\n // Compacted positions (x,y,z repeated). We assemble into number[] then convert to Float32Array at the end.\r\n const newPositions: number[] = [];\r\n\r\n // Indices for the compacted vertex buffer.\r\n // Uint32Array is used to support large meshes; ensure downstream 3MF writer supports 32-bit indices if needed.\r\n const newIndices = new Uint32Array(sm.indexCount);\r\n\r\n for (let i = 0; i < sm.indexCount; i++) {\r\n const oldVi = allInd[indStart + i];\r\n\r\n let newVi = map.get(oldVi);\r\n if (newVi === undefined) {\r\n newVi = map.size;\r\n map.set(oldVi, newVi);\r\n\r\n // Copy the corresponding position (assumes positions are 3-floats per vertex).\r\n // If the source mesh uses a different stride or includes morph targets, this ignores them.\r\n const p = oldVi * 3;\r\n newPositions.push(allPos[p], allPos[p + 1], allPos[p + 2]);\r\n }\r\n\r\n newIndices[i] = newVi;\r\n }\r\n\r\n return {\r\n positions: new Float32Array(newPositions),\r\n indices: newIndices,\r\n };\r\n }\r\n\r\n /**\r\n * Group items by a computed key.\r\n * Used to group instances by sourceMesh so the resulting XML is easier to read and debug.\r\n * @param items\r\n * @param key\r\n * @returns\r\n */\r\n private _groupBy<T, K>(items: readonly T[], key: (v: T) => K): Map<K, T[]> {\r\n const m = new Map<K, T[]>();\r\n for (const it of items) {\r\n const k = key(it);\r\n const arr = m.get(k);\r\n if (arr) {\r\n arr.push(it);\r\n } else {\r\n m.set(k, [it]);\r\n }\r\n }\r\n return m;\r\n }\r\n\r\n /**\r\n * Basis conversion from Babylon coordinate system to the expected 3MF coordinate system.\r\n *\r\n * Here we rotate +90 degrees around X:\r\n * - This is commonly used to convert between Y-up and Z-up conventions.\r\n * - Verify this matches your pipeline (Babylon is typically left-handed Y-up).\r\n */\r\n private static readonly _R_BJS_TO_3MF = Matrix.RotationX(Math.PI / 2).multiply(Matrix.Scaling(1, -1, 1));\r\n\r\n /**\r\n * Converts a Babylon.js 4x4 matrix into a 3MF 3x4 transform matrix and writes the result into ref.\r\n *\r\n * Babylon.js conventions:\r\n * - Babylon exposes matrices with logical row/column indexing (M(row, column)).\r\n * - It stores the 16 coefficients in a contiguous array in row-major order:\r\n * [ M00, M01, M02, M03,\r\n * M10, M11, M12, M13,\r\n * M20, M21, M22, M23,\r\n * M30, M31, M32, M33 ]\r\n *\r\n * 3MF expectation:\r\n * - 3MF uses an affine transform represented as a 3x4 matrix (12 values).\r\n * - The values are taken from the first 3 columns of the 4x4 matrix, across the 4 rows:\r\n * m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32\r\n *\r\n * Steps:\r\n * 1) Compose Babylon transform with the basis change:\r\n * tmp = tBjs * _R_BJS_TO_3MF\r\n * 2) Extract the 12 coefficients in 3MF order from tmp.m.\r\n *\r\n * Interop note:\r\n * - Do not transpose here. We only reorder values to match the 3MF 3x4 serialization order.\r\n * - Transposition is only relevant when interfacing with code that assumes column-major storage.\r\n *\r\n * @param tBjs Babylon.js 4x4 matrix.\r\n * @param ref Output 3MF 3x4 matrix container (ref.values assigned).\r\n * @returns ref, for chaining.\r\n */\r\n private _handleBabylonTo3mfMatrixTransformToRef(tBjs: Matrix, ref: Matrix3d): Matrix3d {\r\n const tmp = tBjs.multiplyToRef(ThreeMfSerializer._R_BJS_TO_3MF, Matrix.Zero());\r\n const a = tmp.m;\r\n\r\n // a is Babylon row-major storage. Extract rows 0..3, cols 0..2 in 3MF order.\r\n // 3MF order: m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32\r\n ref.values = [a[0], a[1], a[2], a[4], a[5], a[6], a[8], a[9], a[10], a[12], a[13], a[14]];\r\n return ref;\r\n }\r\n}\r\n"]}
@@ -1,10 +1,7 @@
1
- import type { Matrix3d } from "./3mf.js";
2
- import { ThreeMfModel, ThreeMfObject } from "./3mf.js";
3
- import type { I3mfBaseMaterials, I3mfModel, I3mfObject, I3mfTriangle, I3mfVertex, ST_ResourceID, ST_ResourceIndex, ST_Unit } from "./3mf.interfaces.js";
4
- import { ST_ObjectType } from "./3mf.interfaces.js";
5
- import type { I3mfDocument } from "./3mf.opc.interfaces.js";
6
- import { type I3mfContentType, type I3mfRelationship } from "./3mf.opc.interfaces.js";
7
- import type { I3mfRGBAColor, I3mfVertexData } from "./3mf.types.js";
1
+ import { type Matrix3d, ThreeMfModel, ThreeMfObject } from "./3mf.js";
2
+ import { type I3mfBaseMaterials, type I3mfModel, type I3mfObject, type I3mfTriangle, type I3mfVertex, type ST_ResourceID, type ST_ResourceIndex, type ST_Unit, ST_ObjectType } from "./3mf.interfaces.js";
3
+ import { type I3mfDocument, type I3mfContentType, type I3mfRelationship } from "./3mf.opc.interfaces.js";
4
+ import { type I3mfRGBAColor, type I3mfVertexData } from "./3mf.types.js";
8
5
  export type VertexHandler = (vertex: I3mfVertex) => I3mfVertex;
9
6
  export type TriangleHandler = (triangle: I3mfTriangle) => I3mfTriangle;
10
7
  /** */
@@ -1,5 +1,6 @@
1
+ // 3MF
1
2
  import { ThreeMfBase, ThreeMfBaseMaterials, ThreeMfBuild, ThreeMfComponent, ThreeMfComponents, ThreeMfItem, ThreeMfMesh, ThreeMfMeta, ThreeMfModel, ThreeMfObject, ThreeMfResources, ThreeMfTriangle, ThreeMfTriangles, ThreeMfVertex, ThreeMfVertices, } from "./3mf.js";
2
- import { ST_ObjectType } from "./3mf.interfaces.js";
3
+ import { ST_ObjectType, } from "./3mf.interfaces.js";
3
4
  import { ThreeMfContentType, ThreeMfContentTypes, ThreeMfDocument, ThreeMfRelationship, ThreeMfRelationships } from "./3mf.opc.js";
4
5
  import { Known3mfRelationshipTypes, KnownI3mfContentType, ModelFileName, Object3dDirName, } from "./3mf.opc.interfaces.js";
5
6
  /** */
@@ -1 +1 @@
1
- {"version":3,"file":"3mf.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.builder.ts"],"names":[],"mappings":"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","sourcesContent":["// 3MF\r\nimport type { Matrix3d } from \"./3mf\";\r\nimport {\r\n ThreeMfBase,\r\n ThreeMfBaseMaterials,\r\n ThreeMfBuild,\r\n ThreeMfComponent,\r\n ThreeMfComponents,\r\n ThreeMfItem,\r\n ThreeMfMesh,\r\n ThreeMfMeta,\r\n ThreeMfModel,\r\n ThreeMfObject,\r\n ThreeMfResources,\r\n ThreeMfTriangle,\r\n ThreeMfTriangles,\r\n ThreeMfVertex,\r\n ThreeMfVertices,\r\n} from \"./3mf\";\r\nimport type {\r\n I3mfBaseMaterials,\r\n I3mfComponents,\r\n I3mfMesh,\r\n I3mfMetadata,\r\n I3mfModel,\r\n I3mfObject,\r\n I3mfTriangle,\r\n I3mfTriangles,\r\n I3mfVertex,\r\n I3mfVertices,\r\n ST_ResourceID,\r\n ST_ResourceIndex,\r\n ST_Unit,\r\n} from \"./3mf.interfaces\";\r\nimport { ST_ObjectType } from \"./3mf.interfaces\";\r\nimport { ThreeMfContentType, ThreeMfContentTypes, ThreeMfDocument, ThreeMfRelationship, ThreeMfRelationships } from \"./3mf.opc\";\r\nimport type { I3mfDocument } from \"./3mf.opc.interfaces\";\r\nimport {\r\n Known3mfRelationshipTypes,\r\n KnownI3mfContentType,\r\n ModelFileName,\r\n Object3dDirName,\r\n type I3mfContentType,\r\n type I3mfContentTypes,\r\n type I3mfRelationship,\r\n type I3mfRelationships,\r\n} from \"./3mf.opc.interfaces\";\r\nimport type { I3mfRGBAColor, I3mfVertexData, ThreeMfFloatArray, ThreeMfIndicesArray } from \"./3mf.types\";\r\n\r\nexport type VertexHandler = (vertex: I3mfVertex) => I3mfVertex;\r\nexport type TriangleHandler = (triangle: I3mfTriangle) => I3mfTriangle;\r\n\r\n/** */\r\nexport class ThreeMfObjectBuilder {\r\n /**\r\n *\r\n */\r\n protected _object: ThreeMfObject;\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public constructor(id: ST_ResourceID, type: ST_ObjectType) {\r\n this._object = new ThreeMfObject(id, type);\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @returns\r\n */\r\n public withName(name: string): ThreeMfObjectBuilder {\r\n this._object.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param thumbnail\r\n * @returns\r\n */\r\n public withThumbnail(thumbnail: string): ThreeMfObjectBuilder {\r\n this._object.thumbnail = thumbnail;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param index\r\n * @returns\r\n */\r\n public withProperty(id: ST_ResourceIndex, index: number = 0): ThreeMfObjectBuilder {\r\n this._object.pid = id;\r\n this._object.id = index;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): I3mfObject {\r\n return this._object;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public reset(id: ST_ResourceID, type: ST_ObjectType) {\r\n this._object = new ThreeMfObject(id, type);\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfComponentsBuilder extends ThreeMfObjectBuilder {\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public constructor(id: ST_ResourceID, type: ST_ObjectType = ST_ObjectType.model) {\r\n super(id, type);\r\n this._object.content = new ThreeMfComponents();\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param t\r\n * @returns\r\n */\r\n public withComponent(id: ST_ResourceID, t?: Matrix3d): ThreeMfComponentsBuilder {\r\n (this._object.content as I3mfComponents).component.push(new ThreeMfComponent(id, t));\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfMeshBuilder extends ThreeMfObjectBuilder {\r\n /**\r\n *\r\n */\r\n _vh?: VertexHandler;\r\n /**\r\n *\r\n */\r\n _th?: TriangleHandler;\r\n\r\n /**\r\n *\r\n * @param id\r\n */\r\n public constructor(id: ST_ResourceID) {\r\n super(id, ST_ObjectType.model);\r\n }\r\n\r\n /**\r\n *\r\n * @param vertex\r\n * @param triangle\r\n * @returns\r\n */\r\n public withPostProcessHandlers(vertex: VertexHandler, triangle?: TriangleHandler): ThreeMfMeshBuilder {\r\n this._vh = vertex;\r\n this._th = triangle;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n withData(data: I3mfVertexData): ThreeMfMeshBuilder {\r\n this._object.content = this._buildMesh(data);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param i\r\n * @returns\r\n */\r\n withMaterial(id: ST_ResourceID, i: number): ThreeMfMeshBuilder {\r\n this._object.pid = id;\r\n this._object.pindex = i;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n private _buildMesh(data: I3mfVertexData): I3mfMesh {\r\n const vertices = this._buildVertices(data.positions);\r\n const triangles = this._buildTriangle(data.indices);\r\n return new ThreeMfMesh(vertices, triangles);\r\n }\r\n\r\n private _buildVertices(p: ThreeMfFloatArray | null): I3mfVertices {\r\n const container = new ThreeMfVertices();\r\n if (p) {\r\n for (let i = 0; i < p.length; ) {\r\n const x = p[i++];\r\n const y = p[i++];\r\n const z = p[i++];\r\n let v = new ThreeMfVertex(x, y, z);\r\n // might be optimized....\r\n if (this._vh) {\r\n v = this._vh(v);\r\n }\r\n container.vertex.push(v);\r\n }\r\n }\r\n return container;\r\n }\r\n\r\n private _buildTriangle(indice: ThreeMfIndicesArray | null): I3mfTriangles {\r\n const container = new ThreeMfTriangles();\r\n if (indice) {\r\n for (let i = 0; i < indice.length; ) {\r\n const a = indice[i++];\r\n const b = indice[i++];\r\n const c = indice[i++];\r\n let t = new ThreeMfTriangle(a, b, c);\r\n // might be optimized....\r\n if (this._th) {\r\n t = this._th(t);\r\n }\r\n container.triangle.push(t);\r\n }\r\n }\r\n return container;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfMaterialBuilder {\r\n private _m: I3mfBaseMaterials;\r\n\r\n public constructor(id: ST_ResourceID) {\r\n this._m = new ThreeMfBaseMaterials(id);\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param color\r\n * @returns\r\n */\r\n public withColor(name: string, color: I3mfRGBAColor): ThreeMfMaterialBuilder {\r\n this._m.base = this._m.base ?? [];\r\n let m = this._m.base.find((m) => m.name.toLowerCase() === name.toLowerCase());\r\n if (m) {\r\n m.displaycolor = this._rgbaToHex(color);\r\n return this;\r\n }\r\n m = new ThreeMfBase(name, this._rgbaToHex(color));\r\n this._m.base.push(m);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): I3mfBaseMaterials {\r\n return this._m;\r\n }\r\n\r\n private _rgbaToHex(c: I3mfRGBAColor | { r: number; g: number; b: number; a?: number }): string {\r\n const toSRGB = (c: number) => Math.round(Math.min(255, Math.max(0, Math.pow(c, 1 / 2.2) * 255)));\r\n\r\n const r = toSRGB(c.r).toString(16).padStart(2, \"0\").toUpperCase();\r\n const g = toSRGB(c.g).toString(16).padStart(2, \"0\").toUpperCase();\r\n const b = toSRGB(c.b).toString(16).padStart(2, \"0\").toUpperCase();\r\n\r\n if (typeof (c as any).a === \"number\") {\r\n const a = Math.round(Math.min(255, Math.max(0, c.a! * 255)))\r\n .toString(16)\r\n .padStart(2, \"0\")\r\n .toUpperCase();\r\n return `#${r}${g}${b}${a}`;\r\n }\r\n\r\n return `#${r}${g}${b}`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfModelBuilder {\r\n /**\r\n *\r\n */\r\n static KnownMetaSet = new Set(ThreeMfModel.KnownMeta.map((m) => m.toLowerCase()));\r\n\r\n /**\r\n *\r\n */\r\n _model: ThreeMfModel = new ThreeMfModel();\r\n /**\r\n *\r\n */\r\n _objects = new Map<string, I3mfObject>();\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param value\r\n * @param preserve\r\n * @param type\r\n * @returns\r\n */\r\n public withMetaData(name: string, value: string, preserve?: boolean, type?: string): ThreeMfModelBuilder {\r\n if (!this._model.metadata) {\r\n // lazzy\r\n this._model.metadata = new Array<I3mfMetadata>();\r\n }\r\n //const isKnownMeta = (s: string): boolean => TMFBuilder.knownMetaSet.has(s.toLowerCase());\r\n //const qn:IQName = xmlNameToParts(name);\r\n this._model.metadata.push(new ThreeMfMeta(name, value, preserve, type));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param material\r\n * @returns\r\n */\r\n public withMaterial(material: I3mfBaseMaterials | ThreeMfMaterialBuilder): ThreeMfModelBuilder {\r\n if (material instanceof ThreeMfMaterialBuilder) {\r\n material = material.build();\r\n }\r\n if (material) {\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.basematerials = this._model.resources.basematerials ?? [];\r\n this._model.resources.basematerials.push(material);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param object\r\n * @returns\r\n */\r\n public withMesh(object: I3mfObject | ThreeMfMeshBuilder): ThreeMfModelBuilder {\r\n if (object instanceof ThreeMfMeshBuilder) {\r\n object = object.build();\r\n }\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.object.push(object);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param components\r\n * @returns\r\n */\r\n public withComponents(components: I3mfObject | ThreeMfComponentsBuilder): ThreeMfModelBuilder {\r\n if (components instanceof ThreeMfComponentsBuilder) {\r\n components = components.build();\r\n }\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.object.push(components);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param objectid\r\n * @param transform\r\n * @param partnumber\r\n * @returns\r\n */\r\n public withBuild(objectid: ST_ResourceID, transform?: Matrix3d, partnumber?: string): ThreeMfModelBuilder {\r\n this._model.build = this._model.build ?? new ThreeMfBuild();\r\n this._model.build.item?.push(new ThreeMfItem(objectid, transform, partnumber));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param unit\r\n * @returns\r\n */\r\n public withUnit(unit: ST_Unit): ThreeMfModelBuilder {\r\n this._model.unit = unit;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public reset(): ThreeMfModelBuilder {\r\n this._model = new ThreeMfModel();\r\n this._objects = new Map<string, I3mfObject>();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): ThreeMfModel {\r\n // quick surface check..\r\n if (!this._model.resources?.object?.length) {\r\n throw new Error(\"Invalid state: resources MUST be defined \");\r\n }\r\n if (!this._model.build?.item?.length) {\r\n throw new Error(\"Invalid state: Build MUST be defined \");\r\n }\r\n return this._model;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfDocumentBuilder {\r\n private _cts?: I3mfContentTypes;\r\n private _rs?: I3mfRelationships;\r\n private _m?: I3mfModel;\r\n\r\n /**\r\n *\r\n * @param type\r\n * @returns\r\n */\r\n public withContentType(type: I3mfContentType): ThreeMfDocumentBuilder {\r\n if (!this._cts) {\r\n this._cts = new ThreeMfContentTypes();\r\n }\r\n const arr = this._cts.items;\r\n if (!arr.some((x) => x.ext === type.ext && x.ct === type.ct)) {\r\n arr.push(type);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param rel\r\n * @returns\r\n */\r\n public withRelationship(rel: I3mfRelationship): ThreeMfDocumentBuilder {\r\n if (!this._rs) {\r\n this._rs = new ThreeMfRelationships();\r\n }\r\n const arr = this._rs.items;\r\n if (!arr.some((x) => x.id === rel.id)) {\r\n arr.push(rel);\r\n }\r\n // here we ensure that the content type is declared.\r\n this.withContentType(new ThreeMfContentType(\"rels\", KnownI3mfContentType.Relationships));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param m\r\n * @returns\r\n */\r\n public withModel(m: I3mfModel | ThreeMfModelBuilder): ThreeMfDocumentBuilder {\r\n if (m instanceof ThreeMfModelBuilder) {\r\n m = m.build();\r\n }\r\n this._m = m;\r\n // here we ensure that the content type is declared.\r\n this.withContentType(new ThreeMfContentType(\"model\", KnownI3mfContentType.Model));\r\n return this;\r\n }\r\n\r\n public build(): I3mfDocument {\r\n if (!this._m) {\r\n throw new Error(\"Invalid state: you Must provide at least a model.\");\r\n }\r\n\r\n // we automate the build of the relationship if not provided..\r\n const path = `${Object3dDirName}${ModelFileName}`;\r\n if (!this._rs) {\r\n const absolutePath = `/${path}`;\r\n this.withRelationship(new ThreeMfRelationship(`rel${0}`, Known3mfRelationshipTypes.ThreeDimModel, absolutePath));\r\n }\r\n\r\n return new ThreeMfDocument(this._cts!, this._rs!, this._m);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"3mf.builder.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.builder.ts"],"names":[],"mappings":"AAAA,MAAM;AACN,OAAO,EAEH,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,GAClB,MAAM,OAAO,CAAC;AACf,OAAO,EAcH,aAAa,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAChI,OAAO,EAEH,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAKlB,MAAM,sBAAsB,CAAC;AAM9B,MAAM;AACN,MAAM,OAAO,oBAAoB;IAM7B;;;;OAIG;IACH,YAAmB,EAAiB,EAAE,IAAmB;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,IAAY;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,SAAiB;QAClC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,YAAY,CAAC,EAAoB,EAAE,QAAgB,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,KAAK;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,EAAiB,EAAE,IAAmB;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,oBAAoB;IAC9D;;;;OAIG;IACH,YAAmB,EAAiB,EAAE,OAAsB,aAAa,CAAC,KAAK;QAC3E,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACI,aAAa,CAAC,EAAiB,EAAE,CAAY;QAC/C,IAAI,CAAC,OAAO,CAAC,OAA0B,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,oBAAoB;IAUxD;;;OAGG;IACH,YAAmB,EAAiB;QAChC,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,uBAAuB,CAAC,MAAqB,EAAE,QAA0B;QAC5E,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,IAAoB;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,EAAiB,EAAE,CAAS;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,UAAU,CAAC,IAAoB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAEO,cAAc,CAAC,CAA2B;QAC9C,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAI,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,yBAAyB;gBACzB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACX,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,cAAc,CAAC,MAAkC;QACrD,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAI,CAAC;gBAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrC,yBAAyB;gBACzB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACX,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBACD,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAG/B,YAAmB,EAAiB;QAChC,IAAI,CAAC,EAAE,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,IAAY,EAAE,KAAoB;QAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC;YACJ,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,KAAK;QACR,OAAO,IAAI,CAAC,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU,CAAC,CAAkE;QACjF,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAElE,IAAI,OAAQ,CAAS,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,CAAC,CAAC;iBACvD,QAAQ,CAAC,EAAE,CAAC;iBACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;iBAChB,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAAhC;QAMI;;WAEG;QACH,WAAM,GAAiB,IAAI,YAAY,EAAE,CAAC;QAC1C;;WAEG;QACH,aAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAiH7C,CAAC;IA/GG;;;;;;;OAOG;IACI,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,QAAkB,EAAE,IAAa;QAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,QAAQ;YACR,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAgB,CAAC;QACrD,CAAC;QACD,2FAA2F;QAC3F,yCAAyC;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,QAAoD;QACpE,IAAI,QAAQ,YAAY,sBAAsB,EAAE,CAAC;YAC7C,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;YAChF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,MAAuC;QACnD,IAAI,MAAM,YAAY,kBAAkB,EAAE,CAAC;YACvC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,UAAiD;QACnE,IAAI,UAAU,YAAY,wBAAwB,EAAE,CAAC;YACjD,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,SAAS,CAAC,QAAuB,EAAE,SAAoB,EAAE,UAAmB;QAC/E,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,YAAY,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,IAAa;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,KAAK;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,KAAK;QACR,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;;AA5HD;;GAEG;AACI,gCAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,AAA9D,CAA+D;AA4HtF;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAK/B;;;;OAIG;IACI,eAAe,CAAC,IAAqB;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,GAAqB;QACzC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,oDAAoD;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,CAAkC;QAC/C,IAAI,CAAC,YAAY,mBAAmB,EAAE,CAAC;YACnC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACZ,oDAAoD;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QAED,8DAA8D;QAC9D,MAAM,IAAI,GAAG,GAAG,eAAe,GAAG,aAAa,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,yBAAyB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;QACrH,CAAC;QAED,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,IAAK,EAAE,IAAI,CAAC,GAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;CACJ","sourcesContent":["// 3MF\r\nimport {\r\n type Matrix3d,\r\n ThreeMfBase,\r\n ThreeMfBaseMaterials,\r\n ThreeMfBuild,\r\n ThreeMfComponent,\r\n ThreeMfComponents,\r\n ThreeMfItem,\r\n ThreeMfMesh,\r\n ThreeMfMeta,\r\n ThreeMfModel,\r\n ThreeMfObject,\r\n ThreeMfResources,\r\n ThreeMfTriangle,\r\n ThreeMfTriangles,\r\n ThreeMfVertex,\r\n ThreeMfVertices,\r\n} from \"./3mf\";\r\nimport {\r\n type I3mfBaseMaterials,\r\n type I3mfComponents,\r\n type I3mfMesh,\r\n type I3mfMetadata,\r\n type I3mfModel,\r\n type I3mfObject,\r\n type I3mfTriangle,\r\n type I3mfTriangles,\r\n type I3mfVertex,\r\n type I3mfVertices,\r\n type ST_ResourceID,\r\n type ST_ResourceIndex,\r\n type ST_Unit,\r\n ST_ObjectType,\r\n} from \"./3mf.interfaces\";\r\nimport { ThreeMfContentType, ThreeMfContentTypes, ThreeMfDocument, ThreeMfRelationship, ThreeMfRelationships } from \"./3mf.opc\";\r\nimport {\r\n type I3mfDocument,\r\n Known3mfRelationshipTypes,\r\n KnownI3mfContentType,\r\n ModelFileName,\r\n Object3dDirName,\r\n type I3mfContentType,\r\n type I3mfContentTypes,\r\n type I3mfRelationship,\r\n type I3mfRelationships,\r\n} from \"./3mf.opc.interfaces\";\r\nimport { type I3mfRGBAColor, type I3mfVertexData, type ThreeMfFloatArray, type ThreeMfIndicesArray } from \"./3mf.types\";\r\n\r\nexport type VertexHandler = (vertex: I3mfVertex) => I3mfVertex;\r\nexport type TriangleHandler = (triangle: I3mfTriangle) => I3mfTriangle;\r\n\r\n/** */\r\nexport class ThreeMfObjectBuilder {\r\n /**\r\n *\r\n */\r\n protected _object: ThreeMfObject;\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public constructor(id: ST_ResourceID, type: ST_ObjectType) {\r\n this._object = new ThreeMfObject(id, type);\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @returns\r\n */\r\n public withName(name: string): ThreeMfObjectBuilder {\r\n this._object.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param thumbnail\r\n * @returns\r\n */\r\n public withThumbnail(thumbnail: string): ThreeMfObjectBuilder {\r\n this._object.thumbnail = thumbnail;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param index\r\n * @returns\r\n */\r\n public withProperty(id: ST_ResourceIndex, index: number = 0): ThreeMfObjectBuilder {\r\n this._object.pid = id;\r\n this._object.id = index;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): I3mfObject {\r\n return this._object;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public reset(id: ST_ResourceID, type: ST_ObjectType) {\r\n this._object = new ThreeMfObject(id, type);\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfComponentsBuilder extends ThreeMfObjectBuilder {\r\n /**\r\n *\r\n * @param id\r\n * @param type\r\n */\r\n public constructor(id: ST_ResourceID, type: ST_ObjectType = ST_ObjectType.model) {\r\n super(id, type);\r\n this._object.content = new ThreeMfComponents();\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param t\r\n * @returns\r\n */\r\n public withComponent(id: ST_ResourceID, t?: Matrix3d): ThreeMfComponentsBuilder {\r\n (this._object.content as I3mfComponents).component.push(new ThreeMfComponent(id, t));\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfMeshBuilder extends ThreeMfObjectBuilder {\r\n /**\r\n *\r\n */\r\n _vh?: VertexHandler;\r\n /**\r\n *\r\n */\r\n _th?: TriangleHandler;\r\n\r\n /**\r\n *\r\n * @param id\r\n */\r\n public constructor(id: ST_ResourceID) {\r\n super(id, ST_ObjectType.model);\r\n }\r\n\r\n /**\r\n *\r\n * @param vertex\r\n * @param triangle\r\n * @returns\r\n */\r\n public withPostProcessHandlers(vertex: VertexHandler, triangle?: TriangleHandler): ThreeMfMeshBuilder {\r\n this._vh = vertex;\r\n this._th = triangle;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n withData(data: I3mfVertexData): ThreeMfMeshBuilder {\r\n this._object.content = this._buildMesh(data);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param id\r\n * @param i\r\n * @returns\r\n */\r\n withMaterial(id: ST_ResourceID, i: number): ThreeMfMeshBuilder {\r\n this._object.pid = id;\r\n this._object.pindex = i;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n private _buildMesh(data: I3mfVertexData): I3mfMesh {\r\n const vertices = this._buildVertices(data.positions);\r\n const triangles = this._buildTriangle(data.indices);\r\n return new ThreeMfMesh(vertices, triangles);\r\n }\r\n\r\n private _buildVertices(p: ThreeMfFloatArray | null): I3mfVertices {\r\n const container = new ThreeMfVertices();\r\n if (p) {\r\n for (let i = 0; i < p.length; ) {\r\n const x = p[i++];\r\n const y = p[i++];\r\n const z = p[i++];\r\n let v = new ThreeMfVertex(x, y, z);\r\n // might be optimized....\r\n if (this._vh) {\r\n v = this._vh(v);\r\n }\r\n container.vertex.push(v);\r\n }\r\n }\r\n return container;\r\n }\r\n\r\n private _buildTriangle(indice: ThreeMfIndicesArray | null): I3mfTriangles {\r\n const container = new ThreeMfTriangles();\r\n if (indice) {\r\n for (let i = 0; i < indice.length; ) {\r\n const a = indice[i++];\r\n const b = indice[i++];\r\n const c = indice[i++];\r\n let t = new ThreeMfTriangle(a, b, c);\r\n // might be optimized....\r\n if (this._th) {\r\n t = this._th(t);\r\n }\r\n container.triangle.push(t);\r\n }\r\n }\r\n return container;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfMaterialBuilder {\r\n private _m: I3mfBaseMaterials;\r\n\r\n public constructor(id: ST_ResourceID) {\r\n this._m = new ThreeMfBaseMaterials(id);\r\n }\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param color\r\n * @returns\r\n */\r\n public withColor(name: string, color: I3mfRGBAColor): ThreeMfMaterialBuilder {\r\n this._m.base = this._m.base ?? [];\r\n let m = this._m.base.find((m) => m.name.toLowerCase() === name.toLowerCase());\r\n if (m) {\r\n m.displaycolor = this._rgbaToHex(color);\r\n return this;\r\n }\r\n m = new ThreeMfBase(name, this._rgbaToHex(color));\r\n this._m.base.push(m);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): I3mfBaseMaterials {\r\n return this._m;\r\n }\r\n\r\n private _rgbaToHex(c: I3mfRGBAColor | { r: number; g: number; b: number; a?: number }): string {\r\n const toSRGB = (c: number) => Math.round(Math.min(255, Math.max(0, Math.pow(c, 1 / 2.2) * 255)));\r\n\r\n const r = toSRGB(c.r).toString(16).padStart(2, \"0\").toUpperCase();\r\n const g = toSRGB(c.g).toString(16).padStart(2, \"0\").toUpperCase();\r\n const b = toSRGB(c.b).toString(16).padStart(2, \"0\").toUpperCase();\r\n\r\n if (typeof (c as any).a === \"number\") {\r\n const a = Math.round(Math.min(255, Math.max(0, c.a! * 255)))\r\n .toString(16)\r\n .padStart(2, \"0\")\r\n .toUpperCase();\r\n return `#${r}${g}${b}${a}`;\r\n }\r\n\r\n return `#${r}${g}${b}`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfModelBuilder {\r\n /**\r\n *\r\n */\r\n static KnownMetaSet = new Set(ThreeMfModel.KnownMeta.map((m) => m.toLowerCase()));\r\n\r\n /**\r\n *\r\n */\r\n _model: ThreeMfModel = new ThreeMfModel();\r\n /**\r\n *\r\n */\r\n _objects = new Map<string, I3mfObject>();\r\n\r\n /**\r\n *\r\n * @param name\r\n * @param value\r\n * @param preserve\r\n * @param type\r\n * @returns\r\n */\r\n public withMetaData(name: string, value: string, preserve?: boolean, type?: string): ThreeMfModelBuilder {\r\n if (!this._model.metadata) {\r\n // lazzy\r\n this._model.metadata = new Array<I3mfMetadata>();\r\n }\r\n //const isKnownMeta = (s: string): boolean => TMFBuilder.knownMetaSet.has(s.toLowerCase());\r\n //const qn:IQName = xmlNameToParts(name);\r\n this._model.metadata.push(new ThreeMfMeta(name, value, preserve, type));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param material\r\n * @returns\r\n */\r\n public withMaterial(material: I3mfBaseMaterials | ThreeMfMaterialBuilder): ThreeMfModelBuilder {\r\n if (material instanceof ThreeMfMaterialBuilder) {\r\n material = material.build();\r\n }\r\n if (material) {\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.basematerials = this._model.resources.basematerials ?? [];\r\n this._model.resources.basematerials.push(material);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param object\r\n * @returns\r\n */\r\n public withMesh(object: I3mfObject | ThreeMfMeshBuilder): ThreeMfModelBuilder {\r\n if (object instanceof ThreeMfMeshBuilder) {\r\n object = object.build();\r\n }\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.object.push(object);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param components\r\n * @returns\r\n */\r\n public withComponents(components: I3mfObject | ThreeMfComponentsBuilder): ThreeMfModelBuilder {\r\n if (components instanceof ThreeMfComponentsBuilder) {\r\n components = components.build();\r\n }\r\n this._model.resources = this._model.resources ?? new ThreeMfResources();\r\n this._model.resources.object.push(components);\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param objectid\r\n * @param transform\r\n * @param partnumber\r\n * @returns\r\n */\r\n public withBuild(objectid: ST_ResourceID, transform?: Matrix3d, partnumber?: string): ThreeMfModelBuilder {\r\n this._model.build = this._model.build ?? new ThreeMfBuild();\r\n this._model.build.item?.push(new ThreeMfItem(objectid, transform, partnumber));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param unit\r\n * @returns\r\n */\r\n public withUnit(unit: ST_Unit): ThreeMfModelBuilder {\r\n this._model.unit = unit;\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public reset(): ThreeMfModelBuilder {\r\n this._model = new ThreeMfModel();\r\n this._objects = new Map<string, I3mfObject>();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @returns\r\n */\r\n public build(): ThreeMfModel {\r\n // quick surface check..\r\n if (!this._model.resources?.object?.length) {\r\n throw new Error(\"Invalid state: resources MUST be defined \");\r\n }\r\n if (!this._model.build?.item?.length) {\r\n throw new Error(\"Invalid state: Build MUST be defined \");\r\n }\r\n return this._model;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport class ThreeMfDocumentBuilder {\r\n private _cts?: I3mfContentTypes;\r\n private _rs?: I3mfRelationships;\r\n private _m?: I3mfModel;\r\n\r\n /**\r\n *\r\n * @param type\r\n * @returns\r\n */\r\n public withContentType(type: I3mfContentType): ThreeMfDocumentBuilder {\r\n if (!this._cts) {\r\n this._cts = new ThreeMfContentTypes();\r\n }\r\n const arr = this._cts.items;\r\n if (!arr.some((x) => x.ext === type.ext && x.ct === type.ct)) {\r\n arr.push(type);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param rel\r\n * @returns\r\n */\r\n public withRelationship(rel: I3mfRelationship): ThreeMfDocumentBuilder {\r\n if (!this._rs) {\r\n this._rs = new ThreeMfRelationships();\r\n }\r\n const arr = this._rs.items;\r\n if (!arr.some((x) => x.id === rel.id)) {\r\n arr.push(rel);\r\n }\r\n // here we ensure that the content type is declared.\r\n this.withContentType(new ThreeMfContentType(\"rels\", KnownI3mfContentType.Relationships));\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param m\r\n * @returns\r\n */\r\n public withModel(m: I3mfModel | ThreeMfModelBuilder): ThreeMfDocumentBuilder {\r\n if (m instanceof ThreeMfModelBuilder) {\r\n m = m.build();\r\n }\r\n this._m = m;\r\n // here we ensure that the content type is declared.\r\n this.withContentType(new ThreeMfContentType(\"model\", KnownI3mfContentType.Model));\r\n return this;\r\n }\r\n\r\n public build(): I3mfDocument {\r\n if (!this._m) {\r\n throw new Error(\"Invalid state: you Must provide at least a model.\");\r\n }\r\n\r\n // we automate the build of the relationship if not provided..\r\n const path = `${Object3dDirName}${ModelFileName}`;\r\n if (!this._rs) {\r\n const absolutePath = `/${path}`;\r\n this.withRelationship(new ThreeMfRelationship(`rel${0}`, Known3mfRelationshipTypes.ThreeDimModel, absolutePath));\r\n }\r\n\r\n return new ThreeMfDocument(this._cts!, this._rs!, this._m);\r\n }\r\n}\r\n"]}
@@ -1,7 +1,6 @@
1
1
  import { type IFormatter } from "../xml/xml.interfaces.js";
2
2
  import { type IXmlSerializerFormatOptions, NumberFormatter } from "../xml/xml.serializer.format.js";
3
- import type { I3mfBase, I3mfBaseMaterials, I3mfBuild, I3mfComponent, I3mfComponents, I3mfItem, I3mfMesh, I3mfMetadata, I3mfMetadataGroup, I3mfModel, I3mfObject, I3mfResources, I3mfTriangle, I3mfTriangles, I3mfVertex, I3mfVertices, ST_ColorValue, ST_Number, ST_ResourceID, ST_ResourceIndex, ST_UriReference, IMatrix3d, ST_Matrix3D } from "./3mf.interfaces.js";
4
- import { ST_Unit, ST_ObjectType } from "./3mf.interfaces.js";
3
+ import { type I3mfBase, type I3mfBaseMaterials, type I3mfBuild, type I3mfComponent, type I3mfComponents, type I3mfItem, type I3mfMesh, type I3mfMetadata, type I3mfMetadataGroup, type I3mfModel, type I3mfObject, type I3mfResources, type I3mfTriangle, type I3mfTriangles, type I3mfVertex, type I3mfVertices, type ST_ColorValue, type ST_Number, type ST_ResourceID, type ST_ResourceIndex, type ST_UriReference, type IMatrix3d, type ST_Matrix3D, ST_Unit, ST_ObjectType } from "./3mf.interfaces.js";
5
4
  /**
6
5
  *
7
6
  */
@@ -1,7 +1,7 @@
1
1
  import { __decorate } from "@onerjs/core/tslib.es6.js";
2
2
  import { XmlAttr, XmlName } from "../xml/xml.interfaces.js";
3
3
  import { NumberFormatter } from "../xml/xml.serializer.format.js";
4
- import { ST_Unit, ThreeDimModelNamespace, ST_ObjectType } from "./3mf.interfaces.js";
4
+ import { ST_Unit, ThreeDimModelNamespace, ST_ObjectType, } from "./3mf.interfaces.js";
5
5
  /**
6
6
  *
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"3mf.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IFormatter, XmlAttr, XmlName } from \"../xml/xml.interfaces\";\nimport { type IXmlSerializerFormatOptions, NumberFormatter } from \"../xml/xml.serializer.format\";\nimport type {\n I3mfBase,\n I3mfBaseMaterials,\n I3mfBuild,\n I3mfComponent,\n I3mfComponents,\n I3mfItem,\n I3mfMesh,\n I3mfMetadata,\n I3mfMetadataGroup,\n I3mfModel,\n I3mfObject,\n I3mfResources,\n I3mfTriangle,\n I3mfTriangles,\n I3mfVertex,\n I3mfVertices,\n ST_ColorValue,\n ST_Number,\n ST_ResourceID,\n ST_ResourceIndex,\n ST_UriReference,\n IMatrix3d,\n ST_Matrix3D,\n} from \"./3mf.interfaces\";\nimport { ST_Unit, ThreeDimModelNamespace, ST_ObjectType } from \"./3mf.interfaces\";\n\n/**\n *\n */\nexport class Matrix3d implements IMatrix3d {\n /**\n *\n * @returns\n */\n public static Zero() {\n return new Matrix3d([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n }\n /**\n *\n * @param values\n */\n public constructor(public values: ST_Matrix3D) {}\n\n /**\n *\n * @returns\n */\n public toString(): string {\n return this.values.join(\" \");\n }\n}\n\n/**\n *\n */\nexport class MatrixFormatter implements IFormatter<Matrix3d> {\n /**\n *\n */\n _f: NumberFormatter;\n\n public constructor(public o: IXmlSerializerFormatOptions) {\n this._f = new NumberFormatter(o);\n }\n\n public toString(x: Matrix3d): string {\n return x.values.map((v) => this._f.toString(v)).join(\" \");\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"model\" })\nexport class ThreeMfModel implements I3mfModel {\n /**\n *\n */\n public static KnownMeta: Array<string> = [\"Title\", \"Designer\", \"Description\", \"Copyright\", \"LicenseTerms\", \"Rating\", \"CreationDate\", \"ModificationDate\", \"Application\"];\n\n /**\n *\n */\n @XmlAttr({ name: \"unit\" })\n unit: ST_Unit = ST_Unit.millimeter;\n\n /**\n *\n */\n @XmlAttr({ name: \"requiredextensions\" })\n requiredextensions?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"recommendedextensions\" })\n recommendedextensions?: string;\n\n /**\n *\n */\n metadata?: Array<I3mfMetadata>;\n /**\n *\n */\n resources?: I3mfResources;\n /**\n *\n */\n build?: I3mfBuild;\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"meta\" })\nexport class ThreeMfMeta implements I3mfMetadata {\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"preserve\" })\n preserve?: boolean;\n\n /**\n *\n */\n @XmlAttr({ name: \"type\" })\n type?: string;\n\n /**\n *\n */\n value: string;\n\n /**\n *\n * @param name\n * @param value\n * @param preserve\n * @param type\n */\n public constructor(name: string, value: string, preserve?: boolean, type?: string) {\n this.name = name;\n this.value = value;\n this.preserve = preserve;\n this.type = type;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"metadatagroup\" })\nexport class ThreeMfMetadataGroup implements I3mfMetadataGroup {\n /**\n *\n */\n metadata: Array<I3mfMetadata> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"resources\" })\nexport class ThreeMfResources implements I3mfResources {\n /**\n *\n */\n object: Array<I3mfObject> = [];\n /**\n *\n */\n basematerials?: Array<I3mfBaseMaterials>;\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"object\" })\nexport class ThreeMfObject implements I3mfObject {\n /**\n *\n */\n @XmlAttr({ name: \"id\" })\n id: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"type\" })\n type?: ST_ObjectType;\n\n /**\n *\n */\n @XmlAttr({ name: \"thumbnail\" })\n thumbnail?: ST_UriReference;\n\n /**\n *\n */\n @XmlAttr({ name: \"partnumber\" })\n partnumber?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"pid\" })\n pid?: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"pindex\" })\n pindex?: ST_ResourceIndex;\n\n /**\n *\n */\n metadatagroup?: I3mfMetadataGroup;\n\n /**\n *\n */\n content?: I3mfMesh | I3mfComponents;\n\n public constructor(id: ST_ResourceID, type = ST_ObjectType.model) {\n this.id = id;\n this.type = type;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"mesh\" })\nexport class ThreeMfMesh implements I3mfMesh {\n /**\n *\n */\n vertices: I3mfVertices;\n /**\n *\n */\n triangles: I3mfTriangles;\n\n public constructor(vertices?: I3mfVertices, triangles?: I3mfTriangles) {\n this.vertices = vertices ?? new ThreeMfVertices();\n this.triangles = triangles ?? new ThreeMfTriangles();\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"vertices\" })\nexport class ThreeMfVertices implements I3mfVertices {\n /**\n *\n */\n vertex: Array<I3mfVertex> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"vertex\" })\nexport class ThreeMfVertex implements I3mfVertex {\n /**\n *\n */\n @XmlAttr({ name: \"x\" })\n x: ST_Number;\n\n /**\n *\n */\n @XmlAttr({ name: \"y\" })\n y: ST_Number;\n\n /**\n *\n */\n @XmlAttr({ name: \"z\" })\n z: ST_Number;\n\n public constructor(x: ST_Number = 0, y: ST_Number = 0, z: ST_Number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"triangles\" })\nexport class ThreeMfTriangles implements I3mfTriangles {\n /**\n *\n */\n triangle: Array<I3mfTriangle> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"triangle\" })\nexport class ThreeMfTriangle implements I3mfTriangle {\n /**\n *\n */\n @XmlAttr({ name: \"v1\" })\n v1: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"v2\" })\n v2: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"v3\" })\n v3: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p1\" })\n p1?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p2\" })\n p2?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p3\" })\n p3?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"pid\" })\n pid?: ST_ResourceID;\n\n public constructor(v1: ST_ResourceIndex, v2: ST_ResourceIndex, v3: ST_ResourceIndex) {\n this.v1 = v1;\n this.v2 = v2;\n this.v3 = v3;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"components\" })\nexport class ThreeMfComponents implements I3mfComponents {\n /**\n *\n */\n component: Array<I3mfComponent> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"component\" })\nexport class ThreeMfComponent implements I3mfComponent {\n /**\n *\n */\n @XmlAttr({ name: \"objectid\" })\n objectid: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"transform\", formatter: MatrixFormatter })\n transform?: Matrix3d;\n\n public constructor(objectid: ST_ResourceID, transform?: Matrix3d) {\n this.objectid = objectid;\n this.transform = transform;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"basematerials\" })\nexport class ThreeMfBaseMaterials implements I3mfBaseMaterials {\n /**\n *\n */\n @XmlAttr({ name: \"id\" })\n id: ST_ResourceID;\n\n /**\n *\n */\n base: Array<I3mfBase> = [];\n\n public constructor(id: ST_ResourceID) {\n this.id = id;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"base\" })\nexport class ThreeMfBase implements I3mfBase {\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"displaycolor\" })\n displaycolor: ST_ColorValue;\n\n public constructor(name: string, displaycolor: ST_ColorValue) {\n this.name = name;\n this.displaycolor = displaycolor;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"build\" })\nexport class ThreeMfBuild implements I3mfBuild {\n /**\n *\n */\n item: Array<I3mfItem> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"item\" })\nexport class ThreeMfItem implements I3mfItem {\n /**\n *\n */\n @XmlAttr({ name: \"objectid\" })\n objectid: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"transform\", formatter: MatrixFormatter })\n transform?: Matrix3d;\n\n /**\n *\n */\n @XmlAttr({ name: \"partnumber\" })\n partnumber?: string;\n\n /**\n *\n */\n metadatagroup?: I3mfMetadataGroup;\n\n public constructor(objectid: ST_ResourceID, transform?: Matrix3d, partnumber?: string) {\n this.objectid = objectid;\n this.transform = transform;\n this.partnumber = partnumber;\n }\n}\n"]}
1
+ {"version":3,"file":"3mf.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IFormatter, XmlAttr, XmlName } from \"../xml/xml.interfaces\";\nimport { type IXmlSerializerFormatOptions, NumberFormatter } from \"../xml/xml.serializer.format\";\nimport {\n type I3mfBase,\n type I3mfBaseMaterials,\n type I3mfBuild,\n type I3mfComponent,\n type I3mfComponents,\n type I3mfItem,\n type I3mfMesh,\n type I3mfMetadata,\n type I3mfMetadataGroup,\n type I3mfModel,\n type I3mfObject,\n type I3mfResources,\n type I3mfTriangle,\n type I3mfTriangles,\n type I3mfVertex,\n type I3mfVertices,\n type ST_ColorValue,\n type ST_Number,\n type ST_ResourceID,\n type ST_ResourceIndex,\n type ST_UriReference,\n type IMatrix3d,\n type ST_Matrix3D,\n ST_Unit,\n ThreeDimModelNamespace,\n ST_ObjectType,\n} from \"./3mf.interfaces\";\n\n/**\n *\n */\nexport class Matrix3d implements IMatrix3d {\n /**\n *\n * @returns\n */\n public static Zero() {\n return new Matrix3d([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n }\n /**\n *\n * @param values\n */\n public constructor(public values: ST_Matrix3D) {}\n\n /**\n *\n * @returns\n */\n public toString(): string {\n return this.values.join(\" \");\n }\n}\n\n/**\n *\n */\nexport class MatrixFormatter implements IFormatter<Matrix3d> {\n /**\n *\n */\n _f: NumberFormatter;\n\n public constructor(public o: IXmlSerializerFormatOptions) {\n this._f = new NumberFormatter(o);\n }\n\n public toString(x: Matrix3d): string {\n return x.values.map((v) => this._f.toString(v)).join(\" \");\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"model\" })\nexport class ThreeMfModel implements I3mfModel {\n /**\n *\n */\n public static KnownMeta: Array<string> = [\"Title\", \"Designer\", \"Description\", \"Copyright\", \"LicenseTerms\", \"Rating\", \"CreationDate\", \"ModificationDate\", \"Application\"];\n\n /**\n *\n */\n @XmlAttr({ name: \"unit\" })\n unit: ST_Unit = ST_Unit.millimeter;\n\n /**\n *\n */\n @XmlAttr({ name: \"requiredextensions\" })\n requiredextensions?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"recommendedextensions\" })\n recommendedextensions?: string;\n\n /**\n *\n */\n metadata?: Array<I3mfMetadata>;\n /**\n *\n */\n resources?: I3mfResources;\n /**\n *\n */\n build?: I3mfBuild;\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"meta\" })\nexport class ThreeMfMeta implements I3mfMetadata {\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"preserve\" })\n preserve?: boolean;\n\n /**\n *\n */\n @XmlAttr({ name: \"type\" })\n type?: string;\n\n /**\n *\n */\n value: string;\n\n /**\n *\n * @param name\n * @param value\n * @param preserve\n * @param type\n */\n public constructor(name: string, value: string, preserve?: boolean, type?: string) {\n this.name = name;\n this.value = value;\n this.preserve = preserve;\n this.type = type;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"metadatagroup\" })\nexport class ThreeMfMetadataGroup implements I3mfMetadataGroup {\n /**\n *\n */\n metadata: Array<I3mfMetadata> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"resources\" })\nexport class ThreeMfResources implements I3mfResources {\n /**\n *\n */\n object: Array<I3mfObject> = [];\n /**\n *\n */\n basematerials?: Array<I3mfBaseMaterials>;\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"object\" })\nexport class ThreeMfObject implements I3mfObject {\n /**\n *\n */\n @XmlAttr({ name: \"id\" })\n id: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"type\" })\n type?: ST_ObjectType;\n\n /**\n *\n */\n @XmlAttr({ name: \"thumbnail\" })\n thumbnail?: ST_UriReference;\n\n /**\n *\n */\n @XmlAttr({ name: \"partnumber\" })\n partnumber?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"pid\" })\n pid?: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"pindex\" })\n pindex?: ST_ResourceIndex;\n\n /**\n *\n */\n metadatagroup?: I3mfMetadataGroup;\n\n /**\n *\n */\n content?: I3mfMesh | I3mfComponents;\n\n public constructor(id: ST_ResourceID, type = ST_ObjectType.model) {\n this.id = id;\n this.type = type;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"mesh\" })\nexport class ThreeMfMesh implements I3mfMesh {\n /**\n *\n */\n vertices: I3mfVertices;\n /**\n *\n */\n triangles: I3mfTriangles;\n\n public constructor(vertices?: I3mfVertices, triangles?: I3mfTriangles) {\n this.vertices = vertices ?? new ThreeMfVertices();\n this.triangles = triangles ?? new ThreeMfTriangles();\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"vertices\" })\nexport class ThreeMfVertices implements I3mfVertices {\n /**\n *\n */\n vertex: Array<I3mfVertex> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"vertex\" })\nexport class ThreeMfVertex implements I3mfVertex {\n /**\n *\n */\n @XmlAttr({ name: \"x\" })\n x: ST_Number;\n\n /**\n *\n */\n @XmlAttr({ name: \"y\" })\n y: ST_Number;\n\n /**\n *\n */\n @XmlAttr({ name: \"z\" })\n z: ST_Number;\n\n public constructor(x: ST_Number = 0, y: ST_Number = 0, z: ST_Number = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"triangles\" })\nexport class ThreeMfTriangles implements I3mfTriangles {\n /**\n *\n */\n triangle: Array<I3mfTriangle> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"triangle\" })\nexport class ThreeMfTriangle implements I3mfTriangle {\n /**\n *\n */\n @XmlAttr({ name: \"v1\" })\n v1: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"v2\" })\n v2: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"v3\" })\n v3: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p1\" })\n p1?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p2\" })\n p2?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"p3\" })\n p3?: ST_ResourceIndex;\n\n /**\n *\n */\n @XmlAttr({ name: \"pid\" })\n pid?: ST_ResourceID;\n\n public constructor(v1: ST_ResourceIndex, v2: ST_ResourceIndex, v3: ST_ResourceIndex) {\n this.v1 = v1;\n this.v2 = v2;\n this.v3 = v3;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"components\" })\nexport class ThreeMfComponents implements I3mfComponents {\n /**\n *\n */\n component: Array<I3mfComponent> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"component\" })\nexport class ThreeMfComponent implements I3mfComponent {\n /**\n *\n */\n @XmlAttr({ name: \"objectid\" })\n objectid: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"transform\", formatter: MatrixFormatter })\n transform?: Matrix3d;\n\n public constructor(objectid: ST_ResourceID, transform?: Matrix3d) {\n this.objectid = objectid;\n this.transform = transform;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"basematerials\" })\nexport class ThreeMfBaseMaterials implements I3mfBaseMaterials {\n /**\n *\n */\n @XmlAttr({ name: \"id\" })\n id: ST_ResourceID;\n\n /**\n *\n */\n base: Array<I3mfBase> = [];\n\n public constructor(id: ST_ResourceID) {\n this.id = id;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"base\" })\nexport class ThreeMfBase implements I3mfBase {\n /**\n *\n */\n @XmlAttr({ name: \"name\" })\n name: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"displaycolor\" })\n displaycolor: ST_ColorValue;\n\n public constructor(name: string, displaycolor: ST_ColorValue) {\n this.name = name;\n this.displaycolor = displaycolor;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"build\" })\nexport class ThreeMfBuild implements I3mfBuild {\n /**\n *\n */\n item: Array<I3mfItem> = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: ThreeDimModelNamespace, name: \"item\" })\nexport class ThreeMfItem implements I3mfItem {\n /**\n *\n */\n @XmlAttr({ name: \"objectid\" })\n objectid: ST_ResourceID;\n\n /**\n *\n */\n @XmlAttr({ name: \"transform\", formatter: MatrixFormatter })\n transform?: Matrix3d;\n\n /**\n *\n */\n @XmlAttr({ name: \"partnumber\" })\n partnumber?: string;\n\n /**\n *\n */\n metadatagroup?: I3mfMetadataGroup;\n\n public constructor(objectid: ST_ResourceID, transform?: Matrix3d, partnumber?: string) {\n this.objectid = objectid;\n this.transform = transform;\n this.partnumber = partnumber;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { I3mfModel } from "./3mf.interfaces.js";
2
- import type { I3mfContentTypes, I3mfContentType, I3mfRelationships, I3mfRelationship, I3mfDocument } from "./3mf.opc.interfaces.js";
1
+ import { type I3mfModel } from "./3mf.interfaces.js";
2
+ import { type I3mfContentTypes, type I3mfContentType, type I3mfRelationships, type I3mfRelationship, type I3mfDocument } from "./3mf.opc.interfaces.js";
3
3
  /**
4
4
  *
5
5
  */
@@ -1,4 +1,4 @@
1
- import type { I3mfModel } from "./3mf.interfaces.js";
1
+ import { type I3mfModel } from "./3mf.interfaces.js";
2
2
  export declare const OpenXmlContentTypesNamespace = "http://schemas.openxmlformats.org/package/2006/content-types";
3
3
  export declare const OpenXmlRelationshipsNamespace = "http://schemas.openxmlformats.org/package/2006/relationships";
4
4
  export declare enum KnownI3mfContentType {
@@ -1 +1 @@
1
- {"version":3,"file":"3mf.opc.interfaces.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.opc.interfaces.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,4BAA4B,GAAG,8DAA8D,CAAC;AAC3G,MAAM,CAAC,MAAM,6BAA6B,GAAG,8DAA8D,CAAC;AAE5G,MAAM,CAAN,IAAY,oBAsBX;AAtBD,WAAY,oBAAoB;IAC5B,WAAW;IACX,kGAA0E,CAAA;IAE1E,WAAW;IACX,wFAAgE,CAAA;IAEhE,yBAAyB;IACzB,6FAAqE,CAAA;IACrE,wFAAgE,CAAA;IAChE,0FAAkE,CAAA;IAClE,8FAAsE,CAAA;IACtE,gGAAwE,CAAA;IACxE,sFAA8D,CAAA;IAC9D,kGAA0E,CAAA;IAC1E,sGAA8E,CAAA;IAE9E,SAAS;IACT,yCAAiB,CAAA;IACjB,2CAAmB,CAAA;IACnB,2CAAmB,CAAA;IACnB,+CAAuB,CAAA;AAC3B,CAAC,EAtBW,oBAAoB,KAApB,oBAAoB,QAsB/B;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IA+BlC;;;;OAIG;IACI,MAAM,CAAC,OAAO,CAAC,IAAY;QAC9B,OAAO,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAAC,IAAY;QACtC,OAAO,IAAI,KAAK,yBAAyB,CAAC,aAAa,CAAC;IAC5D,CAAC;;AA9CD;;GAEG;AACoB,uCAAa,GAAG,8DAA8D,CAAC;AAEtG;;GAEG;AACoB,mCAAS,GAAG,iFAAiF,CAAC;AAErH;;GAEG;AACoB,qCAAW,GAAG,kEAAkE,CAAC;AAExG;;GAEG;AACoB,sCAAY,GAAG,2EAA2E,CAAC;AAElH;;GAEG;AACoB,+BAAK,GAAwB,IAAI,GAAG,CAAS;IAChE,yBAAyB,CAAC,aAAa;IACvC,yBAAyB,CAAC,SAAS;IACnC,yBAAyB,CAAC,WAAW;IACrC,yBAAyB,CAAC,YAAY;CACzC,CAAC,CAAC","sourcesContent":["import type { I3mfModel } from \"./3mf.interfaces\";\n\nexport const OpenXmlContentTypesNamespace = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nexport const OpenXmlRelationshipsNamespace = \"http://schemas.openxmlformats.org/package/2006/relationships\";\n\nexport enum KnownI3mfContentType {\n // OPC core\n Relationships = \"application/vnd.openxmlformats-package.relationships+xml\",\n\n // 3MF core\n Model = \"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\",\n\n // Extensions officielles\n Materials = \"application/vnd.ms-package.3dmanufacturing-material+xml\",\n Colors = \"application/vnd.ms-package.3dmanufacturing-colors+xml\",\n Texture = \"application/vnd.ms-package.3dmanufacturing-texture+xml\",\n Texture2D = \"application/vnd.ms-package.3dmanufacturing-texture2d+xml\",\n Production = \"application/vnd.ms-package.3dmanufacturing-production+xml\",\n Slice = \"application/vnd.ms-package.3dmanufacturing-slice+xml\",\n BeamLattice = \"application/vnd.ms-package.3dmanufacturing-beamlattice+xml\",\n SecureContent = \"application/vnd.ms-package.3dmanufacturing-securecontent+xml\",\n\n // Assets\n Png = \"image/png\",\n Jpeg = \"image/jpeg\",\n Tiff = \"image/tiff\",\n Xml = \"application/xml\",\n}\n\nexport const RelationshipDirName = \"_rels/\";\nexport const Object3dDirName = \"3D/\";\nexport const ModelFileName = `3dmodel.model`;\nexport const RelationshipFileName = `.rels`;\nexport const ContentTypeFileName = \"[Content_Types].xml\";\n\n/**\n * Common OPC and 3MF relationship Type URIs.\n */\nexport class Known3mfRelationshipTypes {\n /**\n * 3MF core: points to the main .model part of the package\n */\n public static readonly ThreeDimModel = \"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\";\n\n /**\n * OPC core: points to a package thumbnail (often used by 3MF packages)\n */\n public static readonly Thumbnail = \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail\";\n\n /**\n * 3MF (print ticket): optional printing settings part (rarely used by slicers)\n */\n public static readonly PrintTicket = \"http://schemas.microsoft.com/3dmanufacturing/2013/01/printticket\";\n\n /**\n * OPC core: indicates parts that must be preserved when editing the package\n */\n public static readonly MustPreserve = \"http://schemas.openxmlformats.org/package/2006/relationships/mustpreserve\";\n\n /**\n * Convenience set for quick checks\n */\n public static readonly Known: ReadonlySet<string> = new Set<string>([\n Known3mfRelationshipTypes.ThreeDimModel,\n Known3mfRelationshipTypes.Thumbnail,\n Known3mfRelationshipTypes.PrintTicket,\n Known3mfRelationshipTypes.MustPreserve,\n ]);\n\n /**\n * Test if the relationship Type is one of the common known URIs above\n * @param type\n * @returns true if the relationship Type is one of the common known URIs above\n */\n public static IsKnown(type: string): boolean {\n return Known3mfRelationshipTypes.Known.has(type);\n }\n\n /**\n * test if the relationship Type is the main 3MF model entry point\n * @param type\n * @returns true if the relationship Type is the main 3MF model entry point\n */\n public static IsThreeDimModel(type: string): boolean {\n return type === Known3mfRelationshipTypes.ThreeDimModel;\n }\n}\n\n/**\n *\n */\nexport interface I3mfContentTypes {\n /**\n *\n */\n items: I3mfContentType[];\n}\n\n/**\n *\n */\nexport interface I3mfContentType {\n /**\n *\n */\n ext: string;\n /**\n *\n */\n ct: string;\n}\n\n/**\n *\n */\nexport interface I3mfRelationships {\n /**\n *\n */\n items: I3mfRelationship[];\n}\n\n/**\n *\n */\nexport interface I3mfRelationship {\n /**\n *\n */\n id: string;\n\n /**\n *\n */\n type?: string;\n\n /**\n *\n */\n target?: string;\n}\n\n/**\n *\n */\nexport interface I3mfDocument {\n /**\n *\n */\n contentTypes: I3mfContentTypes;\n /**\n *\n */\n relationships: I3mfRelationships;\n /**\n *\n */\n model: I3mfModel;\n}\n"]}
1
+ {"version":3,"file":"3mf.opc.interfaces.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.opc.interfaces.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,4BAA4B,GAAG,8DAA8D,CAAC;AAC3G,MAAM,CAAC,MAAM,6BAA6B,GAAG,8DAA8D,CAAC;AAE5G,MAAM,CAAN,IAAY,oBAsBX;AAtBD,WAAY,oBAAoB;IAC5B,WAAW;IACX,kGAA0E,CAAA;IAE1E,WAAW;IACX,wFAAgE,CAAA;IAEhE,yBAAyB;IACzB,6FAAqE,CAAA;IACrE,wFAAgE,CAAA;IAChE,0FAAkE,CAAA;IAClE,8FAAsE,CAAA;IACtE,gGAAwE,CAAA;IACxE,sFAA8D,CAAA;IAC9D,kGAA0E,CAAA;IAC1E,sGAA8E,CAAA;IAE9E,SAAS;IACT,yCAAiB,CAAA;IACjB,2CAAmB,CAAA;IACnB,2CAAmB,CAAA;IACnB,+CAAuB,CAAA;AAC3B,CAAC,EAtBW,oBAAoB,KAApB,oBAAoB,QAsB/B;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IA+BlC;;;;OAIG;IACI,MAAM,CAAC,OAAO,CAAC,IAAY;QAC9B,OAAO,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,eAAe,CAAC,IAAY;QACtC,OAAO,IAAI,KAAK,yBAAyB,CAAC,aAAa,CAAC;IAC5D,CAAC;;AA9CD;;GAEG;AACoB,uCAAa,GAAG,8DAA8D,CAAC;AAEtG;;GAEG;AACoB,mCAAS,GAAG,iFAAiF,CAAC;AAErH;;GAEG;AACoB,qCAAW,GAAG,kEAAkE,CAAC;AAExG;;GAEG;AACoB,sCAAY,GAAG,2EAA2E,CAAC;AAElH;;GAEG;AACoB,+BAAK,GAAwB,IAAI,GAAG,CAAS;IAChE,yBAAyB,CAAC,aAAa;IACvC,yBAAyB,CAAC,SAAS;IACnC,yBAAyB,CAAC,WAAW;IACrC,yBAAyB,CAAC,YAAY;CACzC,CAAC,CAAC","sourcesContent":["import { type I3mfModel } from \"./3mf.interfaces\";\n\nexport const OpenXmlContentTypesNamespace = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nexport const OpenXmlRelationshipsNamespace = \"http://schemas.openxmlformats.org/package/2006/relationships\";\n\nexport enum KnownI3mfContentType {\n // OPC core\n Relationships = \"application/vnd.openxmlformats-package.relationships+xml\",\n\n // 3MF core\n Model = \"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\",\n\n // Extensions officielles\n Materials = \"application/vnd.ms-package.3dmanufacturing-material+xml\",\n Colors = \"application/vnd.ms-package.3dmanufacturing-colors+xml\",\n Texture = \"application/vnd.ms-package.3dmanufacturing-texture+xml\",\n Texture2D = \"application/vnd.ms-package.3dmanufacturing-texture2d+xml\",\n Production = \"application/vnd.ms-package.3dmanufacturing-production+xml\",\n Slice = \"application/vnd.ms-package.3dmanufacturing-slice+xml\",\n BeamLattice = \"application/vnd.ms-package.3dmanufacturing-beamlattice+xml\",\n SecureContent = \"application/vnd.ms-package.3dmanufacturing-securecontent+xml\",\n\n // Assets\n Png = \"image/png\",\n Jpeg = \"image/jpeg\",\n Tiff = \"image/tiff\",\n Xml = \"application/xml\",\n}\n\nexport const RelationshipDirName = \"_rels/\";\nexport const Object3dDirName = \"3D/\";\nexport const ModelFileName = `3dmodel.model`;\nexport const RelationshipFileName = `.rels`;\nexport const ContentTypeFileName = \"[Content_Types].xml\";\n\n/**\n * Common OPC and 3MF relationship Type URIs.\n */\nexport class Known3mfRelationshipTypes {\n /**\n * 3MF core: points to the main .model part of the package\n */\n public static readonly ThreeDimModel = \"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\";\n\n /**\n * OPC core: points to a package thumbnail (often used by 3MF packages)\n */\n public static readonly Thumbnail = \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail\";\n\n /**\n * 3MF (print ticket): optional printing settings part (rarely used by slicers)\n */\n public static readonly PrintTicket = \"http://schemas.microsoft.com/3dmanufacturing/2013/01/printticket\";\n\n /**\n * OPC core: indicates parts that must be preserved when editing the package\n */\n public static readonly MustPreserve = \"http://schemas.openxmlformats.org/package/2006/relationships/mustpreserve\";\n\n /**\n * Convenience set for quick checks\n */\n public static readonly Known: ReadonlySet<string> = new Set<string>([\n Known3mfRelationshipTypes.ThreeDimModel,\n Known3mfRelationshipTypes.Thumbnail,\n Known3mfRelationshipTypes.PrintTicket,\n Known3mfRelationshipTypes.MustPreserve,\n ]);\n\n /**\n * Test if the relationship Type is one of the common known URIs above\n * @param type\n * @returns true if the relationship Type is one of the common known URIs above\n */\n public static IsKnown(type: string): boolean {\n return Known3mfRelationshipTypes.Known.has(type);\n }\n\n /**\n * test if the relationship Type is the main 3MF model entry point\n * @param type\n * @returns true if the relationship Type is the main 3MF model entry point\n */\n public static IsThreeDimModel(type: string): boolean {\n return type === Known3mfRelationshipTypes.ThreeDimModel;\n }\n}\n\n/**\n *\n */\nexport interface I3mfContentTypes {\n /**\n *\n */\n items: I3mfContentType[];\n}\n\n/**\n *\n */\nexport interface I3mfContentType {\n /**\n *\n */\n ext: string;\n /**\n *\n */\n ct: string;\n}\n\n/**\n *\n */\nexport interface I3mfRelationships {\n /**\n *\n */\n items: I3mfRelationship[];\n}\n\n/**\n *\n */\nexport interface I3mfRelationship {\n /**\n *\n */\n id: string;\n\n /**\n *\n */\n type?: string;\n\n /**\n *\n */\n target?: string;\n}\n\n/**\n *\n */\nexport interface I3mfDocument {\n /**\n *\n */\n contentTypes: I3mfContentTypes;\n /**\n *\n */\n relationships: I3mfRelationships;\n /**\n *\n */\n model: I3mfModel;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "@onerjs/core/tslib.es6.js";
2
2
  import { XmlAttr, XmlName } from "../xml/xml.interfaces.js";
3
- import { OpenXmlContentTypesNamespace, OpenXmlRelationshipsNamespace } from "./3mf.opc.interfaces.js";
3
+ import { OpenXmlContentTypesNamespace, OpenXmlRelationshipsNamespace, } from "./3mf.opc.interfaces.js";
4
4
  /**
5
5
  *
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"3mf.opc.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.opc.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAGnG;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAAzB;QACH;;WAEG;QACH,UAAK,GAAyB,EAAE,CAAC;IACrC,CAAC;CAAA,CAAA;AALY,mBAAmB;IAD/B,OAAO,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;GAChD,mBAAmB,CAK/B;;AAED;;GAEG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAY3B;;;;OAIG;IACH,YAAmB,GAAW,EAAE,EAAU;QACtC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;CACJ,CAAA;AAhBG;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;+CAC/D;AAKZ;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;8CAClE;AAVF,kBAAkB;IAD9B,OAAO,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;GAClD,kBAAkB,CAqB9B;;AAED;;GAEG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACH;;WAEG;QACH,UAAK,GAA0B,EAAE,CAAC;IACtC,CAAC;CAAA,CAAA;AALY,oBAAoB;IADhC,OAAO,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;GACzD,oBAAoB,CAKhC;;AAED;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAmB5B,YAAY,EAAU,EAAE,IAAY,EAAE,MAAc;QAChD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;CACJ,CAAA;AAnBG;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;+CACb;AAMX;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDACZ;AAMd;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;mDACZ;AAjBP,mBAAmB;IAD/B,OAAO,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;GACxD,mBAAmB,CAwB/B;;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IACxB,YACW,YAA8B,EAC9B,aAAgC,EAChC,KAAgB;QAFhB,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,kBAAa,GAAb,aAAa,CAAmB;QAChC,UAAK,GAAL,KAAK,CAAW;IACxB,CAAC;CACP","sourcesContent":["import { XmlAttr, XmlName } from \"../xml/xml.interfaces\";\nimport type { I3mfModel } from \"./3mf.interfaces\";\nimport { OpenXmlContentTypesNamespace, OpenXmlRelationshipsNamespace } from \"./3mf.opc.interfaces\";\nimport type { I3mfContentTypes, I3mfContentType, I3mfRelationships, I3mfRelationship, I3mfDocument } from \"./3mf.opc.interfaces\";\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlContentTypesNamespace, name: \"Types\" })\nexport class ThreeMfContentTypes implements I3mfContentTypes {\n /**\n *\n */\n items: ThreeMfContentType[] = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlContentTypesNamespace, name: \"Default\" })\nexport class ThreeMfContentType implements I3mfContentType {\n /**\n *\n */\n @XmlAttr({ name: { ns: OpenXmlContentTypesNamespace, name: \"Extension\" } })\n ext: string;\n /**\n *\n */\n @XmlAttr({ name: { ns: OpenXmlContentTypesNamespace, name: \"ContentType\" } })\n ct: string;\n\n /**\n *\n * @param ext\n * @param ct\n */\n public constructor(ext: string, ct: string) {\n this.ext = ext;\n this.ct = ct;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlRelationshipsNamespace, name: \"Relationships\" })\nexport class ThreeMfRelationships implements I3mfRelationships {\n /**\n *\n */\n items: ThreeMfRelationship[] = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlRelationshipsNamespace, name: \"Relationship\" })\nexport class ThreeMfRelationship implements I3mfRelationship {\n /**\n *\n */\n @XmlAttr({ name: \"Id\" })\n id: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"Type\" })\n type?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"Target\" })\n target?: string;\n\n constructor(id: string, type: string, target: string) {\n this.id = id;\n this.type = type;\n this.target = target;\n }\n}\n\n/**\n *\n */\nexport class ThreeMfDocument implements I3mfDocument {\n public constructor(\n public contentTypes: I3mfContentTypes,\n public relationships: I3mfRelationships,\n public model: I3mfModel\n ) {}\n}\n"]}
1
+ {"version":3,"file":"3mf.opc.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.opc.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EACH,4BAA4B,EAC5B,6BAA6B,GAMhC,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAAzB;QACH;;WAEG;QACH,UAAK,GAAyB,EAAE,CAAC;IACrC,CAAC;CAAA,CAAA;AALY,mBAAmB;IAD/B,OAAO,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;GAChD,mBAAmB,CAK/B;;AAED;;GAEG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAY3B;;;;OAIG;IACH,YAAmB,GAAW,EAAE,EAAU;QACtC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;CACJ,CAAA;AAhBG;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;+CAC/D;AAKZ;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;8CAClE;AAVF,kBAAkB;IAD9B,OAAO,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;GAClD,kBAAkB,CAqB9B;;AAED;;GAEG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QACH;;WAEG;QACH,UAAK,GAA0B,EAAE,CAAC;IACtC,CAAC;CAAA,CAAA;AALY,oBAAoB;IADhC,OAAO,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;GACzD,oBAAoB,CAKhC;;AAED;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAmB5B,YAAY,EAAU,EAAE,IAAY,EAAE,MAAc;QAChD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;CACJ,CAAA;AAnBG;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;+CACb;AAMX;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDACZ;AAMd;IADC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;mDACZ;AAjBP,mBAAmB;IAD/B,OAAO,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;GACxD,mBAAmB,CAwB/B;;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IACxB,YACW,YAA8B,EAC9B,aAAgC,EAChC,KAAgB;QAFhB,iBAAY,GAAZ,YAAY,CAAkB;QAC9B,kBAAa,GAAb,aAAa,CAAmB;QAChC,UAAK,GAAL,KAAK,CAAW;IACxB,CAAC;CACP","sourcesContent":["import { XmlAttr, XmlName } from \"../xml/xml.interfaces\";\nimport { type I3mfModel } from \"./3mf.interfaces\";\nimport {\n OpenXmlContentTypesNamespace,\n OpenXmlRelationshipsNamespace,\n type I3mfContentTypes,\n type I3mfContentType,\n type I3mfRelationships,\n type I3mfRelationship,\n type I3mfDocument,\n} from \"./3mf.opc.interfaces\";\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlContentTypesNamespace, name: \"Types\" })\nexport class ThreeMfContentTypes implements I3mfContentTypes {\n /**\n *\n */\n items: ThreeMfContentType[] = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlContentTypesNamespace, name: \"Default\" })\nexport class ThreeMfContentType implements I3mfContentType {\n /**\n *\n */\n @XmlAttr({ name: { ns: OpenXmlContentTypesNamespace, name: \"Extension\" } })\n ext: string;\n /**\n *\n */\n @XmlAttr({ name: { ns: OpenXmlContentTypesNamespace, name: \"ContentType\" } })\n ct: string;\n\n /**\n *\n * @param ext\n * @param ct\n */\n public constructor(ext: string, ct: string) {\n this.ext = ext;\n this.ct = ct;\n }\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlRelationshipsNamespace, name: \"Relationships\" })\nexport class ThreeMfRelationships implements I3mfRelationships {\n /**\n *\n */\n items: ThreeMfRelationship[] = [];\n}\n\n/**\n *\n */\n@XmlName({ ns: OpenXmlRelationshipsNamespace, name: \"Relationship\" })\nexport class ThreeMfRelationship implements I3mfRelationship {\n /**\n *\n */\n @XmlAttr({ name: \"Id\" })\n id: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"Type\" })\n type?: string;\n\n /**\n *\n */\n @XmlAttr({ name: \"Target\" })\n target?: string;\n\n constructor(id: string, type: string, target: string) {\n this.id = id;\n this.type = type;\n this.target = target;\n }\n}\n\n/**\n *\n */\nexport class ThreeMfDocument implements I3mfDocument {\n public constructor(\n public contentTypes: I3mfContentTypes,\n public relationships: I3mfRelationships,\n public model: I3mfModel\n ) {}\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  import { ThreeMfModelBuilder } from "./3mf.builder.js";
2
2
  import { type I3mfDocument } from "./3mf.opc.interfaces.js";
3
- import type { I3mfModel } from "./3mf.interfaces.js";
4
- import { ST_Unit } from "./3mf.interfaces.js";
3
+ import { type I3mfModel, ST_Unit } from "./3mf.interfaces.js";
5
4
  /**
6
5
  * Options controlling how meshes are exported into the 3MF model.
7
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"3mf.serializer.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.serializer.ts"],"names":[],"mappings":"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","sourcesContent":["// 3MF\r\nimport { ThreeMfDocumentBuilder, ThreeMfModelBuilder } from \"./3mf.builder\";\r\nimport { ContentTypeFileName, ModelFileName, Object3dDirName, RelationshipDirName, RelationshipFileName, type I3mfDocument } from \"./3mf.opc.interfaces\";\r\nimport type { I3mfModel } from \"./3mf.interfaces\";\r\nimport { ST_Unit } from \"./3mf.interfaces\";\r\n\r\n// XML\r\nimport { XmlBuilder } from \"../xml/xml.builder\";\r\nimport { XmlSerializer } from \"../xml/xml.serializer\";\r\nimport { type ByteSink, Utf8XmlWriterToBytes } from \"../xml/xml.builder.bytes\";\r\n\r\n/**\r\n * Options controlling how meshes are exported into the 3MF model.\r\n *\r\n * Notes:\r\n * - These flags are kept generic here and are expected to be interpreted by the concrete serializer/model builder.\r\n * - Defaults are set in AbstractThreeMfSerializer.DEFAULT_3MF_EXPORTER_OPTIONS.\r\n */\r\nexport interface IThreeMfSerializerBaseOptions {\r\n /**\r\n * define the unit. Default is millimeter\r\n */\r\n unit?: ST_Unit;\r\n\r\n /**\r\n *\r\n */\r\n metadata?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Minimal contract for a 3MF serializer that can stream its output through a sink callback.\r\n *\r\n * The sink callback receives:\r\n * - err: any error produced by the serialization pipeline (if any)\r\n * - chunk: a chunk of bytes to append to the destination\r\n * - final: true when this is the last chunk\r\n *\r\n * Important:\r\n * - Implementations should call sink with final=true exactly once, or rely on the underlying zip lib to do so.\r\n * - Consumers may ignore final if they just buffer everything.\r\n */\r\nexport interface I3mfSerializer<T> {\r\n serializeAsync(sink: (err: any, chunk: Uint8Array, final: boolean) => void, ...meshes: Array<T>): Promise<void>;\r\n}\r\n\r\n/**\r\n * Base class for 3MF serialization.\r\n *\r\n * Responsibilities:\r\n * - Convert user meshes to a 3MF model (toModel).\r\n * - Wrap the 3MF document parts into an OPC container (zip) and stream bytes through the sink.\r\n *\r\n * Non-responsibilities:\r\n * - Providing/initializing the zip implementation (ensureZipLibReadyAsync is abstract).\r\n * - Defining how meshes map to 3MF objects (toModel is abstract).\r\n */\r\nexport abstract class AbstractThreeMfSerializer<T, O extends IThreeMfSerializerBaseOptions> implements I3mfSerializer<T> {\r\n private _o: O;\r\n\r\n /**\r\n * @param opts user-provided options overriding defaults.\r\n */\r\n public constructor(opts: O) {\r\n this._o = opts;\r\n }\r\n\r\n /**\r\n * Expose the resolved options (defaults + overrides) as readonly.\r\n */\r\n public get options(): Readonly<O> {\r\n return this._o;\r\n }\r\n\r\n /**\r\n * Generic 3MF binary serializer.\r\n * Pipeline overview:\r\n * 1. ensureZipLibReadyAsync provides a zip implementation (host-dependent).\r\n * 2. Convert meshes into an I3mfDocument (OPC parts + model).\r\n * 3. Create a zip target that streams through the provided sink.\r\n * 4. Serialize XML parts into zip entries.\r\n * 5. End the zip stream.\r\n * @param sink a callback receiving byte chunks; enables streaming without buffering the full archive in memory.\r\n * @param meshes the meshes to serialize.\r\n * @returns\r\n */\r\n public async serializeAsync(sink: (err: any, chunk: Uint8Array, final: boolean) => void, ...meshes: Array<T>): Promise<void> {\r\n // The zip library (e.g. fflate) may need dynamic import / polyfills depending on host.\r\n // This is delegated to the concrete serializer implementation.\r\n const lib = await this.ensureZipLibReadyAsync();\r\n\r\n // If no lib is available, we silently do nothing today.\r\n // Consider: throwing could be better to fail fast. Kept as-is to preserve current behavior.\r\n if (!lib) {\r\n return;\r\n }\r\n\r\n const zip = lib.Zip;\r\n const zipDeflate = lib.ZipDeflate;\r\n\r\n // We expect a \"fflate-like\" API. If it is missing, fail with an explicit error.\r\n if (!zip || !zipDeflate) {\r\n throw new Error(\"fflate Zip / ZipDeflate not available\");\r\n }\r\n\r\n /**\r\n * Adapt a fflate entry to our ByteSink interface used by Utf8XmlWriterToBytes.\r\n *\r\n * fflate entry.push(chunk, final) is the writer endpoint for compressed bytes.\r\n * @param entry\r\n * @returns\r\n */\r\n const makeByteSinkFromFflateEntry = function (entry: any): ByteSink {\r\n return { push: (chunk: any, final: any) => entry.push(chunk, final) };\r\n };\r\n\r\n /**\r\n * Serialize an in-memory XML object into a compressed zip entry.\r\n *\r\n * Notes:\r\n * - \"object\" here is expected to be a structure understood by XmlSerializer.\r\n * - Compression level 6 is a reasonable default for speed/size tradeoff.\r\n * @param target\r\n * @param name\r\n * @param object\r\n */\r\n const serializeEntry = function (target: any, name: string, object: any): void {\r\n const entry = new zipDeflate(name, { level: 6 });\r\n target.add(entry);\r\n\r\n // Convert XmlSerializer output into UTF-8 bytes and push to the zip entry.\r\n const sink = makeByteSinkFromFflateEntry(entry);\r\n const w = new Utf8XmlWriterToBytes(sink);\r\n\r\n // Build XML declaration and serialize.\r\n const b = new XmlBuilder(w).dec(\"1.0\", \"UTF-8\");\r\n const s = new XmlSerializer(b);\r\n s.serialize(object);\r\n\r\n // Ensure the writer flushes any pending bytes and closes the stream for this entry.\r\n w.finish();\r\n };\r\n\r\n // Convert meshes into a 3MF document (content types + relationships + model part).\r\n const doc = this.toDocument(...meshes);\r\n if (!doc) {\r\n // Nothing to write. Current behavior: no zip output.\r\n return;\r\n }\r\n\r\n // Create the zip container. It will forward produced bytes to the provided sink.\r\n const target = new zip(sink);\r\n\r\n // Save the root content types part.\r\n // In OPC, [Content_Types].xml defines the MIME/content types for the package parts.\r\n serializeEntry(target, ContentTypeFileName, doc.contentTypes);\r\n\r\n // Save relationships.\r\n // In OPC, relationships live under _rels and map parts to each other.\r\n serializeEntry(target, `${RelationshipDirName}${RelationshipFileName}`, doc.relationships);\r\n\r\n // Save the 3D model part.\r\n // In 3MF, the main model is typically under /3D/3dmodel.model.\r\n serializeEntry(target, `${Object3dDirName}${ModelFileName}`, doc.model);\r\n\r\n // Finalize the archive stream.\r\n // This should trigger the zip implementation to call sink(..., final=true) when done.\r\n target.end();\r\n }\r\n\r\n /**\r\n * Build a full 3MF OPC document from meshes.\r\n *\r\n * The default behavior uses ThreeMfDocumentBuilder with the model produced by toModel().\r\n * Override if you need custom parts (textures, thumbnails, print ticket, etc.).\r\n * @param meshes\r\n * @returns\r\n */\r\n public toDocument(...meshes: Array<T>): I3mfDocument | undefined {\r\n const b = new ThreeMfModelBuilder().withUnit(this._o?.unit ?? ST_Unit.millimeter);\r\n if (this.options.metadata) {\r\n for (const m in this.options.metadata) {\r\n b.withMetaData(m, this.options.metadata[m]);\r\n }\r\n }\r\n return new ThreeMfDocumentBuilder().withModel(this.toModel(b, ...meshes)).build();\r\n }\r\n\r\n /**\r\n * Convert input meshes into a 3MF model.\r\n *\r\n * Implementations typically:\r\n * - Create resources and objects.\r\n * - Define build items (instances) when exportInstances is enabled.\r\n * - Encode geometry and properties required by your pipeline.\r\n */\r\n public abstract toModel(builder: ThreeMfModelBuilder, ...meshes: Array<T>): I3mfModel;\r\n\r\n /**\r\n * Provide a zip implementation for the current host/runtime.\r\n *\r\n * This might be provided by the framework implementation, but it could differ depending on the host\r\n * (native, Node.js, browser, etc.).\r\n *\r\n * Expected shape (fflate-like):\r\n * - return [ Zip, ZipDeflate ] at minimum.\r\n *\r\n * Notes:\r\n * - In a browser, this might require bundler configuration or dynamic import.\r\n * - In Node.js, this might be a direct import of \"fflate\" or another compatible implementation.\r\n */\r\n public abstract ensureZipLibReadyAsync(): Promise<any>;\r\n}\r\n\r\n/**\r\n * Convenience helpers around serializers.\r\n */\r\nexport class ThreeMf {\r\n /**\r\n * Serialize to a single in-memory buffer.\r\n *\r\n * This is a helper that buffers all chunks produced by serializeAsync, then concatenates them.\r\n * Use serializeAsync directly if you want true streaming to a file/response.\r\n * @param s\r\n * @param meshes\r\n * @returns\r\n */\r\n public static async SerializeToMemoryAsync<A>(s: I3mfSerializer<A>, ...meshes: Array<A>): Promise<Uint8Array | undefined> {\r\n const chunks = new Array<Uint8Array>();\r\n let size = 0;\r\n\r\n // Sink used by the zip stream. We ignore `final` because we buffer everything anyway.\r\n // If `err` is used by the underlying zip lib, callers may want to detect/throw here.\r\n const sink = function (err: any, chunk: Uint8Array, _final: boolean) {\r\n // Current behavior: ignore err and keep accumulating.\r\n // Consider: if err is non-null, you might want to throw or record it.\r\n chunks.push(chunk);\r\n size += chunk.length;\r\n };\r\n\r\n await s.serializeAsync(sink, ...meshes);\r\n\r\n // If nothing was written, return undefined (matches current behavior).\r\n if (!size) {\r\n return undefined;\r\n }\r\n\r\n // Concatenate chunks into a single Uint8Array.\r\n const buffer = new Uint8Array(size);\r\n let off = 0;\r\n for (const c of chunks) {\r\n buffer.set(c, off);\r\n off += c.length;\r\n }\r\n return buffer;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"3mf.serializer.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/model/3mf.serializer.ts"],"names":[],"mappings":"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","sourcesContent":["// 3MF\r\nimport { ThreeMfDocumentBuilder, ThreeMfModelBuilder } from \"./3mf.builder\";\r\nimport { ContentTypeFileName, ModelFileName, Object3dDirName, RelationshipDirName, RelationshipFileName, type I3mfDocument } from \"./3mf.opc.interfaces\";\r\nimport { type I3mfModel, ST_Unit } from \"./3mf.interfaces\";\r\n\r\n// XML\r\nimport { XmlBuilder } from \"../xml/xml.builder\";\r\nimport { XmlSerializer } from \"../xml/xml.serializer\";\r\nimport { type ByteSink, Utf8XmlWriterToBytes } from \"../xml/xml.builder.bytes\";\r\n\r\n/**\r\n * Options controlling how meshes are exported into the 3MF model.\r\n *\r\n * Notes:\r\n * - These flags are kept generic here and are expected to be interpreted by the concrete serializer/model builder.\r\n * - Defaults are set in AbstractThreeMfSerializer.DEFAULT_3MF_EXPORTER_OPTIONS.\r\n */\r\nexport interface IThreeMfSerializerBaseOptions {\r\n /**\r\n * define the unit. Default is millimeter\r\n */\r\n unit?: ST_Unit;\r\n\r\n /**\r\n *\r\n */\r\n metadata?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Minimal contract for a 3MF serializer that can stream its output through a sink callback.\r\n *\r\n * The sink callback receives:\r\n * - err: any error produced by the serialization pipeline (if any)\r\n * - chunk: a chunk of bytes to append to the destination\r\n * - final: true when this is the last chunk\r\n *\r\n * Important:\r\n * - Implementations should call sink with final=true exactly once, or rely on the underlying zip lib to do so.\r\n * - Consumers may ignore final if they just buffer everything.\r\n */\r\nexport interface I3mfSerializer<T> {\r\n serializeAsync(sink: (err: any, chunk: Uint8Array, final: boolean) => void, ...meshes: Array<T>): Promise<void>;\r\n}\r\n\r\n/**\r\n * Base class for 3MF serialization.\r\n *\r\n * Responsibilities:\r\n * - Convert user meshes to a 3MF model (toModel).\r\n * - Wrap the 3MF document parts into an OPC container (zip) and stream bytes through the sink.\r\n *\r\n * Non-responsibilities:\r\n * - Providing/initializing the zip implementation (ensureZipLibReadyAsync is abstract).\r\n * - Defining how meshes map to 3MF objects (toModel is abstract).\r\n */\r\nexport abstract class AbstractThreeMfSerializer<T, O extends IThreeMfSerializerBaseOptions> implements I3mfSerializer<T> {\r\n private _o: O;\r\n\r\n /**\r\n * @param opts user-provided options overriding defaults.\r\n */\r\n public constructor(opts: O) {\r\n this._o = opts;\r\n }\r\n\r\n /**\r\n * Expose the resolved options (defaults + overrides) as readonly.\r\n */\r\n public get options(): Readonly<O> {\r\n return this._o;\r\n }\r\n\r\n /**\r\n * Generic 3MF binary serializer.\r\n * Pipeline overview:\r\n * 1. ensureZipLibReadyAsync provides a zip implementation (host-dependent).\r\n * 2. Convert meshes into an I3mfDocument (OPC parts + model).\r\n * 3. Create a zip target that streams through the provided sink.\r\n * 4. Serialize XML parts into zip entries.\r\n * 5. End the zip stream.\r\n * @param sink a callback receiving byte chunks; enables streaming without buffering the full archive in memory.\r\n * @param meshes the meshes to serialize.\r\n * @returns\r\n */\r\n public async serializeAsync(sink: (err: any, chunk: Uint8Array, final: boolean) => void, ...meshes: Array<T>): Promise<void> {\r\n // The zip library (e.g. fflate) may need dynamic import / polyfills depending on host.\r\n // This is delegated to the concrete serializer implementation.\r\n const lib = await this.ensureZipLibReadyAsync();\r\n\r\n // If no lib is available, we silently do nothing today.\r\n // Consider: throwing could be better to fail fast. Kept as-is to preserve current behavior.\r\n if (!lib) {\r\n return;\r\n }\r\n\r\n const zip = lib.Zip;\r\n const zipDeflate = lib.ZipDeflate;\r\n\r\n // We expect a \"fflate-like\" API. If it is missing, fail with an explicit error.\r\n if (!zip || !zipDeflate) {\r\n throw new Error(\"fflate Zip / ZipDeflate not available\");\r\n }\r\n\r\n /**\r\n * Adapt a fflate entry to our ByteSink interface used by Utf8XmlWriterToBytes.\r\n *\r\n * fflate entry.push(chunk, final) is the writer endpoint for compressed bytes.\r\n * @param entry\r\n * @returns\r\n */\r\n const makeByteSinkFromFflateEntry = function (entry: any): ByteSink {\r\n return { push: (chunk: any, final: any) => entry.push(chunk, final) };\r\n };\r\n\r\n /**\r\n * Serialize an in-memory XML object into a compressed zip entry.\r\n *\r\n * Notes:\r\n * - \"object\" here is expected to be a structure understood by XmlSerializer.\r\n * - Compression level 6 is a reasonable default for speed/size tradeoff.\r\n * @param target\r\n * @param name\r\n * @param object\r\n */\r\n const serializeEntry = function (target: any, name: string, object: any): void {\r\n const entry = new zipDeflate(name, { level: 6 });\r\n target.add(entry);\r\n\r\n // Convert XmlSerializer output into UTF-8 bytes and push to the zip entry.\r\n const sink = makeByteSinkFromFflateEntry(entry);\r\n const w = new Utf8XmlWriterToBytes(sink);\r\n\r\n // Build XML declaration and serialize.\r\n const b = new XmlBuilder(w).dec(\"1.0\", \"UTF-8\");\r\n const s = new XmlSerializer(b);\r\n s.serialize(object);\r\n\r\n // Ensure the writer flushes any pending bytes and closes the stream for this entry.\r\n w.finish();\r\n };\r\n\r\n // Convert meshes into a 3MF document (content types + relationships + model part).\r\n const doc = this.toDocument(...meshes);\r\n if (!doc) {\r\n // Nothing to write. Current behavior: no zip output.\r\n return;\r\n }\r\n\r\n // Create the zip container. It will forward produced bytes to the provided sink.\r\n const target = new zip(sink);\r\n\r\n // Save the root content types part.\r\n // In OPC, [Content_Types].xml defines the MIME/content types for the package parts.\r\n serializeEntry(target, ContentTypeFileName, doc.contentTypes);\r\n\r\n // Save relationships.\r\n // In OPC, relationships live under _rels and map parts to each other.\r\n serializeEntry(target, `${RelationshipDirName}${RelationshipFileName}`, doc.relationships);\r\n\r\n // Save the 3D model part.\r\n // In 3MF, the main model is typically under /3D/3dmodel.model.\r\n serializeEntry(target, `${Object3dDirName}${ModelFileName}`, doc.model);\r\n\r\n // Finalize the archive stream.\r\n // This should trigger the zip implementation to call sink(..., final=true) when done.\r\n target.end();\r\n }\r\n\r\n /**\r\n * Build a full 3MF OPC document from meshes.\r\n *\r\n * The default behavior uses ThreeMfDocumentBuilder with the model produced by toModel().\r\n * Override if you need custom parts (textures, thumbnails, print ticket, etc.).\r\n * @param meshes\r\n * @returns\r\n */\r\n public toDocument(...meshes: Array<T>): I3mfDocument | undefined {\r\n const b = new ThreeMfModelBuilder().withUnit(this._o?.unit ?? ST_Unit.millimeter);\r\n if (this.options.metadata) {\r\n for (const m in this.options.metadata) {\r\n b.withMetaData(m, this.options.metadata[m]);\r\n }\r\n }\r\n return new ThreeMfDocumentBuilder().withModel(this.toModel(b, ...meshes)).build();\r\n }\r\n\r\n /**\r\n * Convert input meshes into a 3MF model.\r\n *\r\n * Implementations typically:\r\n * - Create resources and objects.\r\n * - Define build items (instances) when exportInstances is enabled.\r\n * - Encode geometry and properties required by your pipeline.\r\n */\r\n public abstract toModel(builder: ThreeMfModelBuilder, ...meshes: Array<T>): I3mfModel;\r\n\r\n /**\r\n * Provide a zip implementation for the current host/runtime.\r\n *\r\n * This might be provided by the framework implementation, but it could differ depending on the host\r\n * (native, Node.js, browser, etc.).\r\n *\r\n * Expected shape (fflate-like):\r\n * - return [ Zip, ZipDeflate ] at minimum.\r\n *\r\n * Notes:\r\n * - In a browser, this might require bundler configuration or dynamic import.\r\n * - In Node.js, this might be a direct import of \"fflate\" or another compatible implementation.\r\n */\r\n public abstract ensureZipLibReadyAsync(): Promise<any>;\r\n}\r\n\r\n/**\r\n * Convenience helpers around serializers.\r\n */\r\nexport class ThreeMf {\r\n /**\r\n * Serialize to a single in-memory buffer.\r\n *\r\n * This is a helper that buffers all chunks produced by serializeAsync, then concatenates them.\r\n * Use serializeAsync directly if you want true streaming to a file/response.\r\n * @param s\r\n * @param meshes\r\n * @returns\r\n */\r\n public static async SerializeToMemoryAsync<A>(s: I3mfSerializer<A>, ...meshes: Array<A>): Promise<Uint8Array | undefined> {\r\n const chunks = new Array<Uint8Array>();\r\n let size = 0;\r\n\r\n // Sink used by the zip stream. We ignore `final` because we buffer everything anyway.\r\n // If `err` is used by the underlying zip lib, callers may want to detect/throw here.\r\n const sink = function (err: any, chunk: Uint8Array, _final: boolean) {\r\n // Current behavior: ignore err and keep accumulating.\r\n // Consider: if err is non-null, you might want to throw or record it.\r\n chunks.push(chunk);\r\n size += chunk.length;\r\n };\r\n\r\n await s.serializeAsync(sink, ...meshes);\r\n\r\n // If nothing was written, return undefined (matches current behavior).\r\n if (!size) {\r\n return undefined;\r\n }\r\n\r\n // Concatenate chunks into a single Uint8Array.\r\n const buffer = new Uint8Array(size);\r\n let off = 0;\r\n for (const c of chunks) {\r\n buffer.set(c, off);\r\n off += c.length;\r\n }\r\n return buffer;\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { IXmlWriter } from "./xml.builder.js";
1
+ import { type IXmlWriter } from "./xml.builder.js";
2
2
  /** */
3
3
  export type ByteSink = {
4
4
  push(chunk: Uint8Array, final?: boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"xml.builder.bytes.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.bytes.ts"],"names":[],"mappings":"AAOA,MAAM;AACN,MAAM,OAAO,oBAAoB;IAO7B,YACqB,KAAe,EACf,QAAiC,EAAE;QADnC,UAAK,GAAL,KAAK,CAAU;QACf,UAAK,GAAL,KAAK,CAA8B;QARxD,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,aAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC7B,aAAQ,GAAG,EAAE,CAAC;QACd,kBAAa,GAAG,CAAC,CAAC;IAKvB,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;OACG;IACH,MAAM;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import type { IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport type ByteSink = {\r\n push(chunk: Uint8Array, final?: boolean): void;\r\n};\r\n\r\n/** */\r\nexport class Utf8XmlWriterToBytes implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _encoder = new TextEncoder();\r\n private _pending = \"\";\r\n private _pendingChars = 0;\r\n\r\n constructor(\r\n private readonly _sink: ByteSink,\r\n private readonly _opts: { flushChars?: number } = {}\r\n ) {}\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n const s = data.join(\"\");\r\n if (s.length === 0) {\r\n return this;\r\n }\r\n\r\n this._pending += s;\r\n this._pendingChars += s.length;\r\n\r\n const limit = this._opts.flushChars ?? 64 * 1024;\r\n if (this._pendingChars >= limit) {\r\n this.flush();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n flush(): this {\r\n if (this._pendingChars === 0) {\r\n return this;\r\n }\r\n\r\n const bytes = this._encoder.encode(this._pending);\r\n this._sink.push(bytes);\r\n this.count += bytes.length;\r\n\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n */\r\n finish(): void {\r\n this.flush();\r\n this._sink.push(new Uint8Array(0), true);\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n this.count = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"xml.builder.bytes.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/3MF/core/xml/xml.builder.bytes.ts"],"names":[],"mappings":"AAOA,MAAM;AACN,MAAM,OAAO,oBAAoB;IAO7B,YACqB,KAAe,EACf,QAAiC,EAAE;QADnC,UAAK,GAAL,KAAK,CAAU;QACf,UAAK,GAAL,KAAK,CAA8B;QARxD,MAAM;QACC,UAAK,GAAG,CAAC,CAAC;QACT,aAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC7B,aAAQ,GAAG,EAAE,CAAC;QACd,kBAAa,GAAG,CAAC,CAAC;IAKvB,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,GAAG,IAAc;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC;QACjD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;OACG;IACH,MAAM;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;OACG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;CACJ","sourcesContent":["import { type IXmlWriter } from \"./xml.builder\";\r\n\r\n/** */\r\nexport type ByteSink = {\r\n push(chunk: Uint8Array, final?: boolean): void;\r\n};\r\n\r\n/** */\r\nexport class Utf8XmlWriterToBytes implements IXmlWriter {\r\n /** */\r\n public count = 0;\r\n private _encoder = new TextEncoder();\r\n private _pending = \"\";\r\n private _pendingChars = 0;\r\n\r\n constructor(\r\n private readonly _sink: ByteSink,\r\n private readonly _opts: { flushChars?: number } = {}\r\n ) {}\r\n\r\n /**\r\n * @param data\r\n * @returns\r\n */\r\n write(...data: string[]): IXmlWriter {\r\n if (data.length === 0) {\r\n return this;\r\n }\r\n\r\n const s = data.join(\"\");\r\n if (s.length === 0) {\r\n return this;\r\n }\r\n\r\n this._pending += s;\r\n this._pendingChars += s.length;\r\n\r\n const limit = this._opts.flushChars ?? 64 * 1024;\r\n if (this._pendingChars >= limit) {\r\n this.flush();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns\r\n */\r\n flush(): this {\r\n if (this._pendingChars === 0) {\r\n return this;\r\n }\r\n\r\n const bytes = this._encoder.encode(this._pending);\r\n this._sink.push(bytes);\r\n this.count += bytes.length;\r\n\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n */\r\n finish(): void {\r\n this.flush();\r\n this._sink.push(new Uint8Array(0), true);\r\n }\r\n\r\n /**\r\n */\r\n clear(): void {\r\n this._pending = \"\";\r\n this._pendingChars = 0;\r\n this.count = 0;\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import type { IXmlBuilder } from "./xml.interfaces.js";
1
+ import { type IXmlBuilder } from "./xml.interfaces.js";
2
2
  /**
3
3
  */
4
4
  export interface IXmlWriter {