首页 文章

给出点文本c生成GraphViz图的图像

提问于
浏览
0

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

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

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

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

2 回答

  • 0

    所以我能够使用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

  • 1

    我找到了一种方法,我使用了以下功能,它的工作原理如下:

    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));
    }
    

相关问题