2012-02-07 5 views
5

Vedo esempi di questo quando si usano le mappe delle proprietà, ma non quando si usano le strutture per gestire i vertici e gli spigoli (penso che questo si chiami 'pacchetti').Come stampare un grafico boost in graphviz con una delle proprietà visualizzate?

Ho vertici e spigoli definiti come tali, in un grafico di lista di adiacenza.

struct Vertex 
{ 
    string name; 
    int some_int; 
}; 

struct Edge 
{ 
    double weight; 
}; 

Il grafico è costruito come segue:

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

voglio stampare il mio grafico di questi oggetti in formato Graphviz, così posso vederlo come immagine. Tuttavia, non voglio solo i nodi e i bordi. Voglio anche l'attributo name sui vertici e weight sui bordi per apparire nell'immagine. Come posso fare questo?

+0

Penso che dovresti mostrare un campione completo. Non riesco a vedere come hai costruito un albero con Edge 'definito' come quello. Forse, una proprietà mappata per un vantaggio? – sehe

+0

@sehe Grazie. Ho aggiunto la definizione del grafico alla domanda. I bordi e i vertici sono aggiunti dalle funzioni boost :: add_edge e boost :: add_vertex – Jim

+0

Stai cercando la definizione del formato punto? http://www.graphviz.org/Gallery.php basta cliccare su uno degli esempi e visualizzare il codice necessario per renderli :-) –

risposta

6

Ho dato cattive informazioni la prima volta. Ecco la risposta corretta.

#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

Grazie, ma non vedo un metodo chiamato WriteDOTFile .. Dov'è questo? – Jim

+0

@MartinKristiansen Sì, ma questo non spiega dove si trova la funzione .WriteDOTFile? Non sono sicuro di quello che stai insinuando. – Jim

+0

Grazie per l'aggiornamento. Make_label_writer in qualche modo seleziona la stringa dalla struttura di Vertex? – Jim

21

Mi sono appena imbattuto in questa domanda. Sebbene abbia una risposta accettata, ho pensato di aggiungere anche la mia versione.

Si sta utilizzando bundled property nel grafico. Il modo corretto per ottenere la mappa delle proprietà dalle proprietà in bundle è utilizzare boost::get. Così si può fare qualcosa di simile:

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)), 
    ); 

Dove your_graph è l'oggetto grafico che hai creato.

+1

Ti meriti il ​​segno di spunta IMHO: D –

+0

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

+0

Ho lo stesso problema, ma, invece di attributo pubblico, ho un metodo per la mia classe vertex, ad esempio la classe Vertex {public: int getID(); private: int m_iID;}; Cosa devo fare in questo caso per inserire l'ID nel file graphviz? – Jepessen