Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
e15911d
research(areas): a probe for where a Revit 2024 Area keeps its bounda…
DrunkOnJava Nov 3, 2026
f1d8ef8
research(areas): the RE-317 scorer prints Revit's profile points of e…
DrunkOnJava Nov 3, 2026
6a5534e
research(areas): the RE-317 scorer reads the profile through the site…
DrunkOnJava Nov 3, 2026
46783fe
feat(ifc): an Area's space gets the region its boundary lines enclose…
DrunkOnJava Nov 3, 2026
febba58
docs(areas): the RE-317 report, the scorer's point check and the prob…
DrunkOnJava Nov 3, 2026
16d87c4
docs(areas): rooms, status, evidence, support matrix and changelog fo…
DrunkOnJava Nov 3, 2026
730ffb7
docs(areas): why most of rac_advanced's Areas keep no body, from the …
DrunkOnJava Nov 3, 2026
4f9f97e
docs(areas): the RE-317 reconnaissance addendum, the vertex count and…
DrunkOnJava Nov 3, 2026
52d38bf
research(areas): the RE-317 probe prints each Level's Building Story …
DrunkOnJava Nov 3, 2026
5a7e40a
fix(ifc): an Area is drawn only where every declared boundary line is…
DrunkOnJava Nov 3, 2026
3450e75
docs(areas): the RE-317 results of the fail-closed version, the heigh…
DrunkOnJava Nov 3, 2026
cdc21cf
fix(ifc): an Area's region is shared with every placed Area, its name…
DrunkOnJava Nov 3, 2026
f16083f
docs(areas): the RE-317 results at cdc21cf6, the Vitoria models again…
DrunkOnJava Nov 3, 2026
6efadb4
fix(ifc): an Area's named lines are those the chain declares or the s…
DrunkOnJava Nov 3, 2026
37816e3
merge: main into the Area bodies branch, keeping main's room outline …
DrunkOnJava Nov 3, 2026
8a7b34f
docs(areas): the RE-317 results on the merged head, against main with…
DrunkOnJava Nov 4, 2026
3b59404
Merge branch 'main' into feat/area-spaces-bodies
DrunkOnJava Nov 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions changelog.d/added/763-area-bodies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
- **A Revit 2024 Area's `IfcSpace` has a body: the region its area boundary
lines enclose, from its Level up to the Level above it.** The Area stores no
boundary; rvt-rs takes the lines of its area scheme on its Level, splits
them where they meet or cross, leaves out the ones with a free end, and
draws the loop that holds the Area's point, with the loops directly inside it
as holes, as Revit's export draws it. On the BIM4LCA office all 30 Areas, as
built and at building permit, equal Revit's in area (within 0.1%) and in
outline (within 0.01 ft), where Measure scored none of them before. An Area
keeps no body, as before, and says why in
`RvtElementRecordGeometry.AreaBodyRefusal` and `exported.area_body_refusals`,
wherever its boundary is not proven: a boundary line that is not straight
along the plan axes, that was not read, or that is in a non-primary design
option, a point in no single region, two Areas that share a region, or a
Level that is not a building story. Not
measured: the top storey (no Level above), Levels that are not building
stories, a Level whose "Story Above" is not the next Level up (never read),
Areas bounded partly by walls, and releases other than 2024.
`SpaceOutlineSource` is `area_boundary` on a drawn Area and `none` on one that
is not; the room schedule gives it an area. An Area does not hold a room's
furniture. `Qto_SpaceBaseQuantities.Height`, which Revit's export writes on an
Area, is not written yet ([docs/rooms.md](docs/rooms.md), #763, RE-317).
2 changes: 1 addition & 1 deletion docs/evidence.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ On Revit 2024 and 2025 project files, rvt-rs reads each element from its partiti
| Structural framing, columns, foundations | `IfcBeam` along its location line, `IfcColumn`, `IfcFooting` | Snowdon structural sample: all 1,078 in the category its VIM export gives them; 923 of 942 beams run along their line, with Revit's own section on 613 of the 839 a later edition kept unchanged, and on 179 more less the top a floor join cuts (RE-49); 377 steel beams and 40 steel columns are their type's I section, Revit's own on all 271 beams and 24 columns the VIM scores (RE-103, RE-104) |
| Site elements, generic models, slab edges, elevators, ramps | proxies, `IfcTransportElement`, `IfcRamp` | Snowdon Towers, every one Revit exports |
| Rooms | `IfcSpace` named as Revit's export names it, `Name` the room number (for a room with no number, `<name>:<ElementId>`, RE-196) and `LongName` the room name, with the room's ElementId as the `ElementId` property and the outline of the solid Revit stores for the room (RE-101) | Core Interior all 116 and RE1 Architecture all 11 at Revit's own area and outline (RE-101's run of `tools/re/plan_profiles_vs_ifc.py --class IfcSpace`; neither CI nor Measure scores room outlines); Snowdon Towers 45 of 54 at the area its VIM export gives; on Revit 2023, Exemplo_data all 9 (RE-102); every room with Revit's number and name, Core Interior 116, Snowdon Towers 54 (against the VIM), RE1 11 and Exemplo_data 9 (RE-117), and the BIM4LCA office 264 of 264 as built and at building permit, 43 of them with no number (RE-196); a room whose solid the exact walk does not close is read again from the faces its solid lists, labelled `stored_solid_faces` or `stored_solid_approximate` in `SpaceOutlineSource` (the BIM4LCA office 13 of 13 rooms as built and 11 of 12 at permit; `stored_solid_faces` at Revit's area to 0.1% on 9 of 9, `stored_solid_approximate` on 10 of 15 room scores and 0.45% to 0.68% under Revit's floor area on the other 5, RE-316), and keeps its box otherwise |
| Areas | `IfcSpace .SPACE.` for each placed Area of a Revit 2024 file, named as Revit's export names it (`Name` the number, `LongName` the name), in its Level's storey and typed by its own `IfcSpaceType`; no body, since the Area's boundary is not decoded | the BIM4LCA office as built and at building permit: all 30 of Revit's area spaces, number, name and GlobalId as Revit's (RE-191) |
| Areas | `IfcSpace .SPACE.` for each placed Area of a Revit 2024 file, named as Revit's export names it (`Name` the number, `LongName` the name), in its Level's storey and typed by its own `IfcSpaceType`; the body is the region that the lines of its area scheme on its Level enclose around its point (its holes the loops directly inside), extruded from its Level to the Level above, when both are building stories, where that region is proven, and none where it is not (RE-317) | the BIM4LCA office as built and at building permit: all 30 of Revit's area spaces, number, name and GlobalId as Revit's (RE-191), and their bodies: 30 of 30 on each file within 0.1% of Revit's area and within 0.01 ft of its outline, and with the lowest and highest vertex of the body within 0.01 ft of Revit's (RE-317) |
| Storeys | `IfcBuildingStorey` for each Revit Level that is a building story, with its name and elevation | Core Interior 15, Snowdon Towers 18, every RE1 model 2; name, elevation and GlobalId all Revit's (RE-24, RE-51); Snowdon Towers Structural 12 of its 19 Levels, its VIM export's building stories, 208 of the 210 elements on them in their storey (RE-118) |
| Storey containment | each element in the storey of the Level its record names, of its base constraint where it names two, and, where it names none, of a railing's host, of the Level its work planes carry, or of its base elevation | Core Interior all 854 in Revit's storey; Snowdon Towers 5,949 in Revit's storey, 1 in another and 1 on none (RE-27, RE-59, RE-60, RE-68) |
| Names | `Family:Type:ElementId`, `ObjectType` `Family:Type`, for family instances and, since RE-63 to RE-65, walls, curtain walls, floors, ceilings, roofs, railings, slab edges, ramps, curtain panels that are walls, and stairs with their runs, landings and supports | 4,397 family instances named exactly as Revit names them; Snowdon's walls (all 1,077 RE-63 matches by `Tag`), 20 roofs and 68 ceilings and Core Interior's 460 system-family elements all named as Revit names them (RE-63); Snowdon's 18 panel walls and 59 slab edges too (RE-64), its 256 stair elements (RE-65) and every stair, flight and stringer of the five R2025 stair models (RE-65 §6), all 131 of its railings (RE-66), its 7 model texts (RE-67) and its 258 wall sweeps (RE-69); the BIM4LCA office's 220 curtain walls, their type a curtain wall type's native name (RE-230) |
Expand Down
1 change: 1 addition & 0 deletions docs/export-diagnostics.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ Important nested fields:
| `exported.storey_bound_elements` | integer | Building elements contained in a specific storey. The rest are contained in the `IfcBuilding`, never in a named storey. |
| `exported.layered_element_count` | integer | Elements whose compound layers and layer colours were read (RE-53). The glTF export draws each in its layers where they add up to its body's thickness; the rest are drawn whole. |
| `exported.bounding_box_spaces` | integer | Exported `IfcSpace`s whose body is their record's bounding box (`RvtElementRecordGeometry.SpaceOutlineSource` is `record_box`): a room whose outline was not read from its stored solid, or a family instance written as a space and drawn as its box. The body's plan area is the box's, not the space's (RE-313, [rooms](rooms.md)). Each is also in `exported.bounding_box_bodies`, except a family instance turned or tilted off the model's axes. |
| `exported.area_body_refusals` | object | Of the exported Areas that have no body, why, by reason, counted from each Area's `RvtElementRecordGeometry.AreaBodyRefusal` (RE-317): `levels_not_recovered`, `boundary_line_not_read` (a declared area boundary line was not read or cannot be placed on a Level, so no Area of the file is drawn), `no_boundary_lines`, `point_not_read`, `level_or_scheme_not_named`, `named_lines_not_in_scheme_and_level` (a line the Area's record names is not a declared line of its scheme on its Level that was read: its copies disagree, it has no Level or scheme, or it is in a non-primary design option), `next_storey_not_proven` (the Area's Level and the one above are not both building stories, or another Level lies between or at them), `boundary_lines_not_readable` (a line of the group is not straight along an axis, overlaps another, may be missing, or is in a non-primary design option), `point_in_no_single_region`, `named_lines_not_on_region` and `two_areas_one_region` (another placed Area of the same scheme and Level has the same region, whether or not that one is drawn). Empty when every Area is drawn or the export has no geometry. |
| `exported.resolved_outline_spaces` | integer | Exported rooms whose outline was read from the faces their stored solid lists, up to the solid's own end, where the walk of RE-101 did not close them (`RvtElementRecordGeometry.SpaceOutlineSource` is `stored_solid_faces`, RE-316, [rooms](rooms.md)). Equal to Revit's area on every such room measured, but bounded by the solid's list of objects and a gap of 1,024 bytes, so a closed loop of another element's faces inside the room's box would be read as the room's. |
| `exported.approximate_outline_spaces` | integer | Exported rooms whose resolved outline is the boundary of a region, a column that overlaps a wall having been taken off it or an end of one wall edge lying on another, or falls up to 0.02 ft short of their record box on a side (`SpaceOutlineSource` is `stored_solid_approximate`, RE-316, [rooms](rooms.md)). The area is approximate: up to 0.68% under Revit's floor area where Revit's export does not take that column off the room, and equal to it on 10 of the 15 BIM4LCA office room scores. |
| `confidence.level` | string | `scaffold`, `typed_no_geometry`, `geometry`, `diagnostic_partial`, or `proxy_only`. |
Expand Down
4 changes: 4 additions & 0 deletions docs/format-reconnaissance.md
Original file line number Diff line number Diff line change
Expand Up @@ -2407,3 +2407,7 @@ Discussion #112 warned that Revit computes feet as `mm / 25.4 / 12`, which can d
## Addendum — RE-311 pipe fittings and cone faces (2026-11-03)

A saved pipe elbow or transition is 1.08 to 1.32 of Revit's volume because Revit's export of it is a polyhedron of 6 to 10 sides round the pipe and two segments along a 90° bend, inscribed in the surface the saved graphics describe: an elbow's true torus is `π r² R π/2`, rvt-rs's mesh is 98 to 99% of it and Revit's 74 to 84%. Tees and closet bends are 1.11 to 1.17, where Revit's triangulated junctions leave some of its vertices off the surface. The "wrong" volumes of the closet bends were the scorer's, which took them about the file's origin though a mesh with cracks between faces changes with its distance from it. A `ConeSurf` is `apex + v (cos α · z + sin α (cos u · x + sin u · y))` with `v` along the generator (the radius at `v` is `v sin α`), which draws 8 more RE1 Plumbing transitions. `GNurbSpline` and `GHermiteSpline` profile curves were read too and gain no body Revit's export holds: the two RE1 Electrical panels keep their box for trims that RE-302 and RE-305 measured. Report: `reports/element-framing/RE-311-fitting-faceting-cones-splines.md`.

## Addendum — RE-317 where an Area's boundary is (2026-11-03)

A Revit 2024 Area stores no boundary: its chain record (RE-35) names its Level, its area scheme (`OST_AreaSchemes`, -2003201) and two elements of `OST_AreaSchemeLines` (-2000079), area boundary lines, each a chain record with a bounding box of its own that is the line itself where the line runs along an axis (all 689 of the BIM4LCA office's do). Two `f64`s at byte 107 of the payload of the Area's data object (class 0x0e1c) are a point in plan feet inside the Area. Revit's export draws the region of the Area's scheme's lines on its Level that holds the point, less the loops directly inside it, extruded from the Level to the Level above, when both are building stories: all 30 Areas of the office, as built and at building permit, equal Revit's in area to 0.1% and in outline to 0.01 ft. The report is `reports/element-framing/RE-317-area-boundaries.md`; the probe is `probes/examples/probe_re317_area_boundaries.rs`.
Loading
Loading