您好我想要一个带点语言的uml序列图,现在我有以下问题我希望布局如下,a,b,c和d在顶部的直线但是线路正在直接到底。我怎样才能做到这一点?
a b c d
| | | |
| | | |
也许我可以实现a,b,c和d及其所属边缘是群集,我为群集设置了不同的rankdir?
编辑刚刚通过在a,b,c和d之间添加不可见的边缘而不是任何其他解决方案找到了解决方案?
答案 0 :(得分:7)
您所描述的内容似乎是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"
)在需要的地方。
答案 1 :(得分:7)
您可以尝试使用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
答案 2 :(得分:0)
PlantUML使用Graphviz,因此一种选择是仅使用PlantUML。例如,在PlantUML中,此...
@startuml
Bob -> Alice : hello
@enduml
...被渲染为此...
上面的图在http://plantuml.com/plantuml/...呈现,您可以阅读PlantUML序列图in the documentation。另外,也可以从the command line和PlantUML plugins are available for many popular IDEs中使用PlantUML。
您还可以使用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
的Mac上如此)digraph sequenceDiagramExample {...}
代码放在一个名为sequenceDiagramExample.dot
的文本文件中$ neato -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
,这将生成一个名为sequenceDiagramExample.png
的PNG文件neato
与dot
可执行文件混淆neato
可能是您想要对元素的位置进行粒度控制时要使用的(欢迎在注释中使用替代观点!)neato
和dot
的渲染(Graphviz也包括)dot
(例如$ dot -Tpng sequenceDiagramExample.dot -o sequenceDiagramExample.png
)从建议#2渲染有向图将产生此结果... 答案 3 :(得分:0)
有志者事竟成!
这是一个如何使用点进行操作的示例:
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]; }
}
渲染后,将产生此图像:
关于如何实现此目标的一些重要提示: