Ejemplo n.º 1
0
        /// <summary>
        /// GraphViz library használata layout generálásra
        /// </summary>
        /// <param name="layoutType">SFDP a legjobb</param>
        public void GenerateLayout(GraphVizWrapper.Enums.RenderingEngine layoutType)
        {
            List <Node> Nodes = GetNodeList();

            if (Nodes.Count < 1)
            {
                return;
            }
            //Cursor = Cursors.WaitCursor;
            double NodeR = XFVM.BaseSize / 2 / Math.Sqrt(Nodes.Count);

            //put all connections into digraph, read by graphviz
            string digraph = "digraph{";

            foreach (Node n in Nodes)
            {
                foreach (ConnVM To in n.GetXF().GetConns())
                {
                    digraph += Nodes.IndexOf(n) + " -> " + Nodes.IndexOf(GetNodeFromXF(To.ConnTo)) + ";";
                }
            }
            digraph += "}";

            //graphviz library to generate layout
            var getStartProcessQuery        = new GraphVizWrapper.Queries.GetStartProcessQuery();
            var getProcessStartInfoQuery    = new GraphVizWrapper.Queries.GetProcessStartInfoQuery();
            var registerLayoutPluginCommand = new GraphVizWrapper.Commands.RegisterLayoutPluginCommand(getProcessStartInfoQuery, getStartProcessQuery);
            var wrapper = new GraphVizWrapper.GraphGeneration(getStartProcessQuery, getProcessStartInfoQuery, registerLayoutPluginCommand);

            wrapper.RenderingEngine = layoutType;//twopi vagy sfdp nez ki legjobban
            string[] output = System.Text.Encoding.Default.GetString(wrapper.GenerateGraph(digraph, GraphVizWrapper.Enums.GraphReturnType.Plain)).Replace('.', ',').Split('\n');

            int rowNr = 0;

            string[] firstRow  = output[rowNr].Split(' ');
            double   outWidth  = Double.Parse(firstRow[2]);
            double   outHeight = Double.Parse(firstRow[3]);

            while (++rowNr < output.Length)
            {
                string[] row = output[rowNr].Split(' ');
                if (row[0] == "node")
                {
                    Node n = Nodes[int.Parse(row[1])];
                    n.PosX = NodeR + (Double.Parse(row[2]) / outWidth) * (Width - 2 * NodeR);
                    n.PosY = NodeR + (Double.Parse(row[3]) / outHeight) * (Height - 2 * NodeR);
                }
                else
                {
                    break;
                }
            }

            updateConnections();
            //Cursor = Cursors.Default;
        }
Ejemplo n.º 2
0
        private void SetLayout(object sender, RoutedEventArgs e)
        {
            GraphVizWrapper.Enums.RenderingEngine sel = GraphVizWrapper.Enums.RenderingEngine.Sfdp;
            string s = ((Fluent.Button)sender).Header.ToString();

            Enum.TryParse((s ?? "Sfdp").ToString(), out sel);
            try
            {
                nodemap_main.GenerateLayout(sel);
                StatusMessageVM.Instance.Show("Graph layout generated");
            }
            catch
            {
                StatusMessageVM.Instance.Show("Error while generating layout");
            }
        }