本文介绍如何使用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


好了,就到这里。