QuickGraph GraphvizRecord не отображается в вершинах - PullRequest
0 голосов
/ 24 декабря 2009

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

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"];
}

1 Ответ

0 голосов
/ 25 декабря 2009

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

0 [label="EntityMap.Entity"];

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

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

(... и я думаю, что их не следует называть EntityMap.Entity?)

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

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

...