/// <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; }
public GraphGenerator() { var getStartProcessQuery = new GetStartProcessQuery(); var getProcessStartInfoQuery = new GetProcessStartInfoQuery(); var registerLayoutPluginCommand = new RegisterLayoutPluginCommand(getProcessStartInfoQuery, getStartProcessQuery); _wrapper = new GraphGeneration(getStartProcessQuery, getProcessStartInfoQuery, registerLayoutPluginCommand); }
void InitialiseDotWrapper() { var getStartProcessQuery = new GetStartProcessQuery(); var getProcessStartInfoQuery = new GetProcessStartInfoQuery(); var registerLayoutPluginCommand = new RegisterLayoutPluginCommand(getProcessStartInfoQuery, getStartProcessQuery); wrapper = new GraphGeneration(getStartProcessQuery, getProcessStartInfoQuery, registerLayoutPluginCommand); }
public async Task<List<byte[]>> DrawGraph(List<int>[][] orginalAutomaton, List<int>[][] foundAutomaton) { List<byte[]> graphs = new List<byte[]>(); await Task.Run(() => { var getStartProcessQuery = new GetStartProcessQuery(); var getProcessStartInfoQuery = new GetProcessStartInfoQuery(); var registerLayoutPluginCommand = new RegisterLayoutPluginCommand(getProcessStartInfoQuery, getStartProcessQuery); // GraphGeneration can be injected via the IGraphGeneration interface var wrapper = new GraphGeneration(getStartProcessQuery, getProcessStartInfoQuery, registerLayoutPluginCommand); byte[] orginal = wrapper.GenerateGraph(GenerateDotString(orginalAutomaton), Enums.GraphReturnType.Png); byte[] found = wrapper.GenerateGraph(GenerateDotString(foundAutomaton), Enums.GraphReturnType.Png); graphs.Add(orginal); graphs.Add(found); } ); return graphs; }