OSDN Git Service

Added Assets for main menu
[mindgames/Mindgames_main.git] / Mindgames / Library / PackageCache / com.unity.visualeffectgraph@6.9.0-preview / Editor / Utilities / DotGraph / DotGraph.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Text;
6
7 namespace UnityEditor.Dot
8 {
9     public class DotGraph
10     {
11         public void AddElement(DotElement element)
12         {
13             if (element == null)
14                 throw new ArgumentNullException();
15
16             if (element is DotEdge)
17             {
18                 var edge = element as DotEdge;
19                 AddElement(edge.From);
20                 AddElement(edge.To);
21             }
22
23             if (!elements.ContainsKey(element))
24                 elements[element] = elements.Count;
25         }
26
27         public string GenerateDotString()
28         {
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);
31
32             StringBuilder builder = new StringBuilder();
33
34             builder.AppendLine("digraph G {");
35
36             foreach (var node in nodes)
37             {
38                 WriteName(builder, node);
39                 builder.Append(' ');
40                 WriteAttributes(builder, node.Key);
41                 builder.AppendLine();
42             }
43
44             foreach (var edge in edges)
45             {
46                 WriteName(builder, Kvp(edge.Key.From));
47                 builder.Append(" -> ");
48                 WriteName(builder, Kvp(edge.Key.To));
49                 builder.Append(' ');
50                 WriteAttributes(builder, edge.Key);
51                 builder.AppendLine();
52             }
53
54             builder.AppendLine("}");
55
56             return builder.ToString();
57         }
58
59         public void OutputToDotFile(string path)
60         {
61             (new FileInfo(path)).Directory.Create();
62             File.WriteAllText(path, GenerateDotString());
63         }
64
65         /*public OutputToImageFile(string path)
66         {
67
68         }*/
69
70         private KeyValuePair<DotElement, int> Kvp(DotElement element)
71         {
72             return new KeyValuePair<DotElement, int>(element, elements[element]);
73         }
74
75         private static void WriteName<T>(StringBuilder builder, KeyValuePair<T, int> element) where T : DotElement
76         {
77             builder.Append(element.Key.Name);
78             builder.Append(element.Value);
79         }
80
81         private static void WriteAttributes(StringBuilder builder, DotElement element)
82         {
83             if (!element.HasAttributes())
84                 return;
85
86             char separator = '[';
87             foreach (var attrib in element.attributes)
88             {
89                 builder.Append(separator);
90                 builder.Append(attrib.Key);
91                 builder.Append("=\"");
92                 builder.Append(attrib.Value);
93                 builder.Append('\"');
94                 separator = ' ';
95             }
96             builder.Append(']');
97         }
98
99         private Dictionary<DotElement, int> elements = new Dictionary<DotElement, int>(); // elements to id
100     }
101 }