C#有向图生成库

时间:2011-11-20 05:11:16

标签: c# graph visualization

我注意到Visual Studio可以使用DGML生成图形。

我想在我的C#应用​​程序中生成如下图形。

http://bishoponvsto.files.wordpress.com/2010/02/dgml-graph1.jpg

它不必像VS那样具有交互性。我只是想生成一个静态的这样的图像,并将其保存为一般的图形文件,如PNG。

有没有免费的.NET库?

4 个答案:

答案 0 :(得分:32)

有点晚了,但实际上相对容易实现:

public class DGMLWriter
{
    public struct Graph
    {
        public Node[] Nodes;
        public Link[] Links;
    }

    public struct Node
    {
        [XmlAttribute]
        public string Id;
        [XmlAttribute]
        public string Label;

        public Node(string id, string label)
        {
            this.Id = id;
            this.Label = label;
        }
    }

    public struct Link
    {
        [XmlAttribute]
        public string Source;
        [XmlAttribute]
        public string Target;
        [XmlAttribute]
        public string Label;

        public Link(string source, string target, string label)
        {
            this.Source = source;
            this.Target = target;
            this.Label = label;
        }
    }

    public List<Node> Nodes { get; protected set; }
    public List<Link> Links { get; protected set; }

    public DGMLWriter()
    {
        Nodes = new List<Node>();
        Links = new List<Link>();
    }

    public void AddNode(Node n)
    {
        this.Nodes.Add(n);
    }

    public void AddLink(Link l)
    {
        this.Links.Add(l);
    }

    public void Serialize(string xmlpath)
    {
        Graph g = new Graph();
        g.Nodes = this.Nodes.ToArray();
        g.Links = this.Links.ToArray();

        XmlRootAttribute root = new XmlRootAttribute("DirectedGraph");
        root.Namespace = "http://schemas.microsoft.com/vs/2009/dgml";
        XmlSerializer serializer = new XmlSerializer(typeof(Graph), root);
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        XmlWriter xmlWriter = XmlWriter.Create(xmlpath, settings);
        serializer.Serialize(xmlWriter, g);
    }
}

答案 1 :(得分:3)

我过去曾使用NodeXL来生成Web应用程序中的工作流图,但它也适用于桌面应用程序和交互。

描述可能会让您感到困惑,让您认为它仅适用于Excel。完全没有,您可以直接使用它的对象模型,并根据.NET绘制任何您想要的图形。

答案 2 :(得分:2)

对于后来出现的任何人,现在都有一个NuGet PackageGitHub),可以更轻松地创建DGML文件,包括支持样式和其他属性元数据。我最初使用Simon的答案(对我的最初需求非常有用),然后在寻找提高输出质量的方法时偶然发现了NuGet软件包。希望对您有所帮助。

对于任何对方便使用工具组合感兴趣的人,我一直将其与DgmlImageNuGet软件包结合使用;请注意,它在软件包的tools目录中作为可执行文件公开,因此我将其手动提取到可以轻松调用的位置),NDepend(商业性但非常方便的软件,我相信免费开源项目)和LINQPad(免费,但值得获得我的看法),在尝试设计主要重构时,根据相当复杂的代码库通过即席查询生成图表。能够使用简单的LINQ查询来询问有关代码库的问题,生成图表并快速连续显示结果真是太棒了。请注意,我与这些项目/产品都不隶属,使用这种工具组合的经历非常好,我认为我会推荐给任何尝试类似方法的人。

答案 3 :(得分:1)

没有亲自尝试,但请阅读Graph#:

的一些建议

http://graphsharp.codeplex.com/