IfcShapeRepresentationTypes

Natural language names
Shape Representation Types
Semantic definitions at the function
Function Definition

The function gets the representation type and the assigned set of representation items as input and verifies whether the correct items are assigned according to the representation type given.

HISTORY  New function in IFC2x.
IFC2x3 CHANGE  The check for MappedRepresentation has been changed to allow multiple mapped items, and the Annotation2D has been added.
IFC2x4 CHANGE  The check for Curve3D, Surface2D, Surface3D, Tesselation, AdvancedBrep, and AdvancedSweptSolid has been added and CSG enhanced.

Formal representations
EXPRESS Specification

FUNCTION IfcShapeRepresentationTypes
(RepType : IfcLabel; Items : SET OF IfcRepresentationItem) : LOGICAL;
    
    LOCAL
      Count : INTEGER := 0;
    END_LOCAL;

    CASE RepType OF
    'Point' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcPoint' IN TYPEOF(temp))));
      END;

    'PointCloud' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcCartesianPointList3D' IN TYPEOF(temp))));
      END;

    'Curve' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcCurve' IN TYPEOF(temp))));
      END;

    'Curve2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcCurve' IN TYPEOF(temp))
                 AND (temp\IfcCurve.Dim = 2)));
      END;

    'Curve3D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcCurve' IN TYPEOF(temp))
                 AND (temp\IfcCurve.Dim = 3)));
      END;

    'Surface' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcSurface' IN TYPEOF(temp))));
      END;

    'Surface2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcSurface' IN TYPEOF(temp))
                 AND (temp\IfcSurface.Dim = 2)));
      END;

    'Surface3D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcSurface' IN TYPEOF(temp))
                 AND (temp\IfcSurface.Dim = 3)));
      END;

    'FillArea' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcAnnotationFillArea' IN TYPEOF(temp))));
      END;

    'Text' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcTextLiteral' IN TYPEOF(temp))));
      END;

    'AdvancedSurface' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | 'IFCGEOMETRYRESOURCE.IfcBSplineSurface' IN TYPEOF(temp)));
      END;

    'Annotation2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (
                  SIZEOF(TYPEOF(temp) * [
                   'IFCGEOMETRYRESOURCE.IfcPoint',
                   'IFCGEOMETRYRESOURCE.IfcCurve',
                   'IFCGEOMETRICMODELRESOURCE.IfcGeometricCurveSet',
                   'IFCPRESENTATIONDEFINITIONRESOURCE.IfcAnnotationFillArea',
                   'IFCPRESENTATIONDEFINITIONRESOURCE.IfcTextLiteral']) = 1)
                 ));
      END;

    'GeometricSet' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcGeometricSet' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IfcPoint' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IfcCurve' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IfcSurface' IN TYPEOF(temp))));
      END;

    'GeometricCurveSet' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcGeometricCurveSet' IN TYPEOF(temp))
                 OR ('IFCGEOMETRICMODELRESOURCE.IfcGeometricSet' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IfcPoint' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IfcCurve' IN TYPEOF(temp))));
         REPEAT i:=1 TO HIINDEX(Items);  
           IF ('IFCGEOMETRYRESOURCE.IfcGeometricSet' IN TYPEOF(Items[i]))
           THEN
             IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFCGEOMETRYRESOURCE.IfcSurface' IN TYPEOF(temp))) > 0)
             THEN
               Count := Count - 1;
             END_IF;
           END_IF;
         END_REPEAT;
      END;

    'Tessellation' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | 'IFCGEOMETRICMODELRESOURCE.IfcTessellatedItem' IN TYPEOF(temp)));
      END;

    'SurfaceOrSolidModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcTessellatedItem',
                   'IFCGEOMETRICMODELRESOURCE.IfcShellBasedSurfaceModel',
                   'IFCGEOMETRICMODELRESOURCE.IfcFaceBasedSurfaceModel',
                   'IFCGEOMETRICMODELRESOURCE.IfcSolidModel'] * TYPEOF(temp)) >= 1
                 ));      
      END;

    'SurfaceModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcTessellatedItem',
                   'IFCGEOMETRICMODELRESOURCE.IfcShellBasedSurfaceModel',
                   'IFCGEOMETRICMODELRESOURCE.IfcFaceBasedSurfaceModel'] * TYPEOF(temp)) >= 1
                 ));      
      END;

    'SolidModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcSolidModel' IN TYPEOF(temp))));            
      END;

    'SweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcExtrudedAreaSolid',
                   'IFCGEOMETRICMODELRESOURCE.IfcRevolvedAreaSolid'] * TYPEOF(temp)) >= 1
                   ) AND (SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcExtrudedAreaSolidTapered',
                   'IFCGEOMETRICMODELRESOURCE.IfcRevolvedAreaSolidTapered'] * TYPEOF(temp)) = 0
                   )
                 ));                            
      END;

    'AdvancedSweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcSweptAreaSolid',
                   'IFCGEOMETRICMODELRESOURCE.IfcSweptDiskSolid'] *  TYPEOF(temp)) >= 1
                 ));      
      END;

    'CSG' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcBooleanResult',
                   'IFCGEOMETRICMODELRESOURCE.IfcCsgPrimitive3D',
                   'IFCGEOMETRICMODELRESOURCE.IfcCsgSolid'] *  TYPEOF(temp)) >= 1
                 ));            
      END;

    'Clipping' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IfcCsgSolid',
                   'IFCGEOMETRICMODELRESOURCE.IfcBooleanClippingResult'] * TYPEOF(temp)) >= 1
                 ));
      END;

    'Brep' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcFacetedBrep' IN TYPEOF(temp))));      
      END;

    'AdvancedBrep' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcManifoldSolidBrep' IN TYPEOF(temp))));      
      END;

    'BoundingBox' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcBoundingBox' IN TYPEOF(temp))));
        IF (SIZEOF(Items) > 1)
        THEN
          Count := 0;
        END_IF;   
      END;

    'SectionedSpine' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IfcSectionedSpine' IN TYPEOF(temp))));      
      END;

    'LightSource' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCPRESENTATIONORGANIZATIONRESOURCE.IfcLightSource' IN TYPEOF(temp))));      
      END;

    'MappedRepresentation' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IfcMappedItem' IN TYPEOF(temp))));  
      END;

     OTHERWISE : RETURN(?);
    END_CASE;
    RETURN (Count = SIZEOF(Items));
END_FUNCTION;

References  References: IfcShapeRepresentation

Link to this page  Link to this page