我已经向docs询问了如何将动态属性写入DOT文件。它的工作正常。现在,当我尝试读取DOT文件并构建我的图表时,我遇到了一些异常。基本上我按照类似的方式写作,以读取DOT文件。以下是我的尝试:
我有一个Map类,它使用Cell类作为顶点,Cell类使用单独的CellProperty类来设置和获取所有Cell属性。请参考链接的问题,了解整个班级结构。
boost::dynamic_properties mPropertiesR(boost::ignore_other_properties);
mPropertiesR.property("ID", boost::get(boost::vertex_index, mGraph));
auto valueNavigable = boost::make_transform_value_property_map(
[](Cell &cell) { return cell.GetProperty<bool>("Navigable", false); }, boost::get(boost::vertex_bundle, mGraph));
mPropertiesR.property("Navigable", valueNavigable);
std::ifstream fin(mGraphFilePath.c_str());
std::string const &node_id = "node_id";
boost::read_graphviz(fin, mGraph, mPropertiesR, "node_id");
boost::graph_traits<Graph>::vertex_iterator vi, vi_end, next;
boost::tie(vi, vi_end) = boost::vertices(mGraph);
for (next = vi; vi != vi_end; vi = next) {
// cell.GetProperty() is a templated method the takes a default parameter, thus passing "false" bool parameter which returns the "Navigable" cell property
std::cout<< ": The Navigable property set to :" << mGraph[*next].GetProperty<bool>("Navigable", false);
++next;
}
上面的代码编译但我得到一个例外:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::dynamic_const_put_error> >'
what(): Attempt to put a value into a const property map:
Aborted (core dumped)
GetProperty()方法使用CellProperty类来获取每个单元格的属性值。以下是GetProperty()方法的样子:
template <class T>
T GetProperty(std::string pPropertyName, T pDefaultValue = T()) {
try {
T propertyValue = boost::lexical_cast<T>( mCellProperty.GetPropertyString(pPropertyName, boost::lexical_cast<std::string>(pDefaultValue)));
return propertyValue;
} catch (...) {
std::cout<< ": Unknown exception thrown while getting cell property value :'" << pPropertyName << "'";
}
return pDefaultValue;
}
我想要的是检索图中的顶点属性,我从DOT文件中读取它,就像&#34; Navigable&#34;财产等。我无法弄清楚,究竟我做错了什么。请帮我。提前谢谢!
答案 0 :(得分:1)
我不太确定应该对我的GetProperty()方法进行哪些修改。
另外,请注意如何将lambda中的内容(
cell.GetProperty<bool>("Navigable", false);
)包含在内是至关重要的,没有人可以为你做到这一点,因为信息并不存在。
我们无法知道如何编写它,因为您没有显示如何首先访问该属性
这里也是如此。我会给你另一个指针。
您需要为可变属性映射实现ReadWritePropertyMap
或LvaluePropertyMap
的模型。
有关如何实现读写属性映射的示例,请参阅此答案:查找property_traits<bidi_color_map>
以及put
和get
函数: