如何在 PlantUML UML Activity 图中引用较早的 activity

How to reference earlier activity in PlantUML UML Activity Diagram

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

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

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

意思是做A,第一题是做B,否则做C。 B问完问题2,有就做D,没有就做E。

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

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

我发现这是有效的...

|Main|
start
  :SomeClass constructor called;
  :buildTreeListOpts called;
if (hasOptions()) then (yes)
else (no)
    :require DataLoader;
    :call getData;
|#Cyan|DataLoader|
 :getData;
if (hasDataInLocalStorage()) then (yes)
else (no)
|DataLoader|
    :XHR fetch options;
    :callback;
endif
|Main|
endif
  :finalize;
stop

继续练习他们的现场演示,直到找到有用的东西。 http://plantuml.com/

祝你好运。

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

我尝试将 plantuml 用于流程图,但是当我接近状态机时,我转向了 graphviz。因此,针对您的问题的 graphviz 解决方案如下所示。

原图:

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> E [label="no"]
}

没有的时候让B转到C

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> C [label="no"]
}

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

digraph drawing1 {
  A -> B [label="yes"]
  A -> C [label="no"]
  B -> D [label="yes"]
  B -> C [label="no"]
  {rank=same B C}
}

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


在 Windows 中,一旦您安装了 graphviz 并想要生成 png 输出,您可以转到您的目录,其中包含一个包含您的二合字母代码的文件;让我们调用文件 test.gv.

然后运行下面的命令生成输出test.png.

dot test.gv -Tpng -o test.png

1 月份的 PlantUML 论坛上有 a similar question,但基本上解决方案是在这种情况下复制常见的活动。所以在你的情况下它会给出:

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

  if (Q2) then (yes)
    :D;
  else (no)
    :E;
    :C;
  endif

else (no)
  :C;
endif
stop
@enduml

目前似乎只能使用变通方法解决此问题。

我目前的解决方案(使用 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