[ROOT] copy canvas (3)

From: Ingolf Martin (martin@pit.physik.uni-tuebingen.de)
Date: Mon Jul 17 2000 - 09:06:23 MEST


Hi Rene,

when I try the updated macro on my favourite test session

  .x $ROOTSYS/tutorials/gerrors2.C
  .x canclone.C(c1)

the cloned pad's frame still looks different (color+border).
However, i have not yet checked out the current developer's
version. Can you reproduce this behavior with the brand-new
DrawClonePad command?

Ingolf


On Thu, 13 Jul 2000, Rene Brun wrote:

> Hi Ingolf,
> 
> The macro that I send yesterday was only a partial implementation.
> I have now implemented a new function TCanvas::DrawClonePad to do the job
> correctly. It also appears in the canvas context menu.
> As usual, you can get the latest source from the CVS repository.
> I have updated the macro of yesterday to be a copy of the new
> TCanvas::DrawClonePad
> Here is the new code.
> 
> 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;
>   c1->cd();
>   TObject *obj, *clone;
>   //copy pad attributes
>   pad->Range(c1->GetX1(),c1->GetY1(),c1->GetX2(),c1->GetY2());
>   pad->SetTickx(c1->GetTickx());
>   pad->SetTicky(c1->GetTicky());
>   pad->SetGridx(c1->GetGridx());
>   pad->SetGridy(c1->GetGridy());
>   pad->SetLogx(c1->GetLogx());
>   pad->SetLogy(c1->GetLogy());
>   pad->SetLogz(c1->GetLogz());
>   pad->SetBorderSize(c1->GetBorderSize());
>   pad->SetBorderMode(c1->GetBorderMode());
>   c1->TAttLine::Copy((TAttLine&)*pad);
>   c1->TAttFill::Copy((TAttFill&)*pad);
>   c1->TAttPad::Copy((TAttPad&)*pad);
>   
>   //copy primitives
>   TIter next(c1->GetListOfPrimitives());
>   while ((obj=next())) {
>      gROOT->SetSelectedPad(pad);
>      clone = obj->Clone();
>      pad->GetListOfPrimitives()->Add(clone,obj->GetDrawOption());
>   }
>   pad->Modified();
>   pad->Update();
>   c2->cd();
> }
> 
> Ingolf Martin wrote:
> > 
> > Hi Rene,
> > 
> > thanks for your quick reply on the canvas copy problem.
> > Unfortunately, the "GetListOfPrimitives()" cloning procedure
> > seems to have some problems with TGraphs.
> > 
> > For example, if we try this session:
> > 
> >   // it is interesting to select "p" as a drawing option for one graph
> >   // after this command
> >   .x $ROOTSYS/tutorials/gerrors2.C;
> > 
> >   // now the macro that you kindly supplied
> >   .x canclone.C(c1);
> > 
> > we end up with a different drawing style and lost markers, which is quite
> > surprising since everything works so well with histograms.
> > Do you have any idea on where that information is lost and how it can be
> > restored?
> > 
> > Ingolf
> > 
> > On Wed, 12 Jul 2000, Rene Brun wrote:
> > > 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
> > >
> 

-- 


------------------------------------------------

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