GraphvizのC#ラッパークラスを使ってみる

ネットワーク的な図とか描くのに便利なGraphvizですが、コマンドライン(もしくはgvedit)で作業するのは少々面倒です。

C#から似たようなコトできないかググったら、オープンソースのラッパークラスがありました。
GraphViz-C-Sharp-Wrapper

内部的には、裏でコマンドラインで実行する仕組みですが、C#から簡単に呼び出せます。しかし、便利なもんだ。

準備
上記のリポジトリからクローン(もしくは単にダウンロードして展開)してビルド。

新規のプロジェクトを作成して、GraphvizWrapper.dllを追加する。
それと、Graphvizのフォルダ('C:\Program Files (x86)\Graphviz2.38\bin')からすべてのファイルをGraphvizWrapper.dllと同じフォルダへ’Graphviz’という名前でフォルダを作りコピーする。

使い方
以下、WPFアプリから呼び出すサンプル。

using System.Diagnostics;
using GraphVizWrapper.Queries;
using GraphVizWrapper;
using System.Drawing;


namespace CallingGraphviz
    ///
        private void btnTest_Click(object sender, RoutedEventArgs e)
            var wrapper = new GraphGeneration(
            // layout
            // Dot
            byte[] output = wrapper.GenerateGraph(diagraph, Enums.GraphReturnType.Png);
            // byte[] → Image
            // ファイル名「graph.png」で保存
            img.Dispose();
            // 拡張子が登録されているファイルを指定
        }
        // バイト配列をImageオブジェクトに変換

{
    using GraphVizWrapper.Commands;



    /// MainWindow.xaml の相互作用ロジック
    ///
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        {
            var getStartProcessQuery = new GetStartProcessQuery();
            var getProcessStartInfoQuerty = new GetProcessStartInfoQuery();
            var registerLayoutPluginCommand = new RegisterLayoutPluginCommand(getProcessStartInfoQuerty, getStartProcessQuery);

                getStartProcessQuery,
                getProcessStartInfoQuerty,
                registerLayoutPluginCommand);

            wrapper.RenderingEngine = Enums.RenderingEngine.Sfdp;

            var diagraph = "digraph{a -> b; b -> c; c -> a;}";


            System.Drawing.Image img = ByteArrayToImage(output);

            img.Save("graph.png", System.Drawing.Imaging.ImageFormat.Png);


            Process.Start(@"graph.png");


        public static System.Drawing.Image ByteArrayToImage(byte[] b)
        {
            ImageConverter imgconv = new System.Drawing.ImageConverter();
            System.Drawing.Image img = (System.Drawing.Image)imgconv.ConvertFrom(b);
            return img;
        }
    }
}
これで下の図が表示されればOK.

コメント

このブログの人気の投稿

TabError: inconsistent use of tabs and spaces in indentation

マクロを含んだ.XLSがExcel2010で開けない

using ディレクティブまたはアセンブリ参照が不足しています。