我正在使用Graphviz作为库(C ++)。我需要Graphviz来计算我的节点和相应边的坐标。我正在自我渲染(即不使用Graphviz的渲染器)。我的节点是矩形,具有定义的宽度和高度(以像素为单位)。
我使用 agopen 创建图表。然后我使用 agnode 创建节点,使用老化创建边。然后,据我所知,应该使用 gvLayout 来计算坐标。
现在我需要知道:
如何在使用 gvLayout 之前指定节点的矩形宽度和高度?
在 gvLayout 之后,如何获取边缘的节点和样条曲线的计算坐标?
如何从图表中删除节点(及相应的边缘)或边缘( Agraph_t ),这可以完成吗?
当我使用 agnode 和老年人创建节点和边缘时,我不需要释放/删除它们进行清理(当我完成时)图形)?或 agclose 隐式处理这个问题吗?
重要:我不想使用基于文本的界面(即获取参数作为文本),我想访问提到的参数(节点的宽度和高度,边缘的样条,坐标node ...)直接作为数据变量。
答案 0 :(得分:4)
在上一个回复中添加更多细节:
1)节点的宽度由多个属性决定:“width”属性指定最小宽度;节点中标签或图像的宽度;标签周围边距的“边距”属性;外围的数量;如果你真的想要修正宽度, 将“width”属性设置为所需的值,并将“fixedsize”设置为1.如上所述,您可以使用agset函数设置属性,该函数假定该属性先前已使用agnodeattr函数为节点声明。或者只使用agsafeset,它结合了操作。
2)如果n是节点指针,则其位置在ND_coord(n)中存储为(x,y)对。如果e是边指针,则值ED_spl(e)指向包含描述三次B样条的结构数组的结构。 (通常,只有一个。)如果bz = ED_spl(e) - > list [0],那么* bz有关于点数,点和关于边缘是否在头部有箭头的信息的字段和/或尾巴。描述了这些值的含义 here
3)要从图g中删除节点n,请使用agdelete(g,n);
4)在图表上调用agclose将自动释放所有节点和边缘。如果你已经调用了gvLayout,首先需要调用gvFreeLayout来释放为进行布局而分配的数据。
您可能会发现this文档有用。
答案 1 :(得分:1)
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 API tutorial
答案 2 :(得分:1)
Q1:你必须设置宽度并修复它:
agsafeset(node, "width", "1");
agsafeset(node, "fixedsize", "1", "");
如果在修改后更改宽度,请确保在使用新值设置“宽度”之前将“固定尺寸”调用为“0”。
Q2:以下也可以使用ND_coord(n),而不是使用ND_coord(n):
node->u.coord.x
node->graph->u.bb.UR.y - node->u.coord.y
要将边缘包裹到贝塞尔线,请查看例如http://mupuf.org/blog/article/34/,我已基于它转换为CGMutablePathRef(如果您感兴趣的话)。
对于Q3& Q4看看Emden的答案。