graphgraphvizstate-machinerendering-engine

Drawing reflexive edges in State Machines


I have to draw a small finite state machine that has some reflexive transitions (meaning the start and the end state of the transition are equal.

The problem is that rendering that in Graphviz has ugly results.

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

Is there a way to make this look a little better?

BTW: I tried head/tailport but they don't work on my version of Graphviz (1.13 on Mac OS X)

I am not limited to the dot engine, I only want a nice looking graph and don't care about the renderer/language.

Thanks a lot


Solution

  • So, if found a workaround, but not really an answer to my problem.
    The trick is to have an invisible node that connections to the starting state. the starting state is then not the top of the hierarchy and one has a little bit more freedom in placing the nodes. Also then the head/tailport attributes work as they should. The result is - if not a pretty as I would like it to be - ok to look at.

    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

    While this works (for this particular example) I would still very much like some advice on dot/Graphviz or an alternative for rendering finite state machines in a pleasing way.