tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

graphvizを使ってプログラムから作図する

graphvizというソフトが最近のお気に入りだったりする。このソフトを使うとプログラムからいろんな図(例えば↓のような図)が簡単に書けます。

他の例はgraphvizサイトのギャラリーを見ればアレコレできるということがわかるはず。

準備

  • graphvizを普通にインストールすればOK。

Javaから使ってみる

今回はgraphviz-apiというライブラリを使う。ググってもほとんど情報がないんだけど、Hudson の中の人が作っているライブラリみたい。

GraphvizTest.java

package test;

import java.io.File;
import java.util.Arrays;

import org.kohsuke.graphviz.Arrow;
import org.kohsuke.graphviz.Attribute;
import org.kohsuke.graphviz.Edge;
import org.kohsuke.graphviz.Graph;
import org.kohsuke.graphviz.Node;
import org.kohsuke.graphviz.Style;

public class GraphvizTest {
	private static final String DOT_EXE_PATH = "C:\\Program Files\\Graphviz2.22\\bin\\dot.exe";
	
	public static void main(String[] args) throws Exception {
		Graph graph = new Graph();

		// クラス図のスタイル
		Style nodeStyle = new Style();
		nodeStyle.attr(Attribute.FONTNAME, "Bitstream Vera Sans");
		nodeStyle.attr(Attribute.FONTSIZE, 8f);
		nodeStyle.attr("shape", "record");// Shape.RECORDが未定義なので文字列で書く

		// 継承矢印のスタイル
		Style edgeStyle = new Style();
		edgeStyle.attr(Attribute.ARROWHEAD, Arrow.NONE);
		edgeStyle.attr(Attribute.ARROWTAIL, Arrow.ONORMAL);

		// 親クラス(Hoge)
		Node hoge = new Node();
		hoge.style(nodeStyle);
		hoge.attr(Attribute.LABEL, "{Hoge|- fuga : string\\l- haga : int\\l|# piyo() : void\\l}");
		graph.node(hoge);

		// 子クラス(Foo)
		Node foo = new Node();
		foo.style(nodeStyle);
		foo.attr(Attribute.LABEL, "{Foo|+ FOO : String|# piyo : void\\l}");
		graph.node(foo);

		// 子クラス(Bar)
		Node bar = new Node();
		bar.style(nodeStyle);
		bar.attr(Attribute.LABEL, "{Bar|+ BAR : String|# piyo : void\\l}");
		graph.node(bar);

		// Foo->Hogeの矢印
		Edge fooToHoge = new Edge(hoge, foo);
		fooToHoge.style(edgeStyle);
		graph.edge(fooToHoge);

		// Bar->Hogeの矢印
		Edge barToHoge = new Edge(hoge, bar);
		barToHoge.style(edgeStyle);
		graph.edge(barToHoge);

		// PNG画像を出力
		graph.generateTo(Arrays.asList(DOT_EXE_PATH, "-Tpng"), new File("test.png"));
	}
}

実行すると上のようなクラス図っぽい図がtest.pngというファイルで出力されます。