Index: /trunk/SophyaPI/PI/pi3ddrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2398)
+++ /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2399)
@@ -46,6 +46,15 @@
 //                double& teta, double& phi, double& psi, double& dax, double& day, double& co, double& dco)
 //	Renvoie la définition de la Vue-3D. Retourne "true " si définie par "Set3DView_Obs()"
-// void Set3DBox(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)
+// void Set3DBox(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax, -
+//               double scx=1., double scy=1., double scz=1.)
 //	Définition de la boite 3D.
+// void ComputeScaleFactor(double xmin, double xmax, double ymin, double ymax,
+//                         double zmin, double zmax, bool asxy, bool asz,
+//                         double& scy, double& scz)
+//	Calcul des facteurs d'echelles scy, scz
+//	Si asxy == true : Application d'un facteur d'échelle pour égaliser 
+//	le rapport d'aspect des deux axes X et Y
+//	Si asz == true : Application d'un facteur d'échelle pour égaliser 
+//	le rapport d'aspect de l'axe Z par rapport a XY.
 //
 // void Draw3DBoxe(PIGraphic3D* g3, double xx1, double xx2, double yy1, double yy2,  -
@@ -108,9 +117,29 @@
 /* --Methode-- */
 void PIDrawer3D::Set3DBox(double xmin, double xmax, double ymin, double ymax,
-			  double zmin, double zmax)
+			  double zmin, double zmax, double scx, double scy, double scz)
 {
   x3Min = xmin;  x3Max = xmax;
   y3Min = ymin;  y3Max = ymax;
   z3Min = zmin;  z3Max = zmax;
+  mScx = scx;  mScy = scy;  mScz = scz;
+}
+
+/* --Methode-- */
+void PIDrawer3D::ComputeScaleFactor(double xmin, double xmax, double ymin, double ymax,
+				    double zmin, double zmax, bool asxy, bool asz,
+				    double& scy, double& scz)
+{
+  scy = scz = 1.;
+  if (!asxy && !asz) return;
+  double scm=1.;
+  if ((ymax-ymin) <= 1.e-19)  ymax = ymin + 1.e-19;
+  if (asxy)  { 
+    scy = (xmax-xmin)/(ymax-ymin);
+    scm = xmax-xmin;
+    }
+  else scm =  ((xmax-xmin) > (ymax-ymin)) ? (xmax-xmin)  : (ymax-ymin);
+  if ((zmax-zmin) <= 1.e-19)  zmax = zmin + 1.e-19;
+  if (asz) scz = scm/(zmax-zmin);
+  
 }
 
@@ -141,5 +170,6 @@
 #endif
   Draw3DBoxe(g3, XMin3(), XMax3(), YMin3(), YMax3(), ZMin3(), ZMax3(),
-                 XMin3(), XMax3(), YMin3(), YMax3(), ZMin3(), ZMax3());  
+	     XMin3()/mScx, XMax3()/mScx, YMin3()/mScy, YMax3()/mScy, 
+	     ZMin3()/mScz, ZMax3()/mScz);  
 }
 
Index: /trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2398)
+++ /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2399)
@@ -30,5 +30,13 @@
 
   virtual void		Set3DBox(double xmin, double xmax, double ymin, double ymax,
-				 double zmin, double zmax); 
+				 double zmin, double zmax,
+				 double scx=1., double scy=1., double scz=1.);
+  inline  void		Copy3DBox(PIDrawer3D& dr3) {
+    Set3DBox(dr3.XMin3(), dr3.XMax3(), dr3.YMin3(), dr3.YMax3(), 
+	     dr3.ZMin3(), dr3.ZMax3(), dr3.ScaleX(), dr3.ScaleY(), dr3.ScaleZ());  }
+
+  virtual void	        ComputeScaleFactor(double xmin, double xmax, double ymin, double ymax,
+					   double zmin, double zmax, bool asxy, bool asz,
+					   double& scy, double& scz);
   
   virtual PIGraphicUC*	SetDrwWdg(PIBaseWdgGen* drw, int x0, int y0, int dx, int dy, PIGraphicGen* g);
@@ -39,4 +47,5 @@
                                                     double yl1, double yl2, double zl1, double zl2);
 
+  // Cordonnees du cube 3D
   double XMin3() const {return x3Min;}
   double XMax3() const {return x3Max;}
@@ -45,4 +54,8 @@
   double ZMin3() const {return z3Min;}
   double ZMax3() const {return z3Max;}
+  // Facteur d'echelle: Cube3D = Coord.User(3D)*Scale
+  double ScaleX() const {return mScx;}
+  double ScaleY() const {return mScy;}
+  double ScaleZ() const {return mScz;}
 
 protected :
@@ -56,4 +69,6 @@
   double y3Min, y3Max;  // Pour delimiter le cube 3D 
   double z3Min, z3Max;  // Pour delimiter le cube 3D 
+  double mScx, mScy, mScz;  // Facteur d'echelle entre coord. utilise et cube 3D
+                            // x/y/z-Cube3D = x/y/z-User * mScx/y/z 
 };
 
Index: /trunk/SophyaPI/PI/pi3dwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2398)
+++ /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2399)
@@ -70,9 +70,17 @@
 {  
   vfixed = false;
+  // On cree l'objet PIGraphic3D pour la gestion des vues 3D
+  mGr3d = new PIGraphic3D(mWGrC, 0, 0, sx, sy);
+
 //  SetDefaultDrawRectangle(0.12, 0.12, 0.88, 0.88, true);
   SetDefaultDrawRectangle(0., 0., 1., 1., true);
   mBDrw = new PIElDrawer3D;
-  mBDrw->SetLimits(0.12,0.88, 0.12,0.88, kAxeDirLtoR,kAxeDirDownUp);
-  AddDrawer(mBDrw, 0.12, 0.12, 0.88, 0.88, true, false, false);
+  //  mBDrw->SetLimits(0.12,0.88, 0.12,0.88, kAxeDirLtoR,kAxeDirDownUp);
+  //  AddDrawer(mBDrw, 0.12, 0.12, 0.88, 0.88, true, false, false);
+  mBDrw->SetLimits(0.,1.,0.,1.,kAxeDirLtoR,kAxeDirDownUp);
+  AddDrawer3D(mBDrw, false);
+  mBDrw->SetAxesFlags(kStdAxes);
+  vfixed = false; // Il faut laisser le premier Drawer3D fixer les limites et la vue 3D
+
   mPx = mPy = 0;
 
@@ -88,5 +96,4 @@
   ActivateButton(1);    
 
-  mGr3d = new PIGraphic3D(mWGrC, 0, 0, sx, sy);
   rOfg = false;
   axfg = true;
@@ -143,8 +150,12 @@
 {
   list<int>::iterator it = m3DrIl.begin();
+#if defined(CC_HAS_RTTI_SUPPORT)
+  while ( (it != m3DrIl.end()) && 
+	  (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)) != mBDrw) ) it++; 
   if (it == m3DrIl.end())  return;
-#if defined(CC_HAS_RTTI_SUPPORT)
   PIDrawer3D* dr3 = dynamic_cast<PIDrawer3D*>(GetDrawerId(*it));
 #else
+  while ( (it != m3DrIl.end()) && 
+	  ( (PIDrawer3D*)(GetDrawerId(*it)) != mBDrw) ) it++; 
   PIDrawer3D* dr3 = (PIDrawer3D*)(GetDrawerId(*it));
 #endif
@@ -156,4 +167,5 @@
   if (vobs) Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
   else Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  mBDrw->Copy3DBox(*dr3);
   Refresh();
 }
@@ -194,5 +206,5 @@
 int PIDraw3DWdg::AddDrawer3D(PIDrawer3D* dr3, bool ad)
 {
-if (!vfixed)  { 
+if ((!vfixed) && (dr3 != mBDrw))  { 
   dr3->UpdateLimits();
   double xo, yo, zo, xc, yc, zc, teta, phi, psi, dax, day, co, dco;
@@ -201,4 +213,5 @@
   if (vobs) Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
   else Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  mBDrw->Copy3DBox(*dr3);
   }
 else { 
@@ -209,6 +222,5 @@
   }
 int id = AddDrawer(dr3, false, false, ad);
-if (m3DrIl.size() == 0)  dr3->SetAxesFlags(kStdAxes);
-else dr3->SetAxesFlags(kAxesNone);
+if (dr3 != mBDrw) dr3->SetAxesFlags(kAxesNone);
 m3DrIl.push_back(id);
 return(id);
@@ -248,11 +260,6 @@
     axfg = !axfg;
     list<int>::iterator it;
-    if (axfg) 
-      for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)  
-         GetDrawerId(*it)->SetAxesFlags(kAxesNone);
-    else { 
-      it = m3DrIl.begin(); 
-      if (it != m3DrIl.end())  GetDrawerId(*it)->SetAxesFlags(kStdAxes);
-      }
+    if (!axfg) mBDrw->SetAxesFlags(kAxesNone);
+    else mBDrw->SetAxesFlags(kStdAxes);
     Refresh(); 
     }
Index: /trunk/SophyaPI/PI/pisurfdr.cc
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2398)
+++ /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2399)
@@ -45,10 +45,8 @@
   arr->XYfromxy(0,0,mXmin, mYmin);
   arr->XYfromxy(arr->XSize(),arr->YSize(),mXmax, mYmax);
-  double scm=1.;
-  if (asxy)  { 
-    mScy = (mXmax-mXmin)/(mYmax-mYmin);
-    scm = mXmax-mXmin;
-    }
-  else scm =  ((mXmax-mXmin) > (mYmax-mYmin)) ? (mXmax-mXmin)  : (mYmax-mYmin);
+
+  mAutoScaleXY = asxy;
+  mAutoScaleZ = asz;
+
   int i,j;   double cv;
   mZmin = mZmax = arr->Value(0,0);
@@ -60,5 +58,4 @@
     }
   if ((mZmax-mZmin) <= 1.e-19)  mZmax = mZmin + 1.e-19;
-  if (asz) mScz = scm/(mZmax-mZmin);
 //  printf("PISurfaceDrawer::PISurfaceDrawer Min/Max: %g,%g  %g,%g  %g,%g  Sc: %g %g %g \n",
 //          mXmin, mXmax, mYmin, mYmax, mZmin, mZmax, mScx, mScy, mScz);
@@ -82,4 +79,6 @@
 {
   if (mArr == NULL)  return;
+  ComputeScaleFactor(mXmin, mXmax, mYmin, mYmax, mZmin, mZmax, 
+		     mAutoScaleXY, mAutoScaleZ, mScy, mScz);
   double xmin, xmax, ymin, ymax, zmin, zmax;
   xmin = mXmin*mScx;  xmax = mXmax*mScx;
@@ -96,5 +95,6 @@
             (xmin+xmax)/2.+D , (ymin+ymax)/2.-2.5*D , zmin+(zmax-zmin)*0.85, 0.25, 0.25);  
 
-  Set3DBox(xmin, xmax, ymin, ymax, zmin-PERC_GARDE*(zmax-zmin), zmax+PERC_GARDE*(zmax-zmin));
+  Set3DBox(xmin, xmax, ymin, ymax, zmin-PERC_GARDE*(zmax-zmin), 
+	   zmax+PERC_GARDE*(zmax-zmin), mScx, mScy, mScz);
 
 //  printf("PISurfaceDrawer::UpdateLimits() : %g-%g  %g-%g  %g-%g (%g) \n", xmin,xmax,ymin,ymax,zmin,zmax,D);
@@ -119,5 +119,5 @@
 }
 
-/* --Methode-- */
+/* --Methode-- 
 void PISurfaceDrawer::DrawAxes(PIGraphicUC* g)
 {
@@ -132,4 +132,5 @@
             mZmin-PERC_GARDE*(mZmax-mZmin),mZmax+PERC_GARDE*(mZmax-mZmin));
 }
+*/
 
 /* --Methode-- */
@@ -289,2 +290,46 @@
   delete[] zw;
 }
+
+/* --Methode-- */
+int PISurfaceDrawer::DecodeOptionString(vector<string> & opt, bool rmdecopt)
+{
+  int optsz1 = opt.size();
+  if(optsz1<1)  return(0);  
+  // On appelle d'abord le decodage de la classe PIDrawer de laquelle
+  // on herite. (Pas obligatoire) on decode donc ici les attributs de
+  // couleur, fontes ...
+  int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
+  if(optsz1-ndec1<1) return(ndec1);  // si tout a ete decode
+
+  vector<string> udopt;  // On gardera ici les options non decodees
+  unsigned int k = 0;
+  int ndec = opt.size();
+  for( k=0; k<opt.size(); k++ ) {
+    string opts = opt[k];
+    if (opts == "rescalexy") mAutoScaleXY = true;
+    else if (opts == "norescalexy") mAutoScaleXY = false;
+    else if (opts == "rescalez") mAutoScaleZ = true;
+    else if (opts == "norescalez") mAutoScaleZ = false;
+    else {
+      // Si option non decode
+      ndec--;
+      // S'il faut supprimer les options decodees
+      if (rmdecopt)  udopt.push_back(opts);
+    }
+  }  
+  // S'il faut supprimer les options decodees, on remplace l'argument opt
+  // par le vecteur des options non decodees.
+  if (rmdecopt)  opt = udopt;
+  return(ndec+ndec1);  
+}
+
+/* --Methode-- */
+void PISurfaceDrawer::GetOptionsHelpInfo(string& info)
+{
+info += " ---- PISurfaceDrawer options help info : \n" ;
+info += "  rescalexy / norescalexy   rescalez / norescalez \n";
+info += "  and usual color/line/marker/... attribute decoding  \n";
+// On recupere ensuite la chaine info de la classe de base
+PIDrawer::GetOptionsHelpInfo(info);
+return;
+}
Index: /trunk/SophyaPI/PI/pisurfdr.h
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.h	(revision 2398)
+++ /trunk/SophyaPI/PI/pisurfdr.h	(revision 2399)
@@ -18,10 +18,13 @@
 
   virtual void 		Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
-  virtual void       	DrawAxes(PIGraphicUC* g);
+//   Methode de decodage des options
+  virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+//   Texte d'aide des options disponibles
+  virtual void       GetOptionsHelpInfo(string& info);
 
 protected :
   P2DArrayAdapter* mArr;
   bool mAda;
-  double mScz, mScx, mScy;
+  bool mAutoScaleXY, mAutoScaleZ;
   double mXmin, mXmax;
   double mYmin, mYmax;
