给定点文本 c++ 生成 GraphViz 图的图像
Generate image of GraphViz graph given dot text c++
我在 C++ Qt 应用程序(在 Ubuntu 上)中有一个字符串,其中包含有效的 GraphViz/dot 图形语法。我想从这个文本生成一个图像file/object,类似于各种在线工具(比如这个:http://www.webgraphviz.com/)吐出的图像。也许我使用了错误的搜索词,但我似乎找不到相关的帮助。
我基本上想要的是这样的:
generate_dot_graph_image(std::string dot_text, std::string image_file_path)
其他详细信息: 我有一个 Dijkstra 求解器,我想在我的应用程序中可视化其解(基本上是删除未使用的边后的原始图形)。求解器已经包含一个选项,可以将解决方案转换为可以使用实用程序(例如我上面链接的实用程序)解析为点图的字符串。但我想要的是能够从 C++ 内部执行此操作。
因此,我能够使用 GraphViz 库完全按照我的意愿进行操作。您可以使用 sudo apt-get install graphviz-lib
和 sudo 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
我找到了一种方法,我使用了以下函数并且它有效:
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));
}
我在 C++ Qt 应用程序(在 Ubuntu 上)中有一个字符串,其中包含有效的 GraphViz/dot 图形语法。我想从这个文本生成一个图像file/object,类似于各种在线工具(比如这个:http://www.webgraphviz.com/)吐出的图像。也许我使用了错误的搜索词,但我似乎找不到相关的帮助。
我基本上想要的是这样的:
generate_dot_graph_image(std::string dot_text, std::string image_file_path)
其他详细信息: 我有一个 Dijkstra 求解器,我想在我的应用程序中可视化其解(基本上是删除未使用的边后的原始图形)。求解器已经包含一个选项,可以将解决方案转换为可以使用实用程序(例如我上面链接的实用程序)解析为点图的字符串。但我想要的是能够从 C++ 内部执行此操作。
因此,我能够使用 GraphViz 库完全按照我的意愿进行操作。您可以使用 sudo apt-get install graphviz-lib
和 sudo 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
我找到了一种方法,我使用了以下函数并且它有效:
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));
}