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
> >
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET