private static IfcBeam CreateBeam(XbimModel model, HndzStructuralElement genericProducthndz) { using (XbimReadWriteTransaction txn = model.BeginTransaction("Create" + genericProducthndz.ToString())) { IfcBeam genericProductIfc = model.Instances.New <IfcBeam>(); IfcExtrudedAreaSolid body = model.Instances.New <IfcExtrudedAreaSolid>(); IfcBeamType elementType = model.Instances.New <IfcBeamType>(); elementType.PredefinedType = IfcBeamTypeEnum.BEAM; if (genericProducthndz.Profile is HndzRectangularProfile) { HndzRectangularProfile genericProfilehndz = genericProducthndz.Profile as HndzRectangularProfile; IfcRectangleProfileDef ifcGenericProfile = AssignRectangularProfile(model, genericProducthndz, genericProductIfc, elementType, genericProfilehndz); //model as a swept area solid body.SweptArea = ifcGenericProfile; } if (genericProducthndz.Profile is HndzISectionProfile) { HndzISectionProfile genericProfilehndz = genericProducthndz.Profile as HndzISectionProfile; IfcIShapeProfileDef ifcGenericProfile = AssignIProfile(model, genericProducthndz, genericProductIfc, elementType, genericProfilehndz); //model as a swept area solid body.SweptArea = ifcGenericProfile; } if (genericProducthndz.Profile is HndzCSectionProfile) { HndzCSectionProfile genericProfilehndz = genericProducthndz.Profile as HndzCSectionProfile; IfcCShapeProfileDef ifcGenericProfile = AssignCsectionProfile(model, genericProducthndz, genericProductIfc, elementType, genericProfilehndz); //model as a swept area solid body.SweptArea = ifcGenericProfile; } AdjustExtrusion(model, body, genericProducthndz, genericProductIfc); if (model.Validate(txn.Modified(), Console.Out) == 0) { txn.Commit(); return(genericProductIfc); } return(null); } }
private static IfcCShapeProfileDef AssignCsectionProfile(XbimModel model, HndzStructuralElement genericProducthndz, IfcProduct genericProductIfc, IfcBuildingElementType elementType, HndzCSectionProfile genericProfilehndz) { #region Type & Material &Tags string typeText = genericProducthndz.ToString() + " C-Chanel (flange " + genericProfilehndz.C_Section.b_f + " x " + genericProfilehndz.C_Section.t_f + " and web " + genericProfilehndz.C_Section.d + " x " + genericProfilehndz.C_Section.t_w + " mm"; elementType.Tag = typeText; elementType.Name = typeText; IfcLabel columnLabel = new IfcLabel(typeText); elementType.ElementType = columnLabel; elementType.ApplicableOccurrence = columnLabel; //genericProductIfc.Tag = typeText; genericProductIfc.Name = typeText; genericProductIfc.Description = typeText; genericProductIfc.SetDefiningType(elementType, model); #endregion IfcCShapeProfileDef ifcGenericProfile = model.Instances.New <IfcCShapeProfileDef>(); ifcGenericProfile.ProfileType = IfcProfileTypeEnum.AREA; ifcGenericProfile.WallThickness = genericProfilehndz.C_Section.t_f; //MyColumnPofile.WebThickness = Iprofile.C_Section.t_w; //ToDo:purlin web and flange thickness are the same!!!! ifcGenericProfile.Width = genericProfilehndz.C_Section.b_f; ifcGenericProfile.Depth = genericProfilehndz.C_Section.d; ifcGenericProfile.Girth = 5;//ToDo:What's that ifcGenericProfile.InternalFilletRadius = 10; ifcGenericProfile.Position = model.Instances.New <IfcAxis2Placement2D>(); ifcGenericProfile.Position.RefDirection = model.Instances.New <IfcDirection>(); ifcGenericProfile.Position.RefDirection.SetXY(genericProfilehndz.OrientationInPlane.X, genericProfilehndz.OrientationInPlane.Y); ifcGenericProfile.Position.Location = model.Instances.New <IfcCartesianPoint>(); ifcGenericProfile.Position.Location.SetXY(0, 0); return(ifcGenericProfile); }
private static IfcBeam CreatePurlin(XbimModel model, HndzPurlin genericProducthndz) { using (XbimReadWriteTransaction txn = model.BeginTransaction("Create Purlin")) { IfcBeam beam = model.Instances.New <IfcBeam>(); IfcExtrudedAreaSolid body = model.Instances.New <IfcExtrudedAreaSolid>(); body.Depth = genericProducthndz.ExtrusionLine.RhinoLine.Length; IfcBeamType elementType = model.Instances.New <IfcBeamType>(); elementType.PredefinedType = IfcBeamTypeEnum.USERDEFINED; IfcMaterial material = model.Instances.New <IfcMaterial>(); material.Name = "STEEL"; beam.SetMaterial(material); IfcCartesianPoint insertPoint = model.Instances.New <IfcCartesianPoint>(); insertPoint.SetXY(genericProducthndz.ExtrusionLine.baseNode.Point.X, genericProducthndz.ExtrusionLine.baseNode.Point.Y); //insert at arbitrary position//****************Need Revision if (genericProducthndz.Profile is HndzRectangularProfile) { HndzRectangularProfile recProfile = genericProducthndz.Profile as HndzRectangularProfile; #region Type & Material &Tags string typeText = "HANDAZ-Column-Rectangular " + (int)recProfile.Rectangle.Width + " x " + (int)recProfile.Rectangle.Height + " mm"; elementType.Tag = typeText; elementType.Name = typeText; IfcLabel columnLabel = new IfcLabel(typeText); elementType.ElementType = columnLabel; elementType.ApplicableOccurrence = columnLabel; beam.Tag = typeText; beam.Name = typeText; beam.Description = typeText; beam.SetDefiningType(elementType, model); #endregion //represent column as a rectangular profile IfcRectangleProfileDef MyPurlinPofile = model.Instances.New <IfcRectangleProfileDef>(); MyPurlinPofile.ProfileType = IfcProfileTypeEnum.AREA; MyPurlinPofile.XDim = recProfile.Rectangle.Height; MyPurlinPofile.YDim = recProfile.Rectangle.Width; MyPurlinPofile.Position = model.Instances.New <IfcAxis2Placement2D>(); MyPurlinPofile.Position.RefDirection = model.Instances.New <IfcDirection>(); MyPurlinPofile.Position.RefDirection.SetXY(recProfile.OrientationInPlane.X, recProfile.OrientationInPlane.Y); //MyColumnPofile.Position.Location = insertPoint; //model as a swept area solid body.SweptArea = MyPurlinPofile; } if (genericProducthndz.Profile is HndzISectionProfile) { HndzISectionProfile Iprofile = genericProducthndz.Profile as HndzISectionProfile; #region Type & Material &Tags string typeText = "HANDAZ-Purlin-I beam (flange " + Iprofile.I_Section.b_f + " x " + Iprofile.I_Section.t_fTop + " and web " + Iprofile.I_Section.d + " x " + Iprofile.I_Section.t_w + " mm"; elementType.Tag = typeText; elementType.Name = typeText; IfcLabel columnLabel = new IfcLabel(typeText); elementType.ElementType = columnLabel; elementType.ApplicableOccurrence = columnLabel; beam.Tag = typeText; beam.Name = typeText; beam.Description = typeText; beam.SetDefiningType(elementType, model); #endregion // IfcPolyline pl = model.Instances.New<IfcPolyline>(); //List<Point3d> tempPoints= Iprofile.ConvertItoPoints(); // foreach (Point3d point in tempPoints) // { // IfcCartesianPoint tempPoint = model.Instances.New<IfcCartesianPoint>(); // tempPoint.SetXYZ(point.X, point.Y, point.Z); // pl.Points.Add(tempPoint); // } IfcIShapeProfileDef MyPurlinPofile = model.Instances.New <IfcIShapeProfileDef>(); MyPurlinPofile.FlangeThickness = Iprofile.I_Section.tf; MyPurlinPofile.WebThickness = Iprofile.I_Section.t_w; MyPurlinPofile.OverallWidth = Iprofile.I_Section.b_f; MyPurlinPofile.OverallDepth = Iprofile.I_Section.d; MyPurlinPofile.FilletRadius = 10; MyPurlinPofile.Position = model.Instances.New <IfcAxis2Placement2D>(); MyPurlinPofile.Position.RefDirection = model.Instances.New <IfcDirection>(); MyPurlinPofile.Position.RefDirection.SetXY(Iprofile.OrientationInPlane.X, Iprofile.OrientationInPlane.Y); //MyColumnPofile.Position.Location = insertPoint; //model as a swept area solid body.SweptArea = MyPurlinPofile; } if (genericProducthndz.Profile is HndzCSectionProfile) { HndzCSectionProfile Cprofile = genericProducthndz.Profile as HndzCSectionProfile; #region Type & Material &Tags string typeText = "HANDAZ-Purlin-C-Chanel (flange " + Cprofile.C_Section.b_f + " x " + Cprofile.C_Section.t_f + " and web " + Cprofile.C_Section.d + " x " + Cprofile.C_Section.t_w + " mm"; elementType.Tag = typeText; elementType.Name = typeText; IfcLabel columnLabel = new IfcLabel(typeText); elementType.ElementType = columnLabel; elementType.ApplicableOccurrence = columnLabel; beam.Tag = typeText; beam.Name = typeText; beam.Description = typeText; beam.SetDefiningType(elementType, model); #endregion IfcCShapeProfileDef MyPurlinPofile = model.Instances.New <IfcCShapeProfileDef>(); MyPurlinPofile.WallThickness = Cprofile.C_Section.t_f; //MyColumnPofile.WebThickness = Iprofile.C_Section.t_w; //ToDo:purlin web and flange thickness are the same!!!! MyPurlinPofile.Width = Cprofile.C_Section.b_f; MyPurlinPofile.Depth = Cprofile.C_Section.d; MyPurlinPofile.InternalFilletRadius = 10; MyPurlinPofile.Position = model.Instances.New <IfcAxis2Placement2D>(); MyPurlinPofile.Position.RefDirection = model.Instances.New <IfcDirection>(); MyPurlinPofile.Position.RefDirection.SetXY(Cprofile.OrientationInPlane.X, Cprofile.OrientationInPlane.Y); //model as a swept area solid body.SweptArea = MyPurlinPofile; } body.ExtrudedDirection = model.Instances.New <IfcDirection>(); body.ExtrudedDirection.SetXYZ(0, 0, 1); //body.ExtrudedDirection.SetXYZ(Hndzcol.ExtrusionLine.RhinoLine.Direction.X, Hndzcol.ExtrusionLine.RhinoLine.Direction.Y, Hndzcol.ExtrusionLine.RhinoLine.Direction.Z); //parameters to insert the geometry in the model IfcCartesianPoint origin = model.Instances.New <IfcCartesianPoint>(); origin.SetXYZ(genericProducthndz.ExtrusionLine.baseNode.Point.X, genericProducthndz.ExtrusionLine.baseNode.Point.Y, genericProducthndz.ExtrusionLine.baseNode.Point.Z); body.Position = model.Instances.New <IfcAxis2Placement3D>(); //body.Position.Location = origin; body.Position.RefDirection = model.Instances.New <IfcDirection>(); body.Position.RefDirection.SetXYZ(1, 0, 0); //Create a Definition shape to hold the geometry IfcShapeRepresentation shape = model.Instances.New <IfcShapeRepresentation>(); shape.ContextOfItems = model.IfcProject.ModelContext(); shape.RepresentationType = "SweptSolid"; shape.RepresentationIdentifier = "Body"; shape.Items.Add(body); //Create a Product Definition and add the model geometry to the column IfcProductDefinitionShape rep = model.Instances.New <IfcProductDefinitionShape>(); rep.Representations.Add(shape); beam.Representation = rep; //now place the column into the model IfcLocalPlacement lp = model.Instances.New <IfcLocalPlacement>(); IfcAxis2Placement3D ax3d = model.Instances.New <IfcAxis2Placement3D>(); ax3d.Location = origin; Vector3d perpendicularVector = new Vector3d(genericProducthndz.Profile.OrientationInPlane.X, genericProducthndz.Profile.OrientationInPlane.Y, 0); Plane extrusionPlane; bool aa = genericProducthndz.ExtrusionLine.RhinoLine.TryGetPlane(out extrusionPlane); if (aa) { perpendicularVector = extrusionPlane.ZAxis; } ax3d.RefDirection = model.Instances.New <IfcDirection>(); ax3d.RefDirection.SetXYZ(perpendicularVector.X, perpendicularVector.Y, perpendicularVector.Z); ax3d.Axis = model.Instances.New <IfcDirection>(); ax3d.Axis.SetXYZ(genericProducthndz.ExtrusionLine.RhinoLine.Direction.X, genericProducthndz.ExtrusionLine.RhinoLine.Direction.Y, genericProducthndz.ExtrusionLine.RhinoLine.Direction.Z); lp.RelativePlacement = ax3d; beam.ObjectPlacement = lp; #region Owner Data beam.OwnerHistory.OwningUser = model.DefaultOwningUser; beam.OwnerHistory.OwningApplication = model.DefaultOwningApplication; #endregion //validate write any errors to the console and commit if OK, otherwise abort string temp = Path.GetTempPath(); //if (model.Validate(txn.Modified(), File.CreateText("E:\\Column" + column.GlobalId + "Errors.txt")) == 0) // if (model.Validate(txn.Modified(), File.CreateText(temp + "Column" + column.GlobalId + "Errors.txt")) == 0) if (model.Validate(txn.Modified(), Console.Out) == 0) { txn.Commit(); return(beam); } return(null); } }
public static double GetPerimeter(this IfcProfileDef Profile, bool addPerimetersOfVoids = true) { // Inheritance tree of IfcProfileDef: // //- IfcArbitraryClosedProfileDef // - IfcArbitraryProfileDefWithVoids //- IfcArbitraryOpenProfileDef // - IfcCenterLineProfileDef //- IfcParameterizedProfileDef (abstract) // - IfcIShapeProfileDef // - IfcAsymmetricIShapeProfileDef // - IfcCircleProfileDef // - IfcCircleHollowProfileDef // - IfcCraneRailAShapeProfileDef (Throw) // - IfcCraneRailFShapeProfileDef (Throw) // - IfcCShapeProfileDef // - IfcEllipseProfileDef // - IfcLShapeProfileDef (Throw) // - IfcRectangleProfileDef // - IfcRectangleHollowProfileDef // - IfcRoundedRectangleProfileDef // - IfcTrapeziumProfileDef // - IfcTShapeProfileDef (Throw) // - IfcUShapeProfileDef (Throw) // - IfcZShapeProfileDef (Throw) //- IfcCompositeProfileDef if (Profile is IfcArbitraryProfileDefWithVoids) { throw new NotImplementedException("IfcArbitraryProfileDefWithVoids Perimeter is not implemented"); } else if (Profile is IfcArbitraryClosedProfileDef) { throw new NotImplementedException("IfcArbitraryClosedProfileDef Perimeter is not implemented"); } else if (Profile is IfcRoundedRectangleProfileDef) { IfcRoundedRectangleProfileDef p = Profile as IfcRoundedRectangleProfileDef; return(RoundedRecPerimeter(p.XDim, p.YDim, p.RoundingRadius)); } else if (Profile is IfcRectangleHollowProfileDef) { IfcRectangleHollowProfileDef p = Profile as IfcRectangleHollowProfileDef; // outer 2P double outerFillet = 0; if (p.OuterFilletRadius.HasValue) { outerFillet = p.OuterFilletRadius.Value; } double outer = RoundedRecPerimeter(p.XDim, p.YDim, outerFillet); if (!addPerimetersOfVoids) { return(outer); } // inner 2P double innerFillet = 0; if (p.InnerFilletRadius.HasValue) { innerFillet = p.InnerFilletRadius.Value; } double inner = RoundedRecPerimeter(p.XDim - 2 * p.WallThickness, p.YDim - 2 * p.WallThickness, innerFillet); // value return(outer + inner); } else if (Profile is IfcRectangleProfileDef) { IfcRectangleProfileDef p = Profile as IfcRectangleProfileDef; return(2 * (p.XDim + p.YDim)); } else if (Profile is IfcCircleHollowProfileDef) { IfcCircleHollowProfileDef p = Profile as IfcCircleHollowProfileDef; double outer = 2 * Math.PI * p.Radius; if (!addPerimetersOfVoids) { return(outer); } double inner = 2 * Math.PI * (p.Radius - p.WallThickness); return(outer - inner); } else if (Profile is IfcCircleProfileDef) { IfcCircleProfileDef p = Profile as IfcCircleProfileDef; return(2 * Math.PI * p.Radius); } else if (Profile is IfcCraneRailAShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcCraneRailAShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcCraneRailFShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcCraneRailFShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcCShapeProfileDef) { IfcCShapeProfileDef p = Profile as IfcCShapeProfileDef; double raIn = 0; if (p.InternalFilletRadius.HasValue) { raIn = p.InternalFilletRadius.Value; } double raOut = raIn + p.WallThickness; return (2 * Math.PI * raIn + // internal fillet 2 * Math.PI * raOut + // external fillet 4 * (p.Girth - raOut) + // girt extension 2 * p.WallThickness + // girt closures 4 * (p.Width - 2 * raOut) + // top and bottom connections 2 * (p.Depth - 2 * raOut)); // left connections } else if (Profile is IfcEllipseProfileDef) { IfcEllipseProfileDef p = Profile as IfcEllipseProfileDef; // http://www.mathsisfun.com/geometry/ellipse-perimeter.html // Ramanujan approx 3 double h = Math.Pow((p.SemiAxis1 - p.SemiAxis2), 2) / Math.Pow((p.SemiAxis1 + p.SemiAxis2), 2); return (Math.PI * (p.SemiAxis1 + p.SemiAxis2) * (1 + 3 * h / (10 + Math.Sqrt(4 - 3 * h)))); } else if (Profile is IfcLShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcLShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcTrapeziumProfileDef) { IfcTrapeziumProfileDef p = Profile as IfcTrapeziumProfileDef; double diag1 = pita(p.YDim, p.TopXOffset); double diag2 = pita(p.YDim, p.BottomXDim - p.TopXOffset - p.TopXDim); return(p.BottomXDim + p.TopXDim + diag1 + diag2); } else if (Profile is IfcTShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcTShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcUShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcUShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcZShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcZShapeProfileDef Perimeter is not implemented"); } else if (Profile is IfcAsymmetricIShapeProfileDef) // needs to be tested before IfcIShapeProfileDef { throw new NotImplementedException("IfcAsymmetricIShapeProfileDef Perimeter is not implemented"); // IfcAsymmetricIShapeProfileDef p = Profile as IfcAsymmetricIShapeProfileDef; } else if (Profile is IfcIShapeProfileDef) { throw new NotImplementedException("IfcAsymmetricIShapeProfileDef Perimeter is not implemented"); // IfcIShapeProfileDef p = Profile as IfcIShapeProfileDef; } else if (Profile is IfcArbitraryOpenProfileDef) { return(0); } return(double.NaN); }
public static double GetArea(this IfcProfileDef Profile) { // Inheritance tree of IfcProfileDef: // //- IfcArbitraryClosedProfileDef (Throw) // - IfcArbitraryProfileDefWithVoids (Throw) //- IfcArbitraryOpenProfileDef (x) // - IfcCenterLineProfileDef (x) //- IfcParameterizedProfileDef (abstract) // - IfcIShapeProfileDef (x) // - IfcAsymmetricIShapeProfileDef (x) // - IfcCircleProfileDef (x) // - IfcCircleHollowProfileDef (x) // - IfcCraneRailAShapeProfileDef (Throw) // - IfcCraneRailFShapeProfileDef (Throw) // - IfcCShapeProfileDef (x) // - IfcEllipseProfileDef (x) // - IfcLShapeProfileDef (Throw) // - IfcRectangleProfileDef (x) // - IfcRectangleHollowProfileDef (x) // - IfcRoundedRectangleProfileDef (x) // - IfcTrapeziumProfileDef (x) // - IfcTShapeProfileDef (Throw) // - IfcUShapeProfileDef (Throw) // - IfcZShapeProfileDef (Throw) //- IfcCompositeProfileDef if (Profile is IfcArbitraryProfileDefWithVoids) { throw new NotImplementedException("IfcArbitraryProfileDefWithVoids Area is not implemented"); } else if (Profile is IfcArbitraryClosedProfileDef) { throw new NotImplementedException("IfcArbitraryClosedProfileDef Area is not implemented"); } else if (Profile is IfcRoundedRectangleProfileDef) { IfcRoundedRectangleProfileDef p = Profile as IfcRoundedRectangleProfileDef; return((p.XDim * p.YDim) - (4 * ConcaveRightAngleFilletArea(p.RoundingRadius))); } else if (Profile is IfcRectangleHollowProfileDef) { IfcRectangleHollowProfileDef p = Profile as IfcRectangleHollowProfileDef; // outer area double outerFillet = 0; if (p.OuterFilletRadius.HasValue) { outerFillet = p.OuterFilletRadius.Value; } double outer = (p.XDim * p.YDim) - (4 * ConcaveRightAngleFilletArea(outerFillet)); // inner area double innerFillet = 0; if (p.InnerFilletRadius.HasValue) { innerFillet = p.InnerFilletRadius.Value; } double inner = ((p.XDim - 2 * p.WallThickness) * (p.YDim - 2 * p.WallThickness)) - (4 * ConcaveRightAngleFilletArea(innerFillet)); return(outer - inner); } else if (Profile is IfcRectangleProfileDef) { IfcRectangleProfileDef p = Profile as IfcRectangleProfileDef; return(p.XDim * p.YDim); } else if (Profile is IfcCircleHollowProfileDef) { IfcCircleHollowProfileDef p = Profile as IfcCircleHollowProfileDef; double outer = Math.PI * Math.Pow(p.Radius, 2); double inner = Math.PI * Math.Pow(p.Radius - p.WallThickness, 2); return(outer - inner); } else if (Profile is IfcCircleProfileDef) { IfcCircleProfileDef p = Profile as IfcCircleProfileDef; return(Math.PI * Math.Pow(p.Radius, 2)); } else if (Profile is IfcCraneRailAShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcCraneRailAShapeProfileDef Area is not implemented"); } else if (Profile is IfcCraneRailFShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcCraneRailFShapeProfileDef Area is not implemented"); } else if (Profile is IfcCShapeProfileDef) { IfcCShapeProfileDef p = Profile as IfcCShapeProfileDef; // inner area double innerFillet = 0; if (p.InternalFilletRadius.HasValue) { innerFillet = p.InternalFilletRadius.Value; } double inner = ((p.Width - 2 * p.WallThickness) * (p.Depth - 2 * p.WallThickness)) - (4 * ConcaveRightAngleFilletArea(innerFillet)); // outer area double outerFillet = innerFillet + p.WallThickness; double outer = (p.Width * p.Depth) - (4 * ConcaveRightAngleFilletArea(outerFillet)); double girthSideVoid = (p.Depth - 2 * p.Girth) * p.WallThickness; // closed loop area - missing part between girths return((outer - inner) - girthSideVoid); } else if (Profile is IfcEllipseProfileDef) { IfcEllipseProfileDef p = Profile as IfcEllipseProfileDef; return(Math.PI * p.SemiAxis1 * p.SemiAxis2); } else if (Profile is IfcLShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcLShapeProfileDef Area is not implemented"); } else if (Profile is IfcTrapeziumProfileDef) { IfcTrapeziumProfileDef p = Profile as IfcTrapeziumProfileDef; return((p.BottomXDim + p.TopXDim) * p.YDim / 2); } else if (Profile is IfcTShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcTShapeProfileDef Area is not implemented"); } else if (Profile is IfcUShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcUShapeProfileDef Area is not implemented"); } else if (Profile is IfcZShapeProfileDef) { // geometry is not clear throw new NotImplementedException("IfcZShapeProfileDef Area is not implemented"); } else if (Profile is IfcAsymmetricIShapeProfileDef) // needs to be tested before IfcIShapeProfileDef { IfcAsymmetricIShapeProfileDef p = Profile as IfcAsymmetricIShapeProfileDef; // bottom flange double bottomflange = p.OverallWidth * p.FlangeThickness; // bottom flange double TopFlangeThickness = p.FlangeThickness; // if not specified differently if (p.TopFlangeThickness.HasValue) { TopFlangeThickness = p.TopFlangeThickness.Value; } double topFlange = p.TopFlangeWidth * TopFlangeThickness; // core double core = (p.OverallDepth - p.FlangeThickness - TopFlangeThickness) * p.WebThickness; double bottomfillets = 0; double topFillets = 0; if (p.FilletRadius.HasValue) { bottomfillets = 2 * ConcaveRightAngleFilletArea(p.FilletRadius.Value); topFillets = bottomfillets; } if (p.TopFlangeFilletRadius.HasValue) { topFillets = 2 * ConcaveRightAngleFilletArea(p.TopFlangeFilletRadius.Value); } return(bottomflange + topFlange + core + bottomfillets + topFillets); } else if (Profile is IfcIShapeProfileDef) { IfcIShapeProfileDef p = Profile as IfcIShapeProfileDef; double flanges = p.OverallWidth * p.FlangeThickness * 2; // top and bottom flanges double core = (p.OverallDepth - (p.FlangeThickness * 2)) * p.WebThickness; double fillets = 0; if (p.FilletRadius.HasValue && p.FilletRadius.Value > 0) { fillets = 4 * ConcaveRightAngleFilletArea(p.FilletRadius.Value); } return(flanges + core + fillets); } else if (Profile is IfcArbitraryOpenProfileDef) { return(0); } return(double.NaN); }