Exemple #1
0
        protected FloatingPort MakeSingleRelativeObstaclePort(RectilinearEdgeRouter router, Shape obstacle, Point offset)
        {
            var port = MakeSingleRelativeObstaclePort(obstacle, offset);

            router.UpdateObstacle(obstacle); // Port changes are now auto-detected
            return(port);
        }
Exemple #2
0
        protected FloatingPort MakeAbsoluteObstaclePort(RectilinearEdgeRouter router, Shape obstacle, Point location)
        {
            Validate.IsNotNull(router, "Router should not be null");
            var port = MakeAbsoluteObstaclePort(obstacle, location);

            router.UpdateObstacle(obstacle); // Port changes are now auto-detected
            return(port);
        }
Exemple #3
0
        protected EdgeGeometry AddRoutingPorts(RectilinearEdgeRouter router, Port sourcePort, Port targetPort
                                               )
        {
            Validate.IsNotNull(router, "Router should not be null");
            var eg = CreateRouting(sourcePort, targetPort);

            router.AddEdgeGeometryToRoute(eg);
            return(eg);
        }
Exemple #4
0
        protected EdgeGeometry AddRoutingPorts(RectilinearEdgeRouter router, IList <Shape> obstacles, int source, int target
                                               )
        {
            Validate.IsNotNull(router, "Router should not be null");
            Validate.IsNotNull(obstacles, "Obstacles should not be null");
            var eg = CreateRouting(obstacles[source].Ports.First(), obstacles[target].Ports.First());

            router.AddEdgeGeometryToRoute(eg);
            return(eg);
        }
Exemple #5
0
        protected EdgeGeometry AddRoutingPorts(RectilinearEdgeRouter router, Port sourcePort, Port targetPort,
                                               IEnumerable <Point> waypoints = null)
        {
            Validate.IsNotNull(router, "Router should not be null");
            var eg = CreateRouting(sourcePort, targetPort);

            eg.Waypoints = waypoints;
            router.AddEdgeGeometryToRoute(eg);
            return(eg);
        }
Exemple #6
0
        internal Port GetPort(RectilinearEdgeRouter router, IDictionary <Shape, Port> ports, Shape shape)
        {
            // Because of freeOports, we can't just use the shape.Ports collection.
            Port port;

            if (!ports.TryGetValue(shape, out port))
            {
                port         = MakeAbsoluteObstaclePort(router, shape, shape.BoundingBox.Center);
                ports[shape] = port;
            }
            return(port);
        }
Exemple #7
0
        static void DemoEdgeRouterHelper(GeometryGraph graph)
        {
            DemoRoutingFromPortToPort(graph);

            var router = new SplineRouter(graph, 3, 3, Math.PI / 6, null);


            router.Run();
#if TEST
            LayoutAlgorithmSettings.ShowGraph(graph);
#endif

            var rectRouter = new RectilinearEdgeRouter(graph, 3, 3, true);
            rectRouter.Run();
#if TEST
            LayoutAlgorithmSettings.ShowGraph(graph);
#endif
        }
        internal static void RouteEdges(GeometryGraph component, LayoutAlgorithmSettings settings, CancelToken cancelToken)
        {
            EdgeRoutingMode mode = settings.EdgeRoutingSettings.EdgeRoutingMode;

            // Use straight line routing on very large graphs otherwise it is too slow
            if (component.Nodes.Count >= 2000)
            {
                mode = EdgeRoutingMode.StraightLine;
            }

            switch (mode)
            {
            case EdgeRoutingMode.Spline:
                var splineRouter = new SplineRouter(
                    component,
                    settings.EdgeRoutingSettings.Padding,
                    settings.NodeSeparation, settings.EdgeRoutingSettings.ConeAngle, null);
                splineRouter.Run(cancelToken);
                break;

            case EdgeRoutingMode.SplineBundling:
                splineRouter = new SplineRouter(
                    component,
                    settings.EdgeRoutingSettings.Padding,
                    settings.NodeSeparation / 20, settings.EdgeRoutingSettings.ConeAngle,
                    new BundlingSettings());
                splineRouter.Run(cancelToken);
                break;

            case EdgeRoutingMode.Rectilinear:
                double edgePadding           = settings.EdgeRoutingSettings.Padding;
                double cornerRadius          = settings.EdgeRoutingSettings.CornerRadius;
                var    rectilinearEdgeRouter = new RectilinearEdgeRouter(component, edgePadding, cornerRadius,
                                                                         true);
                rectilinearEdgeRouter.Run(cancelToken);
                break;

            case EdgeRoutingMode.StraightLine:
                var router = new StraightLineEdges(component.Edges,
                                                   settings.EdgeRoutingSettings.Padding);
                router.Run(cancelToken);
                break;
            }
        }
        public void SimpleClusterGraphRectilinear()
        {
            var g       = new GeometryGraph();
            var node0   = new Node(CurveFactory.CreateRectangle(10, 10, new Point()), 0);
            var node1   = new Node(CurveFactory.CreateRectangle(10, 10, new Point()), 1);
            var cluster = new Cluster(new[] { node1 });

            cluster.UserData      = 2;
            cluster.BoundaryCurve = CurveFactory.CreateRectangle(10, 10, new Point());
            var edge = new Edge(node0, node1)
            {
                Length = 100
            };

            g.Nodes.Add(node0);
            g.Nodes.Add(node1);
            g.Edges.Add(edge);
            var cluster2 = new Cluster(new[] { node0 }, new[] { cluster });

            cluster2.UserData      = 3;
            cluster2.BoundaryCurve = CurveFactory.CreateRectangle(10, 10, new Point());
            g.RootCluster          = cluster2;
            InitialLayout initialLayout = new InitialLayout(g, new FastIncrementalLayoutSettings()
            {
                AvoidOverlaps = true
            });

            initialLayout.Run();

            RectilinearEdgeRouter router = new RectilinearEdgeRouter(g, 1, 1, false);

            router.Run();
            EnableDebugViewer();
            ShowGraphInDebugViewer(g);
            var bb0 = node0.BoundingBox;

            bb0.Pad(1);
            Assert.IsTrue(bb0.Contains(edge.EdgeGeometry.Curve.Start));
            var bb1 = node1.BoundingBox;

            bb1.Pad(1);
            Assert.IsTrue(bb1.Contains(edge.EdgeGeometry.Curve.End));
        }
        static void DemoEdgeRouterHelper(GeometryGraph graph)
        {
            DemoRoutingFromPortToPort(graph);

            var bundlingSettings = new BundlingSettings();
            // set bundling settings to null to disable the bundling of the edges

            var router = new SplineRouter(graph, 3, 3, Math.PI / 6, bundlingSettings);


            router.Run();
#if TEST
            LayoutAlgorithmSettings.ShowGraph(graph);
#endif

            var rectRouter = new RectilinearEdgeRouter(graph, 3, 3, true);
            rectRouter.Run();
#if TEST
            LayoutAlgorithmSettings.ShowGraph(graph);
#endif
        }
Exemple #11
0
        private void ApplyLayout(GeometryGraph geometryGraph)
        {
            InitialLayout initialLayout = new InitialLayout(geometryGraph,
                                                            new FastIncrementalLayoutSettings()
            {
                AvoidOverlaps = true
            });

            initialLayout.Run();

            RectilinearEdgeRouter router = new RectilinearEdgeRouter(geometryGraph, 1, 1, false);

            router.Run();

            foreach (var msNode in geometryGraph.Nodes)
            {
                Entity entity = (Entity)msNode.UserData;
                AddPositionComponent(entity, msNode.BoundingBox.LeftTop);

                Console.WriteLine($"{entity.Name} is at {msNode.BoundingBox.LeftTop}");
            }
        }