Index: trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- trunk/SophyaPI/PI/pidrawer.cc	(revision 208)
+++ trunk/SophyaPI/PI/pidrawer.cc	(revision 209)
@@ -500,5 +500,6 @@
 {
   PILineAtt savlineatt = g->GetLineAtt();
-  g->SelLine(PI_ThinDashedLine);
+//  g->SelLine(PI_ThinDashedLine);
+  g->SelLine(PI_ThinDottedLine);
 
   for (double x=xFirstMajTick; x<=xMax; x += xMajTickStep)
Index: trunk/SophyaPI/PI/pidrwtools.cc
===================================================================
--- trunk/SophyaPI/PI/pidrwtools.cc	(revision 208)
+++ trunk/SophyaPI/PI/pidrwtools.cc	(revision 209)
@@ -54,6 +54,6 @@
 spy = bsy/4;
 
-int wszx = 5*spx+4.25*bsx; 
-int wszy = (6+3*0.85)*(spy+bsy);
+int wszx = 5*spx+3.5*bsx; 
+int wszy = (7+3*0.85)*(spy+bsy);
 SetSize(wszx, wszy);
 
@@ -62,16 +62,16 @@
 int csx = cpx;
 int csy = cpy;
-mLab[0] = new PILabel(this, "X Min Max", 1.5*bsx, bsy, cpx, cpy);
+mLab[0] = new PILabel(this, "X Min Max", 1.25*bsx, bsy, cpx, cpy);
 cpy += spy+bsy; 
-mLab[1] = new PILabel(this, "Y Min Max", 1.5*bsx, bsy, cpx, cpy);
+mLab[1] = new PILabel(this, "Y Min Max", 1.25*bsx, bsy, cpx, cpy);
 mLab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 mLab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 
 cpy = spy*2;
-cpx += spx+1.5*bsx; 
-mText[0] = new PIText(this, "x_min_max", 2.75*bsx, bsy, cpx, cpy);
+cpx += spx+1.25*bsx; 
+mText[0] = new PIText(this, "x_min_max", 2.25*bsx, bsy, cpx, cpy);
 mText[0]->SetText("-1.0  1.0");
 cpy += spy+bsy; 
-mText[1] = new PIText(this, "y_min_max", 2.75*bsx, bsy, cpx, cpy);
+mText[1] = new PIText(this, "y_min_max", 2.25*bsx, bsy, cpx, cpy);
 mText[1]->SetText("-1.0  1.0");
 mText[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
@@ -80,9 +80,9 @@
 cpx = spx+0.25*bsx;
 cpy += spy+bsy; 
-mCkb[0] = new PICheckBox(this,"X-RtoL", 2000, bsx*1.25, bsy, cpx, cpy);
-cpx += spx+1.25*bsx; 
-mCkb[1] = new PICheckBox(this,"Y-UpDn", 2000, bsx*1.25, bsy, cpx, cpy);
-cpx += spx+1.25*bsx; 
-mCkb[2] = new PICheckBox(this,"Grid", 2000, bsx*1.25, bsy, cpx, cpy);
+mCkb[0] = new PICheckBox(this,"X-RtoL", 2000, bsx, bsy, cpx, cpy);
+cpx += spx+bsx; 
+mCkb[1] = new PICheckBox(this,"Y-UpDn", 2000, bsx, bsy, cpx, cpy);
+cpx += spx+bsx; 
+mCkb[2] = new PICheckBox(this,"Grid", 2000, bsx, bsy, cpx, cpy);
 mCkb[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 mCkb[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
@@ -90,13 +90,10 @@
 
 cpy += spy+bsy; 
-cpx = 2.5*spx;;
-mBut[0] = new PIButton(this, "Apply", 2600, bsx*1.25, bsy, cpx, cpy);
-cpx += bsx*1.50;
-mBut[1] = new PIButton(this, "Auto", 2700, bsx*1.25, bsy, cpx, cpy);
-cpx += bsx*1.50;
-mBut[2] = new PIButton(this, "Dismiss", 2500,  bsx*1.25, bsy, cpx, cpy);
+cpx = spx+0.25*bsx;;
+mBut[0] = new PIButton(this, "SetAxes", 2600, bsx*1.5, bsy, cpx, cpy);
+cpx += bsx*1.5+3*spx;
+mBut[1] = new PIButton(this, "AutoLimits", 2700, bsx*1.5, bsy, cpx, cpy);
 mBut[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 mBut[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
-mBut[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 
 int offy = cpy+bsy+spy*2;
@@ -110,5 +107,5 @@
 bsy = 0.85*bsy;   spy = 0.85*spy;
 
-mOpt[0] = new PIOptMenu(this, "bwt-opt-0", bsx*2.0, bsy, cpx, cpy);
+mOpt[0] = new PIOptMenu(this, "bwt-opt-0", bsx*1.75, bsy, cpx, cpy);
 mOpt[0]->AppendItem("Def.Col", 100);
 mOpt[0]->AppendItem("Black", 101);
@@ -131,6 +128,6 @@
 mOpt[0]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
-cpx += spx+2.25*bsx; 
-mOpt[1] = new PIOptMenu(this, "bwt-opt-1", bsx*2.0, bsy, cpx, cpy);
+cpx += spx+1.75*bsx; 
+mOpt[1] = new PIOptMenu(this, "bwt-opt-1", bsx*1.75, bsy, cpx, cpy);
 mOpt[1]->AppendItem("No.CMap", 200);
 mOpt[1]->AppendItem("Grey32", 201);
@@ -150,5 +147,5 @@
 cpx = 2*spx;
 cpy += spy+bsy;
-mOpt[2] = new PIOptMenu(this, "bwt-opt-2", bsx*2.0, bsy, cpx, cpy);
+mOpt[2] = new PIOptMenu(this, "bwt-opt-2", bsx*1.75, bsy, cpx, cpy);
 mOpt[2]->AppendItem("Def.Mrk", 300);
 mOpt[2]->AppendItem("Mrk Dot(.)", 301);
@@ -166,6 +163,6 @@
 mOpt[2]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
-cpx += spx+2.25*bsx; 
-mOpt[3] = new PIOptMenu(this, "bwt-opt-3", bsx*2.0, bsy, cpx, cpy);
+cpx += spx+1.75*bsx; 
+mOpt[3] = new PIOptMenu(this, "bwt-opt-3", bsx*1.75, bsy, cpx, cpy);
 mOpt[3]->AppendItem("Mrk 1 pt", 401);
 mOpt[3]->AppendItem("Mrk 3 pt", 403);
@@ -181,5 +178,5 @@
 cpx = 2*spx;
 cpy += spy+bsy;
-mOpt[4] = new PIOptMenu(this, "bwt-opt-4", bsx*2.0, bsy, cpx, cpy);
+mOpt[4] = new PIOptMenu(this, "bwt-opt-4", bsx*1.75, bsy, cpx, cpy);
 mOpt[4]->AppendItem("Def.Font", 500);
 mOpt[4]->AppendItem("Normal-Font", 511);
@@ -198,6 +195,6 @@
 mOpt[4]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
-cpx += spx+2.25*bsx; 
-mOpt[5] = new PIOptMenu(this, "bwt-opt-5", bsx*2.0, bsy, cpx, cpy);
+cpx += spx+1.75*bsx; 
+mOpt[5] = new PIOptMenu(this, "bwt-opt-5", bsx*1.75, bsy, cpx, cpy);
 mOpt[5]->AppendItem("Def.Line", 600);
 mOpt[5]->AppendItem("Thin-Line", 601);
@@ -213,5 +210,5 @@
 mOpt[5]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
-cpx = spx;
+cpx = 2*spx;
 cpy += spy+bsyo;
 bsy = bsyo; spy = spyo;
@@ -227,13 +224,19 @@
 mNlb->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
-cpx = wszx-2.5*bsx-3*spx;
-mButcf[0] = new PIButton(this, "GetAtt", 2800, bsx*0.80, bsy, cpx, cpy);
-cpx += 0.80*bsx+spx;
-mButcf[1] = new PIButton(this, "SetAtt", 2900, bsx*0.80, bsy, cpx, cpy);
-cpx += 0.80*bsx+spx;
-mButcf[2] = new PIButton(this, "Refresh", 3000, bsx*0.90, bsy, cpx, cpy);
+cpx = wszx-1.7*bsx-3*spx;
+mButcf[0] = new PIButton(this, "GetAtt", 2800, 0.85*bsx, bsy, cpx, cpy);
+cpx += 0.85*bsx+spx;
+mButcf[1] = new PIButton(this, "SetAtt", 2900, 0.85*bsx, bsy, cpx, cpy);
 mButcf[0]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 mButcf[1]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
+
+cpx = spx+0.25*bsx;;
+cpy += spy+bsy;
+mButcf[2] = new PIButton(this, "Refresh", 3000, bsx*1.5, bsy, cpx, cpy);
 mButcf[2]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
+cpx += bsx*1.5+3*spx;
+mButcf[3] = new PIButton(this, "Dismiss", 3777, bsx*1.5, bsy, cpx, cpy);
+mButcf[2]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
+mButcf[3]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
 
 cwdrwt = this;
@@ -382,5 +385,5 @@
 
 msg = UserMsg(msg);
-if (msg == 2500)  { Hide(); return; }
+if (msg == 3777)  { Hide(); return; }
 
 if (mCurBW == NULL)   return;
Index: trunk/SophyaPI/PI/pidrwtools.h
===================================================================
--- trunk/SophyaPI/PI/pidrwtools.h	(revision 208)
+++ trunk/SophyaPI/PI/pidrwtools.h	(revision 209)
@@ -36,5 +36,5 @@
 // Pour changer les axes
   PILabel* mLab[2];
-  PIButton* mBut[3];
+  PIButton* mBut[2];
   PIText* mText[2];
   PICheckBox* mCkb[3];
@@ -43,5 +43,5 @@
   PILabel* mNlb;
   PIButton* mButdr[2];
-  PIButton* mButcf[3];
+  PIButton* mButcf[4];
   int mNDr;
   int mtyp, msz;
Index: trunk/SophyaPI/PI/piimage.cc
===================================================================
--- trunk/SophyaPI/PI/piimage.cc	(revision 208)
+++ trunk/SophyaPI/PI/piimage.cc	(revision 209)
@@ -13,4 +13,47 @@
 #include "pidrwtools.h"
 #include PIAPP_H
+
+//++
+// Class	PIImage
+// Lib		PI
+// include	piimage.h
+//
+//   	Classe pour la l'affichage et la manipulation d'images.
+//	Peut contrôler un PIPixmap pour l'affichage d'une zone
+//	agrandie (zoom) et un PIPixmap pour l'affichage de toute
+//	l'image (réduite).
+//	Utilise les adaptateur de tableaux 2D manipuler le
+//	contenu des images ("P2DArrayAdapter").
+//
+//	* Bouton-1 : Envoie le message "PIMsg_Active" et affiche
+//	les coordonnées courantes et la valeur du pixel, 
+//	et positionne le pavé.
+//	* Bouton-2 : Permet de définir une zone de l'image.
+//	* Bouton-3 : Permet de déplacer l'image dans la fenêtre
+//
+//	Gestion du clavier :
+//	* <Alt>O : Affichage de la fenêtre de contrôle des paramètres de visualisation.
+//	* <Alt>G : Affichage de la fenêtre de changement des attributs graphiques
+//	* <Alt>R : Rafraîchit l'affichage.
+//	* <Alt>V : Copier/*Coller* Ajout du texte du buffer copier/coller
+//	sur l'objet à la position courante.
+//	* <Alt>C : *Copier*/Coller Permet de copier le contenu de la zone sélectionnée
+//	de l'image sous forme texte.
+//	* <Alt>Z : Supprime les textes et signes ajoutés au dessin.
+//	* Touches Curseurs : déplace la pavé.
+//--
+//++
+// Links	Parents
+// PIPixmap
+//--
+
+//++
+// Titre	Constructeurs, méthodes
+//--
+//++
+//  PIImage(PIContainerGen *par, char *nom=NULL, int sx=0, int sy=0, int px=0, int py=0)
+//	Créateur
+//  
+//--
 
 // --------------------------------------------------------------------------------
@@ -438,10 +481,14 @@
 cur_piimage = this;
 if (kmod == PIKM_Alt) {
-  if (key == 'V' || key == 'v') RequestSelection();  // Pour coller (copier/coller)  
-  if (key == 'Z' || key == 'z') { mdrw->ElDelAll();  Refresh(); } // Pour supprimer tous les signes 
-  if (key == 'O' || key == 'o') PIImgTools::ShowPIImgTools();   // Fentre LUT et options 
-
+  if      (key == 'R' || key == 'r') Apply(true);  // Pour tout rafraichir  
+  else if (key == 'V' || key == 'v') RequestSelection();  // Pour coller (copier/coller)  
+  else if (key == 'Z' || key == 'z') { mdrw->ElDelAll();  Refresh(); } // Pour supprimer tous les signes 
+  else if (key == 'O' || key == 'o') PIImgTools::ShowPIImgTools();   // Fentre LUT et options 
+  else if (key == 'G' || key == 'g') {   // Fentre attributs graphiques 
+    PIDrwTools::SetCurrentBaseWdg(this);
+    PIDrwTools::ShowPIDrwTools();   // Fentre axes et options de trace
+    }
 // ----  Le copier ---- 
-  if ((key == 'C' || key == 'c') && img) { 
+  else if ((key == 'C' || key == 'c') && img) { 
     // On limite la taille a 48x48
     int i1 = XPave();  
Index: trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 208)
+++ trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 209)
@@ -15,11 +15,15 @@
 //	de *Drawer* avec la gestion de zoom (agrandissement).
 //	* Bouton-1 : Envoie le message "PIMsg_Active" et affiche
-//	les coordonnées courant (User-Coordinates)
+//	les coordonnées courantes (User-Coordinates)
 //	* Bouton-2 : Permet de définir un rectangle pour le zoom.
 //
 //	Gestion du clavier :
-//	* <Alt>O : Affichage d'une fenêtre de changement des attributs graphiques
+//	* <Alt>O : Active/Affiche les  contrôles de paramètres spécifiques 
+//	(Par défaut, action identique à <Alt>G)
+//	* <Alt>G : Affichage de la fenêtre de changement des attributs graphiques
+//	* <Alt>R : Rafraîchit l'affichage.
+//	* <Alt>M : Active/Désactive l'affichage d'une réticule de mesure (Bouton-1)
 //	* <Alt>V : Copier/*Coller* Ajout du texte du buffer copier/coller
-//	sur l'objet à la position courante de la souris
+//	sur l'objet à la position courante.
 //	* <Alt>Z : Supprime les textes et signes ajoutés au dessin.
 //--
@@ -60,4 +64,8 @@
 :PIBaseWdg(par, nom, sx, sy, px, py)
 {
+  mFgReticule = false;
+  mCPosX = mCPosY = 0;
+  mPPos[0] = mPPos[1] = 0.;
+
   mBDrw = new PIElDrawer;
   SetLimits(-1.,1.,-1.,1.,kAxeDirLtoR,kAxeDirDownUp);
@@ -91,7 +99,10 @@
 {
 if (kmod == PIKM_Alt) {
-  if (key == 'V' || key == 'v') RequestSelection();  // Pour coller (copier/coller)  
-  if (key == 'Z' || key == 'z') { mBDrw->ElDelAll();  Refresh(); } // Pour supprimer tous les signes 
-  if (key == 'O' || key == 'o') { 
+  if      (key == 'R' || key == 'r')  Refresh(); // rafraichir l'affichage
+  else if (key == 'M' || key == 'm') mFgReticule = !mFgReticule; // reticule de mesure 
+  else if (key == 'V' || key == 'v') RequestSelection();  // Pour coller (copier/coller)  
+  else if (key == 'Z' || key == 'z') { mBDrw->ElDelAll();  Refresh(); } // Pour supprimer tous les signes 
+  else if (key == 'O' || key == 'o') ActivateSpecializedControls();
+  else if (key == 'G' || key == 'g') { 
     PIDrwTools::SetCurrentBaseWdg(this);
     PIDrwTools::ShowPIDrwTools();   // Fentre axes et options de trace
@@ -177,5 +188,6 @@
 // Gestion affichage coordonnees du point 
 
-string   PIScDrawWdg::GetClickText(double x, double y) 
+string   
+PIScDrawWdg::GetClickText(double x, double y) 
 // Donne le texte a afficher pour position x,y  
 {
@@ -187,19 +199,37 @@
 
 void
+PIScDrawWdg::ActivateSpecializedControls()
+// Par défaut affiche la fenetres des attributs graphiques et axes
+{
+  PIDrwTools::SetCurrentBaseWdg(this);
+  PIDrwTools::ShowPIDrwTools();   // Fentre axes et options de trace
+}
+
+void
 PIScDrawWdg::But1Press(int x, int y)
 {
-  if (UpdateText(x, y))
-     {
-     if (mTrW)
-       { 
-       int tpx, tpy;
-       GetScreenPos(tpx, tpy);       
-       tpy -= (mTrW->YSize()+5);
-       if (tpy < 0)  tpy = 0;
-       mTrW->SetPos(tpx, tpy);
-       mTrW->Show();
-       }
-     SelPointerShape(PI_CrossPointer);
-     }
+  UpdateText(x, y);
+  if (mTrW)
+    { 
+    int tpx, tpy;
+    GetScreenPos(tpx, tpy);       
+    tpy -= (mTrW->YSize()+5);
+    if (tpy < 0)  tpy = 0;
+    mTrW->SetPos(tpx, tpy);
+    mTrW->Show();
+    }
+  if (mFgReticule) { // On trace une reticule
+    cForCol = mWGrC->GetForeground();
+    cGOmod  = mWGrC->GetGOMode();
+    cLatt = mWGrC->GetLineAtt();
+    mWGrC->SelForeground(PI_Magenta);
+    mWGrC->SelGOMode(PI_GOXOR);
+    mWGrC->SelLine(PI_ThinLine);
+    mWGrC->DrawLine(x, 0, x, YSize());
+    mWGrC->DrawLine(0, y, XSize(), y);
+    mCPosX = x;   mCPosY = y;
+    }
+  else SelPointerShape(PI_CrossPointer);
+
   Send(Msg(), PIMsg_Active);
   PIDrwTools::SetCurrentBaseWdg(this);
@@ -209,4 +239,11 @@
 PIScDrawWdg::Ptr1Move(int x, int y)
 {
+  if (mFgReticule) { // On trace une reticule
+    mWGrC->DrawLine(mCPosX, 0, mCPosX, YSize());
+    mWGrC->DrawLine(0, mCPosY, XSize(), mCPosY);
+    mWGrC->DrawLine(x, 0, x, YSize());
+    mWGrC->DrawLine(0, y, XSize(), y);
+    mCPosX = x;   mCPosY = y;
+    }  
   UpdateText(x, y);
 }
@@ -215,10 +252,18 @@
 PIScDrawWdg::But1Release(int x, int y)
 {
-  if (UpdateText(x, y)) 
-    SelPointerShape(PI_ArrowPointer);
+  UpdateText(x, y);
+  if (mFgReticule) { // On efface la reticule
+    mWGrC->DrawLine(mCPosX, 0, mCPosX, YSize());
+    mWGrC->DrawLine(0, mCPosY, XSize(), mCPosY);
+    mWGrC->SelForeground(cForCol);
+    mWGrC->SelGOMode(cGOmod);
+    mWGrC->SelLine(cLatt); 
+    mCPosX = mCPosY = 0;
+    }
+  else SelPointerShape(PI_ArrowPointer);
   if (mTrW)  mTrW->Hide();
 }
 
-bool
+void
 PIScDrawWdg::UpdateText(int xp, int yp)
 {
@@ -227,5 +272,4 @@
   mBDrw->GetGraphicUC()->GrC2UC(xp, yp, dx, dy); 
   mPPos[0] = dx;  mPPos[1] = dy; 
-  if ((mTxw == NULL) && (mTrlb == NULL)) return(false);
   
   string ctxt =  GetClickText(dx, dy);
@@ -235,5 +279,5 @@
   if (mTrlb)
     mTrlb->SetLabel(ctxt);
-  return(true);
+  return;
 
 }
Index: trunk/SophyaPI/PI/piscdrawwdg.h
===================================================================
--- trunk/SophyaPI/PI/piscdrawwdg.h	(revision 208)
+++ trunk/SophyaPI/PI/piscdrawwdg.h	(revision 209)
@@ -57,4 +57,5 @@
 
   virtual string     GetClickText(double x, double y); // Donne le texte a afficher pour position x,y
+  virtual void	     ActivateSpecializedControls();   // Pour activer des controles specifiques
 
   void               SetTextWin(PILabel * tw, bool trw=true, int tx=300, int ty=30);
@@ -73,5 +74,7 @@
 protected:
   double xMinS, xMaxS, yMinS, yMaxS; // Sauvegarde pour zoom
-  double mPPos[2];               // Position click souris X,Y
+  double mPPos[2];               // Position courante (user coordinates)
+  int mCPosX, mCPosY;              // Position click souris X,Y
+  bool mFgReticule;                // Controle l'affiche d'une réticule (Bouton-1)
 
   PIElDrawer* mBDrw;
@@ -88,5 +91,5 @@
 
 private:
-  bool  UpdateText(int xp, int yp);
+  void  UpdateText(int xp, int yp);
 };
 
