104 const Char_t *TAxis3D::fgRulerName = 
"axis3druler";
 
  110 TAxis3D::TAxis3D() : TNamed(TAxis3D::fgRulerName,
"ruler")
 
  114    fStickyZoom = kFALSE;
 
  121 TAxis3D::TAxis3D(Option_t *) : TNamed(TAxis3D::fgRulerName,
"ruler")
 
  126    fStickyZoom = kFALSE;
 
  132 TAxis3D::TAxis3D(
const TAxis3D &axis) : TNamed(axis)
 
  134    ((TAxis3D&)axis).Copy(*
this);
 
  140 void TAxis3D::Copy(TObject &obj)
 const 
  143    for (Int_t i=0;i<2;i++) fAxis[i].Copy(((TAxis3D&)obj).fAxis[i]);
 
  149 void TAxis3D::InitSet()
 
  151    fAxis[0].SetName(
"xaxis");
 
  152    fAxis[1].SetName(
"yaxis");
 
  153    fAxis[2].SetName(
"zaxis");
 
  155    fAxis[0].Set(1,0.,1.);
 
  156    fAxis[1].Set(1,0.,1.);
 
  157    fAxis[2].Set(1,0.,1.);
 
  164 void TAxis3D::Browse(TBrowser *b)
 
  166    for (Int_t i=0;i<3;i++) b->Add(&fAxis[i],fAxis[i].GetTitle());
 
  172 Int_t TAxis3D::DistancetoPrimitive(Int_t px, Int_t py)
 
  175    for (
int i=0;i<3;i++) {
 
  176       Int_t axDist = fAxis[i].DistancetoPrimitive(px,py);
 
  177       if (dist > axDist) { dist = axDist; fSelected = &fAxis[i]; }
 
  190 void TAxis3D::ExecuteEvent(Int_t event, Int_t px, Int_t py)
 
  194    if (fSelected) fSelected->ExecuteEvent(event,px,py);
 
  198    static Double_t x0, y0, x1, y1;
 
  200    static Int_t pxold, pyold;
 
  201    static Int_t px0, py0;
 
  202    static Int_t linedrawn;
 
  204    if (!fZoomMode) 
return;
 
  208    gPad->SetCursor(kCross);
 
  213       gVirtualX->SetLineColor(-1);
 
  214       gPad->TAttLine::Modify();  
 
  215       ((TPad *)gPad)->AbsPixeltoXY(px,py,x0,y0);
 
  217       pxold = px; pyold = py;
 
  222       if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
 
  226       gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
 
  231       gPad->SetDoubleBuffer(1);
 
  232       gVirtualX->SetDrawMode(TVirtualX::kCopy); 
 
  233       TView *view = gPad->GetView();
 
  236       Double_t min[3],max[3],viewCenter[3],viewCenterNDC[3];
 
  238       view->GetRange(min,max);
 
  239       for (i =0; i<3;i++) viewCenter[i] = (max[i]+min[i])/2;
 
  240       view->WCtoNDC(viewCenter,viewCenterNDC);
 
  242       Double_t center[3],pointNDC[3],size[3],oldSize[3];
 
  243       ((TPad *)gPad)->AbsPixeltoXY(px,py,x1,y1);
 
  244       pointNDC[0] = (x0+x1)/2; pointNDC[1] = (y0+y1)/2;
 
  245       pointNDC[2] = viewCenterNDC[2];
 
  246       view->NDCtoWC(pointNDC, center);
 
  248       for (i =0; i<3;i++) oldSize[i] = size[i]= (max[i]-min[i])/2;
 
  251       if (TMath::Abs(px-px0)+TMath::Abs(py - py0) > 4 ) {
 
  253          for (i =0; i<3;i++) size[i] = -1;
 
  255          pointNDC[0] = x0; pointNDC[1] = y0;
 
  257          view->NDCtoWC(pointNDC, newEdge);
 
  258          for (i =0; i<3;i++) {
 
  259             Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
 
  260             if ( newSize/oldSize[i] > 0.002)
 
  261                size[i] = TMath::Max(size[i], newSize);
 
  263                size[i] = oldSize[i];
 
  266          pointNDC[0] = x1; pointNDC[1] = y1;
 
  268          view->NDCtoWC(pointNDC, newEdge);
 
  269          for (i =0; i<3;i++) {
 
  270             Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
 
  271             if ( newSize/oldSize[i] > 0.002)
 
  272                size[i] = TMath::Max(size[i], newSize);
 
  274                size[i] = oldSize[i];
 
  277          if (fZooms == kMAXZOOMS) fZoom = 0;
 
  279          memcpy(fZoomMin[fZooms],min,3*
sizeof(Float_t));
 
  280          memcpy(fZoomMax[fZooms],max,3*
sizeof(Float_t));
 
  283       for (i =0; i<3;i++) {
 
  284          max[i] = center[i] + size[i];
 
  285          min[i] = center[i] - size[i];
 
  287       view->SetRange(min,max);
 
  289       if(!fStickyZoom)SwitchZoom();
 
  290          gPad->Modified(kTRUE);
 
  302 char *TAxis3D::GetObjectInfo(Int_t , Int_t )
 const 
  304    return (
char*)
"axis3d";
 
  310 void TAxis3D::Paint(Option_t *)
 
  313    PaintAxis(&axis, 90);
 
  323 void TAxis3D::PaintAxis(TGaxis *axis, Float_t ang)
 
  325    static Double_t epsil = 0.001;
 
  331    Double_t x1[3], x2[3], y1[3], y2[3], z1[3], z2[3], av[24]  ;
 
  333    Int_t ix1, ix2, iy1, iy2, iz1, iz2;
 
  336    TView *view = gPad->GetView();
 
  338       Error(
"PaintAxis", 
"no TView in current pad");
 
  342    rad  = TMath::ATan(1.) * 4. / 180.;
 
  343    cosa = TMath::Cos(ang*rad);
 
  344    sina = TMath::Sin(ang*rad);
 
  346    view->AxisVertex(ang, av, ix1, ix2, iy1, iy2, iz1, iz2);
 
  347    for (i = 1; i <= 8; ++i) {
 
  348       r[i*3 - 3] = av[i*3 - 3] + av[i*3 - 2]*cosa;
 
  349       r[i*3 - 2] = av[i*3 - 2]*sina;
 
  350       r[i*3 - 1] = av[i*3 - 1];
 
  353    view->WCtoNDC(&r[ix1*3 - 3], x1);
 
  354    view->WCtoNDC(&r[ix2*3 - 3], x2);
 
  355    view->WCtoNDC(&r[iy1*3 - 3], y1);
 
  356    view->WCtoNDC(&r[iy2*3 - 3], y2);
 
  357    view->WCtoNDC(&r[iz1*3 - 3], z1);
 
  358    view->WCtoNDC(&r[iz2*3 - 3], z2);
 
  360    view->SetAxisNDC(x1, x2, y1, y2, z1, z2);
 
  362    Double_t *rmin = view->GetRmin();
 
  363    Double_t *rmax = view->GetRmax();
 
  365    axis->SetLineWidth(1);
 
  370       Double_t ax[2], ay[2];
 
  371       Bool_t logAx = kFALSE;
 
  372       memset(chopax,0,
sizeof(chopax));
 
  375             ax[0] = x1[0]; ax[1] = x2[0];
 
  376             ay[0] = x1[1]; ay[1] = x2[1];
 
  377             logAx = gPad->GetLogx();
 
  380             if (TMath::Abs(y1[0] - y2[0]) < epsil)  y2[0] = y1[0];
 
  381             ax[0] = y1[0]; ax[1] = y2[0];
 
  382             ay[0] = y1[1]; ay[1] = y2[1];
 
  383             logAx = gPad->GetLogy();
 
  386             ax[0] = z1[0]; ax[1] = z2[0];
 
  387             ay[0] = z1[1]; ay[1] = z2[1];
 
  388             strlcpy(chopax, 
"SDH+=",10);
 
  389             logAx = gPad->GetLogz();
 
  397       if ( ( TMath::Abs(ax[0] - ax[1]) + TMath::Abs(ay[0] - ay[1]))  < epsil  ) 
continue;
 
  400          if (ax[0] > ax[1]) strlcpy(chopax, 
"SDHV=+",10);
 
  401          else               strlcpy(chopax, 
"SDHV=-",10);
 
  404       if (i==1 && (TMath::Abs(z1[0] - z2[0]) + TMath::Abs(z1[1] - z2[1])) < epsil)
 
  405          strlcpy(chopax, 
"SDH+=",10);
 
  409          strlcat(chopax,
"G",10);
 
  410          bmin = TMath::Power(10, rmin[i]);
 
  411          bmax = TMath::Power(10, rmax[i]);
 
  417       axis->SetLineColor(  fAxis[i].GetAxisColor());
 
  418       axis->SetTextFont(   fAxis[i].GetTitleFont());
 
  419       axis->SetTextColor(  fAxis[i].GetTitleColor());
 
  420       axis->SetTickSize(   fAxis[i].GetTickLength());
 
  421       axis->SetLabelColor( fAxis[i].GetLabelColor());
 
  422       axis->SetLabelFont(  fAxis[i].GetLabelFont());
 
  423       axis->SetLabelOffset(fAxis[i].GetLabelOffset()+fAxis[i].GetTickLength());
 
  424       axis->SetLabelSize(  fAxis[i].GetLabelSize());
 
  425       axis->SetTitle(      fAxis[i].GetTitle());
 
  426       axis->SetTitleOffset(fAxis[i].GetTitleOffset());
 
  427       axis->SetTitleSize(  fAxis[i].GetTitleSize());
 
  428       enum { kCenterTitle = BIT(12) }; 
 
  429       axis->SetBit(kCenterTitle, fAxis[i].TestBit(kCenterTitle));
 
  433       ndiv = fAxis[i].GetNdivisions();
 
  440       if (fAxis[i].GetTimeDisplay()) {
 
  441          strlcat(chopax,
"t",10);
 
  442          if (strlen(fAxis[i].GetTimeFormatOnly()) == 0) {
 
  443             axis->SetTimeFormat(fAxis[i].ChooseTimeFormat(bmax-bmin));
 
  445             axis->SetTimeFormat(fAxis[i].GetTimeFormat());
 
  448       axis->SetOption(chopax);
 
  449       axis->PaintAxis(ax[0], ay[0], ax[1], ay[1], bmin, bmax, ndiv, chopax);
 
  457 Double_t *TAxis3D::PixeltoXYZ(Double_t px, Double_t py, Double_t *point3D, TView *view)
 
  459    Double_t *thisPoint = 0;
 
  460    if (!view && gPad) view = gPad->GetView();
 
  462       Double_t x[3] = {px,py,0.5}; 
 
  463       Double_t min[3], max[3];
 
  464       view->GetRange(min,max);
 
  466       for (i =0; i<3;i++) min[i] = (max[i]+min[i])/2;
 
  467       view->WCtoNDC(min,max);
 
  468       min[0] = x[0]; min[1] = x[1];
 
  470       view->NDCtoWC(min, x);
 
  471       for (i=0;i<3;i++) point3D[i] = x[i];
 
  480 void TAxis3D::SavePrimitive(std::ostream &out, Option_t * )
 
  482    fAxis[0].SaveAttributes(out,GetName(),
"->GetXaxis()");
 
  483    fAxis[1].SaveAttributes(out,GetName(),
"->GetYaxis()");
 
  484    fAxis[2].SaveAttributes(out,GetName(),
"->GetZaxis()");
 
  490 void TAxis3D::UseCurrentStyle()
 
  492    if (gStyle->IsReading()) {
 
  493       fAxis[0].ResetAttAxis(
"X");
 
  494       fAxis[1].ResetAttAxis(
"Y");
 
  495       fAxis[2].ResetAttAxis(
"Z");
 
  497       fAxis[0].SetTitle(
"x");
 
  498       fAxis[0].SetLabelColor(kRed);   fAxis[0].SetAxisColor(kRed);
 
  499       fAxis[1].SetLabelColor(kGreen); fAxis[1].SetAxisColor(kGreen);
 
  500       fAxis[2].SetLabelColor(kBlue);  fAxis[2].SetAxisColor(kBlue);
 
  502       gStyle->SetNdivisions (fAxis[0].GetNdivisions(), 
"x");
 
  503       gStyle->SetAxisColor  (fAxis[0].GetAxisColor(),  
"x");
 
  504       gStyle->SetLabelColor (fAxis[0].GetLabelColor(), 
"x");
 
  505       gStyle->SetLabelFont  (fAxis[0].GetLabelFont(),  
"x");
 
  506       gStyle->SetLabelOffset(fAxis[0].GetLabelOffset(),
"x");
 
  507       gStyle->SetLabelSize  (fAxis[0].GetLabelSize(),  
"x");
 
  508       gStyle->SetTickLength (fAxis[0].GetTickLength(), 
"x");
 
  509       gStyle->SetTitleOffset(fAxis[0].GetTitleOffset(),
"x");
 
  510       gStyle->SetTitleSize  (fAxis[0].GetTitleSize(),  
"x");
 
  511       gStyle->SetTitleColor (fAxis[0].GetTitleColor(), 
"x");
 
  512       gStyle->SetTitleFont  (fAxis[0].GetTitleFont(),  
"x");
 
  514       gStyle->SetNdivisions (fAxis[1].GetNdivisions(), 
"y");
 
  515       gStyle->SetAxisColor  (fAxis[1].GetAxisColor(),  
"y");
 
  516       gStyle->SetLabelColor (fAxis[1].GetLabelColor(), 
"y");
 
  517       gStyle->SetLabelFont  (fAxis[1].GetLabelFont(),  
"y");
 
  518       gStyle->SetLabelOffset(fAxis[1].GetLabelOffset(),
"y");
 
  519       gStyle->SetLabelSize  (fAxis[1].GetLabelSize(),  
"y");
 
  520       gStyle->SetTickLength (fAxis[1].GetTickLength(), 
"y");
 
  521       gStyle->SetTitleOffset(fAxis[1].GetTitleOffset(),
"y");
 
  522       gStyle->SetTitleSize  (fAxis[1].GetTitleSize(),  
"y");
 
  523       gStyle->SetTitleColor (fAxis[1].GetTitleColor(), 
"y");
 
  524       gStyle->SetTitleFont  (fAxis[1].GetTitleFont(),  
"y");
 
  526       gStyle->SetNdivisions (fAxis[2].GetNdivisions(), 
"z");
 
  527       gStyle->SetAxisColor  (fAxis[2].GetAxisColor(),  
"z");
 
  528       gStyle->SetLabelColor (fAxis[2].GetLabelColor(), 
"z");
 
  529       gStyle->SetLabelFont  (fAxis[2].GetLabelFont(),  
"z");
 
  530       gStyle->SetLabelOffset(fAxis[2].GetLabelOffset(),
"z");
 
  531       gStyle->SetLabelSize  (fAxis[2].GetLabelSize(),  
"z");
 
  532       gStyle->SetTickLength (fAxis[2].GetTickLength(), 
"z");
 
  533       gStyle->SetTitleOffset(fAxis[2].GetTitleOffset(),
"z");
 
  534       gStyle->SetTitleSize  (fAxis[2].GetTitleSize(),  
"z");
 
  535       gStyle->SetTitleColor (fAxis[2].GetTitleColor(), 
"z");
 
  536       gStyle->SetTitleFont  (fAxis[2].GetTitleFont(),  
"z");
 
  543 Int_t TAxis3D::AxisChoice( Option_t *axis)
 const 
  545    char achoice = toupper(axis[0]);
 
  546    if (achoice == 
'X') 
return 0;
 
  547    if (achoice == 
'Y') 
return 1;
 
  548    if (achoice == 
'Z') 
return 2;
 
  555 Int_t TAxis3D::GetNdivisions( Option_t *axis)
 const 
  557    Int_t ax = AxisChoice(axis);
 
  558    if (ax < 0) 
return 0;
 
  559    return fAxis[ax].GetNdivisions();
 
  565 Color_t TAxis3D::GetAxisColor( Option_t *axis)
 const 
  567    Int_t ax = AxisChoice(axis);
 
  568    if (ax < 0) 
return 0;
 
  569    return fAxis[ax].GetAxisColor();
 
  575 Color_t TAxis3D::GetLabelColor( Option_t *axis)
 const 
  577    Int_t ax = AxisChoice(axis);
 
  578    if (ax < 0) 
return 0;
 
  579    return fAxis[ax].GetLabelColor();
 
  585 Style_t TAxis3D::GetLabelFont( Option_t *axis)
 const 
  587    Int_t ax = AxisChoice(axis);
 
  588    if (ax < 0) 
return 0;
 
  589    return fAxis[ax].GetLabelFont();
 
  595 Float_t TAxis3D::GetLabelOffset( Option_t *axis)
 const 
  597    Int_t ax = AxisChoice(axis);
 
  598    if (ax < 0) 
return 0;
 
  599    return fAxis[ax].GetLabelOffset();
 
  605 Float_t TAxis3D::GetLabelSize( Option_t *axis)
 const 
  607    Int_t ax = AxisChoice(axis);
 
  608    if (ax < 0) 
return 0;
 
  609    return fAxis[ax].GetLabelSize();
 
  615 Float_t TAxis3D::GetTickLength( Option_t *axis)
 const 
  617    Int_t ax = AxisChoice(axis);
 
  618    if (ax < 0) 
return 0;
 
  619    return fAxis[ax].GetTickLength();
 
  625 Float_t TAxis3D::GetTitleOffset( Option_t *axis)
 const 
  627    Int_t ax = AxisChoice(axis);
 
  628    if (ax < 0) 
return 0;
 
  629    return fAxis[ax].GetTitleOffset();
 
  635    Int_t i = AxisChoice(axis);    \ 
  637    if (i == -1) { i = 0; nax = 3;}\ 
  638    for (Int_t ax=i;ax<nax+i;ax++) 
  643 void TAxis3D::SetNdivisions(Int_t n, Option_t *axis)
 
  645    AXISCHOICE {fAxis[ax].SetNdivisions(n);}
 
  651 void TAxis3D::SetAxisColor(Color_t color, Option_t *axis)
 
  653    AXISCHOICE {fAxis[ax].SetAxisColor(color);}
 
  659 void TAxis3D::SetAxisRange(Double_t xmin, Double_t xmax, Option_t *axis)
 
  661    Int_t ax = AxisChoice(axis);
 
  663    TAxis *theAxis = &fAxis[ax];
 
  664    Int_t bin1 = theAxis->FindBin(xmin);
 
  665    Int_t bin2 = theAxis->FindBin(xmax);
 
  666    theAxis->SetRange(bin1, bin2);
 
  672 void TAxis3D::SetLabelColor(Color_t color, Option_t *axis)
 
  674    AXISCHOICE { fAxis[ax].SetLabelColor(color); }
 
  680 void TAxis3D::SetLabelFont(Style_t font, Option_t *axis)
 
  682    AXISCHOICE { fAxis[ax].SetLabelFont(font); }
 
  688 void TAxis3D::SetLabelOffset(Float_t offset, Option_t *axis)
 
  690    AXISCHOICE { fAxis[ax].SetLabelOffset(offset); }
 
  696 void TAxis3D::SetLabelSize(Float_t size, Option_t *axis)
 
  698    AXISCHOICE { fAxis[ax].SetLabelSize(size); }
 
  704 void TAxis3D::SetTickLength(Float_t length, Option_t *axis)
 
  706    AXISCHOICE { fAxis[ax].SetTickLength(length); }
 
  712 void TAxis3D::SetTitleOffset(Float_t offset, Option_t *axis)
 
  714    AXISCHOICE { fAxis[ax].SetTitleOffset(offset); }
 
  721 TAxis3D *TAxis3D::GetPadAxis(TVirtualPad *pad)
 
  724    TVirtualPad *thisPad=pad;
 
  725    if (!thisPad) thisPad = gPad;
 
  728       obj = thisPad->FindObject(TAxis3D::fgRulerName);
 
  729       if (!(obj && obj->InheritsFrom(Class()->GetName()))) obj = 0;
 
  731    return (TAxis3D *)obj;
 
  738 TAxis3D *TAxis3D::ToggleRulers(TVirtualPad *pad)
 
  741    TVirtualPad *thisPad=pad;
 
  742    if (!thisPad) thisPad = gPad;
 
  743    if (thisPad && thisPad->GetView() ) {
 
  744       TAxis3D *a =  GetPadAxis(pad);
 
  748          ax->SetBit(kCanDelete);
 
  766 TAxis3D *TAxis3D::ToggleZoom(TVirtualPad *pad)
 
  769    TVirtualPad *thisPad=pad;
 
  770    if (!thisPad) thisPad = gPad;
 
  771    if (thisPad && thisPad->GetView()) {
 
  773       TList *l = thisPad->GetListOfPrimitives();
 
  774       TObject *o = l->FindObject(TAxis3D::fgRulerName);
 
  775       if (o && o->InheritsFrom(Class()->GetName())) { 
 
  776          if (o != l->Last()) { 
 
  783          ax->SetBit(kCanDelete);