Thanks Jeremiah,
I've now got something that compiles and runs, but still doesn't
include 'subgraph' clauses in the dot output and corresponding
rectangles when rendered. Interestingly if I now change back to
write_graphviz(ofs, G0) I do get some subgraph clauses, but the names
are messed up presumably since they're now being set up using dynamic
properties. Also the subgraphs still don't render in this case.
Thanks,
Chris
#include
#include
#include
#include <string>
#include <sstream>
using namespace boost;
using namespace std;
int main()
{
// Vertex properties
typedef property > vertex_p;
// Edge properties
//typedef property edge_p;
typedef property edge_p;
// Graph properties
typedef property graph_p;
// adjacency_list-based type
typedef subgraph< adjacency_list > graph_t;
// Construct an empty graph and prepare the dynamic_property_maps.
graph_t G0(6);
enum {A, B, C, D, E, F};
dynamic_properties dp;
property_map::type name = get(vertex_name, G0);
dp.property("node_id", name);
name[A] = "A";
name[B] = "B";
name[C] = "C";
name[D] = "D";
name[E] = "E";
name[F] = "F";
graph_t& G1 = G0.create_subgraph();
enum {A1, B1, C1};
add_vertex(C, G1); // global vertex C becomes local A1 for G1
add_vertex(E, G1); // global vertex E becomes local B1 for G1
add_vertex(F, G1); // global vertex F becomes local C1 for G1
property_map::type name1 = get(vertex_name_t(), G1);
name1[A1] = "A1";
name1[B1] = "B1";
name1[C1] = "C1";
graph_t& G2 = G0.create_subgraph();
enum {A2, B2};
add_vertex(A, G2); // global vertex A becomes local A2 for G2
add_vertex(C, G2); // global vertex C becomes local B2 for G2
property_map::type name2 = get(vertex_name_t(), G2);
name2[A2] = "A2";
name2[B2] = "B2";
add_edge(A, B, G0);
add_edge(B, C, G0);
add_edge(B, D, G0);
add_edge(E, B, G0);
add_edge(E, F, G0);
add_edge(F, D, G0);
property_map::type mass = get(vertex_color, G0);
dp.property("mass", mass);
property_map::type edgeid = get(edge_index, G0);
dp.property("edgeid", edgeid);
#if 0
get_property(G0, graph_name) = "G0";
get_property(G1, graph_name) = "G1";
get_property(G2, graph_name) = "G2";
#else
// set up graph names
{
boost::ref_property_map
gname0(get_property(G0, graph_name));
dp.property("name", gname0);
gname0[0] = "G0";
boost::ref_property_map
gname1(get_property(G1, graph_name));
dp.property("name", gname1);
gname1[0] = "G1";
boost::ref_property_map
gname2(get_property(G1, graph_name));
dp.property("name", gname2);
gname2[0] = "G2";
}
#endif
std::ofstream ofs("out.dot");
write_graphviz_dp(ofs, G0, dp, std::string("node_id"));
return 0;
}
On 2 August 2012 01:33, Jeremiah Willcock wrote:
On Wed, 1 Aug 2012, Chris Cooper wrote:
Hi,
I'm trying to output an image showing subgraphs [0] using
write_graphviz() in boost 1.48.0. I've tried to modify an example [1]
by adding a write_graphviz() call. eg...
std::ofstream ofs("out.dot");
const char* names[] = { "A", "B", "C", "D", "E", "F" };
write_graphviz(ofs, G0.m_graph, make_label_writer(names));
This works fine for displaying the underlying graph, but no subgraphs
are shown. When I do the following...
write_graphviz(ofs, G0, make_label_writer(names));
I get a host of errors including...
include/boost/graph/graphviz.hpp:377: error: no matching function
for call to ‘get(boost::label_writer&, Vertex&)’
Can you please try using write_graphviz_dp instead of write_graphviz? That
might work better, and allows you to specify properties to write more
easily.
I notice a comment in graphviz.hpp [2] 'requires graph_name graph
property' so I had a look at the subgraph_properties.cpp example [3].
This seemed to only be showing vertex properties but didn't compile
out of the box. Is it possible for someone experienced in
boost::graph to post a modified version of [1] that can produce
something like image [0], or point me in the right direction?
I just committed a fixed version of subgraph_properties.cpp to the trunk, so
that one should compile now.
-- Jeremiah Willcock
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users