PlantUML基本示例

4

我正在评估PlantUML是否可以成为GraphViz的良好替代品。

它被宣传为“直观”,但老实说,主页上的第一个例子已经令人困惑。

为什么下面的代码会创建两个“Bob”和两个“Alice”? 文本中有2个节点,但输出中却有4个。 此外,箭头并不是连接节点,而是连接节点重复之间的关系。

Bob->Alice : hello

这里输入图片描述

我完全不理解。 这个例子的意思是什么?有没有一个更简单的例子,只有两个节点和它们之间的箭头?


你应该尝试一下PlantUML的文档,该文档包含了许多示例。https://plantuml.com/zh/ - Arnaud Gueras
2个回答

10

我看到你掉入了经典的陷阱,即“手册的第一页并不能代表整个工具”(1)

除了各种 UML 图表(例如您遇到的序列图),PlantUML 还支持各种其他与软件开发相关的格式(例如 ,块图,,计算机网络图表, 图表,思维导图和 ),以及可视化 文件。

事实上,它甚至理解Graphviz语法!(2)

由于所有这些,“直观”不会在您拥有一些PlantUML的基本知识之前发生。

因此回到您的问题……您看到的不是您所想象的。

那是什么?

与Graphviz相关的事物,而不是这个:

digraph d {
    Bob -> Alice : hello
}

你实际上看到了这个:(3)

@startuml
digraph sequenceDiagramExample {
  bobHead [ label="Bob" pos="0,1.5!" shape="record" ];
  bobPoint0 [ pos="0,0.75!" shape="point" width="0" ]
  bobFoot [ label="Bob" pos="0,0!" shape="record" ];
  aliceHead [ label="Alice" pos="1,1.5!" shape="record" ];
  alicePoint0 [ pos="1,0.75!" shape="point" width="0" ]
  aliceFoot [ label="Alice" pos="1,0!" shape="record" ];
  bobHead -> bobPoint0 -> bobFoot [ dir="none" style="dashed" ]
  aliceHead -> alicePoint0 -> aliceFoot [ dir="none" style="dashed" ]
  bobPoint0 -> alicePoint0 [ label="hello" labelloc="c" style="solid" ]
}
@enduml

给我一个例子!

仅有两个节点和之间箭头的示例看起来取决于所选择的图形类型...

需要记住的是,在Graphviz中,你必须自行应用所有含义于图表。在PlantUML中,PlantUML为你提供含义。你只需要告诉PlantUML你的意思。

通过一些基本指针,这很快变得直观。在开始之前,你只需要知道要绘制什么样的图表...

从下面的示例中可以看出,PlantUML是一种非常强大的工具,可添加到软件开发工具中。

我希望这些示例将有助于使事情更加直观,并且您的第一次错误不会阻止您进一步探索PlantUML!

活动

@startuml
:Alice;
:Bob;
@enduml

Archimate

@startuml
archimate #Application Alice
archimate #Business Bob
Alice -> Bob
@enduml

@startuml
Alice -|> Bob: Hello
@enduml

组件

@startuml
[Alice] -> [Bob]: Hello
@enduml

部署

@startuml
folder Alice
file Bob
Alice -> Bob: Hello
@enduml

Ditaa

@startditaa

+-------+       +-----+
|       | hello |     |
| Alice +------>| Bob |
|       |       |     |
+-------+       +-----+
@endditaa

甘特图

@startgantt
[Alice]->[Bob]
@endgantt

JSON

@startjson
{
  "Alice": ["Bob"]
}
@endjson

思维导图

@startmindmap
+ Alice
++ Bob
@endmindmap

网络

@startuml
nwdiag {
  network hello {
    Alice;
    Bob;
  }
}
@enduml

对象

@startuml
object Alice
object Bob
Alice -> Bob
@enduml

序列

@startuml
Bob -> Alice : hello
@enduml

状态

@startuml
[*] -> Alice
Alice -> Bob: hello
Bob -> [*]
@enduml

时间

@startuml
concise Hello
0 is Alice
+100 is Bob
@enduml

使用案例

@startuml
:Alice: -> :Bob: : Hello
@enduml

WBS

@startwbs
+ Alice
++ Bob
@endwbs

脚注

  1. 这不是一个真正的经典,我只是编了个故事。但这是一件常见的事情。
  2. 请参考这里的手册:https://plantuml.com/dot
  3. 使用neato而不是dot渲染,请参阅https://dev59.com/W0nSa4cB1Zd3GeqPPI8G#53470455

1
非常感谢您的详细解释!这对于理解PlantUML如何有益非常有帮助。我也没有意识到Plant是建立在Graphviz之上的,这可能意味着如果Graphviz无法做某些事情(例如在不使用HTML表格的情况下对记录中的单个字段进行着色),那么PlantUML也无法做到。再次感谢! - Bouke Versteegh
有趣。从UML的角度来看,只有一些令人困惑的图表,比如演员到演员,或者Alice类继承自Bob类。 - Christophe
@Christophe 我必须承认我有点懒,有时候不太确定应该使用什么替代方案,这样从 UML 视角来看才有意义,而且不会让不同类型的图表看起来太像以至于让事情变得混乱... 例如,工作分解结构图很糟糕... :-/ 也许周末之后我会回来稍微整理一下 :-D - Potherca

3
他们不是“四个节点”,而是序列中每个参与者的顶部和底部标题。这对于在较大的序列图中提高可读性非常有用,您可以在此处查看一些示例:https://plantuml.com/en/sequence-diagram 您可以使用样式使您的图表符合严格的UML标准。
skinparam style strictuml

PlantUML输出


完整代码

@startuml
skinparam style strictuml
Bob -> Alice : hello
Alice -> Bob : ok
@enduml

那么我理解PlantUML是为序列图而设计的,而不是像GraphViz一样用于任意图形吗?或者它能做一些简单的事情,比如A->B,只显示两个节点和它们之间的箭头吗? - Bouke Versteegh
@BoukeVersteegh PlantUML 不仅限于 UML... 它起初是这样的,但自那时以来已经变得非常多才多艺。我已经添加了一个答案来演示... - Potherca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接