display problem with sectioned spines

Done: https://github.com/Autodesk/revit-ifc/issues/194

btw: thanks to all of you for your support

As I am some kind of stuck, I gave this hint (https://stackoverflow.com/questions/50006812/ifc2x3-equivalent-for-ifcextrudedareasolidtapered) a try and got some code with a simple circular cone, but with an error message I can’t relate:

As far as I understand, there’s something wrong with my defintion of the BEAM or the SHAPEREPRESENTAION. I can’t find any critery because of which the rule WR.24 evaluates to FALSE.

redrawn_testfile_circularcone.ifc (179.8 KB)

In the WhereRule 24 you will find this:
IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
It is a EXPRESS function call, checking the RepresentationTypes within the Items:
FUNCTION IfcShapeRepresentationTypes
(RepType : IfcLabel; Items : SET OF IfcRepresentationItem)
: LOGICAL;

  LOCAL
    Count : INTEGER := 0;
  END_LOCAL;

  CASE RepType OF 
  'Curve2D' :
    BEGIN 
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCCURVE' IN TYPEOF(temp)) 
               AND (temp.Dim = 2)));
    END;
  'Annotation2D' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | (
                SIZEOF(TYPEOF(temp) * [
                 'IFC2X3.IFCPOINT',
                 'IFC2X3.IFCCURVE',
                 'IFC2X3.IFCGEOMETRICCURVESET',
                 'IFC2X3.IFCANNOTATIONFILLAREA',
                 'IFC2X3.IFCDEFINEDSYMBOL',
                 'IFC2X3.IFCTEXTLITERAL',
                 'IFC2X3.IFCDRAUGHTINGCALLOUT']) = 1)
               ));
    END;
  'GeometricSet' : 
    BEGIN 
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
               OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
               OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))
               OR ('IFC2X3.IFCSURFACE' IN TYPEOF(temp))));
    END;
  'GeometricCurveSet' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
               OR ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
               OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
               OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))));
       REPEAT i:=1 TO HIINDEX(Items);  
         IF ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
         THEN
           IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFC2X3.IFCSURFACE' IN TYPEOF(temp))) > 0)
           THEN
             Count := Count - 1;
           END_IF;
         END_IF;
       END_REPEAT;
    END;
  'SurfaceModel' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                 'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
                 'IFC2X3.IFCFACEBASEDSURFACEMODEL',
                 'IFC2X3.IFCFACETEDBREP',
                 'IFC2X3.IFCFACETEDBREPWITHVOIDS'] * TYPEOF(temp)) >= 1
               ));      
    END;
  'SolidModel' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSOLIDMODEL' IN TYPEOF(temp))));            
    END;
  'SweptSolid' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSWEPTAREASOLID' IN TYPEOF(temp))));            
    END;
  'CSG' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANRESULT' IN TYPEOF(temp))));            
    END;
  'Clipping' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(temp))));            
    END;
  'AdvancedSweptSolid' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSURFACECURVESWEPTAREASOLID' IN TYPEOF(temp))
               OR ('IFC2X3.IFCSWEPTDISKSOLID' IN TYPEOF(temp))));      
    END;
  'Brep' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCFACETEDBREP' IN TYPEOF(temp))
               OR ('IFC2X3.IFCFACETEDBREPWITHVOIDS' IN TYPEOF(temp))));      
    END;
  'BoundingBox' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOUNDINGBOX' IN TYPEOF(temp))));
      IF (SIZEOF(Items) > 1)
      THEN
        Count := 0;
      END_IF;   
    END;
  'SectionedSpine' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSECTIONEDSPINE' IN TYPEOF(temp))));      
    END;
  'MappedRepresentation' :
    BEGIN
      Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCMAPPEDITEM' IN TYPEOF(temp))));  
    END;
   OTHERWISE : RETURN(?);
  END_CASE;
  RETURN (Count = SIZEOF(Items));

END_FUNCTION;

In the instance #3257 you are using “SolidModel” with a IfcRightCircularCone which is derived from IfcCsgPrimitive3D and not from IfcSolidModel. Unfortunatelly there is no solution in IFC2x3 for that problem. Ignore the message, but I´m pretty sure that this type of geometry is not supported by REVIT.

1 Like

I’m also trying to export some geometries by using IfcSectionedSpine because it seemed the most straightforward option, however after failing to open the generated IFC file with BlenderBIM I’m now reading that they’re not included in any IFC2x3 MVD.
Does anybody know if this entity is supported by Autodesk software (like Revit and Navisworks) when importing IFC files? I’m looking for a list of supported entities for import but haven’t found any.

Here’s a picture of the geometry I’m trying to represent in IFC files (blue axes are pointing towards the observer and are perpendicular to the other two), basically it’s a pipe shaped as a sectioned cone that is also bent. The way I was trying to create it was by using an IfcSectionedSpine having a single segment in its SpineCurve, with the segment being a trimmed IfcCircle. The CrossSections would be two IfcCircleHollowProfileDef with different radius and same thickness.

Since it’s likely that IfcSectionedSpine is not supported by Autodesk products, does anybody have any idea of which entities I could use to represent the geometry above?

EDIT: after looking at the IFC2x3 and Coordination View specifications it looks like I’ll have to use an IfcManifoldSolidBrep, using polygons to approximate the shape of the object. When the radii of the two circles are equal I’ll be able to use an IfcSweptDiskSolid.

@giovanniv you mention that an IFC file could not be opened with the BlenderBIM Add-on. Could you please supply that file so that @aothms and I can investigate and fix it?

@giovanniv if you can use IFC4 and if the spine is circular this is seems a good fit for the IfcRevolvedAreaSolidTapered, but also there I expect support in software to be extremely limited. As you mentioned, most people get around it by tessellating there geometry, in IFC4 you can use an “advanced” brep as well with toroidal or nurbs surfaces.

I didn’t post the file because the IfcAxis2Placement3Ds I used for the CrossSections might be wrong (I opened the file in a viewer to see if they were correct), and I didn’t bother fixing them because I found out that IfcSectionedSpine is not part of Coordination View. I also think the serialization of #23 is wrong, specifically Trim1 and Trim2, the values should be wrapped in IFCPARAMETERVALUE().
So the fact that the file didn’t open in Blender is probably not BlenderBIM’s fault.
curve.ifc (2.1 KB)

Thanks, unfortunately I have to use IFC2x3