Example #1
0
        public frmGraphView()
        {
            //---------------------------------------------------------------------------------------
            //Remove Debug Asserts from Graph Tool - may have adverse side effects elsewhere though!!
            Debug.Listeners.Clear();
            //---------------------------------------------------------------------------------------
            mdsLayoutSettings = new MdsLayoutSettings();
            sugiyamaSettings  = new SugiyamaLayoutSettings();
            InitializeComponent();
            SuspendLayout();

            viewer.Dock = DockStyle.Fill;
            //Mouse Double Click Handler
            viewer.MouseDoubleClick += Viewer_MouseDoubleClick;
            //Mouse over / Object select Handler
            viewer.ObjectUnderMouseCursorChanged += Viewer_ObjectUnderMouseCursorChanged;
            //Key Press handler
            viewer.KeyPress += Viewer_KeyPress;
            viewer.KeyDown  += Viewer_KeyDown;
            viewer.KeyUp    += Viewer_KeyUp;
            //Add viewer
            Controls.Add(viewer);
            //Make it dock under the top panel
            viewer.BringToFront();
            viewer.OutsideAreaBrush = new SolidBrush(Color.White);
            ResumeLayout();
        }
        MdsLayoutSettings GetMdsLayoutSettings()
        {
            var settings = new MdsLayoutSettings();

            settings.ScaleX *= 3;
            settings.ScaleY *= 3;
            settings.EdgeRoutingSettings.KeepOriginalSpline = true;
            settings.EdgeRoutingSettings.EdgeRoutingMode    = EdgeRoutingMode.Spline;
            settings.IterationsWithMajorization             = _argsParser.OptionIsUsed(NoIterationsWithMajorization) ? 0 : 30;
            if (_argsParser.OptionIsUsed(AllowOverlapsInMds))
            {
                settings.RemoveOverlaps = false;
            }
            if (_argsParser.OptionIsUsed(SequentialRunOption))
            {
                settings.RunInParallel = false;
            }
            if (_argsParser.OptionIsUsed(StraightLineEdgesOption))
            {
                settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.StraightLine;
            }
            if (_argsParser.OptionIsUsed(NoEdgeRoutingOption))
            {
                settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.None;
            }
            //settings.AdjustScale = true;
            return(settings);
        }
        public void Clusterabc()
        {
#if TEST_MSAGL
            DisplayGeometryGraph.SetShowFunctions();
#endif
            var geometryGraph = new GeometryGraph();
            geometryGraph.RootCluster = new Cluster();
            var a = new Node();
            a.BoundaryCurve = CurveFactory.CreateCircle(20, new Point());
            var b = new Node();
            b.BoundaryCurve = CurveFactory.CreateCircle(20, new Point());
            var c = new Node();
            c.BoundaryCurve = CurveFactory.CreateCircle(20, new Point());


            geometryGraph.RootCluster.AddNode(a);
            geometryGraph.RootCluster.AddNode(b);
            geometryGraph.RootCluster.AddNode(c);
            b.AddInEdge(new Edge(a, b));
            c.AddInEdge(new Edge(a, c));
            var mdsLayoutSettings = new MdsLayoutSettings {
                RemoveOverlaps = true, NodeSeparation = 10
            };
            var mdsLayout = new MdsGraphLayout(mdsLayoutSettings, geometryGraph);
            mdsLayout.Run();
            var splineRouter = new SplineRouter(geometryGraph, geometryGraph.Edges, 2,
                                                3,
                                                Math.PI / 6, null);
            splineRouter.Run();

#if TEST_MSAGL
            DisplayGeometryGraph.ShowGraph(geometryGraph);
#endif
        }
Example #4
0
        private static MdsLayoutSettings GetMdsSettings()
        {
            MdsLayoutSettings mSettings = new MdsLayoutSettings();

            mSettings.IterationsWithMajorization = 0;
            mSettings.RemoveOverlaps             = false;
            return(mSettings);
        }
 void MDSLayout(MdsLayoutSettings settings, GeometryGraph component) {
     LayoutAlgorithmHelpers.ComputeDesiredEdgeLengths(settings.EdgeConstraints, 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);
 }
Example #6
0
        MdsLayoutSettings GetMdsLayoutSettings()
        {
            var settings = new MdsLayoutSettings {
                EdgeRoutingSettings = { KeepOriginalSpline = true, EdgeRoutingMode = EdgeRoutingMode.None }
            };

            settings.ScaleX *= 3;
            settings.ScaleY *= 3;
            return(settings);
        }
        /// <summary>
        /// Default constructor
        /// </summary>
        public GViewer()
        {
            mdsLayoutSettings = new MdsLayoutSettings()
            {
                RunInParallel = this.AsyncLayout
            };
            sugiyamaSettings = new SugiyamaLayoutSettings();
            // This call is required by the Windows.Forms Form Designer.
            InitializeComponent();

            BackwardEnabled = false;

            ForwardEnabled = false;

            toolbar.MouseMove += ToolBarMouseMoved;

            Assembly a = Assembly.GetExecutingAssembly();

            foreach (string r in a.GetManifestResourceNames())
            {
                if (r.Contains("hmove.cur"))
                {
                    panGrabCursor = new Cursor(a.GetManifestResourceStream(r));
                }
                else if (r.Contains("oph.cur"))
                {
                    panOpenCursor = new Cursor(a.GetManifestResourceStream(r));
                }
            }

            originalCursor = Cursor;


            panButton.Checked        = false;
            windowZoomButton.Checked = false;

            layoutSettingsButton.ToolTipText = "Configures the layout algorithm settings";

            undoButton.ToolTipText       = "Undo layout editing";
            redoButton.ToolTipText       = "Redo layout editing";
            forwardButton.ToolTipText    = "Forward";
            panButton.ToolTipText        = panButton.Checked ? panButtonToolTipText : PanButtonDisabledToolTipText;
            windowZoomButton.ToolTipText = windowZoomButton.Checked
                                               ? WindowZoomButtonToolTipText
                                               : windowZoomButtonDisabledToolTipText;

            InitDrawingLayoutEditor();

            toolbar.Invalidate();

            SuspendLayout();
            InitPanel();
            Controls.Add(toolbar);
            ResumeLayout();
        }
Example #8
0
        public void TreeGraphMdsLayout()
        {
            GeometryGraph treeGraph = GraphGenerator.GenerateTree(20);

            treeGraph.RootCluster = new Cluster(treeGraph.Nodes);
            var settings = new MdsLayoutSettings {
                ScaleX = 1, ScaleY = 1, RemoveOverlaps = true, PackingAspectRatio = 1.4
            };

            settings.EdgeRoutingSettings = new EdgeRoutingSettings {
                EdgeRoutingMode = EdgeRoutingMode.Spline, ConeAngle = Math.PI / 6, Padding = settings.NodeSeparation / 2.1
            };
            foreach (var v in treeGraph.Nodes)
            {
                v.BoundingBox = new Rectangle(0, 0, new Point(30, 30));
            }
            var layout = new InitialLayoutByCluster(treeGraph, settings);

            double progress = 0.0;

            EventHandler <ProgressChangedEventArgs> handler = (s, e) => progress = e.RatioComplete;

            try
            {
                layout.ProgressChanged += handler;
                layout.Run();
            }
            finally
            {
                layout.ProgressChanged -= handler;
            }

            EnableDebugViewer();
            ShowGraphInDebugViewer(treeGraph);

            const double EdgeLengthDelta = 0.5;

            foreach (var e in treeGraph.Edges)
            {
                Assert.IsNotNull(e.Curve, "Edge curves not populated");
                if (e.Source != e.Target)
                {
                    double actualLength       = (e.Source.Center - e.Target.Center).Length;
                    double actualDesiredRatio = e.Length / actualLength;
                    Assert.AreEqual(1, actualDesiredRatio, EdgeLengthDelta, "Edge length is not correct");
                }
            }

            double aspectRatio = treeGraph.BoundingBox.Width / treeGraph.BoundingBox.Height;

            Assert.AreEqual(settings.PackingAspectRatio, aspectRatio, 1.4, "Aspect ratio too far from desired");

            Assert.AreEqual(1.0, progress, "Progress was never reported as 100%.  Last update was at " + progress + "%");
        }
Example #9
0
        static LayoutAlgorithmSettings PickLayoutAlgorithmSettings(int edges, int nodes)
        {
            LayoutAlgorithmSettings settings;
            const int    sugiaymaTreshold = 200;
            const double bundlingTreshold = 3.0;
            bool         bundling         = nodes != 0 && ((double)edges / nodes >= bundlingTreshold || edges > 100);

            if (nodes < sugiaymaTreshold && edges < sugiaymaTreshold)
            {
                settings = new SugiyamaLayoutSettings();

                if (bundling)
                {
                    settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.SplineBundling;
                }
            }
            else
            {
                MdsLayoutSettings mdsSettings;
                settings = mdsSettings = new MdsLayoutSettings {
                    EdgeRoutingSettings =
                    {
                        EdgeRoutingMode
                            =
                                bundling
                                ? EdgeRoutingMode.SplineBundling
                                : EdgeRoutingMode.Spline
                    }
                };
                if (bundling)
                {
                    settings.EdgeRoutingSettings.BundlingSettings = new BundlingSettings();
                }
                double scale = FigureOutScaleForMdsLayout(nodes);
                mdsSettings.ScaleX = scale;
                mdsSettings.ScaleY = scale;
            }
            return(settings);
        }
Example #10
0
        static void Main(string[] args)
        {
#if TEST_MSAGL
            DisplayGeometryGraph.SetShowFunctions();
#endif
            ArgsParser.ArgsParser argsParser = SetArgsParser(args);
            if (argsParser.OptionIsUsed("-help"))
            {
                Console.WriteLine(argsParser.UsageString());
                Environment.Exit(0);
            }
            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.GetStringOptionValue(ListOfFilesOption);
            if (listOfFilesFile != null)
            {
                ProcessListOfFiles(listOfFilesFile, argsParser);
                return;
            }
            string fileName = argsParser.GetStringOptionValue(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 TEST_MSAGL
                            /*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 TEST_MSAGL
                        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();
            }
            if (!argsParser.OptionIsUsed(QuietOption))
            {
                Application.Run(form);
            }
        }
Example #11
0
            protected override void OnValueChanged(ModelRoot element, LayoutAlgorithm oldValue, LayoutAlgorithm newValue)
            {
                base.OnValueChanged(element, oldValue, newValue);

                if (!element.Store.InUndoRedoOrRollback)
                {
                    // if this is the first time we've been here, cache what's alread there
                    if (oldValue != LayoutAlgorithm.Default && !settingsCache.ContainsKey(oldValue) && element.LayoutAlgorithmSettings != null)
                    {
                        settingsCache[oldValue] = element.LayoutAlgorithmSettings;
                    }

                    // use the prior settings for this layout type if available
                    if (newValue != LayoutAlgorithm.Default && settingsCache.ContainsKey(newValue))
                    {
                        element.LayoutAlgorithmSettings = settingsCache[newValue];
                    }
                    else
                    {
                        // if not, set some defaults that make sense in our context
                        switch (newValue)
                        {
                        case LayoutAlgorithm.Default:
                            element.LayoutAlgorithmSettings = null;
                            return;

                        case LayoutAlgorithm.FastIncremental:
                            FastIncrementalLayoutSettings fastIncrementalLayoutSettings = new FastIncrementalLayoutSettings();
                            element.LayoutAlgorithmSettings = fastIncrementalLayoutSettings;

                            break;

                        case LayoutAlgorithm.MDS:
                            MdsLayoutSettings mdsLayoutSettings = new MdsLayoutSettings();
                            mdsLayoutSettings.ScaleX         = 1;
                            mdsLayoutSettings.ScaleY         = 1;
                            mdsLayoutSettings.AdjustScale    = true;
                            mdsLayoutSettings.RemoveOverlaps = true;
                            element.LayoutAlgorithmSettings  = mdsLayoutSettings;

                            break;

                        case LayoutAlgorithm.Ranking:
                            RankingLayoutSettings rankingLayoutSettings = new RankingLayoutSettings();
                            rankingLayoutSettings.ScaleX    = 1;
                            rankingLayoutSettings.ScaleY    = 1;
                            element.LayoutAlgorithmSettings = rankingLayoutSettings;

                            break;

                        case LayoutAlgorithm.Sugiyama:
                            SugiyamaLayoutSettings sugiyamaLayoutSettings = new SugiyamaLayoutSettings
                            {
                                LayerSeparation = 1,
                                MinNodeHeight   = 1,
                                MinNodeWidth    = 1
                            };

                            element.LayoutAlgorithmSettings = sugiyamaLayoutSettings;

                            break;
                        }

                        element.LayoutAlgorithmSettings.ClusterMargin  = 1;
                        element.LayoutAlgorithmSettings.NodeSeparation = 1;
                        element.LayoutAlgorithmSettings.EdgeRoutingSettings.Padding         = .3;
                        element.LayoutAlgorithmSettings.EdgeRoutingSettings.PolylinePadding = 1.5;
                        element.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.StraightLine;

                        settingsCache[newValue] = element.LayoutAlgorithmSettings;
                    }
                }
            }
Example #12
0
        public static void MDS()
        {
            WriteMessage("Starting test...");

            WriteMessage("Create GeometryGraph");

            GeometryGraph graph = AbcdeGraph();

            //graph.Save("c:\\tmp\\saved.msagl");
            var settings = new MdsLayoutSettings();

            settings.RunInParallel = false;

            settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.Rectilinear;

            LayoutHelpers.CalculateLayout(graph, settings, null);


            WriteMessage("Layout progressed");

            WriteMessage("");
            WriteMessage("Segments A->B");
            //OutputCurve(ab.Curve);

            WriteMessage("");
            WriteMessage("Segments B->C");
            //OutputCurve(bc.Curve);

            WriteMessage("");
            WriteMessage("Segments C->A");
            //OutputCurve(ca.Curve);

            foreach (var node in graph.Nodes)
            {
                WriteMessage(string.Format("{0}: {1} {2}", node.UserData, node.Center.X, node.Center.Y));
            }

            var canvas = HtmlContext.document.getElementById("drawing").As <HtmlCanvasElement>();
            var ctx    = canvas.getContext("2d").As <CanvasRenderingContext2D>();

            var canvasHeight = canvas.height;

            var bounds = calcBounds(graph.Nodes);

            var xScale = canvas.width / bounds.Width;
            var yScale = canvas.height / bounds.Height;

            var xShift = -bounds.Left * xScale;
            var yShift = -(canvas.height - bounds.Top) * yScale;

            WriteMessage(string.Format("Scaling : {0} {1}", xScale, yScale));
            WriteMessage(string.Format("Shifting : {0} {1}", xShift, yShift));

            foreach (var msaglEdge in graph.Edges)
            {
                DrawEdge(ctx, msaglEdge, xShift, yShift, xScale, yScale, canvasHeight);
            }

            foreach (var msaglNode in graph.Nodes)
            {
                DrawNode(ctx, msaglNode, xShift, yShift, xScale, yScale, canvasHeight);
            }
            * /
        }