【问题标题】:Questions about Graphviz API (Graphviz as a library)关于 Graphviz API(Graphviz 作为库)的问题
【发布时间】:2012-02-02 19:56:21
【问题描述】:

我将 Graphviz 用作库 (C++)。我需要 Graphviz 来计算我的节点和相应边的坐标。我正在自己渲染(即不使用 Graphviz 的渲染器)。我的节点是矩形,具有定义的宽度和高度(以像素为单位)。

我用 agopen 创建图表。然后我用 agnode 创建节点,用 agege 创建边。那么据我所知,应该使用 gvLayout 来计算坐标。

现在我需要知道:

  1. 在使用gvLayout之前如何指定节点矩形的宽高?

  2. gvLayout之后,如何得到节点的坐标和边的样条?

  3. 如何从图中删除节点(和相应的边)或边(Agraph_t),这可以做到吗?

  4. 当我使用 agnodeagege 创建节点和边时,我不需要释放/删除它们以进行清理(当我完成图形)?还是 agclose 隐式处理这个问题?

重要提示:我不想使用基于文本的界面(即获取参数作为文本),我想访问提到的参数(节点的宽度和高度、边缘的样条线、 node...) 直接作为数据变量。

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    在前面的回复中添加更多细节:

    1) 节点的宽度由多个属性决定:“width”属性指定最小宽度;节点中标签或图像的宽度;标签周围边距的“边距”属性;外围设备的数量;等等如果你真的想固定宽度, 将“width”属性设置为所需的值,并将“fixedsize”设置为 1。如上所述,您使用 agset 函数设置属性,该函数假定先前使用 agnodeattr 函数为节点声明了该属性。或者只使用 agsafeset,它结合了这些操作。

    2) 如果 n 是一个节点指针,它的位置作为 (x,y) 对存储在 ND_coord(n) 中。如果 e 是边指针,则值 ED_spl(e) 指向一个结构,该结构包含描述三次 B 样条的结构数组。 (通常只有一个。)如果 bz = ED_spl(e)->list[0],则 *bz 包含点数、点数以及边缘是否在头部有箭头的信息以及/或尾巴。描述了这些值的含义 here

    3) 要从图 g 中删除节点 n,请使用 agdelete(g, n);

    4) 在图上调用 agclose 将自动释放所有节点和边。如果你调用了 gvLayout,你首先需要调用 gvFreeLayout 来释放分配给布局的数据。

    您可能会发现 this 文档很有帮助。

    【讨论】:

    【解决方案2】:

    第一季度

    agset (void* pointer_to_component, char* name_of_attribute, char* value_of_attribute)
    gsafeset which has the same signature.
    

    第二季度

    for (n = agfstnode(g); n; n = agnxtnode(n)) { /* do something with n */ }
    

    第三季度

    Agnode_t *n;
    n = agnode(g, "some_specific_node_name_to_find", FALSE);
    agdelnode(n);
    

    欲了解更多信息,请查看Agraph API tutorial

    【讨论】:

    • 感谢您的回答 :) 但是... Q1 - agset 和 agsafeset 将选项设置为文本值。正如我所提到的,我需要另一种解决方案。 Q2 - /* 用 n */ 做某事,我的问题是该做什么(以及如何做)。 Q3 - 当相应节点之一被删除时,边是否会自动删除?
    【解决方案3】:

    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
    

    要将边缘包裹到贝塞尔线,请查看例如http://mupuf.org/blog/article/34/,我已经根据它完成了对 CGMutablePathRef 的转换(如果你有兴趣的话)。

    对于 Q3 和 Q4,请查看 Emden 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2018-10-10
      相关资源
      最近更新 更多