本文介绍如何使用ditaa与PlantUML与dot进行绘制流程图。ditaa与PlantUML都依赖java环境,所以事先需要有Java环境(不管我们使用的是何种OS)。Java环境的设置很简单,如果本地没有Java环境,请到Oracle官网下载之,这里就省略了。而dot绘图语言需要安装graphviz软件。

wKiom1U2-juyJ51FAACgxJIEFDw537.jpg

wKioL1U2-5jQl2-eAAC0P23u6y0400.jpg

wKiom1U2_NzxinAQAACDc4rLbvY860.jpg

本文作者使用的Windows环境,而Gnu/Linux环境则配置起来相对简单些。


有了Java的基础环境,接下来需要安装graphviz(dot绘图语言的解释器)软件,安装过程省略。安装之后的一个截图为:

wKioL1U2_EaD1aMcAABDZhgpTkY229.jpg


之后,需要下载两个jar包,相当于Emacs的两个插件,一个是ditaa使用的jar包,一个plantuml使用的jar包,把下载好的jar包放到指定的目录,本文把他们放到了这里(如果没有相应的目录请动手创建),

wKiom1U2_G3gHihUAAFUFwVsmcM843.jpg

另外,最好也在该目录里放置一份(Windows下面,而Linux则不需要此步骤),我的Emacs是安装在了F盘,所以,大家的与我的不一样,请进行相应的修改之(如果没有相应的目录,请手工创建),

wKiom1U2_YGCWA7kAAEXOAy2fGc083.jpg


至此,整个基础环境已经给搭建起来了。接下来进行Emacs的相关配置,主要设置jde-jdk-registry,

可以把下面的配置贴到.emacs文件里,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(custom-set-variables
 '(jde-jdk-registry
(quote
 (("1.6.43" . "C:\\Program Files\\java\\jdk1.6.0_43")))))
 
(org-babel-do-load-languages
 'org-babel-load-languages
 '((ditaa . t) ; this line activates ditaa
   (plantuml . t) ; this line activates plantuml
   (python . t)
   (perl . t)
   (ruby . t)
   (R . t)
   (sh . t)
   (gnuplot . t)
   (org . t)
   (latex . t)
   (java . t)
   (emacs-lisp . t)
   (calc . t)
   (sql . t)
   (dot . t) ; this line activates graphviz(dot)
   ))
(setq org-ditta-jar-path (expand-file-name "~/.emacs.d/elpa/contrib/scripts/ditta.jar"))
(setq org-plantuml-jar-path (expand-file-name "~/.emacs.d/elpa/contrib/scripts/plantuml.jar"))
 
;; org mode do not prompt me
(setq org-confirm-babel-evaluate nil)
(setq org-src-fontify-natively t)


上面的准备工作完成了之后,就可以使用Emacs进行流程图的绘制了。来看看几个截图吧:

  1. PlantUML

1
2
3
4
5
6
7
   #+BEGIN_SRC plantuml :file images/heartbeat_topo.png
   :Client: <-down-> [Route]
   note right of Client : who can serve me
   note right of [Route] : VIP 192.168.56.222
   [Route] <-down-> [master.liucc.com\n192.168.56.101]
   [Route] <-down-> [slave.liucc.com\n192.168.56.102]
   #+END_SRC

在Emacs下面如何编译生成图片呢?让光标置于#+BEGIN_SRC与#+END_SRC之间的任何位置,使用组合键“C-c C-c”即可完成编译。

    wKiom1U3FpDSnR7ZAADDL0A9EkE092.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   #+BEGIN_SRC plantuml :file images/pxe02.png
   hide footbox
   title PXE工作流程
   participant PXE_Client
   participant TFTP_Server
   participant DHCP_Server
   PXE_Client -> DHCP_Server: 请求IP地址
   activate PXE_Client #FFBBBB
   activate DHCP_Server #FFBBCC
   DHCP_Server -> DHCP_Server: 是否为合法的\n来自PXE_Client\n的DHCP请求?
   PXE_Client <-- DHCP_Server: 返回IP地址和bootstrap的位置
   deactivate DHCP_Server
   PXE_Client -> TFTP_Server: 请求传送bootstrap
   activate TFTP_Server #FFAABB
   PXE_Client <-- TFTP_Server: 同意指定传输块大小(blksize)?
   PXE_Client -> TFTP_Server: 同意
   PXE_Client <-- TFTP_Server: 发送bootstrap
   PXE_Client -> PXE_Client: 执行bootstrap(pxelinux.0)
   PXE_Client -> TFTP_Server: 请求传送配置文件\n(pxelinux.cfg/<IP_ADDR>)
   PXE_Client -> PXE_Client: 读配置文件
   PXE_Client -> PXE_Client: 用户根据情况选择
   PXE_Client -> TFTP_Server: 请求传送Linux内核
   PXE_Client <-- TFTP_Server: 发送Linux内核
   PXE_Client -> TFTP_Server: 请求传送Linux根文件系统
   PXE_Client <-- TFTP_Server: 发送Linux根文件系统
   deactivate TFTP_Server
   PXE_Client -> PXE_Client: 启动Linux内核(带参数)
   deactivate PXE_Client
   #+END_SRC

wKiom1U3FxKBLLJxAAHyYxBNsLI447.jpg

2. ditaa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#+BEGIN_SRC ditaa :file images/linux-os.png
+---------------------------------------------------------+ 
|                Applications                             |     
|    +----------------------------------------------------+     
|    |           System Libraries                         |     
+----+----------------------------------------------------+     
|                System Call Interface                    |     
+------------------------+--------------+-----------------+       +---------+
|          VFS           |   Socket     |                 |       |         |
+------------------------+--------------+    Scheduler    +-------+   CPU   |
|       File Systems     |   TCP/UDP    |                 |       |         |
+------------------------+--------------+-----------------+       +----+----+
|       Volume Manager   |   IP         |    Virtual      |            |  
+------------------------+--------------+    Memory       |            |
| Block Device Interface |   Ethernet   |                 |            |
+------------------------+--------------+-----------------+       +----+----+
|                       Device Driver                     |       |  DRAM   |
+-----------------------------+---------------------------+       +---------+
                              |            
                              |            
                      +-------+--------+          
                      |   I/O Bridge   |          
                      +-------+--------+          
                              |                            
                              |                  
      ------+-----------------+--------------------+------  
            |                                      |     
  +---------+--------+                  +----------+---------+
  |  I/O Controller  |                  | Network Controller |
  +-+-------+------+-+                  +----+----------+----+
    |       |      |                         |          |
+---+---+   |  +---+---+                +----+----+ +---+----+
| Disk  |  ... | Swap  |                |  Port   | |  Port  |
+-------+      +-------+                +---------+ +--------+
#+END_SRC

wKioL1U3GNqx8dHeAAGM7GzbQeI419.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   #+BEGIN_SRC ditaa :file images/linux02.png :cmdline -E -r -s 1.0
   +---------------------------------------+
   |                Applications           |
   |                cRED                   |
   +-------------------+                   |
   |    cBLU           |                   |
   |    Libraries      |                   |
   +-------------------+-------------------+
   |                                       |
   |   Kernel          +-------------------+
   |   cYEL            |           cGRE    |
   |           +-------+--------+  Drivers |
   |           |   Firmware c1AF|          |
   +-----------+----------------+----------+
   |               Hardware  c1AC          |
   +---------------------------------------+
   #+END_SRC

wKioL1U3GRjj5EEiAACmwrUIqx8249.jpg

3. dot

1
2
3
4
5
6
7
8
9
10
   #+BEGIN_SRC dot :file images/dot04.png :cmdline -Kdot -Tpng
   digraph structs {
    node[shape=record]
    struct1 [label="<f0> left|<f1> mid\ dle|<f2> right"];
    struct2 [label="{<f0> one|<f1> two\n\n\n}" shape=Mrecord];
    struct3 [label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
    struct1:f1 -> struct2:f0;
    struct1:f0 -> struct3:f1;
   }
   #+END_SRC

wKioL1U3Gomjc5fcAABuP1aGyIY019.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   #+BEGIN_SRC dot :file images/dot01.png :cmdline -Kdot -Tpng
  digraph G {
  size="8,6"
  ratio=expand
  edge [dir=both]
  plcnet [shape=box, label="PLC Network"]
  subgraph cluster_wrapline {
    label="Wrapline Control System"
    color=purple
    subgraph {
    rank=same
    exec
    sharedmem [style=filled, fillcolor=lightgrey, shape=box]
    }
    edge[style=dotted, dir=none]
    exec -> opserver
    exec -> db
    plc -> exec
    edge [style=line, dir=both]
    exec -> sharedmem
    sharedmem -> db
    plc -> sharedmem
    sharedmem -> opserver
  }
  plcnet -> plc [constraint=false]
  millwide [shape=box, label="Millwide System"]
  db -> millwide
  subgraph cluster_opclients {
    color=blue
    label="Operator Client"
    rankdir=LR
    labelloc=b
    node[label=client]
    opserver -> client1
    opserver -> client2
    opserver -> client3
  }
}
  #+end_src


wKioL1U3Grnwj_v2AAFWwd2trxw330.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  #+BEGIN_SRC dot :file images/dot_html01.png :cmdline -Kdot -Tpng
  digraph G {
  rankdir=LR
  node [shape=plaintext]
  a [
     label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
  <TR><TD ROWSPAN="3" BGCOLOR="yellow">class</TD></TR>
  <TR><TD PORT="here" BGCOLOR="lightblue">qualifier</TD></TR>
</TABLE>>
  ]
    b [shape=ellipse style=filled
  label=<
<TABLE BGCOLOR="bisque">
  <TR><TD COLSPAN="3">elephant</TD> 
      <TD ROWSPAN="2" BGCOLOR="chartreuse" 
          VALIGN="bottom" ALIGN="right">two</TD> </TR>
  <TR><TD COLSPAN="2" ROWSPAN="2">
        <TABLE BGCOLOR="grey">
          <TR> <TD>corn</TD> </TR> 
          <TR> <TD BGCOLOR="yellow">c</TD> </TR> 
          <TR> <TD>f</TD> </TR> 
        </TABLE> </TD>
      <TD BGCOLOR="white">penguin</TD> 
  </TR> 
  <TR> <TD COLSPAN="2" BORDER="4" ALIGN="right" PORT="there">4</TD> </TR>
</TABLE>>
  ]
  c [ 
  label=<long line 1<BR/>line 2<BR ALIGN="LEFT"/>line 3<BR ALIGN="RIGHT"/>>
  ]
  subgraph { rank=same b c }
  a:here -> b:there [dir=both arrowtail = diamond]
  c -> b
  d [shape=triangle]
  d -> c [label=<
<TABLE>
  <TR><TD BGCOLOR="red" WIDTH="10"> </TD>
      <TD>Edge labels<BR/>also</TD>
      <TD BGCOLOR="blue" WIDTH="10"> </TD>
  </TR>
</TABLE>>
  ]
  
  }
  #+END_SRC

wKioL1U3Gv6AraZvAAD7MdWjihs794.jpg


好了,就到这里。