· 3MF and STL

A 3MF plate became one STL. Where did the parts go?

The converter copies triangles but not the object list.

On this page
  1. What a build item contains
  2. Why the five shells survive the merge
  3. What five build items produced
  4. When one object becomes two shells
  5. Splitting works only for disjoint shells
  6. How do you keep the parts separate?
  7. What this converter does with the build list
  8. When one merged mesh is what you want
  9. What should you check before converting?
  10. The decision
Technical diagram: Five build items become one triangle list with five shells. Diagram, not a photograph.

The parts are still in the STL as disconnected shells; what disappeared is the list that said which triangles belonged to which object. A 3MF build item references an object and a transform, and the converter applies the transform, appends that object’s triangles to one list, and writes the list as a single binary STL.

What a build item contains

The core specification’s <build> element holds <item> entries. Each carries objectid, an optional transform, and an optional partnumber; the consumer must apply the transform before output. An object can itself be assembled from components, each with its own matrix, so a part’s final placement can be the product of several transforms.

One build item, object 2, containing two components placed apart:

<resources>
  <object id="2" type="model">
    <components>
      <component objectid="3" transform="1 0 0 0 1 0 0 0 1 0 0 0"/>
      <component objectid="4" transform="1 0 0 0 1 0 0 0 1 20 0 0"/>
    </components>
  </object>
</resources>
<build>
  <item objectid="2" transform="1 0 0 0 1 0 0 0 1 10 0 0" partnumber="bracket"/>
</build>

The converter flattens that item into one mesh, and the two component meshes remain disconnected shells. The single objectid in the build list does not imply a single shell.

None of that structure has a field in STL. The specification also calls the build arrangement a default that a consumer may rearrange for packing, which is another way of saying the plate layout is not part of the shape.

Why the five shells survive the merge

The converter does not boolean-union anything. It transforms vertices and copies triangles. Two objects that were separate before conversion are still separate connected components afterward. Two objects that overlapped are still two overlapping shells, now with interior walls where they intersect.

That is why a mesh report can still count five shells after the merge, even though the STL cannot name any of them:

Reading In the 3MF In the merged STL
Object list Build items and object resources None
Transforms Per item and per component Baked into coordinates
Triangle count Sum of referenced meshes Same sum
Connected shells One per object Unchanged, unless objects intersect
Names and part numbers Attributes on objects and items None
Five identical cream game knight miniatures standing in a row on one thin raft strip, each on its own round base.
Five objects on one connected raft: one print, five shells. The merge copies every triangle and keeps them apart.

What five build items produced

We converted a five-object plate — five 20 mm cubes in a row — to one STL. The result panel reported 60 triangles, 180 vertices and bounds of 108 × 20 × 20 mm:

Reading Value
Build items in the 3MF 5
Triangles 60 (5 × 12)
Bounds 108 × 20 × 20 mm
Connected shells 5
PrusaSlicer 2.9.7 manifold, 5 parts, 60 facets
admesh 0.98.5 0 boundary edges, 39,999.992 mm³
Converter result panel after loading plate-five.3mf: 60 triangles, 180 vertices, bounds 108 × 20 × 20 millimetres.
The result panel for plate-five.3mf. One output file and one triangle list; the five shells are still disconnected.

The triangle total is exactly additive, and the five shells stay separate: the merge copies build items into one triangle list rather than unioning them. PrusaSlicer reads the output as five parts and admesh finds no boundary edges, so this is a closed five-part mesh and not a failed union. The fixture is downloadable as plate-five.3mf, and the test page records the run.

When one object becomes two shells

A build item points at an object, but an object is not always one connected surface. Components can assemble several meshes under one object, and a single mesh can contain disjoint islands from the start. The merge preserves both cases: one build item can produce two shells, and two build items can reference one object and produce two copies.

Shell count need not match build-item count. A plate with five build items can produce more than five shells when one object holds disjoint components, and a plate with one build item can produce several. Record the object list before conversion if the mapping matters later.

Splitting works only for disjoint shells

A connectivity split separates components that share no vertices. If the objects were disjoint on the plate, welding coincident vertices and separating by loose parts reproduces one shell per object. If they touched or overlapped, the split gives you one shell where two objects met, and the interior walls remain.

Welding comes first. Every triangle in a binary STL stores its own three vertices, so a splitter that does not merge coincident points sees each triangle as its own island. That is a property of the container, not of the merge, and it makes a naive shell count look far too high.

In Blender, select all in Edit Mode, choose Mesh > Merge > By Distance, and set the merge distance just above the export rounding: 0.001 mm for a millimetre project. Then use Mesh > Separate > By Loose Parts. Too large a threshold welds surfaces that should have stayed apart, so keep it at the smallest value that closes the seams.

How do you keep the parts separate?

Decide before conversion. There are four routes, and only one of them starts with converting the whole plate:

Route What you get When it works
Keep the 3MF Separate build items, names, settings The next tool reads 3MF
Export each object from the source slicer One STL per object The slicer exposes per-object export
Split the 3MF, then convert each part One STL per object, no names You need STLs and control of the split
Convert the plate, then split by connectivity Shells, not named parts The objects do not touch
A cream game knight's torso, sword and round base resting in three separate compartments of a shallow wooden tray.
Sorted before conversion: torso, sword and base stay apart, so the merged STL can be split again.

Bambu Studio can write one STL per object into a directory from its export dialog. PrusaSlicer’s object context menu has Export as STL for a single selected object. Both are faster than unpicking a merged mesh later, because the source still knows where one part ends.

What this converter does with the build list

The reader walks every build item, applies the item transform to the vertices, and merges the result into one indexed mesh. It does not keep an object table, and it does not write names, part numbers or colours. The result panel shows one triangle count, one vertex count and one bounding box, because that is all the output has. The STL header carries a fixed credit line, not the part name.

Open the 3MF to STL converter and drop the plate. The output is one file per conversion, not one file per build item: there is no naming step and no directory of parts, and the download name comes from the input file. That suits a printer that expects one plate and fails a workflow that expects one file per part.

If you need a per-part count after conversion, the only source is the shell count from a mesh tool, and that count is reliable only when the parts do not touch. The 3MF vs STL comparison sets out the other properties that stop at the container boundary.

When one merged mesh is what you want

A single-material print, a mesh editor that expects one surface, or a downstream service that asks for STL: one mesh is the point. Overlapping shells are the exception. They produce a watertight-looking STL with internal walls, and the slicer lays perimeters through material that should be solid. A boolean union in a mesh editor fixes that; converting again does not, because the converter never unions.

Intersecting shells slice with interior perimeters. The triangles can all be present and correctly wound and still be arranged as intersecting solids.

What should you check before converting?

Count the objects in the source slicer’s plate list and note the total triangle count. After conversion, compare the triangle count first: it should be the sum, and a drop means an object was skipped. Then take a duplicate of the mesh, enter Edit Mode, and use Mesh > Separate > By Loose Parts; the number of resulting objects is the shell count. Fewer shells than objects means two parts intersect or share vertices. More shells than objects means one object was already made of disconnected pieces.

The bounding box is the third check. It should match the plate’s extents in millimetres. A box that matches while the shell count does not tells you the merge happened but the parts were never separate. The format reference lists which containers keep object structure and which do not.

The decision

If the receiving tool only needs a surface, convert the plate and accept one mesh. If any downstream step needs to select, move or assign material per part, stop: export the parts separately or keep the 3MF. Recover a split only for disjoint parts; re-export otherwise.

By the 3mftostl.io Editor Team, reviewed 14 November 2026. Editorial standards.

How this page was written: the build-item and component rules come from the 3MF Core Specification, and the merge behaviour comes from this site’s converter, which flattens the build into one triangle list. We converted the five-part fixture in “What five build items produced” in Chrome on 13 November 2026 and read the exported STL back for triangle count, bounds and shell count. We then opened the same output in PrusaSlicer 2.9.7 and admesh 0.98.5, which reported the part count and boundary edges quoted above. No physical print was made and no slicer repair was run. AI-assisted first draft, checked against the sources and reviewed by the Editor Team.

Sources:

  • 3MF Consortium, 3MF Core Specification, v1.4.0, Build and Components sections — accessed 12 November 2026.
  • Library of Congress, STL File Format, Binary, 80-byte header and 50 bytes per triangle, no object table — accessed 12 November 2026.
  • Blender Foundation, Blender Manual: Separate, Separate by Loose Parts — accessed 12 November 2026.
  • Blender Foundation, Blender Manual: Merge, Merge by Distance — accessed 12 November 2026.
  • Prusa Research, Export, Export Plate as STL and per-object Export as STL — accessed 12 November 2026.

Related on this site: why a slicer may refuse the 3MF and what a Bambu Studio project keeps. See also PrusaSlicer project 3MF: get the model, not the profile.

Convert your own 3MF

Drop a 3MF file and get one STL in millimetres. Runs in this tab; nothing is uploaded and no account is needed.

3MF to STL converter

All posts