/// <summary> /// Write the graph description to the file. /// </summary> /// <param name="path">File name.</param> public override void Write(string path) { using (var writer = new StreamWriter(path, false)) { writer.WriteLine($"digraph {Name}"); writer.WriteLine("{"); //default attribute values DotWriteHelper.WriteLineIndent(writer, "node [ fontsize=8, style=\"filled, rounded\", fillcolor=transparent ];\n", 1); foreach (var n in nodes.Values) { DotWriteHelper.Indent(writer, 1); WriteNode(writer, n); } writer.WriteLine(); foreach (var e in edges) { DotWriteHelper.Indent(writer, 1); WriteEdge(writer, e); } if (Legend != null) { writer.WriteLine(); AddLegend(writer); } writer.WriteLine("}"); } }
private void AddLegend(StreamWriter writer) { int count; DotWriteHelper.WriteLineIndent(writer, "rankdir=LR;", 1); DotWriteHelper.WriteLineIndent(writer, "subgraph legend", 1); DotWriteHelper.WriteLineIndent(writer, "{", 1); DotWriteHelper.WriteLineIndent(writer, "node [ shape=none ];", 2); count = 0; DotWriteHelper.WriteLineIndent(writer, "key1", 2); DotWriteHelper.WriteLineIndent(writer, "[", 2); DotWriteHelper.WriteLineIndent(writer, "label=<", 3); DotWriteHelper.WriteLineIndent(writer, "<table border = \"0\" cellpadding = \"2\" cellspacing = \"0\" cellborder = \"0\">", 4); foreach (var item in Legend.Items) { DotWriteHelper.WriteLineIndent(writer, $"<tr><td align=\"right\" port=\"tmp_{count}\">{item.Label}</td></tr>", 5); count++; } DotWriteHelper.WriteLineIndent(writer, "</table>", 4); DotWriteHelper.WriteLineIndent(writer, ">", 3); DotWriteHelper.WriteLineIndent(writer, "]", 2); count = 0; DotWriteHelper.WriteLineIndent(writer, "key2", 2); DotWriteHelper.WriteLineIndent(writer, "[", 2); DotWriteHelper.WriteLineIndent(writer, "label=<", 3); DotWriteHelper.WriteLineIndent(writer, "<table border = \"0\" cellpadding = \"2\" cellspacing = \"0\" cellborder = \"0\">", 4); foreach (var item in Legend.Items) { DotWriteHelper.WriteLineIndent(writer, $"<tr><td port=\"tmp_{count}\"> </td></tr>", 5); count++; } DotWriteHelper.WriteLineIndent(writer, "</table>", 4); DotWriteHelper.WriteLineIndent(writer, ">", 3); DotWriteHelper.WriteLineIndent(writer, "]", 2); count = 0; foreach (var item in Legend.Items) { DotWriteHelper.WriteIndent(writer, $"key1: tmp_{count}: e->key2: tmp_{count}: w [ ", 2); DotWriteHelper.WriteAttribute(writer, "penwidth", 0, item.LineWidth); DotWriteHelper.WriteAttribute(writer, "color", Color.Empty, item.LineColor, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "style", EdgeStyle.Normal, item.Style, s => ((EdgeStyle)s).GetStringValue()); writer.WriteLine("]"); count++; } DotWriteHelper.WriteLineIndent(writer, "}", 1); }
private void WriteNode(StreamWriter writer, Node node) { writer.Write($"{node.ID} [ "); DotWriteHelper.WriteAttribute(writer, "label", null, node.Label); DotWriteHelper.WriteAttribute(writer, "fontsize", 0, node.FontSize); DotWriteHelper.WriteAttribute(writer, "fontcolor", Color.Empty, node.FontColor, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "fillcolor", Color.Empty, node.FillColor, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "color", Color.Empty, node.BorderColor, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "shape", ShapeStyle.Empty, node.Shape, s => ((ShapeStyle)s).GetStringValue()); DotWriteHelper.WriteAttribute(writer, "penwidth", 0, node.BorderWidth); writer.WriteLine("];"); }
private void WriteEdge(StreamWriter writer, Edge edge) { writer.Write($"{edge.Source.ID} -> {edge.Target.ID} [ "); DotWriteHelper.WriteAttribute(writer, "label", null, edge.Label); DotWriteHelper.WriteAttribute(writer, "fontsize", 0, edge.FontSize); DotWriteHelper.WriteAttribute(writer, "fontcolor", Color.Empty, edge.FontColor, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "color", Color.Empty, edge.Color, c => ((Color)c).GetHexString()); DotWriteHelper.WriteAttribute(writer, "arrowtail", ArrowheadStyle.Normal, edge.ArrowheadAtSource, s => ((ArrowheadStyle)s).GetStringValue()); DotWriteHelper.WriteAttribute(writer, "arrowhead", ArrowheadStyle.Normal, edge.ArrowheadAtTarget, s => ((ArrowheadStyle)s).GetStringValue()); DotWriteHelper.WriteAttribute(writer, "style", EdgeStyle.Normal, edge.Style, s => ((EdgeStyle)s).GetStringValue()); DotWriteHelper.WriteAttribute(writer, "penwidth", 0, edge.Width); DotWriteHelper.WriteAttribute(writer, "dir", false, edge.Reverse, _ => "back"); writer.WriteLine("];"); }