boost — генерирует несколько графов в формате png с graphviz и C ++ без системной команды

Я пытаюсь генерировать графики в графическом формате из Graphviz в приложении C ++.

То, как я поступаю, заключается в следующем.
Из библиотеки Boost я создаю список adjancy_list:

struct VertexP { std::string tag; std::string shape;std::string style; };
struct EdgeP { std::string symbol; std::string color; };
struct GraphP { };

typedef adjacency_list<vecS, vecS, directedS, VertexP, EdgeP, GraphP> Graph;

У меня есть функция, которая рекурсивно строит мой график из внешних данных

Graph addnode_progeny(data, Graph );

Затем у меня есть функция, которая генерирует файл точек этого графика.

void printGraphDot(Graph g, std::string file_path){
std::ofstream dot_file(file_path+".dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("shape", get(&VertexP::shape, g));
dp.property("style", get(&VertexP::style, g));
dp.property("label", get(&EdgeP::symbol, g));
dp.property("color", get(&EdgeP::color, g));
dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("TB")));
write_graphviz_dp(dot_file, g, dp);
}

До этого момента все идет хорошо.

Теперь я хочу преобразовать этот файл точек в файл PNG.
Я не хочу передавать системную команду («точка -Tpng input -o output»), так как я не хочу обязывать пользователя устанавливать Graphviz.

Я нашел первую идею в следующем посте: Сгенерировать изображение графика GraphViz с учетом точечного текста c ++

Я адаптировал код. Я добавил его в предыдущую функцию, и он работает, когда мне нужно сгенерировать ОДИН граф.

Новая функция:

void printGraphDot(Graph g, std::string file_path){
std::ofstream dot_file(file_path+".dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("shape", get(&VertexP::shape, g));
dp.property("style", get(&VertexP::style, g));
dp.property("label", get(&EdgeP::symbol, g));
dp.property("color", get(&EdgeP::color, g));
dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("TB")));

write_graphviz_dp(dot_file, g, dp);
std::string o_arg = "-o" +file_path+".png";
std::string i_arg = file_path+".dot";
char* args[] = {const_cast<char*>("dot"),
const_cast<char*>("-Tpng"),
const_cast<char*>(i_arg.c_str()),
const_cast<char*>(o_arg.c_str()) };

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

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

Тем не мение, для нескольких графиков, если я снова вызову эту функцию, это не работает, и у меня ошибка сегментации. На самом деле написано, что мы можем использовать только один GVC_t в приложении, в следующей документации, стр. 25: http://www.graphviz.org/pdf/libguide.pdf.

Так что в следующем случае программа останавливается с ошибкой сегментации:

printGraphDot( g1,  file_path1);
printGraphDot( g2,  file_path2);

Есть ли другой способ для генерации png-графа из файла точек внутри приложения C ++ без использования команды?

Большое спасибо за Вашу помощь.
ура

0

Решение

Я нашел способ, я использовал следующую функцию, и она работает, и я добавил этот ответ также в Сгенерировать изображение графика GraphViz с учетом точечного текста c ++:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]