Skip to content

v0.4.0

Latest

Choose a tag to compare

@github-actions github-actions released this 28 Sep 18:16
· 179 commits to main since this release
v0.4.0
39fdb2a

Revit 2023 projects now export typed elements, as 2024 and 2025 projects
do: storeys, types, layers, materials, GlobalIds, wall joins and beam cuts,
measured against Revit's own exports of two 2023 projects. On every
supported release, rooms take their real outline and Revit's number and
name, doors and windows cut the opening their type specifies, turned
family instances are drawn turned, steel members carry their I section,
and every typed element is related to an IFC type object of its Revit
type. Every figure is measured against Revit's own export of the same
model; the reports under reports/element-framing/ hold the inputs.

Upgrading from 0.3

  • IfcSpace.Name is the room number (RE-117). It was
    Room-<ElementId>. The room name stays in LongName, and the ElementId,
    which an IfcSpace has no Tag for, is the new ElementId property.
    Anything that read a room's ElementId from its IFC Name reads that
    property instead. A room without a number keeps the Room-<ElementId>
    Name; one without a name now has no LongName (it repeated the Name).
    glTF node names, the viewer and the room schedule are unchanged.
  • Only building-story Levels are storeys (RE-118). A Level whose
    Building Story setting is off is no longer written as an
    IfcBuildingStorey, as in Revit's export. Of the models measured, only
    Snowdon Towers' structural model changes: its Top of Footing and TOS
    Levels are not storeys, and its 12 building stories now are.
  • System family names follow the file's saved locale (RE-123). On a
    file saved as PTB, walls, floors and roofs are Parede básica, Piso
    and Telhado básico in Name, ObjectType and material layer set
    names, where 0.3 wrote Basic Wall, Floor and Basic Roof. Files
    saved in other locales are unchanged.
  • ElemRecord::owner_id values change (#152). Each record now reports
    its own owner; 0.3 reported the next record's. This reaches
    rvt-elem-table --json and Python's elem_table_records(). The IFC
    export does not use it.
  • Rust API: public structs gained fields, among them
    ifc::IfcModel::element_type_ids and
    partition_level_records::PartitionLevel::building_story. Code that
    builds them with struct literals needs the new fields or
    ..Default::default() where the type has one.
  • Element bodies and IFC entity counts change wherever geometry is
    newly decoded (openings, turned instances, rooms, sketched outlines,
    steel sections) and where type objects are added. GlobalIds of existing
    elements, rooms and storeys are unchanged.

Install

  • Rust CLIs: cargo install rvt --locked; library: cargo add rvt (docs.rs)
  • Python: pip install rvt (abi3 wheels for CPython 3.8+ on Linux x86_64/aarch64 glibc and musl, macOS Apple Silicon and Intel, Windows x86_64, plus the sdist)
  • Prebuilt CLIs: the archives below, checked against SHA256SUMS and GitHub build attestations (gh attestation verify <archive> --repo DrunkOnJava/rvt-rs)
  • Container: docker run --rm ghcr.io/drunkonjava/rvt-rs:0.4.0 rvt-info --help (linux/amd64, linux/arm64)
  • Browser: https://drunkonjava.github.io/rvt-rs/ runs 0.4.0 in the tab; nothing is uploaded.

The full list of additions, changes and fixes, each with its measurement, is under [0.4.0] in CHANGELOG.md.

Verified from the published artifacts

  • crates.io: cargo install rvt --version 0.4.0 --locked builds; rvt-ifc converts the Revit 2023 project modelo_bim (8 beams).
  • PyPI: pip install rvt==0.4.0 in a clean venv; write_ifc() on RE1 Architecture writes its 7 walls and 11 spaces.
  • GitHub archive (macOS arm64): checksum and attestation verified; on Core Interior, 992 elements, all with bodies, and 116 spaces with Revit's number and name; on Exemplo_data (2023), 56 elements and 9 of 9 rooms as Revit's.
  • Container image: pulls on linux/arm64 and reads a 2025 model.
  • The publish workflow's own checks: install and open a model on all seven wheel platforms, CLI smoke, viewer load.
Pull requests in this release

What's Changed

  • docs: v0.3.0 is released, each channel verified from its published artifacts (#405) by @DrunkOnJava in #425
  • docs(install): rvt 0.3.0 is on crates.io and docs.rs (#406) by @DrunkOnJava in #426
  • docs(partitions): locate Revit 2023 element records behind the schema-derived marker (#421) (RE-81) by @DrunkOnJava in #427
  • ci: run only real-file, CLI and contract verification; unit tests are banned by @DrunkOnJava in #428
  • feat(elements): export Revit 2023 projects' elements from their records, without components nested in doors and windows (#421) (RE-81) by @DrunkOnJava in #429
  • fix(ci): check Einhoven's Revit 2023 record elements instead of refusing them (#421) by @DrunkOnJava in #430
  • feat(ifc): export family instances' materials from their type's geometry-material map (#355) (RE-82) by @DrunkOnJava in #431
  • docs(validation): held-out measurement on Snowdon Towers Plumbing, HVAC and Electrical (#408) by @DrunkOnJava in #432
  • fix(ifc): cut each door's and window's opening to its host wall's depth (#227) (RE-83) by @DrunkOnJava in #440
  • feat(ifc): export doors and windows whose type draws no geometry as their opening alone (#309) (RE-84) by @DrunkOnJava in #441
  • fix(elements): bind doors and windows to the nearest wall their reference list names (#439) (RE-85) by @DrunkOnJava in #442
  • feat(elements): bind Revit 2023 doors and windows to their host wall (#421) (RE-85) by @DrunkOnJava in #443
  • feat(gltf): draw a family instance in its one material's colour (#355) by @DrunkOnJava in #445
  • build(viewer): install and run the viewer with pnpm by @DrunkOnJava in #444
  • deps(deps): bump three from 0.186.0 to 0.186.1 in /viewer by @dependabot[bot] in #434
  • deps(deps): bump thiserror from 2.0.20 to 2.0.21 by @dependabot[bot] in #433
  • deps(deps): bump cfb from 0.14.0 to 0.15.0 by @dependabot[bot] in #435
  • deps(deps): bump orhun/git-cliff-action from 4.9.0 to 4.9.1 by @dependabot[bot] in #436
  • deps(deps): bump taiki-e/install-action from 2.87.14 to 2.87.20 by @dependabot[bot] in #438
  • deps(deps-dev): bump vite from 8.3.0 to 8.3.1 in /viewer by @dependabot[bot] in #437
  • chore(deps): sync the fuzz lockfile with cfb 0.15 and let dependabot keep it current by @DrunkOnJava in #447
  • feat(elements): draw tapered walls with their leaning exterior face (#358) (RE-86) by @DrunkOnJava in #446
  • feat(elements): draw turned family instances turned, from the transform their data holds (#227) (RE-87) by @DrunkOnJava in #456
  • feat(ifc): give walls whose body is not a layer set their layers' materials, as Revit does (#355) (RE-88) by @DrunkOnJava in #457
  • deps(deps): bump serde_json from 1.0.149 to 1.0.151 by @dependabot[bot] in #450
  • deps(deps): bump serde_json from 1.0.149 to 1.0.151 in /fuzz by @dependabot[bot] in #455
  • docs(reports): correct RE-86's count of walls by cross-section word (#358) by @DrunkOnJava in #458
  • feat(ifc): give walls their data does not place their type's materials (#355) (RE-88) by @DrunkOnJava in #460
  • deps(deps): bump serde from 1.0.228 to 1.0.229 by @dependabot[bot] in #449
  • feat(ifc): cut a window's opening in a tapered wall on the window's origin, as Revit does (#227) (RE-89) by @DrunkOnJava in #461
  • feat(elements): turn family instances hosted on ceilings and walls by their flat axis (#227) (RE-90) by @DrunkOnJava in #462
  • deps(deps): move to sha2 0.11 and format digests without LowerHex by @DrunkOnJava in #459
  • deps(deps): bump serde from 1.0.228 to 1.0.229 in /fuzz by @dependabot[bot] in #453
  • deps(deps): bump libfuzzer-sys from 0.4.12 to 0.4.13 in /fuzz by @dependabot[bot] in #452
  • feat(elements): give wall layers that take their category's material the one the object styles set (#355) (RE-91) by @DrunkOnJava in #463
  • deps(deps): bump clap from 4.6.1 to 4.6.7 in /fuzz by @dependabot[bot] in #451
  • feat(elements): draw stair runs ending with a tread and monolithic runs from the run's End with Riser setting (#357) (RE-92) by @DrunkOnJava in #464
  • feat(ifc): cut each window's opening from its type's Width, Height and Default Sill Height (#227) (RE-93) by @DrunkOnJava in #465
  • feat(ifc): cut each door Revit cuts at its rough size at its type's rough opening (#227) (RE-94) by @DrunkOnJava in #466
  • fix(elements): leave out zero-length sketch lines so Core Interior's shading plates close (#233) (RE-95) by @DrunkOnJava in #467
  • feat(elements): read a sketch line's arc so slab outlines with curved edges close (RE-96) by @DrunkOnJava in #468
  • feat(elements): take a sketch's lines from its Sketch element's curve list (RE-97) by @DrunkOnJava in #469
  • feat(elements): give ceilings their sketch's outline (RE-98) by @DrunkOnJava in #470
  • feat(elements): cut shaft openings from the floors, roofs and ceilings within their height (RE-99) by @DrunkOnJava in #471
  • feat(elements): read full-circle sketch lines so round shafts cut their void (RE-100) by @DrunkOnJava in #472
  • feat(elements): read each room's outline from its stored solid (#90) (RE-101) by @DrunkOnJava in #473
  • feat(elements): read Revit 2023 room solids for their outline (#90) (RE-102) by @DrunkOnJava in #474
  • feat(elements): draw steel beams as their type's I section (#94) (RE-103) by @DrunkOnJava in #475
  • feat(elements): draw steel columns as their type's I section (#94) (RE-104) by @DrunkOnJava in #476
  • feat(ifc): write I-section members' material as a profile set of their section (#94) (RE-105) by @DrunkOnJava in #477
  • fix(ifc): name family instances' materials in the element schedule by @DrunkOnJava in #478
  • feat(elements): draw turned and tilted curtain mullions and panels along their own axes (RE-106) by @DrunkOnJava in #479
  • feat(elements): read Revit 2023 Levels as storeys and contain each element in its Level's (#421) (RE-107) by @DrunkOnJava in #480
  • feat(ifc): give Revit 2023 elements Revit's own GlobalIds (#421) (RE-108) by @DrunkOnJava in #481
  • feat(elements): name Revit 2023 family instances by their family and type (#421) (RE-109) by @DrunkOnJava in #482
  • feat(ifc): type every element named Family:Type by an IFC type object of its Revit type (RE-110) by @DrunkOnJava in #483
  • feat(elements): give Revit 2023 walls, floors and roofs their type (#421) (RE-111) by @DrunkOnJava in #484
  • feat(elements): read Revit 2023 host types' layers and type their walls and roofs (#421) (RE-112) by @DrunkOnJava in #485
  • feat(elements): give Revit 2023 family instances their type's materials (#421) (#355) (RE-113) by @DrunkOnJava in #486
  • feat(elements): give Revit 2023 walls and floors their material layer sets (#421) (RE-114) by @DrunkOnJava in #487
  • feat(elements): read Revit 2023 object styles' category materials for layers (#421) (RE-115) by @DrunkOnJava in #488
  • feat(elements): read Revit 2023 materials' shading colours and list the file's own materials (#421) (#355) (RE-116) by @DrunkOnJava in #489
  • feat(elements): read rooms' numbers and names from their parameter entries on every release (#90) (#421) (RE-117) by @DrunkOnJava in #490
  • feat(elements): make only building-story Levels storeys, and give Snowdon's structural model its storeys (#219) (RE-118) by @DrunkOnJava in #491
  • docs(launch): bring the buildingSMART forum draft up to what rvt-rs emits today by @DrunkOnJava in #492
  • feat(elements): put Revit 2023 beams on the Level at their top, as Revit's export does (#421) (RE-119) by @DrunkOnJava in #493
  • feat(elements): cut Revit 2023 walls back at their joins with 2024's solver (#421) (RE-120) by @DrunkOnJava in #494
  • fix(viewer): pin Einhoven's 36 materials in the browser regression test (#421) by @DrunkOnJava in #495
  • docs(re): a door's record box does not give its body, measured on five files (#227) (RE-121) by @DrunkOnJava in #496
  • feat(elements): stop Revit 2023 beams at the columns their records name (#421) (RE-122) by @DrunkOnJava in #497
  • feat(ifc): name system families in the locale the file was saved in (RE-123) by @DrunkOnJava in #498
  • fix(elem-table): report each record's owner from the field that closes it (#152) (RE-31) by @DrunkOnJava in #499
  • docs: 0.3.0 versus main, a current Python reference, working CLI examples and contributor guidance by @DrunkOnJava in #500
  • feat(ifc)!: name each IfcSpace by its room number, as Revit's export does, with the ElementId as a property (#90) (RE-117) by @DrunkOnJava in #503
  • docs(security): support the latest release line and main, and describe best-effort handling instead of fixed deadlines by @DrunkOnJava in #504
  • chore(release): prepare v0.4.0 by @DrunkOnJava in #505

Full Changelog: v0.3.0...v0.4.0