我正在使用Graphviz作为库(C++)。我需要Graphviz为我的节点和相应的边缘计算坐标。我正在进行自我渲染(即不使用Graphviz的渲染器)。我的节点是矩形,具有定义的宽度和高度(以像素为单位)。
我用agopen创建图形。然后使用agnode创建节点,用agedge创建边缘。据我所知,应该使用gvLayout来计算坐标。
现在我要知道:
重要:我不想使用基于文本的接口(即获取参数作为文本),我想访问所提到的参数(节点的宽度和高度、边的样条、节点的坐标……)直接作为数据变量。
发布于 2012-01-05 15:29:44
在前面的响应中添加一些更详细的内容:
1 )节点的宽度由多个属性决定:“宽度”属性指定最小宽度;标记或图像在节点中的宽度;标签周围边距的“页边距”属性;外围设备的数量;等等。如果您确实想要固定宽度,请将“宽度”属性设置为所需的值,并将“固定大小”设置为1。如上所述,您使用agset函数设置属性,该函数假定属性以前使用agnodeattr函数为节点声明。或者只是使用agsafeset,它结合了这些操作。
2)如果n是节点指针,则它的位置在ND_coord(n)中存储为(x,y)对。如果e是边指针,则值ED_spl(e)指向包含描述立方B样条的结构数组的结构。(通常只有一个。)如果bz = ED_spl(e)->list,那么*bz有关于点数、点和边是否在头和/或尾处有箭头的信息。这些值的这个含义被描述为这里。
3)从图g中删除节点n,使用agdelete(g,n);
4)调用图上的agclose将自动释放所有节点和边。如果您已经调用了gvLayout,那么首先需要调用gvFreeLayout来释放分配给执行布局的数据。
您可能会发现这文档很有用。
发布于 2012-01-05 09:17:01
Q1
agset (void* pointer_to_component, char* name_of_attribute, char* value_of_attribute)
gsafeset which has the same signature.Q2
for (n = agfstnode(g); n; n = agnxtnode(n)) { /* do something with n */ }Q3
Agnode_t *n;
n = agnode(g, "some_specific_node_name_to_find", FALSE);
agdelnode(n);有关更多信息,请访问Agraph教程
发布于 2012-03-25 18:01:23
Q1:您必须设置宽度并修复它:
agsafeset(node, "width", "1");
agsafeset(node, "fixedsize", "1", "");如果在修复后更改宽度,请确保在使用新值设置“宽度”之前,使用"0“调用”固定大小“。
Q2:与使用ND_coord(n)不同,以下内容也能工作:
node->u.coord.x
node->graph->u.bb.UR.y - node->u.coord.y要将边包装成bezier线,请看一下例如http://mupuf.org/blog/article/34/,我已经基于它完成了到CGMutablePathRef的转换(如果您感兴趣的话)。
关于Q3 & Q4,请看Emden的答案。
https://stackoverflow.com/questions/8734936
复制相似问题