Index: /trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2261)
+++ /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2262)
@@ -80,4 +80,5 @@
 // -- Pour compatibilite avec l'interface precedente , Reza 08/2002 
   inline void        ElDel(int id) { eltsMgr.ElDel(id); }
+  inline void        ElDelLast()   { eltsMgr.ElDelLast(); }
   inline void        ElDelAll()    { eltsMgr.ElDelAll(); }
   
Index: /trunk/SophyaPI/PI/pi3dwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2261)
+++ /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2262)
@@ -37,5 +37,6 @@
 //	* <Alt>V : Copier/*Coller* Ajout du texte du buffer copier/coller
 //	sur l'objet à la position courante de la souris
-//	* <Alt>Z : Supprime les textes et signes ajoutés au dessin.
+//	* <Alt>Z : Supprime les élément graphiques ajoutés au dessin.
+//	* <Alt>E : Supprime le dernier élément graphique ajouté.
 //	* <Alt>A : Active/desactive l'affichage des axes
 //	* <Alt>R : Reinitialise la vue 3D (vue par défaut) et rafraichit le dessin.
@@ -236,4 +237,5 @@
   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 == 'E' || key == 'e') { mBDrw->ElDelLast();  Refresh(); } // Pour supprimer le dernier element ajoute
   else if (key == 'O' || key == 'o') { // fenetre des options de controle du drawer actif
     PIDrawer* actdrw = GetActiveDrawer();
Index: /trunk/SophyaPI/PI/pieldrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.cc	(revision 2261)
+++ /trunk/SophyaPI/PI/pieldrw.cc	(revision 2262)
@@ -47,4 +47,12 @@
   ElDelAll();
 }
+
+/* Des macros pour passer des coord normalise aux coord graphique */
+#define CN_To_CG_X(x)  x0_g+dx_g*(double)x
+#define CN_To_CG_Y(y)  y0_g+dy_g*(double)y
+#define D_CN_To_CG_X(x)  dx_g*(double)x
+#define D_CN_To_CG_Y(y)  dy_g*(double)y
+#define CN_To_CG_R(r)  0.5*(dx_g+dy_g)*(double)r
+
 /* --Methode-- */
 //++
@@ -55,4 +63,12 @@
   DrwElList::iterator it;
   g->SaveGraphicAtt();
+
+  PIGrCoord x1g,x2g,y1g,y2g,xg,yg;
+  double x0_g, dx_g, y0_g, dy_g;
+  g->GetGrSpace(x1g,x2g,y1g,y2g);
+  x0_g = x1g;  y0_g = y1g;
+  dx_g = (double)x2g-(double)x1g;
+  dy_g = (double)y2g-(double)y1g;
+
   for (it = mElist.begin(); it != mElist.end(); it++)
     {
@@ -75,40 +91,102 @@
 	{
 	case PIDEL_Line :
-	  g->DrawLine((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawLine(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), 
+			D_CN_To_CG_X((*it).edx), D_CN_To_CG_Y((*it).edy) ); 
+	  else g->DrawLine((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
 	  break;
 	case PIDEL_Mark :
-	  g->DrawMarker((*it).ex, (*it).ey); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawMarker(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey));
+	  else g->DrawMarker((*it).ex, (*it).ey);
 	  break;
 	case PIDEL_Arrow :
-	  g->DrawArrowMarker((*it).ex, (*it).ey, (*it).edx, (*it).edy, true); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawArrowMarker(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), 
+			       D_CN_To_CG_X((*it).edx), D_CN_To_CG_Y((*it).edy) );
+	  else g->DrawArrowMarker((*it).ex, (*it).ey, (*it).edx, (*it).edy, true); 
 	  break;
 	case PIDEL_Text :
-	  g->DrawString((*it).ex, (*it).ey, ((*it).es->txt.c_str()), (*it).es->txtpd ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawString(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey),
+			  ((*it).es->txt.c_str()), (*it).es->txtpd ); 
+	  else g->DrawString((*it).ex, (*it).ey, ((*it).es->txt.c_str()), (*it).es->txtpd ); 
+	  break;
+	case PIDEL_CText :
+	  if ((*it).scc) { // Coord specifie normalise 0..1
+	    xg = CN_To_CG_X((*it).ex);
+	    yg = CN_To_CG_Y((*it).ey);
+	  }
+	  else {
+	    xg = (*it).ex;
+	    yg = (*it).ey;
+	  }
+	  if ((*it).es->attss) 
+	    g->DrawCompString(xg, yg, (*it).es->txt.c_str(), (*it).es->txt_up->c_str(),
+			      (*it).es->txt_dn->c_str(), (*it).es->attss->GetFont(), 
+			      (*it).es->txtpd );
+	  else 
+	    g->DrawCompString(xg, yg, (*it).es->txt.c_str(), (*it).es->txt_up->c_str(),
+			      (*it).es->txt_dn->c_str(), (*it).es->txtpd );
+
 	  break;
 	case PIDEL_Rect :
-	  g->DrawBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawBox(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), 
+		       D_CN_To_CG_X((*it).edx), D_CN_To_CG_Y((*it).edy) ); 
+	  else 	g->DrawBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
 	  break;
 	case PIDEL_FRect :
-	  g->DrawFBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawFBox(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), 
+			D_CN_To_CG_X((*it).edx), D_CN_To_CG_Y((*it).edy) ); 
+	  else g->DrawFBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
 	  break;
 	case PIDEL_Circ :
-	  g->DrawCircle((*it).ex, (*it).ey, (*it).edx ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawCircle(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), CN_To_CG_R((*it).edx) );
+	  else  g->DrawCircle((*it).ex, (*it).ey, (*it).edx ); 
 	  break;
 	case PIDEL_FCirc :
-	  g->DrawFCircle((*it).ex, (*it).ey, (*it).edx ); 
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->DrawFCircle(CN_To_CG_X((*it).ex), CN_To_CG_Y((*it).ey), CN_To_CG_R((*it).edx) );
+	  else g->DrawFCircle((*it).ex, (*it).ey, (*it).edx ); 
 	  break;
 	case PIDEL_Arc :
-	  g->Draw3PtArc((*it).xpol[0], (*it).ypol[0], (*it).xpol[1], 
-			(*it).ypol[1], (*it).xpol[2], (*it).ypol[2] );
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->Draw3PtArc(CN_To_CG_X((*it).xpol[0]), CN_To_CG_X((*it).xpol[1]), 
+			  CN_To_CG_X((*it).xpol[2]), CN_To_CG_Y((*it).ypol[0]),
+			  CN_To_CG_Y((*it).ypol[1]), CN_To_CG_Y((*it).ypol[1]) );
+	  else g->Draw3PtArc((*it).xpol[0], (*it).ypol[0], (*it).xpol[1], 
+			     (*it).ypol[1], (*it).xpol[2], (*it).ypol[2] );
 	  break;
 	case PIDEL_FArc :
-	  g->Draw3PtFArc((*it).xpol[0], (*it).ypol[0], (*it).xpol[1], 
-			 (*it).ypol[1], (*it).xpol[2], (*it).ypol[2] );
+	  if ((*it).scc)  // Coord specifie normalise 0..1
+	    g->Draw3PtFArc(CN_To_CG_X((*it).xpol[0]), CN_To_CG_X((*it).xpol[1]), 
+			   CN_To_CG_X((*it).xpol[2]), CN_To_CG_Y((*it).ypol[0]),
+			   CN_To_CG_Y((*it).ypol[1]), CN_To_CG_Y((*it).ypol[1]) );
+	  else  g->Draw3PtFArc((*it).xpol[0], (*it).ypol[0], (*it).xpol[1], 
+			       (*it).ypol[1], (*it).xpol[2], (*it).ypol[2] );
 	  break;
 	case PIDEL_Poly :
-	  g->DrawPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
-	  break;
 	case PIDEL_FPoly :
-	  g->DrawFPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
+	  if ((*it).scc) { // Coord specifie normalise 0..1
+	    PIGrCoord* grx = new PIGrCoord[(*it).npol];
+	    PIGrCoord* gry = new PIGrCoord[(*it).npol];
+	    for(int jk=0; jk<(*it).npol; jk++) {
+	      grx[jk] = CN_To_CG_X((*it).xpol[jk]);
+	      gry[jk] = CN_To_CG_Y((*it).ypol[jk]);
+	    }
+	    if ((*it).etyp == PIDEL_Poly) 
+	      g->DrawPolygon(grx, gry, (*it).npol, false ); 
+	    else  g->DrawFPolygon(grx, gry, (*it).npol, false );
+	    delete[] grx;
+	    delete[] gry;
+	  }
+	  else {
+	    if ((*it).etyp == PIDEL_Poly) 
+	      g->DrawPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
+	    else g->DrawFPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
+	  }
 	  break;
 	default :
@@ -120,66 +198,97 @@
 
 //++
-// int  ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
-// int  ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIGraphicAtt gatt)
-// int  ElAddText(PIGrCoord x, PIGrCoord y, string const & s)
-// int  ElAddText(PIGrCoord x, PIGrCoord y, string const &  s, PIGraphicAtt gatt)
-//	Ajout d'un élément texte (possibilité de spécification d'un attribut graphique).
+// int  ElAddText(double x, double y, const char* s, bool fgsc=false)
+// int  ElAddText(double x, double y, const char* s, PIGraphicAtt gatt,  \
+//                unsigned long tpd, bool fgsc=false)
+// int  ElAddText(double x, double y, string const & s, bool fgsc=false)
+// int  ElAddText(double x, double y, string const &  s, PIGraphicAtt gatt, \
+//                unsigned long tpd, bool fgsc=false)
+//	Ajout d'un élément texte (possibilité de spécification d'un attribut graphique
+//	et d'un attribut de direction et de positionnement de texte "tpd").
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
 //	Renvoie le numéro identificateur de l'élément.
 // 
-// int  ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
-// int  ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, PIGraphicAtt gatt)
+// int  ElAddCompText(double x, double y, string const& s, PIGraphicAtt const & gatt, \
+//                    string const& s_up, string const& s_dn, \
+//                    unsigned long tpd=0, bool fgsc=false)
+// int  ElAddCompText(double x, double y, string const& s, PIGraphicAtt const & gatt, \
+//                    string const& s_up, string const& s_dn, \
+//                    unsigned long tpd=0, bool fgsc=false)
+// int  ElAddCompText(double x, double y, string const& s, PIGraphicAtt const & gatt, \
+//                    string const& s_up, string const& s_dn, PIGraphicAtt const & attss, \
+//                    unsigned long tpd=0, bool fgsc=false)
+//	Ajout d'un élément texte avec exposant ("s_up") et indice ("s_dn").
+//	Il est possible de spécifier un attribut graphique ("gatt"), attribut de 
+//	de direction et de positionnement de texte ("tpd"), ainsi qu'un attribut graphique
+//	(fonte en particulier) pour le texte en exposant/indice ("attss").
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddLine(double x1, double y1, double x2, double y2, bool fgsc=false)
+// int  ElAddLine(double x1, double y1, double x2, double y2, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de ligne (possibilité de spécification d'un attribut graphique).
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
 //	Renvoie le numéro identificateur de l'élément.
 //	
-// int  ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-// int  ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, PIGraphicAtt gatt)
+// int  ElAddRect(double x, double y, double dx, double dy, bool fgsc=false)
+// int  ElAddRect(double x, double y, double dx, double dy, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type rectangle (possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-// int  ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy,  PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFRect(double x, double y, double dx, double dy, bool fgsc=false)
+// int  ElAddFRect(double x, double y, double dx, double dy,  PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type rectangle plein 
 //	(possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-// int  ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddCirc(double x, double y, double r, bool fgsc=false)
+// int  ElAddCirc(double x, double y, double r, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type cercle (possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-// int  ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFCirc(double x, double y, double r, bool fgsc=false)
+// int  ElAddFCirc(double x, double y, double r, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type cercle plein avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2 \
-//               PIGrCoord x3, PIGrCoord y3)
-// int  ElAddArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2 \
-//               PIGrCoord x3, PIGrCoord y3, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddArc(double x1, double y1, double x2, double y2 \
+//               double x3, double y3, bool fgsc=false)
+// int  ElAddArc(double x1, double y1, double x2, double y2 \
+//               double x3, double y3, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type arc défini par trois points
 //	(possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddFArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2 \
-//                PIGrCoord x3, PIGrCoord y3)
-// int  ElAddFArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2 \
-//                PIGrCoord x3, PIGrCoord y3, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFArc(double x1, double y1, double x2, double y2 \
+//                double x3, double y3, bool fgsc=false)
+// int  ElAddFArc(double x1, double y1, double x2, double y2 \
+//                double x3, double y3, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type arc plein défini par trois points
 //	(possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
-// int  ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddPoly(vector<double>& x, vector<double>& y, bool fgsc=false)
+// int  ElAddPoly(vector<double>& x, vector<double>& y, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type polygone (possibilité de spécification d'un attribut graphique).
-//	Renvoie le numéro identificateur de l'élément.
-//
-// int  ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
-// int  ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt gatt)
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFPoly(vector<double>& x, vector<double>& y, bool fgsc=false)
+// int  ElAddFPoly(vector<double>& x, vector<double>& y, PIGraphicAtt gatt, bool fgsc=false)
 //	Ajout d'un élément de type polygone plein 
 //	(possibilité de spécification d'un attribut graphique).
+//	si "fgsc==true", coordonnées spécifiées considerées normalisées entre 0 et 1.
 //	Renvoie le numéro identificateur de l'élément.
 // 
 // void  ElDel(int id)
 //	Suppression de l'élément avec l'identificateur "id".
+// void  ElDelLast()
+//	Suppression du dernier élément ajouté.
 // void  ElDelAll()
 //	Suppression de tous les éléments de l'objet.
@@ -188,6 +297,6 @@
 
 /* --Methode-- */
-int PIElDrwMgr::ElAdd(int typ, PIGrCoord x, PIGrCoord  y, PIGrCoord dx, PIGrCoord dy, 
-		      const char* s, PIGraphicAtt const& att, unsigned long tpd)
+int PIElDrwMgr::ElAdd(int typ, double x, double  y, double dx, double dy, 
+		      const char* s, PIGraphicAtt const& att, unsigned long tpd, bool fgsc)
 {
   DrwEl dre;
@@ -201,8 +310,11 @@
     dre.es->txt = s;
     dre.es->txtpd = tpd;
+    dre.es->txt_up = dre.es->txt_dn = NULL;
+    dre.es->attss = NULL;
   }
   else dre.es = NULL;
   dre.xpol = dre.ypol = NULL;
   dre.npol = 0;
+  dre.scc = fgsc;
   mElist.push_back(dre);
   return(mEn);
@@ -210,5 +322,32 @@
 
 /* --Methode-- */
-int PIElDrwMgr::ElAdd(int typ, vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const& att)
+int PIElDrwMgr::ElAdd(double x, double y, const char* s, PIGraphicAtt const & att, const char* s_up, 
+		      const char* s_dn, PIGraphicAtt const * gass, unsigned long tpd, bool fgsc)
+{
+  DrwEl dre;
+  mEn++;
+  dre.eid = mEn; dre.etyp = PIDEL_CText;
+  dre.ex = x;   dre.ey = y;
+  dre.edx = 0;  dre.edy = 0;
+  dre.gatt = att;
+  dre.es = new TxtEl;
+  if (s) dre.es->txt = s;
+  dre.es->txtpd = tpd;
+  dre.es->txt_up = new string;
+  if (s_up) *(dre.es->txt_up) = s_up;
+  dre.es->txt_dn = new string;
+  if (s_dn) *(dre.es->txt_dn) = s_dn;
+  if (gass) dre.es->attss = new PIGraphicAtt(*gass);
+  else dre.es->attss = NULL;
+  dre.xpol = dre.ypol = NULL;
+  dre.npol = 0;
+  dre.scc = fgsc;
+  mElist.push_back(dre);
+  return(mEn);  
+}
+
+/* --Methode-- */
+int PIElDrwMgr::ElAdd(int typ, vector<double>& x, vector<double>& y, 
+		      PIGraphicAtt const& att, bool fgsc)
 {
   DrwEl dre;
@@ -229,4 +368,5 @@
     }
   }
+  dre.scc = fgsc;
   mElist.push_back(dre);
   return(mEn);
@@ -234,13 +374,13 @@
 
 /* --Methode-- */
-int PIElDrwMgr::ElAdd(int typ, PIGrCoord* x, PIGrCoord* y, int n,
-		      PIGraphicAtt const & att)
-{
-  vector<PIGrCoord> vx, vy;
+int PIElDrwMgr::ElAdd(int typ, double* x, double* y, int n,
+		      PIGraphicAtt const & att, bool fgsc)
+{
+  vector<double> vx, vy;
   for(int k=0; k<n; k++) {
     vx.push_back(x[k]);
     vy.push_back(y[k]);
   }
-  return ( ElAdd(typ, vx, vy, att) );
+  return ( ElAdd(typ, vx, vy, att, fgsc) );
 }
 
@@ -252,5 +392,10 @@
   for (it = mElist.begin(); it != mElist.end(); it++) {
     if ( (*it).eid == id) { 
-      if ( (*it).es ) delete (*it).es;
+      if ( (*it).es ) { 
+        if ( (*it).es->txt_up ) delete (*it).es->txt_up;
+        if ( (*it).es->txt_dn ) delete (*it).es->txt_dn;
+        if ( (*it).es->attss ) delete (*it).es->attss;
+        delete (*it).es;
+      }
       if ( (*it).xpol ) delete[] (*it).xpol;
       if ( (*it).ypol ) delete[] (*it).ypol;
@@ -306,13 +451,14 @@
 
 //++
-// PIElDrawer()
-//	Constructeur
-//--
-
-/* --Methode-- */
-PIElDrawer::PIElDrawer()
-{
+// PIElDrawer(bool fgclip=true)
+//	Constructeur - Si "fgclip=false", appel a PIGraphicUC::NoClip() ds Draw()
+//--
+
+/* --Methode-- */
+PIElDrawer::PIElDrawer(bool fgclip)
+{
+fgClip = fgclip;
 ShowTitles();
- ShowAxesLabels();
+ShowAxesLabels();
 }
 
@@ -397,5 +543,5 @@
 {
 SelGraAtt(g);   
-g->NoClip();  // On ne clip pas les BaseDrawer - Reza Nov 2002
+if (!fgClip) g->NoClip();
 DrawAxes(g);   // Trace des axes 
 // g->SelFont(PI_NormalSizeFont);
Index: /trunk/SophyaPI/PI/pieldrw.h
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.h	(revision 2261)
+++ /trunk/SophyaPI/PI/pieldrw.h	(revision 2262)
@@ -27,121 +27,148 @@
 
   // ---- Ajout de lignes
-  inline int    ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt) ); }  
-  inline int    ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
-			  PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt) ); }  
+  inline int    ElAddLine(double x1, double y1, double x2, double y2, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddLine(double x1, double y1, double x2, double y2, 
+			  PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt, 0, fgsc) ); }  
 
   // ---- Ajout de fleches 
-  inline int    ElAddArrow(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt) ); }  
-  inline int    ElAddArrow(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
-			   PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt) ); }  
+  inline int    ElAddArrow(double x1, double y1, double x2, double y2, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddArrow(double x1, double y1, double x2, double y2, 
+			   PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt, 0, fgsc) ); }  
 
   // ---- Ajout de marker 
-  inline int    ElAddMarker(PIGrCoord x, PIGrCoord y)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, 0, 0, NULL, gatt) ); }  
-  inline int    ElAddMarker(PIGrCoord x, PIGrCoord y, PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Mark, x, y, 0, 0, NULL, gatt) ); }  
+  inline int    ElAddMarker(double x, double y, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, 0, 0, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddMarker(double x, double y, PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Mark, x, y, 0, 0, NULL, gatt, 0, fgsc) ); }  
 
   // ---- Ajout de texte
-  inline int    ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt) ); }  
-  inline int    ElAddText(PIGrCoord x, PIGrCoord y, const char* s, 
-			  PIGraphicAtt const & gatt, unsigned long tpd)
-    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt, tpd) ); }  
-  inline int    ElAddText(PIGrCoord x, PIGrCoord y, string const & s)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt) ); }  
-  inline int    ElAddText(PIGrCoord x, PIGrCoord y, string const & s, 
-			  PIGraphicAtt const & gatt, unsigned long tpd)
-    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt, tpd) ); }  
+  inline int    ElAddText(double x, double y, const char* s, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt, 0, fgsc) ); }  
+  inline int    ElAddText(double x, double y, const char* s, 
+			  PIGraphicAtt const & gatt, unsigned long tpd, bool fgsc=false)
+    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt, tpd, fgsc) ); }  
+  inline int    ElAddText(double x, double y, string const & s, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt, 0, fgsc) ); }  
+  inline int    ElAddText(double x, double y, string const & s, 
+			  PIGraphicAtt const & gatt, unsigned long tpd, bool fgsc=false)
+    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt, tpd, fgsc) ); }  
+
+  // ---- Ajout de texte composite avec exposant - indice
+  inline int    ElAddCompText(double x, double y, string const& s, string const& s_up,
+			      string const& s_dn, unsigned long tpd=0, bool fgsc=false)
+    { PIGraphicAtt gatt; 
+      return( ElAdd(x, y, s.c_str(), gatt, s_up.c_str(), s_dn.c_str(), NULL, tpd, fgsc) ); } 
+  inline int    ElAddCompText(double x, double y, string const& s, PIGraphicAtt const & gatt,
+			      string const& s_up, string const& s_dn, 
+			      unsigned long tpd=0, bool fgsc=false)
+    { return( ElAdd(x, y, s.c_str(), gatt, s_up.c_str(), s_dn.c_str(), NULL, tpd, fgsc) ); } 
+  inline int    ElAddCompText(double x, double y, string const& s, PIGraphicAtt const & gatt,
+			      string const& s_up, string const& s_dn, PIGraphicAtt const & attss,
+			      unsigned long tpd=0, bool fgsc=false)
+    { return( ElAdd(x, y, s.c_str(), gatt, s_up.c_str(), s_dn.c_str(), &attss, tpd, fgsc) ); } 
+  
 
   // ---- Ajout de rectangles 
-  inline int    ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt) ); }  
-  inline int    ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
-			  PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt) ); }  
-
-  inline int    ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt) ); }  
-  inline int    ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
-			   PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt) ); }  
+  inline int    ElAddRect(double x, double y, double dx, double dy, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddRect(double x, double y, double dx, double dy, 
+			  PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt, 0, fgsc) ); }  
+
+  inline int    ElAddFRect(double x, double y, double dx, double dy, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddFRect(double x, double y, double dx, double dy, 
+			   PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt, 0, fgsc) ); }  
 
   // ---- Ajout de cercles
-  inline int    ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt) ); }  
-  inline int    ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt) ); }  
-
-  inline int    ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt) ); }  
-  inline int    ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt) ); }  
+  inline int    ElAddCirc(double x, double y, double r, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddCirc(double x, double y, double r, 
+			  PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt, 0, fgsc) ); }  
+
+  inline int    ElAddFCirc(double x, double y, double r, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt, 0, fgsc) ); }  
+  inline int    ElAddFCirc(double x, double y, double r, 
+			   PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt, 0, fgsc) ); }  
 
   // ---- Ajout d' arcs 
-  inline int    ElAddArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2,
-			 PIGrCoord x3, PIGrCoord y3)
-    { PIGraphicAtt gatt; PIGrCoord x[3], y[3]; 
-      x[0] = x1; x[1] = x2; x[2] = x3; 
-      y[0] = y1; y[1] = y2; y[2] = y3; 
-      return( ElAdd(PIDEL_Arc, x, y, 3, gatt) ); }  
-
-  inline int    ElAddArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2,
-			 PIGrCoord x3, PIGrCoord y3, PIGraphicAtt const & gatt)
-    { PIGrCoord x[3], y[3]; 
-      x[0] = x1; x[1] = x2; x[2] = x3; 
-      y[0] = y1; y[1] = y2; y[2] = y3; 
-      return( ElAdd(PIDEL_Arc, x, y, 3, gatt) ); }  
-
-  inline int    ElAddFArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2,
-			  PIGrCoord x3, PIGrCoord y3)
-    { PIGraphicAtt gatt; PIGrCoord x[3], y[3]; 
-      x[0] = x1; x[1] = x2; x[2] = x3; 
-      y[0] = y1; y[1] = y2; y[2] = y3; 
-      return( ElAdd(PIDEL_FArc, x, y, 3, gatt) ); }  
-
-  inline int    ElAddFArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2,
-			  PIGrCoord x3, PIGrCoord y3, PIGraphicAtt const & gatt)
-    { PIGrCoord x[3], y[3]; 
-      x[0] = x1; x[1] = x2; x[2] = x3; 
-      y[0] = y1; y[1] = y2; y[2] = y3; 
-      return( ElAdd(PIDEL_FArc, x, y, 3, gatt) ); }  
+  inline int    ElAddArc(double x1, double y1, double x2, double y2,
+			 double x3, double y3, bool fgsc=false)
+    { PIGraphicAtt gatt; double x[3], y[3]; 
+      x[0] = x1; x[1] = x2; x[2] = x3; 
+      y[0] = y1; y[1] = y2; y[2] = y3; 
+      return( ElAdd(PIDEL_Arc, x, y, 3, gatt, fgsc) ); }  
+
+  inline int    ElAddArc(double x1, double y1, double x2, double y2,
+			 double x3, double y3, PIGraphicAtt const & gatt, bool fgsc=false)
+    { double x[3], y[3]; 
+      x[0] = x1; x[1] = x2; x[2] = x3; 
+      y[0] = y1; y[1] = y2; y[2] = y3; 
+      return( ElAdd(PIDEL_Arc, x, y, 3, gatt, fgsc) ); }  
+
+  inline int    ElAddFArc(double x1, double y1, double x2, double y2,
+			  double x3, double y3, bool fgsc=false)
+    { PIGraphicAtt gatt; double x[3], y[3]; 
+      x[0] = x1; x[1] = x2; x[2] = x3; 
+      y[0] = y1; y[1] = y2; y[2] = y3; 
+      return( ElAdd(PIDEL_FArc, x, y, 3, gatt, fgsc) ); }  
+
+  inline int    ElAddFArc(double x1, double y1, double x2, double y2,
+			  double x3, double y3, PIGraphicAtt const & gatt, bool fgsc=false)
+    { double x[3], y[3]; 
+      x[0] = x1; x[1] = x2; x[2] = x3; 
+      y[0] = y1; y[1] = y2; y[2] = y3; 
+      return( ElAdd(PIDEL_FArc, x, y, 3, gatt, fgsc) ); }  
 
   // ---- Ajout de polygones 
-  inline int    ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Poly, x, y, gatt) ); }  
-  inline int    ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const & gatt)
-    { return( ElAdd(PIDEL_Poly, x, y, gatt) ); } 
+  inline int    ElAddPoly(vector<double>& x, vector<double>& y, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Poly, x, y, gatt, fgsc) ); }  
+  inline int    ElAddPoly(vector<double>& x, vector<double>& y, 
+			  PIGraphicAtt const & gatt, bool fgsc=false)
+    { return( ElAdd(PIDEL_Poly, x, y, gatt, fgsc) ); } 
  
-  inline int    ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
-    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FPoly, x, y, gatt) ); }  
-  inline int    ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const & gatt)
-
-    { return( ElAdd(PIDEL_FPoly, x, y, gatt) ); }  
+  inline int    ElAddFPoly(vector<double>& x, vector<double>& y, bool fgsc=false)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FPoly, x, y, gatt, fgsc) ); }  
+  inline int    ElAddFPoly(vector<double>& x, vector<double>& y, 
+			   PIGraphicAtt const & gatt, bool fgsc=false)
+
+    { return( ElAdd(PIDEL_FPoly, x, y, gatt, fgsc) ); }  
 
   void               ElDel(int id);
+  inline void        ElDelLast() { ElDel(mEn); }
   void               ElDelAll();
 
 protected:
-  int                ElAdd(int typ, PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
+  int                ElAdd(int typ, double x, double y, double dx, double dy, 
                            const char* s, PIGraphicAtt const & att,
-			   unsigned long txtposdir=0);
-  int                ElAdd(int typ, vector<PIGrCoord>& x, vector<PIGrCoord>& y, 
-			   PIGraphicAtt const & att);
-  int                ElAdd(int typ, PIGrCoord* x, PIGrCoord* y, int n,
-			   PIGraphicAtt const & att);
+			   unsigned long txtposdir, bool fgsc);
+  int		     ElAdd(double x, double y, const char* s, PIGraphicAtt const & att, 
+			   const char* s_up, const char* s_dn, PIGraphicAtt const * gass, 
+			   unsigned long tpd, bool fgsc);
+
+  int                ElAdd(int typ, vector<double>& x, vector<double>& y, 
+			   PIGraphicAtt const & att, bool fgsc);
+  int                ElAdd(int typ, double* x, double* y, int n,
+			   PIGraphicAtt const & att, bool fgsc);
 
   struct TxtEl {
     string txt;
     unsigned long txtpd;
+    string* txt_up;
+    string* txt_dn;
+    PIGraphicAtt* attss;
   };
 
   struct DrwEl{
     int eid, etyp;
-    PIGrCoord ex,ey;
-    PIGrCoord edx,edy;
+    double ex,ey;
+    double edx,edy;
     PIGraphicAtt gatt;
     TxtEl* es;
@@ -149,4 +176,5 @@
     PIGrCoord* ypol;
     int npol;
+    bool scc;  // true -> scale coordinate (user-coord : 0..1 1
   };
 
@@ -160,5 +188,5 @@
 {
 public:
-                     PIElDrawer();
+                     PIElDrawer(bool fgclip=true);
   virtual           ~PIElDrawer();
 
@@ -184,7 +212,8 @@
 // -- Pour compatibilite avec l'interface precedente , Reza 08/2002 
   inline void        ElDel(int id) { eltsMgr.ElDel(id); }
+  inline void        ElDelLast()   { eltsMgr.ElDelLast(); }
   inline void        ElDelAll()    { eltsMgr.ElDelAll(); }
   
-  inline int	     ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
+  inline int	     ElAddText(double x, double y, const char* s)
                                    { return eltsMgr.ElAddText(x, y, s); }
 
@@ -197,5 +226,5 @@
   PIGraphicAtt labelAtt;       // Attributs graphiques de trace de label d'axes
   bool showAxesLabels;         // Affichage des labels d'axes si true
-
+  bool fgClip;                 // Si true, appel a PIGraphicUC::Clip() ds Draw()
 };
 
Index: /trunk/SophyaPI/PI/pigraphgen.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.cc	(revision 2261)
+++ /trunk/SophyaPI/PI/pigraphgen.cc	(revision 2262)
@@ -7,4 +7,5 @@
 #include "pigraphgen.h"
 #include <math.h>
+#include <iostream.h>
 #include "ucckprot.h"
 
Index: /trunk/SophyaPI/PI/piimage.cc
===================================================================
--- /trunk/SophyaPI/PI/piimage.cc	(revision 2261)
+++ /trunk/SophyaPI/PI/piimage.cc	(revision 2262)
@@ -46,5 +46,6 @@
 //	* <Alt>P : Active/désactive l'affichage de l'indicateur de la postion du pavé
 //	* <Alt>X : Active/désactive l'affichage des coupes X,Y
-//	* <Alt>Z : Supprime les textes et signes ajoutés au dessin.
+//	* <Alt>Z : Supprime les élément graphiques ajoutés au dessin.
+//	* <Alt>E : Supprime le dernier élément graphique ajouté.
 //	* <Alt>+ <Cntl>+ : Augmentation du facteur de zoom
 //	* <Alt>- <Cntl>- : Diminution du facteur de zoom
@@ -137,5 +138,5 @@
 zmgv = 1;
 
-mdrw = new PIElDrawer();
+mdrw = new PIElDrawer(false);
 gvdrw = new PIElDrawer();
 AddDrawer(mdrw, true, false, false);
@@ -700,4 +701,5 @@
   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 == 'E' || key == 'e') { mdrw->ElDelLast();  Refresh(); } // Pour supprimer le dernier element ajoute
   else if (key == 'O' || key == 'o') PIImgTools::ShowPIImgTools();   // Fentre LUT et options 
   else if (key == 'G' || key == 'g') {   // Fentre attributs graphiques 
Index: /trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 2261)
+++ /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 2262)
@@ -37,5 +37,6 @@
 //	sur l'objet à la position courante.
 //	* <Alt>I : Affiche et met a jour la fenetre Texte-Info .
-//	* <Alt>Z : Supprime les textes et signes ajoutés au dessin.
+//	* <Alt>Z : Supprime les élément graphiques ajoutés au dessin.
+//	* <Alt>E : Supprime le dernier élément graphique ajouté.
 //      * <Alt>P : fenetre des options de drawing des contours 
 //--
@@ -87,5 +88,5 @@
   mPosFDX = mPosFDY = 0;
 
-  mBDrw = new PIElDrawer;
+  mBDrw = new PIElDrawer(false);
   mBDrw->SetName("AxesDrw");
   SetLimits(-1.,1.,-1.,1.,kAxeDirLtoR,kAxeDirDownUp);
@@ -134,4 +135,5 @@
   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 == 'E' || key == 'e') { mBDrw->ElDelLast();  Refresh(); } // Pour supprimer le dernier element ajoute
   else if (key == 'O' || key == 'o') { // fenetre des options de controle du drawer actif
     PIDrawer* actdrw = GetActiveDrawer();
Index: /trunk/SophyaPI/PI/piversion.h
===================================================================
--- /trunk/SophyaPI/PI/piversion.h	(revision 2261)
+++ /trunk/SophyaPI/PI/piversion.h	(revision 2262)
@@ -2,5 +2,5 @@
 #define PIVERSION_H_SEEN
 
-#define PI_VERSIONNUMBER  3.85
+#define PI_VERSIONNUMBER  3.90
 
 #endif
