带Graphviz的分层状态机 [英] Hierarchical State Machine with Graphviz
本文介绍了带Graphviz的分层状态机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在Graphviz的帮助下制作供应商机器的状态图。
我希望结果接近this one。
它也由嵌套的状态机组成。以下是我到目前为止在Graphviz所做的事情。请查找在线演示here。
digraph vendorMachine {
compound=true
Entry[shape="point" label=""]
subgraph cluster_cancel {
label = "Cancel"
style = rounded
C0 [label = <
<table cellborder="0" style="rounded">
<tr><td>C0</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C25 [label = <
<table cellborder="0" style="rounded">
<tr><td>C25</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C50 [label = <
<table cellborder="0" style="rounded">
<tr><td>C50</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C75 [label = <
<table cellborder="0" style="rounded">
<tr><td>C75</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
subgraph cluster_DispenseC100Drink {
label = "DispenseC100Drink"
style = rounded
C100 [label = <
<table cellborder="0" style="rounded">
<tr><td>C100</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
subgraph cluster_DispenseC125Drink {
label = "DispenseC125Drink"
style = rounded
C125 [label = <
<table cellborder="0" style="rounded">
<tr><td>C125</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C150 [label = <
<table cellborder="0" style="rounded">
<tr><td>C150</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C175 [label = <
<table cellborder="0" style="rounded">
<tr><td>C175</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C200 [label = <
<table cellborder="0" style="rounded">
<tr><td>C200</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
}
}
}
Entry -> C0
C0 -> C25[label=" Add
$0.25 "]
C0 -> C50[label=" Add
$0.50 "]
C25 -> C50[label=" Add
$0.25 "]
C25 -> C75[label=" Add
$0.50 "]
C50 -> C75[label=" Add
$0.25 "]
C50 -> C100[label=" Add
$0.50 "]
C100 -> C0[label=" Dispense
$1.00 Drink " ltail="cluster_DispenseC100Drink"]
C75 -> C100[label=" Add
$0.25 "]
C75 -> C125[label=" Add
$0.50 "]
C100 -> C125[label=" Add
$0.25 "]
C100 -> C150[label=" Add
$0.50 "]
C125 -> C150[label=" Add
$0.25 "]
C125 -> C175[label=" Add
$0.50 "]
C125 -> C0[label=" Dispense
$1.25 Drink " ltail="cluster_DispenseC125Drink"]
C150 -> C175[label=" Add
$0.25 "]
C150 -> C200[label=" Add
$0.50 "]
C175 -> C200[label=" Add
$0.25 "]
C200 -> C0[label=" Dispense
$2.00 Drink "]
}
因此,我的问题是:
- 如何使其与上述图像相似?
- 除了我的Graphviz代码之外,还有其他更好的方法来实现这一点吗?(这是我迄今为止做过的最好的方法吗)
- Graphviz代码中缺少一个转换,即如果我们传递Cancel事件,它应该转到C0状态(请签入所附图像)。我们如何使用Graphviz实现这一点?
提前感谢您的建议和回答。
推荐答案
直接图形(命令行)生成不同的(和";Closer";)结果。以下是您的程序,只做了一些调整:
digraph vendorMachine {
compound=true
graph [color=red]
node [color=red] // yuck style=filled fillcolor=yellow]
edge [color=red]
Entry[shape="point" label=""]
subgraph cluster_cancel {
label = "Cancel"
style = rounded
E2 [shape=rect label="" width=2 style=invis]
E2:sw->C0 [label=cancel]
C0 [label = <
<table cellborder="0" style="rounded">
<tr><td>C0</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C25 [label = <
<table cellborder="0" style="rounded">
<tr><td>C25</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C50 [label = <
<table cellborder="0" style="rounded">
<tr><td>C50</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C75 [label = <
<table cellborder="0" style="rounded">
<tr><td>C75</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
subgraph cluster_DispenseC100Drink {
label = "DispenseC100Drink"
style = rounded
C100 [label = <
<table cellborder="0" style="rounded">
<tr><td>C100</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
subgraph cluster_DispenseC125Drink {
label = "DispenseC125Drink"
style = rounded
C125 [label = <
<table cellborder="0" style="rounded">
<tr><td>C125</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C150 [label = <
<table cellborder="0" style="rounded">
<tr><td>C150</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C175 [label = <
<table cellborder="0" style="rounded">
<tr><td>C175</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
C200 [label = <
<table cellborder="0" style="rounded">
<tr><td>C200</td></tr>
<hr/>
<tr><td></td></tr>
</table>
> margin=0 shape=none]
}
}
}
Entry -> C0
C0 -> C25[label=" Add
$0.25 "]
C0 -> C50[label=" Add
$0.50 "]
C25 -> C50[label=" Add
$0.25 "]
C25 -> C75[label=" Add
$0.50 "]
C50 -> C75[label=" Add
$0.25 "]
C50 -> C100[label=" Add
$0.50 "]
C100 -> C0[label=" Dispense
$1.00 Drink " ltail="cluster_DispenseC100Drink"]
C75 -> C100[label=" Add
$0.25 "]
C75 -> C125[label=" Add
$0.50 "]
C100 -> C125[label=" Add
$0.25 "]
C100 -> C150[label=" Add
$0.50 "]
C125 -> C150[label=" Add
$0.25 "]
C125 -> C175[label=" Add
$0.50 "]
C125 -> C0[label=" Dispense
$1.25 Drink " ltail="cluster_DispenseC125Drink"]
C150 -> C175[label=" Add
$0.25 "]
C150 -> C200[label=" Add
$0.50 "]
C175 -> C200[label=" Add
$0.25 "]
C200 -> C0[label=" Dispense
$2.00 Drink "]
}
这篇关于带Graphviz的分层状态机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文