我有一个图形(点),它被渲染得很好。现在,我想添加一些边,这应该不会影响到图的其余部分。理想情况下,附加的边应该画成节点之间的直线。这些边缘应该穿过节点后面的节点。
我试过constraint=false,但这不会产生直线。
增加的一行是最后一条灰色的。
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];
}发布于 2022-11-30 21:18:56
“最简单”的方法是在几个步骤中做到这一点。
dot myfile.gv >myfile.dot #这将列出所有节点和“旧”边缘neato -n2 -Tpng myfile.dot >myfile.png #添加“新”边缘,其中splines=false (neato默认值)H 210F 211有关更多信息,请参见http://www.graphviz.org/faq/#FaqDotWithCoords
这是我称为myfile.dot的文件。请注意,除了手工编辑的节点和边缘之外,它具有所有节点和边缘的位置数据。
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];
}其结果是:

https://stackoverflow.com/questions/74632664
复制相似问题