Program Listing for File GraphDotOutput.h#
↰ Return to documentation for file (src/util/graphs/GraphDotOutput.h)
#ifndef GRAPH_DOT_H
#define GRAPH_DOT_H
#include <GraphAccess.h>
#include <string>
template <class Graph>
class GraphDotOutput
{
public:
typedef typename Graph::Node GraphNode;
typedef typename Graph::Edge GraphEdge;
void writeToDOTFile(const std::string& filename, const std::string& graphname)
{
bool debug = false;
if(debug) std::cerr << " dot output to " << filename << std::endl;
std::ofstream dotfile(filename.c_str());
//Liao, add "" to enclose the graphname,otherwise syntax error for .dot file. 2/22/2008
dotfile << "digraph \"" << graphname <<"\""<< " {\n";
for(typename Graph::NodeIterator p=g.GetNodeIterator(); !p.ReachEnd(); ++p) {
typename Graph::Node* node = *p;
dotfile << ((long)node) << "[label=\"" << getVertexName(node) << "\" ];" << std::endl;
}
if(debug) std::cerr << " finished add node" << std::endl; // debug
for(typename Graph::NodeIterator p=g.GetNodeIterator(); !p.ReachEnd(); ++p) {
if(debug) std::cerr << " add edge from node ... " << std::endl; // debug
typename Graph::Node* node1 = *p;
typename Graph::EdgeIterator edges = g.GetNodeEdgeIterator(node1, GraphAccess::EdgeOut);
for( ; !edges.ReachEnd(); ++edges) {
typename Graph::Edge* e = *edges;
typename Graph::Node* node2 = g.GetEdgeEndPoint(e, GraphAccess::EdgeIn);
dotfile << ((long)node1) << " -> " << ((long)node2)
<< "[label=\"" << getEdgeLabel(e) << "\"];" << std::endl;
}
}
if(debug) std::cerr << " writing content to " << filename << std::endl; // debug
dotfile << "}\n";
}
private:
Graph& g;
std::string Translate( std::string r1)
{
std::string r2 = "";
for (unsigned int i = 0; i < r1.size(); ++i) {
char c = r1[i];
if (c == '\"')
r2 = r2 + "\\\"";
else if (c == '\n') {
r2 = r2 + "\\n";
}
else
r2 = r2 + c;
}
return r2;
}
public:
GraphDotOutput( Graph &_g) : g(_g) {}
std::string getVertexName(typename Graph::Node* v)
{
std::string r1 = v->toString();
std::string r2 = Translate(r1);
return r2;
}
std::string getEdgeLabel(typename Graph::Edge* e)
{
std::string r1 = e->toString();
return Translate(r1);
}
};
#endif