在状态机中绘制反射边

时间:2010-04-27 22:05:59

标签: graph graphviz state-machine rendering-engine

我必须绘制一个具有一些自反转换的小型有限状态机(意味着转换的开始和结束状态相等。

问题是在Graphviz中渲染它会产生难看的结果。

digraph finite_state_machine {  
    edge [fontsize=11];

    S0 -> S0 [label = "td=1\n-/e2"];   
    S0 -> S1 [label = "td=3 \n-/e3" ];  
    S1 -> S0 [label = "td=3\n-/-\nt=0"];  
    S0 -> S2 [label = "P:i1/e4"];  
    S2 -> S0 [label = "td=0\n-/-" ];  
    S0 -> S0 [label = "i1/e1\ntd+=1"];  
}

A rendering of the state machine http://img91.imageshack.us/img91/2300/previewom.png

有没有办法让这个看起来更好一点?

BTW:我尝试过head / tailport,但它们不能用于我的Graphviz版本(Mac OS X上的1.13)

我不仅限于点引擎,我只想要一个漂亮的图形并且不关心渲染器/语言。

非常感谢

1 个答案:

答案 0 :(得分:5)

所以,如果找到了解决方法,但不能解决我的问题 诀窍是有一个不可见的节点连接到起始状态。然后,起始状态不是层次结构的顶部,并且在放置节点时具有更多的自由度。此外,head / tailport属性也可以正常工作。 结果是 - 如果不是我想要的漂亮 - 可以看看。

digraph finite_state_machine {  
  edge [fontsize=7];
  fontsize = 11;
  rankdir=LR;
  {rank = same;null}
  {rank = same; S0}
  {rank = same; S1 S2}
  nodesep = 1;
  ranksep = 1;

  null [shape = plaintext label=""];
  null -> S0;
  S0 -> S0 [label = "td=1\n-/e2", tailport = n, headport = n]; 
  S0 -> S1 [label = "td=3 \n-/e3" ];
  S1 -> S0 [label = "td=3\n-/-\nt=0"];
  S0 -> S2 [label = "P:i1/e4"];
  S2 -> S0 [label = "td=0\n-/-" ];
  S0 -> S0 [label = "i1/e1\ntd+=1" headport = s tailport = s];
}

a rendering of the state machine http://img532.imageshack.us/img532/4083/previewd.png

虽然这有效(对于这个特定的例子),我仍然非常喜欢dot / Graphviz上的一些建议,或者是以令人愉悦的方式呈现有限状态机的替代方案。