private static List <Face3D> Profiles_FromElevationProfile(this Wall wall) { if (wall == null) { return(null); } if (!ExporterIFCUtils.HasElevationProfile(wall)) { return(null); } IList <CurveLoop> curveLoops = ExporterIFCUtils.GetElevationProfile(wall); if (curveLoops == null) { return(null); } List <Face3D> result = new List <Face3D>(); foreach (CurveLoop curveLoop in curveLoops) { Polygon3D polygon3D = curveLoop.ToSAM_Polygon3D(); if (polygon3D == null) { continue; } result.Add(new Face3D(polygon3D)); } return(result); }
public static List <Face3D> Profiles_Wall(this Wall wall) { if (wall == null) { return(null); } List <Face3D> result = Profiles_FromSketch(wall, !wall.Flipped); if (result != null && result.Count > 0) { return(result); } BoundingBoxXYZ boundingBoxXYZ = wall.get_BoundingBox(null); if (boundingBoxXYZ != null) { LocationCurve locationCurve = wall.Location as LocationCurve; if (locationCurve != null) { ICurve3D curve3D_Location = Convert.ToSAM(locationCurve); IEnumerable <ICurve3D> curves = null; if (curve3D_Location is ISegmentable3D) { curves = ((ISegmentable3D)curve3D_Location).GetSegments().Cast <ICurve3D>(); } else { curves = new List <ICurve3D>() { curve3D_Location } }; double max = UnitUtils.ConvertFromInternalUnits(boundingBoxXYZ.Max.Z, DisplayUnitType.DUT_METERS); Spatial.Plane plane_max = new Spatial.Plane(new Point3D(0, 0, max), new Vector3D(0, 0, 1)); double min = UnitUtils.ConvertFromInternalUnits(boundingBoxXYZ.Min.Z, DisplayUnitType.DUT_METERS); Spatial.Plane plane_min = new Spatial.Plane(new Point3D(0, 0, min), new Vector3D(0, 0, 1)); result = new List <Face3D>(); foreach (ICurve3D curve3D in curves) { if (curve3D == null) { continue; } ICurve3D maxCurve = plane_max.Project(curve3D); ICurve3D minCurve = plane_min.Project(curve3D); Point3D point3D_1 = minCurve.GetEnd(); Point3D point3D_2 = maxCurve.GetStart(); Point3D point3D_3 = maxCurve.GetEnd(); if (point3D_1.Distance(point3D_3) < point3D_1.Distance(point3D_2)) { Point3D point_Temp = point3D_2; maxCurve.Reverse(); point3D_2 = point3D_3; point3D_3 = point_Temp; } List <Point3D> point3Ds = new List <Point3D>() { minCurve.GetStart(), point3D_3, point3D_2, point3D_1 }; if (wall.Flipped) { point3Ds.Reverse(); } result.Add(new Face3D(new Polygon3D(point3Ds))); } if (result != null && result.Count > 0) { return(result); } } } if (!ExporterIFCUtils.HasElevationProfile(wall)) { return(null); } IList <CurveLoop> curveLoops = ExporterIFCUtils.GetElevationProfile(wall); if (curveLoops == null) { return(null); } result = new List <Face3D>(); foreach (CurveLoop curveLoop in curveLoops) { Polygon3D polygon3D = curveLoop.ToSAM_Polygon3D(); if (polygon3D != null) { result.Add(new Face3D(polygon3D)); } } return(result); }