纯Java实现的graphviz

纯Java实现Graphviz

在Java中使用Graphviz的方式

使用纯Java使用Graphviz一直是个问题,目前为止的方案有三种:

  1. Java包装dot命令,调用机器上安装的Graphviz进程
  2. 类似graphviz-java,使用 V8 javascript执行引擎执行Vizjs
  3. 把Graphviz的c语言源代码翻译成java版本,类似smetana

第一种方式不够便捷,还需要进行额外的安装;第二种方式的话相对来说好一点,虽然内容比较重;使用第三种方式的项目至今都只能画一个简陋的图形。

使用纯Java从头实现Graphviz

方式

跟人上述三种方式均不同的是,本人打算使用纯Java实现Graphviz,目前MVP版本还在开发当中。也就是采用了跟Graphviz类似的布局算法和api使用,这种方式跟smetana完全不一样,因为smetana只注重翻译,对内部完全实现原理完全黑盒,而重写的方式跟原来的Graphviz完全没有任何联系,只是最终效果看起来类似,代码对于Java开发来说很容易更改和拓展功能。

进度

目前第一个版本的属性还在支持当中,当支持完MVP版本的所有属性之后,会开源到GitHub,目前项目的开发仓库在这里graph-support,有兴趣的同学可以关注进度。

示例

digraph shells {
	Thompson -> {Mashey[style=filled,fillcolor=green] Bourne[style=dashed,fillcolor=gold] csh}; csh -> tcsh;
	Bourne -> {ksh[style=dashed] esh vsh "System-V"[color=red] v9sh}; v9sh -> rc;
	{Bourne "ksh-i"[style=bold] KornShell} -> Bash;
	{esh vsh[fontsize=36] Formshell csh} -> ksh;
	{KornShell "System-V"} -> POSIX;
	ksh -> "ksh-i" -> KornShell -> "ksh-POSIX";
	Bourne -> Formshell;
}

Java代码

// initialize node
   Node n_ksh = Node.builder().label("ksh").style(NodeStyle.DASHED).build();
   Node n_System_V = Node.builder().label("System_V").color(Color.RED).build();
   Node n_vsh = Node.builder().label("vsh").fontSize(36).build();
   Node n_Mashey = Node.builder().label("Mashey").style(NodeStyle.FILLED).fillColor(Color.GREEN).build();
   Node n_ksh_POSIX = Node.builder().label("ksh_POSIX").build();
   Node n_Thompson = Node.builder().label("Thompson").build();
   Node n_ks_i = Node.builder().label("ks_i").style(NodeStyle.BOLD).build();
   Node n_Formshell = Node.builder().label("Formshell").build();
   Node n_Bash = Node.builder().label("Bash").build();
   Node n_v9sh = Node.builder().label("v9sh").build();
   Node n_POSIX = Node.builder().label("POSIX").build();
   Node n_rc = Node.builder().label("rc").build();
   Node n_tcsh = Node.builder().label("tcsh").build();
   Node n_Bourne = Node.builder().label("Bourne").style(NodeStyle.DASHED).fillColor(Color.GOLD).build();
   Node n_csh = Node.builder().label("csh").build();
   Node n_esh = Node.builder().label("esh").build();
   Node n_KornShell = Node.builder().label("KornShell").build();

   Graphviz graphviz = Graphviz
       .digraph()
       .scale(0.75)
       .tempNode(
           Node.builder().color(Color.BLACK).build()
       )
       .addLine(n_Thompson, n_Mashey)
       .addLine(n_Thompson, n_Bourne)
       .addLine(n_Thompson, n_csh)
       .addLine(n_Bourne, n_Formshell)
       .addLine(n_Bourne, n_esh)
       .addLine(n_Bourne, n_vsh)
       .addLine(n_Bourne, n_v9sh)
       .addLine(Line.builder(n_Bourne, n_ksh).label("Bourne --> ksh").build())
       .addLine(n_Bourne, n_System_V)
       .addLine(n_csh, n_ksh)
       .addLine(n_csh, n_tcsh)
       .addLine(n_esh, n_ksh)
       .addLine(n_vsh, n_ksh)
       .addLine(n_Formshell, n_ksh)
       .addLine(n_v9sh, n_rc)
       .addLine(n_ksh, n_ks_i)
       .addLine(n_ks_i, n_KornShell)
       .addLine(n_ks_i, n_Bash)
       .addLine(n_Bourne, n_Bash)
       .addLine(n_KornShell, n_ksh_POSIX)
       .addLine(n_KornShell, n_Bash)
       .addLine(n_KornShell, n_POSIX)
       .addLine(n_System_V, n_POSIX)
       .build();
// Svg render
RenderEngine renderEngine = SvgRenderEngine.getInstance();
GraphResource graphResource = renderEngine.render(graphviz);
System.out.println(graphResource.content());

效果对比
纯Java实现的graphviz

上一篇:文本处理和编译安装


下一篇:每日一题 0223