예제 #1
0
        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);
        }
예제 #2
0
        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);
        }