如何在 PlantUML UML 活动图中引用早期活动

Rod*_*rik 5 uml activity-diagram plantuml

我正在尝试使用 PlantUML(新测试语法)制作活动图。

到目前为止,我想出了(简化的):

@startuml
start
:A;
if (Q1) then (yes)
  :B;
  
  if (Q2) then (yes)
    :D;
  else (no)
    :E;
  endif
  
else (no)
  :C;
endif
stop
@enduml
Run Code Online (Sandbox Code Playgroud)

工厂uml图

这意味着,如果第一个问题是,则执行A,否则执行B,否则执行C。在B问问题2之后,如果是,则执行D,如果否,则执行E。

当问题 2 的答案为“否”时,我不想指向 E,而是转到活动 C,但我不知道如何引用它。如果我输入 :C; 那里(而不是:E;它只是被解释为一个新活动(但是它的流程应该从那里的 C 继续)。我假设有一种方法可以使用 PlantUML 绘制这样的流程,但我还没有看到它。

引用已定义的活动的最佳方式是什么?

小智 7

正是出于这个原因,我转向了graphviz 。Plantuml 为某些类型的图表提供了一些简单的语法,但对于在多个方向上移动就变得具有挑战性。

我尝试使用 plantuml 绘制流程图,但当我接近状态机时,我转向 graphviz。因此,您的问题的 graphviz 解决方案如下所示。

原图:

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> E [label="no"]
}
Run Code Online (Sandbox Code Playgroud)

PlantUML graphviz 图

当没有时让 B 转到 C。

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> C [label="no"]
}
Run Code Online (Sandbox Code Playgroud)

PlantUML Graphviz 图

如果您想让节点 B 和 C 彼此对齐,可以使用以下代码更改。

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> C [label="no"]
  {rank=same B C}
}
Run Code Online (Sandbox Code Playgroud)

PlantUML Graphviz 图

我放弃了用 plantuml 解决与你类似的问题。


在 Windows 中,一旦安装了 graphviz 并想要生成 png 输出,您就可以进入包含有向图代码的文件的目录;我们将该文件称为test.gv.

然后运行以下命令来生成输出test.png

dot test.gv -Tpng -o test.png
Run Code Online (Sandbox Code Playgroud)


nmz*_*787 7

我当前的解决方案(使用 plantUML 一周左右)是这样的:

@startuml
start
:A;
if (Q1) then (yes)
  :B;

  if (Q2) then (yes)
    :D;
  else (no)
    :E;
    :call C>
  endif
else (no)
  :call C>
endif
stop
partition C {
  :do 1st C thing;
  :do 2nd C thing;
}
@enduml
Run Code Online (Sandbox Code Playgroud)

工厂uml图