Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成给定点文本c+的GraphViz图形的图像+; 我在C++ QT应用程序(Ubuntu)上有一个字符串,其中包含有效的图形化/点图语法。我想从这个文本生成一个图像文件/对象,类似于各种在线工具(比如这个:)输出的图像。也许我用错了搜索词,但我似乎找不到相关的帮助_C++_Graphviz_Dot - Fatal编程技术网

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

生成给定点文本c+的GraphViz图形的图像+; 我在C++ QT应用程序(Ubuntu)上有一个字符串,其中包含有效的图形化/点图语法。我想从这个文本生成一个图像文件/对象,类似于各种在线工具(比如这个:)输出的图像。也许我用错了搜索词,但我似乎找不到相关的帮助,c++,graphviz,dot,C++,Graphviz,Dot,我基本上想要的是这样的: generate_dot_graph_image(std::string dot_text, std::string image_file_path) 其他详细信息:我有一个Dijkstra解算器,我想在应用程序中可视化它的解决方案(基本上是删除未使用边后的原始图形)。解算器已经包含了一个选项,可以将解决方案转换为字符串,该字符串可以使用我上面链接的工具解析为点图。但我希望能够从C++内部实现这一点。,所以我能够使用GooVIEZ库来完成我想要的。您可以使用sudo-

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

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

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

,所以我能够使用GooVIEZ库来完成我想要的。您可以使用
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);
}
#包括
bool DotGraphGenerator::saveImage()
{
std::string o_arg=std::string(“-o”)+”/path/to/image_file.png”;
char*args[]={const_cast(“点”)、const_cast(“Tpng”)、const_cast(“-Gsize=8,4!”)、const_cast(“-Gdpi=100”),
const_cast(DOT_TEXT_FILE.c_str()),//DOT_TEXT_FILE是图形保存为有效点语法的文件路径
const_cast(o_arg.c_str())};
常量int argc=sizeof(args)/sizeof(args[0]);
Agraph_t*g,*prev=NULL;
全球价值链*GVC;
全球价值链=全球价值链上下文();
全球价值链(全球价值链、全球价值链、全球价值链);
而((g=gvNextInputGraph(gvc)))
{
如果(上一个)
{
全球价值链布局(全球价值链,上一个);
agclose(prev);
}
全球价值链(gvc,g);
全球价值链(gvc,g);
prev=g;
}
return!gvFreeContext(gvc);
}
gvc是一个C库,函数采用非常量C字符串作为参数,因此const_在开始时强制转换。您还可以通过更改
-Gsize=8,4
-Gdpi=100
参数来编辑图像大小。使用当前配置,您将获得一个8*100 x 4*100=800x400的图像文件。无论如何,这些参数与从bash运行
dot
命令时应用的参数相同


除此之外,此代码基本上是从graphViz中的一个示例复制而来,作为库手册:

,因此我能够使用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);
}
#包括
bool DotGraphGenerator::saveImage()
{
std::string o_arg=std::string(“-o”)+”/path/to/image_file.png”;
char*args[]={const_cast(“点”)、const_cast(“Tpng”)、const_cast(“-Gsize=8,4!”)、const_cast(“-Gdpi=100”),
const_cast(DOT_TEXT_FILE.c_str()),//DOT_TEXT_FILE是图形保存为有效点语法的文件路径
const_cast(o_arg.c_str())};
常量int argc=sizeof(args)/sizeof(args[0]);
Agraph_t*g,*prev=NULL;
全球价值链*GVC;
全球价值链=全球价值链上下文();
全球价值链(全球价值链、全球价值链、全球价值链);
而((g=gvNextInputGraph(gvc)))
{
如果(上一个)
{
全球价值链布局(全球价值链,上一个);
agclose(prev);
}
全球价值链(gvc,g);
全球价值链(gvc,g);
prev=g;
}
return!gvFreeContext(gvc);
}
gvc是一个C库,函数采用非常量C字符串作为参数,因此const_在开始时强制转换。您还可以通过更改
-Gsize=8,4
-Gdpi=100
参数来编辑图像大小。使用当前配置,您将获得一个8*100 x 4*100=800x400的图像文件。无论如何,这些参数与从bash运行
dot
命令时应用的参数相同


除此之外,此代码基本上是从graphViz中的一个示例复制而来,作为库手册:

我找到了一种方法,我使用了以下函数,它可以工作:

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

我找到了一种方法,我使用了以下功能,它可以工作:

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

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