private Graph BuildGraph(IBSharpContext context) {
            
            var result = new Graph {
                RankDir = RankDirType.RL,
                Label = "Графическая структура проекта",
                DefaultNode = new Node {
                    FontName = "Consolas", 
                    Shape = NodeShapeType.Box3d,
                    FontSize = 8,
                    Style = NodeStyleType.Filled
                },
                DefaultEdge = new Node {
                    FontName = "Consolas",
                    FontSize = 8
                },
            };
            var visited= new List<IBSharpClass>();
            if (null != ((BSharpContext) context).Dictionaries) {
                foreach (var e in ((BSharpContext) context).Dictionaries) {
                    var node = new Node {Code = "d" + e.Key, Label = e.Key,SubgraphCode = "dicts",Shape = NodeShapeType.Mcircle};
                    result.AddNode(node);
                    foreach (var i in e.Value) {
                        result.AddEdge(new Edge {From = i.cls.FullName, To = "d" + e.Key, ArrowHead = ArrowType.Curve});
                    }
                }
            }
            foreach (var c in context.Get(BSharpContextDataType.Working)) {
                BuildClass(result,context, (BSharpClass)c, visited);
            }

            result.AutoTune();
            return result;
        }
Example #2
0
		/// <summary>
		/// Формирует программу на языке DOT
		/// </summary>
		/// <param name="subGraph"></param>
		/// <returns></returns>
		public string Generate(SubGraph subGraph)
		{
		    Graph g;
		    if (subGraph is Graph)
		    {
		        g =(Graph) subGraph;
		    }
		    else
		    {
		        g = new Graph();
		        g.AddSubGraph(subGraph);
		    }
		    return GraphRender.Create(g).GenerateGraphScript();
		}
        private void BuildClass(Graph g, IBSharpContext ctx, BSharpClass cls, IList<IBSharpClass> visited) {
            if (visited.Contains(cls)) return;
            visited.Add(cls);
            var label = cls.Name;
            if (!string.IsNullOrWhiteSpace(cls.Prototype)) {
                label = "[" + cls.Prototype + "]\r\n" + cls.Name;
            }
            var n = new Node {Code = cls.FullName, Label = label};
            if (!string.IsNullOrWhiteSpace(cls.Namespace)) {
                n.SubgraphCode  = (cls.Namespace.Replace(".", "__")) + "__";
            }
            CheckoutNamespace(g,cls.Namespace);
            if (cls.Is(BSharpClassAttributes.Abstract)) {
                n.Shape = NodeShapeType.Box;
                n.FillColor = Color.Yellow;
            }
            g.AddNode(n);
            if (null != cls.DefaultImport) {
                g.AddEdge(new Edge {From = cls.FullName, To = cls.DefaultImport.FullName,Label = "0"});
                BuildClass(g,ctx,(BSharpClass)cls.DefaultImport,visited);
            }
            int idx = 1;
            foreach (var i in cls.SelfImports) {
                g.AddEdge(new Edge {From = cls.FullName, To = i.Target.FullName,Label = (idx++).ToString()});
                BuildClass(g, ctx, (BSharpClass)i.Target, visited);
            }
            foreach (var i in cls.IncludedClasses) {
                g.AddEdge(new Edge { From = cls.FullName, To = i.FullName, ArrowHead =ArrowType.Diamond});
                BuildClass(g, ctx, (BSharpClass)i, visited);
            }
            foreach (var i in cls.ReferencedClasses)
            {
                g.AddEdge(new Edge { From = cls.FullName, To = i.FullName, ArrowHead = ArrowType.Vee,Color = Color.Blue});
                BuildClass(g, ctx, (BSharpClass)i, visited);
            }
            foreach (var i in cls.LateIncludedClasses)
            {
                g.AddEdge(new Edge { From = cls.FullName, To = i.FullName, ArrowHead = ArrowType.ODiamond, Color = Color.Blue });
                BuildClass(g, ctx, (BSharpClass)i, visited);
            }

            foreach (var i in cls.ReferencedDictionaries) {
                g.AddEdge(new Edge { From = cls.FullName, To = "d"+i, ArrowHead = ArrowType.Inv, Color = Color.Blue });
            }
            
        }
Example #4
0
        public void CalculateEdgeInWeight() {
            var graph = new Graph();
            var nodes = new[] {new Node(), new Node(), new Node(), new Node(), new Node(), new Node() };
            nodes[0].Code = "1";
            nodes[1].Code = "2";
            nodes[2].Code = "3";
            nodes[3].Code = "4";
            nodes[4].Code = "5";
            nodes[5].Code = "6";
         
            foreach (var node in nodes) {
                graph.AddNode(node);
            }

            var edge1to2 = Edge.Create(nodes[0].Code, nodes[1].Code);
            var edge2to3 = Edge.Create(nodes[1].Code, nodes[2].Code);
            var edge6to3 = Edge.Create(nodes[5].Code, nodes[2].Code);
            var edge4to5 = Edge.Create(nodes[3].Code, nodes[4].Code);
            var edge5to3 = Edge.Create(nodes[4].Code, nodes[2].Code);

            graph.AddEdge(edge1to2);
            graph.AddEdge(edge2to3);
            graph.AddEdge(edge6to3);
            graph.AddEdge(edge4to5);
            graph.AddEdge(edge5to3);

            var ws = graph.CalculateWeight();
            var zeros = ws.Count(_ => _.Value == 0);
            var fives = ws.Count(_ => _.Value == 5);
            var ones = ws.Count(_ => _.Value == 1);

            Assert.AreEqual(7, ws.Sum(_ => _.Value));
            Assert.AreEqual(3, zeros);
            Assert.AreEqual(2, ones);
            Assert.AreEqual(1, fives);


            foreach (var w in ws) {
                Debug.Print(w.Key + " = " + w.Value);
            }
        }
Example #5
0
        public void CalculateEdgeInWeightWithRecycles() {
            var graph = new Graph();
            var nodes = new[] { new Node(), new Node(), new Node(), new Node(), new Node(), new Node() };
            nodes[0].Code = "1";
            nodes[1].Code = "2";
            nodes[2].Code = "3";
            nodes[3].Code = "4";
            nodes[4].Code = "5";
            nodes[5].Code = "6";

            foreach (var node in nodes) {
                graph.AddNode(node);
            }

            var edge3to1 = Edge.Create(nodes[2].Code, nodes[0].Code);
            var edge1to2 = Edge.Create(nodes[0].Code, nodes[1].Code);
            var edge2to3 = Edge.Create(nodes[1].Code, nodes[2].Code);
            var edge6to3 = Edge.Create(nodes[5].Code, nodes[2].Code);
            var edge4to5 = Edge.Create(nodes[3].Code, nodes[4].Code);
            var edge5to3 = Edge.Create(nodes[4].Code, nodes[2].Code);

            graph.AddEdge(edge3to1);
            graph.AddEdge(edge1to2);
            graph.AddEdge(edge2to3);
            graph.AddEdge(edge6to3);
            graph.AddEdge(edge4to5);
            graph.AddEdge(edge5to3);
            
            var ws = graph.CalculateWeight();
            Assert.AreEqual(3, ws.Count(_ => _.Value == 1));
            Assert.AreEqual(1, ws.Count(_ => _.Value == 3));
            Assert.AreEqual(6, ws.Sum(_ => _.Value));

            foreach (var w in graph.CalculateWeight()) {
                Debug.Print(w.Key + " = " + w.Value);
            }
        }
 private void CheckoutNamespace(Graph graph, string ns) {
     if (string.IsNullOrWhiteSpace(ns)) return;
     var parts = ns.Split('.');
     var fullns = "";
     SubGraph parent = graph;
     foreach (var p in parts) {
         fullns += p + "__";
         SubGraph ex = null;
         if (null == (ex=parent.ResolveSubgraph(fullns))) {
             parent.SubGraphs.Add((ex=new SubGraph{Code = fullns,Label = p}));
         }
         parent = ex;
     }
 }