Index: /trunk/SophyaPI/PI/piaxestools.cc
===================================================================
--- /trunk/SophyaPI/PI/piaxestools.cc	(revision 1931)
+++ /trunk/SophyaPI/PI/piaxestools.cc	(revision 1932)
@@ -194,8 +194,12 @@
 char buff[128];
 if (curscdwdg != NULL) {
+  string format,dum;
   PIScDrawWdg* scd = curscdwdg;
-  sprintf(buff, "%g  %g", scd->XMin(), scd->XMax());
+    PIDrawer::BonFormatAxes(scd->XMin(),scd->XMax(),-1.,format,0,2);
+    dum = format; dum += "  "; dum += format;
+  sprintf(buff,dum.c_str(),scd->XMin(),scd->XMax());
   mText[0]->SetText(buff);
-  sprintf(buff, "%g  %g", scd->YMin(), scd->YMax());
+    PIDrawer::BonFormatAxes(scd->YMin(),scd->YMax(),-1.,format,0,2);
+    sprintf(buff,dum.c_str(),scd->YMin(),scd->YMax());
   mText[1]->SetText(buff);
   int xa, ya;
Index: /trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.cc	(revision 1931)
+++ /trunk/SophyaPI/PI/pidrawer.cc	(revision 1932)
@@ -383,7 +383,7 @@
     if (flags & kLabels) {
       if (!aYdir)
-        DrawHLabels(g, -xMajTickLen*8, xFirstMajTick, xMajTickStep,0);
+        DrawHLabels(g, -xMajTickLen*5, xFirstMajTick, xMajTickStep,0);
       else 
-        DrawHLabels(g, xMajTickLen*8, xFirstMajTick, xMajTickStep,0);
+        DrawHLabels(g, xMajTickLen*5, xFirstMajTick, xMajTickStep,0);
       if (!aXdir)
         DrawVLabels(g, -yMajTickLen*2, yFirstMajTick, yMajTickStep,1);
@@ -441,17 +441,17 @@
     if (flags & kLabels) {
       if (!aYdir) {
-        DrawHLabels(g, g->DeltaUCY(yMin, -xMajTickLen*8), xFirstMajTick, xMajTickStep,0);
-        DrawHLabels(g, g->DeltaUCY(yMax,  xMajTickLen*2), xFirstMajTick, xMajTickStep,0);
+        DrawHLabels(g, g->DeltaUCY(yMin, -xMajTickLen*5), xFirstMajTick, xMajTickStep,0);
+        //DrawHLabels(g, g->DeltaUCY(yMax,  xMajTickLen*2), xFirstMajTick, xMajTickStep,0);
       }
       else {
-        DrawHLabels(g, g->DeltaUCY(yMin, -xMajTickLen*2), xFirstMajTick, xMajTickStep,0);
-        DrawHLabels(g, g->DeltaUCY(yMax,  xMajTickLen*8), xFirstMajTick, xMajTickStep,0);
+        //DrawHLabels(g, g->DeltaUCY(yMin, -xMajTickLen*2), xFirstMajTick, xMajTickStep,0);
+        DrawHLabels(g, g->DeltaUCY(yMax,  xMajTickLen*5), xFirstMajTick, xMajTickStep,0);
       }
       if (!aXdir) {
         DrawVLabels(g, g->DeltaUCX(xMin, -yMajTickLen*2), yFirstMajTick, yMajTickStep,1);
-        DrawVLabels(g, g->DeltaUCX(xMax,  yMajTickLen*2), yFirstMajTick, yMajTickStep,-1);
+        //DrawVLabels(g, g->DeltaUCX(xMax,  yMajTickLen*2), yFirstMajTick, yMajTickStep,-1);
       }
       else {
-        DrawVLabels(g, g->DeltaUCX(xMin, -yMajTickLen*2), yFirstMajTick, yMajTickStep,-1);
+        //DrawVLabels(g, g->DeltaUCX(xMin, -yMajTickLen*2), yFirstMajTick, yMajTickStep,-1);
         DrawVLabels(g, g->DeltaUCX(xMax,  yMajTickLen*2), yFirstMajTick, yMajTickStep,1);
       }
@@ -495,56 +495,65 @@
 PIDrawer::DrawHLabels(PIGraphicUC* g, double y, double xBeg, double xStep, int just)
 {
+  double fsz = xMajTickLen*4.;
+  if(axesAFSz) g->SelFontSz(fsz);
+
+  // Choix du bon format pour les labels des axes;
+  char label[64]; string format;
+  int npuiss = BonFormatAxes(xBeg,xMax,xStep,format,2,1);
+  double fac = 1.;
+
+  if(npuiss!=0) {
+    fac = pow(10.,(double)npuiss);
+    sprintf(label,"10^%d",npuiss);
+    double largeur = g->CalcStringWidth(label);
+    double xm = (aXdir)? xMin+largeur: xMax-largeur;
+    double ym = (aYdir)? yMax+2.5*fsz: yMin-2.5*fsz;
+    g->DrawString(xm,ym,label);
+  }
+
   double xOffset = 0;
-  int kk;
-
-  if (axesAFSz) 
-    g->SelFontSz(xMajTickLen*4.);  // Passage de x3. a x4. - Reza Janvier 2002
+  double xlastlabelfin = xBeg - 2.*(xMax-xBeg);
+  for(double x=xBeg; x<=xMax+xStep/10.; x+=xStep) {
+    //Attention erreur d'arrondi x->0 (on code 5.1698e-26 au lieu de 0)
+    double xx = (fabs(x/xStep)<1.e-5) ? 0.: x;
+    sprintf(label,format.c_str(),xx/fac);
+    for(int kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
+    double largeur = g->CalcStringWidth(label);
+    if(just==1) xOffset=-largeur; else if(just==0) xOffset=-largeur/2;
+    if(aXdir) xOffset = -xOffset;
+    if(x+xOffset > xlastlabelfin) {
+      g->DrawString(g->DeltaUCX(x,xOffset),y,label);
+      xlastlabelfin = x + xOffset + 1.1*largeur;
+    }
+  }
+}
+
+void
+PIDrawer::DrawVLabels(PIGraphicUC* g, double x, double yBeg, double yStep, int just)
+{
+  double fsz = xMajTickLen*4.;
+  if(axesAFSz) g->SelFontSz(fsz);
 
   // Choix du bon format pour les labels des axes;
-  string format;
-  BonFormatAxes(xBeg,xMax,xStep,format,1);
-
-  double xlastlabelfin = xBeg - 2.*(xMax-xBeg);
-  for (double x=xBeg; x<=xMax+xStep/10.; 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[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)        xOffset = -largeur;
-        else if(just == 0) xOffset = -largeur/2;
-          else             xOffset = 0;
-      if(aXdir)            xOffset = -xOffset;
-      if( x+xOffset > xlastlabelfin ) {
-        g->DrawString(g->DeltaUCX(x,xOffset), y, label);
-        xlastlabelfin = x + xOffset + 1.1*largeur;
-      }
+  char label[64]; string format;
+  int npuiss = BonFormatAxes(yBeg,yMax,yStep,format,2,1);
+  double fac = 1.;
+
+  if(npuiss!=0) {
+    fac = pow(10.,(double)npuiss);
+    sprintf(label,"10^%d",npuiss);
+    double largeur = g->CalcStringWidth(label);
+    double xm = (aXdir)? xMax+largeur: xMin-largeur;
+    double ym = (aYdir)? yMin-1.5*fsz: yMax+1.5*fsz;
+    g->DrawString(xm,ym,label);
   }
-}
-
-void
-PIDrawer::DrawVLabels(PIGraphicUC* g, double x, double yBeg, double yStep, int just)
-{
+
   double xOffset = 0;
-
-  if (axesAFSz) 
-    g->SelFontSz(xMajTickLen*4.);  // Passage de x3. a x4. - Reza Janvier 2002
-
-  // Choix du bon format pour les labels des axes;
-  string format;
-  BonFormatAxes(yBeg,yMax,yStep,format,1);
-
   for (double y=yBeg; y<=yMax; y += yStep) {
       double yy = (fabs(y/yStep)<1.e-5) ? 0.: y;
-      char label[64]; sprintf(label,format.c_str(),yy);
+      sprintf(label,format.c_str(),yy/fac);
       for(int kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
       double largeur = g->CalcStringWidth(label);
-      if (just == 1)
-        xOffset = -largeur;
-      else if (just == 0)
-        xOffset = -largeur/2;
-      else
-        xOffset = 0;
+      if (just==1) xOffset=-largeur; else if(just==0) xOffset=-largeur/2;
       if (aXdir)  xOffset = -xOffset;
       g->DrawString(g->DeltaUCX(x, xOffset), y, label);
@@ -568,4 +577,5 @@
 }
 
+///////////////////////////////////////////////////////////////////////////
 /* --Methode-Static-- */
 void PIDrawer::BestTicks(double xmin,double xmax,int nticks
@@ -608,15 +618,27 @@
 /* --Methode-Static-- */
 int PIDrawer::BonFormatAxes(double xmin,double xmax,double xstep
-                           ,string& format,int add_digit)
+                           ,string& format,int typf,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)
+// ---- Input
+// . xmin,xmax : limites du plot sur l'axe considere.
+// . xstep : distance entre les ticks.
+// . add_digit : nombre de digits a ajouter au nombre de digits minimum.
+// . typf : type de format en sortie
+//        0 : format optimum %-nn.mme ou %-nn.mmf selon valeurs
+//        1 : format %-nn.mme
+//        2 : format %-nn.mmf pour imprimer x/10^npuiss
+//            tel que x/10^npuiss soit entre 0 et 10
+// ---- Output
+// . format : le format d'impression
+// ---- Return:
+// Si typ=0 ou 1 
+//   "ndig" : nombre de digits necessaires pour distinguer
+//            les valeurs xmin+k*dx (<=xmax)
+// Si typ=2
+//   "npuiss" : tel que x/10^npuiss soit entre 0 et 10
+//              Dans ce cas le format est celui qui imprime x/10^npuiss
 {
  format = "%-5g";  // format par default
- if(xmin>=xmax) return -1;
+ if(xmin>=xmax) {if(typf==2) return 0; else return -1;}
 
  if(xstep<=0. || xstep>xmax-xmin) xstep = xmax-xmin;
@@ -625,15 +647,37 @@
  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));
+
+ // choix du type de format
+ char ftype = 'e';
+ int npuiss = 0;
+ if(typf==2) {
+   npuiss = il10amax;
+   if(npuiss<-300 || npuiss>300) {
+     ftype='e'; npuiss=0;
+   } else {
+     // On recalcule les valeurs de decision pour  axmax/10^npuiss, xstep/10^npuiss
+     l10amax -= (double)npuiss; l10xstep -=  (double)npuiss;
+     il10amax = int(floor(l10amax));
+     ftype = 'f';
+   }
+ } else if(typf==1) {
+   ftype='e';
+ } else {
+   ftype='e';
+   // 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
+   if(axmin>=1e-4 && axmax<1e4) ftype='f';
+ }
+
+ //printf("BonFormatAxes[npuiss=%d]: xmin=%-21.14e xmax=%-21.14e\n",npuiss,xmin,xmax);
+ //printf("        xstep=%-21.14e log10(xstep/10^%d)=%g\n",xstep,npuiss,l10xstep);
+ //printf("        axmax=%-21.14e log10(axmax/10^%d)=%g diff=%g\n"
+ //      ,axmax,npuiss,l10amax,l10amax-l10xstep);
+
+ // Nombre de digits necessaires pour ecrire axmax et xstep
  int ndig = il10amax  -  int(floor(l10xstep));
- if(ndig<0) ndig *= -1;
- ndig += 1;
+ if(ndig<0) ndig *= -1;  ndig += 1;
  //printf("ndig=%d",ndig);
  
@@ -644,9 +688,5 @@
  // 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
+ if(ftype=='f') { // Calcul du format %-nn.mmf
    int mm=-1, nn;
    if(il10amax<0) { // +0.12345 +0.0012345 +0.0012345 ...
@@ -658,9 +698,7 @@
    if(mm<0.) mm=0; if(nn<mm+3) nn=mm+3;
    sprintf(str,"%%-%d.%df",nn,mm);
- } else {
-   // Calcul du nombre "nn" devant le format %-nn.mme
+ } else if(ftype=='e') { // Calcul du format %-nn.mme
    //   +d.<--ddd-->e+123
-   //   1 2         34567
-   //   nn = ndig+7   mm = ndig-1
+   //   1 2         34567  ==> nn=ndig+7   mm=ndig-1
    sprintf(str,"%%-%d.%de",ndig+7,ndig-1);
  }
@@ -669,5 +707,5 @@
  //printf("format=[%s]\n",format.c_str());
 
+ if(typf==2) return npuiss;
  return ndig;
 }
-
Index: /trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.h	(revision 1931)
+++ /trunk/SophyaPI/PI/pidrawer.h	(revision 1932)
@@ -104,5 +104,5 @@
 //  Calcul du format optimal pour les axes
   static int BonFormatAxes(double xmin,double xmax,double xstep
-                          ,string& format,int add_digit=0);
+                          ,string& format,int typf=0,int add_digit=0);
 
 //  Les objets/methodes suivants devraient etre protected     
@@ -164,5 +164,3 @@
 };
 
-
-
 #endif
Index: /trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 1931)
+++ /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 1932)
@@ -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,format,1);
+  PIDrawer::BonFormatAxes(xm,xm+dx,dx,format,0,1);
   return format;
 }
