Я уже задавала вопрос Вот об использовании Boost Graph Library и записи графа в файл. Из-за изменений в моих требованиях мне нужно записать свойства динамического графа в файл DOT. После некоторого поиска мне удалось придумать некоторый код, но он не работает. Ниже то, что я сделал до сих пор:
Класс Map использует класс Cell в качестве вершин, а класс Cell использует отдельный класс CellProperty для установки и получения всех свойств Cell.
И, наконец, класс Map, где я строю график и пытаюсь записать график в файл DOT.
Map.h
class Map {
public:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, Cell> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
explicit Map(std::string pGraphFilePath);
virtual ~Map();
void LoadGraph();
private:
Graph mGraph;
std::vector<std::vector<Vertex>> mGrid;
};
Map.cpp
const unsigned int RowNum = 3;
const unsigned int ColumnNum = 4;
Map::Map(std::string pGraphFilePath) : mGraph(), mGrid() {}
Map::~Map() {}
void Map::LoadGraph() {
int dummyID = 1;
for (unsigned int row = 0; row < RowNum; row++) {
mGrid.resize(RowNum);
for (unsigned int col = 0; col < ColumnNum; col++) {
mGrid[row].resize(ColumnNum);
Vertex vID = boost::add_vertex(mGraph);
mGraph[vID].SetProperty<unsigned int>("ID", dummyID);
mGraph[vID].SetProperty<bool>("Navigable", true);
mGrid[row][col] = vID;
dummyID++;
// add the edges for the contained cells in the grid
if (col > 0) { boost::add_edge(mGrid[row][col - 1], mGrid[row][col], mGraph); }
if (row > 0) { boost::add_edge(mGrid[row - 1][col], mGrid[row][col], mGraph); }
}
}
// write cell properties
boost::dynamic_properties propertiesOutPut;
propertiesOutPut.property("ID", boost::get(boost::vertex_index, mGraph));
// As Navigable is an external property, it need to be mapped with the internal graph property
// the lines below are the update after I got the answers and link for my query
// cell.GetProperty() is a templated method the takes a default parameter, thus passing "false" bool parameter which returns the "Navigable" cell property
auto valueNavigable = boost::make_transform_value_property_map([](Cell &cell) { return cell.GetProperty<bool>("Navigable", false); }, boost::get(boost::vertex_bundle, mGraph));
propertiesOutPut.property("Navigable", valueNavigable);
std::ofstream fout("MyGraph.dot");
boost::write_graphviz_dp(fout, mGraph, propertiesOutPut, std::string("ID"));
}
Проблема, которую я получаю, заключается в методе propertiesOutPut.property () для boost :: get (). Я не могу понять правильные параметры для boost :: get (). Пожалуйста, помогите мне. Спасибо !!
Вы могли бы использовать transform_value_property_map
поверх карты свойств, которая содержит структуру свойств вершины. (Вы не показали это).
У меня есть несколько ответов, показывающих, как это сделать, хотя все они используют внутренние свойства, нет большой разницы, потому что карту свойств anu можно преобразовать одинаково, независимо от того, является ли карта свойств внутренней или внешней (это Вся цель карт недвижимости: отделить способ доступа к свойствам).
Наиболее актуальными:
Другой:
Других решений пока нет …