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