// @(#)root/g3d:$Id$
// Author: Valery Fine(fine@mail.cern.ch)   07/01/2000

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include <ctype.h>
#include <assert.h>

#include "Riostream.h"
#include "TMath.h"
#include "TList.h"
#include "TClass.h"
#include "TAxis3D.h"
#include "TCanvas.h"
#include "TPad.h"
#include "TGaxis.h"
#include "TView.h"
#include "TVirtualPad.h"
#include "TVirtualX.h"
#include "TBrowser.h"
#include "TStyle.h"

//______________________________________________________________________________
//   The 3D axis painter class
//   ==========================
//
//  This class provide up to 3 axice to any 3D ROOT plot and
//  "ZOOM" service.
//  ExecuteEvent() method does provide zooming and moving a projection
//  3D object within TPad client area. With Zoom mode on the user can access
//  TAxis3D context menu and set /change the attributes of axice all together
//  or separately.
//
//  To add the 3D rulers to any 3D view one has to create
//  an instance of this class and Draw it.
//
//   TAxis3D rulers;
//   rulers.Draw();
//
//  One can use a static method to create ruler and attach it to the current gPad
//
//   TAxis3D::ToggleRulers(); // Brings the 3D axice up
//   TAxis3D::ToggleRulers(); // next calls remove the rulers from the TPad etc
//
//   To activate Zoomer one may call
//
//   TAxis3D::ToggleZoom();
//
//  each time one needs move or zoom the image. Then the user can:
//    -  move:
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/MovePicture.gif"> </P> End_Html
//    -  zoom:
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/ZoomPicture.gif"> </P> End_Html
//  its 3D view with <left-mouse button> press / move.
//  The "Zoom" deactivates itself just the user release the <left-mouse button>
//
//  To change attributes of the rulers attached to the current Pad, one may
//  query its pointer first:
//
//  TAxis3D *axis = TAxis3D::GetPadAxis(); // Ask axis pointer
//  if (axis) {
//    TAxis3D::ToggleRulers()     // To pop axice down
//    axis->SetLabelColor(kBlue); // Paint the axice labels with blue color
//    axis->SetAxisColor(kRed);   // Paint the axice itself with blue color
//    TAxis3D::ToggleRulers()     // To pop axice up
//  }
//
// The attributes of the created axice are affected by the current style
// (see TStyle class ) and Set... methods of this class
//
//  For example:
//
//   gStyle->SetAxisColor(kYellow,"X");
//   gStyle->SetAxisColor(kYellow,"Y");
//   gStyle->SetAxisColor(kYellow,"Z");
//
//   gStyle->SetLabelColor(kYellow,"X");
//   gStyle->SetLabelColor(kYellow,"Y");
//   gStyle->SetLabelColor(kYellow,"Z");
//
//   TAxis3D::ToggleRulers();
//   TAxis3D::ToggleRulers();
//
//  will draw all axice and labels with yellow color.
//

const Char_t *TAxis3D::fgRulerName = "axis3druler";
ClassImp(TAxis3D)


//______________________________________________________________________________
TAxis3D::TAxis3D() : TNamed(TAxis3D::fgRulerName,"ruler")
{
   // Normal constructor.

   fSelected = 0;
   fZoomMode = kFALSE;
   fStickyZoom = kFALSE;
   InitSet();
}


//______________________________________________________________________________
TAxis3D::TAxis3D(Option_t *) : TNamed(TAxis3D::fgRulerName,"ruler")
{
   // Normal constructor.

   fSelected = 0;
   InitSet();
   fZoomMode = kFALSE;
   fStickyZoom = kFALSE;
}


//______________________________________________________________________________
TAxis3D::TAxis3D(const TAxis3D &axis) : TNamed(axis)
{
   // Copy  constructor.

   ((TAxis3D&)axis).Copy(*this);
}


//______________________________________________________________________________
void TAxis3D::Copy(TObject &obj) const
{
   // Copy axis3d

   TNamed::Copy(obj);
   for (Int_t i=0;i<2;i++) fAxis[i].Copy(((TAxis3D&)obj).fAxis[i]);
}


//______________________________________________________________________________
void TAxis3D::InitSet()
{
   // Initialization.

   fAxis[0].SetName("xaxis");
   fAxis[1].SetName("yaxis");
   fAxis[2].SetName("zaxis");

   fAxis[0].Set(1,0.,1.);
   fAxis[1].Set(1,0.,1.);
   fAxis[2].Set(1,0.,1.);
   UseCurrentStyle();
}


//______________________________________________________________________________
void TAxis3D::Browse(TBrowser *b)
{
   // Add all 3 axes to the TBrowser

   for (Int_t i=0;i<3;i++) b->Add(&fAxis[i],fAxis[i].GetTitle());
}


//______________________________________________________________________________
Int_t TAxis3D::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a line.

   Int_t dist = 9;
   for (int i=0;i<3;i++) {
      Int_t axDist = fAxis[i].DistancetoPrimitive(px,py);
      if (dist > axDist) { dist = axDist; fSelected = &fAxis[i]; }
   }
   if (fZoomMode)
      return 0;
   else
      return dist;
}


//______________________________________________________________________________
void TAxis3D::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
   // Execute action corresponding to one event.
   //
   // This member function is called when an axis is clicked with the locator

   if (!gPad) return;

   if (fSelected) fSelected->ExecuteEvent(event,px,py);

   // Execute action corresponding to the mouse event

   static Double_t x0, y0, x1, y1;

   static Int_t pxold, pyold;
   static Int_t px0, py0;
   static Int_t linedrawn;

   if (!fZoomMode) return;

   // something to zoom ?

   gPad->SetCursor(kCross);

   switch (event) {

   case kButton1Down:
      gVirtualX->SetLineColor(-1);
      gPad->TAttLine::Modify();  //Change line attributes only if necessary
      ((TPad *)gPad)->AbsPixeltoXY(px,py,x0,y0);
      px0   = px; py0   = py;
      pxold = px; pyold = py;
      linedrawn = 0;
      break;

   case kButton1Motion:
      if (linedrawn) gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
      pxold = px;
      pyold = py;
      linedrawn = 1;
      gVirtualX->DrawBox(px0, py0, pxold, pyold, TVirtualX::kHollow);
      break;

   case kButton1Up: {
      Int_t i;
      gPad->SetDoubleBuffer(1);
      gVirtualX->SetDrawMode(TVirtualX::kCopy); // set drawing mode back to normal (copy) mode
      TView *view = gPad->GetView();
      if (!view) break;                       // no 3D view yet

      Double_t min[3],max[3],viewCenter[3],viewCenterNDC[3];

      view->GetRange(min,max);
      for (i =0; i<3;i++) viewCenter[i] = (max[i]+min[i])/2;
      view->WCtoNDC(viewCenter,viewCenterNDC);
      // Define the center
      Double_t center[3],pointNDC[3],size[3],oldSize[3];
      ((TPad *)gPad)->AbsPixeltoXY(px,py,x1,y1);
      pointNDC[0] = (x0+x1)/2; pointNDC[1] = (y0+y1)/2;
      pointNDC[2] = viewCenterNDC[2];
      view->NDCtoWC(pointNDC, center);

      for (i =0; i<3;i++) oldSize[i] = size[i]= (max[i]-min[i])/2;

      // If there was a small motion, move the center only, do not change a scale
      if (TMath::Abs(px-px0)+TMath::Abs(py - py0) > 4 ) {
         Double_t newEdge[3];
         for (i =0; i<3;i++) size[i] = -1;

         pointNDC[0] = x0; pointNDC[1] = y0;

         view->NDCtoWC(pointNDC, newEdge);
         for (i =0; i<3;i++) {
            Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
            if ( newSize/oldSize[i] > 0.002)
               size[i] = TMath::Max(size[i], newSize);
            else
               size[i] = oldSize[i];
         }

         pointNDC[0] = x1; pointNDC[1] = y1;

         view->NDCtoWC(pointNDC, newEdge);
         for (i =0; i<3;i++) {
            Double_t newSize = TMath::Abs(newEdge[i]-center[i]);
            if ( newSize/oldSize[i] > 0.002)
               size[i] = TMath::Max(size[i], newSize);
            else
               size[i] = oldSize[i];
         }
#if 0
         if (fZooms == kMAXZOOMS) fZoom = 0;
         fZooms++;
         memcpy(fZoomMin[fZooms],min,3*sizeof(Float_t));
         memcpy(fZoomMax[fZooms],max,3*sizeof(Float_t));
#endif
      }
      for (i =0; i<3;i++) {
         max[i] = center[i] + size[i];
         min[i] = center[i] - size[i];
      }
      view->SetRange(min,max);

      if(!fStickyZoom)SwitchZoom();
         gPad->Modified(kTRUE);
         gPad->Update();
         break;
      }
      default: break;
   }
}


//______________________________________________________________________________
char *TAxis3D::GetObjectInfo(Int_t , Int_t ) const
{
   //  Dummy method
   //  returns the const char * to "axis3d"

   return (char*)"axis3d";
}


//______________________________________________________________________________
void TAxis3D::Paint(Option_t *)
{
   // Paint axis over 3D view on the TPad

   TGaxis axis;
   PaintAxis(&axis, 90);
}


//______________________________________________________________________________
void TAxis3D::PaintAxis(TGaxis *axis, Float_t ang)
{
   // Draw the axis for TView object.
   //
   // The original idea belongs:
   //
   // void THistPainter::PaintLegoAxis(TGaxis *axis, Double_t ang)

   static Double_t epsil = 0.001;

   Double_t cosa, sina;
   Double_t bmin, bmax;
   Double_t r[24]       /* was [3][8] */;
   Int_t ndiv, i;
   Double_t x1[3], x2[3], y1[3], y2[3], z1[3], z2[3], av[24]  /*  was [3][8] */;
   char chopax[10];
   Int_t ix1, ix2, iy1, iy2, iz1, iz2;
   Double_t rad;

   TView *view = gPad->GetView();
   if (!view) {
      Error("PaintAxis", "no TView in current pad");
      return;
   }

   rad  = TMath::ATan(1.) * 4. / 180.;
   cosa = TMath::Cos(ang*rad);
   sina = TMath::Sin(ang*rad);

   view->AxisVertex(ang, av, ix1, ix2, iy1, iy2, iz1, iz2);
   for (i = 1; i <= 8; ++i) {
      r[i*3 - 3] = av[i*3 - 3] + av[i*3 - 2]*cosa;
      r[i*3 - 2] = av[i*3 - 2]*sina;
      r[i*3 - 1] = av[i*3 - 1];
   }

   view->WCtoNDC(&r[ix1*3 - 3], x1);
   view->WCtoNDC(&r[ix2*3 - 3], x2);
   view->WCtoNDC(&r[iy1*3 - 3], y1);
   view->WCtoNDC(&r[iy2*3 - 3], y2);
   view->WCtoNDC(&r[iz1*3 - 3], z1);
   view->WCtoNDC(&r[iz2*3 - 3], z2);

   view->SetAxisNDC(x1, x2, y1, y2, z1, z2);

   Double_t *rmin = view->GetRmin();
   Double_t *rmax = view->GetRmax();

   axis->SetLineWidth(1);

   for (i=0;i<3;i++) {

      // X axis drawing
      Double_t ax[2], ay[2];
      Bool_t logAx = kFALSE;
      memset(chopax,0,sizeof(chopax));
      switch (i) {
         case 0 :
            ax[0] = x1[0]; ax[1] = x2[0];
            ay[0] = x1[1]; ay[1] = x2[1];
            logAx = gPad->GetLogx();
            break;
         case 1 :
            if (TMath::Abs(y1[0] - y2[0]) < epsil)  y2[0] = y1[0];
            ax[0] = y1[0]; ax[1] = y2[0];
            ay[0] = y1[1]; ay[1] = y2[1];
            logAx = gPad->GetLogy();
            break;
         case 2 :
            ax[0] = z1[0]; ax[1] = z2[0];
            ay[0] = z1[1]; ay[1] = z2[1];
            strlcpy(chopax, "SDH+=",10);
            logAx = gPad->GetLogz();
            break;
         default:
            assert(0);
            continue;
      };

      // If the axis is too short - skip it
      if ( ( TMath::Abs(ax[0] - ax[1]) + TMath::Abs(ay[0] - ay[1]))  < epsil  ) continue;

      if (i != 2 ) {
         if (ax[0] > ax[1]) strlcpy(chopax, "SDHV=+",10);
         else               strlcpy(chopax, "SDHV=-",10);
      }

      if (i==1 && (TMath::Abs(z1[0] - z2[0]) + TMath::Abs(z1[1] - z2[1])) < epsil)
         strlcpy(chopax, "SDH+=",10);

      // Initialize the axis options
      if (logAx) {
         strlcat(chopax,"G",10);
         bmin = TMath::Power(10, rmin[i]);
         bmax = TMath::Power(10, rmax[i]);
      } else {
         bmin = rmin[i];
         bmax = rmax[i];
      }

      axis->SetLineColor(  fAxis[i].GetAxisColor());
      axis->SetTextFont(   fAxis[i].GetTitleFont());
      axis->SetTextColor(  fAxis[i].GetTitleColor());
      axis->SetTickSize(   fAxis[i].GetTickLength());
      axis->SetLabelColor( fAxis[i].GetLabelColor());
      axis->SetLabelFont(  fAxis[i].GetLabelFont());
      axis->SetLabelOffset(fAxis[i].GetLabelOffset()+fAxis[i].GetTickLength());
      axis->SetLabelSize(  fAxis[i].GetLabelSize());
      axis->SetTitle(      fAxis[i].GetTitle());
      axis->SetTitleOffset(fAxis[i].GetTitleOffset());
      axis->SetTitleSize(  fAxis[i].GetTitleSize());
      enum { kCenterTitle = BIT(12) }; // to be removed with the last version of ROOT
      axis->SetBit(kCenterTitle, fAxis[i].TestBit(kCenterTitle));

      //*-*-    Initialize the number of divisions. If the
      //*-*-    number of divisions is negative, option 'N' is required.
      ndiv = fAxis[i].GetNdivisions();
      if (ndiv < 0) {
         ndiv = -ndiv;
         chopax[6] = 'N';
      }

      // Option time display is required ?
      if (fAxis[i].GetTimeDisplay()) {
         strlcat(chopax,"t",10);
         if (strlen(fAxis[i].GetTimeFormatOnly()) == 0) {
            axis->SetTimeFormat(fAxis[i].ChooseTimeFormat(bmax-bmin));
         } else {
            axis->SetTimeFormat(fAxis[i].GetTimeFormat());
         }
      }
      axis->SetOption(chopax);
      axis->PaintAxis(ax[0], ay[0], ax[1], ay[1], bmin, bmax, ndiv, chopax);
   }
}


//______________________________________________________________________________
Double_t *TAxis3D::PixeltoXYZ(Double_t px, Double_t py, Double_t *point3D, TView *view)
{
   // Convert "screen pixel" coordinates to some center of 3D WC coordinate
   // if view and gPad present

   Double_t *thisPoint = 0;
   if (!view && gPad) view = gPad->GetView();
   if (view) {
      Double_t x[3] = {px,py,0.5}; // ((TPad *)thisPad)->AbsPixeltoXY(px,py,x[0],x[1]);
      Double_t min[3], max[3];
      view->GetRange(min,max);
      Int_t i;
      for (i =0; i<3;i++) min[i] = (max[i]+min[i])/2;
      view->WCtoNDC(min,max);
      min[0] = x[0]; min[1] = x[1];
      min[2] = max[2];
      view->NDCtoWC(min, x);
      for (i=0;i<3;i++) point3D[i] = x[i];
      thisPoint = point3D;
   }
   return thisPoint;
}


//______________________________________________________________________________
void TAxis3D::SavePrimitive(std::ostream &out, Option_t * /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   fAxis[0].SaveAttributes(out,GetName(),"->GetXaxis()");
   fAxis[1].SaveAttributes(out,GetName(),"->GetYaxis()");
   fAxis[2].SaveAttributes(out,GetName(),"->GetZaxis()");
}


//______________________________________________________________________________
void TAxis3D::UseCurrentStyle()
{
   // Replace current attributes by current style.

   if (gStyle->IsReading()) {
      fAxis[0].ResetAttAxis("X");
      fAxis[1].ResetAttAxis("Y");
      fAxis[2].ResetAttAxis("Z");

      fAxis[0].SetTitle("x");
      fAxis[0].SetLabelColor(kRed);   fAxis[0].SetAxisColor(kRed);
      fAxis[1].SetLabelColor(kGreen); fAxis[1].SetAxisColor(kGreen);
      fAxis[2].SetLabelColor(kBlue);  fAxis[2].SetAxisColor(kBlue);
   } else {
      gStyle->SetNdivisions (fAxis[0].GetNdivisions(), "x");
      gStyle->SetAxisColor  (fAxis[0].GetAxisColor(),  "x");
      gStyle->SetLabelColor (fAxis[0].GetLabelColor(), "x");
      gStyle->SetLabelFont  (fAxis[0].GetLabelFont(),  "x");
      gStyle->SetLabelOffset(fAxis[0].GetLabelOffset(),"x");
      gStyle->SetLabelSize  (fAxis[0].GetLabelSize(),  "x");
      gStyle->SetTickLength (fAxis[0].GetTickLength(), "x");
      gStyle->SetTitleOffset(fAxis[0].GetTitleOffset(),"x");
      gStyle->SetTitleSize  (fAxis[0].GetTitleSize(),  "x");
      gStyle->SetTitleColor (fAxis[0].GetTitleColor(), "x");
      gStyle->SetTitleFont  (fAxis[0].GetTitleFont(),  "x");

      gStyle->SetNdivisions (fAxis[1].GetNdivisions(), "y");
      gStyle->SetAxisColor  (fAxis[1].GetAxisColor(),  "y");
      gStyle->SetLabelColor (fAxis[1].GetLabelColor(), "y");
      gStyle->SetLabelFont  (fAxis[1].GetLabelFont(),  "y");
      gStyle->SetLabelOffset(fAxis[1].GetLabelOffset(),"y");
      gStyle->SetLabelSize  (fAxis[1].GetLabelSize(),  "y");
      gStyle->SetTickLength (fAxis[1].GetTickLength(), "y");
      gStyle->SetTitleOffset(fAxis[1].GetTitleOffset(),"y");
      gStyle->SetTitleSize  (fAxis[1].GetTitleSize(),  "y");
      gStyle->SetTitleColor (fAxis[1].GetTitleColor(), "y");
      gStyle->SetTitleFont  (fAxis[1].GetTitleFont(),  "y");

      gStyle->SetNdivisions (fAxis[2].GetNdivisions(), "z");
      gStyle->SetAxisColor  (fAxis[2].GetAxisColor(),  "z");
      gStyle->SetLabelColor (fAxis[2].GetLabelColor(), "z");
      gStyle->SetLabelFont  (fAxis[2].GetLabelFont(),  "z");
      gStyle->SetLabelOffset(fAxis[2].GetLabelOffset(),"z");
      gStyle->SetLabelSize  (fAxis[2].GetLabelSize(),  "z");
      gStyle->SetTickLength (fAxis[2].GetTickLength(), "z");
      gStyle->SetTitleOffset(fAxis[2].GetTitleOffset(),"z");
      gStyle->SetTitleSize  (fAxis[2].GetTitleSize(),  "z");
      gStyle->SetTitleColor (fAxis[2].GetTitleColor(), "z");
      gStyle->SetTitleFont  (fAxis[2].GetTitleFont(),  "z");
   }
}


//______________________________________________________________________________
Int_t TAxis3D::AxisChoice( Option_t *axis) const
{
   // Return the axis index by its name

   char achoice = toupper(axis[0]);
   if (achoice == 'X') return 0;
   if (achoice == 'Y') return 1;
   if (achoice == 'Z') return 2;
   return -1;
}


//______________________________________________________________________________
Int_t TAxis3D::GetNdivisions( Option_t *axis) const
{
   // Get number of divisions.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetNdivisions();
}


//______________________________________________________________________________
Color_t TAxis3D::GetAxisColor( Option_t *axis) const
{
   // Get axis color.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetAxisColor();
}


//______________________________________________________________________________
Color_t TAxis3D::GetLabelColor( Option_t *axis) const
{
   // Get label color.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetLabelColor();
}


//______________________________________________________________________________
Style_t TAxis3D::GetLabelFont( Option_t *axis) const
{
   // Get label font.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetLabelFont();
}


//______________________________________________________________________________
Float_t TAxis3D::GetLabelOffset( Option_t *axis) const
{
   // Get label offset.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetLabelOffset();
}


//______________________________________________________________________________
Float_t TAxis3D::GetLabelSize( Option_t *axis) const
{
   // Get label size.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetLabelSize();
}


//______________________________________________________________________________
Float_t TAxis3D::GetTickLength( Option_t *axis) const
{
   // Get tick mark length.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetTickLength();
}


//______________________________________________________________________________
Float_t TAxis3D::GetTitleOffset( Option_t *axis) const
{
   // Get title offset.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return 0;
   return fAxis[ax].GetTitleOffset();
}


//______________________________________________________________________________
#define AXISCHOICE                \
   Int_t i = AxisChoice(axis);    \
   Int_t nax = 1;                 \
   if (i == -1) { i = 0; nax = 3;}\
   for (Int_t ax=i;ax<nax+i;ax++)


//______________________________________________________________________________
void TAxis3D::SetNdivisions(Int_t n, Option_t *axis)
{
   // Set number of divisions.

   AXISCHOICE {fAxis[ax].SetNdivisions(n);}
}


//______________________________________________________________________________
void TAxis3D::SetAxisColor(Color_t color, Option_t *axis)
{
   // Set axis color.

   AXISCHOICE {fAxis[ax].SetAxisColor(color);}
}


//______________________________________________________________________________
void TAxis3D::SetAxisRange(Double_t xmin, Double_t xmax, Option_t *axis)
{
   // Set axis range.

   Int_t ax = AxisChoice(axis);
   if (ax < 0) return;
   TAxis *theAxis = &fAxis[ax];
   Int_t bin1 = theAxis->FindBin(xmin);
   Int_t bin2 = theAxis->FindBin(xmax);
   theAxis->SetRange(bin1, bin2);
}


//______________________________________________________________________________
void TAxis3D::SetLabelColor(Color_t color, Option_t *axis)
{
   // Set label color.

   AXISCHOICE { fAxis[ax].SetLabelColor(color); }
}


//______________________________________________________________________________
void TAxis3D::SetLabelFont(Style_t font, Option_t *axis)
{
   // Set label font.

   AXISCHOICE { fAxis[ax].SetLabelFont(font); }
}


//______________________________________________________________________________
void TAxis3D::SetLabelOffset(Float_t offset, Option_t *axis)
{
   // Set label offset.

   AXISCHOICE { fAxis[ax].SetLabelOffset(offset); }
}


//______________________________________________________________________________
void TAxis3D::SetLabelSize(Float_t size, Option_t *axis)
{
   // Set label size.

   AXISCHOICE { fAxis[ax].SetLabelSize(size); }
}


//______________________________________________________________________________
void TAxis3D::SetTickLength(Float_t length, Option_t *axis)
{
   // Set tick mark length.

   AXISCHOICE { fAxis[ax].SetTickLength(length); }
}


//______________________________________________________________________________
void TAxis3D::SetTitleOffset(Float_t offset, Option_t *axis)
{
   // Set title offset.

   AXISCHOICE { fAxis[ax].SetTitleOffset(offset); }
}
#undef AXISCHOICE


//______________________________________________________________________________
TAxis3D *TAxis3D::GetPadAxis(TVirtualPad *pad)
{
   // Returns the "pad" Axis3D object pointer if any.

   TObject *obj = 0;
   TVirtualPad *thisPad=pad;
   if (!thisPad) thisPad = gPad;
   if (thisPad) {
      // Find axis in the current thisPad
      obj = thisPad->FindObject(TAxis3D::fgRulerName);
      if (!(obj && obj->InheritsFrom(Class()->GetName()))) obj = 0;
   }
   return (TAxis3D *)obj;
}


//______________________________________________________________________________
TAxis3D *TAxis3D::ToggleRulers(TVirtualPad *pad)
{
   // Turn ON / OFF the "Ruler", TAxis3D object attached
   // to the current pad

   TAxis3D *ax = 0;
   TVirtualPad *thisPad=pad;
   if (!thisPad) thisPad = gPad;
   if (thisPad && thisPad->GetView() ) {
      TAxis3D *a =  GetPadAxis(pad);
      if (a)  delete a;
      else {
         ax = new TAxis3D;
         ax->SetBit(kCanDelete);
         ax->Draw();
      }
      thisPad->Modified();
      thisPad->Update();
   }
   return ax;
}


//______________________________________________________________________________
TAxis3D *TAxis3D::ToggleZoom(TVirtualPad *pad)
{
   // Turn ON / OFF the "Ruler" and "zoom mode" of the TAxis3D object attached
   // to the current pad (if pad = 0; gPad is used "by default")
   //
   // User is given a chance to either:
   //  1.  move the center of the 3D scene at the cursor position
   //  2.  zoom view with mouse "drugging" the bounder rectangle with "left" mouse
   //  3.  Change the axuce attributes via TContextMenu with "righ mouse button click"

   TAxis3D *ax = 0;
   TVirtualPad *thisPad=pad;
   if (!thisPad) thisPad = gPad;
   if (thisPad && thisPad->GetView()) {
      // Find axis in the current thisPad
      TList *l = thisPad->GetListOfPrimitives();
      TObject *o = l->FindObject(TAxis3D::fgRulerName);
      if (o && o->InheritsFrom(Class()->GetName())) { // Find axis
         if (o != l->Last()) { // make sure the TAxis3D is the last object of the Pad.
            l->Remove(o);
            l->AddLast(o);
         }
         ax = (TAxis3D *)o;
      } else { // There is no
         ax = new TAxis3D;
         ax->SetBit(kCanDelete);
         ax->Draw();
      }
      ax->SwitchZoom();
   }
   return ax;
}
 TAxis3D.cxx:1
 TAxis3D.cxx:2
 TAxis3D.cxx:3
 TAxis3D.cxx:4
 TAxis3D.cxx:5
 TAxis3D.cxx:6
 TAxis3D.cxx:7
 TAxis3D.cxx:8
 TAxis3D.cxx:9
 TAxis3D.cxx:10
 TAxis3D.cxx:11
 TAxis3D.cxx:12
 TAxis3D.cxx:13
 TAxis3D.cxx:14
 TAxis3D.cxx:15
 TAxis3D.cxx:16
 TAxis3D.cxx:17
 TAxis3D.cxx:18
 TAxis3D.cxx:19
 TAxis3D.cxx:20
 TAxis3D.cxx:21
 TAxis3D.cxx:22
 TAxis3D.cxx:23
 TAxis3D.cxx:24
 TAxis3D.cxx:25
 TAxis3D.cxx:26
 TAxis3D.cxx:27
 TAxis3D.cxx:28
 TAxis3D.cxx:29
 TAxis3D.cxx:30
 TAxis3D.cxx:31
 TAxis3D.cxx:32
 TAxis3D.cxx:33
 TAxis3D.cxx:34
 TAxis3D.cxx:35
 TAxis3D.cxx:36
 TAxis3D.cxx:37
 TAxis3D.cxx:38
 TAxis3D.cxx:39
 TAxis3D.cxx:40
 TAxis3D.cxx:41
 TAxis3D.cxx:42
 TAxis3D.cxx:43
 TAxis3D.cxx:44
 TAxis3D.cxx:45
 TAxis3D.cxx:46
 TAxis3D.cxx:47
 TAxis3D.cxx:48
 TAxis3D.cxx:49
 TAxis3D.cxx:50
 TAxis3D.cxx:51
 TAxis3D.cxx:52
 TAxis3D.cxx:53
 TAxis3D.cxx:54
 TAxis3D.cxx:55
 TAxis3D.cxx:56
 TAxis3D.cxx:57
 TAxis3D.cxx:58
 TAxis3D.cxx:59
 TAxis3D.cxx:60
 TAxis3D.cxx:61
 TAxis3D.cxx:62
 TAxis3D.cxx:63
 TAxis3D.cxx:64
 TAxis3D.cxx:65
 TAxis3D.cxx:66
 TAxis3D.cxx:67
 TAxis3D.cxx:68
 TAxis3D.cxx:69
 TAxis3D.cxx:70
 TAxis3D.cxx:71
 TAxis3D.cxx:72
 TAxis3D.cxx:73
 TAxis3D.cxx:74
 TAxis3D.cxx:75
 TAxis3D.cxx:76
 TAxis3D.cxx:77
 TAxis3D.cxx:78
 TAxis3D.cxx:79
 TAxis3D.cxx:80
 TAxis3D.cxx:81
 TAxis3D.cxx:82
 TAxis3D.cxx:83
 TAxis3D.cxx:84
 TAxis3D.cxx:85
 TAxis3D.cxx:86
 TAxis3D.cxx:87
 TAxis3D.cxx:88
 TAxis3D.cxx:89
 TAxis3D.cxx:90
 TAxis3D.cxx:91
 TAxis3D.cxx:92
 TAxis3D.cxx:93
 TAxis3D.cxx:94
 TAxis3D.cxx:95
 TAxis3D.cxx:96
 TAxis3D.cxx:97
 TAxis3D.cxx:98
 TAxis3D.cxx:99
 TAxis3D.cxx:100
 TAxis3D.cxx:101
 TAxis3D.cxx:102
 TAxis3D.cxx:103
 TAxis3D.cxx:104
 TAxis3D.cxx:105
 TAxis3D.cxx:106
 TAxis3D.cxx:107
 TAxis3D.cxx:108
 TAxis3D.cxx:109
 TAxis3D.cxx:110
 TAxis3D.cxx:111
 TAxis3D.cxx:112
 TAxis3D.cxx:113
 TAxis3D.cxx:114
 TAxis3D.cxx:115
 TAxis3D.cxx:116
 TAxis3D.cxx:117
 TAxis3D.cxx:118
 TAxis3D.cxx:119
 TAxis3D.cxx:120
 TAxis3D.cxx:121
 TAxis3D.cxx:122
 TAxis3D.cxx:123
 TAxis3D.cxx:124
 TAxis3D.cxx:125
 TAxis3D.cxx:126
 TAxis3D.cxx:127
 TAxis3D.cxx:128
 TAxis3D.cxx:129
 TAxis3D.cxx:130
 TAxis3D.cxx:131
 TAxis3D.cxx:132
 TAxis3D.cxx:133
 TAxis3D.cxx:134
 TAxis3D.cxx:135
 TAxis3D.cxx:136
 TAxis3D.cxx:137
 TAxis3D.cxx:138
 TAxis3D.cxx:139
 TAxis3D.cxx:140
 TAxis3D.cxx:141
 TAxis3D.cxx:142
 TAxis3D.cxx:143
 TAxis3D.cxx:144
 TAxis3D.cxx:145
 TAxis3D.cxx:146
 TAxis3D.cxx:147
 TAxis3D.cxx:148
 TAxis3D.cxx:149
 TAxis3D.cxx:150
 TAxis3D.cxx:151
 TAxis3D.cxx:152
 TAxis3D.cxx:153
 TAxis3D.cxx:154
 TAxis3D.cxx:155
 TAxis3D.cxx:156
 TAxis3D.cxx:157
 TAxis3D.cxx:158
 TAxis3D.cxx:159
 TAxis3D.cxx:160
 TAxis3D.cxx:161
 TAxis3D.cxx:162
 TAxis3D.cxx:163
 TAxis3D.cxx:164
 TAxis3D.cxx:165
 TAxis3D.cxx:166
 TAxis3D.cxx:167
 TAxis3D.cxx:168
 TAxis3D.cxx:169
 TAxis3D.cxx:170
 TAxis3D.cxx:171
 TAxis3D.cxx:172
 TAxis3D.cxx:173
 TAxis3D.cxx:174
 TAxis3D.cxx:175
 TAxis3D.cxx:176
 TAxis3D.cxx:177
 TAxis3D.cxx:178
 TAxis3D.cxx:179
 TAxis3D.cxx:180
 TAxis3D.cxx:181
 TAxis3D.cxx:182
 TAxis3D.cxx:183
 TAxis3D.cxx:184
 TAxis3D.cxx:185
 TAxis3D.cxx:186
 TAxis3D.cxx:187
 TAxis3D.cxx:188
 TAxis3D.cxx:189
 TAxis3D.cxx:190
 TAxis3D.cxx:191
 TAxis3D.cxx:192
 TAxis3D.cxx:193
 TAxis3D.cxx:194
 TAxis3D.cxx:195
 TAxis3D.cxx:196
 TAxis3D.cxx:197
 TAxis3D.cxx:198
 TAxis3D.cxx:199
 TAxis3D.cxx:200
 TAxis3D.cxx:201
 TAxis3D.cxx:202
 TAxis3D.cxx:203
 TAxis3D.cxx:204
 TAxis3D.cxx:205
 TAxis3D.cxx:206
 TAxis3D.cxx:207
 TAxis3D.cxx:208
 TAxis3D.cxx:209
 TAxis3D.cxx:210
 TAxis3D.cxx:211
 TAxis3D.cxx:212
 TAxis3D.cxx:213
 TAxis3D.cxx:214
 TAxis3D.cxx:215
 TAxis3D.cxx:216
 TAxis3D.cxx:217
 TAxis3D.cxx:218
 TAxis3D.cxx:219
 TAxis3D.cxx:220
 TAxis3D.cxx:221
 TAxis3D.cxx:222
 TAxis3D.cxx:223
 TAxis3D.cxx:224
 TAxis3D.cxx:225
 TAxis3D.cxx:226
 TAxis3D.cxx:227
 TAxis3D.cxx:228
 TAxis3D.cxx:229
 TAxis3D.cxx:230
 TAxis3D.cxx:231
 TAxis3D.cxx:232
 TAxis3D.cxx:233
 TAxis3D.cxx:234
 TAxis3D.cxx:235
 TAxis3D.cxx:236
 TAxis3D.cxx:237
 TAxis3D.cxx:238
 TAxis3D.cxx:239
 TAxis3D.cxx:240
 TAxis3D.cxx:241
 TAxis3D.cxx:242
 TAxis3D.cxx:243
 TAxis3D.cxx:244
 TAxis3D.cxx:245
 TAxis3D.cxx:246
 TAxis3D.cxx:247
 TAxis3D.cxx:248
 TAxis3D.cxx:249
 TAxis3D.cxx:250
 TAxis3D.cxx:251
 TAxis3D.cxx:252
 TAxis3D.cxx:253
 TAxis3D.cxx:254
 TAxis3D.cxx:255
 TAxis3D.cxx:256
 TAxis3D.cxx:257
 TAxis3D.cxx:258
 TAxis3D.cxx:259
 TAxis3D.cxx:260
 TAxis3D.cxx:261
 TAxis3D.cxx:262
 TAxis3D.cxx:263
 TAxis3D.cxx:264
 TAxis3D.cxx:265
 TAxis3D.cxx:266
 TAxis3D.cxx:267
 TAxis3D.cxx:268
 TAxis3D.cxx:269
 TAxis3D.cxx:270
 TAxis3D.cxx:271
 TAxis3D.cxx:272
 TAxis3D.cxx:273
 TAxis3D.cxx:274
 TAxis3D.cxx:275
 TAxis3D.cxx:276
 TAxis3D.cxx:277
 TAxis3D.cxx:278
 TAxis3D.cxx:279
 TAxis3D.cxx:280
 TAxis3D.cxx:281
 TAxis3D.cxx:282
 TAxis3D.cxx:283
 TAxis3D.cxx:284
 TAxis3D.cxx:285
 TAxis3D.cxx:286
 TAxis3D.cxx:287
 TAxis3D.cxx:288
 TAxis3D.cxx:289
 TAxis3D.cxx:290
 TAxis3D.cxx:291
 TAxis3D.cxx:292
 TAxis3D.cxx:293
 TAxis3D.cxx:294
 TAxis3D.cxx:295
 TAxis3D.cxx:296
 TAxis3D.cxx:297
 TAxis3D.cxx:298
 TAxis3D.cxx:299
 TAxis3D.cxx:300
 TAxis3D.cxx:301
 TAxis3D.cxx:302
 TAxis3D.cxx:303
 TAxis3D.cxx:304
 TAxis3D.cxx:305
 TAxis3D.cxx:306
 TAxis3D.cxx:307
 TAxis3D.cxx:308
 TAxis3D.cxx:309
 TAxis3D.cxx:310
 TAxis3D.cxx:311
 TAxis3D.cxx:312
 TAxis3D.cxx:313
 TAxis3D.cxx:314
 TAxis3D.cxx:315
 TAxis3D.cxx:316
 TAxis3D.cxx:317
 TAxis3D.cxx:318
 TAxis3D.cxx:319
 TAxis3D.cxx:320
 TAxis3D.cxx:321
 TAxis3D.cxx:322
 TAxis3D.cxx:323
 TAxis3D.cxx:324
 TAxis3D.cxx:325
 TAxis3D.cxx:326
 TAxis3D.cxx:327
 TAxis3D.cxx:328
 TAxis3D.cxx:329
 TAxis3D.cxx:330
 TAxis3D.cxx:331
 TAxis3D.cxx:332
 TAxis3D.cxx:333
 TAxis3D.cxx:334
 TAxis3D.cxx:335
 TAxis3D.cxx:336
 TAxis3D.cxx:337
 TAxis3D.cxx:338
 TAxis3D.cxx:339
 TAxis3D.cxx:340
 TAxis3D.cxx:341
 TAxis3D.cxx:342
 TAxis3D.cxx:343
 TAxis3D.cxx:344
 TAxis3D.cxx:345
 TAxis3D.cxx:346
 TAxis3D.cxx:347
 TAxis3D.cxx:348
 TAxis3D.cxx:349
 TAxis3D.cxx:350
 TAxis3D.cxx:351
 TAxis3D.cxx:352
 TAxis3D.cxx:353
 TAxis3D.cxx:354
 TAxis3D.cxx:355
 TAxis3D.cxx:356
 TAxis3D.cxx:357
 TAxis3D.cxx:358
 TAxis3D.cxx:359
 TAxis3D.cxx:360
 TAxis3D.cxx:361
 TAxis3D.cxx:362
 TAxis3D.cxx:363
 TAxis3D.cxx:364
 TAxis3D.cxx:365
 TAxis3D.cxx:366
 TAxis3D.cxx:367
 TAxis3D.cxx:368
 TAxis3D.cxx:369
 TAxis3D.cxx:370
 TAxis3D.cxx:371
 TAxis3D.cxx:372
 TAxis3D.cxx:373
 TAxis3D.cxx:374
 TAxis3D.cxx:375
 TAxis3D.cxx:376
 TAxis3D.cxx:377
 TAxis3D.cxx:378
 TAxis3D.cxx:379
 TAxis3D.cxx:380
 TAxis3D.cxx:381
 TAxis3D.cxx:382
 TAxis3D.cxx:383
 TAxis3D.cxx:384
 TAxis3D.cxx:385
 TAxis3D.cxx:386
 TAxis3D.cxx:387
 TAxis3D.cxx:388
 TAxis3D.cxx:389
 TAxis3D.cxx:390
 TAxis3D.cxx:391
 TAxis3D.cxx:392
 TAxis3D.cxx:393
 TAxis3D.cxx:394
 TAxis3D.cxx:395
 TAxis3D.cxx:396
 TAxis3D.cxx:397
 TAxis3D.cxx:398
 TAxis3D.cxx:399
 TAxis3D.cxx:400
 TAxis3D.cxx:401
 TAxis3D.cxx:402
 TAxis3D.cxx:403
 TAxis3D.cxx:404
 TAxis3D.cxx:405
 TAxis3D.cxx:406
 TAxis3D.cxx:407
 TAxis3D.cxx:408
 TAxis3D.cxx:409
 TAxis3D.cxx:410
 TAxis3D.cxx:411
 TAxis3D.cxx:412
 TAxis3D.cxx:413
 TAxis3D.cxx:414
 TAxis3D.cxx:415
 TAxis3D.cxx:416
 TAxis3D.cxx:417
 TAxis3D.cxx:418
 TAxis3D.cxx:419
 TAxis3D.cxx:420
 TAxis3D.cxx:421
 TAxis3D.cxx:422
 TAxis3D.cxx:423
 TAxis3D.cxx:424
 TAxis3D.cxx:425
 TAxis3D.cxx:426
 TAxis3D.cxx:427
 TAxis3D.cxx:428
 TAxis3D.cxx:429
 TAxis3D.cxx:430
 TAxis3D.cxx:431
 TAxis3D.cxx:432
 TAxis3D.cxx:433
 TAxis3D.cxx:434
 TAxis3D.cxx:435
 TAxis3D.cxx:436
 TAxis3D.cxx:437
 TAxis3D.cxx:438
 TAxis3D.cxx:439
 TAxis3D.cxx:440
 TAxis3D.cxx:441
 TAxis3D.cxx:442
 TAxis3D.cxx:443
 TAxis3D.cxx:444
 TAxis3D.cxx:445
 TAxis3D.cxx:446
 TAxis3D.cxx:447
 TAxis3D.cxx:448
 TAxis3D.cxx:449
 TAxis3D.cxx:450
 TAxis3D.cxx:451
 TAxis3D.cxx:452
 TAxis3D.cxx:453
 TAxis3D.cxx:454
 TAxis3D.cxx:455
 TAxis3D.cxx:456
 TAxis3D.cxx:457
 TAxis3D.cxx:458
 TAxis3D.cxx:459
 TAxis3D.cxx:460
 TAxis3D.cxx:461
 TAxis3D.cxx:462
 TAxis3D.cxx:463
 TAxis3D.cxx:464
 TAxis3D.cxx:465
 TAxis3D.cxx:466
 TAxis3D.cxx:467
 TAxis3D.cxx:468
 TAxis3D.cxx:469
 TAxis3D.cxx:470
 TAxis3D.cxx:471
 TAxis3D.cxx:472
 TAxis3D.cxx:473
 TAxis3D.cxx:474
 TAxis3D.cxx:475
 TAxis3D.cxx:476
 TAxis3D.cxx:477
 TAxis3D.cxx:478
 TAxis3D.cxx:479
 TAxis3D.cxx:480
 TAxis3D.cxx:481
 TAxis3D.cxx:482
 TAxis3D.cxx:483
 TAxis3D.cxx:484
 TAxis3D.cxx:485
 TAxis3D.cxx:486
 TAxis3D.cxx:487
 TAxis3D.cxx:488
 TAxis3D.cxx:489
 TAxis3D.cxx:490
 TAxis3D.cxx:491
 TAxis3D.cxx:492
 TAxis3D.cxx:493
 TAxis3D.cxx:494
 TAxis3D.cxx:495
 TAxis3D.cxx:496
 TAxis3D.cxx:497
 TAxis3D.cxx:498
 TAxis3D.cxx:499
 TAxis3D.cxx:500
 TAxis3D.cxx:501
 TAxis3D.cxx:502
 TAxis3D.cxx:503
 TAxis3D.cxx:504
 TAxis3D.cxx:505
 TAxis3D.cxx:506
 TAxis3D.cxx:507
 TAxis3D.cxx:508
 TAxis3D.cxx:509
 TAxis3D.cxx:510
 TAxis3D.cxx:511
 TAxis3D.cxx:512
 TAxis3D.cxx:513
 TAxis3D.cxx:514
 TAxis3D.cxx:515
 TAxis3D.cxx:516
 TAxis3D.cxx:517
 TAxis3D.cxx:518
 TAxis3D.cxx:519
 TAxis3D.cxx:520
 TAxis3D.cxx:521
 TAxis3D.cxx:522
 TAxis3D.cxx:523
 TAxis3D.cxx:524
 TAxis3D.cxx:525
 TAxis3D.cxx:526
 TAxis3D.cxx:527
 TAxis3D.cxx:528
 TAxis3D.cxx:529
 TAxis3D.cxx:530
 TAxis3D.cxx:531
 TAxis3D.cxx:532
 TAxis3D.cxx:533
 TAxis3D.cxx:534
 TAxis3D.cxx:535
 TAxis3D.cxx:536
 TAxis3D.cxx:537
 TAxis3D.cxx:538
 TAxis3D.cxx:539
 TAxis3D.cxx:540
 TAxis3D.cxx:541
 TAxis3D.cxx:542
 TAxis3D.cxx:543
 TAxis3D.cxx:544
 TAxis3D.cxx:545
 TAxis3D.cxx:546
 TAxis3D.cxx:547
 TAxis3D.cxx:548
 TAxis3D.cxx:549
 TAxis3D.cxx:550
 TAxis3D.cxx:551
 TAxis3D.cxx:552
 TAxis3D.cxx:553
 TAxis3D.cxx:554
 TAxis3D.cxx:555
 TAxis3D.cxx:556
 TAxis3D.cxx:557
 TAxis3D.cxx:558
 TAxis3D.cxx:559
 TAxis3D.cxx:560
 TAxis3D.cxx:561
 TAxis3D.cxx:562
 TAxis3D.cxx:563
 TAxis3D.cxx:564
 TAxis3D.cxx:565
 TAxis3D.cxx:566
 TAxis3D.cxx:567
 TAxis3D.cxx:568
 TAxis3D.cxx:569
 TAxis3D.cxx:570
 TAxis3D.cxx:571
 TAxis3D.cxx:572
 TAxis3D.cxx:573
 TAxis3D.cxx:574
 TAxis3D.cxx:575
 TAxis3D.cxx:576
 TAxis3D.cxx:577
 TAxis3D.cxx:578
 TAxis3D.cxx:579
 TAxis3D.cxx:580
 TAxis3D.cxx:581
 TAxis3D.cxx:582
 TAxis3D.cxx:583
 TAxis3D.cxx:584
 TAxis3D.cxx:585
 TAxis3D.cxx:586
 TAxis3D.cxx:587
 TAxis3D.cxx:588
 TAxis3D.cxx:589
 TAxis3D.cxx:590
 TAxis3D.cxx:591
 TAxis3D.cxx:592
 TAxis3D.cxx:593
 TAxis3D.cxx:594
 TAxis3D.cxx:595
 TAxis3D.cxx:596
 TAxis3D.cxx:597
 TAxis3D.cxx:598
 TAxis3D.cxx:599
 TAxis3D.cxx:600
 TAxis3D.cxx:601
 TAxis3D.cxx:602
 TAxis3D.cxx:603
 TAxis3D.cxx:604
 TAxis3D.cxx:605
 TAxis3D.cxx:606
 TAxis3D.cxx:607
 TAxis3D.cxx:608
 TAxis3D.cxx:609
 TAxis3D.cxx:610
 TAxis3D.cxx:611
 TAxis3D.cxx:612
 TAxis3D.cxx:613
 TAxis3D.cxx:614
 TAxis3D.cxx:615
 TAxis3D.cxx:616
 TAxis3D.cxx:617
 TAxis3D.cxx:618
 TAxis3D.cxx:619
 TAxis3D.cxx:620
 TAxis3D.cxx:621
 TAxis3D.cxx:622
 TAxis3D.cxx:623
 TAxis3D.cxx:624
 TAxis3D.cxx:625
 TAxis3D.cxx:626
 TAxis3D.cxx:627
 TAxis3D.cxx:628
 TAxis3D.cxx:629
 TAxis3D.cxx:630
 TAxis3D.cxx:631
 TAxis3D.cxx:632
 TAxis3D.cxx:633
 TAxis3D.cxx:634
 TAxis3D.cxx:635
 TAxis3D.cxx:636
 TAxis3D.cxx:637
 TAxis3D.cxx:638
 TAxis3D.cxx:639
 TAxis3D.cxx:640
 TAxis3D.cxx:641
 TAxis3D.cxx:642
 TAxis3D.cxx:643
 TAxis3D.cxx:644
 TAxis3D.cxx:645
 TAxis3D.cxx:646
 TAxis3D.cxx:647
 TAxis3D.cxx:648
 TAxis3D.cxx:649
 TAxis3D.cxx:650
 TAxis3D.cxx:651
 TAxis3D.cxx:652
 TAxis3D.cxx:653
 TAxis3D.cxx:654
 TAxis3D.cxx:655
 TAxis3D.cxx:656
 TAxis3D.cxx:657
 TAxis3D.cxx:658
 TAxis3D.cxx:659
 TAxis3D.cxx:660
 TAxis3D.cxx:661
 TAxis3D.cxx:662
 TAxis3D.cxx:663
 TAxis3D.cxx:664
 TAxis3D.cxx:665
 TAxis3D.cxx:666
 TAxis3D.cxx:667
 TAxis3D.cxx:668
 TAxis3D.cxx:669
 TAxis3D.cxx:670
 TAxis3D.cxx:671
 TAxis3D.cxx:672
 TAxis3D.cxx:673
 TAxis3D.cxx:674
 TAxis3D.cxx:675
 TAxis3D.cxx:676
 TAxis3D.cxx:677
 TAxis3D.cxx:678
 TAxis3D.cxx:679
 TAxis3D.cxx:680
 TAxis3D.cxx:681
 TAxis3D.cxx:682
 TAxis3D.cxx:683
 TAxis3D.cxx:684
 TAxis3D.cxx:685
 TAxis3D.cxx:686
 TAxis3D.cxx:687
 TAxis3D.cxx:688
 TAxis3D.cxx:689
 TAxis3D.cxx:690
 TAxis3D.cxx:691
 TAxis3D.cxx:692
 TAxis3D.cxx:693
 TAxis3D.cxx:694
 TAxis3D.cxx:695
 TAxis3D.cxx:696
 TAxis3D.cxx:697
 TAxis3D.cxx:698
 TAxis3D.cxx:699
 TAxis3D.cxx:700
 TAxis3D.cxx:701
 TAxis3D.cxx:702
 TAxis3D.cxx:703
 TAxis3D.cxx:704
 TAxis3D.cxx:705
 TAxis3D.cxx:706
 TAxis3D.cxx:707
 TAxis3D.cxx:708
 TAxis3D.cxx:709
 TAxis3D.cxx:710
 TAxis3D.cxx:711
 TAxis3D.cxx:712
 TAxis3D.cxx:713
 TAxis3D.cxx:714
 TAxis3D.cxx:715
 TAxis3D.cxx:716
 TAxis3D.cxx:717
 TAxis3D.cxx:718
 TAxis3D.cxx:719
 TAxis3D.cxx:720
 TAxis3D.cxx:721
 TAxis3D.cxx:722
 TAxis3D.cxx:723
 TAxis3D.cxx:724
 TAxis3D.cxx:725
 TAxis3D.cxx:726
 TAxis3D.cxx:727
 TAxis3D.cxx:728
 TAxis3D.cxx:729
 TAxis3D.cxx:730
 TAxis3D.cxx:731
 TAxis3D.cxx:732
 TAxis3D.cxx:733
 TAxis3D.cxx:734
 TAxis3D.cxx:735
 TAxis3D.cxx:736
 TAxis3D.cxx:737
 TAxis3D.cxx:738
 TAxis3D.cxx:739
 TAxis3D.cxx:740
 TAxis3D.cxx:741
 TAxis3D.cxx:742
 TAxis3D.cxx:743
 TAxis3D.cxx:744
 TAxis3D.cxx:745
 TAxis3D.cxx:746
 TAxis3D.cxx:747
 TAxis3D.cxx:748
 TAxis3D.cxx:749
 TAxis3D.cxx:750
 TAxis3D.cxx:751
 TAxis3D.cxx:752
 TAxis3D.cxx:753
 TAxis3D.cxx:754
 TAxis3D.cxx:755
 TAxis3D.cxx:756
 TAxis3D.cxx:757
 TAxis3D.cxx:758
 TAxis3D.cxx:759
 TAxis3D.cxx:760
 TAxis3D.cxx:761
 TAxis3D.cxx:762
 TAxis3D.cxx:763
 TAxis3D.cxx:764
 TAxis3D.cxx:765
 TAxis3D.cxx:766
 TAxis3D.cxx:767
 TAxis3D.cxx:768
 TAxis3D.cxx:769
 TAxis3D.cxx:770
 TAxis3D.cxx:771
 TAxis3D.cxx:772
 TAxis3D.cxx:773
 TAxis3D.cxx:774
 TAxis3D.cxx:775
 TAxis3D.cxx:776
 TAxis3D.cxx:777
 TAxis3D.cxx:778
 TAxis3D.cxx:779
 TAxis3D.cxx:780
 TAxis3D.cxx:781
 TAxis3D.cxx:782
 TAxis3D.cxx:783
 TAxis3D.cxx:784
 TAxis3D.cxx:785
 TAxis3D.cxx:786
 TAxis3D.cxx:787
 TAxis3D.cxx:788
 TAxis3D.cxx:789
 TAxis3D.cxx:790
 TAxis3D.cxx:791
 TAxis3D.cxx:792
 TAxis3D.cxx:793
 TAxis3D.cxx:794
 TAxis3D.cxx:795
 TAxis3D.cxx:796
 TAxis3D.cxx:797
 TAxis3D.cxx:798
 TAxis3D.cxx:799
 TAxis3D.cxx:800
 TAxis3D.cxx:801
 TAxis3D.cxx:802
 TAxis3D.cxx:803
 TAxis3D.cxx:804
 TAxis3D.cxx:805
 TAxis3D.cxx:806
 TAxis3D.cxx:807
 TAxis3D.cxx:808
 TAxis3D.cxx:809
 TAxis3D.cxx:810
 TAxis3D.cxx:811
 TAxis3D.cxx:812
 TAxis3D.cxx:813