Repository navigation
v0.2.0
rvt-rs 0.2.0 is an inspection-focused alpha. It is a clean-room toolkit that opens Autodesk Revit files (.rvt, .rfa, .rte, .rft) without Revit and reads what it can prove it reads, with experimental IFC / glTF / SVG / CSV export. It is not a production Revit→IFC converter; see docs/status.md and the support matrix.
Install
- Prebuilt CLIs (19 tools, no Rust needed): the archives below for Linux x86_64/aarch64 (static), macOS Apple Silicon/Intel and Windows x86_64, with
SHA256SUMS. See Prebuilt Binaries. - Python:
pip install rvt==0.2.0 - Container:
docker run --rm -v "$PWD:/data" --user "$(id -u):$(id -g)" ghcr.io/drunkonjava/rvt-rs:0.2.0 rvt-info model.rvt(linux/amd64+linux/arm64) - crates.io / docs.rs: not published in this release.
- Provenance: every archive and the image carry a build-provenance attestation. Check with
gh attestation verify <archive> -R DrunkOnJava/rvt-rs.
Highlights
- Revit 2024 and 2025 element records, read directly. Walls, doors (bound to their host wall), windows, columns, slabs and rooms come from the partition element records. On the recorded edge (
2024_Core_Interior.rvt) they match Revit's own IFC export element for element.- Every partition opens with a chain of ElementId-keyed records, and records that do not carry their id at the start sit inside one (RE-35). All 30,432 id-carrying records across nine files start a record of their own id, and the chains hold every declared ElementId on Core Interior and the RE1 models.
- Revit 2025 files decode with a per-release record marker (RE-32).
- Slabs take their sketched outline, and a slab sketched as separate pieces exports one element per piece, as Revit does.
- Where an ElemTable record's two ids differ, the second is the element's ElementId (RE-41).
- Frames holding the invalid ElementId (−1) take their record's id too (RE-43).
- On the MIT RE1 models every recovered entity matches Revit's own export. Autodesk's Snowdon Towers architectural sample exports 6,045 elements instead of 80, and 5,945 of them are in Revit's own export: every element Revit exports in the IFC entities rvt-rs writes. Nothing is left unattributed.
- Many more categories. Furniture, casework, fixtures, equipment, ceilings, curtain-wall parts, railings, wall sweeps, ducts and pipes (RE-33). Structural framing, columns, foundations and generic models (RE-36). Lighting fixtures, air terminals, food service, planting, parking, entourage, hardscape, elevators and ramps (RE-37). Each exported element is one Revit's own export holds.
- Revit's own names. Family instances are named
Family:Type:ElementIdwithObjectTypeFamily:Type, identical to Revit's on all 4,397 elements named across Core Interior, Snowdon Towers and the RE1 models (RE-38). That includes families that nest others of their category (RE-42). - Stairs and roofs. Each stair is an
IfcStairaggregating its runs, landings and stringers, every relation one Revit's export has (RE-39). Roofs export asIfcRoof. - Design options. The export holds the main model and each option set's primary option, as Revit's own export does by default: a set's name entry names its primary (RE-40). Slab edges export as proxies.
- Honest exports.
- The readiness score counts records the export leaves out, and says "Incomplete model" when there are any.
- Rooms and floors are no longer invented from name strings or closed polylines, which matched nothing in Revit's exports.
- 2D symbol families with no 3D body, and elements in non-primary design options, are left out as Revit leaves them out, and the diagnostics count both.
- Valid IFC. Boolean property values are now valid STEP. They were malformed in every earlier export. CI schema-validates real-project exports with IfcOpenShell.
- File metadata and folder inventory. Every file says who saved it, when, and whether it is workshared.
rvt-infoinventories whole folders as a table, CSV, JSON or JSONL. - Schedules.
rvt-schedule, the viewer andRevitFile.schedule_csv()write element and room schedules for Excel or Sheets. - Viewer. It exports IFC and plan SVG in the browser, downloads schedule CSVs, and opens Snowdon-sized models (95 MB) within browser memory.
- Consistent CLIs. Positional input,
-o,--json, examples in every--help, quiet broken pipes, and named errors.rvt-ifcends with a summary: elements by IFC type, what it left out on purpose, and the readiness level. - Distribution. Prebuilt CLI archives and a multi-arch container image, built, smoke-tested and attested by the release workflow.
Full list: CHANGELOG.md.
Breaking changes
ElemRecordgainedowner_id,PartitionElementRecordgainedid_from_enclosing_recordanddesign_option, andPlanProfilegainedpieces, so struct literals must add them.IfcEntitygained theAggregatevariant. A slab sketched as separate pieces exports as several elements sharing itsTag.elem_table::declared_element_idsalso returns a 40-byte record's second id where it differs from the first (RE-41).PartitionSchemaMvpgainedproductsand lostfloors, which only held the removed plan-loop floors; floors are inslabs.partition_schema_mvp::is_strict_room_nameis removed.RECOVERED_CATEGORIEShas 39 entries.element_record_without_element_idcounts placed instances inside the partition record chain only. The diagnostics gain the skipped itemselement_record_without_volumeandelement_record_in_non_primary_design_option.- IFC element names change for family instances (
Door-416336becomesSingle-Flush:36" x 84":416336); theTagis unchanged. ExportConfidenceSummarygainedunexported_element_records, andrvt-inspectcan report the newincomplete_modelfailure mode.- IfcBoolean values are written
.T./.F.. A tool that matched the old malformed.T)text must match the valid form. rvt-gltfandrvt-sheettake the model as a positional argument;--srcand--dstremain as hidden aliases.rvt-dumpno longer inserts 16-byte0xFFseparators between gzip members.
Release verification
- cargo install rvt --version 0.2.0 --locked: NOT PUBLISHED (crates.io deferred; no registry token)
- Python wheel install/import: PASS on Linux, macOS and Windows in the publish workflow; the macOS arm64 wheel from PyPI imports and reads a sample locally
- Prebuilt archives: SHA256SUMS verified; rvt-info runs from the aarch64-apple-darwin archive
- Container image: PASS (ghcr.io/drunkonjava/rvt-rs:0.2.0 pulls anonymously; rvt-info runs in it)
- CLI sample smoke: PASS on racbasicsamplefamily-2024.rfa (cargo install from the tag source, and the archives)
- Viewer sample load: PASS (Core Interior 2024 on the deployed site: Geometry, 100%)
- docs.rs page: N/A (crate not on crates.io)
- Publish workflow run: https://github.com/DrunkOnJava/rvt-rs/actions/runs/35840251490