如何在PlantUML UML活动图中引用先前的活动

时间:2017-11-12 15:28:00

标签: uml activity-diagram plantuml

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

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

@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,而是我想参加活动C,但我不知道如何引用它。如果我把:C;在那里(而不是:E;它只是被解释为一个新的活动(但它的流程应该从C那里继续)。我认为有一种方法可以用PlantUML绘制这样的流程,但我不会这样做。看到了。

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

4 个答案:

答案 0 :(得分:2)

出于这个原因,我搬到了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"]
}

在Windows中,一旦安装了graphviz并想要生成png输出,就可以使用包含有向图代码的文件转到目录;让我们调用文件test.gv

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

dot test.gv -Tpng -o test.png

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

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

我放弃了用植物解决类似的问题。

答案 1 :(得分:0)

这是我发现的工作......

|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/

祝你好运。

答案 2 :(得分:0)

一月份的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

目前看来,只能对此使用一种解决方法。

答案 3 :(得分:0)

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