/// <summary> /// Create the "Body" IfcRepresentation for a beam if it is representable by an extrusion, possibly with clippings and openings. /// </summary> /// <param name="exporterIFC">The exporterIFC class.</param> /// <param name="element">The beam element.T</param> /// <param name="catId">The category id.</param> /// <param name="geomObjects">The list of solids and meshes representing the beam's geometry. /// <param name="axisInfo">The beam axis information.</param> /// <returns>The BeamBodyAsExtrusionInfo class which contains the created handle (if any) and other information, or null.</returns> private static BeamBodyAsExtrusionInfo CreateBeamGeometryAsExtrusion(ExporterIFC exporterIFC, Element element, ElementId catId, IList <GeometryObject> geomObjects, BeamAxisInfo axisInfo) { // If we have a beam with a Linear location line that only has one solid geometry, // we will try to use the ExtrusionAnalyzer to generate an extrusion with 0 or more clippings. // This code is currently limited in that it will not process beams with openings, so we // use other methods below if this one fails. if (geomObjects == null || geomObjects.Count != 1 || (!(geomObjects[0] is Solid)) || axisInfo == null || !(axisInfo.Axis is Line)) { return(null); } BeamBodyAsExtrusionInfo info = new BeamBodyAsExtrusionInfo(); info.DontExport = false; info.Materials = new HashSet <ElementId>(); info.Slope = 0.0; Transform orientTrf = axisInfo.LCSAsTransform; Solid solid = geomObjects[0] as Solid; bool completelyClipped; XYZ beamDirection = orientTrf.BasisX; XYZ planeXVec = orientTrf.BasisY.Normalize(); XYZ planeYVec = orientTrf.BasisZ.Normalize(); MaterialAndProfile materialAndProfile = null; FootPrintInfo footPrintInfo = null; string profileName = NamingUtil.GetProfileName(element); Plane beamExtrusionBasePlane = GeometryUtil.CreatePlaneByXYVectorsAtOrigin(planeXVec, planeYVec); GenerateAdditionalInfo addInfo = GenerateAdditionalInfo.GenerateBody | GenerateAdditionalInfo.GenerateProfileDef; info.RepresentationHandle = ExtrusionExporter.CreateExtrusionWithClipping(exporterIFC, element, catId, solid, beamExtrusionBasePlane, orientTrf.Origin, beamDirection, null, out completelyClipped, out footPrintInfo, out materialAndProfile, addInfo: addInfo, profileName: profileName); if (completelyClipped) { info.DontExport = true; return(null); } if (!IFCAnyHandleUtil.IsNullOrHasNoValue(info.RepresentationHandle)) { // This is used by the BeamSlopeCalculator. This should probably be generated automatically by // CreateExtrusionWithClipping. IFCExtrusionBasis bestAxis = (Math.Abs(beamDirection[0]) > Math.Abs(beamDirection[1])) ? IFCExtrusionBasis.BasisX : IFCExtrusionBasis.BasisY; info.Slope = GeometryUtil.GetSimpleExtrusionSlope(beamDirection, bestAxis); ElementId materialId = BodyExporter.GetBestMaterialIdFromGeometryOrParameter(solid, exporterIFC, element); if (materialId != ElementId.InvalidElementId) { info.Materials.Add(materialId); } } if (materialAndProfile != null) { info.materialAndProfile = materialAndProfile; } return(info); }