2012-06-01 37 views
0

每次我使用下面显示的方法将图形对象转换为点语言时,兄弟姐妹的顺序会丢失。有什么办法可以避免这种情况?Graphviz同胞顺序

StringWriter theGraph = new StringWriter(); 
graph.printGraph(theGraph); 
theGraph.toString(); 

更新:

我的程序生成的图表并将其显示在Java小程序。为了让它们格式化,我使用GrappaSupport.filterGraph函数将非格式化图形提供给dot.exe并获取格式化图。该函数返回一个图形对象。然而,要发送图到小程序,我需要将它显示为字符串,所以我将它转换回点语言(使用上面给出的代码)。我的程序产生

图:

digraph "Graph" { 
    i168CF2[label="PROPERTY\n(2-cur.)" ] 
    i168D02[style=filled, label="NAME\n(2-9, 13-cur.)", color=palegreen ] 
    i168CF2->i168D02 
    i168D010[style=filled, label="NAME\n(10-12)", color=lightgrey ] 
    i168CF2->i168D010 [color=lightgrey] 
    i168D22[style=filled, label="TEXT\n(2-9)", color=lightgrey ] 
    i168CF2->i168D22 [color=lightgrey] 
    i168D210[style=filled, label="TEXT\n(10, 12-cur.)", color=palegreen ] 
    i168CF2->i168D210 
    i168D211[style=filled, label="TEXT\n(11)", color=lightgrey ] 
    i168CF2->i168D211 [color=lightgrey] 
} 

通过dot.exe Layouted和转换回点语言图:

digraph "Graph" { 
    graph [bb = "0,0,552,144"]; 
    i168D22 [ 
     height = "0.74639", 
     style = filled, 
     color = lightgray, 
     width = "1.0344", 
     label = "TEXT\n(2-9)", 
     pos = "37,27" 
    ]; 
    i168CF2 [ 
     height = "0.74639", 
     width = "1.7589", 
     label = "PROPERTY\n(2-cur.)", 
     pos = "250,117" 
    ]; 
    i168D211 [ 
     height = "0.74639", 
     style = filled, 
     color = lightgray, 
     width = "1.0344", 
     label = "TEXT\n(11)", 
     pos = "130,27" 
    ]; 
    i168D02 [ 
     height = "0.74639", 
     style = filled, 
     color = palegreen, 
     width = "1.7826", 
     label = "NAME\n(2-9, 13-cur.)", 
     pos = "250,27" 
    ]; 
    i168D210 [ 
     height = "0.74639", 
     style = filled, 
     color = palegreen, 
     width = "1.6779", 
     label = "TEXT\n(10, 12-cur.)", 
     pos = "393,27" 
    ]; 
    i168D010 [ 
     height = "0.74639", 
     style = filled, 
     color = lightgray, 
     width = "1.1153", 
     label = "NAME\n(10-12)", 
     pos = "512,27" 
    ]; 
    i168CF2 -> i168D010 [ 
     color = lightgray, 
     pos = "e,481.77,44.917 304.57,103.17 347.98,92.22409.87,74.943462,54465.47,52.605 469.02,51.046 472.55,49.404" 
    ]; 
    i168CF2 -> i168D210 [ 
      pos = "e,358.38,49.305 284.98,94.473 304.52,82.452 329.02,67.371 349.75,54.614" 
    ]; 
    i168CF2 -> i168D22 [ 
      color = lightgray, 
      pos = "e,65.486,44.636 200.92,99.814 167.46,88.26 122.43,71.686 84,54 80.855,52.553 77.634,50.978 74.425,49.344" 
    ]; 
    i168CF2 -> i168D211 [ 
      color = lightgray, 
      pos = "e,155.54,46.726 219.1,93.338 202.15,80.909 181.11,65.483 163.74,52.741" 
    ]; 
    i168CF2 -> i168D02 [ 
      pos = "e,250,54.046 250,90.073 250,81.999 250,72.943 250,64.296" 
    ]; 

}

正如你可以看到节点的i168CF2的顺序儿童改为: i168D02,i168D010,i168D22,i168D210,i168D211

要: i168D22,i168D211,i168D02,i168D210,i168D010

有什么办法避免这种情况?这种混洗发生在从图形对象到点语言的对话过程中,而不是在使用dot.exe进行自动布局期间(它返回相同的顺序)。

+0

您是否期望我们可以通过此代码片段重现您的问题? – Thor

+0

问题是在对话之后输入节点的顺序不被保留(我粘贴代码以显示我使用的对话,也许还有其他方法),并且同级顺序与最初不同。也许存在一些参数,明确定义方向图中的兄弟姐妹的顺序? –

+0

你可以用'.dot'文件显示这个吗? – Thor

回答

0

这可能不会解决你的问题,但以防万一:如果你的目标是美化点的图表,你可以考虑使用dot与输出格式canon。来自documentation

使用canon可生成输入的打印版本,但不执行任何布局。

此转换尊重节点出现的顺序。