Index: trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- trunk/SophyaPI/PI/pidrawer.cc	(revision 1928)
+++ trunk/SophyaPI/PI/pidrawer.cc	(revision 1930)
@@ -8,6 +8,6 @@
 #include <iostream.h>
 // #include <typeinfo>
+#include "utilgeom.h"
 #include "pidrawer.h"
-
 #include "pidrwtools.h"
 
@@ -314,5 +314,5 @@
   xMinTickStep = xMajTickStep/5;
   xFirstMinTick = floor(xMin / xMinTickStep) * xMinTickStep;
-  if (xFirstMinTick < xMin) xFirstMinTick += xMinTickStep;
+  if(xFirstMinTick < xMin) xFirstMinTick += xMinTickStep;
 
   int ntick_y = (aYlog) ? 6 : 12;
@@ -320,5 +320,5 @@
   yMinTickStep = yMajTickStep/5;
   yFirstMinTick = floor(yMin / yMinTickStep) * yMinTickStep;
-  if (yFirstMinTick < yMin) yFirstMinTick += yMinTickStep;
+  if(yFirstMinTick < yMin) yFirstMinTick += yMinTickStep;
 
   yMajTickLen = (xMax-xMin)/100;
@@ -569,5 +569,7 @@
 
 /* --Methode-Static-- */
-void PIDrawer::BestTicks(double xmin,double xmax,int nticks,double& steptick,double& xfirsttick)
+void PIDrawer::BestTicks(double xmin,double xmax,int nticks
+                        ,double& steptick,double& xfirsttick)
+// *** Calcul de l'intervalle entre les ticks et de la valeur du premier tick
 {
 double d=xmax-xmin; if(d<1.e-100) d=1.e-100; //if (d<1.e-39) d=1.e-39;
@@ -577,4 +579,5 @@
 if(ld>=0.) {fld-=1.; del0=del=pow(10.,fld);}
   else     {fld+=2.; del0=del=pow(10.,-fld);}
+// *** Intervalle entre les ticks
 // xmin  xmax    d       ld       fld -->fld  del0
 // 1     1500    1499    3.17     3      2    10^2
@@ -597,81 +600,61 @@
 while(d/del>(double)nticks && k<4 ) {del=fac[k]*del0; k++;}
 steptick=del;
-xfirsttick = floor(xmin/steptick) * steptick;
+//***  Valeur du premier tick
+xfirsttick = floor(xmin/steptick); if(xmin<0.) xfirsttick+=1.;
+xfirsttick *= steptick;
 if(xfirsttick<xmin) xfirsttick += steptick;
 }
 
 /* --Methode-Static-- */
-int PIDrawer::BonFormatAxes(double xmin,double xmax,double dx,string& format,int add_digit)
-// Calcul format optimal pour ecrire les axes
-// double = 17 digits : +a.bbbbbbbbe+ccc  -> securite 26%18e
-// ** add_digit nombre de digit a ajouter au nombre de digit minimum.
-// But: calculer "ndig" nombre de digits necessaires pour distinguer
-//      les valeurs xmin+k*dx (<=xmax)
-{
- format = "%-6g";  // format par default
+int PIDrawer::BonFormatAxes(double xmin,double xmax,double xstep
+                           ,string& format,int add_digit)
+// *** Calcul format optimal pour ecrire les labels numeriques des axes:
+// - Les axes vont de "xmin" a "xmax".
+// - On veut un intervalle "xstep" entre les ticks.
+// - Le programme retourne le format dans le "string format"
+// - add_digit: nombre de digit a ajouter au nombre de digit minimum.
+// Return: "ndig" nombre de digits necessaires pour distinguer
+//         les valeurs xmin+k*dx (<=xmax)
+{
+ format = "%-5g";  // format par default
  if(xmin>=xmax) return -1;
- if(dx<=0.) dx = 0.9999*(xmax-xmin);
-
- //////////// Calcul du nombre de digits necessaires
- char str[32],str0[32];
- int ndig = 0;
- //printf("           1         2         3 \n");
- //printf("|0123456789012345678901234567890|\n");
- int npass = 0;  // au cas ou dx est tout petit et "x+=dx == x" !
- for(double x=xmin; x<=xmax; x+=dx) {
-   // Le format %e ecrit les "-" pour x<0 mais pas les "+" pour x>0
-   // Il faut gerer le zero car 0 -> 0.000e+00 mais -0 -> -0.000e+00
-   if(x>0.)      sprintf(str,"+%-26.18e",x);
-   else if(x<0.) sprintf(str,"-%-26.18e",-x);
-   else          sprintf(str,"+%-26.18e",0.);
-   //printf("|%s|",str);
-   if(npass!=0) {
-     int j;
-     for(j=0;j<(int)strlen(str);j++) if(str0[j]!=str[j]) break;
-     //printf(" -> ...j= %d",j);
-     if(j>ndig) ndig=j;
-     //printf("    ndig= %d  |%26.18e| (%-6g)\n",ndig,x,x);
-   } //else printf("\n");
-   strcpy(str0,str);
-   if(npass>1000) break; npass++;
- }
-
- //////////// Calcul du bon format
- // on differe dans les signes: #1.2345e+123
- if(ndig==0) return 0;
-
- // on differe dans les puissances 1.2345e+###
- // position du "e"
- char* cdum = index(str,'e');
- int pose = cdum - str;
- //printf("pose=%d   strlen=%d\n",pose,strlen(str));
- if(ndig>pose) return 0;
-
- // on calcule le nombre de digits necessaires
- // ... ndig==1 : +9    --> ndig=1
- // ... ndig>1  : +9.1  --> ndig-=1
- if(ndig>1) ndig -= 1;
-
- // on ajoute des digits au cas ou on veut plus que le minimum requis
- ndig += add_digit;
-
- // Si peu de digits on reste avec le format par defaut
- // Attention: %6g arrondi le 6ieme digit -> ndig<5 !
- if(ndig<6) return ndig;
+
+ if(xstep<=0. || xstep>xmax-xmin) xstep = xmax-xmin;
 
  double axmin=fabs(xmin), axmax=fabs(xmax);
- if(axmax<axmin) {dx=axmin; axmin=axmax; axmax=dx;}
- if(axmin>=0.01 && axmax<1000.) {
-   // On evite d'ecrire +a.bbbe+ccc pour ccc=-1,0,1,2 -> format %f
+ if(axmin>axmax) swap(axmin,axmax);
+ double l10amax = log10(axmax), l10xstep = log10(xstep);
+
+ //printf("BonFormatAxes: xmin=%-21.14e xmax=%-21.14e\n",xmin,xmax);
+ //printf("        xstep=%-21.14e log10(xstep)=%g\n",xstep,l10xstep);
+ //printf("        axmax=%-21.14e log10(axmax)=%g diff=%g\n"
+ //      ,axmax,l10amax,l10amax-l10xstep);
+
+ // Nombre de digits necessaires pour ecrire amax et xstep
+ int il10amax = int(floor(l10amax));
+ int ndig = il10amax  -  int(floor(l10xstep));
+ if(ndig<0) ndig *= -1;
+ ndig += 1;
+ //printf("ndig=%d",ndig);
+ 
+ // Add more digits (or suppress digits)
+ ndig += add_digit; if(ndig<0) ndig=0;
+ //printf(" + %d  ==> ndig=%d\n",add_digit,ndig);
+
+ // Calcul du bon format
+ char str[16];
+ if(axmin>=1e-4 && axmax<1e4) {
+   // On evite d'ecrire +a.bbbe+ccc -> format %f
    // Ex: 1.2345e+2 -> 123.45   /  -1.2345e+2 -> -123.45
    //     1.2345e-1 -> 0.12345  /  -1.2345e-1 -> -0.12345
    // Calcul du format %-nn.mmf
    int mm=-1, nn;
-   if(axmax<0.1)        {mm=ndig+1; nn=mm+3;} // +0.012345
-   else if(axmax<1.)    {mm=ndig;   nn=mm+3;} // +0.12345
-   else if(axmax<10.)   {mm=ndig-1; nn=mm+3;} // +1.2345
-   else if(axmax<100.)  {mm=ndig-2; nn=mm+4;} // +12.345
-   else if(axmax<1000.) {mm=ndig-3; nn=mm+5;} // +123.45
-   if(mm<0.) {mm=ndig; nn=mm+3;}              // +0.12345 (defaut)
+   if(il10amax<0) { // +0.12345 +0.0012345 +0.0012345 ...
+     mm = ndig - il10amax - 1; nn = mm+3;
+   } else {         // +1.2345 +12.345 +123.45 ...
+     mm = ndig - il10amax - 1; nn = ndig+2;
+   }
+   //printf("format %%f : mm=%d  nn=%d\n",mm,nn);
+   if(mm<0.) mm=0; if(nn<mm+3) nn=mm+3;
    sprintf(str,"%%-%d.%df",nn,mm);
  } else {
@@ -684,5 +667,6 @@
 
  format = str;
- //printf("format= %s\n",format.c_str());
+ //printf("format=[%s]\n",format.c_str());
+
  return ndig;
 }
Index: trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- trunk/SophyaPI/PI/pidrawer.h	(revision 1928)
+++ trunk/SophyaPI/PI/pidrawer.h	(revision 1930)
@@ -100,7 +100,9 @@
 //  --- Methode- static ----
 //  Calcul des Distances optimales des subdivisions 
-  static void BestTicks(double xmin,double xmax,int nticks,double& steptick,double& xfirsttick);
+  static void BestTicks(double xmin,double xmax,int nticks
+                       ,double& steptick,double& xfirsttick);
 //  Calcul du format optimal pour les axes
-  static int BonFormatAxes(double xmin,double xmax,double dx,string& format, int add_digit=0);
+  static int BonFormatAxes(double xmin,double xmax,double xstep
+                          ,string& format,int add_digit=0);
 
 //  Les objets/methodes suivants devraient etre protected     
Index: trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 1928)
+++ trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 1930)
@@ -610,5 +610,5 @@
   double xm = (fabs(xmax)>fabs(xmin)) ? fabs(xmax): fabs(xmin);
   double dx = fabs(xmax-xmin)/500.;
-  PIDrawer::BonFormatAxes(xm,xm+dx,dx*0.9999,format,1);
+  PIDrawer::BonFormatAxes(xm,xm+dx,dx,format,1);
   return format;
 }
