那些年,我追过的绘图语言(续)

https://zhuanlan.zhihu.com/p/19901245

****************************

那些年,我追过的绘图语言(续)

陈天

3 年前

自从上一篇文章发布后,大家给我推荐了不少绘图工具,比如startUML,rose,TikZ package,flowchart.js,matlab,R等等。感兴趣的可以自行研究。至于matlab/R这样的工具,虽然强大,但跟本文讨论的画一般意义的设计图(如uml图)无关。

鉴于很多读者想进一步了解plantUML,这篇文章就多讲讲PlantUML。

plantUML支持如下UML图:

  • Sequence diagram
  • Usecase diagram
  • Class diagram
  • Activity diagram
  • Component diagram
  • State diagram
  • Object diagram
  • GUI Wireframe

这里面,我用的最多的是sequence diagram(序列图)和activity diagram(活动图),也就主要讲讲这两个图,其它的请自行阅读plantUML的文档。

Sequence diagram

sequence diagram里每个角色被称为participant,participant之间可以有message,比如这样一个最基本的序列图

@startuml                       // (1)
participant Tars                // (2)
actor Copper                    // (3)
database Murphy

Tars -> Copper                  // (4)
Copper --> Murphy: morse code   // (5)
@enduml                         // (6)

(1) 声明一个图形的起始
(2) 声明一个participant,可以省略
(3) 如果想使用其它图例(不是participant),则不能省略
(4) 声明两个participants间的消息, -→ 为虚线, → 为实线
(5) 消息可以添加说明
(6) 声明一个图形的结束

生成出来如下图所示:

相信不用解释,大家都懂。

你可以尝试将participant换成如下图示:

  • actor
  • boundary
  • control
  • entity
  • database

会有不同的效果。如果你的participant的名字很复杂,可以使用 as 起别名:

@startuml
actor "星际穿越的\n<b>男主角</b>" as copper #99ff99 // (1) (2) (3)
actor "星际穿越的\n男主女儿" as murphy #red

copper -[#orange]> murphy: 爱和<font color=red>引力</font>可以穿越时空      // (4) (5)
@enduml

(1) 可以给participant起别名,别名不必和显示的字符一致
(2) 显示的字符可以使用\n等ascii控制字符,也可以使用html标签
(3) participant可以在结尾赋一个颜色
(4) message可以在 - 和 > 间插入一个颜色,以 [] 区隔
(5) startuml支持中文,如果编译时遇到问题,请查看charset设置(设成utf-8)

生成出来的图表如下:

如果明白了这两个例子,咱们继续:

@startuml
scale 1024*768      (1)
[--> Tars: "They" provides data inside singularity (2)

activate Tars       (3)
Tars -> Copper: sending data
activate Copper

Copper -> Copper: translate it to morse code    (4)
activate Murphy

Copper -> Murphy: send morse code through watch

Copper -> Tars: ask for next batch
deactivate Copper   (5)

Murphy -> Murphy: record and parse morse code

Murphy -->]: figured out the formula    (6)

deactivate Murphy
deactivate Tars
@enduml

(1) 我们希望生成的图片大一些
(2) [→(注意中间不要有空格),传入到当前序列图的消息(participant不在该图中)
(3)(5) activate / deactivate 用于指定participant的lifeline
(4) participant可以发消息给自己
(6) →](中间不要有空格),传出当前序列图的消息(participant不在该图中)

生成的图表如下:

Activity diagram

有了sequence diagram的基础,学习activity diagram易如反掌,直接上代码,不过多解释(程序猿应该对if else很熟悉了):

@startuml

scale 1024*768

start

if (exec Lazarus?) then (yes)
    :find a livable planet;    (*)
    :save **human beings**;
else (no)
    :keep adapting,
    __keep farming__ and <font color=red>keep dying</font>;
endif

stop

@enduml

(*) 一个activity以 : 开始,以 ; 结束。有了sequential diagram的基础,开始写activity diagram总会忘记后面的分号。嗯,你忘呀忘呀,错呀错呀,就慢慢习惯了。

这个生成的图表如下:

来个进阶的:

@startuml

scale 512*1024

|Romilly|  (1)
start
repeat     (2)
    :record the data from black hole;
    :keep waiting;
repeat while (Copper & Brand are not back?)

|#AntiqueWhite|Copper| (3)

:enter the Endurance;

while (has more video tapes?)  (4)
    :watch it;
    :cry;
endwhile

end

@enduml

(1)(3) 使用 | 创建带泳道的活动图,自泳道声明以下的活动都属于该泳道,泳道可以定义颜色
(2)(4) 两种不同的循环方式,像不像写代码?

几乎一下子就能看懂了,是不?

生成的图表如下:

继续进阶:

@startuml
scale 1024*768

start

:first planet: Miller;

fork        (1)
    :Romilly: stay in the Endurance;
fork again  (2)
    :Copper et al: go to planet Miller;
    :giant wave comes;
    fork
        :Copper found wave, but helpless;
    fork again
        :Brand is racing against the wave;
    fork again
        :Doyle wait for Brand;
        :Doyle died;
        kill    (3)
    endfork
    :they finally left the planet;
endfork         (4)

@enduml

(1)(2)(4) fork,fork again,endfork 用来描述并发线程
(3) kill 终结一个线程,plantuml的例子中使用 detach,经测试,detach 不可用

生成的图表如下:

最后,; 作为一个活动的终止,这是最标准的图例;如果将每个活动最后的 ; 换成其它符号:|,<,>,/,},可以显示不同的图例。不解释,具体看下述代码和对应的图表:

@startuml
scale 2
:Ready;
:next(o)|
:Receiving;
split
 :nak(i)<
 :ack(o)>
split again
 :ack(i)<
 :next(o)
 on several line|
 :i := i + 1]
 :ack(o)>
split again
 :err(i)<
 :nak(o)>
split again
 :foo/
split again
 :i > 5}
stop
end split
:finish;
@enduml

生成的图表:

就这些,应该够你学一阵子的啦。

最近「奇博士的管理课」正在构思第二章的内容,更新有点慢,请稍安勿躁。感兴趣可以点击「阅读原文」在百度阅读订阅。 如果您觉得这篇文章不错,请点赞。多谢!

欢迎订阅公众号『程序人生』(搜索微信号 programmer_life)。每篇文章都力求原汁原味,早8点与您相会。

时间: 2024-10-11 04:32:36

那些年,我追过的绘图语言(续)的相关文章

那些年,我追过的绘图工具

https://zhuanlan.zhihu.com/p/19900327 ***************************** 文档能力是一个工程师必不可少的基础能力,而高质量的文档往往伴随着高质量的图表."A picture is worth a thousand words",复杂的概念,逻辑,想法往往能够用图表清晰而生动地表达.一张好的图表离不开制作人的大脑对思维的描述,但同样离不开制作人所使用的工具.好的工具,让同样的事情事半功倍.我是一个工具爱好者,即便手头上有一个称

函数绘图语言解释器

一.实验目的 通过做上机题加深对编译器构造原理和方法的理解,巩固所学知识. <1> 会用正规式和产生式设计简单语言的语法: <2> 会用递归下降子程序编写编译器或解释器: <3> 会写上机报告. 二.实验环境 Dev C++ 5.11 三.题目及要求 为函数绘图语言编写一个解释器,解释器接受用绘图语言编写的源程序,经语法和语义分析之后,将源程序所规定的图形显示在显示屏(或窗口)中.通过自己动手编写解释器,掌握语言翻译特别是语言识别的基本方法. 四.实验内容 1.词法分析

&lt;编译原理 - 函数绘图语言解释器(1)词法分析器 - python&gt;

<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器:用于识别一条语句中的关键词是否符合预先定义的规则. 语法分析器:用来确定一条语句是否满足语法规则. 解释器:用来确定满足语法规则的句子,在意思上是否符合要求. 设计思路: 设计记号:词法分析器读取一个序列并根据构词规则把序列转化为记号流 定义一个字典:把所有符合一个模式的保留字.常量名.参数名.函数名等放进字

&lt;编译原理 - 函数绘图语言解释器(3)解释器 - python&gt;

<编译原理 - 函数绘图语言解释器(3)解释器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 将语法分析器并入绘图功能 继承语法分析器覆盖重写 用Pycharm写了一个.py文件: parserclass.py 输入流是语法分析器得到的语法树,输出流是绘制的图像 测试文本序列: //----------------测试程序1:分别测试------------------------ ORIGIN IS (100,300); //

也谈在 .NET 平台上使用 Scala 语言(续)

而我是在 Ubuntu 操作系统中使用 Scala.NET 的,应该没有这个问题. 那么,就让我们来测试一下吧. 现在,我们增加一个 DotNet.cs 文件,如下所示: 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 using System; using System.IO; using System.

SVG绘图学习总结

在我们平时做的很多网站项目中都会需要绘制各种各样的二维矢量图形.比如做城市地下管网的断面图.管线管点的坐标位置矢量标识图.钻孔位置或地层剖面图等等.我们有很多种方法来绘制这些矢量图(vml.canvas.svg等等),下面我要介绍的是SVG绘图语言,也是我在做项目中用到比较多的,仅以我的个人实战经验分享给大家,供大家参考: 一.SVG理论知识 SVG是一种矢量标记语言,网上也有很多关于SVG的理论知识描述,大家可以自己去百度学习,比较通俗地说,SVG是一种语言,是一块画布,在这块画布上,用户可以

atitit。流程图的设计与制作&#160;attilax&#160;总结

atitit.流程图的设计与制作 attilax 总结 1. 流程图的规范1 2. 绘图语言2 2.1. atitit.CSDN-markdown编辑器2 2.2. js-sequence-diagrams 2 3. 成员软件 axure  (10M)2 4. visio3 5. 参考3 5.1.1. paip.流程图的图形化编程及源码生成时序图 -?attilax的专栏 - ...3 5.1.2. paip.提升效率---源码生成流程图工具 -?attilax的专栏 - 博客频道...3 1.

如何阅读一份代码?

https://zhuanlan.zhihu.com/p/26222486 ****************************** 上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码.我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行.这些代码作为一个有机体,共同完成某些重要的功能.比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix: 三者对比很有意思 - rails / d

Windows打印体系结构之Windows内置打印驱动程序

时间是一种很残酷的东西,它只会冲淡能够冲淡的,但也会洗尽铅华帮你留下该留下的. 1.3.4.Windows内置打印驱动程序 现在的Windows下的打印机驱动程序通常分为V4打印机驱动程序(V4 Printer Driver).XPS打印机驱动程序(XPSDrv).微软通用打印机驱动程序(Microsoft UniversalPrinter Driver).微软PostScript打印机驱动程序(Microsoft PostScriptPrinter Driver)和微软绘图仪驱动程序(Micr