Index: /trunk/SophyaPI/PI/piaxes.cc
===================================================================
--- /trunk/SophyaPI/PI/piaxes.cc	(revision 2114)
+++ /trunk/SophyaPI/PI/piaxes.cc	(revision 2115)
@@ -10,6 +10,4 @@
 #include <math.h>
 #include "piaxes.h"
-
-#define PERC_GARDE 0.02
 
 inline void dble_SWAP(double& a,double& b) {double tmp=a; a=b; b=tmp;}
@@ -317,4 +315,35 @@
 ////////////////////////////////////////////////////////////////////////
 /* --Methode-Static-- */
+void PIAxes::ReSizeMinMax(bool axelog,double& vmin,double& vmax,double garde)
+//  Calcul du min et du max du display a partir des valeurs min et max a plotter
+{
+ if(garde<0. || garde>=1.) garde = 0.025;
+ cout<<"ReSizeMinMax[log="<<axelog<<",garde="<<garde<<"] vmin="<<vmin<<" vmax="<<vmax<<endl;
+ // Cas d'une echelle lineaire
+ if(!axelog || vmax<=0.) {
+   double dv = garde*(vmax-vmin);
+   vmin -= dv;
+   vmax += dv;
+ }
+
+ // Cas d'une echelle log avec un range raisonnable
+ else if(vmin>0.) {
+   double dv = pow(vmax/vmin,garde);
+   vmin /= dv;
+   vmax *= dv;
+ }
+
+ // Cas d'une echelle log avec un range de-raisonnable
+ else if(vmin<=0.) {
+   if(vmin<0.)  vmin += garde*vmin;
+   if(vmax==1.) vmax  = 1.+garde;
+   if(vmax>1.)  vmax  = pow(vmax,1.+garde);
+     else       vmax  = pow(vmax,1.-garde);
+ }
+
+ cout<<"           vmin="<<vmin<<" vmax="<<vmax<<endl;
+}
+
+/* --Methode-Static-- */
 void PIAxes::BestTicks(double xmin,double xmax,int nticks
                       ,vector<double>& majticks,vector<double>& minticks)
@@ -366,29 +395,27 @@
 // *** Calcul des ticks pour un axe logarithmique
 {
+ long i;
  if(nticks<=0) nticks = 1;
  //cout<<"BestTicksLog: xmin="<<xmin<<" xmax="<<xmax<<" nticks="<<nticks<<endl;
 
- // CMV_BUG: quand on fait func x 1 100 ..., Reza renvoit xmin=-0.9602 !!!
- // Ceci est un bricolo qui permet d'obtenir un resultat moyen.
- // A CORRIGER: pour Reza, ne pas surdimensionner la fenetre
- //       vers les xmin,ymin SI on demande une echelle log
- //       pour etre sur que xmin,ymin sera bien ce qui est demande.
- if(xmin<=0.) {
-   cout<<"Error_BestTicksLog: xmin="<<xmin;
-   // On suppose que: xmin = xmin0 - PERC_GARDE*(xmax0-xmin0)
-   xmin = fabs((xmin+PERC_GARDE*xmax)/(1.+PERC_GARDE));
-   cout<<" corrected to xmin="<<xmin<<endl
-       <<"      ===> First labels may be WRONG"<<endl;
- }
-
- // Si xmax<=0 ou si dynamique trop faible on garde BestTicks
- if(xmax<=0. || xmax/xmin<5.) {
-   //cout<<"Choix de BestTicks xmax="<<xmax<<" xmax/xmin="<<xmax/xmin<<" <5"<<endl;;
+ // Si xmax<=0, on garde BestTicks
+ if(xmax<=0. ) {
+   //cout<<"Choix de BestTicks car xmax="<<xmax<<endl;
    BestTicks(xmin,xmax,nticks,majticks,minticks);
    return;
  }
 
- int dmin=int(floor(log10(xmin)));
- int dmax=int(floor(log10(xmax)));
+ int dmin, dmax=int(floor(log10(xmax)));
+ if(xmin>0.) {
+   // Dynamique trop faible, on garde BestTicks
+   if(xmax/xmin<5.) {
+     //cout<<"Choix de BestTicks car xmax/xmin="<<xmax/xmin<<" <5"<<endl;
+     return;
+   }
+   dmin=int(floor(log10(xmin)));
+ } else {
+   if(dmax>3) dmin = dmax/3;
+   else dmin = dmax-1;
+ }
  if(dmax==dmin) dmax++; else if(dmax<dmin) dmax=dmin+1;
  int inc = (dmax-dmin+1)/nticks; if(inc<1) inc=1;
@@ -396,5 +423,4 @@
 
  majticks.resize(0);
- int i;
  for(i=dmin;i<=dmax;i+=inc) {
    double x = pow(10.,(double)i);
@@ -404,5 +430,5 @@
  //cout<<"majticks.size()="<<majticks.size()<<endl;
 
- // Pas de puissance de 10 dans l'intervalle
+ // Pas de puissance de 10 dans l'intervalle on garde BestTicks
  if(majticks.size()==0) {
    BestTicks(xmin,xmax,nticks,majticks,minticks);
@@ -424,8 +450,8 @@
    if(nins>4) nins=4;
    vector<double> tmp;
-   for(i=0;i<=majticks.size();i++) {
+   for(i=0;i<=(long)majticks.size();i++) {
      double xt;
-     if(i<majticks.size()) xt = majticks[i]/10.;
-       else                xt = majticks[i-1];
+     if(i<(long)majticks.size()) xt = majticks[i]/10.;
+       else                      xt = majticks[i-1];
      for(int n=0;n<nins;n++) {
        double xins = seqmaj[nins-1][n]*xt;
@@ -433,5 +459,5 @@
        tmp.push_back(xins);
      }
-     if(i<majticks.size()) tmp.push_back(majticks[i]);
+     if(i<(long)majticks.size()) tmp.push_back(majticks[i]);
    }
    majticks = tmp;
@@ -439,7 +465,7 @@
  //cout<<"...majticks.size()="<<majticks.size()<<endl;
 
- // Les ticks mimneurs
+ // Les ticks mineurs
  minticks.resize(0);
- for(i=0;i<majticks.size()-1;i++) {
+ for(i=0;i<(long)majticks.size()-1;i++) {
    double dx = (majticks[i+1]-majticks[i])/10.;
    minticks.push_back(majticks[i]);
@@ -452,4 +478,12 @@
  minticks.push_back(majticks[majticks.size()-1]);
  //cout<<"...minticks.size()="<<minticks.size()<<endl;
+
+ // Si on a xmin<=0., on insere zero dans les ticks majeurs
+ if(xmin<=0.) {
+   vector<double> tmp = majticks;
+   majticks.resize(0); majticks.push_back(0.);
+   for(i=0;i<(long)tmp.size();i++) majticks.push_back(tmp[i]);
+   //cout<<"...xmin="<<xmin<<"<=0. add majticks[0]="<<majticks[0]<<endl;
+ }
 
 }
Index: /trunk/SophyaPI/PI/piaxes.h
===================================================================
--- /trunk/SophyaPI/PI/piaxes.h	(revision 2114)
+++ /trunk/SophyaPI/PI/piaxes.h	(revision 2115)
@@ -42,18 +42,17 @@
   //  virtual void      DrawHorizontalAxe(double xmin, double xmax, double y, 
 
-//  Calcul des Distances optimales des subdivisions (STATIC)
+  //  Calcul du min et du max du display a partir des valeurs min et max a plotter
+  static void ReSizeMinMax(bool axelog,double& vmin,double& vmax,double garde=0.025);
+  //  Calcul des Distances optimales des subdivisions (STATIC)
   static void BestTicks(double xmin,double xmax,int nticks
-			,vector<double>& majticks,vector<double>& minticks);
+		       ,vector<double>& majticks,vector<double>& minticks);
   static void BestTicksLog(double xmin,double xmax,int nticks
-			   ,vector<double>& majticks,vector<double>& minticks);
-
-//  Calcul du format optimal (STATIC)
+			  ,vector<double>& majticks,vector<double>& minticks);
+  //  Calcul du format optimal (STATIC)
   static int BonFormatAxes(double xmin,double xmax,double xstep
-			   ,string& format,int typf=0,int add_digit=0);
-
-//  Decision du format optimal pour les axes (STATIC)
+			  ,string& format,int typf=0,int add_digit=0);
+  //  Decision du format optimal pour les axes (STATIC)
   static int Le_Bon_Format(vector<double>& xticks,string& format,double& xstep);
-
-//  Mise en forme optimale du label numerique (STATIC)
+  //  Mise en forme optimale du label numerique (STATIC)
   static void Arrange_Label(char *label);
 
Index: /trunk/SophyaPI/PI/piyfxdrw.cc
===================================================================
--- /trunk/SophyaPI/PI/piyfxdrw.cc	(revision 2114)
+++ /trunk/SophyaPI/PI/piyfxdrw.cc	(revision 2115)
@@ -7,6 +7,4 @@
 #include "piyfxdrw.h"
 #include "parradapter.h"
-
-#define PERC_GARDE 0.02
 
 // --------------------------------------------------------------------------
@@ -102,8 +100,7 @@
     }
 
-  double dx, dy;
-  dx = PERC_GARDE*(xmax-xmin);
-  dy = PERC_GARDE*(ymax-ymin);
-  SetLimits(xmin-dx, xmax+dx, ymin-dy, ymax+dy);
+  PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
+  PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
+  SetLimits(xmin,xmax,ymin,ymax);
   SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
 }
Index: /trunk/SophyaPI/PIext/pigfd1.cc
===================================================================
--- /trunk/SophyaPI/PIext/pigfd1.cc	(revision 2114)
+++ /trunk/SophyaPI/PIext/pigfd1.cc	(revision 2115)
@@ -3,6 +3,4 @@
 #include <stdio.h>
 #include "pigfd1.h"
-
-#define PERC_GARDE 0.02
  
 /* --Methode-- */
@@ -42,5 +40,4 @@
 if(mGFD->NData()<=0) return;
 if(VarX<0) return;
-double dx, dy;
 double xmin=9.e19, xmax=-9.e19, ymin=9.e19, ymax=-9.e19;
 mGFD->GetMnMx(10*VarX+2,xmin,xmax);
@@ -48,7 +45,7 @@
 if(xmax<=xmin) xmax = xmin+1.;
 if(ymax<=ymin) ymax = ymin+1.;
-dx = PERC_GARDE*(xmax-xmin);
-dy = PERC_GARDE*(ymax-ymin);
-SetLimits((double)xmin-dx,(double)xmax+dx,(double)ymin-dy,(double)ymax+dy);
+PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
+PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
+SetLimits(xmin,xmax,ymin,ymax);
 SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
 }
Index: /trunk/SophyaPI/PIext/pintuple.cc
===================================================================
--- /trunk/SophyaPI/PIext/pintuple.cc	(revision 2114)
+++ /trunk/SophyaPI/PIext/pintuple.cc	(revision 2115)
@@ -5,6 +5,4 @@
 #include <stdio.h>
 #include "pintuple.h"
-
-#define PERC_GARDE 0.02
 
 //++
@@ -126,5 +124,4 @@
 
   // Commencer par trouver nos limites
-  double dx, dy;
   double xmin, xmax, ymin, ymax;
   xmin = ymin = 9.e19;
@@ -132,9 +129,7 @@
   mNT->GetMinMax(xK, xmin, xmax);
   mNT->GetMinMax(yK, ymin, ymax);
-    
-  dx = PERC_GARDE*(xmax-xmin);
-  dy = PERC_GARDE*(ymax-ymin);
-  
-  SetLimits(xmin-dx, xmax+dx, ymin-dy, ymax+dy);
+  PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
+  PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
+  SetLimits(xmin,xmax,ymin,ymax);
 //  SetAxesFlags(kBoxAxes | kExtTicks | kLabels);  Ne pas faire - Reza 11/99
 }
@@ -175,5 +170,5 @@
 nok = 0;  
 xp = yp = xl = yl = 0;
-for (int i=0; i<mNT->NbLines(); i++) {
+for (long i=0; i<(long)mNT->NbLines(); i++) {
   xl = xp;  yl = yp; 
   xp = mNT->GetCell(i, xK);
@@ -247,5 +242,5 @@
 info += buff;
 info += mNT->LineHeaderToString();
-for (int i=0; i<mNT->NbLines(); i++) {
+for(long i=0; i<(long)mNT->NbLines(); i++) {
   xp = mNT->GetCell(i, xK);
   yp = mNT->GetCell(i, yK);
Index: /trunk/SophyaPI/PIext/pistlist.cc
===================================================================
--- /trunk/SophyaPI/PIext/pistlist.cc	(revision 2114)
+++ /trunk/SophyaPI/PIext/pistlist.cc	(revision 2115)
@@ -4,6 +4,4 @@
 #include <stdio.h>
 #include "pistlist.h"
-
-#define PERC_GARDE 0.02
 
 //++
@@ -84,12 +82,9 @@
 
   // Commencer par trouver nos limites
-  double dx, dy;
-  double x1, x2, y1, y2;
+  double x1,x2,y1,y2;
   mStL->CalcXYLimits(x1, x2, y1, y2);
-  
-  dx = PERC_GARDE*(x2-x1);
-  dy = PERC_GARDE*(y2-y1);
-  
-  SetLimits(x1-dx, x2+dx, y1-dy, y2+dy); 
+  PIAxes::ReSizeMinMax(isLogScaleX(),x1,x2);
+  PIAxes::ReSizeMinMax(isLogScaleY(),y1,y2);
+  SetLimits(x1,x2,y1,y2); 
   SetAxesFlags(kBoxAxes | kExtTicks | kLabels);
 }
