2009-12-24 10 views
0

Я пытаюсь построить граф Graphviz, содержащий вершины записей, используя QuickGraph. До сих пор у меня есть это:QuickGraph GraphvizRecord не отображается в вершинах

var algo = new GraphvizAlgorithm<Entity, EntityEdge>(this); 
algo.CommonVertexFormat.Shape = GraphvizVertexShape.Record; 
algo.CommonVertexFormat.Style = GraphvizVertexStyle.Filled; 
algo.FormatVertex += new FormatVertexEventHandler<Entity>(FormatVertex); 

private void FormatVertex(object sender, FormatVertexEventArgs<Entity> e) { 
    Entity ent = e.Vertex; 
    GraphvizRecord rec = new GraphvizRecord(); 

    GraphvizRecordCell rootCell = new GraphvizRecordCell(); 
    rootCell.Text = ent.ClassName + "\\n" + ent.TargetName; 

    var inputs = ent.GetUniqueInputNames(); 

    foreach (string input in inputs) { 
     GraphvizRecordCell cell = new GraphvizRecordCell(); 
     cell.Text = input; 
     cell.Port = input; 
     rootCell.Cells.Add(cell); 
    } 

    rec.Cells.Add(rootCell); 

    e.VertexFormatter.Record = rec; 
} 

Когда я генерировать граф, однако, вершины показать этикетку вместо записи. Что я делаю не так?

EDIT

Вот вывод точка.

digraph G { 
    bgcolor="#454545FF" 
    node [fillcolor="#505050FF", color="#2A2A2AFF", shape=record, fontname="Verdana", fontsize=10, label="", style=filled, fontcolor="#FFFFFFFF"]; 
    edge [ fontsize=10, fontcolor="#FFFFFFFF", color="#ECA706FF", fontname="Verdana"]; 
    0 [label="EntityMap.Entity"]; 
    1 [label="EntityMap.Entity"]; 
    2 [label="EntityMap.Entity"]; 
    3 [label="EntityMap.Entity"]; 
    4 [label="EntityMap.Entity"]; 
    5 [label="EntityMap.Entity"]; 
    6 [label="EntityMap.Entity"]; 
    7 [label="EntityMap.Entity"]; 
    8 [label="EntityMap.Entity"]; 
    9 [label="EntityMap.Entity"]; 
    10 [label="EntityMap.Entity"]; 
    11 [label="EntityMap.Entity"]; 
    12 [label="EntityMap.Entity"]; 
    13 [label="EntityMap.Entity"]; 
    14 [label="EntityMap.Entity"]; 
    15 [label="EntityMap.Entity"]; 
    0 -> 0 [ label="OnPlayerUse", headport="EnableMotion", headlabel=""]; 
    0 -> 1 [ label="OnPlayerUse", headport="Explode", headlabel=""]; 
    0 -> 6 [ label="OnPlayerUse", headport="Compare", headlabel=""]; 
    0 -> 5 [ label="OnPlayerUse", headport="RevertToDefaultRelationship", headlabel=""]; 
    3 -> 4 [ label="OnTrigger", headport="Wake", headlabel=""]; 
    4 -> 2 [ label="OnFoundEnemy", headport="Display", headlabel=""]; 
    6 -> 15 [ label="OnEqualTo", headport="EmitAISound", headlabel=""]; 
    6 -> 4 [ label="OnEqualTo", headport="Wake", headlabel=""]; 
    7 -> 8 [ label="OnStartTouch", headport="Command", headlabel="+duck"]; 
    7 -> 8 [ label="OnEndTouch", headport="Command", headlabel="-duck"]; 
    7 -> 9 [ label="OnEndTouch", headport="Enable", headlabel=""]; 
    7 -> 10 [ label="OnEndTouch", headport="Fade", headlabel=""]; 
    7 -> 7 [ label="OnEndTouch", headport="Disable", headlabel=""]; 
    12 -> 11 [ label="OnMapSpawn", headport="Fade", headlabel=""]; 
    13 -> 6 [ label="OnPass", headport="SetValue", headlabel="1"]; 
    14 -> 6 [ label="OnPass", headport="SetValue", headlabel="1"]; 
} 
+0

Можно ли получить источник «точка» отображаемого графика? Он мог бы дать подсказки ... –

+0

Я добавил точечный вывод к вопросу. –

ответ

0

В корневых ячейках отсутствуют детали, а именно имена методов объекта. Я думаю, dot выходную линию

0 [label="EntityMap.Entity"]; 

... должно быть действительно:

0 [label="<EnableMotion> EntityMap.Entity"]; 

(... и я предполагаю, что они не все должны быть названы EntityMap.Entity?)

я не могу действительно скажите, где в вашей программе вводятся ребра, но кажется, что ребра визуализируются на основе различной информации, чем вершины.

Запуск dot вручную (dot foo.dot -Tpng -o foo.png) может дать вам более информативные сообщения об ошибках/предупреждениях.

+0

Ну, точечный вывод ошибочен, потому что именно так его генерирует QuickGraph. Я настраиваю все на использование записей и ячеек, но QuickGraph игнорирует меня и вместо этого использует метки. –