Re: [ROOT] Q: copy canvas into pad

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Jul 12 2000 - 10:49:03 MEST


Hi Ingolf,

The TObject::DrawClone function can be used to draw a clone of any object
into the current pad. In an interactive session, one can click with the middle
button to select the destination/current pad, then with the right button
click on the object to be copied (can be a primitive, histogram, pad, etc)
and select the item "DrawClone" in the context menu.

However, I realize that this currently does not work for the canvas itself.
When selecting "DrawClone" on a canvas, a new canvas is created that is a clone
of the original canvas.
I will modify TCanvas::DrawClone (or may be add a new function) to copy
a full canvas inside a pad of another canvas. I agree that this would be
a very useful feature.

Meanwhile, you can use the macro below as an example to do this.
This macro assumes that you have an already existing canvas c1 that may contain
subpads. You can for example test it with the session:
 root > .x $ROOTSYS/tutorials/h1draw.C
 root > .x canclone.C(c1)

Rene Brun



void canclone(TCanvas *c1)
{
   //example showing how to copy a full canvas into a pad in another canvas
   
  
  //create second canvas, divide it and copy first canvas in first subpad
  TCanvas *c2 = new TCanvas("c2","c2",600,800);
  c2->Divide(1,2);
  c2->cd(1);
  TPad *pad = (TPad*)gPad;
  TObject *obj;
  TIter next(c1->GetListOfPrimitives());
  while ((obj=next())) {
     gROOT->SetSelectedPad(pad);
     pad->GetListOfPrimitives()->Add(obj->Clone());
  }
  gPad->Modified();
}  
  

Ingolf Martin wrote:
> 
> Hi Rooters,
> 
> I would like to copy a canvas into a little pad in another canvas,
> something like
> 
>   // create two canvases (and one pad in second canvas)
>   .x $ROOTSYS/tutorials/graph.C;
>   TCanvas *canv1 = (TCanvas*)gROOT->GetListOfCanvases()->First();
>   TCanvas *canv2 = new TCanvas("canv2", "canv2", 1);
>   TPad *pad2 = new TPad("subpad","subpad", 0.3, 0.3, 0.7, 0.7);
>   canv2->cd();
>   pad2->Range(canv1->GetX1(), canv1->GetY1(), canv1->GetX2(), canv1->GetY2());
>   pad2->Draw();
> 
> But if I do
> 
>   //first try
>   TCanvas *clone1 = (TCanvas*)canv1->Clone();
>   pad2->cd();
>   clone1->Draw();
> 
> all that appears on pad2 is a frame and the title of canv1's graph.
> If one decides to manually loop through all graphics objects
> 
>   //second try
>   pad2->Clear();
>   TIter next(canv1->GetListOfPrimitives());
>   TObject *obj;
>   while (obj = next()) obj->Clone()->Draw();
> 
> the copy is still incomplete (apart from the obvious fact that this doesn't
> duplicate pad attributes like color and grid).
> On the other hand, the second approach works fine on the output of
> 
>   .x $ROOTSYS/tutorials/archi.C
> 
> which contains mainly TBoxes.
> 
> What is wrong with these examples?
> (ROOT 2.25/00 on Linux) - any comments would be greatly
> appreciated.
> 
> Ingolf
> 
> ------------------------------------------------
> 
> Ingolf Martin
> Physikalisches Institut,  Universität Tübingen
> Auf der Morgenstelle 14, 72076 Tübingen, Germany
> Tel: 07071/2976311   Fax: /295373



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET