added |

modifications | attributes CrossSectionPositions definition | Changed from list[2:?] of IfcDistanceExpression to list[2:?] of IfcCurveMeasureSelect |

An *IfcSectionedSolidHorizontal* is a solid model constructed by sweeping potentially varying cross sections along a curve horizontally.

The solid is generated by sweeping the *CrossSections* between *CrossSectionPositions* with linear interpolation of profile points, where the profile normal agrees with the tangent of the *Directrix*, the profile X axis is oriented perpendicularly to the left of the *Directrix* (same direction as *LateralOffset* at *IfcPointByDistanceExpression*) as facing forward along the directrix, and the profile Y axis is oriented upwards according to *FixedAxisVertical*.

For sections having cross-section rotated according to a single super-elevation, *IfcDerivedProfileDef* may be used to indicate such rotation with each *ParentProfile* referring to the same underlying profile. For sections having cross-section transformed according to multiple super-elevations with points varying independently, each profile may be of a different instance but of same type (e.g. *IfcArbitraryClosedProfileDef*), and may optionally have cross section points associated to string lines (“guide curves”) using *IfcIndexedPolyCurve* with *IfcCartesianPointList2DLabelled*.

Figure 1 illustrates four girders of a bridge having a constant parameterized profile, two guardrails having a constant arbitrary profile (one of them mirrored), and a bridge deck having a variable arbitrary profile.

**Informal Propositions:**

- No two consecutive sections shall intersect.
- If the type of sections is not IfcParameterizedProfileDef (i.e. an arbitrary profile), then the number of points and edges should be the same for two consecutive profiles
- If the directrix is not tangent continuous, the resulting solid is created by a miter at half angle between the two segments.
- Very sharp edges may result in nearly impossible miter; implementer agreements may define acceptable limits for tangent discontinuity or require the directrix to be tangent continuous.
- The directrix shall not intersect

# | Attribute | Type | Description |
---|---|---|---|

IfcRepresentationItem | |||

LayerAssignment | SET [0:1] OF IfcPresentationLayerAssignment FOR AssignedItems | Assignment of the representation item to a single or multiple layer(s). The LayerAssignments can override a LayerAssignments of the IfcRepresentation it is used within the list of Items. > IFC2x3 CHANGE The inverse attribute LayerAssignments has been added. > IFC4 CHANGE The inverse attribute LayerAssignment has been restricted to max 1. Upward compatibility for file based exchange is guaranteed. | |

StyledByItem | SET [0:1] OF IfcStyledItem FOR Item | Reference to the IfcStyledItem that provides presentation information to the representation, e.g. a curve style, including colour and thickness to a geometric curve. > IFC2x3 CHANGE The inverse attribute StyledByItem has been added. | |

IfcGeometricRepresentationItem | |||

IfcSolidModel | |||

Dim | INVALID | The space dimensionality of this class, it is always 3. | |

IfcSectionedSolid | |||

1 | Directrix | IfcCurve | The curve used to define the sweeping operation. |

2 | CrossSections | LIST [2:?] OF IfcProfileDef | List of cross sections in sequential order along the Directrix. |

IfcSectionedSolidHorizontal | |||

3 | CrossSectionPositions | LIST [2:?] OF IfcAxis2PlacementLinear | List of distance expressions in sequentially increasing order paired with CrossSections, indicating the position of the corresponding section along the Directrix. |

4 | FixedAxisVertical | IfcBoolean | Indicates whether Sections are oriented with the Y axis of each profile facing upwards in +Z direction (True), or vertically perpendicular to the Directrix varying according to slope (False). |

ENTITY IfcSectionedSolidHorizontal SUBTYPE OF (IfcSectionedSolid); CrossSectionPositions : LIST [2:?] OF IfcAxis2PlacementLinear; FixedAxisVertical : IfcBoolean; WHERE CorrespondingSectionPositions : SIZEOF(CrossSections) = SIZEOF(CrossSectionPositions); NoLongitudinalOffsets : SIZEOF(QUERY(temp <* CrossSectionPositions | EXISTS(temp.Location.OffsetLongitudinal))) = 0; END_ENTITY;