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

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

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

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

準備

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

新規のプロジェクトを作成して、GraphvizWrapper.dllを追加する。
それと、Graphvizのフォルダ(’C:Program Files (x86)Graphviz2.38bin’)からすべてのファイルを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.


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です