介绍


PlantUML 是一款开源的 UML 图绘制工具,支持通过文本来生成图形。

PlantUML 相对于传统的图形编辑器,有许多优点:

简单易用 使用简单的文本语法来描述图形,无需复杂的图形编辑器,即可绘制各种类型的 UML 图
版本控制 可以纳入版本控制系统,方便多人协作和管理
可拓展性 支持插件和自定义扩展,可以满足不同用户的需求
可视效果 绘制的图形具有高清晰度和美观的效果,可以直接嵌入到文档和演示中,方便分享和展示

安装


软件要求

  • Java: 运行 PlantUML 的必需条件。
  • Graphviz-dot:(可选), 但是建议安装(如果想绘制除时序图和活动图以外的图, 就需要安装 Graphviz 软件)。
  • VS Code 拓展(可选):PlantUML 插件,ALT + D 可预览图像, 可导出源文件为 png,svg,pdf 等格式。

Debian/Ubuntu:

1
sudo apt install plantuml

Windows:

1
2
scoop bucket add extras
scoop install extras/plantuml

使用


序列图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@startuml
participant Participant as Foo #red
actor Actor as Foo1 #blue
boundary Boundary as Foo2
control Control as Foo3
entity Entity as Foo4
database Database as Foo5
collections Collections as Foo6
queue Queue as Foo7
Foo -> Foo1 : To actor
Foo --> Foo2 : To boundary
Foo -> Foo3 : To control
Foo -> Foo4 : To entity
Foo -> Foo5 : To database
Foo -> Foo6 : To collections
Foo -> Foo7: To queue
@enduml

->:实线连接,-->:虚线连接

可通过关键字声明参与者,并改变参与者的表示形状


Pasted image 20230802153324.png


用例图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@startuml
left to right direction
actor Guest as g
package Professional {
actor Chef as c
actor "Food Critic" as fc
}
package Restaurant {
usecase "Eat Food" as UC1
usecase "Pay for Food" as UC2
usecase "Drink" as UC3
usecase "Review" as UC4
}
fc --> UC4
g --> UC1
g --> UC2
g --> UC3
@enduml

left to right direction:设置为左右布局


Pasted image 20230802161051.png


类图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@startuml
class BaseClass

namespace net.dummy #DDDDDD {
.BaseClass <|-- Person
Meeting o-- Person

note top of Person : Test.

.BaseClass <|- Meeting
}

namespace net.foo {
net.dummy.Person <|- Person
.BaseClass <|-- Person

net.dummy.Meeting o-- Person
}

BaseClass <|-- net.unused.Person
@enduml

namespace:命名空间

<|--:泛化关系

*--:组合关系

o--:聚合关系


Pasted image 20230802162738.png


组件图

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
@startuml
Package "Some Group" {
HTTP - [First Component]
[Another Component]
}

Node "Other Groups" {
FTP - [Second Component]
[First Component] --> FTP
}

Cloud {
[Example 1]
}


Database "MySql" {
Folder "This is my folder" {
[Folder 3]
}
Frame "Foo" {
[Frame 4]
}
}


[Another Component] --> [Example 1]
[Example 1] --> [Folder 3]
[Folder 3] --> [Frame 4]
@enduml

image.png


对象图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@startuml
Object London
Object Washington
Object Berlin
Object NewYork

Map CapitalCity {
UK *-> London
USA *--> Washington
Germany *---> Berlin
}

NewYork --> CapitalCity::USA
@enduml

Pasted image 20230802164024.png


活动图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@startuml
Start
Repeat
: 测试某事;
If (发生错误?) then (没有)
#palegreen : 好的;
Break
Endif
->not ok;
: 弹窗 "文本过长错误";
Repeat while (某事发生文本过长错误?) is (是的) not (不是)
->//合并步骤//;
: 弹窗 "成功!";
Stop
@enduml

Pasted image 20230802164311.png


部署图

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
@startuml
Actor foo 1
Actor foo 2
foo 1 <-0-> foo 2
foo 1 <-(0)-> foo 2

(ac 1) -le (0)-> left 1
Ac 1 -ri (0)-> right 1
Ac 1 .up (0).> up 1
Ac 1 ~up (0)~> up 2
Ac 1 -do (0)-> down 1
Ac 1 -do (0)-> down 2

Actor 1 -0)- actor 2

Component comp 1
Component comp 2
Comp 1 *-0)-+ comp 2
[comp 3] <-->> [comp 4]

Boundary b 1
Control c 1
B 1 -(0)- c 1

Component comp 1
Interface interf 1
Comp 1 #~~( interf 1

: mode 1 actor: -0)- fooa 1
: mode 1 actorl: -ri 0)- foo 1 l

[component 1] 0)-(0-(0 [componentC]
() component 3 )-0-(0 "foo" [componentC]

[aze 1] #-->> [aze 2]
@enduml

Pasted image 20230802165543.png


状态图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@startuml
[*] -> State 1
State 1 --> State 2 : Succeeded
State 1 --> [*] : Aborted
State 2 --> State 3 : Succeeded
State 2 --> [*] : Aborted
State State 3 {
State "Accumulate Enough Data" as long 1
Long 1 : Just a test
[*] --> long 1
Long 1 --> long 1 : New Data
Long 1 --> ProcessData : Enough Data
State 2 --> [H]: Resume
}
State 3 --> State 2 : Pause
State 2 --> State 3[H*]: DeepResume
State 3 --> State 3 : Failed
State 3 --> [*] : Succeeded / Save Result
State 3 --> [*] : Aborted
@enduml

Pasted image 20230802170508.png


时序图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@startuml
Clock "Clock_0" as C 0 with period 50
Clock "Clock_1" as C 1 with period 50 pulse 15 offset 10
Binary "Binary" as B
Concise "Concise" as C
Robust "Robust" as R
Analog "Analog" as A

@0
C is Idle
R is Idle
A is 0

@100
B is high
C is Waiting
R is Processing
A is 3

@300
R is Waiting
A is 1
@enduml

Pasted image 20230802170855.png


其他


PlantUML 可以集成在各种外部工具中,例如可以集成到 Doxygen 、Markdown、Word 等工具中。

官方网站:plantuml. Com


C++ 源码转 PlantUML 工具

a.png