Skip to content

v0.2.0

Choose a tag to compare

@DrunkOnJava DrunkOnJava released this 23 Sep 09:21
v0.2.0
fa4038e

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:ElementId with ObjectType Family: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 IfcStair aggregating its runs, landings and stringers, every relation one Revit's export has (RE-39). Roofs export as IfcRoof.
  • 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-info inventories whole folders as a table, CSV, JSON or JSONL.
  • Schedules. rvt-schedule, the viewer and RevitFile.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-ifc ends 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

  • ElemRecord gained owner_id, PartitionElementRecord gained id_from_enclosing_record and design_option, and PlanProfile gained pieces, so struct literals must add them. IfcEntity gained the Aggregate variant. A slab sketched as separate pieces exports as several elements sharing its Tag.
  • elem_table::declared_element_ids also returns a 40-byte record's second id where it differs from the first (RE-41).
  • PartitionSchemaMvp gained products and lost floors, which only held the removed plan-loop floors; floors are in slabs. partition_schema_mvp::is_strict_room_name is removed.
  • RECOVERED_CATEGORIES has 39 entries. element_record_without_element_id counts placed instances inside the partition record chain only. The diagnostics gain the skipped items element_record_without_volume and element_record_in_non_primary_design_option.
  • IFC element names change for family instances (Door-416336 becomes Single-Flush:36" x 84":416336); the Tag is unchanged.
  • ExportConfidenceSummary gained unexported_element_records, and rvt-inspect can report the new incomplete_model failure mode.
  • IfcBoolean values are written .T. / .F.. A tool that matched the old malformed .T) text must match the valid form.
  • rvt-gltf and rvt-sheet take the model as a positional argument; --src and --dst remain as hidden aliases.
  • rvt-dump no longer inserts 16-byte 0xFF separators 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