带Graphviz的分层状态机 [英] Hierarchical State Machine with Graphviz

查看:4
本文介绍了带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 "]

}

因此,我的问题是:

  1. 如何使其与上述图像相似?
  2. 除了我的Graphviz代码之外,还有其他更好的方法来实现这一点吗?(这是我迄今为止做过的最好的方法吗)
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆