【问题标题】:Graphviz – Node with HTML label has no portsGraphviz - 带有 HTML 标签的节点没有端口
【发布时间】:2019-02-09 21:31:04
【问题描述】:

我有 Mrecord 节点,每个节点都有许多使用 HTML 标签指定的字段。我的表中有 TD,每个 TD 都有一个 port="..." 属性。但是,当我指定边缘的头端口和尾端口以使用这些端口名称时,我总是收到端口无法识别的警告:

ex: Warning: node departments, port dept_no unrecognized

但我 100% 确定确实存在这样的端口。下面是一个简单的 html 示例:

<table><tr><td>departments</td></tr><tr><td port="dept_no">dept_no</td></tr></table>

将其设置为节点的标签后,我假设该节点将具有dept_no 端口,但事实并非如此。

--

现在更多信息:我正在使用 C API 来构建此图并进行布局等。布局后,每个节点都有一个标签,html 布尔值为 true,但标签本身没有html数据,没有端口等。

令人费解。我不知道为什么节点没有端口。

#include <stdio.h>
#include <gvc.h>
#include <gvplugin.h>


extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
extern gvplugin_library_t gvplugin_core_LTX_library;

lt_symlist_t lt_preloaded_symbols[] =
{
    { "gvplugin_dot_layout_LTX_library", &gvplugin_dot_layout_LTX_library},
    { "gvplugin_core_LTX_library", &gvplugin_core_LTX_library},
    { 0, 0}
};



int main(int argc, const char * argv[])
{
    GVC_t * gvc = gvContextPlugins(lt_preloaded_symbols, 0);
    Agraph_t * gvg = agopen("Graph", Agdirected, NULL);

    agattr(gvg, AGRAPH, "dpi",         "72");
    agattr(gvg, AGRAPH, "resolution",  "72"); 
    agattr(gvg, AGRAPH, "sep",         "0.27777"); 
    agattr(gvg, AGRAPH, "rankdir",     "TB");
    agattr(gvg, AGRAPH, "ranksep",     "0.5");
    agattr(gvg, AGRAPH, "nodesep",     "0.4");
    agattr(gvg, AGRAPH, "pad",         "0.5,0.5");
    agattr(gvg, AGRAPH, "margin",      "0,0");
    agattr(gvg, AGRAPH, "splines",     "spline");

    agattr(gvg, AGNODE, "shape",       "Mrecord");
    agattr(gvg, AGNODE, "width",       "0");
    agattr(gvg, AGNODE, "height",      "0");
    agattr(gvg, AGNODE, "fixedsize",   "false");
    agattr(gvg, AGNODE, "margin",      "0.0,0.0"); 
    agattr(gvg, AGNODE, "penwidth",    "0.0");
    agattr(gvg, AGNODE, "fontsize",    "13");

    agattr(gvg, AGEDGE, "arrowsize",     "0.5");
    agattr(gvg, AGEDGE, "penwidth",      "1.0");
    agattr(gvg, AGEDGE, "labelangle",    "32");
    agattr(gvg, AGEDGE, "labeldistance", "1.8");
    agattr(gvg, AGEDGE, "dir",           "none");
    agattr(gvg, AGEDGE, "headport",      "_");
    agattr(gvg, AGEDGE, "tailport",      "_");


    const char * nodeALabel = "<table id=\"dept_emp\" width=\"140\" height=\"26\"><tr><td height=\"26\">dept_emp</td></tr><tr><td height=\"20\" port=\"emp_no\">emp_no</td></tr><tr><td height=\"20\" port=\"dept_no\">dept_no</td></tr></table>";
    const char * nodeBLabel = "<table id=\"departments\" width=\"140\" height=\"26\"><tr><td height=\"26\">departments</td></tr><tr><td height=\"20\" port=\"dept_no\">dept_no</td></tr><tr><td height=\"20\" port=\"dept_name\">dept_name</td></tr></table>";

    Agnode_t * nodeA = agnode(gvg, "dept_emp", 1);
    Agnode_t * nodeB = agnode(gvg, "departments", 1);

    char * la = agstrdup_html(gvg, (char *)nodeALabel);
    char * lb = agstrdup_html(gvg, (char *)nodeBLabel);
    agsafeset(nodeA, "label", la, "");
    agsafeset(nodeB, "label", lb, "");
    agstrfree(gvg, la);
    agstrfree(gvg, lb);


    // An edge pointing from dept_emp.dept_no ---> departments.dept_no 
    Agedge_t * edge = agedge(gvg, nodeA, nodeB, NULL, 1);

    agsafeset(edge, "dir", "forward", "none");
    agsafeset(edge, "tailport", "dept_no", "_");
    agsafeset(edge, "headport", "dept_no", "_");

    gvLayout(gvc, gvg, "dot");

    //  Warning: node dept_emp, port dept_no unrecognized
    //  Warning: node departments, port dept_no unrecognized



    return 0;
}

【问题讨论】:

  • 最后不应该释放空间吗?将agstrfree(gvg, la); &amp; agstrfree(gvg, lb); 移到最后有帮助吗?
  • 你检查gvRenderFilename(gvc, gvg, "dot", "graph.dot");的输出了吗?
  • @MOHRE 不,它没有。
  • @Federico 我没有,但这样做只显示节点之间的一条边,而不是字段。该点似乎忠实地显示了我的输入,但是渲染到图形有效地显示了相同的问题,因为它只显示了节点之间的边缘? gist.githubusercontent.com/swillits/…
  • 还是一个我想不通的问题。

标签: graphviz


【解决方案1】:

虽然渲染 HTML 会令人困惑,但端口无法识别,基于记录的节点和类似 HTML 的标签不应该混用。它们具有冲突的标签模式和重叠的功能。正如 Graphviz 的一位作者所证实的那样,它们在设计上是不兼容的,根本没想到人们会尝试将两者结合起来。因此,解决方案是将Mrecord 替换为none。详情请见https://gitlab.com/graphviz/graphviz/issues/1491

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 2015-09-21
    • 2021-02-25
    • 1970-01-01
    • 2020-02-26
    • 2019-10-30
    • 2021-03-11
    • 2021-08-14
    • 2012-07-02
    相关资源
    最近更新 更多