Index: /trunk/SophyaPI/PI/pi3ddrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2545)
+++ /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2546)
@@ -262,4 +262,66 @@
 }
 
+/* --Methode-- */
+int PIDrawer3D::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 == "rescale") || (opts == "autoscale") ) aScxy = aScz = true;
+    else if ( (opts == "norescale") || (opts == "noautoscale") ) aScxy = aScz = false;
+    else if ( (opts == "rescalexy") || (opts == "autoscalexy") )  aScxy = true;
+    else if ( (opts == "norescalexy") || (opts == "noautoscalexy") )  aScxy = false;
+    else if ( (opts == "rescalez") || (opts == "autoscalez") )  aScz = true;
+    else if ( (opts == "norescalez") || (opts == "noautoscalez") )  aScz = 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-- */
+int PIDrawer3D::OptionToString(vector<string> & opt) const
+{
+ PIDrawer::OptionToString(opt);
+ if ( aScxy || aScz ) opt.push_back("autoscale");
+ else if (!aScxy && !aScz ) opt.push_back("noautoscale");
+ else {
+   if(aScxy) opt.push_back("autoscalexy"); else opt.push_back("noautoscalexy");
+   if(aScz) opt.push_back("autoscalez"); else opt.push_back("noautoscalez");
+ }
+ return 1;
+}
+
+/* --Methode-- */
+void PIDrawer3D::GetOptionsHelpInfo(string& info)
+{
+info += " ---- PIDrawer3D options help info : \n" ;
+info += "  X/Y,Z axis rescaling option (-> cubic 3D box)  \n";
+info += "  rescale=autoscale/ norescale=noautoscale : X/Y and Z axis \n";
+info += "  rescalexy=autoscalexy / norescalexy=noautoscalexy : X/Y  axis \n";
+info += "  rescalexy=autoscalexy / norescalexy=noautoscalexy : Z axis \n";
+info += " --- + Usual color/line/marker/... attribute decoding  \n";
+// On recupere ensuite la chaine info de la classe de base
+PIDrawer::GetOptionsHelpInfo(info);
+return;
+}
+
 /*  --------------------------------------------------------------  */
 /*  ------------------- Classe PIElDrawer3D ------------------------  */
@@ -319,5 +381,5 @@
   int nopt0 = opt.size();
   if (nopt0 < 1)  return(0);  
-  int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
+  int ndec1 = PIDrawer3D::DecodeOptionString(opt, rmdecopt);
   if ((nopt0 - ndec1) < 1) return(ndec1);  // si tout a ete decode
   vector<string> udopt;
Index: /trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2545)
+++ /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2546)
@@ -51,4 +51,9 @@
                                                     double zz1, double zz2, double xl1, double xl2, 
                                                     double yl1, double yl2, double zl1, double zl2);
+//   Methode de decodage des options
+  virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+  virtual int        OptionToString(vector<string> & opt) const;
+//   Texte d'aide des options disponibles
+  virtual void       GetOptionsHelpInfo(string& info);
 
   // Cordonnees du cube 3D
Index: /trunk/SophyaPI/PI/pi3dwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2545)
+++ /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2546)
@@ -41,5 +41,6 @@
 //	* <Alt>E : Supprime le dernier élément graphique ajouté.
 //	* <Alt>A : Active/desactive l'affichage des axes
-//	* <Alt>R : Reinitialise la vue 3D (vue par défaut) et rafraichit le dessin.
+//	* <Alt>U : Reinitialise la vue 3D (vue par défaut) et rafraichit le dessin.
+//	* <Alt>R : Rafraichit le dessin du widget.
 //	* <Alt>S : Active/desactive le mode de rotation d'objet sans Shift
 //
@@ -169,4 +170,5 @@
   double D = xmax-xmin;
   if (D < (ymax-ymin))  D = ymax-ymin;
+  if (D < (zmax-zmin))  D = zmax-zmin;
   D *= 1.4;
   Set3DView((xmin+xmax)/2., (ymin+ymax)/2, zmin+(zmax-zmin)*0.40, 
@@ -181,10 +183,10 @@
 #if defined(CC_HAS_RTTI_SUPPORT)
   while ( (it != m3DrIl.end()) && 
-	  (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)) != mBDrw) ) it++; 
+	  (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)) == mBDrw) ) it++; 
   if (it == m3DrIl.end())  return;
   PIDrawer3D* dr3 = dynamic_cast<PIDrawer3D*>(GetDrawerId(*it));
 #else
   while ( (it != m3DrIl.end()) && 
-	  ( (PIDrawer3D*)(GetDrawerId(*it)) != mBDrw) ) it++; 
+	  ( (PIDrawer3D*)(GetDrawerId(*it)) == mBDrw) ) it++; 
   PIDrawer3D* dr3 = (PIDrawer3D*)(GetDrawerId(*it));
 #endif
@@ -210,6 +212,74 @@
 int PIDraw3DWdg::DecodeOptionString(vector<string> & opt, bool rmdecopt)
 {
-  // AFAIRE - Reza 01/03/2002 
-  return(0);
+  if (opt.size() == 0)  return(0);  
+
+  vector<string> udopt;
+  unsigned int k = 0;
+  int ndec = opt.size();
+  bool fg3db = false;
+
+  double xmin = mBDrw->ScaleX( mBDrw->XMin3() );
+  double xmax = mBDrw->ScaleX( mBDrw->XMax3() );
+  double ymin = mBDrw->ScaleY( mBDrw->YMin3() );
+  double ymax = mBDrw->ScaleY( mBDrw->YMax3() );
+  double zmin = mBDrw->ScaleY( mBDrw->ZMin3() );
+  double zmax = mBDrw->ScaleY( mBDrw->ZMax3() );
+  bool asxy = mBDrw->isAutoScaleXY();
+  bool asz = mBDrw->isAutoScaleZ();
+
+  for( k=0; k<opt.size(); k++ ) {
+    string opts = opt[k];
+    // Limites en x,y
+    if (opts.substr(0,10) == "xyzlimits=") {
+      sscanf(opts.substr(10).c_str(),"%lg,%lg,%lg,%lg,%lg,%lg",
+	     &xmin, &xmax, &ymin, &ymax, &zmin, &zmax);
+      fg3db = true;
+      continue;
+    }
+    if (opts.substr(0,9) == "lim3dbox=") {
+      sscanf(opts.substr(9).c_str(),"%lg,%lg,%lg,%lg,%lg,%lg",
+	     &xmin, &xmax, &ymin, &ymax, &zmin, &zmax);
+      fg3db = true;
+      continue;
+    }
+    if (opts == "autoscale3dbox") {
+      asxy = asz = true;
+      fg3db = true;
+      continue;
+    }
+    if (opts == "noautoscale3dbox") {
+      asxy = asz = false;
+      fg3db = true;
+      continue;
+    }
+    if (opts == "autoscalexy3dbox") {
+      asxy = true;
+      fg3db = true;
+      continue;
+    }
+    if (opts == "noautoscalexy3dbox") {
+      asxy = false;
+      fg3db = true;
+      continue;
+    }
+    if (opts == "autoscalez3dbox") {
+      asz = true;
+      fg3db = true;
+      continue;
+    }
+    if (opts == "noautoscalez3dbox") {
+      asz = false;
+      fg3db = true;
+      continue;
+    }
+    // Option non decode 
+    ndec--;
+    if (rmdecopt) udopt.push_back(opts);    
+  }
+
+  if (fg3db)  Set3DViewBox(xmin,xmax,ymin,ymax,zmin,zmax,asxy,asz);
+  
+  if (rmdecopt)  opt = udopt;
+  return(ndec);
 }
 
@@ -313,5 +383,5 @@
   else if (key == 'S' || key == 's')  skcfg = !skcfg;  
   else if (key == 'R' || key == 'r')  Refresh();
-  else if (key == 'B' || key == 'b')  Update3DView();
+  else if (key == 'U' || key == 'u')  Update3DView();
   }
 }
Index: /trunk/SophyaPI/PI/pisurfdr.cc
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2545)
+++ /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2546)
@@ -160,6 +160,6 @@
 
   double dx,dy;   // taille du bin 
-  dx = (mXmax-mXmin)*mScx/xsz; 
-  dy = (mYmax-mYmin)*mScy/ysz;
+  dx = ScaleX(mXmax-mXmin)/xsz; 
+  dy = ScaleY(mYmax-mYmin)/ysz;
  
   int i1,j1;
@@ -172,8 +172,8 @@
       ijzp[k].ij = j*xsz+i; 
       mArr->XYfromxy(i,j,x,y);
-      x *= mScx; x += dx/2.;
-      y *= mScy; y += dy/2.;
+      x = ScaleX(x); x += dx/2.;
+      y = ScaleY(y); y += dy/2.;
       ijzp[k].zh = mArr->Value(i,j);
-      z = ijzp[k].zh * mScz;
+      z = ScaleZ(ijzp[k].zh);
       g3->C3DC2ObsCS(x,y,z,xp,yp,zp);
       ijzp[k].dp = zp; 
@@ -185,5 +185,5 @@
       j1 = (j>0) ? j-1 : 0;
       z = mArr->Value(i,j) + mArr->Value(i1,j) + mArr->Value(i1,j1) +  mArr->Value(i,j1);
-      z = z/4.*mScz;        
+      z = ScaleZ(z/4.);        
 //      g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);
       xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;    zw[j*(xsz+1)+i] = z;    
@@ -193,10 +193,10 @@
   for(i=0; i<xsz; i++) {
      mArr->XYfromxy(i,j-1,x,y);
-     x *= mScx; 
-     y *= mScy; y += dy;
+     x = ScaleX(x); 
+     y = ScaleY(y); y += dy;
      i1 = (i>0) ? i-1 : 0;
      j1 = j-1;
      z = mArr->Value(i,j-1) + mArr->Value(i1,j-1) + mArr->Value(i1,j1) +  mArr->Value(i,j1);
-     z = z/4.*mScz;
+     z = ScaleZ(z/4.);
 //     g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
      xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;   zw[j*(xsz+1)+i] = z;   
@@ -205,10 +205,10 @@
   for(j=0; j<ysz; j++) {
      mArr->XYfromxy(i-1,j,x,y);
-     x *= mScx; x += dx;
-     y *= mScy; 
+     x = ScaleX(x); x += dx;
+     y = ScaleY(y); 
      i1 = i-1;
      j1 = (j>0) ? j-1 : 0;
      z = mArr->Value(i-1,j) + mArr->Value(i1,j) + mArr->Value(i1,j1) +  mArr->Value(i-1,j1);
-     z = z/4.*mScz;
+     z = ScaleZ(z/4.);
 //     g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
      xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;   zw[j*(xsz+1)+i] = z;   
@@ -217,8 +217,8 @@
   mArr->XYfromxy(i-1,j-1,x,y);
   i1 = i-1;   j1 = j-1;
-  x *= mScx; x += dx;
-  y *= mScy; y += dy;
+  x = ScaleX(x); x += dx;
+  y = ScaleY(y); y += dy;
   z = mArr->Value(i-1,j-1) + mArr->Value(i1,j-1) + mArr->Value(i1,j1) +  mArr->Value(i-1,j1);
-  z = z/4.*mScz;
+  z = ScaleZ(z/4.);
 //  g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
   xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;    zw[j*(xsz+1)+i] = z;   
@@ -291,56 +291,2 @@
 }
 
-/* --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") aScxy = true;
-    else if (opts == "norescalexy") aScxy = false;
-    else if (opts == "rescalez") aScz = true;
-    else if (opts == "norescalez") aScz = 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-- */
-int PISurfaceDrawer::OptionToString(vector<string> & opt) const
-{
- PIDrawer::OptionToString(opt);
-
- if(aScxy) opt.push_back("rescalexy"); else opt.push_back("norescalexy");
- if(aScz) opt.push_back("rescalez"); else opt.push_back("norescalez");
-
- return 1;
-}
-
-/* --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 2545)
+++ /trunk/SophyaPI/PI/pisurfdr.h	(revision 2546)
@@ -18,4 +18,6 @@
 
   virtual void 		Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
+
+/* --- Juin 2004 : decodage des options mis ds PIDrawer3D 
 //   Methode de decodage des options
   virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
@@ -23,4 +25,5 @@
 //   Texte d'aide des options disponibles
   virtual void       GetOptionsHelpInfo(string& info);
+  ---------     */
 
 protected :
