Skip to content

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 18:14
· 24 commits to main since this release
v0.6.0
584e69f

rvt-rs writes IFC4, and 0.6.0 makes its property sets IFC4's. 0.5 took some
of them from Revit's exports of the RE1 models, which are IFC2X3; every
standard property set rvt-rs now writes matches buildingSMART's published
IFC4 property set definitions on all 89 exports Measure checks, by rvt-rs's
own check of them (#822, #826). buildingSMART's Validation Service has not
been run on them, and quantity sets are not checked. More of what
Revit's exporter writes is written: parameters named for any IFC4 property
set's property (RE-194, #817), IsExternal on every class but curtain
mullions and panels (RE-193), a type's Fire Rating, a door's overall size,
Revit 2024 Areas as spaces (RE-191), and each port's type and, where
Revit's exporter gives it one, its flow direction (RE-197). Projects saved
by Revit 2015 to 2022 and by Revit 2027 export their elements, as
experimental (RE-179 to RE-181).

puzzbobb's pull requests read Revit 2015 to 2022 and 2027 projects (#740,
#742) and found where a wall's function and roof attachment come from
(RE-185); Erry91's gives each door its overall size (#788); MadsHolten's
fixes a panic in the browser viewer (#835). Thank you.

Upgrading from 0.5

  • Property sets moved to where IFC4 has them (#822). An element's
    Reference is in Pset_EnvironmentalImpactIndicators and each IFC4 set
    that applies to it and declares Reference, no longer in
    Pset_QuantityTakeOff or Pset_DistributionFlowElementCommon. Storeys and
    spaces lose Pset_AirSideSystemInformation and Pset_ProductRequirements.
    A pipe's or duct's Length is in Qto_PipeSegmentBaseQuantities or
    Qto_DuctSegmentBaseQuantities, an IfcElementQuantity, and a pipe's
    InvertElevation in Pset_PipeSegmentOccurrence. A room's Floor Finish is
    in Pset_SpaceCoveringRequirements, a proxy's Serial Number in
    Pset_ManufacturerOccurrence only, and a pipe fitting's nominal diameter
    in RvtElementRecordGeometry.NominalDiameter, one length.
  • Public API. ifc::entities::PropertySet::name_sets is removed and
    storey_sets takes no name; a PropertySet named Qto_ is written as an
    IfcElementQuantity; ifc::export_content::TypedProductionAppend gains
    computed_inverts; ifc::entities::IfcEntity::Port gains
    predefined_type and flow_direction; and
    native_connectors::symbol_port_indices returns (index, domain) pairs.
  • Older and newer releases export elements. A Revit 2015 to 2022 or 2027
    project, which exported no building element, now exports them, as
    experimental: measured against the same models saved by a neighbouring
    release, not against a Revit export of them.

Added

  • A port is typed by its connector's domain, and an electrical port is
    SOURCEANDSINK (#828, RE-197).
    Revit's IFC4 export types each port by
    its connector's domain, DUCT, CABLE or PIPE, and writes every
    connector but an HVAC or piping one as bidirectional (revit-ifc
    ConnectorExporter). rvt-rs wrote no PredefinedType and NOTDEFINED for
    every direction. On the BIM4LCA office all 67 ports now have Revit's
    PredefinedType (none before) and 43 its FlowDirection; all 53 of RE1
    Electrical's ports are SOURCEANDSINK, as in Revit's export, and no port
    takes a direction Revit's export does not give it. The direction rule is
    measured on electrical connectors only; for others outside HVAC and piping
    it rests on revit-ifc's rule. An electrical connector whose description
    sets Flow=Source or Flow=Sink is exported with that direction by Revit;
    rvt-rs does not read the description (#834), so it writes such a port
    SOURCEANDSINK. An HVAC or piping connector's direction, a
    duct's or pipe's included, is the family's and is not read, so it stays
    NOTDEFINED (the office's 24 pipe ends are SOURCEANDSINK in Revit's
    export); SystemType is not written. ifc::entities::IfcEntity::Port gains
    predefined_type and flow_direction, which the writer writes only as a
    value of IFC4's enumeration, and tools/re/ports_vs_ifc.py compares the
    three attributes on the ports both exports hold.
  • A type's Fire Rating fills an element's IFC4 FireRating (RE-77,
    RE-194).
    Revit's exporter reads a parameter named for the property
    (Pset_WallCommon.FireRating) first and the type's Fire Rating after it.
    rvt-rs read the type's Fire Rating (RE-77) but wrote it only in its own
    set; it now also goes in each IFC4 standard set declaring FireRating
    that applies to the element, wherever no such parameter supplies one. On
    the BIM4LCA office Pset_WallCommon.FireRating goes from 71 to 97 of
    Revit's 97 values (26 walls carry their type's), on RE1 Architecture from
    0 to 7 of 7; none differs, and where a parameter and the type disagree
    (4 elements) Revit's export has the parameter's, as rvt-rs does.
  • A parameter named for any IFC4 property set's property is written (#817).
    The sets RE-194 writes such parameters in are now IFC4's 278 property sets
    that apply to an entity, generated by tools/ci/gen_standard_property_sets.py
    from buildingSMART's own list of IFC4's definitions (the one its validation
    service checks rule PSE001 against) and IFC4's entity hierarchy, instead of
    21 sets listed by hand; a set scoped to a predefined type applies only with
    it, and IfcInteger properties are read too. CI checks the table is the
    generator's output. No measured model has parameters for the new sets, so
    no export changes.
  • Parameters named for a standard property set's property are written in
    that set (RE-194).
    Revit's exporter reads a project or shared parameter
    named <set>.<property>, such as Pset_WallCommon.FireRating or
    Pset_WindowCommon.ThermalTransmittance, before anything else for that
    property. rvt-rs now reads each such parameter of an IFC4 set's property
    from the element and writes it there, where IFC4 applies the set to the
    entity written. Booleans, labels and text, counts, lengths and thermal
    transmittance are read; a thermal transmittance is written as
    IfcThermalTransmittanceMeasure, with its unit declared. The parameter's
    value replaces rvt-rs's own. On the BIM4LCA office, as built, property
    values equal to Revit's go from 14,531 to 18,374. The 7 stair riser values
    that differed are now Revit's, and 55 OccupancyNumber values differ only
    in type: IFC4's IfcCountMeasure against the export's IfcInteger. What
    that export takes from its user-defined property set file, such as a
    glazing set on walls, is not written.
  • IsExternal as Revit's exporter sets it, on every class but curtain
    mullions and panels (RE-193).

    Revit's export reads a Yes/No parameter named for the property set first
    (Pset_WallCommon.IsExternal on a wall), then calculates the value from a
    parameter named IsExternal, the type's Function, a roof's category, and
    otherwise writes not external. rvt-rs now does the same for walls, curtain
    walls, doors, windows, slabs, roofs, columns, beams, coverings, railings,
    ramps, stairs, proxies and spaces, with a wall's Function from its type's
    native record (RE-185). On the BIM4LCA office, as built, the IsExternal
    values equal to Revit's go from 266 to 2,110 and those that differ from 29
    to none; on the reference and R2025 models from 13 to 245, none differing.
    Curtain mullions and panels get no value, nor do windows whose type's
    Function is not read: Revit's export does not follow their curtain wall or
    host wall.
  • Revit 2024 Areas export as IfcSpace (#763, RE-191). An Area's
    partition record carries no bounding-box marker, so the element-record
    scan never read one. A placed Area now exports as IfcSpace .SPACE. under
    Revit's GlobalId: its number as Name, its name as LongName, in its
    Level's storey, typed by an IfcSpaceType of its own and with
    Pset_SpaceCommon.Reference, as Revit's export writes it. It has no body:
    the Area's boundary is not decoded. On the BIM4LCA office, as built and at
    building permit, rvt-rs now writes all 30 of the area spaces in Revit's
    export, with number, name and GlobalId as Revit's. The permit file's two
    Areas that are not placed are left out, as Revit leaves them out. Revit
    2024 only.
  • Revit 2015 to 2018 projects export their elements, as experimental
    (RE-181).
    Revit 2015 to 2018 frame their element records as 2019 does,
    so the 32-bit readers read them with each release's own schema tags. Three
    layouts differ: a Level record's placement kind, a wall's flip, which
    follows its location line with no word as on 2019 and 2020, and a
    material's shading frame, which holds two pattern slots where 2019 holds
    four. A type's element-data name is looked for in its own data only, past
    any one-unit entry. There is no Revit export of a 2015 to 2018 file to
    measure against; on Autodesk's 2016 to 2018 rac_basic, rst_basic and
    rac_advanced every ElementId shared with the 2019 copy has its class,
    2018 rac_basic and rac_advanced agree with it on every field, and the
    exports have the 2019 copies' building elements, class for class, and pass
    IfcOpenShell's schema validation. Autodesk's six 2015 sample projects
    (#801) frame their records the same way and carry the 2015 tags; on five
    of them every ElementId shared with the 2019 copy has its class, and the
    sixth, rst_basic, is another model. Before, a 2015 to 2018 project exported
    no building element. Beyond RE-180's, it changes no 2019 to 2027 export.
    Revit 2014 is not read: no documented 2014 file backs it. By puzzbobb
    (#742).
  • Revit 2019 to 2022 projects export their elements, as experimental
    (RE-180).
    Revit 2019 to 2022 frame their element records as 2023 does,
    so the 2023 readers read them, each constant taken as the release's own tag
    of the same schema class: element data, materials, the category material
    frame and layers. Revit 2019 and 2020 write a wall's flip with no word
    before it, and in 32-bit data a one-id list reads as a one-unit name, which
    is no longer taken. There is no Revit export of a 2019 to 2022 file to
    measure against; on Autodesk's 2019 to 2022 rac_basic, rst_basic and
    rac_advanced every ElementId shared with the 2023 copy has its class. The
    rac_basic and rst_basic exports, and the 2021 and 2022 rac_advanced
    ones, have 2023's building elements, class for class (the 2019 and 2020
    rac_advanced are an earlier edit of the model), and every export passes
    IfcOpenShell's schema validation. Before, a 2019 to 2022 project exported
    no building element. Every 2024 to 2027 export is byte-identical. Of the
    2023 samples only rac_advanced changes: the one-unit name rule gives its
    export 2 more entities and 2 more property values. By puzzbobb (#742).
  • Revit 2027 projects export their elements, as experimental (RE-179).
    The partition readers take their 2027 constants from the file's schema, as
    RE-124 found every release's to be: the record marker, Level elevations,
    element data, layers and materials. Layer records, wall join lists and
    mullion type materials keep their 2026 layouts. Revit 2027 writes most
    element frames without an ElementId at +0x00, type symbols among them, so
    from 2027 a symbol frame takes its enclosing record's id as an instance
    already does (RE-35). There is no Revit 2027 IFC export to measure against;
    on Autodesk's five 2027 sample projects the elements equal those of the
    same models saved by Revit 2026 (20,818 of 20,818 ElementIds, every class
    the same, 363,072 of 363,256 fields, measured by Measure's paired probe,
    #799), and the six 2027 exports pass
    IfcOpenShell's schema validation. Before, a 2027 project exported no
    building element. Every 2023 to 2026 export is byte-identical. By puzzbobb
    (#740).
  • A door's OverallWidth / OverallHeight from its type (#759, RE-187).
    A door type's Width and Height are Revit's OverallWidth and
    OverallHeight on every door where they are read, so a door with no
    opening read now writes them instead of $: all 132 of Core Interior's
    doors and 4 of RE1 Architecture's 5, each equal to Revit's (none before).
    A door cut at its rough size keeps that size (RE-94). Windows keep failing
    closed: Core Interior's type size is not Revit's. Checked by
    tests/door_overall_sizes.rs and scored by
    tools/re/door_window_sizes_vs_ifc.py. By Erry91 (#788).

Changed

  • ifc::entities::PropertySet::name_sets is removed, and storey_sets
    takes no name (#822).
    The two sets name_sets built are IFC2X3's, and a
    storey's sets no longer include them.
  • Measure checks each export's standard property sets against IFC4's
    definitions (#822).
    tools/ci/ifc4_property_sets.py counts, for every
    Pset_ set an export relates to an object or a type, what buildingSMART's
    IFC4 definitions (the list its validation service checks rule PSE001
    against, pinned by #817's generator) do not allow: sets IFC4 does not
    define, properties a set does not have, sets on entities IFC4 does not
    apply them to, and values of another kind or type. Measure appends it to
    every export's schema.txt. On the 89 measured exports of main before
    #822's fixes it found IFC2X3's Pset_QuantityTakeOff,
    Pset_DistributionFlowElementCommon, Pset_ProductRequirements and
    flow-segment sets, Pset_AirSideSystemInformation on storeys, and IFC2X3's
    NominalDiameter, Length and SerialNumber in three IFC4 sets that do
    not have them, and no value of another type.
  • CI and Measure run IfcOpenShell 0.9.0.post1 (#773). Five of Measure's
    scorers let go of an IFC file while they still used its elements, which
    IfcOpenShell 0.9 does not allow (room_names_vs_ifc crashed under 0.9.0);
    they now keep it open. The geometry scorers also print why IfcOpenShell
    cannot mesh an element, which they used to count without a reason. On
    main's commit Measure's scores are byte-identical under 0.8.5 and
    0.9.0.post1 (runs 39153682389 and 39153684706; only the export timings
    differ), walls included, which 0.9.0 could not mesh. So the pin moves, and
    Dependabot proposes IfcOpenShell's minor releases again.
  • CI installs Rust with rustup (#765). Every workflow's toolchain step
    now runs rustup toolchain install itself, with the components and targets
    its job needs, instead of the third-party dtolnay/rust-toolchain action.
    That action's stable and nightly branches are force-pushed, so its pins
    went stale and zizmor flagged them, and GitHub's runners already ship
    rustup.

Fixed

  • rvt-inspect and rvt-corpus doctor take Revit 2015 and 2027 files
    (#838).
    Both reported such a file as an unsupported version before
    looking at its export, though rvt-rs now reads its element records,
    experimentally (RE-179, RE-181), as it reads 2019 to 2022, which both
    already took. Their range is now 2015 to 2027.
  • The browser viewer no longer panics on a string field whose length is
    corrupt (#835).
    On wasm32, where usize is 32 bits, a UTF-16 string
    field's end, 4 + 2 × length, could wrap past its bounds check when the
    length was corrupt, and slicing then panicked, ending the whole export; a
    64-bit build cannot wrap there. The end is computed with checked
    arithmetic, and such a field is read as raw bytes, as one too short already
    is. Found and fixed by MadsHolten, on a private Revit 2024 project.
  • A pipe's or duct's length and a pipe's invert are where IFC4 puts them
    (#822).
    RE-131, RE-134 and RE-157 wrote them in IFC2X3's
    Pset_FlowSegmentPipeSegment and Pset_FlowSegmentDuctSegment (and a
    duct's length also in Pset_DuctSegmentTypeCommon), as Revit's IFC2X3
    exports of the RE1 models do. IFC4 has neither flow-segment set, and its
    Pset_DuctSegmentTypeCommon has no Length. The length is now in the
    segment's base quantities, Qto_PipeSegmentBaseQuantities or
    Qto_DuctSegmentBaseQuantities, as an IfcElementQuantity, and a pipe's
    invert in Pset_PipeSegmentOccurrence, where Revit's IFC4 export of the
    BIM4LCA office writes them, on an element written as a pipe or duct segment
    only, not one its Export to IFC As writes as another entity. A pipe's own
    parameter named Pset_PipeSegmentOccurrence.InvertElevation is written as
    it is, with no storey elevation taken off. A PropertySet named Qto_ is
    now written as an IfcElementQuantity of IFC4 simple quantities. A
    building-element proxy's Serial Number is no longer also written in
    Pset_PrecastConcreteElementGeneral, which in IFC4 has no SerialNumber;
    Pset_ManufacturerOccurrence holds it.
  • A pipe fitting's nominal diameter is no longer written in
    Pset_PipeFittingTypeCommon (#822).
    RE-165 wrote it there as Revit's
    IFC2X3 exports of the RE1 models do, a list of one length. IFC4's
    Pset_PipeFittingTypeCommon has no NominalDiameter, and Revit's IFC4
    Reference View export writes none of the port sets that hold one: revit-ifc
    certifies none of them for that view, and its export of the BIM4LCA office
    writes no property set on any of its 67 ports. The measured value is now in
    rvt-rs's own RvtElementRecordGeometry set, as one length.
  • An element's Reference is in IFC4's property sets, not IFC2X3's
    (#822).
    RE-154 wrote the type's name in Pset_QuantityTakeOff on every
    element with a type and in Pset_DistributionFlowElementCommon on MEP
    elements, as Revit's exports of the RE1 models do. Those exports are
    IFC2X3, and IFC4 has neither set. The name now goes in every IFC4 set,
    from #817's table, that applies to the element's entity and declares
    Reference: Pset_EnvironmentalImpactIndicators on every element, the
    entity's common set, the reinforcement sets of walls, slabs, columns and
    beams, and a distribution element's own type set
    (Pset_SanitaryTerminalTypeCommon and so on), as Revit's IFC4 export of
    the BIM4LCA office writes them. Columns, windows, beams and shading
    devices had no Reference before, and MEP elements had it only in the
    IFC2X3 set. On the office as built, values equal to Revit's go from 18,502
    to 32,053 (from 18,501 to 32,225 at building permit) and values Revit does
    not write from 13,257 to 621; every new value Revit's export holds is
    equal. Against Revit's IFC2X3 exports of the RE1 models every Reference
    value is still Revit's, each in the IFC4 set that holds it.
  • Storeys and spaces carry no IFC2X3 name sets (#822).
    Pset_AirSideSystemInformation and Pset_ProductRequirements holding a
    storey's or space's name, as Revit's IFC2X3 export of the RE1 models writes
    them, are no longer written: IFC4 has no Pset_ProductRequirements and
    applies Pset_AirSideSystemInformation, the information of the air-side
    system serving a space, to spaces and zones only, and Revit's IFC4 export
    of the office writes neither.
  • Each piece of an element written in pieces carries the element's
    property sets (#816).
    An element whose sketch has separate loops is one
    entity per piece (#331), and every set it gets after its body went on the
    first piece only, among them Reference, IsExternal, Serial Number,
    the level and stair sets and the parameters named for a standard set.
    Revit's export gives each piece all of them, as its export of Snowdon
    Towers' architectural model shows on its 19 elements in pieces.
  • A room's Floor Finish is in Pset_SpaceCoveringRequirements, where IFC4
    puts a space's coverings.
    RE-153 wrote it as Pset_SpaceCommon.FloorCovering,
    following Revit's export of RE1 Architecture, which is IFC2X3 (where that
    set holds the coverings), not IFC4 as RE-153 recorded. IFC4's
    Pset_SpaceCommon has no covering properties, so the IFC4 file rvt-rs
    writes carried one its standard set does not define. psets_vs_ifc
    reads an IFC2X3 reference's space coverings under their IFC4 set.
  • A room with no number is named, typed and referred to as Revit's export
    does it (RE-196).
    A room's number and name were read only as two
    non-empty texts, so a room with no number got neither: its space was
    Room-<ElementId> with no LongName, no IfcSpaceType and no
    Reference. It is now <name>:<ElementId> with its name as LongName,
    typed and referred to by the same name, as Revit's exporter falls back
    to. An empty number or name also counts as the latest copy's value (#800):
    at building permit the BIM4LCA office's rooms had kept older copies'
    numbers and Finnish names where the current copy has none. The office's
    rooms all have Revit's number and name now, as built and at permit, 264
    of 264 (221 before), and the text parameters read the same way, so an
    emptied Floor Finish or Serial Number writes nothing.
  • A stair's IsExternal joins its Pset_StairCommon (RE-194). RE-193
    wrote it in a second set of that name, beside the riser and tread
    dimensions RE-47 writes, where Revit's export writes one set. On Autodesk's
    2024 sample projects 34 stairs now carry one set fewer, with the same
    values.
  • An element's "Export to IFC As" of IfcStair or IfcDoor is honoured
    (#792).
    On both BIM4LCA office files two generic models carry their own
    IfcStair and a curtain panel its own IfcDoor with DOOR, and Revit's
    export writes them as IfcStair .NOTDEFINED. and IfcDoor .DOOR.. rvt-rs
    did not act on either value and wrote a proxy and a plate.
  • A wall sweep in a Revit 2024 file stays an IfcBuildingElementProxy,
    whatever its "Export to IFC As" says (#792, RE-192).
    On both BIM4LCA
    office files 9 wall sweeps carry their own IfcCovering (predefined type
    ROOFING), and Revit's export writes all 9 as proxies. rvt-rs followed the
    value and wrote coverings. This is measured on that one project, not read
    from the exporter's source, whose wall sweep path takes the entity from the
    same lookup as other elements; other releases keep following the value.
  • A family's or type's name comes from its latest copy, so its elements
    keep their type (#807).
    The family and type name index and the system
    family type names dropped a name whose copies in different partitions
    differed, and the elements joined through it got no type. That follows
    #800's rule (RE-145). On the BIM4LCA office's building-permit file, where
    every family and type has a Finnish-named older copy and an English-named
    newer one, rvt-rs typed none of 345 columns, 52 doors, 43 light fixtures and
    20 appliances, and no 4 walls and 8 slabs. It now types the same elements
    as on the as-built file. Revit's names now match on all of those
    columns, doors and light fixtures, and the permit file gets materials on
    403 more elements and 67 ports, Revit's count. The other files export as
    before.
  • A room's name and its other parameters come from its latest copy
    (#800).
    Where several partitions hold copies of a room's data that
    differ, the number and name readers (RE-117) and the text and integer
    parameter readers (RE-153, RE-158) gave the room nothing. They now take the
    copy in the latest partition, the one RE-145 found current wherever an
    element's records differ, and give nothing only when copies within that
    partition disagree. The BIM4LCA office's building-permit file holds an
    older copy of every room and area with Finnish names and a newer one with
    English names, and Revit's export uses the English ones. There, rooms
    named as in Revit's export go from 1 to 191 of 234, as on the as-built
    file, and each named room gets its IfcSpaceType. The as-built file, the
    six reference models and the samples export as before.
  • Fixtures and appliances follow their "Export to IFC As" (#792,
    RE-190).
    Revit's export writes an element as the entity its type's
    "Export Type to IFC As" names: waste, fire suppression, sanitary and air
    terminals and electric appliances on the BIM4LCA office. rvt-rs now does
    too, with the type's predefined type where it is an IFC4 enumerator of the
    entity. Waste and fire suppression terminals get their type entities and
    ports, and a room's space contains them as Revit's export does. On the
    as-built file 185 elements now have Revit's class (78 waste terminals, 51
    electric appliances, 40 fire suppression terminals, 15 wash-hand basins
    and an air terminal), and the type entity is Revit's on 12,355 of 12,358
    elements (was 12,170). On the permit file the count is 165, because rvt-rs
    types none of 20 appliances there.
  • An export value belongs to the data object that holds it, on Revit
    2024 and later (#792, RE-190).
    RE-45 gave an entry to the last
    element-data header within 0x800 bytes. On the office's permit file that
    gave IfcSpace to doors, curtain walls, sketch lines and five drains,
    whose types' IfcWasteTerminalType it hid, and the drains' type was
    written twice under one GlobalId (four schema-validation findings, now
    none). Revit 2023 and earlier keep the header rule. The six reference
    models export as before.
  • A pipe or duct type name needs the u32 0 before its length (RE-179).
    RE-130's scan matched an element's reference lists on Autodesk's 2027
    rme_basic and named 33 pipes 였縿괜쭃. All six type names of RE1
    Plumbing and Mechanical carry the zero word; the false match does not.
  • A curtain wall in a Revit 2024 file is IfcCurtainWall, whatever its
    "Export to IFC As" says (#792, RE-188).
    Revit 2024's exporter never reads
    the value on a curtain wall: revit-ifc 24.1.0 to 24.3.40 create every
    curtain wall as one. rvt-rs followed the value, and wrote the 124 BIM4LCA
    office curtain walls set to IfcShadingDevice as shading devices, where
    Revit's export of both files has curtain walls. In 2025 and 2026 files,
    whose exporters read the value from 25.2.0 on, a curtain wall keeps
    following it. That half is read from the exporter's source and not
    measured on a Revit export. The export diagnostics also warn with every
    "Export to IFC As" value the export does not apply, counted by value and
    class, which category_map's documentation had already promised.
  • An ElemTable record's first id is no longer declared where it differs
    from its second (#760, RE-189).
    On Autodesk's Snowdon Towers 2024
    samples, 84 records (Architectural) and 27 (Structural) carry two ids: the
    element's ElementId and the id it was created with. Nothing in either
    project names a first id that is not also some element's current id, so
    elem_table::declared_ids now declares each record's current id only,
    dropping 84 and 20 ids that named no element. Measured on the 49 Autodesk
    samples Measure reads and CI's 6 reference models, exports and rvt-info
    are unchanged; only the two Snowdon models' decoded_element_fraction
    rises, as its denominator shrinks.
  • Export diagnostics report the file name the model was saved under, not
    its folders (#782).
    Their input.original_path kept the whole path with
    only the Windows account folder redacted, so client and project folder
    names reached a file people attach to bug reports. It is now the file name,
    as the export's name has been since 0.5.1: RE1 Architecture's reads
    RE1.rvt.

Research

  • RE-194: where a parameter named for a property set's property keeps its
    value, and where Revit's export writes it.
    A Yes/No or integer is the
    u32 after the parameter's ElementId in the element's own data object, a
    text the u32 n · UTF-16 after it, and a number the f64 just before it.
    Revit's export of the BIM4LCA office writes every such value on the element
    itself, never only on its type. Probe probe_re194_pset_parameters,
    scorer pset_parameters_vs_ifc. psets_vs_ifc now also counts the values
    only rvt-rs writes, by set and property, and Measure gives each reference
    model's export the schema check a sample's gets, up to 120 MB: the office
    files' thermal transmittance unit is a writer path nothing else reaches.
  • Measure hashes each sample's IFC export. A sample's export was checked
    for schema findings and then dropped, so a change that moved only its
    names or properties showed nowhere in a run. Each sample now gets the
    ifc.sha256 a model gets, with the export time ignored. The compare job
    lists the samples with the models as identical or differing, or as having
    no base hash when the base ran before this change.
  • RE-185: where a wall's IsExternal and ExtendToStructure come from
    (#35).
    A wall's IsExternal is its type's native WallType.m_function
    (0 interior, 1 exterior), and its ExtendToStructure is true exactly where
    its record holds a JoinToRoofGStep. These agree with Revit's IFC4 export
    on 8 walls of RE1 Architecture and 117 of puzzbobb's Revit 2025 models,
    and Measure reproduces them with -f r2025=true. A window's FireRating
    is a family-type text entry that RE-77's scan does not read. Probe
    examples/probe_re185_wall_function.rs; nothing is exported from these
    yet. By puzzbobb.
  • Measure scores puzzbobb's Revit 2025 models (#766, #356). With
    -f r2025=true it fetches R2025_Models.zip by its pinned hash
    (research/r2025-models.tsv): 23 projects that each isolate one feature
    (roofs, slope arrows, rooms, stairs, wall joins). Measure scores the 22 that
    come with Revit's IFC4 export against it, as it scores the reference
    models. Their author released them under Apache-2.0 on #356; they are
    fetched for the run and never stored.
  • The class-set scorer says why an element is in another class (#792).
    tools/re/class_sets_vs_ifc.py prints, for each group in another class
    than Revit's, Revit's category, PredefinedType and type object and the
    RE-45 value rvt-rs read. A new probe scorer,
    tools/re/export_parameters_vs_ifc.py, compares every "Export to IFC As"
    value the RE-45 probe reads with Revit's export. The RE-45 probe prints
    each entry's owner under both rules. ports_vs_ifc prints its first ten
    schema-validation findings.
  • Autodesk's Revit 2015 sample projects are pinned for Measure (#742).
    Autodesk keeps all six on its download host under Docs/, where the 2016
    to 2027 samples are under Docs/InProd/, so a 2015 reading no longer rests
    on files only a contributor holds. The 2019 MEP and rst_advanced projects
    are pinned with them, so each 2015 project has a 2019 copy to compare
    with (-f probe_pair_release=2019): nine more files, 58 in all.
  • Measure compares each sample with the same project saved by another
    release (#740, #742).
    With -f probe_pair_release=<year>, a two-file
    probe also runs on every sample of another release and the same project
    saved by that year, the sample first, into the sample's probe-pair.txt;
    -f sample_years="<first> <last>" reads only the samples of those
    releases. The comparisons of Autodesk's 2027 samples with their 2026
    copies, and of earlier releases with their 2023 and 2019 copies, then run
    on the runners instead of on one machine.
  • Measure scores the BIM4LCA office against Revit's exports (#763). With
    -f nordic=true it reads the concrete office as built and at building
    permit, with Revit's IFC export of each, by byte range
    (research/bim4lca-measure.tsv), and scores them like the reference
    models. A new scorer, tools/re/class_sets_vs_ifc.py, runs on every model:
    per IFC class of Revit's export, how many of its elements rvt-rs writes as
    the same class, as another class or not at all, paired by Tag (spaces by
    GlobalId), with the missing and the extra ones listed by name, type and
    storey.
  • The BIM4LCA models are read in CI (#766). The tier-two job fetches the
    four Revit 2024 models and the Revit IFC export its targets read from VTT's
    1.58 GB ARCH.zip by byte range (tools/ci/fetch-bim4lca.py), each
    checked against research/bim4lca-models.tsv, so the targets that measure
    #751's level parameters, #752's shared elevations, #753's column bottoms
    and #757's cut columns on them run on every pull request; they skipped.

Corrected after the release: these notes first said every element's IsExternal is written; curtain mullions and panels get none, as the entry's own text says. 0.6.1 corrects the README packed into the crate and the wheel.

User guide: https://github.com/DrunkOnJava/rvt-rs/blob/v0.6.0/docs/user-guide.md