Esempio n. 1
0
        private static IEnumerable <Point3D> BuildEdgeIntersectionList(List <SolverGeometricObject> solverGeometry)
        {
            var geometry         = solverGeometry;
            var intersectionList = new List <Point3D>();
            var boxes            = new SortedDictionary <int, ShapeBoundBox>();

            foreach (var geometricObject in geometry)
            {
                if (geometricObject.Parent == null)
                {
                    continue;
                }
                if (geometricObject.Builder.Shape == null)
                {
                    continue;
                }
                var transformedShape =
                    geometricObject.Builder.Shape.Located(new TopLocLocation(geometricObject.Builder.Transformation));
                var bndBox = ShapeUtils.ExtractBoundingBox(transformedShape);
                boxes[geometricObject.Parent.Index] = bndBox;
            }

            foreach (var geometricObject in geometry)
            {
                if (geometricObject.Edges.Count == 0)
                {
                    continue;
                }
                if (geometricObject.Edges.Count > 20)
                {
                    continue;
                }
                if (geometricObject.Parent == null)
                {
                    continue;
                }
                if (!boxes.ContainsKey(geometricObject.Parent.Index))
                {
                    continue;
                }
                foreach (var destinationObject in geometry)
                {
                    if (destinationObject.Parent == null)
                    {
                        continue;
                    }
                    if (destinationObject.Edges.Count == 0)
                    {
                        continue;
                    }
                    if (geometricObject.Edges.Count == 1 || destinationObject.Edges.Count == 1)
                    {
                        continue;
                    }
                    if (destinationObject.Edges.Count > 20)
                    {
                        continue;
                    }
                    if (geometricObject.Parent.Index == destinationObject.Parent.Index)
                    {
                        continue;
                    }

                    if (!boxes.ContainsKey(destinationObject.Parent.Index))
                    {
                        continue;
                    }
                    var sourceBox = boxes[geometricObject.Parent.Index];
                    var destBox   = boxes[destinationObject.Parent.Index];
                    if (sourceBox == null || destBox == null)
                    {
                        continue;
                    }
                    if (sourceBox.IsOut(destBox))
                    {
                        continue;
                    }
                    BuildEdgeIntersections(geometricObject, destinationObject, intersectionList);
                }
            }
            foreach (var geometricObject in geometry)
            {
                if (geometricObject.Edges.Count == 0)
                {
                    continue;
                }
                foreach (var destinationObject in geometry)
                {
                    if (destinationObject.Edges.Count == 0)
                    {
                        continue;
                    }
                    if (destinationObject.Builder.Node.Index <= geometricObject.Builder.Node.Index)
                    {
                        continue;
                    }
                    if (geometricObject.Edges.Count == 1 || destinationObject.Edges.Count == 1)
                    {
                        BuildEdgeIntersections(geometricObject, destinationObject, intersectionList);
                    }
                }
            }
            return(intersectionList);
        }