C++ Boost Graph Library: outputting custom vertex properties
boost, boost-graph, c++, graphviz
Solution
I won't correct your code, because I'm not able to verify that it will work as expected. But since I got stuck at the same problem, I will post the relevant parts of my code as an example for you and others. I hope this might be helpful.
Definition of graph
typedef boost::adjacency_list<boost::vecS,
boost::vecS,
boost::bidirectionalS,
boost::no_property,
EdgeProp, //this is the type of the edge properties
boost::no_property,
boost::listS> Graph;
Edge Properties
struct EdgeProp
{
char name;
//...
};
property writer for edges
template <class Name>
class myEdgeWriter {
public:
myEdgeWriter(Name _name) : name(_name) {}
template <class VertexOrEdge>
void operator()(std::ostream& out, const VertexOrEdge& v) const {
out << "[label=\"" << name[v].name << "\"]";
}
private:
Name name;
};
The properties have to be attached to the edge in advance. e.g
EdgeProp p;
p.name = 'a';
g[edge_descriptor] = p;
Call to boost to create graphviz file
myEdgeWriter<Graph> w(g);
ofstream outf("net.gv");
boost::write_graphviz(outf,g,boost::default_writer(),w);
For the vertex property writer we just use the default writer.
Problem
I am struggling to get a custom property writer to work with BGL. ``` struct IkGraph_VertexProperty { int id_ ; int type_ ; std::pair<int,int> gaussians_ ; // Type of Joint, Ids of Gaussians }; struct IkGraph_VertexPropertyTag { typedef edge_property_tag kind; static std::size_t const num; }; std::size_t const IkGraph_VertexPropertyTag::num = (std::size_t)&IkGraph_VertexPropertyTag::num; typedef property<IkGraph_VertexPropertyTag, IkGraph_VertexProperty> vertex_info_type; ``` ...custom graph defined in method ``` typedef adjacency_list<setS, vecS, bidirectionalS, vertex_info_type, IkGraph_EdgeProperty> TGraph ; TGraph testGraph ; std::ofstream outStr(filename) ; write_graphviz(outStr, testGraph, OurVertexPropertyWriter<TGraph,IkGraph_VertexPropertyTag, IkGraph_VertexProperty>(testGraph)); ``` ... ``` template <class Graph, class VertexPropertyTag, class VertexProperty> struct OurVertexPropertyWriter { OurVertexPropertyWriter(Graph &g_) : g(g_) {} template <class Vertex> void operator() (std::ostream &out, Vertex v) { VertexProperty p = get (VertexPropertyTag(), g, v); out << "[label=" << p.gaussians_.first << "]"; } Graph &g; }; ``` This produces a stream of errors. What I would really like to do (and no idea if this is possible) is to be able to generalize this and be pass which custom properties exist / which I would like outputting.