예제 #1
0
        /// <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("}");
            }
        }
예제 #2
0
        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}\">&nbsp;</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);
        }
예제 #3
0
        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("];");
        }
예제 #4
0
        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("];");
        }