I have a graph (dot), which gets rendered just fine. Now I would like to add some edges, which should have no impact on the rest of the graph. Ideally the additional edges should get drawn as straight lines between nodes. And these edges should cross nodes behind the nodes.
I tried constraint=false but this does not produce a straight line.
Example: The added line is the last gray one.
digraph K3LS {
rankdir=TB;
outputorder="edgesfirst";
// States
Start [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>Start</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>];
ScanBarcode [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>ScanBarcode</td></tr>
<tr>
<td port='onSerno' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSerno</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>];
HaveSerno [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveSerno</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>];
SearchingIssue [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingIssue</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>];
HaveIssue [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
IssueError [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>IssueError</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>];
SearchingRevocation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingRevocation</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>];
NeedRevocation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>NeedRevocation</td></tr>
<tr>
<td port='onRevoke' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onRevoke</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>];
RevokingCert [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>RevokingCert</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>];
HaveRevocation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
SearchingAffirmation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingAffirmation</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>];
NeedAffirmation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>NeedAffirmation</td></tr>
<tr>
<td port='onAffirm' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onAffirm</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>];
AffirmingReturn [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>AffirmingReturn</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>];
HaveAffirmation [shape=plain color="#cc0000" margin=0 label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveAffirmation</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>];
// Composables
ShowUsage [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowUsage</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowBarcodeScanner [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowBarcodeScanner</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowSerno [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowSerno</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
SearchIssue [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowIssueError [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowIssueError</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowIssue [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowIssue</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
SearchRevocation [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowRevocation [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowRevocation</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
RevokeCert [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>RevokeCert</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
SearchAffirmation [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchAffirmation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
AffirmReturn [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>AffirmReturn</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
ShowAffirmation [shape=plain color="#aa00ee" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowAffirmation</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
// Coroutines
BarcodeAnalyzer [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>BarcodeAnalyzer</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
JiraSearchIssue [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
JiraSearchRevocation [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
JiraSearchAffirmation [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchAffirmation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
JiraRevokeCert [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraRevokeCert</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
JiraAffirmReturn [shape=plain color="#0000cc" margin=0 label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraAffirmReturn</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>];
// Calls aiming a Composable
{ rank=same; Start ShowUsage }
Start:_:e -> ShowUsage:_:w [arrowhead=onormal minlen=2];
{ rank=same; ScanBarcode ShowBarcodeScanner }
ScanBarcode:_:e -> ShowBarcodeScanner:_:w [arrowhead=onormal minlen=2];
{ rank=same; HaveSerno ShowSerno }
HaveSerno:_:e -> ShowSerno:_:w [arrowhead=onormal minlen=2];
{ rank=same; SearchingIssue SearchIssue }
SearchingIssue:_:e -> SearchIssue:_:w [arrowhead=onormal minlen=2];
{ rank=same; IssueError ShowIssueError }
IssueError:_:e -> ShowIssueError:_:w [arrowhead=onormal minlen=2];
{ rank=same; HaveIssue ShowIssue }
HaveIssue:_:e -> ShowIssue:_:w [arrowhead=onormal minlen=2];
{ rank=same; SearchingRevocation SearchRevocation }
SearchingRevocation:_:e -> SearchRevocation:_:w [arrowhead=onormal minlen=2];
{ rank=same; RevokingCert RevokeCert }
RevokingCert:_:e -> RevokeCert:_:w [arrowhead=onormal minlen=2];
{ rank=same; HaveRevocation ShowRevocation }
HaveRevocation:_:e -> ShowRevocation:_:w [arrowhead=onormal minlen=2];
{ rank=same; SearchingAffirmation SearchAffirmation }
SearchingAffirmation:_:e -> SearchAffirmation:_:w [arrowhead=onormal minlen=2];
{ rank=same; AffirmingReturn AffirmReturn }
AffirmingReturn:_:e -> AffirmReturn:_:w [arrowhead=onormal minlen=2];
{ rank=same; HaveAffirmation ShowAffirmation }
HaveAffirmation:_:e -> ShowAffirmation:_:w [arrowhead=onormal minlen=2];
// Launches aiming a Coroutine
{ rank=same; ShowBarcodeScanner BarcodeAnalyzer }
ShowBarcodeScanner:_:e -> BarcodeAnalyzer:_:w [arrowhead=odiamond minlen=2];
{ rank=same; SearchIssue JiraSearchIssue }
SearchIssue:_:e -> JiraSearchIssue:_:w [arrowhead=odiamond minlen=2];
{ rank=same; SearchRevocation JiraSearchRevocation }
SearchRevocation:_:e -> JiraSearchRevocation:_:w [arrowhead=odiamond minlen=2];
{ rank=same; RevokeCert JiraRevokeCert }
RevokeCert:_:e -> JiraRevokeCert:_:w [arrowhead=odiamond minlen=2];
{ rank=same; SearchAffirmation JiraSearchAffirmation }
SearchAffirmation:_:e -> JiraSearchAffirmation:_:w [arrowhead=odiamond minlen=2];
{ rank=same; AffirmReturn JiraAffirmReturn }
AffirmReturn:_:e -> JiraAffirmReturn:_:w [arrowhead=odiamond minlen=2];
// Transitions aiming a State
Start:onScan:s -> ScanBarcode [arrowhead=normal];
ScanBarcode:onSerno:s -> HaveSerno [arrowhead=normal];
ScanBarcode:onScan:s -> Start [arrowhead=normal];
HaveSerno:onSearch:s -> SearchingIssue [arrowhead=normal];
SearchingIssue:onError:s -> IssueError [arrowhead=normal];
SearchingIssue:onSuccess:s -> HaveIssue [arrowhead=normal];
HaveIssue:_:s -> SearchingRevocation [arrowhead=normal];
SearchingRevocation:onSuccess:s -> HaveRevocation [arrowhead=normal];
SearchingRevocation:onError:s -> NeedRevocation [arrowhead=normal];
NeedRevocation:onRevoke:s -> RevokingCert [arrowhead=normal];
RevokingCert:onSuccess:s -> HaveRevocation [arrowhead=normal];
RevokingCert:onError:s -> NeedRevocation [arrowhead=normal];
HaveRevocation:_:s -> SearchingAffirmation [arrowhead=normal];
SearchingAffirmation:onSuccess:s -> HaveAffirmation [arrowhead=normal];
SearchingAffirmation:onError:s -> NeedAffirmation [arrowhead=normal];
NeedAffirmation:onAffirm:s -> AffirmingReturn [arrowhead=normal];
AffirmingReturn:onSuccess:s -> HaveAffirmation [arrowhead=normal];
AffirmingReturn:onError:s -> NeedAffirmation [arrowhead=normal];
// Additional line without impact.
HaveSerno -> IssueError [constraint=false color="#aaaaaa" dir=back arrowtail=onormal style=dashed];
}
The "easiest" way is to do this in a few steps
remove the new edges from your input
run this command dot myfile.gv >myfile.dot # This lays out all the nodes and "old" edges
edit myfile.dot and add the new edges (at the end of the file, but inside the last brace)
run neato -n2 -Tpng myfile.dot >myfile.png # adds the "new" edges, with splines=false (neato default)
For more info, see http://www.graphviz.org/faq/#FaqDotWithCoords
Here is the file I called myfile.dot. Note that it has position data for all the nodes and edges except the one that was by hand editing.
digraph K3LS {
graph [bb="0,0,598.5,1147",
outputorder=edgesfirst,
rankdir=TB
];
node [label="\N"];
{
graph [rank=same];
Start [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>Start</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>,
margin=0,
pos="236,1119.5",
shape=plain,
width=0.66667];
ShowUsage [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowUsage</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="338,1119.5",
shape=plain,
width=1.1806];
}
{
graph [rank=same];
ScanBarcode [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>ScanBarcode</td></tr>
<tr>
<td port='onSerno' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSerno</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>,
margin=0,
pos="225,1028.5",
shape=plain,
width=1.3056];
ShowBarcodeScanner [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowBarcodeScanner</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="378,1028.5",
shape=plain,
width=1.9444];
}
{
graph [rank=same];
HaveSerno [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveSerno</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>,
margin=0,
pos="202,937.5",
shape=plain,
width=1.1528];
ShowSerno [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowSerno</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="321,937.5",
shape=plain,
width=1.1528];
}
{
graph [rank=same];
SearchingIssue [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingIssue</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>,
margin=0,
pos="217,846.5",
shape=plain,
width=1.4444];
SearchIssue [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="347,846.5",
shape=plain,
width=1.1806];
}
{
graph [rank=same];
IssueError [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>IssueError</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>,
margin=0,
pos="321,755.5",
shape=plain,
width=1.0972];
ShowIssueError [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>ShowIssueError</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="450,755.5",
shape=plain,
width=1.5];
}
{
graph [rank=same];
HaveIssue [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="110,755.5",
shape=plain,
width=1.0972];
ShowIssue [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowIssue</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="224,755.5",
shape=plain,
width=1.0972];
}
{
graph [rank=same];
SearchingRevocation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingRevocation</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>,
margin=0,
pos="111,664.5",
shape=plain,
width=1.9167];
SearchRevocation [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="275,664.5",
shape=plain,
width=1.6528];
}
{
graph [rank=same];
RevokingCert [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>RevokingCert</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>,
margin=0,
pos="136,482.5",
shape=plain,
width=1.3611];
RevokeCert [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>RevokeCert</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="263,482.5",
shape=plain,
width=1.1806];
}
{
graph [rank=same];
HaveRevocation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="86,391.5",
shape=plain,
width=1.5694];
ShowRevocation [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowRevocation</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="235,391.5",
shape=plain,
width=1.5694];
}
{
graph [rank=same];
SearchingAffirmation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>SearchingAffirmation</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>,
margin=0,
pos="87,300.5",
shape=plain,
width=1.9722];
SearchAffirmation [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>SearchAffirmation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="255,300.5",
shape=plain,
width=1.7083];
}
{
graph [rank=same];
AffirmingReturn [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>AffirmingReturn</td></tr>
<tr>
<td port='onSuccess' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSuccess</font></td>
<td port='onError' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onError</font></td>
</tr>
</table>>,
margin=0,
pos="115,118.5",
shape=plain,
width=1.5972];
AffirmReturn [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'>AffirmReturn</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="256,118.5",
shape=plain,
width=1.3333];
}
{
graph [rank=same];
HaveAffirmation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>HaveAffirmation</td></tr>
<tr>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
</tr>
</table>>,
margin=0,
pos="58,27.5",
shape=plain,
width=1.6111];
ShowAffirmation [color="#aa00ee",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>composable</font></td></tr>
<tr><td colspan='4' border='1' color="#aa00ee" bgcolor="#ffeeff" port='_' cellpadding='4'><u>ShowAffirmation</u></td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="210,27.5",
shape=plain,
width=1.625];
}
{
graph [rank=same];
ShowBarcodeScanner;
BarcodeAnalyzer [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>BarcodeAnalyzer</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="541,1028.5",
shape=plain,
width=1.5972];
}
{
graph [rank=same];
SearchIssue;
JiraSearchIssue [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchIssue</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="478,846.5",
shape=plain,
width=1.4583];
}
{
graph [rank=same];
SearchRevocation;
JiraSearchRevocation [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchRevocation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="439,664.5",
shape=plain,
width=1.9167];
}
{
graph [rank=same];
RevokeCert;
JiraRevokeCert [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraRevokeCert</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="394,482.5",
shape=plain,
width=1.4583];
}
{
graph [rank=same];
SearchAffirmation;
JiraSearchAffirmation [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraSearchAffirmation</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="423,300.5",
shape=plain,
width=1.9722];
}
{
graph [rank=same];
AffirmReturn;
JiraAffirmReturn [color="#0000cc",
height=0.73611,
label=<
<table border='0' cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>coroutine</font></td></tr>
<tr><td colspan='4' border='1' color="#0000cc" bgcolor="#eeeeff" port='_' cellpadding='4'>JiraAffirmReturn</td></tr>
<tr><td color='#ffffff00' cellpadding='1'><font point-size='8'> </font></td></tr> </table>>,
margin=0,
pos="397,118.5",
shape=plain,
width=1.5972];
}
Start:onScan:s -> ScanBarcode [arrowhead=normal,
pos="e,228.63,1056.2 231,1093.5 231,1084.7 230.43,1075.2 229.64,1066.3"];
Start:_:e -> ShowUsage:_:w [arrowhead=onormal,
minlen=2,
pos="e,297,1122.5 258,1122.5 271.41,1122.5 277.04,1122.5 286.92,1122.5"];
ScanBarcode:onScan:s -> Start [arrowhead=normal,
pos="e,255.45,1091.9 242,1002.5 242,989.16 262.73,993.91 272,1003.5 288.22,1020.3 278.03,1033.5 272,1056 269.53,1065.2 265.33,1074.5 \
260.65,1083"];
ScanBarcode:onSerno:s -> HaveSerno [arrowhead=normal,
pos="e,202,965.28 202,1002.5 202,993.72 202,984.25 202,975.37"];
ScanBarcode:_:e -> ShowBarcodeScanner:_:w [arrowhead=onormal,
minlen=2,
pos="e,309,1031.5 270,1031.5 283.41,1031.5 289.04,1031.5 298.92,1031.5"];
HaveSerno:onSearch:s -> SearchingIssue [arrowhead=normal,
pos="e,217,874.28 217,911.5 217,902.72 217,893.25 217,884.37"];
HaveSerno:_:e -> ShowSerno:_:w [arrowhead=onormal,
minlen=2,
pos="e,281,940.5 242,940.5 255.41,940.5 261.04,940.5 270.92,940.5"];
SearchingIssue:onSuccess:s -> HaveIssue [arrowhead=normal,
pos="e,149.56,770.09 193,820.5 193,799.86 176.7,784.94 158.55,774.73"];
SearchingIssue:onError:s -> IssueError [arrowhead=normal,
pos="e,281.44,778.55 238,820.5 238,810.09 254.59,796.19 272.94,784.01"];
SearchingIssue:_:e -> SearchIssue:_:w [arrowhead=onormal,
minlen=2,
pos="e,306,849.5 267,849.5 280.41,849.5 286.04,849.5 295.92,849.5"];
HaveIssue:_:s -> SearchingRevocation [arrowhead=normal,
pos="e,111,692.19 111,744.5 111,730.76 111,715.67 111,702.39"];
HaveIssue:_:e -> ShowIssue:_:w [arrowhead=onormal,
minlen=2,
pos="e,186,758.5 148,758.5 160.93,758.5 166.44,758.5 175.89,758.5"];
IssueError:_:e -> ShowIssueError:_:w [arrowhead=onormal,
minlen=2,
pos="e,397,758.5 359,758.5 371.93,758.5 377.44,758.5 386.89,758.5"];
NeedRevocation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>NeedRevocation</td></tr>
<tr>
<td port='onRevoke' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onRevoke</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>,
margin=0,
pos="156,573.5",
shape=plain,
width=1.5694];
SearchingRevocation:onError:s -> NeedRevocation [arrowhead=normal,
pos="e,143.79,601.02 136,638.5 136,629.28 137.91,619.64 140.56,610.72"];
SearchingRevocation:onSuccess:s -> HaveRevocation [arrowhead=normal,
pos="e,81.824,419.19 78,638.5 78,556.94 72.812,536.39 78,455 78.534,446.62 79.468,437.64 80.513,429.18"];
SearchingRevocation:_:e -> SearchRevocation:_:w [arrowhead=onormal,
minlen=2,
pos="e,217,667.5 178,667.5 191.41,667.5 197.04,667.5 206.92,667.5"];
NeedRevocation:onRevoke:s -> RevokingCert [arrowhead=normal,
pos="e,126.84,510.27 121,547.5 121,538.46 122.44,528.89 124.42,519.98"];
RevokingCert:onError:s -> NeedRevocation [arrowhead=normal,
pos="e,171.54,545.72 156,456.5 156,443.6 176.04,448.22 185,457.5 201.21,474.28 190.03,487.21 185,510 183.03,518.91 179.66,528.06 175.9,\
536.52"];
RevokingCert:onSuccess:s -> HaveRevocation [arrowhead=normal,
pos="e,102.79,419.19 113,456.5 113,447.02 110.46,437.34 106.93,428.46"];
RevokingCert:_:e -> RevokeCert:_:w [arrowhead=onormal,
minlen=2,
pos="e,222,485.5 183,485.5 196.41,485.5 202.04,485.5 211.92,485.5"];
HaveRevocation:_:s -> SearchingAffirmation [arrowhead=normal,
pos="e,87,328.19 87,380.5 87,366.76 87,351.67 87,338.39"];
HaveRevocation:_:e -> ShowRevocation:_:w [arrowhead=onormal,
minlen=2,
pos="e,180,394.5 141,394.5 154.41,394.5 160.04,394.5 169.92,394.5"];
NeedAffirmation [color="#cc0000",
height=0.76389,
label=<
<table border='1' bgcolor="#ffeeee" cellborder='1'>
<tr><td colspan='4' border='0' align='right' cellpadding='0' cellspacing='10'><font point-size='6'>state</font></td></tr>
<tr><td colspan='4' border='1' color="#ffeeee" bgcolor="#ffeeee" port='_' cellpadding='4'>NeedAffirmation</td></tr>
<tr>
<td port='onAffirm' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onAffirm</font></td>
<td port='onScan' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onScan</font></td>
<td port='onSearch' color="#00aa00" bgcolor="#ffffff" cellpadding='1' cellspacing='3'><font point-size='8'>onSearch</font></td>
</tr>
</table>>,
margin=0,
pos="138,209.5",
shape=plain,
width=1.6111];
SearchingAffirmation:onError:s -> NeedAffirmation [arrowhead=normal,
pos="e,122.59,237.02 113,274.5 113,265.04 115.4,255.3 118.71,246.36"];
SearchingAffirmation:onSuccess:s -> HaveAffirmation [arrowhead=normal,
pos="e,53.302,55.174 53,274.5 53,192.93 43.172,172.37 49,91 49.601,82.604 50.652,73.623 51.827,65.161"];
SearchingAffirmation:_:e -> SearchAffirmation:_:w [arrowhead=onormal,
minlen=2,
pos="e,195,303.5 156,303.5 169.41,303.5 175.04,303.5 184.92,303.5"];
NeedAffirmation:onAffirm:s -> AffirmingReturn [arrowhead=normal,
pos="e,107.14,146.04 102,183.5 102,174.44 103.27,164.8 105.01,155.82"];
AffirmingReturn:onError:s -> NeedAffirmation [arrowhead=normal,
pos="e,156.64,181.77 138,92.5 138,77.16 161.81,82.497 172.5,93.5 188.76,110.24 178.32,123.4 172.5,146 170.14,155.17 166.11,164.43 161.63,\
172.91"];
AffirmingReturn:onSuccess:s -> HaveAffirmation [arrowhead=normal,
pos="e,76.829,55.271 88,92.5 88,82.948 85.226,73.287 81.365,64.467"];
AffirmingReturn:_:e -> AffirmReturn:_:w [arrowhead=onormal,
minlen=2,
pos="e,209,121.5 171,121.5 183.93,121.5 189.44,121.5 198.89,121.5"];
HaveAffirmation:_:e -> ShowAffirmation:_:w [arrowhead=onormal,
minlen=2,
pos="e,153,30.5 114,30.5 127.41,30.5 133.04,30.5 142.92,30.5"];
ShowBarcodeScanner:_:e -> BarcodeAnalyzer:_:w [arrowhead=odiamond,
minlen=2,
pos="e,485,1031.5 447,1031.5 459.01,1031.5 464.61,1031.5 472.92,1031.5"];
SearchIssue:_:e -> JiraSearchIssue:_:w [arrowhead=odiamond,
minlen=2,
pos="e,427,849.5 389,849.5 401.01,849.5 406.61,849.5 414.92,849.5"];
SearchRevocation:_:e -> JiraSearchRevocation:_:w [arrowhead=odiamond,
minlen=2,
pos="e,371,667.5 334,667.5 345.56,667.5 351.03,667.5 358.97,667.5"];
RevokeCert:_:e -> JiraRevokeCert:_:w [arrowhead=odiamond,
minlen=2,
pos="e,343,485.5 305,485.5 317.01,485.5 322.61,485.5 330.92,485.5"];
SearchAffirmation:_:e -> JiraSearchAffirmation:_:w [arrowhead=odiamond,
minlen=2,
pos="e,353,303.5 316,303.5 327.56,303.5 333.03,303.5 340.97,303.5"];
AffirmReturn:_:e -> JiraAffirmReturn:_:w [arrowhead=odiamond,
minlen=2,
pos="e,341,121.5 303,121.5 315.01,121.5 320.61,121.5 328.92,121.5"];
// added by hand
HaveSerno -> IssueError [constraint=false color="#aaaaaa" dir=back arrowtail=onormal style=dashed];
}
And the result: