IFC 4.3.0.1 (IFC4X3_TC1)

4.8.1.1 Alignment Geometry

Base for a standard two (Alignment Geometry Gradient) or three (Alignment Geometry Cant) level layout alignment geometric representation.

RepresentationIdentifier = 'Axis' RepresentationType = Curve3D'

The following diagram shows the generic classes and relationships used when applying this concept. In addition, concepts may have particular importance to common or standardised industry practices and scenarios. For these specific usage scenarios, the tables below shows a recommended list of general usage patterns that users may adopt.

G IfcAlignment IfcAlignment 1. GlobalId [1:1] 2. OwnerHistory [0:1] 3. Name [0:1] 4. Description [0:1]      HasAssignments [0:?]      Nests [0:1]      IsNestedBy [0:?]      HasContext [0:1]      IsDecomposedBy [0:?]      Decomposes [0:1]      HasAssociations [0:?] 5. ObjectType [0:1]      IsDeclaredBy [0:1]      Declares [0:?]      IsTypedBy [0:1]      IsDefinedBy [0:?] 6. ObjectPlacement [0:1] 7. Representation [0:1]      ReferencedBy [0:?]      PositionedRelativeTo [0:?]      ReferencedInStructures [0:?]      ContainedInStructure [0:1]      Positions [0:?] 8. PredefinedType [0:1] IfcProductDefinitionShape IfcProductDefinitionShape 1. Name [0:1] 2. Description [0:1] 3. Representations [1:?]      ShapeOfProduct [1:?]      HasShapeAspects [0:?] IfcAlignment:Representation1->IfcProductDefinitionShape:IfcProductDefinitionShape0 IfcShapeRepresentation IfcShapeRepresentation 1. ContextOfItems [1:1] Identifier 2. RepresentationIdentifier [0:1] Type 3. RepresentationType [0:1] 4. Items [1:?]      RepresentationMap [0:1]      LayerAssignments [0:?]      OfProductRepresentation [0:?]      OfShapeAspect [0:1] IfcProductDefinitionShape:Representations1->IfcShapeRepresentation:IfcShapeRepresentation0 IfcGeometricRepresentationContext IfcGeometricRepresentationContext 1. ContextIdentifier [0:1] 2. ContextType [0:1]      RepresentationsInContext [0:?] 3. CoordinateSpaceDimension [1:1] 4. Precision [0:1] 5. WorldCoordinateSystem [1:1] 6. TrueNorth [0:1]      HasSubContexts [0:?]      HasCoordinateOperation [0:1] IfcShapeRepresentation:ContextOfItems1->IfcGeometricRepresentationContext:IfcGeometricRepresentationContext0 IfcLabel_0 IfcLabel IfcShapeRepresentation:RepresentationIdentifier1->IfcLabel_0:IfcLabel0 IfcLabel_1 IfcLabel IfcShapeRepresentation:RepresentationType1->IfcLabel_1:IfcLabel0 constraint_0 =Axis IfcLabel_0->constraint_0 constraint_1 =Curve3D IfcLabel_1->constraint_1
Figure 4.8.1.1.A

:construction: :construction: :construction: There are two important parts where consistency checks on Alignment definition within IFC files will be applied: - the Business Logic part (IfcAlignment, IfcAlignmentHorizontal, IfcAlignmentVertical, IfcAlignmentCant, IfcAlignmentHorizontalSegment, IfcAlignmentVerticalSegment and IfcAlignmentCantSegment) - the Geometry Definition part (IfcCompositeCurve, IfcGradientCurve, IfcSegmentedReferenceCurve, IfcCurveSegment, IfcCircle, IfcClothoid, IfcCosineSpiral, IfcLine, IfcPolynomialCurve, IfcSecondOrderPolynomialSpiral, IfcSeventhOrderPolynomialSpiral, IfcSineSpiral, IfcThirdOrderPolynomialSpiral)

Business Logic

Each Alignment is build up from segments, it is checked if connected segments are at least continuous given a certain epsilon (what is a proper epsilon value is something to discuss, especially when coping with legacy data there could be considerable inconsistencies). A check if the values make sense, i.e. a defined StartRadiusOfCurvature / EndRadiusOfCurvature in the context of a LINE does not make sense as well as non-equal values of in the context of a CIRCULARARC. In case of Spirals the radius of curvature actually should be different.

Geometry Definition

In case geometry is defined the following consistency checks are applied: - the defined geometry is in line with the business logic (the next part of this document described how this mapping can be applied from mathematical point-of-view) - the bounded curves (IfcCompositeCurve, IfcGradientCurve and IfcSegmentedReferenceCurve) are structured correctly, i.e. right order of IfcCurveSegments, correct BaseCurve.

Horizontal Alignment

Business Logic Geometrical Definition (ParentCurve)
BLOSSCURVE IfcThirdOrderPolynomialSpiral
CIRCULARARC IfcCircle
CLOTHOID IfcClothoid
COSINECURVE IfcCosine
CUBIC IfcPolynomialCurve
HELMERTCURVE IfcSecondOrderPolynomialSpiral (two parts)
LINE IfcLine
SINECURVE IfcSine
VIENNESEBEND IfcSeventhOrderPolynomialSpiral
Table 4.8.1.1.D

Within the description of the individual transition curves the IfcCurveSegment.SegmentStart is expected to be zero and IfcCurveSegment.SegmentLength to be the segment length or horizontal length (vertical and cant alignment) unless written otherwise. This is not possible in all cases of a CLOTHOID for example as IfcClothoid does not have an attribute for ConstantTerm.

BLOSSCURVE (Horizontal)

For the BlossCurve one instance of IfcCurveSegment with ParentCurve IfcThirdOrderPolynomialSpiral will be created. Change of curvature is defined as:

Figure 4.8.1.1.B
  • Calculation of relevant terms

    double factor = (endRadiusOfCurvature ? segmentLength / endRadiusOfCurvature : 0.) - (startRadiusOfCurvature ? segmentLength / startRadiusOfCurvature : 0.), constantTerm = 0. * factor + (startRadiusOfCurvature ? segmentLength / startRadiusOfCurvature : 0.), linearTerm = 0. * factor, quadraticTerm = 3. * factor, cubicTerm = - 2. * factor;

  • Population of IfcThirdOrderPolynomialSpiral entity

    ``` cubicTerm ? segmentLength * pow(std::fabs(cubicTerm), -1. / 4.) * cubicTerm / std::fabs(cubicTerm) : 0. quadraticTerm ? segmentLength * pow(std::fabs(quadraticTerm), -1. / 3.) * quadraticTerm / std::fabs(quadraticTerm) : 0. linearTerm ? segmentLength * pow(std::fabs(linearTerm), -1. / 2.) * linearTerm / std::fabs(linearTerm) : 0. constantTerm ? segmentLength * pow(std::fabs(constantTerm), -1. / 1.) * constantTerm / std::fabs(constantTerm) : 0.

    ```

CIRCULARARC (Horizontal)

For the CircularArc one instance of IfcCurveSegment with ParentCurve IfcCircle will be created. Curvature is constant, i.e. change of curvature is zero.

CLOTHOID (Horizontal)

For the Clothoid one instance of IfcCurveSegment with ParentCurve IfcClothoid will be created. Change of curvature is defined as:

Figure 4.8.1.1.C
  • Calculation of relevant terms

    double factor, offset; if ((std::fabs(startRadiusOfCurvature) < std::fabs(endRadiusOfCurvature) && startRadiusOfCurvature) || endRadiusOfCurvature == 0.) { factor = segmentLength / startRadiusOfCurvature + (endRadiusOfCurvature ? segmentLength / (endRadiusOfCurvature - startRadiusOfCurvature) : 0.); offset = -segmentLength - (endRadiusOfCurvature ? segmentLength * startRadiusOfCurvature / (endRadiusOfCurvature - startRadiusOfCurvature) : 0.); } else { assert(std::fabs(startRadiusOfCurvature) > std::fabs(endRadiusOfCurvature) || startRadiusOfCurvature == 0.); factor = segmentLength / endRadiusOfCurvature + (startRadiusOfCurvature ? segmentLength / (startRadiusOfCurvature - endRadiusOfCurvature) : 0.); offset = startRadiusOfCurvature ? segmentLength * endRadiusOfCurvature / (startRadiusOfCurvature - endRadiusOfCurvature) : 0.; }

  • Population of IfcThirdOrderPolynomialSpiral entity

    if ((std::fabs(startRadiusOfCurvature) < std::fabs(endRadiusOfCurvature) && startRadiusOfCurvature) || endRadiusOfCurvature == 0.) { linearTernm = -startRadiusOfCurvature * pow(std::fabs(factor), 1. / 2.); } else { linearTernm = endRadiusOfCurvature * pow(std::fabs(factor), 1. / 2.); }

... To Be Completed

General Usage

ApplicableEntity
IfcAlignment
Table 4.8.1.1.E