using System; using System.Linq; using System.Collections.Generic; using Microsoft.Msagl.Core.DataStructures; using Microsoft.Msagl.Core.Geometry; using Microsoft.Msagl.Core.Geometry.Curves; using Microsoft.Msagl.Core.Layout; using Microsoft.Msagl.DebugHelpers; using Microsoft.Msagl.Core.Routing; namespace Microsoft.Msagl.Routing.Spline.Bundling { /// /// this class nudges the edges /// public class HubDebugger { // #if DEBUG && TEST_MSAGL // readonly MetroGraphData mgd; // readonly BundlingSettings bundlingSettings; // static internal void ShowHubs(MetroGraphData mgd, BundlingSettings bundlingSettings, params ICurve[] iCurves // ) { // HubDebugger hd = new HubDebugger(mgd, bundlingSettings); // if (iCurves != null) { // var dc = hd.CreateDebugCurves(iCurves); // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dc); // } // } // // static internal void ShowHubs(MetroGraphData mgd, BundlingSettings bundlingSettings, bool withIdeal) { // if (!withIdeal) return; // // foreach (var v in mgd.Stations) { // ShowHubs(mgd, bundlingSettings, v); // } // } // // static internal void ShowHubs(MetroGraphData mgd, BundlingSettings bundlingSettings, Station highlightedNode) { // HubDebugger hd = new HubDebugger(mgd, bundlingSettings); // List debugCurves = hd.CreateDebugCurves(); // debugCurves.Add(new DebugCurve(100,1, "magenta", CurveFactory.CreateCircle(3, highlightedNode.Position))); // debugCurves.Add(new DebugCurve(100, 0.1, "green", highlightedNode.BoundaryCurve)); // // Console.WriteLine(highlightedNode.SerialNumber); // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(debugCurves); // } // // internal HubDebugger(MetroGraphData mgd, BundlingSettings bundlingSettings) { // this.mgd = mgd; // this.bundlingSettings = bundlingSettings; // } // // internal List CreateDebugCurves(params ICurve[] iCurves) { // List curves = new List(); // curves.AddRange(Obstacles()); // //curves.AddRange(BBoxes()); // // curves.AddRange(Hubs()); // curves.AddRange(Paths()); // //curves.AddRange(Bundles()); // //curves.AddRange(IdealHubs()); // //curves.AddRange(IdealHubsWithNeighbors()); // //curves.AddRange(IdealBundles()); // if (iCurves != null) { // int i = 0; // foreach(var iCurve in iCurves) // if (iCurve != null) // curves.Add(new DebugCurve(100,0.2, DebugCurve.Colors[i++], iCurve)); // } // return curves; // } // // IEnumerable Obstacles() { // return mgd.TightTree.GetAllLeaves().Select(n => new DebugCurve(100,0.5,"black", n)).Concat( // mgd.LooseTree.GetAllLeaves().Select(n => new DebugCurve(100, 0.1, "green", n))); // } // // IEnumerable BBoxes() { // return mgd.Stations.Where(n => n.IsRealNode).Select(n => new DebugCurve("red", CurveFactory.CreateCircle(n.BoundaryCurve.BoundingBox.Diagonal / 2, n.Position))); // } // // IEnumerable GraphNodes() { // var nodes = new Set(mgd.Edges.Select(e => e.SourcePort.Curve).Concat(mgd.Edges.Select(e => e.TargetPort.Curve))); // return nodes.Select(n => new DebugCurve(100, 1, "black", n)); // } // // IEnumerable Hubs() { // return mgd.Stations.Select(station => new DebugCurve(100, 1, "blue", CurveFactory.CreateCircle(Math.Max(station.Radius, 1.0), station.Position))); // } // // IEnumerable IdealHubs() { // return mgd.VirtualNodes().Select(station => new DebugCurve(100, 1, "black", // CurveFactory.CreateCircle(HubRadiiCalculator.CalculateIdealHubRadiusWithNeighbors(mgd, bundlingSettings, station), station.Position))); // } // // IEnumerable IdealHubsWithNeighbors() { // return mgd.VirtualNodes().Select(station => new DebugCurve(200, 1, "black", // CurveFactory.CreateCircle(HubRadiiCalculator.CalculateIdealHubRadiusWithNeighbors(mgd, bundlingSettings, station), station.Position))); // } // // IEnumerable Bundles() { // return mgd.VirtualEdges().Select(pr => new DebugCurve(100, 1, "red", new LineSegment(pr.Item1.Position, pr.Item2.Position))); // } // // IEnumerable IdealBundles() { // List dc = new List(); // foreach (var edge in mgd.VirtualEdges()) { // var node = edge.Item1; // var adj = edge.Item2; // // double width = mgd.GetWidth(node, adj, bundlingSettings.EdgeSeparation); // dc.Add(new DebugCurve(0.1, "black", Intersections.Create4gon(node.Position, adj.Position, width, width))); // } // // return dc; // } // // IEnumerable Paths() { // List dc = new List(); // foreach (var metroline in mgd.Metrolines) { // dc.Add(new DebugCurve(100, 1, "black", metroline.Polyline)); // } // // return dc; // } // #endif /*void SaveAsBitmap(string filename, GViewer gViewer) { int w = (int)Math.Ceiling((double) gViewer.Graph.Width); int h = (int)Math.Ceiling((double) gViewer.Graph.Height); Bitmap bitmap = new Bitmap(w, h, PixelFormat.Format32bppPArgb); using (Graphics graphics = Graphics.FromImage(bitmap)) DrawGeneral(w, h, graphics, gViewer); bitmap.Save(filename); } void DrawGeneral(int w, int h, Graphics graphics, GViewer gViewer) { graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; DrawAll(w, h, graphics, gViewer); } void DrawAll(int w, int h, Graphics graphics, GViewer gViewer) { //fill the whole image graphics.FillRectangle(new SolidBrush(Draw.MsaglColorToDrawingColor(gViewer.Graph.Attr.BackgroundColor)), new RectangleF(0, 0, w, h)); //calculate the transform double s = 1.0; Graph g = gViewer.Graph; double x = 0.5 * w - s * (g.Left + 0.5 * g.Width); double y = 0.5 * h + s * (g.Bottom + 0.5 * g.Height); graphics.Transform = new Matrix((float)s, 0, 0, (float)-s, (float)x, (float)y); Draw.DrawPrecalculatedLayoutObject(graphics, gViewer.DGraph); } */ } }