纯Java实现的graphviz
作者:互联网
纯Java实现Graphviz
在Java中使用Graphviz的方式
使用纯Java使用Graphviz一直是个问题,目前为止的方案有三种:
- Java包装dot命令,调用机器上安装的Graphviz进程
- 类似graphviz-java,使用 V8 javascript执行引擎执行Vizjs
- 把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());
效果对比
标签:Node,Java,实现,builder,graphviz,addLine,build,label,ksh 来源: https://blog.csdn.net/jiangyongbing008/article/details/123094272