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