到底如何画流程图呢?用PowerPoint么?Viso?好像都很难满足自己的需求。本文介绍一种比较“专业”的流程图生成方式— 使用dot语言来制作流程图。
首先请确保你已经安装了Graphviz,如果没有安装请移步 http://www.graphviz.org/Download_windows.php
注意到,Graphviz支持windows和linux,所以不用担心平台的问题。
Graphviz包含了若干软件,我们下面的例子都用的是Graphviz里的dot这个软件。
一个简单的流程图的例子如下:
digraph F {
rankdir = LR;
edge [style=solid];
node [style=filled, font=Courier];
subgraph M {
rank = same;
Start [label = "Lamp doesn't work", shape = box, color = coral];
End [label = "Repair lamp" , shape = box, color = coral];
Con1 [label = "Lamp plugged in?", shape = diamond, color = green, size = 3];
Con2 [label = "Bulb burned out?", shape = diamond, color = green, size = 3];
}
subgraph C {
rank = same;
RB [label = "Replace bulb", shape = box, color = deepskyblue1];
AP [label = "Plug in lamp", shape = box, color = deepskyblue1];
}
Start -> Con1;
Con1 -> AP [label = "No"];
Con1 -> Con2 [label = "Yes"];
Con2 -> RB [label = "Yes"];
Con2 -> End [label = "No"];
}
将上面的内容保存到一个文本文件中,最好以dot为后缀保存,这里我将他保存成“flow.dot”。
打开cmd(Windows)或者terminal(Linux),试下dot是否已经添加到了环境搜索路径里。如果没有找到dot命令,自行添加到环境路径中,如果你不愿意把环境路径搞的很长,特别是在Windows下的时候。可以弄个快捷键到系统的环境路径中。
dot就绪以后,执行如下命令来生成流程图:
dot -Tpng -o flow.png flow.dot
生成的流程图如下:
digraph F
Dot有两种graph可以花,一种是digraph—有向图,另一种是无向图(graph来表示),这两种图还可以被strict来修饰(不在这里讨论)。
rankdir = "LR";
这个是用来描述graph是从什么哪里到哪里画,LR就是从左到右(left to right),另外还有 “TB”, “BT”, “RL”三个绘制方向。
edge [style=solid];
node [style=filled, font=Courier];
edge和node是两个关键字,他们放在最上面可以用来统一限制node和edge的属性。node和edge的属性值分别放到一个中括号里,用key=value的形式给出,多个key用逗号隔开。
subgraph M
subgraph 定义一个子图。
rank = same;
指定当前子图中的node要在同一个rank上,例如,你的graph的rankdir是从左到右的,当前subgraph中的node很可能会被放在同一列上。
Start [label = "Lamp doesn't work", shape = box, color = coral];
End [label = "Repair lamp" , shape = box, color = coral];
Con1 [label = "Lamp plugged in?", shape = diamond, color = green, size = 3];
Con2 [label = "Bulb burned out?", shape = diamond, color = green, size = 3];
定义当前subgraph中的node
Start -> Con1;
Con1 -> AP [label = "No"];
Con1 -> Con2 [label = "Yes"];
Con2 -> RB [label = "Yes"];
Con2 -> End [label = "No"];
定义edge。edge的定义是通过node之间的关系来定义的,用->来表示从哪里到哪里的edge。
读一下wikipedia的介绍你会发现这竟然是个Research topic!!!在wikipedia的引用链接中也有很多有趣的工具,可以看看。