Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
fb923e4
research(rooms): a probe naming what is missing from each room solid …
DrunkOnJava Nov 3, 2026
b8d29ef
research(rooms): the break probe reads each unclosed solid by chain, …
DrunkOnJava Nov 3, 2026
411dc2f
research(rooms): a probe reading the B-rep a room's native record hol…
DrunkOnJava Nov 3, 2026
9ac2c18
research(rooms): a probe finding the vertices a room's solid stores b…
DrunkOnJava Nov 3, 2026
ff45098
feat(rooms): where the faces RE-101 walks do not close, the faces up …
DrunkOnJava Nov 3, 2026
edec8ab
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
4d54267
research(rooms): the closure probe also compares the resolved span wi…
DrunkOnJava Nov 3, 2026
b9e24e3
fix(rooms): the span ends at the next solid's tag or the room is not …
DrunkOnJava Nov 3, 2026
4c06514
feat(rooms): walls on lines up to 0.0025 ft apart meet where the face…
DrunkOnJava Nov 3, 2026
28ef568
research(rooms): the closure probe says what extent a resolved bounda…
DrunkOnJava Nov 3, 2026
826fb53
feat(rooms): a resolved outline reads round columns as arcs and may f…
DrunkOnJava Nov 3, 2026
728afe1
fix(rooms): an outline resolved from the faces up to the next solid c…
DrunkOnJava Nov 3, 2026
c75433a
docs(rooms): RE-316, the cause of each unclosed room solid, what reso…
DrunkOnJava Nov 3, 2026
151c855
fix(rooms): an outline that falls short of the record box is not reso…
DrunkOnJava Nov 3, 2026
669856b
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
fdaa161
docs(rooms): RE-316 as it lands, the nine and ten rooms that close at…
DrunkOnJava Nov 3, 2026
95e31a9
docs(rooms): RE-316 names the permit room RE-313 left 66% off (#1260)…
DrunkOnJava Nov 3, 2026
c4cc93f
docs(rooms): RE-316 with the unfiltered Measure against main, and the…
DrunkOnJava Nov 3, 2026
a7079fd
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
385a0ed
refactor(rooms): the walk RE-101 reads is tried alone per room, a roo…
DrunkOnJava Nov 3, 2026
ac101d6
fix(rooms): restore room_outline_at and keep the walk's reading of cy…
DrunkOnJava Nov 3, 2026
7d7c098
feat(rooms): a solid's span ends at the faces its list of objects cou…
DrunkOnJava Nov 3, 2026
edd7a72
docs(rooms): the module says how a resolved room's solid is bounded a…
DrunkOnJava Nov 3, 2026
d25ef67
docs(rooms): RE-316 after the review: the span is bounded by the soli…
DrunkOnJava Nov 3, 2026
4f0dee8
docs(rooms): the held-out project closes 6 of the 8 rooms that kept t…
DrunkOnJava Nov 3, 2026
779fac6
research(rooms): a scorer measuring how much of a room's outline lies…
DrunkOnJava Nov 3, 2026
15c9aba
fix(measure): space_overlaps_vs_ifc reads each space's properties whi…
DrunkOnJava Nov 3, 2026
8d48c3f
research(rooms): the overlap scorer also measures each space's floor …
DrunkOnJava Nov 3, 2026
ef8ef16
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
2e75389
feat(rooms): a span is stored_solid_faces only where its wall edges a…
DrunkOnJava Nov 3, 2026
b898a06
fix(rooms): a span is stored_solid_faces where its loops close as the…
DrunkOnJava Nov 3, 2026
f39099b
docs(rooms): the two resolved outline sources say what they hold and …
DrunkOnJava Nov 3, 2026
a00e705
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
b714122
research(rooms): the closure probe says why each resolved room's edge…
DrunkOnJava Nov 3, 2026
fd756bd
docs(rooms): RE-316 round 3: room 1671995 is 0.45% under Revit's floo…
DrunkOnJava Nov 3, 2026
438aa3c
chore: merge main into the RE-316 branch
DrunkOnJava Nov 3, 2026
e55ff36
docs(rooms): an approximate outline's third cause, an edge end on ano…
DrunkOnJava Nov 3, 2026
cd31888
Merge branch 'main' into feat/rooms-unclosed-solids
DrunkOnJava Nov 3, 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
30 changes: 30 additions & 0 deletions changelog.d/changed/1260-room-solids-resolved.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
- **A room whose stored solid the exact walk did not close is read again
from the faces its solid lists, and labelled apart.** The walk stopped at a
record longer than 0x200 bytes between two faces, walls on lines up to
0.0015 ft apart left a step no face crosses, a column overlapping a wall
put a loop partly inside the wall's, and a solid ran past the 64 KB window.
The solid ends at the count of its list of objects and at a gap of 1,024
bytes, so the faces of the element that follows are not read, and the work
is bounded (512 faces, 4,096 pieces; crafted solids take under 10 ms).
`SpaceOutlineSource` is `stored_solid_faces` where the faces' edges close as
the walk reads them, and `stored_solid_approximate` where a column overlaps
a wall (its area depends on whether Revit's export takes the column off),
an end of one wall edge lies on another, or the outline falls up to
0.02 ft short of the record box; `stored_solid`
stays the exact walk's. The diagnostics count both
(`exported.resolved_outline_spaces`, `exported.approximate_outline_spaces`)
and the room schedule leaves an approximate room's area blank. On the
BIM4LCA office as built the 13 rooms that kept their box take an outline:
nine are `stored_solid_faces`, all at Revit's area to 0.1% (their boxes were
3% to 67% over it), and four `stored_solid_approximate`, 0.45% to 0.68%
under Revit's floor area. At building permit 11 of 12 take an outline, all
`stored_solid_approximate`, ten at Revit's floor area to 0.1%; room 3095831
keeps its box. 6 of the 8 rooms that kept their box do on a held-out Revit
2021 project, all 6 at Revit's area. Measure's `space_profiles_vs_ifc`
compares the faces of Revit's mesh that point up, which read a room under a
stepped or sloped ceiling as a fraction of itself (room 1671995: 1218 of
5177 ft²; RE-313's 66% room); the new `space_overlaps_vs_ifc` also compares
the floor, where all 443 office `stored_solid` room scores agree. The six
`rac_advanced` rooms with round columns, 49 of the 50 `rme` rooms and
Snowdon Towers' seven keep their box. Core Interior and RE1 Architecture are
unchanged. A resolved room carries no `NetVolume` (#1260, RE-316).
2 changes: 1 addition & 1 deletion docs/evidence.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ On Revit 2024 and 2025 project files, rvt-rs reads each element from its partiti
| Electrical and mechanical devices and equipment | `IfcAlarm` (fire alarm devices), `IfcElectricAppliance` (data devices), proxies (switches, sensors, receptacles, junction boxes, panels, mechanical equipment) | RE1 Electrical and Mechanical, every one Revit exports and nothing else; the symbols nested in switches and receptacles left out, as Revit leaves them out (RE-79) |
| 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 does not close keeps its box |
| 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) |
| 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) |
Expand Down
2 changes: 2 additions & 0 deletions docs/export-diagnostics.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ 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.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`. |
| `confidence.score` | number | Heuristic 0..1 readiness score for UI sorting and dashboards. Its element terms (elements, typed elements, geometry) are scaled by the exported share when `unexported_element_records` is non-zero. |
| `confidence.unexported_element_records` | integer | Element records of a recovered category (walls, doors, windows, columns, floors, rooms and the RE-33 product categories) the partition scan found but could not export because no ElementId is attributable (RE-30). Non-zero means the model is incomplete. Zero is not a completeness claim. |
Expand Down
Loading
Loading