2 using System.Collections.Generic;
7 namespace UnityEditor.Dot
11 public void AddElement(DotElement element)
14 throw new ArgumentNullException();
16 if (element is DotEdge)
18 var edge = element as DotEdge;
19 AddElement(edge.From);
23 if (!elements.ContainsKey(element))
24 elements[element] = elements.Count;
27 public string GenerateDotString()
29 var nodes = elements.Where(kvp => kvp.Key is DotNode).OrderBy(kvp => kvp.Value);
30 var edges = elements.Where(kvp => kvp.Key is DotEdge).Select(kvp => new KeyValuePair<DotEdge, int>((DotEdge)(kvp.Key), kvp.Value)).OrderBy(kvp => kvp.Value);
32 StringBuilder builder = new StringBuilder();
34 builder.AppendLine("digraph G {");
36 foreach (var node in nodes)
38 WriteName(builder, node);
40 WriteAttributes(builder, node.Key);
44 foreach (var edge in edges)
46 WriteName(builder, Kvp(edge.Key.From));
47 builder.Append(" -> ");
48 WriteName(builder, Kvp(edge.Key.To));
50 WriteAttributes(builder, edge.Key);
54 builder.AppendLine("}");
56 return builder.ToString();
59 public void OutputToDotFile(string path)
61 (new FileInfo(path)).Directory.Create();
62 File.WriteAllText(path, GenerateDotString());
65 /*public OutputToImageFile(string path)
70 private KeyValuePair<DotElement, int> Kvp(DotElement element)
72 return new KeyValuePair<DotElement, int>(element, elements[element]);
75 private static void WriteName<T>(StringBuilder builder, KeyValuePair<T, int> element) where T : DotElement
77 builder.Append(element.Key.Name);
78 builder.Append(element.Value);
81 private static void WriteAttributes(StringBuilder builder, DotElement element)
83 if (!element.HasAttributes())
87 foreach (var attrib in element.attributes)
89 builder.Append(separator);
90 builder.Append(attrib.Key);
91 builder.Append("=\"");
92 builder.Append(attrib.Value);
99 private Dictionary<DotElement, int> elements = new Dictionary<DotElement, int>(); // elements to id