<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jace Li</title>
    <description>The latest articles on DEV Community by Jace Li (@joyfunc).</description>
    <link>https://dev.to/joyfunc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1058344%2F50f8cdbf-430d-4b00-acb6-c9b8897348b4.png</url>
      <title>DEV Community: Jace Li</title>
      <link>https://dev.to/joyfunc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joyfunc"/>
    <language>en</language>
    <item>
      <title>What’s actually inside a Bambu/Orca .3mf</title>
      <dc:creator>Jace Li</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:05:19 +0000</pubDate>
      <link>https://dev.to/joyfunc/whats-actually-inside-a-bambuorca-3mf-24p0</link>
      <guid>https://dev.to/joyfunc/whats-actually-inside-a-bambuorca-3mf-24p0</guid>
      <description>&lt;p&gt;A painted model can open in another application with the right shape and the wrong colors. A project with several build plates can turn into one sprawling scene. Sometimes the preview is empty even though the archive contains plenty of mesh data.&lt;/p&gt;

&lt;p&gt;Those failures often come from reading only one layer of the file.&lt;/p&gt;

&lt;p&gt;Bambu Studio and OrcaSlicer save geometry alongside the settings and relationships that make it a slicer project. The mesh tells you where the surfaces are. Other entries tell you which filament a part uses, how its surface was painted, and which copy belongs on which plate.&lt;/p&gt;

&lt;p&gt;To reconstruct the project, those records have to stay connected.&lt;/p&gt;

&lt;p&gt;The examples below use shortened fragments and illustrative IDs. They describe the shared Bambu/Orca project structure; the exact contents vary with the slicer version and export type.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A &lt;code&gt;.3mf&lt;/code&gt; is a ZIP archive
&lt;/h2&gt;

&lt;p&gt;You can inspect a &lt;code&gt;.3mf&lt;/code&gt; with an ordinary ZIP tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unzip &lt;span class="nt"&gt;-l&lt;/span&gt; project.3mf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no need to rename it first.&lt;/p&gt;

&lt;p&gt;Underneath, 3MF uses Open Packaging Conventions. XML relationship files connect the package’s parts, and &lt;code&gt;[Content_Types].xml&lt;/code&gt; identifies their content types. The package-level relationship file, &lt;code&gt;_rels/.rels&lt;/code&gt;, identifies the root 3D model. In a typical Bambu/Orca project, that model is &lt;code&gt;3D/3dmodel.model&lt;/code&gt;. The relationship is the formal entry point; the familiar filename is a convention. &lt;a href="https://github.com/3MFConsortium/spec_core/blob/master/3MF%20Core%20Specification.md" rel="noopener noreferrer"&gt;3MF Core Specification&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A representative archive might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Content_Types].xml
_rels/
  .rels

3D/
  3dmodel.model
  _rels/
    3dmodel.model.rels
  Objects/
    object_1.model
    object_2.model

Metadata/
  project_settings.config
  model_settings.config
  slice_info.config
  plate_1.png
  plate_1.json
  plate_1.gcode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an example, not a required inventory. An unsliced project and an exported print job can contain different subsets.&lt;/p&gt;

&lt;p&gt;The three configuration files answer different questions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entry&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;What it describes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Metadata/project_settings.config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Project-wide printer, process, and filament settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Metadata/model_settings.config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;Object and part settings, plate definitions, and instance membership&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Metadata/slice_info.config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;Saved results for sliced plates, including time and filament usage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These paths are explicitly defined in the slicers’ archive implementation. The &lt;code&gt;.config&lt;/code&gt; suffix does not identify a common serialization format. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Format/bbs_3mf.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s 3MF implementation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;project_settings.config&lt;/code&gt; contains settings such as layer height and the project’s filament palette. A shortened example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"layer_height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filament_colour"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"#FFFFFF"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#D32F2F"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filament_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"PLA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PLA"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The spelling &lt;code&gt;filament_colour&lt;/code&gt; is the actual key.&lt;/p&gt;

&lt;p&gt;Notice that the layer height is a string. The slicer’s JSON serializer writes many configuration values as strings and vector options as arrays of serialized strings. A reader should interpret each option according to its meaning instead of assuming that every numeric setting arrives as a JSON number. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Config.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s configuration serializer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For an inspector or asset browser, this suggests a useful starting point: read the small configuration entries before decoding the meshes. You can discover much of the project’s structure without loading millions of triangles.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Production Extension connects the root model to other model files
&lt;/h2&gt;

&lt;p&gt;Opening &lt;code&gt;3D/3dmodel.model&lt;/code&gt; does not guarantee that you will find vertices there.&lt;/p&gt;

&lt;p&gt;The root can contain assembly objects whose components reference meshes in other &lt;code&gt;.model&lt;/code&gt; entries. A component might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;component&lt;/span&gt;
  &lt;span class="na"&gt;p:path=&lt;/span&gt;&lt;span class="s"&gt;"/3D/Objects/object_1.model"&lt;/span&gt;
  &lt;span class="na"&gt;objectid=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
  &lt;span class="na"&gt;transform=&lt;/span&gt;&lt;span class="s"&gt;"1 0 0 0 1 0 0 0 1 10 0 0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;p:path&lt;/code&gt; identifies a model file inside the ZIP. It is absolute within the package, not an operating-system path. &lt;code&gt;objectid="1"&lt;/code&gt; selects an object in that file. The Production Extension permits a referenced object to contain components of its own. &lt;a href="https://github.com/3MFConsortium/spec_production/blob/master/3MF%20Production%20Extension.md" rel="noopener noreferrer"&gt;3MF Production Extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That gives the reader a chain to follow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbrgk7zxliyw23cui42el.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbrgk7zxliyw23cui42el.png" alt="A root build item resolves through an assembly component to a mesh object in another model entry within the same ZIP." width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The component points to another model entry inside the same ZIP. A referenced object can itself contain local components.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is a precise distinction here. Component hierarchies can nest, but the published Production Extension restricts external &lt;code&gt;p:path&lt;/code&gt; attributes on components to the root model. Components in a referenced model must refer to objects in that same model file. Arbitrary chains of external references across several files are outside that rule.&lt;/p&gt;

&lt;p&gt;A recursive component resolver is still necessary. Recursion through assemblies and recursion across package files are different operations.&lt;/p&gt;

&lt;p&gt;Object identity also needs its file context. A practical lookup key is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(model entry path, object ID)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a bare integer risks confusing objects defined in different model files. Orca’s importer retains the model path alongside the referenced object ID, while its exporter writes each component’s volume transform. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Format/bbs_3mf.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s component import and export code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Transforms accumulate as the reader follows the hierarchy. The example above translates its referenced object by 10 units along X. The root build item can add another transform, and nested components can add more.&lt;/p&gt;

&lt;p&gt;For application code using column vectors, the composition is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;world vertex =
  build transform
  × outer component transform
  × inner component transform
  × mesh vertex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3MF serializes an affine transform as 12 numbers, with the translation in the final three positions. Its serialized layout needs to be converted correctly for the matrix conventions of the rendering library. The model’s declared unit also matters. &lt;a href="https://github.com/3MFConsortium/spec_core/blob/master/3MF%20Core%20Specification.md#33-3d-matrices" rel="noopener noreferrer"&gt;3MF matrix and coordinate definitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A useful test case is a translated parent containing a rotated child. Identity transforms hide multiplication-order mistakes.&lt;/p&gt;

&lt;p&gt;Keep mesh resources separate from placed instances as well. Two instances can share the same mesh and appear at different positions. Parsing that mesh once is sensible; applying one placement to every copy is not.&lt;/p&gt;

&lt;p&gt;The reconstruction should therefore start at the root build items and follow their references. Collecting every mesh in the ZIP produces an inventory of resources. It does not, by itself, reconstruct the scene.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;code&gt;paint_color&lt;/code&gt; belongs to triangle surfaces
&lt;/h2&gt;

&lt;p&gt;The name makes &lt;code&gt;paint_color&lt;/code&gt; sound simpler than it is.&lt;/p&gt;

&lt;p&gt;In Bambu/Orca model XML, it appears on individual triangles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;triangle&lt;/span&gt;
  &lt;span class="na"&gt;v1=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;v2=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
  &lt;span class="na"&gt;v3=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt;
  &lt;span class="na"&gt;paint_color=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The attribute contains encoded painting data. It does not contain an RGB color.&lt;/p&gt;

&lt;p&gt;Orca’s facet serialization uses &lt;code&gt;"4"&lt;/code&gt; for a whole triangle painted with project filament 1, &lt;code&gt;"8"&lt;/code&gt; for filament 2, and &lt;code&gt;"0C"&lt;/code&gt; for filament 3. Reading &lt;code&gt;"4"&lt;/code&gt; as “filament 4” already gives the wrong result. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Model.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s facet encoding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The painting system can also recursively subdivide an original mesh triangle. Its serialized data records the subdivision structure and the paint states of the resulting regions. One XML &lt;code&gt;&amp;lt;triangle&amp;gt;&lt;/code&gt; can therefore contain several filament assignments. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/TriangleSelector.hpp" rel="noopener noreferrer"&gt;TriangleSelector definitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is how a painted boundary can cross the interior of a relatively large source triangle.&lt;/p&gt;

&lt;p&gt;The encoded string is a hexadecimal representation of the subdivision data. The decoder reconstructs a tree containing split instructions and leaf states. A faithful preview must recover the painted subregions, including their boundaries. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/TriangleSelector.cpp" rel="noopener noreferrer"&gt;TriangleSelector serialization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assigning one dominant filament to the original triangle is a preview approximation. It can make small painted details disappear or move a color boundary to an existing mesh edge. Such an approximation may be acceptable for a small thumbnail, but it should not be mistaken for a complete decoding of the saved paint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p5oogpfd6g1xoiertjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p5oogpfd6g1xoiertjl.png" alt="A source triangle with three dark subtriangles and one light subtriangle compared with a dominant-state approximation that colors the entire source triangle dark." width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Schematic painted subregions inside one source triangle. Keeping only its dominant state removes the smaller light region. This illustration is not a decoding of a specific paint_color string.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unpainted regions have their own meaning. Paint state zero leaves the region to inherit its base filament assignment.&lt;/p&gt;

&lt;p&gt;For an ordinary printable part, resolve the assignment in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the painted filament when the region has a nonzero paint state.&lt;/li&gt;
&lt;li&gt;Otherwise, use the part’s explicit filament assignment.&lt;/li&gt;
&lt;li&gt;If the part assignment is missing or zero, inherit the object’s assignment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bambu Studio’s &lt;code&gt;ModelVolume::extruder_id()&lt;/code&gt; implements that part-to-object fallback. If the object assignment is absent too, that resolver defaults to filament 1. &lt;a href="https://github.com/bambulab/BambuStudio/blob/master/src/libslic3r/Model.cpp" rel="noopener noreferrer"&gt;Bambu Studio’s filament inheritance code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Consider an object assigned to white filament 1. One of its parts has an explicit assignment to red filament 2.&lt;/p&gt;

&lt;p&gt;An unpainted surface on that part stays red. A region painted with filament 1 becomes white. Changing the object’s default filament should not override either the part’s explicit assignment or the painted region.&lt;/p&gt;

&lt;p&gt;A part setting of zero deserves particular attention. It means inheritance at this boundary. Treating it as an explicit assignment to filament 1 breaks projects whose parent object uses another filament.&lt;/p&gt;

&lt;p&gt;After resolving the filament, the viewer can look up its display color in the project palette. Orca describes &lt;code&gt;filament_colour&lt;/code&gt; as a visual aid. The project filament entry is the identity; the RGB value is its displayed swatch. Two filament entries can share a color while carrying different material settings. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/PrintConfig.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s filament color definition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why “give each object a material” is insufficient for a painted project. The renderer needs the object and part defaults, then the surface-level overrides. Flatten those distinctions too early and the information needed to reproduce the appearance is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Plate reconstruction starts with instance membership
&lt;/h2&gt;

&lt;p&gt;A mesh has coordinates. A plate has project meaning.&lt;/p&gt;

&lt;p&gt;Trying to recover plates by grouping nearby geometry can seem reasonable when the slicer displays several beds across its workspace. It becomes unreliable as soon as instances move, copies share geometry, or an object sits outside the expected bed area.&lt;/p&gt;

&lt;p&gt;The saved plate relationships provide a better starting point.&lt;/p&gt;

&lt;p&gt;Plate membership does not define the bed outline or workspace grid. Reproducing the slicer's layout also requires the printer's printable area and the slicer's plate-placement rules.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;model_settings.config&lt;/code&gt;, a plate can contain entries like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;plate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"plater_id"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"plater_name"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Housing"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;model_instance&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"object_id"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"instance_id"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"identify_id"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"107"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/model_instance&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plate&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;object_id&lt;/code&gt; identifies the serialized model object. &lt;code&gt;instance_id&lt;/code&gt; identifies a particular instance of that object. &lt;code&gt;identify_id&lt;/code&gt; is a separate slicer identifier. The object-and-instance pair is the membership relationship to retain. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Format/bbs_3mf.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s plate serialization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That distinction matters whenever a project contains copies. A map from object ID to plate can represent only one assignment. A map from object-and-instance to plate can preserve separate placements of the same object.&lt;/p&gt;

&lt;p&gt;Indexing also crosses several conventions. Saved &lt;code&gt;plater_id&lt;/code&gt; values and familiar &lt;code&gt;plate_N.*&lt;/code&gt; filenames are normally one-based, while instance ordinals are zero-based. Normalize those values deliberately when building an internal representation.&lt;/p&gt;

&lt;p&gt;Once the plate list and membership exist, attach the supporting artifacts.&lt;/p&gt;

&lt;p&gt;Common filenames include &lt;code&gt;Metadata/plate_N.png&lt;/code&gt;, &lt;code&gt;Metadata/plate_N.json&lt;/code&gt;, and &lt;code&gt;Metadata/plate_N.gcode&lt;/code&gt;. The archive may also include alternate plate views such as top or unlit images. Plate configuration can reference artifact paths explicitly, so those references should take precedence over guessing filenames. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/Format/bbs_3mf.hpp" rel="noopener noreferrer"&gt;OrcaSlicer’s plate artifact definitions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The PNG supplies a saved view. It cannot establish which instances belong to the plate.&lt;/p&gt;

&lt;p&gt;The JSON supplies more useful detail, but its bounds need careful interpretation. Orca’s &lt;code&gt;BBoxData&lt;/code&gt; describes a first-layer bounding box as &lt;code&gt;[minX, minY, maxX, maxY]&lt;/code&gt;, alongside first-layer area, layer height, and an object name. &lt;code&gt;PlateBBoxData&lt;/code&gt; adds fields such as &lt;code&gt;bbox_all&lt;/code&gt;, &lt;code&gt;bbox_objects&lt;/code&gt;, filament IDs and colors, bed type, nozzle diameter, and first-layer time. Its aggregate bounds can include brim. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/libslic3r/GCode/ThumbnailData.hpp" rel="noopener noreferrer"&gt;OrcaSlicer’s plate bounding-box structures&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those are print-footprint facts. They do not define the printer’s bed outline or the full three-dimensional bounds of an overhanging model.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;slice_info.config&lt;/code&gt; adds the saved slice results. A shortened plate record might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;plate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"prediction"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"7200"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"weight"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"42.5"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;filament&lt;/span&gt;
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"PLA"&lt;/span&gt;
    &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"#FFFFFF"&lt;/span&gt;
    &lt;span class="na"&gt;used_m=&lt;/span&gt;&lt;span class="s"&gt;"14.2"&lt;/span&gt;
    &lt;span class="na"&gt;used_g=&lt;/span&gt;&lt;span class="s"&gt;"42.5"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plate&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In these records, &lt;code&gt;prediction&lt;/code&gt; is estimated print time in seconds and &lt;code&gt;weight&lt;/code&gt; is estimated filament weight in grams. The per-filament fields &lt;code&gt;used_m&lt;/code&gt; and &lt;code&gt;used_g&lt;/code&gt; record meters and grams. Summary plate blocks depend on valid slice results, so an unsliced plate may have no corresponding result block. &lt;a href="https://github.com/bambulab/BambuStudio/blob/master/src/libslic3r/Format/bbs_3mf.cpp" rel="noopener noreferrer"&gt;Bambu Studio’s slice-info exporter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These numbers describe a saved calculation. Orca obtains the time from its normal-mode estimate and the weight from print statistics. They are not measurements from a completed print. &lt;a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/main/src/slic3r/GUI/PartPlate.cpp" rel="noopener noreferrer"&gt;OrcaSlicer’s plate export code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A reader should also keep configured filaments separate from reported consumption. The project palette describes available filament entries. Surface assignments describe model appearance. Slice results describe what the saved toolpaths consume. Surface color coverage alone cannot tell you the weight used for infill, supports, or filament changes.&lt;/p&gt;

&lt;p&gt;A practical reconstruction order is to load the saved plates and their instance memberships first, resolve the geometry for those instances, then attach whatever images and slice results are available.&lt;/p&gt;

&lt;p&gt;Missing results should remain missing. They should not turn into zero-minute prints or cause plates to disappear.&lt;/p&gt;

&lt;p&gt;Suppose a project declares four plates, but only plates 2 and 3 have saved slice summaries. The reconstructed project still has four plates. Plates 1 and 4 retain their assigned instances; their print time and filament consumption remain unknown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmasnl6dlt6shch64ql5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmasnl6dlt6shch64ql5j.png" alt="Four instances of one mesh assigned to four plates. Only plates 2 and 3 have saved estimates; plates 1 and 4 remain present with unknown print time and consumption." width="800" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. Shared geometry, separate instance memberships, and optional slice results. The diagram shows relationships rather than slicer workspace coordinates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Moving one of those instances to another plate can leave its mesh data unchanged. The project relationship changes, and its placement may change, but the underlying shape can remain identical. That is the distinction a reader has to preserve: the mesh describes the part, while the plate records how that particular copy participates in the print project.&lt;/p&gt;




&lt;p&gt;This article was created with the help of AI.&lt;/p&gt;

</description>
      <category>3dprinting</category>
      <category>programming</category>
      <category>xml</category>
    </item>
  </channel>
</rss>
