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; } }
/// <summary> /// </summary> /// <param name="geometryGraph"></param> /// <param name="layoutSettings"></param> /// <param name="edgesToRoute"></param> public static void RouteAndLabelEdges(GeometryGraph geometryGraph, LayoutAlgorithmSettings layoutSettings, IEnumerable<Edge> edgesToRoute) { //todo: what about parent edges!!!! var filteredEdgesToRoute = edgesToRoute.Where(e => ! e.UnderCollapsedCluster()).ToArray(); var ers = layoutSettings.EdgeRoutingSettings; if (ers.EdgeRoutingMode == EdgeRoutingMode.Rectilinear || ers.EdgeRoutingMode == EdgeRoutingMode.RectilinearToCenter) { RectilinearInteractiveEditor.CreatePortsAndRouteEdges( layoutSettings.NodeSeparation/3, layoutSettings.NodeSeparation/3, geometryGraph.Nodes, edgesToRoute, ers.EdgeRoutingMode, true, ers.UseObstacleRectangles, ers.BendPenalty); } else if (ers.EdgeRoutingMode == EdgeRoutingMode.Spline || ers.EdgeRoutingMode==EdgeRoutingMode.SugiyamaSplines) { new SplineRouter(geometryGraph, filteredEdgesToRoute, ers.Padding, ers.PolylinePadding, ers.ConeAngle, null) { ContinueOnOverlaps = true, KeepOriginalSpline = ers.KeepOriginalSpline }.Run(); } else if (ers.EdgeRoutingMode == EdgeRoutingMode.SplineBundling) { var edgeBundlingSettings = ers.BundlingSettings ?? new BundlingSettings(); var bundleRouter = new SplineRouter(geometryGraph, filteredEdgesToRoute, ers.Padding, ers.PolylinePadding, ers.ConeAngle, edgeBundlingSettings) { KeepOriginalSpline = ers.KeepOriginalSpline }; bundleRouter.Run(); if (bundleRouter.OverlapsDetected) { new SplineRouter(geometryGraph, filteredEdgesToRoute, ers.Padding, ers.PolylinePadding, ers.ConeAngle, null) { ContinueOnOverlaps = true, KeepOriginalSpline = ers.KeepOriginalSpline }.Run(); } } else if (ers.EdgeRoutingMode == EdgeRoutingMode.StraightLine) { var router = new StraightLineEdges(filteredEdgesToRoute, ers.Padding); router.Run(); } var elb = new EdgeLabelPlacement(geometryGraph.Nodes, filteredEdgesToRoute); elb.Run(); geometryGraph.UpdateBoundingBox(); }
static void RouteEdges(GeometryGraph graph, FastIncrementalLayoutSettings settings) { if (graph.Edges.Count < 1000) { var router = new SplineRouter(graph, settings.EdgeRoutingSettings.Padding, settings.EdgeRoutingSettings.PolylinePadding, settings.EdgeRoutingSettings.ConeAngle, settings.EdgeRoutingSettings.BundlingSettings); router.Run(); } else { var sr = new StraightLineEdges(graph.Edges, 1); sr.Run(); } }