00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00032 #include <mtt/graph_wrapper.h>
00033
00034 Agnode_t*GVGraph::selectNode(string&name)
00035 {
00036 map<string, Agnode_t*>::iterator it = _nodes.find(name);
00037 if(it!=_nodes.end())
00038 return it->second;
00039 else
00040 return NULL;
00041 }
00042
00043 Agedge_t*GVGraph::selectEdge(string&source,string&target)
00044 {
00045 pair<string, string> key=make_pair<string,string>(source,target);
00046
00047 if(_edges.find(key)!=_edges.end())
00048 return _edges[key];
00049
00050 return NULL;
00051 }
00052
00053 int GVGraph::setNodeAttribute(string name,string attribute,string value)
00054 {
00055 return agsafeset(selectNode(name),const_cast<char*>(attribute.c_str()),const_cast<char*>(value.c_str()),const_cast<char*>(""));
00056
00057
00058 }
00059
00060 int GVGraph::setEdgeAttribute(string source,string target,string attribute,string value)
00061 {
00062 return agsafeset(selectEdge(source,target),const_cast<char*>(attribute.c_str()),const_cast<char*>(value.c_str()),const_cast<char*>(""));
00063
00064
00065 }
00066
00067 void GVGraph::startRender()
00068 {
00069 gvRender(_context,_graph,(char*)"xgtk",NULL);
00070 }
00071
00072 GVC_t*GVGraph::getGVCcontext(void)
00073 {
00074 return _context;
00075 }
00076
00077 Agraph_t* GVGraph::_agopen(string name,int kind)
00078 {
00079 return agopen(const_cast<char*>(name.c_str()),kind);
00080 }
00081
00082 string GVGraph::_agget(void*object,string attr,string alt)
00083 {
00084 string str=agget(object, const_cast<char*>(attr.c_str()));
00085
00086 if(str==string())
00087 return alt;
00088 else
00089 return str;
00090 }
00091
00092 int GVGraph::_agset(void*object,string attr,string value)
00093 {
00094 return agsafeset(object, const_cast<char*>(attr.c_str()),const_cast<char*>(value.c_str()),const_cast<char*>(value.c_str()));
00095 }
00096
00097 Agsym_t* GVGraph::_agnodeattr(string name,string value)
00098 {
00099 return agnodeattr(_graph,const_cast<char*>(name.c_str()),const_cast<char*>(value.c_str()));
00100 }
00101
00102 Agsym_t* GVGraph::_agedgeattr(string name,string value)
00103 {
00104 return agedgeattr(_graph,const_cast<char*>(name.c_str()),const_cast<char*>(value.c_str()));
00105 }
00106 Agnode_t* GVGraph::_agnode(string name)
00107 {
00108 return agnode(_graph,const_cast<char*>(name.c_str()));
00109 }
00110
00111 int GVGraph::_gvLayout(GVC_t*gvc,graph_t*graph,string engine)
00112 {
00113 return gvLayout(gvc,graph,engine.c_str());
00114 }
00115
00116 GVGraph::GVGraph(string name,double node_size):
00117 _context(gvContext()),
00118 _graph(_agopen(name, AGDIGRAPHSTRICT))
00119 {
00120
00121
00122
00123
00124
00125 _agset(_graph, "nodesep", "0.1");
00126
00127
00128
00129
00130
00131 _agset(_graph, "rankdir","LR");
00132
00133
00134
00135
00136 _agnodeattr("shape", "box");
00137 _agnodeattr("height", "0.02");
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 }
00152
00153 GVGraph::~GVGraph()
00154 {
00155 gvFreeLayout(_context, _graph);
00156 agclose(_graph);
00157 gvFreeContext(_context);
00158 }
00159
00160 void GVGraph::addNode(const string& name)
00161 {
00162 if(_nodes.find(name)!=_nodes.end())
00163 removeNode(name);
00164
00165 _nodes.insert(pair<string,Agnode_t*>(name, _agnode(name)));
00166 }
00167
00168 void GVGraph::addNodes(vector<string>& names)
00169 {
00170 for(uint i=0; i<names.size(); ++i)
00171 addNode(names[i]);
00172 }
00173
00174 void GVGraph::removeNode(const string& name)
00175 {
00176 string nn=name;
00177
00178 if(_nodes.find(name)!=_nodes.end())
00179 {
00180 agdelete(_graph, _nodes[name]);
00181 _nodes.erase(name);
00182
00183 map< pair<string,string>, Agedge_t*>::iterator it;
00184
00185 for(it=_edges.begin();it!=_edges.end();it++)
00186 {
00187 if(it->first.first==nn || it->first.second==nn)
00188 removeEdge(it->first.first,it->first.second);
00189 }
00190 }
00191 }
00192
00193 void GVGraph::clearNodes()
00194 {
00195 map<string, Agnode_t*>::iterator it;
00196
00197 vector<string>names;
00198
00199 for(it=_nodes.begin();it!=_nodes.end();it++)
00200 names.push_back(it->first);
00201
00202 for(uint i=0;i<names.size();i++)
00203 removeNode(names[i]);
00204 }
00205
00206 void GVGraph::setRootNode(const string& name)
00207 {
00208 if(_nodes.find(name)!=_nodes.end())
00209 _agset(_graph, "root", name);
00210 }
00211
00212 void GVGraph::addEdge(const string &source, const string &target)
00213 {
00214 if(_nodes.find(source)!=_nodes.end() && _nodes.find(target)!=_nodes.end())
00215 {
00216 pair<string,string> key(source,target);
00217
00218 if(_edges.find(key)==_edges.end())
00219 _edges.insert( pair< pair<string,string >, Agedge_t* >(key, agedge(_graph, _nodes[source], _nodes[target])));
00220 }
00221 }
00222
00223 void GVGraph::removeEdge(const string &source, const string &target)
00224 {
00225 removeEdge(pair<string,string>(source, target));
00226 }
00227
00228 void GVGraph::removeEdge(const pair<string, string>& key)
00229 {
00230 if(_edges.find(key)!=_edges.end())
00231 {
00232 agdelete(_graph, _edges[key]);
00233 _edges.erase(key);
00234 }
00235 }
00236
00237 void GVGraph::freeLayout()
00238 {
00239 gvFreeLayout(_context, _graph);
00240 }
00241
00242 void GVGraph::applyLayout()
00243 {
00244 _gvLayout(_context, _graph, "dot");
00245 }