public void Output(ArchitectureGraph architecture, List<OutputEntry> warnings) { architecture.Vertices.ForEach((proj, i) => ids.Add(proj, i + 1)); var result = new DotStringBuilder("Architecture"); architecture.Vertices.ForEach(v => result.AppendNode(v, v, "shape", "box")); result.AppendSpace(); var deps = new HashSet<GroupDependency>(architecture.Edges); var inversible = new HashSet<GroupDependency>(deps.Where(d => deps.Contains(new GroupDependency(d.Target, d.Source)))); architecture.Edges.ForEach(d => result.AppendEdge(d.Source, d.Target, "style", GetStyle(d), "color", GetColor(d, inversible))); File.WriteAllText(file, result.ToString()); }
//private DependencyGraph Sample(DependencyGraph aGraph, List<OutputEntry> aWarnings, int percent) //{ // var rand = new Random(); // var selected = new HashSet<Library>(aWarnings.SelectMany(w => w.Projects) // .Concat(aGraph.Vertices.Where(v => rand.Next(100) < percent))); // var result = new DependencyGraph(); // result.AddVertexRange(selected); // result.AddEdgeRange(aGraph.Edges.Where(e => selected.Contains(e.Source) && selected.Contains(e.Target))); // return result; //} private string GenerateDot() { var result = new DotStringBuilder("Dependencies"); result.AppendConfig("concentrate", "true"); int clusterIndex = 1; foreach (var group in graph.Vertices.Where(a => a.GroupElement != null) .GroupBy(a => a.GroupElement.Name)) { var groupName = @group.Key; var clusterName = "cluster" + clusterIndex++; var groupInfo = new GroupInfo(clusterName + "_top", clusterName + "_bottom"); groupInfos.Add(groupName, groupInfo); result.StartSubgraph(clusterName); result.AppendConfig("label", groupName); result.AppendConfig("color", "lightgray"); result.AppendConfig("style", "filled"); result.AppendConfig("fontsize", "20"); result.AppendSpace(); AppendGroupNode(result, "min", groupInfo.TopNode); result.AppendSpace(); var projs = new HashSet<Library>(group); projs.ForEach(a => AppendProject(result, a)); result.AppendSpace(); graph.Edges.Where(e => projs.Contains(e.Source) && projs.Contains(e.Target)) .ForEach(d => AppendDependency(result, d)); result.AppendSpace(); AppendGroupNode(result, "max", groupInfo.BottomNode); result.EndSubgraph(); result.AppendSpace(); } graph.Vertices.Where(a => a.GroupElement == null) .ForEach(a => AppendProject(result, a)); result.AppendSpace(); graph.Edges.Where(e => AreFromDifferentGroups(e.Source, e.Target)) .ForEach(d => AppendDependency(result, d)); result.AppendSpace(); AddDependenciesBetweenGroups(result); return result.ToString(); }