[ROOT] TCanvas::MakeDefCanvas()

From: Hamlet (_hamlet@libero.it)
Date: Sat Aug 16 2003 - 14:20:41 MEST


I apologize if it was a known issue:

MakeDefCanvas() creates a new canvas adding a "_n#" string to the name 
of canvas if basename alone (some gROOT->GetDefCanvasName() or so) is 
already used by a canvas. That number is the number of current canvases 
in gROOT plus one.
Now, if I create three canvases (say, from "New canvas" menu item in a 
TBrowser window), c1, c1_n1, c1_n2 and c1_n3, and then I close c1_n1 
and c1_n2, when I create another default canvas, it will be named c1_n3 
(since 2 canvases are left), and will overwrite old c1_n3.

Run time workarounds can be to change default name of canvases or to 
create new canvases from CINT command line (not via MakeDefCanvas()).

A possible code solution, if you like it, could be something like (sorry 
for word wrap):


 void TCanvas::MakeDefCanvas()
{
//*-*-*-*-*-*-*Static function to build a default
// canvas*-*-*-*-*-*-*-*-*-*-*
//*-*          =========================================

   const char *defcanvas = gROOT->GetDefCanvasName();
   char *cdef;

   TList *lc = (TList*)gROOT->GetListOfCanvases();
   if (lc->FindObject(defcanvas)) {
   // CVS 3.05/07 code:
   // cdef = StrDup(Form("%s_n%d",defcanvas,lc->GetSize()+1)); 
      int n = lc->GetSize() + 1;
      cdef = new char[strlen(defcanvas)+15];
      do {
	strcpy(cdef, Form("%s_n%d", defcanvas, n++));
      } while(lc->FindObject(cdef));
   }
   else
      cdef = StrDup(Form("%s",defcanvas));

//   if (gInterpreter)
//      gROOT->ProcessLine(Form("TCanvas *%s = 
//         new TCanvas("%s","%s",1);",cdef,cdef,cdef));
//   else
      new TCanvas(cdef, cdef, 1);

   Printf("<TCanvas::MakeDefCanvas>: created default TCanvas with name \
      %s",cdef);
   delete [] cdef;
}


-- 
Hamlet



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET