Repository navigation
ifc-geometry: sectioned profile axes follow the upstream fix (X = Axis x RefDirection, left), not the printed ADD2 sentences #344
Description
IFC4.3 ADD2's printed text contradicts itself on how a cross section stands at its IfcAxis2PlacementLinear. #307 lowers IfcSectionedSolidHorizontal and IfcSectionedSurface onto Axiolid's SectionsAtStations / OpenSectionsAtStations (ADR 0082) under the reading the upstream fixes converge on: profile Y = Axis, normal = RefDirection, profile X = Axis x RefDirection (the left lateral by default). This issue records where the printed text differs, so we can revisit once buildingSMART merges a fix.
1. IfcSectionedSolidHorizontal (8.8.3.35.1)
The printed text says: "The profile X axis is the direction of RefDirection from IfcAxis2PlacementLinear, and the profile Y axis is the direction of Axis." By 8.9.3.4.3, RefDirection defaults to the curve tangent, so this lays every default profile along the directrix.
The following treat it as an error. RefDirection is the section normal and X = Axis x RefDirection:
- Documentation error in IfcSectionedSolidHorizontal buildingSMART/IFC4.x-IF#147, with a proposed text fix;
- IfcSectionedSolidHorizontal profile position buildingSMART/IFC4.x-development#1010;
- buildingSMART/IFC4.x-development PR #1163, which rewrites the text;
- Bonsai/IfcOpenShell and usBIM (IfcSectionedSolidHorizontal doesn't account for orientation of section IfcOpenShell/IfcOpenShell#6386).
2. IfcSectionedSurface (8.8.3.37.1)
The printed text says: "the X is derived from the cross product of Directrix and the Axis attribute". With Axis up, tangent x up points to the RIGHT.
These say left:
IfcOpenCrossProfileDef(8.15.3.15.1): "the profile X axis is oriented perpendicularly to the left of the Directrix (same direction as positive LateralOffset)";- a review on buildingSMART/IFC4.x-development PR #1162 (Updates IfcSectionedSurface documentation buildingSMART/IFC4.x-development#1162 (comment)), which asks to swap the operands to
Axis x Directrix; - the evidence posted to Towards a common understanding of IfcLinearPlacement, IfcAxis2PlacementLinear, IfcPointByDistanceExpression, IfcOffsetCurveByDistances, IfcSectionedSurface, and IfcSectionedSolidHorizontal buildingSMART/IFC4.x-development#1151 (Towards a common understanding of IfcLinearPlacement, IfcAxis2PlacementLinear, IfcPointByDistanceExpression, IfcOffsetCurveByDistances, IfcSectionedSurface, and IfcSectionedSolidHorizontal buildingSMART/IFC4.x-development#1151 (comment)).
The same sentence says "the profile normal is derived from the associated IfcAxis2PlacementLinear", so RefDirection is the normal here as well.
Adopted
- Profile axes: X left, Y =
Axis, normal =RefDirection, for both entities. ExplicitAxisandRefDirectionare admitted. - Where the mapping lives: in one place,
ifc-geometrylower::station::axes::section_orientation. - When upstream merges something else: the change is local to that function.
Related, not contradictory in ADD2's text
OffsetVertical. 8.9.3.48.3 defines it as "perpendicular to the tangent at DistanceAlong in the plane of the tangent perpendicular to the global XY plane". #1151 proposes global Z instead. The lowering follows the ADD2 text, which is Axiolid'sStationFrame::Section.- "Sweeping ... horizontally". 8.8.3.35.1 and 8.8.3.37.1 do not define it geometrically. Sections stand in the default
IfcAxis2PlacementLinearframe, the curve's own, which leans with the grade. Offsets are read in that same frame, so no frame mismatch arises.
Revisit when buildingSMART/IFC4.x-development#1151 and PRs #1162 and #1163 land.
Activity
[-]ifc-geometry: IFC4.3 ADD2 contradicts itself on section profile axes at IfcAxis2PlacementLinear (RefDirection, X sign)[/-][+]ifc-geometry: IfcSectionedSurface profile X is to the right (8.8.3.37.1) or left (8.15.3.15.1); asymmetric sections refused[/+][-]ifc-geometry: IfcSectionedSurface profile X is to the right (8.8.3.37.1) or left (8.15.3.15.1); asymmetric sections refused[/-][+]ifc-geometry: sectioned profile axes follow the upstream fix (X = Axis x RefDirection, left), not the printed ADD2 sentences; revisit on #1151[/+][-]ifc-geometry: sectioned profile axes follow the upstream fix (X = Axis x RefDirection, left), not the printed ADD2 sentences; revisit on #1151[/-][+]ifc-geometry: sectioned profile axes follow the upstream fix (X = Axis x RefDirection, left), not the printed ADD2 sentences[/+]GeneralPawz commentedon Oct 9, 2026
Upstream status, 2026-10-09:
IfcSectionedSurface: fixed upstream. buildingSMART/IFC4.x-development PR #1162 was merged on 2026-10-08 (merge commit 0a44c272efb7b7f18c1ea4f99b28fd5bc2c10f7d). The text now reads: "The profile Y axis is oriented according to Axis attribute of IfcAxis2PlacementLinear and the X is derived from the cross product of the Axis attribute of IfcAxis2PlacementLinear and the Directrix." Axis × Directrix with Axis up points to the left, which is whatsection_orientationalready does. This was incorporated from the left-vs-right finding posted on #1151.IfcSectionedSolidHorizontal: PR #1163 is approved twice (the latest approval on 2026-10-08) but not merged yet. Its text is "X is derived from the cross product of the Axis and RefDirection attributes", which is again our reading.OffsetVertical/IfcPointByDistanceExpressionquestions, which this issue doesn't depend on.No code change is needed: both upstream texts match the adopted mapping. When #1163 merges, the doc comments in
lower/station/axes.rs,lower/sectioned.rsand the CHANGELOG get updated to cite the merged texts instead of the printed ADD2 sentences, and this issue closes.