IFC 4.3.2.20251031 (IFC4X3_ADD2) under development

8.18.6.3 IfcShapeRepresentationTypes(形状表示类型)

8.18.6.3.1 语义定义(Semantic definition)

该函数接收表示类型和分配的表示项集合作为输入,并根据给定的表示类型验证是否正确分配了相应的项。

8.18.6.3.2 形式化表示(Formal representation)

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 | ('IFC4X3_DEV_62887e3f.IFCPOINT' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCCARTESIANPOINTLIST' IN TYPEOF(temp))));
      END;

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

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

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

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

    'Segment' :
      BEGIN 
        Count := SIZEOF(QUERY(temp <* Items | ('IFC4X3_DEV_62887e3f.IFCSEGMENT' IN TYPEOF(temp))));
      END;

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

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

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

    'SectionedSurface' :
      BEGIN 
        Count := SIZEOF(QUERY(temp <* Items | 'IFC4X3_DEV_62887e3f.IFCSECTIONEDSURFACE' IN TYPEOF(temp)));
      END;

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

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

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

    'Annotation2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (
                  SIZEOF(TYPEOF(temp) * [
                   'IFC4X3_DEV_62887e3f.IFCPOINT',
                   'IFC4X3_DEV_62887e3f.IFCCURVE',
                   'IFC4X3_DEV_62887e3f.IFCGEOMETRICCURVESET',
                   'IFC4X3_DEV_62887e3f.IFCANNOTATIONFILLAREA',
                   'IFC4X3_DEV_62887e3f.IFCTEXTLITERAL']) = 1)
                 ));
      END;

    'GeometricSet' : 
      BEGIN 
        Count := SIZEOF(QUERY(temp <* Items | ('IFC4X3_DEV_62887e3f.IFCGEOMETRICSET' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCPOINT' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCCURVE' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCSURFACE' IN TYPEOF(temp))));
      END;

    'GeometricCurveSet' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFC4X3_DEV_62887e3f.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCGEOMETRICSET' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCPOINT' IN TYPEOF(temp))
                 OR ('IFC4X3_DEV_62887e3f.IFCCURVE' IN TYPEOF(temp))));
         REPEAT i:=1 TO HIINDEX(Items);  
           IF ('IFC4X3_DEV_62887e3f.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
           THEN
             IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFC4X3_DEV_62887e3f.IFCSURFACE' IN TYPEOF(temp))) > 0)
             THEN
               Count := Count - 1;
             END_IF;
           END_IF;
         END_REPEAT;
      END;

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

    'SurfaceOrSolidModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCTESSELLATEDITEM',
                   'IFC4X3_DEV_62887e3f.IFCSHELLBASEDSURFACEMODEL',
                   'IFC4X3_DEV_62887e3f.IFCFACEBASEDSURFACEMODEL',
                   'IFC4X3_DEV_62887e3f.IFCSOLIDMODEL'] * TYPEOF(temp)) >= 1
                 ));      
      END;

    'SurfaceModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCTESSELLATEDITEM',
                   'IFC4X3_DEV_62887e3f.IFCSHELLBASEDSURFACEMODEL',
                   'IFC4X3_DEV_62887e3f.IFCFACEBASEDSURFACEMODEL'] * TYPEOF(temp)) >= 1
                 ));      
      END;

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

    'SweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCEXTRUDEDAREASOLID',
                   'IFC4X3_DEV_62887e3f.IFCREVOLVEDAREASOLID'] * TYPEOF(temp)) >= 1
                   ) AND (SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCEXTRUDEDAREASOLIDTAPERED',
                   'IFC4X3_DEV_62887e3f.IFCREVOLVEDAREASOLIDTAPERED'] * TYPEOF(temp)) = 0
                   )
                 ));                             
      END;

    'AdvancedSweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCSWEPTAREASOLID',
                   'IFC4X3_DEV_62887e3f.IFCSWEPTDISKSOLID',
                   'IFC4X3_DEV_62887e3f.IFCSECTIONEDSOLIDHORIZONTAL'] *  TYPEOF(temp)) >= 1
                 ));      
      END;

    'CSG' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFC4X3_DEV_62887e3f.IFCBOOLEANRESULT',
                   'IFC4X3_DEV_62887e3f.IFCCSGPRIMITIVE3D',
                   'IFC4X3_DEV_62887e3f.IFCCSGSOLID'] *  TYPEOF(temp)) >= 1
                 ));            
      END;

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

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

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

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

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

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

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

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

END_FUNCTION;

8.18.6.3.3 参考文献