boost :: read_graphviz — как считывать свойства?

Я пытаюсь прочитать график из файла DOT Graphviz. Меня интересуют два свойства для Vertex — его идентификатор и периферия. А также хочу загрузить графические метки.

Мой код выглядит так:

struct DotVertex {
std::string name;
int peripheries;
};

struct DotEdge {
std::string label;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
DotVertex, DotEdge> graph_t;

graph_t graphviz;
boost::dynamic_properties dp;

dp.property("node_id", boost::get(&DotVertex::name, graphviz));
dp.property("peripheries", boost::get(&DotVertex::peripheries, graphviz));
dp.property("edge_id", boost::get(&DotEdge::label, graphviz));

bool status = boost::read_graphviz(dot, graphviz, dp);

Мой пример файла DOT выглядит так:

digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a"]
0 -> 1 [label="!a"]
1 [label="1"]
1 -> 0 [label="a"]
1 -> 1 [label="!a"]
}

Когда я запускаю его, я получаю исключение «Свойство не найдено: метка». Что я делаю неправильно?

4

Решение

Вы не определили (динамическую) карту свойств для «метки».

Либо использовать ignore_other_properties или определите это 🙂

В приведенном ниже примере, используя ignore_other_properties предотвращает необходимость rankdir (свойство графа) и width, style (свойства вершин):

Жить на Колиру

#include <boost/graph/graphviz.hpp>
#include <libs/graph/src/read_graphviz_new.cpp>
#include <iostream>

struct DotVertex {
std::string name;
std::string label;
int peripheries;
};

struct DotEdge {
std::string label;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
DotVertex, DotEdge> graph_t;

int main() {
graph_t graphviz;
boost::dynamic_properties dp(boost::ignore_other_properties);

dp.property("node_id",     boost::get(&DotVertex::name,        graphviz));
dp.property("label",       boost::get(&DotVertex::label,       graphviz));
dp.property("peripheries", boost::get(&DotVertex::peripheries, graphviz));
dp.property("label",       boost::get(&DotEdge::label,         graphviz));

bool status = boost::read_graphviz(std::cin, graphviz, dp);
return status? 0 : 255;
}

Который работает успешно

Смотрите здесь для получения дополнительной информации об использовании dynamic_properties: read_graphviz () в Boost :: Graph, передать конструктору

7

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


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