如何将端口添加到Agraph_t中的节点?

时间:2011-08-09 01:33:26

标签: graphviz

我正在尝试向节点添加端口,但显然我遗漏了一些东西。

aginit();
Agraph_t *g = agopen("g", AGFLAG_DIRECTED);

Agsym_t *symRankdir = agraphattr(g, "rankdir", "LR");
Agsym_t *symShape = agnodeattr(g, "shape", "Mrecord");
Agsym_t *symLabel = agnodeattr(g, "label", "");

Agnode_t *n1 = agnode(g, "n1");
n1->attr[1] = "n1|<p1>p1|<p2>p2";
Agnode_t *n2 = agnode(g, "n2");
n2->attr[1] = "n2|<p1>p1|<p2>p2";
Agedge_t *e = agedge(g, n1, n2);
e->u.tail_port.defined = true;
e->u.tail_port.name = "p1";
e->u.head_port.defined = true;
e->u.head_port.name = "p2";

FILE *fp = fopen(argv[1], "w");
agwrite(g, fp);

输出:

digraph g {
    graph [rankdir=LR];
    node [shape=Mrecord];
    n1 [label="n1|<p1>p1|<p2>p2"];
    n2 [label="n2|<p1>p1|<p2>p2"];
    n1 -> n2;
}

输出中的边缘应为n1:p1 -> n2:p2。需要在代码中设置什么来实现这一目标?

1 个答案:

答案 0 :(得分:1)

替换此 -

e->u.tail_port.defined = true;
e->u.tail_port.name = "p1";
e->u.head_port.defined = true;
e->u.head_port.name = "p2";

- 用这个 -

#define TAILX               1
#define HEADX               2
agxset(e, TAILX, "p1");
agxset(e, HEADX, "p2");

(我从查看Graphviz源代码 - lib / graph / parser.y和lib / graph / libgraph.h看出来。)