ネットワーク的な図とか描くのに便利な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.