【问题标题】:Generate image of GraphViz graph given dot text c++给定点文本c ++生成GraphViz图的图像
【发布时间】:2017-12-26 19:16:29
【问题描述】:

我在 C++ Qt 应用程序(在 Ubuntu 上)中有一个字符串,其中包含有效的 GraphViz/点图语法。我想从这个文本生成一个图像文件/对象,类似于各种在线工具(比如这个:http://www.webgraphviz.com/)吐出的图像。也许我使用了错误的搜索词,但我似乎找不到相关的帮助。

我基本上想要的是这样的:

generate_dot_graph_image(std::string dot_text, std::string image_file_path)

其他细节:我有一个 Dijkstra 求解器,我想在我的应用程序中可视化其解决方案(基本上是删除未使用的边后的原始图)。求解器已经包含一个选项,可以将解决方案转换为字符串,该字符串可以使用我上面链接的实用程序解析为点图。但我想要的是能够从 C++ 内部做到这一点。

【问题讨论】:

  • 我不确定你想要什么。您是否希望从控制台应用程序调用 graphviz?哪个操作系统?来自wxWidgets、QT、MFC并在应用中显示?
  • 我正在 Linux (ubuntu) 中开发 QT 应用程序。我有一个来自 DIjkstra 求解器的解决方案,作为我想在我的应用程序中可视化的点图(文本字符串)。为此,我需要将其转换为图像。
  • 在原始问题中添加了其他详细信息。
  • this 有帮助吗?

标签: c++ graphviz dot


【解决方案1】:

因此,我能够使用 GraphViz 库来做我想做的事。您可以使用 sudo apt-get install graphviz-libsudo apt-get install libgraphviz-dev 在 Ubuntu 上安装它们。完成后:

#include <graphviz/gvc.h>

bool DotGraphGenerator::saveImage()
{
  std::string o_arg = std::string("-o") + "/path/to/image_file.png";
  char* args[] = {const_cast<char*>("dot"), const_cast<char*>("Tpng"), const_cast<char*>("-Gsize=8,4!"), const_cast<char*>("-Gdpi=100"),
  const_cast<char*>(DOT_TEXT_FILE.c_str()),  //DOT_TEXT_FILE is the file path in which the graph is saved as valid DOT syntax
  const_cast<char*>(o_arg.c_str()) };

  const int argc = sizeof(args)/sizeof(args[0]);
  Agraph_t *g, *prev = NULL;
  GVC_t *gvc;

  gvc = gvContext();
  gvParseArgs(gvc, argc, args);

  while ((g = gvNextInputGraph(gvc)))
  {
    if (prev)
    {
      gvFreeLayout(gvc, prev);
      agclose(prev);
    }
    gvLayoutJobs(gvc, g);
    gvRenderJobs(gvc, g);
    prev = g;
  }

  return !gvFreeContext(gvc);
}

gvc 是一个 C 库,函数将非 const C 字符串作为参数,因此开头是 const_casts。您还可以通过更改 -Gsize=8,4-Gdpi=100 参数来编辑图像大小。使用当前配置,您将获得 8*100 x 4*100 = 800x400 的图像文件。无论如何,这些参数与从 bash 运行 dot 命令时应用的参数相同。

除此之外,此代码基本上是从 graphViz 中的一个示例中复制的,作为库手册:http://www.graphviz.org/pdf/libguide.pdf

【讨论】:

    【解决方案2】:

    我找到了一种方法,我使用了以下函数并且它有效:

    bool saveImageGV(std::string file_path){
        GVC_t *gvc;
        Agraph_t *g;
        FILE *fp;
        gvc = gvContext();
        fp = fopen((file_path+".dot").c_str(), "r");
        g = agread(fp, 0);
        gvLayout(gvc, g, "dot");
        gvRender(gvc, g, "png", fopen((file_path+".png").c_str(), "w"));
        gvFreeLayout(gvc, g);
        agclose(g);
        return (gvFreeContext(gvc));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2013-02-05
      • 2012-03-18
      • 2013-07-29
      相关资源
      最近更新 更多