Skip to content

feat(ifc): a column cut across its top by one slab gets the cut mesh's CrossSectionArea and NetVolume (#1203) (RE-353) - #1477

Merged
DrunkOnJava merged 18 commits into
mainfrom
feat/1203-meshed-column-quantities
Nov 6, 2026
Merged

DrunkOnJava merged 18 commits into
mainfrom
feat/1203-meshed-column-quantities

Conversation

@DrunkOnJava

@DrunkOnJava DrunkOnJava commented Nov 5, 2026 •

Copy link
Copy Markdown
Owner

Refs #1203. Figures from the unfiltered run 42130190386 at 35cfd89, which holds every limit below.

Summary

  • A box-drawn column that one slab cuts across its top (a CutPairGStep names the slab, a clean pair joins the column to the same slab, the slab's span starts inside the column and reaches its top) gets the quantities Revit's export writes on the 18 meshed columns of the BIM4LCA office at building permit: NetVolume, the volume of the box less the part of the slab inside it, and CrossSectionArea, half the surface of that cut box, where every edge of the slab inside the section runs parallel to a side of it (NetVolume alone otherwise). 17 of the 18 are written equal (run 42130190386, as at 223968a before the limits); the 18th, whose cut pairs name a wall that only touches it, is left out.
  • A round column no pair joins gets its OuterSurfaceArea, the circumference times its height, where its type's named lengths are Diameter, equal to both sides of its box, and at most the family's Offset Base and Offset Top, each exactly 0 (any other named length leaves it out). That is one column on each of the two office files, the same column, taken as round from the caption Diameter alone. Its CrossSectionArea, GrossVolume and NetVolume stay out: they are not the circle's (RE-353 section 4). The type's named lengths are those three, not Diameter alone as RE-291 took them to be (probe run 42121438036); RE-291 is corrected here.
  • W7: the round column and the meshed columns' values, and the section check on box-drawn columns #1203's status line says the check that a box-drawn column's type holds a b (and h) equal to its box's sides is not implemented. It is: rectangular_section and fills_section have required it since feat(ifc): write the base quantities of a joined column that nothing cuts or crosses (#1046) (RE-291) #1204 (RE-291 section 3), and 13 and 15 unjoined columns are written through it.

Limits of the rules (the second read's findings)

  • The slab must be one exported extrusion whose profile was set (a floor whose sketch was not read is its record box), flat as the wall pass knows it (SlabTop::Flat: record read, no shape edit moves its top: a sloped floor's underside is not its base), and the same slab a clean pair joins to the column. Any other slab across the column's top, joined by a clean pair, must have no plan area in the section.
  • Half the surface is measured only on meshes whose every face is parallel to a side of the section, which cannot tell it from another one-sided area on an oblique face; CrossSectionArea is written only where every edge of the slab inside the section is parallel to a side (1e-6 in the sine of the angle), NetVolume, exact geometry, either way. RE-353 section 3 states the limit.
  • Both rules read Revit 2024 only (NEW_RULE_REVIT_VERSIONS): the office is the only file either is measured on, and samples=true's verdict does not compare column quantities, so a later release is not opened by a run that cannot see it. The existing RE-291 rule keeps the releases it read. A column RE-178 trimmed (its body is cut though its source says record box) is left out. On Revit 2024 a floor's shaft is cut from its outline, so a floor with a shaft has its true outline; the later releases that export it whole are not read.
  • The plan geometry reuses body_geometry (plan_outline, Placement, clip_ring_to_band, signed_area, now pub(crate)) instead of a copy.

Motivation

#1203 items 2 and 3. revit-ifc (PropertyUtil.CreateBeamColumnBaseQuantities, IFC_v24.3.40, CLEANROOM.md source 5) was read and cited, and no code was copied or translated: its column quantities take Length, OuterSurfaceArea and GrossVolume from the extrusion its exporter finds and, where there is none, CrossSectionArea from the element's computed area parameter and NetVolume from its computed volume. Measured on Revit's own export of the office at permit, all 18 meshed columns have exactly those two quantities, the volume is the mesh's and the area is half the mesh's surface (RE-353 section 2).

Changes

  • src/ifc/export_content/column_quantities.rs: the column's cut pairs are assessed as before, and one slab across the top is now a third outcome beside clear and refused; the slab's plan region (outline and voids) is clipped to the column's section; the limits above. A round column's OuterSurfaceArea.
  • src/research/partition_type_parameters.rs, partition_schema_mvp.rs, partition_schema_mvp/{fields,framing}.rs, src/ifc/export_content.rs, src/ifc/body_geometry.rs (one visibility): the round section a column type holds and the file's release, queued for the pass, and the floors' known tops.
  • probes/examples/probe_re353_column_cut_footprints.rs, probe_re353_round_column.rs; reports/element-framing/RE-353-cut-columns-and-the-round-column.md (and RE-291's correction), the changelog fragment, the addendum to docs/format-reconnaissance.md, the criteria page's entries and docs/contribution-map.md's W7: the round column and the meshed columns' values, and the section check on box-drawn columns #1203 line.

Testing

Unfiltered Measure run 42130190386 (head 35cfd89 against main at 8060ecc; -f base=main -f nordic=true -f r2025=true -f holdout=true -f samples=true, every scorer, qtos_vs_ifc and psets_vs_ifc with --revit-set-placement; the office as built and at permit, the 18 held-out models, the 24 R2025 models, the four RE1 models, Core Interior, Einhoven and the sample projects):

  • office at permit: equal 30,002 to 30,037 (CrossSectionArea 320 to 337 and NetVolume 265 to 282 of 345, OuterSurfaceArea 320 to 321 of 327); as built 29,760 to 29,761 (OuterSurfaceArea 278 to 279 of 279). 17 columns stay, the same count as at 223968a before the limits;
  • different stays 1 and quantities Revit does not write stay 0 on both; the property census is identical on both files;
  • every other scorer output of every model (the 18 held-out models', the 24 R2025 models', the four RE1 models') is main's, and the IFC sha256 of Core Interior, Einhoven, RE1 Architecture, the 18 held-out models and 108 of the 111 exports is main's. The three that moved are the two office files and sample-2024-snowdon_towers_sample_architectural (Revit 2024), whose IFC is 136 bytes longer with the same entity total (40,945) and diagnostics. Run 42135731462 (filtered, head f60e0d3, keep_ifc=true) kept its IFCs: the 136 bytes are the OuterSurfaceArea of its 2 round columns, which are all the round columns it has (RE-353 section 5.1). Revit's IFC4 export of the sample holds no base quantities at all (0 IfcElementQuantity; RE-242), so the 2 values are counted apart, not scored equal, different or extra; Revit's own extrusion of each column (outer perimeter times depth) gives rvt-rs's value to 2.4e-7 and 1.5e-7 m², which checks the rule's inputs and not a value Revit wrote;
  • the same-project gates check passes on 35cfd89 (it does not compare column quantities).

Files that exercise the rules: the cut-column rule, the office at permit alone (17 columns, scored equal); the round-column rule, the office as built (1 column) and at permit (the same column), both scored equal, and Snowdon Towers Architectural (2 columns, not scored against a value). No other model of the run has a column either rule takes.

Not measured: that the 17 are the columns the rule is meant to keep, by tag (the scorer counts); and the rules' generality, since the held-out models hold no column either rule takes. The branch now also holds the merge of main at daf3610 (CI files only) and the figures.

@DrunkOnJava DrunkOnJava added the ready-when-green Draft whose code is complete: marked ready for review once its fast CI passes label Nov 5, 2026
… with a read outline joined by a clean pair, a square cut for CrossSectionArea, Revit 2024 and untrimmed columns (#1203) (RE-353)
# Conflicts:
#	docs/format-reconnaissance.md
@DrunkOnJava
DrunkOnJava marked this pull request as ready for review November 5, 2026 23:41
@DrunkOnJava DrunkOnJava removed the ready-when-green Draft whose code is complete: marked ready for review once its fast CI passes label Nov 5, 2026
@DrunkOnJava
DrunkOnJava enabled auto-merge (squash) November 6, 2026 00:51
@DrunkOnJava
DrunkOnJava merged commit b449325 into main Nov 6, 2026
35 checks passed
@DrunkOnJava
DrunkOnJava deleted the feat/1203-meshed-column-quantities branch November 6, 2026 01:12
DrunkOnJava added a commit to puzzbobb/rvt-rs that referenced this pull request Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant