您好我想要一个带有点语言的 uml 序列图,现在我有以下问题我想要布局如下,a、b、c 和 d 在顶部呈一条直线,但线条直接指向底部。我怎样才能做到这一点?
a b c d
| | | |
| | | |
也许我可以实现 a、b、c 和 d 及其所属边缘是集群,我为集群设置了不同的 rankdir?
编辑刚刚通过在 a、b、c 和 d 之间添加不可见边缘找到了解决方案,但还有其他解决方案吗?
有志者,事竟成!
这是一个关于如何使用 dot 执行此操作的示例:
digraph SEQ_DIAGRAM {
graph [overlap=true, splines=line, nodesep=1.0, ordering=out];
edge [arrowhead=none];
node [shape=none, width=0, height=0, label=""];
{
rank=same;
node[shape=rectangle, height=0.7, width=2];
api_a[label="API A"];
api_b[label="API B"];
api_c[label="API C"];
}
// Draw vertical lines
{
edge [style=dashed, weight=6];
api_a -> a1 -> a2 -> a3;
a3 -> a4 [penwidth=5, style=solid];
a4 -> a5;
}
{
edge [style=dashed, weight=6];
api_b -> b1 -> b2 -> b3 -> b4;
b4 -> b5 [penwidth=5; style=solid];
}
{
edge [style=dashed, weight=6];
api_c -> c1;
c1-> c2 [penwidth=5, style=solid];
c2 -> c3 -> c4 -> c5;
}
// Draws activations
{ rank=same; a1 -> b1 [label="activate()"]; b1 -> c1 [arrowhead=normal]; }
{ rank=same; a2 -> b2 [style=invis]; b2 -> c2 [label="refund()", arrowhead=normal, dir=back]; }
{ rank=same; a3 -> b3 [arrowhead=normal, dir=back, label="place_order()"]; b3 -> c3; }
{ rank=same; a4 -> b4 [label="distribute()", arrowhead=normal]; }
{ rank=same; a5 -> b5 [style=invis]; b5 -> c5 [label="bill_order()", arrowhead=normal]; }
}
渲染后,这将产生这个图像:
关于这是如何实现的,有一些重要的提示:
您所描述的似乎是dot
默认情况下所做的。
例如,这个图表:
digraph SO {
a -> a1 -> a2
b -> b1 -> b2
c -> c1 -> c2
d -> d1 -> d2
}
出来是这样的:
如果您有一个更复杂的图表,您可以使用rank=same
. 例如:
digraph SO {
{ rank = same
a b c d
}
a -> a1 -> a2
b -> b1 -> b2 -> b3 -> b4
c -> c1
d -> d1 -> d2 -> d3
d2 -> a2
}
出来是这样的:
但是,如果您希望a
, b
,c
和d
以特定顺序排列,我认为您将不得不像您建议的那样使用不可见的边缘。该dot
指南甚至建议这样做:
当节点被限制在相同的等级时,边缘权重也会起作用。这些节点之间具有非零权重的边尽可能沿同一方向(从左到右,或在旋转图形中从上到下)跨越等级。可以利用这一事实通过在需要的
style="invis"
地方放置不可见的边 ( ) 来调整节点排序。
你可以试试 mscgen(消息序列图生成器)
一个简单的图表是 example.msc
msc {
A,B;
--- [label="Start", ID="1"];
A->B [label="signal"];
A<-B [label="signal"];
}
$:mscgen -T png -o example.png -i example.msc。
那就是生成漂亮的序列图。
谢谢, Srikanth Kyatham
PlantUML 使用 Graphviz,因此一种选择是简单地使用 PlantUML。例如,在 PlantUML 中,这...
@startuml
Bob -> Alice : hello
@enduml
...呈现为这样...
上图呈现在http://plantuml.com/plantuml/...,您可以阅读文档中的PlantUML 序列图。此外,PlantUML 也可以从命令行使用,PlantUML插件可用于许多流行的 IDE。
您还可以使用Graphviz和NEATO (PDF)。例如,这个有向图...
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" ]
}
并从命令行通过 NEATO(随 Graphviz 一起安装)渲染它......
...呈现为这样...
要使用 NEATO 渲染上图,请执行以下操作:
$ brew install graphviz # requires Homebrew
)digraph sequenceDiagramExample {...}
上面的代码放在一个名为的文本文件中sequenceDiagramExample.dot
$ neato -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
,这将生成一个名为的 PNG 文件sequenceDiagramExample.png
neato
与dot
可执行文件混淆neato
当您想要精细控制元素的定位方式时,可能是您想要使用的(欢迎评论中的其他观点!)neato
与渲染混淆dot
(Graphviz 也包含)dot
(例如$ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
)从 Suggestion #2 渲染有向图将产生这个......