QuickGraph GraphvizRecord 不显示在顶点中

发布于 2024-08-16 05:10:42 字数 3037 浏览 11 评论 0原文

我正在尝试使用 QuickGraph 构建包含记录顶点的 Graphviz 图。到目前为止,我有这样的:

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

但是,当我生成图形时,顶点显示标签而不是记录。我做错了什么?

编辑

这是点输出。

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

I'm trying to build a Graphviz graph containing record vertices using QuickGraph. So far, I have this:

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

When I generate the graph, however, the vertices show a label instead of a record. What am I doing wrong?

EDIT

Here's the dot output.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

匿名的好友 2024-08-23 05:10:42

根单元格中缺少详细信息,特别是对象方法的名称。我猜 dot 输出行

0 [label="EntityMap.Entity"];

...应该是:

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

(...而且我猜它们不应该全部命名为 EntityMap.Entity?)

我真的无法告诉在程序中引入了边,但似乎边是根据与顶点不同的信息来渲染的。

手动运行 dot (dot foo.dot -Tpng -o foo.png) 可能会为您提供更多信息丰富的错误/警告消息。

There are details missing in the root cells, specifically the names of the object methods. I guess the dotoutput line

0 [label="EntityMap.Entity"];

...should really be:

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

(...and I guess they shouldn't all be named EntityMap.Entity?)

I cannot really tell where in your program the edges are introduced, but it seems like the edges are rendered based on different information than the vertices.

Running dot manually (dot foo.dot -Tpng -o foo.png) might give you more informative error/warning messages.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文