示例#1
0
        public static global::Topologic.Topology ToTopologic(this ISAMGeometry3D sAMGeometry)
        {
            if (sAMGeometry is Shell)
            {
                global::Topologic.Cell cell = ((Shell)sAMGeometry).ToTopologic_Cell();
                if (cell != null)
                {
                    return(cell);
                }

                return(((Shell)sAMGeometry).ToTopologic());
            }

            return(ToTopologic(sAMGeometry as dynamic));
        }
示例#2
0
        public static T Find <T>(this IEnumerable <Element> elements, ISAMGeometry3D sAMGeometry3D, double min = Tolerance.Distance, double max = Tolerance.MacroDistance) where T : Element
        {
            if (elements == null || sAMGeometry3D == null)
            {
                return(null);
            }

            if (sAMGeometry3D is Point3D)
            {
                return(Find <T>(elements, (Point3D)sAMGeometry3D, min, max));
            }

            if (sAMGeometry3D is ISegmentable3D)
            {
                return(Find <T>(elements, (ISegmentable3D)sAMGeometry3D, min, max));
            }

            return(null);
        }
示例#3
0
        public static T Find <T>(this IEnumerable <Element> elements, Point3D point3D, double min = Tolerance.Distance, double max = Tolerance.MacroDistance) where T : Element
        {
            if (elements == null || point3D == null)
            {
                return(null);
            }

            List <Tuple <T, ISAMGeometry3D, double> > tuples = new List <Tuple <T, ISAMGeometry3D, double> >();

            foreach (Element element in elements)
            {
                T t = element as T;
                if (t == null)
                {
                    continue;
                }

                ISAMGeometry3D sAMGeometry3D = element?.Location();
                if (sAMGeometry3D == null)
                {
                    continue;
                }

                if (sAMGeometry3D is Point3D)
                {
                    Point3D point3D_Temp = (Point3D)sAMGeometry3D;
                    double  distance     = point3D.Distance(point3D_Temp);
                    if (distance <= min)
                    {
                        return(t);
                    }

                    if (distance > max)
                    {
                        continue;
                    }

                    tuples.Add(new Tuple <T, ISAMGeometry3D, double>(t, point3D_Temp, distance));
                }
                else if (sAMGeometry3D is ISegmentable3D)
                {
                    ISegmentable3D segmentable3D = (ISegmentable3D)sAMGeometry3D;
                    double         distance      = segmentable3D.Distance(point3D);
                    if (distance <= min)
                    {
                        return(t);
                    }

                    if (distance > max)
                    {
                        continue;
                    }

                    tuples.Add(new Tuple <T, ISAMGeometry3D, double>(t, segmentable3D, distance));
                }
            }

            if (tuples == null || tuples.Count == 0)
            {
                return(null);
            }

            if (tuples.Count == 1)
            {
                return(tuples[0].Item1);
            }

            tuples.Sort((x, y) => x.Item3.CompareTo(y.Item3));

            return(tuples.First().Item1);
        }
示例#4
0
        public static T Find <T>(this IEnumerable <Element> elements, ISegmentable3D segmentable3D, double min = Tolerance.Distance, double max = Tolerance.MacroDistance) where T : Element
        {
            if (elements == null || segmentable3D == null)
            {
                return(null);
            }

            List <Tuple <T, ISAMGeometry3D, double> > tuples = new List <Tuple <T, ISAMGeometry3D, double> >();

            foreach (Element element in elements)
            {
                T t = element as T;
                if (t == null)
                {
                    continue;
                }

                ISAMGeometry3D sAMGeometry3D = element?.Location();
                if (sAMGeometry3D == null)
                {
                    continue;
                }

                if (sAMGeometry3D is Point3D)
                {
                    Point3D point3D_Temp = (Point3D)sAMGeometry3D;
                    double  distance     = segmentable3D.Distance(point3D_Temp);
                    if (distance <= min)
                    {
                        return(t);
                    }

                    if (distance > max)
                    {
                        continue;
                    }

                    tuples.Add(new Tuple <T, ISAMGeometry3D, double>(t, point3D_Temp, distance));
                }
                else if (sAMGeometry3D is ISegmentable3D)
                {
                    ISegmentable3D segmentable3D_Temp = (ISegmentable3D)sAMGeometry3D;
                    double         distance           = segmentable3D.Distance(segmentable3D_Temp, min);
                    if (distance > max)
                    {
                        continue;
                    }

                    List <Point3D> point3Ds_Temp = segmentable3D_Temp.GetPoints();
                    List <Point3D> point3Ds      = segmentable3D.GetPoints();

                    List <double> distances_Temp = point3Ds_Temp.ConvertAll(x => segmentable3D.Distance(x));
                    List <double> distances      = point3Ds.ConvertAll(x => segmentable3D.Distance(x));

                    if (distance <= min && distances_Temp.TrueForAll(x => x < min) && distances.TrueForAll(x => x < min))
                    {
                        return(t);
                    }

                    int count = (distances_Temp.Count + distances.Count) - (distances_Temp.FindAll(x => x < min).Count + distances.FindAll(x => x < min).Count);

                    tuples.Add(new Tuple <T, ISAMGeometry3D, double>(t, segmentable3D, count));
                }
            }

            if (tuples == null || tuples.Count == 0)
            {
                return(null);
            }

            if (tuples.Count == 1)
            {
                return(tuples[0].Item1);
            }

            tuples.Sort((x, y) => x.Item3.CompareTo(y.Item3));

            return(tuples.First().Item1);
        }