How the 3MF Export Plugin Works

A look under the hood at what the plugin does between you clicking Export in HueForge and your slicer opening a ready-to-print .3mf.

Requires HueForge 0.9.4 or Newer

What's Actually in a 3MF

A .3mf is a ZIP archive with a fixed internal layout. Unlike STL — which carries geometry and nothing else — a 3MF carries the entire project state your slicer needs to print:

Geometry

  • 3D/3dmodel.model — the root XML scene, lists every object and how they assemble onto the build plate
  • 3D/Objects/object_N.model — per-object geometry for multi-volume / multi-plate prints
  • Vertex pools deduplicated so each volume only carries the vertices its triangles reference

Print Configuration

  • Metadata/project_settings.config — the slicer's full settings tree (filament temps, speeds, wipe-tower flush volumes, start/end G-code, you name it)
  • Metadata/model_settings.config — per-part metadata (filament assignment, custom layer ranges)
  • Metadata/custom_gcode_per_layer.xml — tool changes and pause-on-color entries the slicer must honor
  • Metadata/layer_config_ranges.xml — height-range modifiers (e.g. cap layer at a different layer height)

These are the Bambu Studio family's file names. PrusaSlicer-family exports keep all geometry in 3D/3dmodel.model and carry the same settings in Metadata/Slic3r_PE.config and Metadata/Slic3r_PE_model.config, with per-layer files ending in _custom_gcode_per_print_z.xml and _layer_config_ranges.xml.

The Export Pipeline

From the moment you hit Export, the plugin runs four stages in parallel:

1. Assemble the Model

HueForge hands the plugin a mesh (or, for FlatForge / ColorDrop / Split-by-Color, a stack of per-color meshes). Vertices are compacted so each per-color mesh only carries the vertices its own triangles use — no full-pool duplication.

2. Build Slicer Metadata

The plugin loads the printer profile you picked, applies your HueForge layer-height + color-stack overrides, and synthesizes every .xml / .config the slicer expects. Per-filament arrays are normalized against your color count so the slicer doesn't reject a length mismatch.

3. Serialize In Parallel

Each metadata file builds on its own worker thread; mesh XML serialization overlaps with PNG thumbnail rendering. On a multi-mesh export every per-object file builds concurrently — saving real seconds on big color stacks.

4. Pack the Archive

CRC and deflate run per-entry across the thread pool, then the central directory writes serially. Each ZIP entry uses a fresh z_stream so the parallel deflate stays thread-safe.

One Plugin, Five Layouts

HueForge can hand the plugin meshes in five different shapes, depending on the mode and which sibling plugin produced them. The 3MF Export plugin picks the right slicer-side layout automatically:

Source modeOutput shapeWhat you get in the slicer
Standard print Single object, single volume One mesh, tool changes injected per layer for color swaps
FlatForge / FlatFill One object, N volumes (one per color) Each color as its own part — slicer assigns filaments by volume metadata
ColorDrop (nested layers) One object, N volumes; filament-ID extruder mapping Each volume is matched to its filament by ID (HueForge 0.9.4.4 and later), falling back to the longest filament name in the volume's name
Split-by-Color One object, N volumes; count-based mapping Same FlatForge layout, but extruder slots derived from origToUnique counts
HugeForge tile mode N plates, one mesh per plate, color stack replicated Multi-plate .3mf — each plate prints the full project independently

Smart Profile Detection

When you click Import in the Import Template row, the plugin opens the archive you picked and figures out which slicer it came from — even across forks that share an ancestor.

Prusa Family

PrusaSlicer, SuperSlicer and QIDISlicer each brand themselves in the Application metadata inside 3D/3dmodel.model. The plugin reads that string and routes accordingly.

Bambu / Orca Family

Most Orca derivatives — OrcaSlicer, Snapmaker Orca, Creality Print, Anycubic Slicer Next, Flashforge Studio — inherited Bambu Studio's writer and still emit "BambuStudio-X.X.X" in their Application metadata. The plugin uses the version field's format inside project_settings.config instead: real Bambu Studio writes zero-padded segments (02.05.00.66), every Orca derivative uses an unpadded SemVer (2.3.0.2). Two exceptions brand themselves in the Application string — Elegoo Slicer ("ElegooSlicer-1.5.1.6") and QIDI Studio ("QIDIStudio-02.06.00.51") — so the plugin checks for those first and falls back to the version-format heuristic for the rest.

Bulk-Config Zips

Slicers' "Export Configs" feature produces a .zip rather than a .3mf. When the archive's only top-level folder is a known slicer name (OrcaSlicer/, BambuStudio/, etc.), the plugin uses that as the detection signal — stronger than version-string heuristics for Orca forks.

Layout-Tolerant

The importer accepts profiles at the archive root OR one directory deep, so wrapped exports (OrcaSlicer/printer/MyProfile.json) work without rezipping.

Opening Your Slicer

With Open 3MF after export on, the plugin launches the slicer you exported for — never your operating system's default .3mf app. It looks for the slicer in this order:

1. Your Saved Location

A slicer location you picked earlier, as long as the slicer is still installed there.

2. Standard Install Locations

Each slicer's default install folder on Windows and its app in Applications on macOS. On Linux, the Flatpak installs of Bambu Studio, Orca Slicer and Prusa Slicer. Version-numbered installs such as PrusaSlicer-2.9.6 are matched too.

3. Ask Once

If neither finds it, a file picker asks you to locate the slicer, and your choice is saved for every later export.

HugeForge tile exports write one multi-plate .3mf tile by tile, so the slicer opens once, after the last tile is written.

What's Preserved From Your Profile

The plugin only overrides the HueForge-specific bits (layer height, first-layer height, color stack, each slot's filament type, preset and temperatures, mesh assignment, layer-range modifiers for the cap), plus per-pair purge volumes in Bambu Studio and its forks. Everything else comes from the printer profile you imported — exactly as your slicer's owners tuned it.

Honored

  • Purge multiplier and extra load / unload purge (Bambu Studio and its forks), and every purge setting in PrusaSlicer-family profiles
  • Custom start / end / change-filament G-code
  • AMS / CFS slot configuration and tool-changer extruder counts
  • Print process settings — speeds, shell layers, infill, retraction

Overridden by HueForge

  • layer_height — from your HueForge layer-height control
  • initial_layer_print_height — from your HueForge first-layer control
  • filament_colour + per-filament temps for each slot in your color stack — from HueForge's filament data in Bambu Studio and its forks, and from the matching slicer filament preset in PrusaSlicer-family slicers
  • filament_type + filament_settings_id — each slot gets the slicer filament preset that matches its HueForge filament type
  • flush_volumes_matrix — purge for every filament pair, calculated from your filament colors the way Bambu Studio's Re-calculate purging volumes does (Bambu Studio and its forks)
  • Custom G-code per-layer entries for tool changes and pause-on-color overflows
  • Layer-range modifier for a transparent cap when FlatForge requests one

Technical FAQ

How does pause-on-color work when I have more colors than slots?

The slot count is the Total Printer Slots setting, which the plugin fills in from your printer profile (extruder_ams_count, or extruder_offset for tool-changer printers) and you can change. The plugin tracks which filaments are loaded. When a color change needs a filament that isn't loaded and every slot is full, it adds a pause one layer earlier so you can load the next set — a type="1" entry in Bambu-family custom_gcode_per_layer.xml, or M600 (M0 in SuperSlicer and QIDI Slicer) in PrusaSlicer-family exports. Changes between loaded filaments stay automatic. With Total Printer Slots set to 1, every color change becomes a pause.

What does Filament Order change in the 3MF?

The plugin reorders the filament list before writing, then remaps every tool change, every pause and the model's starting filament to the new slot numbers. Colors still change at the same heights; they just come from the slots you chose. The order is remembered for the current filament stack and resets when a filament is added, removed, reordered or swapped in HueForge.

Why is my filament with "Transparent" in its name working correctly now?

HueForge's FlatForge mode emits a cap mesh named exactly <projectName>_Transparent.stl. The plugin detects that exact filename and prepends a placeholder Transparent filament slot. User filaments containing "Transparent" in their name (e.g. "Bambu Transparent" → Project_Bambu_Transparent.stl) are not matched because the project-name prefix is followed by a filament-name token rather than the bare _Transparent suffix.

How does the plugin handle Bambu Studio's per-extruder-variant filament arrays?

Bambu profiles can ship filament_* arrays at length N or 2N (per-filament × per-extruder-variant — "Direct Drive Standard" + "Direct Drive High Flow"). Bambu Studio's slicer-side parser indexes every filament_* array by filament_colour.size() and throws std::length_error on mismatch. The plugin collapses any factor-N input to factor-1 by picking variant 0 of each filament, so every filament_* output array matches filament_colour's length exactly.

What does the plugin parallelize, and how much does it save?

Two layers of parallelism: every per-entry CRC + deflate runs through QtConcurrent::blockingMapped on the global thread pool, and every metadata builder (model XML, project settings, custom G-code, layer ranges, slice info, cut info, filament sequence) runs on its own thread via QtConcurrent::run. On multi-mesh exports the per-object XML serialization also fans out. Wall-clock savings depend on mesh count and CPU width — biggest wins on FlatForge / ColorDrop projects with many large meshes.

Does the plugin re-render thumbnails or trust HueForge's?

It uses HueForge's thumbnail when one is provided in the export model. If absent, the plugin renders one via MeshThumbnail::render from the assembled geometry — the same code path HueForge uses internally, so the resulting PNG matches what you see in the host.

Is the file format stable across slicer updates?

Yes. The plugin targets the published 3MF Production Extension format plus each slicer's documented metadata files. Slicer-version drift is absorbed via your imported printer profile — the plugin always overlays your HueForge values on top of whatever your slicer's current schema is, rather than building from a hardcoded template.

For more information and support with your HueForge 3MF Export Plugin: support.3mfexport.com

Ready to Try It?

Skip the manual slicer setup. Save a print-ready .3mf straight from HueForge.

Buy Now