22 extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
27 lt_symlist_t lt_preloaded_symbols[] = {
28 {
"gvplugin_dot_layout_LTX_library", (
void*)(&gvplugin_dot_layout_LTX_library) },
35 ClassImp(TGraphStruct);
61 TGraphStruct::TGraphStruct()
74 TGraphStruct::~TGraphStruct()
76 gvFreeLayout(fGVC,(Agraph_t*)fGVGraph);
77 agclose((Agraph_t*)fGVGraph);
80 if (fNodes)
delete fNodes;
81 if (fEdges)
delete fEdges;
88 void TGraphStruct::AddEdge(TGraphEdge *edge)
90 if (!fEdges) fEdges =
new TList;
101 TGraphEdge *TGraphStruct::AddEdge(TGraphNode *n1, TGraphNode *n2)
103 if (!fEdges) fEdges =
new TList;
105 TGraphEdge *edge =
new TGraphEdge(n1, n2);
114 void TGraphStruct::AddNode(TGraphNode *node)
116 if (!fNodes) fNodes =
new TList;
124 TGraphNode *TGraphStruct::AddNode(
const char *name,
const char *title)
126 if (!fNodes) fNodes =
new TList;
128 TGraphNode *node = (TGraphNode*)fNodes->FindObject(name);
131 node =
new TGraphNode(name, title);
141 void TGraphStruct::DumpAsDotFile(
const char *filename)
144 Int_t ierr = Layout();
148 file=fopen(filename,
"wt");
150 agwrite((Agraph_t*)fGVGraph, file);
158 void TGraphStruct::Draw(Option_t *option)
161 Int_t ierr = Layout();
167 gPad->Range(GD_bb((Agraph_t*)fGVGraph).LL.x-fMargin, GD_bb((Agraph_t*)fGVGraph).LL.y-fMargin,
168 GD_bb((Agraph_t*)fGVGraph).UR.x+fMargin, GD_bb((Agraph_t*)fGVGraph).UR.y+fMargin);
176 node = (TGraphNode*) fNodes->First();
178 for(Int_t i = 1; i < fNodes->GetSize(); i++){
179 node = (TGraphNode*)fNodes->After(node);
180 if (node) node->Draw();
187 edge = (TGraphEdge*) fEdges->First();
189 for(Int_t i = 1; i < fEdges->GetSize(); i++){
190 edge = (TGraphEdge*)fEdges->After(edge);
191 if (edge) edge->Draw();
199 Int_t TGraphStruct::Layout()
205 if (fGVC) gvFreeContext(fGVC);
207 fGVC = gvContextPlugins(lt_preloaded_symbols, 0);
214 gvFreeLayout(fGVC,(Agraph_t*)fGVGraph);
215 agclose((Agraph_t*)fGVGraph);
218 fGVGraph = (GVizAgraph_t*)agopen((
char*)
"GVGraph", Agdirected, 0);
220 fGVGraph = (GVizAgraph_t*)agopen((
char*)
"GVGraph", AGDIGRAPH);
225 node = (TGraphNode*) fNodes->First();
226 node->CreateGVNode(fGVGraph);
227 for(Int_t i = 1; i < fNodes->GetSize(); i++){
228 node = (TGraphNode*)fNodes->After(node);
229 if (node) node->CreateGVNode(fGVGraph);
235 edge = (TGraphEdge*) fEdges->First();
236 edge->CreateGVEdge(fGVGraph);
237 for(Int_t i = 1; i < fEdges->GetSize(); i++){
238 edge = (TGraphEdge*)fEdges->After(edge);
239 if (edge) edge->CreateGVEdge(fGVGraph);
244 int ierr = gvLayout(fGVC, (Agraph_t*)fGVGraph, (
char*)
"dot");
245 if (ierr)
return ierr;
249 node = (TGraphNode*) fNodes->First();
251 for(Int_t i = 1; i < fNodes->GetSize(); i++){
252 node = (TGraphNode*)fNodes->After(node);
253 if (node) node->Layout();
259 edge = (TGraphEdge*) fEdges->First();
261 for(Int_t i = 1; i < fEdges->GetSize(); i++){
262 edge = (TGraphEdge*)fEdges->After(edge);
263 if (edge) edge->Layout();
273 void TGraphStruct::SavePrimitive(std::ostream &out, Option_t * )
275 out<<
" TGraphStruct *graphstruct = new TGraphStruct();"<<std::endl;
280 node = (TGraphNode*) fNodes->First();
281 out<<
" TGraphNode *"<<node->GetName()<<
" = graphstruct->AddNode(\""<<
282 node->GetName()<<
"\",\""<<
283 node->GetTitle()<<
"\");"<<std::endl;
284 node->SaveAttributes(out);
285 for(Int_t i = 1; i < fNodes->GetSize(); i++){
286 node = (TGraphNode*)fNodes->After(node);
288 out<<
" TGraphNode *"<<node->GetName()<<
" = graphstruct->AddNode(\""<<
289 node->GetName()<<
"\",\""<<
290 node->GetTitle()<<
"\");"<<std::endl;
291 node->SaveAttributes(out);
300 edge = (TGraphEdge*) fEdges->First();
301 out<<
" TGraphEdge *"<<
"e"<<en<<
302 " = new TGraphEdge("<<
303 edge->GetNode1()->GetName()<<
","<<
304 edge->GetNode2()->GetName()<<
");"<<std::endl;
305 out<<
" graphstruct->AddEdge("<<
"e"<<en<<
");"<<std::endl;
306 edge->SaveAttributes(out,Form(
"e%d",en));
307 for(Int_t i = 1; i < fEdges->GetSize(); i++){
309 edge = (TGraphEdge*)fEdges->After(edge);
311 out<<
" TGraphEdge *"<<
"e"<<en<<
312 " = new TGraphEdge("<<
313 edge->GetNode1()->GetName()<<
","<<
314 edge->GetNode2()->GetName()<<
");"<<std::endl;
315 out<<
" graphstruct->AddEdge("<<
"e"<<en<<
");"<<std::endl;
316 edge->SaveAttributes(out,Form(
"e%d",en));
321 out<<
" graphstruct->Draw();"<<std::endl;
326 void TGraphStruct::Streamer(TBuffer &)