4

我正在尝试使用 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

植物uml图

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

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

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

4

4 回答 4

5

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

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

原图:

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

PlantUML 图形可视化图

没有时让B转到C。

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

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

PlantUML Graphviz 图

我放弃了用 Plantuml 解决与您类似的问题。


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

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

dot test.gv -Tpng -o test.png
于 2018-01-09T22:37:16.913 回答
4

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

植物uml图

于 2019-02-02T01:10:46.067 回答
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

PlantUML 图

继续练习他们的现场演示,直到找到有效的方法。 http://plantuml.com/

祝你好运。

于 2017-11-17T15:15:28.140 回答
0

一月份的 PlantUML 论坛上有一个类似的问题,但基本上解决方案是在这种情况下复制常见活动。所以在你的情况下,它会给出:

@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 Graphviz 图

目前似乎只能为此使用解决方法。

于 2018-09-28T13:53:53.913 回答