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 helperWhat it decides
Extrusion calculatorWhether a solid can be written as an extrusion, and along which axis
Wall clippingHow a wall’s base extrusion is clipped by its joins
Opening dataWhich openings a host gets, and their profiles
Door and window cutoutsThe opening a door or window cuts in its wall
TessellationTriangles for bodies that are not extrusions
Temporary PartsThe 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.