Index: /trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.cc	(revision 1617)
+++ /trunk/SophyaPI/PI/pidrawer.cc	(revision 1618)
@@ -385,5 +385,5 @@
   if (mLAtt == PI_NotDefLineAtt)  g->SelLine(PI_ThinLine);
   else g->SelLine(mLAtt);
-//  On calcule les ticks 
+  //  On calcule les ticks 
   CalcTicks();
 
@@ -509,7 +509,4 @@
 }
 
-
-
-
 void
 PIDrawer::DrawHTicks(PIGraphicUC* g, double y, double tickUp, double tickDown, double xBeg, double xStep)
@@ -531,12 +528,32 @@
   double xOffset = 0;
   int kk;
-  g->SelFontSz(xMajTickLen*4., mFAtt);
+
+  g->SelFontSz(xMajTickLen*3., mFAtt);
+
+  // Choix du bon format pour les labels des axes;
+  string format;
+  BonFormatAxes(xBeg,xMax,xStep,format);
+
+  // Pour que les labels ne se sur-ecrivent pas (On ne peut pas changer
+  // xStep a ce niveau sinon les labels ne sont pas en face des ticks)
+  double largeurmax = -1.;
+  int ntick = 0;
+  for(double x=xMin;x<=xMax;x+=xStep) {
+    double xx = (fabs(x/xStep)<1.e-5) ? 0.: x;
+    char label[64]; sprintf(label,format.c_str(), xx);
+    for(kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
+    double largeur = g->CalcStringWidth(label);
+    if(largeur>largeurmax) largeurmax=largeur;
+    ntick++;
+  }
+  largeurmax *= 1.1;  // 10% de securite
+
+  double xlastlabel = xBeg; int ntick1=0;
   for (double x=xBeg; x<=xMax; x += xStep) {
       // Attention aux erreurs d'arrondi quand x->0
       //        car on code 5.1698e-26 au lieu de 0
       double xx = (fabs(x/xStep)<1.e-5) ? 0.: x;
-      char label[20]; sprintf(label, "%-6g", xx);
-      for(kk=0; kk<20; kk++)
-        if (label[kk] == ' ')   { label[kk] = '\0' ; break; }
+      char label[64]; sprintf(label,format.c_str(), xx);
+      for(kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
       double largeur = g->CalcStringWidth(label);
       if (just == 1)
@@ -547,5 +564,10 @@
         xOffset = 0;
       if (aXdir)  xOffset = -xOffset;
-      g->DrawString(g->DeltaUCX(x,xOffset), y, label);
+      if( ntick1==0 || ntick1==ntick-1
+	|| (xlastlabel+largeurmax<x && x+largeurmax<xMax) ) {
+        g->DrawString(g->DeltaUCX(x,xOffset), y, label);
+        xlastlabel = x;
+      }
+      ntick1 ++;
   }
 }
@@ -555,9 +577,14 @@
 {
   double xOffset = 0;
-  g->SelFontSz(xMajTickLen*4., mFAtt);
+  g->SelFontSz(xMajTickLen*3., mFAtt);
+
+  // Choix du bon format pour les labels des axes;
+  string format;
+  BonFormatAxes(yBeg,yMax,yStep,format);
+
   for (double y=yBeg; y<=yMax; y += yStep) {
       double yy = (fabs(y/yStep)<1.e-5) ? 0.: y;
-//    char label[20]; sprintf(label, "%-6g", yy);
-      char label[20]; sprintf(label, "%g", yy);
+      char label[64]; sprintf(label,format.c_str(),yy);
+      for(int kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
       double largeur = g->CalcStringWidth(label);
       if (just == 1)
@@ -588,4 +615,63 @@
 }
 
+/* --Methode-Static-- */
+int PIDrawer::BonFormatAxes(double xmin,double xmax,double dx,string& format)
+// Calcul format optimal pour ecrire les axes
+// double = 17 digits : +d.(16digits)e+ddd  -> e25.18 est large!
+{
+ format = "%-6g";  // format par default
+ if(xmin>=xmax || dx<=0.) return -1;
+
+ //////////// 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",fabs(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
+ // position du "e"
+ char* cdum = index(str,'e');
+ int pose = cdum - str;
+ //printf("pose=%d   strlen=%d\n",pose,strlen(str));
+
+ // on differe dans les puissances ..e+ddd
+ if(ndig>pose) return 0;
+
+ // on calcule le nombre de digits necessaires
+ ndig -= 2;  // +1 - 3 (car par ex:"+9.")
+
+ // Si peu de digits on reste avec le format par defaut
+ // Attention: %6g arrondi le 6ieme digit -> ndig<5 !
+ if(ndig<6) return ndig;
+
+ // On evite d'ecrire d.ddde+00   -> format %f
+ if(  (xmin>=1. && xmin<10. && xmax>=1. && xmax<10.) 
+   || (xmin>-10. && xmin<=-1. && xmax>-10. && xmax<=-1.) ) {
+   sprintf(str,"%%-26.%df",ndig);
+ } else {
+   sprintf(str,"%%-26.%de",ndig);
+ }
+ format = str;
+ //printf("format= %s\n",format.c_str());
+ return ndig;
+}
 
 /*  --------------------------------------------------------------  */
Index: /trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.h	(revision 1617)
+++ /trunk/SophyaPI/PI/pidrawer.h	(revision 1618)
@@ -93,4 +93,6 @@
 //  Calcul des Distances optimales des subdivisions 
   static void        BestTicks(double rmin,double rmax,int nticks,double& majt);
+//  Calcul du format optimal pour les axes
+  static int BonFormatAxes(double xmin,double xmax,double dx,string& format);
 
 //  Les objets/methodes suivants devraient etre protected     
