2012-02-07 17 views
5

Veo ejemplos de esto cuando uso mapas de propiedades, pero no cuando uso structs para manejar los vértices y bordes (creo que esto se llama 'paquetes').¿Cómo imprimir un gráfico de impulso en graphviz con una de las propiedades que se muestran?

Tengo vértices y bordes definidos como tales, en un gráfico de lista de adyacencia.

struct Vertex 
{ 
    string name; 
    int some_int; 
}; 

struct Edge 
{ 
    double weight; 
}; 

El gráfico se construye de la siguiente manera:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, Vertex, Edge> boost_graph; 

Quiero imprimir mi gráfica de estos objetos en Graphviz formato, para que pueda verla como una imagen. Sin embargo, no solo quiero los nodos y los bordes. También quiero el atributo name en los vértices y weight en los bordes para que aparezcan en la imagen. ¿Cómo puedo hacer esto?

+0

Creo que debería mostrar una muestra completa. No puedo ver cómo construiste un árbol con Edge 'defined' como eso. Tal vez, una propiedad mapeada para una ventaja? – sehe

+0

@sehe Gracias. He agregado la definición del gráfico a la pregunta. Los bordes y los vértices se agregan mediante las funciones boost :: add_edge y boost :: add_vertex – Jim

+0

¿Está buscando la definición de formato de puntos? http://www.graphviz.org/Gallery.php simplemente haga clic en cualquiera de los ejemplos y vea el código que se necesita para hacerlos :-) –

Respuesta

6

di mala información la primera vez. Aquí está la respuesta correcta.

#include <boost/graph/graphviz.hpp> 

using namespace boost; 

// Graph type 
typedef adjacency_list<vecS, vecS, directedS, VertexProperties, EdgeProperty> Graph; 
Graph g; 
std::vector<std::string> NameVec; // for dot file names 


// write the dot file 
std::ofstream dotfile (strDotFile.c_str()); 
write_graphviz (dotfile, g, make_label_writer(&NameVec[0])); 
+0

Gracias, pero no veo un método llamado WriteDOTFile. ¿Dónde está esto? – Jim

+0

@MartinKristiansen Sí, pero esto no explica dónde está la función .WriteDOTFile? No estoy seguro de lo que estás implicando. – Jim

+0

Gracias por la actualización. ¿Make_label_writer de alguna manera selecciona la cadena de la estructura Vertex? – Jim

21

Acabo de tropezar con esta pregunta. Aunque tiene una respuesta aceptada, pensé que agregaría mi versión también.

Está utilizando bundled property en el gráfico. La forma correcta de obtener un mapa de propiedades a partir de sus propiedades agrupadas es usar boost::get. Así que usted puede hacer algo como:

boost::write_graphviz(std::cout, your_graph, 
    boost::make_label_writer(boost::get(&Vertex::name, your_graph)), 
    boost::make_label_writer(boost::get(&Edge::weight, your_graph)), 
    ); 

Dónde your_graph es el objeto gráfico que ha creado.

+1

Te mereces la marca en mi humilde opinión: D –

+0

@ ChrisHuang-Leaver , :-) Gracias. – Vikas

+0

Tengo el mismo problema, pero, en lugar de un atributo público, tengo un método para mi clase de vértice, por ejemplo, clase Vertex {public: int getID(); privado: int m_iID;}; ¿Qué debo hacer en este caso para poner la identificación en el archivo graphviz? – Jepessen

Cuestiones relacionadas