/// <summary> /// Calculates the graph layout /// </summary> /// <exception cref="CancelException">Thrown when the layout is canceled.</exception> #else /// <summary> /// Calculates the graph layout /// </summary> /// <exception cref="System.OperationCanceledException">Thrown when the layout is canceled.</exception> #endif public static void CalculateLayout(GeometryGraph geometryGraph, LayoutAlgorithmSettings settings, CancelToken cancelToken) { Console.WriteLine("starting CalculateLayout"); if (settings is RankingLayoutSettings) { var rankingLayoutSettings = settings as RankingLayoutSettings; var rankingLayout = new RankingLayout(rankingLayoutSettings, geometryGraph); rankingLayout.Run(cancelToken); RouteAndLabelEdges(geometryGraph, settings, geometryGraph.Edges); } else if (settings is MdsLayoutSettings) { var mdsLayoutSettings = settings as MdsLayoutSettings; var mdsLayout = new MdsGraphLayout(mdsLayoutSettings, geometryGraph); mdsLayout.Run(cancelToken); if (settings.EdgeRoutingSettings.EdgeRoutingMode != EdgeRoutingMode.None) RouteAndLabelEdges(geometryGraph, settings, geometryGraph.Edges); } else if (settings is FastIncrementalLayoutSettings) { var incrementalSettings = settings as FastIncrementalLayoutSettings; incrementalSettings.AvoidOverlaps = true; var initialLayout = new InitialLayout(geometryGraph, incrementalSettings); initialLayout.Run(cancelToken); if (settings.EdgeRoutingSettings.EdgeRoutingMode != EdgeRoutingMode.None) RouteAndLabelEdges(geometryGraph, settings, geometryGraph.Edges); //incrementalSettings.IncrementalRun(geometryGraph); } else { var sugiyamaLayoutSettings = settings as SugiyamaLayoutSettings; if (sugiyamaLayoutSettings != null) ProcessSugiamaLayout(geometryGraph, sugiyamaLayoutSettings, cancelToken); else { Debug.Assert(settings is LgLayoutSettings); LayoutLargeGraphWithLayers(geometryGraph, settings, cancelToken); } } }
/// <summary> /// Executes the algorithm. /// </summary> /// <summary> /// Executes the actual algorithm. /// </summary> protected override void RunInternal() { var g = new GeometryGraph(); foreach (var v in graph.Nodes) { Debug.Assert(!(v is Cluster)); var u = new Node(v.BoundaryCurve.Clone()) { UserData = v }; v.AlgorithmData = new PivotMDSNodeWrap(u); g.Nodes.Add(u); } double avgLength = 0; foreach (var e in graph.Edges) { avgLength += e.Length; if (e.Source is Cluster || e.Target is Cluster) { continue; } var u = e.Source.AlgorithmData as PivotMDSNodeWrap; var v = e.Target.AlgorithmData as PivotMDSNodeWrap; var ee = new Edge(u.node, v.node) { Length = e.Length }; g.Edges.Add(ee); } if (graph.Edges.Count != 0) { avgLength /= graph.Edges.Count; } else { avgLength = 100; } // create edges from the children of each parent cluster to the parent cluster node foreach (var c in graph.RootCluster.AllClustersDepthFirst()) { if (c == graph.RootCluster) { continue; } var u = new Node(CurveFactory.CreateRectangle(10, 10, new Point())); u.UserData = c; c.AlgorithmData = new PivotMDSNodeWrap(u); g.Nodes.Add(u); foreach (var v in c.Nodes.Concat(from cc in c.Clusters select(Node) cc)) { var vv = v.AlgorithmData as PivotMDSNodeWrap; g.Edges.Add(new Edge(u, vv.node) { Length = avgLength }); } } // create edges between clusters foreach (var e in graph.Edges) { if (e.Source is Cluster || e.Target is Cluster) { var u = e.Source.AlgorithmData as PivotMDSNodeWrap; var v = e.Target.AlgorithmData as PivotMDSNodeWrap; var ee = new Edge(u.node, v.node) { Length = e.Length }; g.Edges.Add(ee); } } // with 0 majorization iterations we just do PivotMDS MdsLayoutSettings settings = new MdsLayoutSettings { ScaleX = this.Scale, ScaleY = this.Scale, IterationsWithMajorization = 0, RemoveOverlaps = false, AdjustScale = false }; MdsGraphLayout mdsLayout = new MdsGraphLayout(settings, g); this.RunChildAlgorithm(mdsLayout, 1.0); g.UpdateBoundingBox(); foreach (var v in graph.Nodes) { var m = v.AlgorithmData as PivotMDSNodeWrap; v.Center = m.node.Center; } }
void MDSLayout(MdsLayoutSettings settings, GeometryGraph component) { LayoutAlgorithmHelpers.ComputeDesiredEdgeLengths(settings.IdealEdgeLength, component); var layout = new MdsGraphLayout(settings, component); layout.Run(this.CancelToken); InitialLayoutHelpers.RouteEdges(component, settings, this.CancelToken); InitialLayoutHelpers.PlaceLabels(component, this.CancelToken); InitialLayoutHelpers.FixBoundingBox(component, settings); }
static void Main(string[] args) { #if DEBUG DisplayGeometryGraph.SetShowFunctions(); #endif ArgsParser.ArgsParser argsParser = SetArgsParser(args); if (argsParser.OptionIsUsed(PolygonDistanceTestOption)) TestPolygonDistance(); else if (argsParser.OptionIsUsed(TestCdtThreaderOption)) TestCdtThreader(); else if (argsParser.OptionIsUsed(RandomBundlingTest)) RandomBundlingTests.RsmContent(); bundling = argsParser.OptionIsUsed(BundlingOption); var gviewer = new GViewer(); gviewer.MouseMove += Draw.GviewerMouseMove; if(argsParser.OptionIsUsed(FdOption)) { TestFD(); gviewer.CurrentLayoutMethod = LayoutMethod.IcrementalLayout; } Form form = CreateForm(null, gviewer); if (argsParser.OptionIsUsed(AsyncLayoutOption)) gviewer.AsyncLayout = true; string listOfFilesFile = argsParser.GetValueOfOptionWithAfterString(ListOfFilesOption); if (listOfFilesFile != null) { ProcessListOfFiles(listOfFilesFile, argsParser); return; } string fileName = argsParser.GetValueOfOptionWithAfterString(FileOption); string ext = Path.GetExtension(fileName); if (ext != null) { ext = ext.ToLower(); if (ext == ".dot") { ProcessDotFile(gviewer, argsParser, fileName); } else { if (ext == ".geom") { GeometryGraph geometryGraph = GeometryGraphReader.CreateFromFile(fileName); geometryGraph.Margins = 10; FixHookPorts(geometryGraph); // if (argsParser.OptionIsUsed(BundlingOption)) { for (int i = 0; i < 1; i++) { #if DEBUG /*DisplayGeometryGraph.ShowGraph(geometryGraph); var l = new List<DebugCurve>(); l.AddRange(geometryGraph.Nodes.Select(n=>new DebugCurve(100,1,"black",n.BoundaryCurve))); l.AddRange(geometryGraph.Edges.Select(e=>new DebugCurve(100,1,"black", new LineSegment(e.Source.Center,e.Target.Center)))); foreach (var cl in geometryGraph.RootCluster.AllClustersDepthFirst()) { l.Add(new DebugCurve(100,2,"blue",cl.BoundaryCurve)); foreach (var node in cl.Nodes) l.Add(new DebugCurve(100, 2, "brown", node.BoundaryCurve)); foreach (var e in cl.Edges) l.Add(new DebugCurve(100, 2, "pink", new LineSegment(e.Source.Center, e.Target.Center))); } DisplayGeometryGraph.ShowDebugCurves(l.ToArray());*/ #endif BundlingSettings bs = GetBundlingSettings(argsParser); double loosePadding; double tightPadding = GetPaddings(argsParser, out loosePadding); if (argsParser.OptionIsUsed(MdsOption)) { var mdsLayoutSettings = new MdsLayoutSettings {RemoveOverlaps = true, NodeSeparation = loosePadding*3}; var mdsLayout = new MdsGraphLayout(mdsLayoutSettings, geometryGraph); mdsLayout.Run(); } else { if (argsParser.OptionIsUsed(FdOption)) { var settings = new FastIncrementalLayoutSettings {AvoidOverlaps = true}; (new InitialLayout(geometryGraph, settings)).Run(); } } var splineRouter = new SplineRouter(geometryGraph, geometryGraph.Edges, tightPadding, loosePadding, Math.PI/6, bs); splineRouter.Run(); } #if DEBUG DisplayGeometryGraph.ShowGraph(geometryGraph); #endif return; } else { if (ext == ".msagl") { Graph graph = Graph.Read(fileName); // DisplayGeometryGraph.ShowGraph(graph.GeometryGraph); if (graph != null) { if (argsParser.OptionIsUsed(BundlingOption)) { BundlingSettings bs = GetBundlingSettings(argsParser); double loosePadding; double tightPadding = GetPaddings(argsParser, out loosePadding); var br = new SplineRouter(graph.GeometryGraph, tightPadding, loosePadding, Math.PI/6, bs); br.Run(); // DisplayGeometryGraph.ShowGraph(graph.GeometryGraph); } } gviewer.NeedToCalculateLayout = false; gviewer.Graph = graph; gviewer.NeedToCalculateLayout = true; } } } } else if (argsParser.OptionIsUsed(TestCdtOption)) { Triangulation(argsParser.OptionIsUsed(ReverseXOption)); Environment.Exit(0); } else if (argsParser.OptionIsUsed(TestCdtOption0)) { TestTriangulationOnSmallGraph(argsParser); Environment.Exit(0); } else if (argsParser.OptionIsUsed(TestCdtOption2)) { TestTriangulationOnPolys(); Environment.Exit(0); } else if (argsParser.OptionIsUsed(TestCdtOption1)) { ThreadThroughCdt(); Environment.Exit(0); } else if (argsParser.OptionIsUsed(ConstraintsTestOption)) TestGraphWithConstraints(); Application.Run(form); }
static void LoadGeomFile(string s, EdgeRoutingSettings edgeRoutingSettings, bool show) { LayoutAlgorithmSettings settings; GeometryGraph geomGraph = GeometryGraphReader.CreateFromFile(s, out settings); if (geomGraph == null) { //Opens file "data.xml" and deserializes the object from it. var stream = File.Open(s, FileMode.Open); var formatter = new BinaryFormatter(); geomGraph = (GeometryGraph) formatter.Deserialize(stream); geomGraph.RootCluster = new Cluster(); stream.Close(); } geomGraph.UpdateBoundingBox(); if (FormStuff.initialLayout) { var l = new List<Cluster>(); l.Add(geomGraph.RootCluster); var il = new InitialLayoutByCluster(geomGraph, new FastIncrementalLayoutSettings()); il.Run(); } else if (mds) { var mdsSettings = new MdsLayoutSettings { IterationsWithMajorization = 21,ScaleX = 1, ScaleY=1, RemoveOverlaps = true }; var mdslayout = new MdsGraphLayout(mdsSettings, geomGraph); mdslayout.Run(); var router = new SplineRouter(geomGraph, 1, 20, Math.PI / 6, edgeRoutingSettings.BundlingSettings); router.Run(); } else { var sugiyamaSettings = (SugiyamaLayoutSettings) settings; if (edgeRoutingSettings.EdgeRoutingMode == EdgeRoutingMode.Rectilinear || edgeRoutingSettings.EdgeRoutingMode == EdgeRoutingMode.RectilinearToCenter) { RouteRectEdgesOfGeomGraph(edgeRoutingSettings.EdgeRoutingMode, true, edgeRoutingSettings.UseObstacleRectangles, edgeRoutingSettings.BendPenalty, geomGraph, sugiyamaSettings); } else { const double angle = 30*Math.PI/180; var router = new SplineRouter(geomGraph, 1, 20, angle, edgeRoutingSettings.BundlingSettings); router.Run(); TestPadding(geomGraph); } } #if DEBUG if (show) { geomGraph.UpdateBoundingBox(); var b = geomGraph.BoundingBox; b.Pad(40); geomGraph.BoundingBox = b; DisplayGeometryGraph.ShowGraph(geomGraph); } #endif }
/// <summary> /// Executes the algorithm. /// </summary> /// <summary> /// Executes the actual algorithm. /// </summary> protected override void RunInternal() { var g = new GeometryGraph(); foreach (var v in graph.Nodes) { Debug.Assert(!(v is Cluster)); var u = new Node(v.BoundaryCurve.Clone()) { UserData = v }; v.AlgorithmData = new PivotMDSNodeWrap(u); g.Nodes.Add(u); } double avgLength = 0; foreach (var e in graph.Edges) { avgLength += e.Length; if (e.Source is Cluster || e.Target is Cluster) continue; var u = e.Source.AlgorithmData as PivotMDSNodeWrap; var v = e.Target.AlgorithmData as PivotMDSNodeWrap; var ee = new Edge(u.node, v.node) { Length = e.Length }; g.Edges.Add(ee); } if (graph.Edges.Count != 0) { avgLength /= graph.Edges.Count; } else { avgLength = 100; } // create edges from the children of each parent cluster to the parent cluster node foreach (var c in graph.RootCluster.AllClustersDepthFirst()) { if (c == graph.RootCluster) continue; var u = new Node(CurveFactory.CreateRectangle(10, 10, new Point())); u.UserData = c; c.AlgorithmData = new PivotMDSNodeWrap(u); g.Nodes.Add(u); foreach (var v in c.Nodes.Concat(from cc in c.Clusters select (Node)cc)) { var vv = v.AlgorithmData as PivotMDSNodeWrap; g.Edges.Add(new Edge(u, vv.node) { Length = avgLength }); } } // create edges between clusters foreach (var e in graph.Edges) { if (e.Source is Cluster || e.Target is Cluster) { var u = e.Source.AlgorithmData as PivotMDSNodeWrap; var v = e.Target.AlgorithmData as PivotMDSNodeWrap; var ee = new Edge(u.node, v.node) { Length = e.Length }; g.Edges.Add(ee); } } // with 0 majorization iterations we just do PivotMDS MdsLayoutSettings settings = new MdsLayoutSettings { ScaleX = this.Scale, ScaleY = this.Scale, IterationsWithMajorization = 0, RemoveOverlaps = false, AdjustScale = false }; MdsGraphLayout mdsLayout = new MdsGraphLayout(settings, g); this.RunChildAlgorithm(mdsLayout, 1.0); g.UpdateBoundingBox(); foreach (var v in graph.Nodes) { var m = v.AlgorithmData as PivotMDSNodeWrap; v.Center = m.node.Center; } }