Docs · Exporter
How the exporter works
Autodesk’s exporter is a C# add-in that runs entirely inside Revit, on Revit’s single main thread. It reads an element, decides its IFC class, builds its geometry and property sets, writes it, and moves on to the next element. Revit is busy for the whole export.
BMC splits that job in two.
Revit, main thread Rust process, all cores
------------------- -----------------------
capture library: read the model ──► rs-rvt2ifc: every IFC decision
(parameters, relationships, snapshot (classes, placement, storeys,
geometry, native calculations) geometry, types, materials,
property sets, quantities)
│
▼
model.ifc + report.json Part 1: Revit reads
Revit’s API can only be used on its main thread, so that thread does as little as possible: it copies the model into plain data, the snapshot.
- Owned facts only. No live Revit object crosses into Rust, only values: lengths in Revit’s internal units, ids, parameter values, triangles, profiles.
- No IFC decisions. The capture library does not choose classes or property sets. It records what Rust will need.
- The model is never changed. Where the export needs temporary changes (Autodesk’s exporter creates temporary Parts for layered walls and floors), they run in a transaction that is always rolled back. The snapshot checks that the document is unmodified before and after.
Part 2: Rust converts
The rs-rvt2ifc converter reads the snapshot and makes every IFC decision: class mapping, placements, spatial structure, geometry representation, type objects, materials, property sets, quantities and colours. Geometry is prepared in parallel. The file is then written in a fixed order, so the same snapshot always gives the same bytes.
The converter also writes a report next to the IFC: duplicate GUIDs it repaired, quantity calculators that lacked inputs, and decisions where Autodesk’s result can vary between runs.
Ported, not wrapped
The conversion rules come from Autodesk’s open-source exporter (revit-ifc), ported rule by rule into Rust. That includes its quirks. One example: the pieces of a multi-piece floor get a material while their type does not. BMC matches that for parity and marks it in the code.
Some of Autodesk’s decisions rely on Revit’s own native helpers. BMC calls the same helpers inside Revit and stores their results in the snapshot, so Rust starts from the same inputs:
| Native helper | What it decides |
|---|---|
| Extrusion calculator | Whether a solid can be written as an extrusion, and along which axis |
| Wall clipping | How a wall’s base extrusion is clipped by its joins |
| Opening data | Which openings a host gets, and their profiles |
| Door and window cutouts | The opening a door or window cuts in its wall |
| Tessellation | Triangles for bodies that are not extrusions |
| Temporary Parts | The layer pieces of walls, floors, ceilings and roofs |
BMC never calls Autodesk’s exporter itself.
Why this is faster
Autodesk’s exporter keeps Revit busy for every step. BMC keeps it busy only for the read. On the sample projects the Rust part takes under a second, and on a 451 MB model about 5 seconds. See Speed and benchmarks.