Index: trunk/SophyaPI/PI/pi3ddrw.cc
===================================================================
--- trunk/SophyaPI/PI/pi3ddrw.cc	(revision 157)
+++ trunk/SophyaPI/PI/pi3ddrw.cc	(revision 158)
@@ -92,7 +92,12 @@
 PIDraw3DWdg::PIDraw3DWdg(PIContainerGen *par, char *nom, int sx, int sy, int px, int py)
         : PIBaseWdg(par, nom, sx, sy, px, py)
-{
+{  
   vfixed = false;
+//  SetDefaultDrawRectangle(0.12, 0.12, 0.88, 0.88, true);
   SetDefaultDrawRectangle(0., 0., 1., 1., true);
+  mBDrw = new PIElDrawer;
+  mBDrw->SetLimits(0.12,0.88, 0.12,0.88, kAxeDirLtoR,kAxeDirDownUp);
+  AddDrawer(mBDrw, 0.12, 0.12, 0.88, 0.88, true, false, false);
+  mPx = mPy = 0;
 
   lPx = lPy = 0;
@@ -100,4 +105,5 @@
   cTeta = cPhi = 0.;  cUlen = 1.;
 
+  ActivateKeyboard();
   ActivateButton(2);    //  Pour pouvoir tourner la camera
   ActivateMove(2);      
@@ -112,4 +118,5 @@
 PIDraw3DWdg::~PIDraw3DWdg()
 {
+  delete mBDrw;
   delete mGr3d;
 }
@@ -171,4 +178,5 @@
   else Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
   Refresh();
+  mBDrw->Refresh();  // ? Pour reecrire par-dessus ce qui a ete efface 
 }
 
@@ -236,4 +244,29 @@
 
 /* --Methode-- */
+void PIDraw3DWdg::Keyboard(int key, PIKeyModifier kmod)
+{
+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') { 
+    PIDrwTools::SetCurrentBaseWdg(this);
+    PIDrwTools::ShowPIDrwTools();   // Fentre axes et options de trace
+    }
+  }
+}
+/* --Methode-- */
+void PIDraw3DWdg::PasteSelection(unsigned int typ, void *pdata, unsigned int l)
+{
+if (typ != PICP_string) return;
+int ll = (l<256) ? l+1 : 256;
+char pc[256];
+strncpy(pc, (char*)pdata, ll-1);  pc[ll-1] = '\0';
+// printf("PIDraw3DWdg::PasteSelection() / Debug  %s - %d %d -> %g %g \n", pc, 
+//        mPx, mPy, (float)mPx/(float)XSize(), 1.-(float)mPy/(float)YSize());
+mBDrw->ElAddText((float)mPx/(float)XSize(), 1.-(float)mPy/(float)YSize(), pc );
+mBDrw->Refresh();
+}
+
+/* --Methode-- */
 void PIDraw3DWdg::But2Press(int x, int y)
 {
@@ -247,13 +280,19 @@
   lPx = x;  lPy = y;
 
-// Pour savoir si on se trouve ds la zone centrale     
+// Pour savoir si on se trouve ds la zone centrale   
   int czx = XSize()/10;
   int czy = YSize()/10;
-  int dmix = x-XSize()/2;
-  int dmiy = y-YSize()/2;
-  if (dmix < 0) dmix = -dmix;
-  if (dmiy < 0) dmiy = -dmiy;
-  if ((dmix < czx) && (dmiy < czy))  rOfg = true;
-  else rOfg = false;
+  PIKeyModifier kmod;
+  unsigned long tm;
+  GetLastEventInfo(kmod, tm);
+  rOfg = false;
+  if (kmod ==  PIKM_Shift)  rOfg = true;
+  else {
+    int dmix = x-XSize()/2;
+    int dmiy = y-YSize()/2;
+    if (dmix < 0) dmix = -dmix;
+    if (dmiy < 0) dmiy = -dmiy;
+    if ((dmix < czx) && (dmiy < czy))  rOfg = true;
+    }
 
   cUlen = 0.5*(dax+day)*co*0.3;    cDax = dax;   cDay = day;  clCO = co; 
@@ -319,4 +358,5 @@
   SetDrawers3DView();
   Refresh();
+  mBDrw->Refresh();
 }
 
@@ -382,4 +422,5 @@
   SetDrawers3DView();
   Refresh();
+  mBDrw->Refresh();
 }
 
@@ -421,4 +462,5 @@
   Send(Msg(), PIMsg_Active);
   PIDrwTools::SetCurrentBaseWdg(this);
+  mPx = x;  mPy = y;
   if ( (x > 50) || ( y > 50) ) return; 
   Update3DView();
Index: trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- trunk/SophyaPI/PI/pi3ddrw.h	(revision 157)
+++ trunk/SophyaPI/PI/pi3ddrw.h	(revision 158)
@@ -1,2 +1,3 @@
+// This may look like C code, but it is really -*- C++ -*-
 // Module PI : Peida Interactive PIDrawer3D PIDraw3DWdg
 // Drawer et DrawWidget 3D       R. Ansari 06/98
@@ -14,5 +15,6 @@
 #include <list>
 
-// Traceur (Drawer) 3D 
+// -----------------  Traceur (Drawer) 3D  -------------------
+
 class PIDrawer3D : public PIDrawer
 {
@@ -40,4 +42,5 @@
 
 
+//------------------------------ Classe PIDrawer3D --------------------
 
 class PIDraw3DWdg : public PIBaseWdg {
@@ -50,4 +53,5 @@
   virtual long		kind() {return ClassId; }
 
+
   virtual void		Set3DView_Obs(float xo, float yo, float zo, float teta, float phi, float psi, 
                                       float dax, float day, float co, float dco=0.2);
@@ -58,4 +62,9 @@
 
   virtual void          Update3DView();   // Vue 3-D a partir de Drawer No 1
+
+  inline void	     	SetTitles(const char* tt=NULL, const char* tb=NULL)
+                                  { mBDrw->SetTitles(tt, tb); }
+  inline void	     	SetTitles(string const & tt, string const & tb)
+                                  { mBDrw->SetTitles(tt, tb); }
 
   int                   AddDrawer3D(PIDrawer3D*, bool ad=false);   // Ajoute un Drawer 
@@ -75,4 +84,7 @@
   virtual void		Ptr3Move(int x, int y);
 
+  virtual void 		Keyboard(int key, PIKeyModifier kmod);
+  virtual void 		PasteSelection(unsigned int typ, void *pdata, unsigned int l);
+
 
 protected :
@@ -80,4 +92,7 @@
   virtual void		DrawXYZAxes();
 
+  PIElDrawer* mBDrw;   // Objet traceur d'elements de fond
+  int mPx, mPy;        // Position pointeur - Bouton-1 
+  
   bool vfixed;       // SetView fait ou pas
   list<int> m3DrIl;  // Liste des Id drawers 3D 
Index: trunk/SophyaPI/PI/pibwdggen.cc
===================================================================
--- trunk/SophyaPI/PI/pibwdggen.cc	(revision 157)
+++ trunk/SophyaPI/PI/pibwdggen.cc	(revision 158)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIBaseWdg
+// Classe de base pour nouvelles composantes graphiques  96
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdio.h>
 
@@ -6,5 +10,84 @@
 #include "pidrwtools.h"
 
-// Les methodes de la classe  PIBWdgGen
+
+//++
+// Class	PIBaseWdg
+// Lib		PI
+// include	pibwdggen.h
+//
+//   	Classe de base pour la création de nouvelles composantes graphiques.
+//	Le traitement des événements liés à l'écran, clavier, souris se fait
+//	à travers des méthodes de cette classe : "Resize()", "But1Press()", ...
+//	La classe "PIBaseWdg" supporte en outre un mécanisme permettant
+//	d'associer un ou plusieurs objets traceur (*Drawer*) capables 
+//	de se dessiner dans la fenêtre associée à l'objet.
+//	La classe "PIBaseWdgGen" définit l'interface et ne peut pas être instanciée 
+//	directement (Méthodes virtuelles pures). Les objets instanciés sont de la 
+//	classe "PIBaseWdg" et le fichier entête correspondant est "PIBWDG_H"
+//	défini dans "pisysdep.h".
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+//++
+// Links	Voir aussi
+// PIGraphic
+// PIDrawer
+//--
+
+// ---------- Les methodes de la classe  PIBWdgGen ------------
+
+//++
+// Titre	Constructeur
+//--
+//++
+//  PIBaseWdgGen(PIContainerGen *par, char *nom, int sx=10, int sy=10, int px=0, int py=0)
+//	Création d'un objet contenu dans l'objet *PIContainer* "par", de
+//	taille "sx,sy", se trouvant à la position "px,py" avec le nom "nom"	
+//--
+
+//++
+// Titre	Méthodes
+//--
+//++
+// void  SetBackgroundColor(PIColors col=PI_White)
+//	Choix de la couleur de fond.
+// void  EraseWindow(int x0=0, int y0=0, int dx=0, int dy=0) 
+//	Efface la zone rectangulaire définie par le coin "(x0,y0)" ,
+//	de taille "dx,dy" à l'aide de la couleur de fond.
+// void  SelPointerShape(PIPointer ptr=PI_ArrowPointer) 
+//	Choix de la forme du pointeur (souris) pour la fenêtre 
+//	associée à l'objet.
+//|	PI_ArrowPointer, PI_CrossPointer, PI_HandPointer, PI_TDLRArrowPointer
+// PIColors  GetBackgroundColor()
+//	Renvoie la couleur de fond
+// PIPointer  GetPointerShape() 
+//	Renvoie la forme du pointeur
+// void  Refresh()
+//	L'appel à cette méthode permet de retracer le contenu de la 
+//	fenêtre et des "Drawer" associés.
+//--
+
+//++
+// Titre	Activation du traitement des événements
+//--
+//++
+// void  ActivatePtrCross()
+//	Active l'appel aux méthodes "Enter()" et "Leave()" lorsque la souris
+//	rentre ou sort de la fenêtre correspondante à l'objet
+// void  ActivateButton(int b)
+//	Active l'appel aux méthodes "ButbPress()" et "ButxRelease()" pour
+//	le bouton "b" de la souris ("b=1,2,3")
+// void  ActivateMove(int b) 
+//	Active l'appel aux méthodes "PtrbMove()" lors des mouvements de
+//	la souris avec le bouton "b" enfoncé ("b=1,2,3")
+//	L'appel avec "bid=0" active l'appel à la méthode "PtrMove()"
+//	Lors des mouvements de souris sans bouton enfoncé.
+// void  ActivateKeyboard()
+//	Active l'appel à la méthode "Keyboard()" lors de l'appui sur les 
+//	touches du clavier.
+//--
+
  
 /* --Methode-- */
@@ -42,4 +125,51 @@
 
 
+//++
+// Titre	Gestion des événements
+//--
+//++
+// void  Draw(PIGraphic* g, int x0, int y0, int dx, int dy)
+//	Méthode appelée lorsqu'il faut redessiner tout ou partie de
+//	la fenêtre. La zone a rafraîchir est determinée par 
+//	"(x0,y0)", "dx,dy" et "g" est l'objet "PIGraphic" 
+//	qui doit être utilisé.
+//	Cette méthode ne doit pas être appelé directement. 
+//	Pour rafraîchir le contenu de la fenêtre, il faut appeler
+//	la méthode "Refresh()"
+// void  Resize()
+//	Méthode appelée lorsque la taille de l'objet est modifiée.
+//	"XSize()", "YSize()" fournissent la nouvelle taille de l'objet.
+// void  Enter()
+//	Méthode appelée lorsque le pointeur rentre dans la fenêtre
+//	(Si "ActivatePtrCross()" a été appelé )
+// void  Leave()
+//	Méthode appelée lorsque le pointeur quitte la fenêtre
+//	(Si "ActivatePtrCross()" a été appelé )
+// void  ButbPress(int x, int y)  (b=1,2,3)
+//	Méthode appelée lorsque le bouton "b=1,2,3" de la souris est enfoncé.
+//	"x,y" : Position de la souris
+//	(Si "ActivateButton(b)" a été appelé )
+// void  ButbRelease(int x, int y)   (b=1,2,3)
+//	Méthode appelée lorsque le bouton "b=1,2,3" de la souris est relaché.
+//	"x,y" : Position de la souris
+//	(Si "ActivateButton(b)" a été appelé )
+// void  PtrMove(int x, int y)
+//	Méthode appelée lors des mouvements de la souris. "x,y" : Position de la souris
+//	(Si "ActivateMove(0)" a été appelé )
+// void  PtrbMove(int x, int y)     (b=1,2,3)
+//	Méthode appelée lors des mouvements de la souris, avec le 
+//	bouton "b=1,2,3" appuyé. "x,y" : Position de la souris
+//	(Si "ActivateMove(b)" a été appelé )
+// void  Keyboard(int key, PIKeyModifier kmod)
+//	Méthode appelée en réponse à des actions sur le clavier.
+//	"key" est le code ASCII de la touche enfoncé - "kmod" indique
+//	si des touches speciaux étaient enfoncés en même temps.
+//|	kmod =  PIKM_Blank |  PIKM_Shift | PIKM_Alt | PIKM_Cntl
+//	Des constantes ont été définis pour certaines touches particulières
+//|	PIK_Return , PIK_Enter , PIK_BackSpace, PIK_Delete
+//|	PIK_Tab , PIK_Escape , PIK_Up , PIK_Down, 
+//|	PIK_Right , PIK_Left , PIK_Previous , PIK_Next
+//--
+
 /* --Methode-- */
 void PIBaseWdgGen::Draw(PIGraphic* g, int x0, int y0, int dx, int dy)
@@ -124,4 +254,12 @@
 }
 
+/* --Methode-- */
+void PIBaseWdgGen::PtrMove(int /*x*/, int /*y*/)
+{
+#ifdef DEBUG_RZXB
+printf ("Debug_PIBaseWdgGen::PtrMove PosX,Y= %d %d \n", x, y);
+#endif
+return;
+}
 
 /* --Methode-- */
@@ -167,4 +305,21 @@
 }
 
+//++
+// Titre	Gestion des traceurs (PIDrawer)
+//	Un même "PIDrawer" peut être attaché simultanement à plusieurs "PIBaseWdg", ainsi
+//	que plusieurs fois au même "PIBaseWdg", avec des identificateurs différents.
+//--
+//++
+// void  SetDefaultDrawRectangle(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, bool psz=true)
+//	Définition du rectangle d'attachement par défaut. "(x1,y1)" et "(x2,y2)" determinent
+//	les positions des deux coins opposés.
+//	si "psz=true", les coordonnées sont supposées être des facteurs multiplicatifs 
+//	des dimensions de l'objet.
+// void  SetDefaultDrawerLimits(float xmin, float xmax, float ymin, float ymax, -
+//                              int axrl=kAxeDirSame, int ayud=kAxeDirSame)
+//	Définition du système de coordonnées par défaut d'un drawer attaché en "autolim=true"
+//
+//--
+
 /* --Methode-- */
 void PIBaseWdgGen::SetDefaultDrawRectangle(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, bool psz)
@@ -183,4 +338,24 @@
 }
 
+
+//++
+// int  AddDrawer(PIDrawer* drw, PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, -
+//                bool psz=true, bool clip=true, bool ad=false)
+//	Attachement d'un "PIDrawer" au rectangle défini les coordonnées des deux coins opposés.
+//	si "psz=true", les coordonnées sont supposées être des facteurs multiplicatifs 
+//	des dimensions de l'objet.
+//	si "clip=true", "PIDrawer* drw" ne peut dessiner en dehors de son rectangle
+//	d'attachement.
+//	si "ad=true", le "PIDrawer* drw" est détruit lors de la destruction de l'objet PIBaseWdg.
+//	La méthode retourne l'identificateur du drawer attaché.
+// int  AddDrawer(PIDrawer* drw, bool autolim=false, bool clip=true, bool ad=false)
+//	Ajout d'un "PIDrawer" au rectangle d'attachement par défaut. 
+//	Si "autolim=true", l'objet "PIBaseWdg" impose l'espace de coordonnées utilisateur
+//	à l'aide des valeurs définies par "SetDefaultDrawerLimits()".
+//	Si ""clip=true", "PIDrawer* drw" ne peut dessiner en dehors de son rectangle 
+//	d'attachement.
+//	si "ad=true", le "PIDrawer* drw" est détruit lors de la destruction de l'objet PIBaseWdg.
+//	La méthode retourne l'identificateur du drawer attaché.
+//--
 
 /* --Methode-- */
@@ -220,4 +395,14 @@
 
 
+//++
+// void  MoveResizeDrawer(int id, PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, bool psz=true)
+//	Modification du rectangle d'attachement du PIDrawer avec l'identificateur "id" , retourné
+//	par "AddDrawer()"
+// void  RemoveDrawer(int id)
+//	Ote le drawer "id" de la liste
+// void  DeleteDrawers()
+//	Ote tous les drawers de la liste. Détruit ceux ajoutés avec l'option "ad=true" 
+//--
+
 /* --Methode-- */
 void PIBaseWdgGen::MoveResizeDrawer(int id,  PIGrCoord x1, PIGrCoord y1,  PIGrCoord x2, PIGrCoord y2, bool psz)
@@ -257,4 +442,13 @@
 }
 
+//++
+// int  NbDrawers()
+//	Retourne le nombre de PIDrawer attachés
+// PIDrawer*  GetDrawerId(int id)
+//	Retourne le PIDrawer avec l'identificateur id
+// PIDrawer*  GetDrawer(int n)
+//	Retourne le PIDrawer "n=0..NbDrawers()-1" de la liste
+//--
+
 /* --Methode-- */
 int PIBaseWdgGen::NbDrawers()
@@ -280,4 +474,11 @@
 }
 
+
+//++
+// void  CallDrawers(PIGraphic* g, int x0=0, int y0=0, int dx=0, int dy=0)
+//	Appel de la méthode de tracé pour tous les Drawers
+// void  CallDrawer(int id);
+//	Appel de la méthode de tracé pour le drawer avec l'identificateur "id"
+//--
 
 /* --Methode-- */
Index: trunk/SophyaPI/PI/pibwdggen.h
===================================================================
--- trunk/SophyaPI/PI/pibwdggen.h	(revision 157)
+++ trunk/SophyaPI/PI/pibwdggen.h	(revision 158)
@@ -15,10 +15,10 @@
 enum PIKeyModifier { PIKM_Blank = 0, PIKM_Shift = 1, PIKM_Alt = 2, PIKM_Cntl = 4 } ; 
 
-enum PIKeyValues { PIK_Return = 1+0x2000, PIK_Enter = 2+0x2000 , 
-                   PIK_BackSpace = 3+0x2000, PIK_Delete = 4+0x2000,
-                   PIK_Tab = 5+0x2000, PIK_Escape = 6+0x2000, 
-                   PIK_Up = 11+0x2000, PIK_Down = 12+0x2000, 
-                   PIK_Right = 13+0x2000, PIK_Left = 14+0x2000,
-                   PIK_Previous = 21+0x2000, PIK_Next = 22+0x2000  } ; 
+enum PIKeyValues { PIK_Return = 0xFF0D, PIK_Enter = 0xFF8D , 
+                   PIK_BackSpace = 0xFF08, PIK_Delete = 0xFFFF,
+                   PIK_Tab = 0xFF09, PIK_Escape = 0xFF1B, 
+                   PIK_Up = 0xFF52, PIK_Down = 0xFF54, 
+                   PIK_Right = 0xFF53, PIK_Left = 0xFF51,
+                   PIK_Previous = 0xFF55, PIK_Next = 0xFF56  } ; 
 
 
@@ -70,8 +70,12 @@
   virtual void       But3Press(int x, int y);
   virtual void       But3Release(int x, int y);
+  virtual void       PtrMove(int x, int y);
   virtual void       Ptr1Move(int x, int y);
   virtual void       Ptr2Move(int x, int y);
   virtual void       Ptr3Move(int x, int y);
   virtual void       Keyboard(int key, PIKeyModifier kmod);
+
+// Acces aux caracteristiques du dernier evenement 
+  virtual void       GetLastEventInfo(PIKeyModifier& kmod, unsigned long& tm) = 0;
 
 // PostScript output
Index: trunk/SophyaPI/PI/pibwdgx.cc
===================================================================
--- trunk/SophyaPI/PI/pibwdgx.cc	(revision 157)
+++ trunk/SophyaPI/PI/pibwdgx.cc	(revision 158)
@@ -1,2 +1,7 @@
+// This may look like C code, but it is really -*- C++ -*-
+// Module PI : Peida Interactive      PIBaseWdg
+//                                    Reza 95-96
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdio.h>
 
@@ -29,4 +34,6 @@
 
 Init();
+mWGrC = NULL; // PIGraphic (Contexte graphique) associe a la fenetre
+finishDone = false;     // FinishCreate() pas encore appele
 
 CreateXtWdg(nom, piXtBaseWidgetClass, NULL, sx, sy, px, py);
@@ -42,7 +49,8 @@
 mPtrS = PI_CrossPointer;
 SelPointerShape();
-
+// PIGraphic (Contexte graphique) associe a la fenetre
+// Si pas cree par FinishCreate()
+if (!mWGrC) mWGrC = new PIGraphicX(this);   
 Manage();
-mWGrC = new PIGraphicX(this);   // PIGraphic (Contexte graphique) associe a la fenetre
 }
 
@@ -63,4 +71,8 @@
 void PIBaseWdgX::FinishCreate()
 {
+if (finishDone) { 
+  fprintf(stderr, "BUG/PIBaseWdgX::FinishCreate() multiple call \n"); 
+  return; 
+  }
 // appele par la fenetre mere, apres XtRealize()
 // J'active le backing store pour la fenetre X
@@ -80,5 +92,16 @@
 // XChangeWindowAttributes(PIXDisplay(), XtWindow(XtWdg()), CWBackingPlanes|CWBackingStore, &xswa);
 XChangeWindowAttributes(PIXDisplay(), mwi, CWBackingStore, &xswa);
+
+// PIGraphic (Contexte graphique) associe a la fenetre
+if (!mWGrC) mWGrC = new PIGraphicX(this);   
+mWGrC->TerminateInit();
+finishDone = true;     // FinishCreate() fait
 } 
+
+/* --Methode-- */
+bool PIBaseWdgX::IsVisible()
+{
+return (finishDone && PIWdg::IsVisible() ); 
+}
 
 /* --Methode-- */
@@ -114,6 +137,9 @@
 unsigned long evtmask ;
 
-if ( (bid < 1) && (bid > 3) ) return; 
-if (bid == 1)  evtmask = Button1MotionMask | PointerMotionHintMask ;
+// bid == 0  -> PointerMove sans bouton 
+if ( (bid < 0) && (bid > 3) ) return; 
+
+if (bid == 0) evtmask = PointerMotionHintMask ;
+else if (bid == 1) evtmask = Button1MotionMask | PointerMotionHintMask ;
 else if (bid == 2) evtmask = Button2MotionMask | PointerMotionHintMask ;
 else if (bid == 3) evtmask = Button3MotionMask | PointerMotionHintMask ;
@@ -177,4 +203,17 @@
 }
 
+/* --Methode-- */
+void PIBaseWdgX::GetLastEventInfo(PIKeyModifier& kmod, unsigned long& tm)
+{
+unsigned int st;
+Time t;
+PIXGetLastEventInfo(st, t);
+tm = t;
+kmod = PIKM_Blank;
+if  (st & ShiftMask)   kmod = (PIKeyModifier) (kmod | PIKM_Shift);
+if  (st & ControlMask) kmod = (PIKeyModifier) (kmod | PIKM_Cntl);
+if  (st & Mod1Mask)    kmod = (PIKeyModifier) (kmod | PIKM_Alt);
+return;
+}
 
 static bool fgbwdg = false ;
Index: trunk/SophyaPI/PI/pibwdgx.h
===================================================================
--- trunk/SophyaPI/PI/pibwdgx.h	(revision 157)
+++ trunk/SophyaPI/PI/pibwdgx.h	(revision 158)
@@ -1,2 +1,7 @@
+// This may look like C code, but it is really -*- C++ -*-
+// Module PI : Peida Interactive      PIBaseWdg
+//                                    Reza  95-96
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PIBWDGX_H_SEEN
 #define PIBWDGX_H_SEEN
@@ -6,4 +11,5 @@
 
 #include "pigraphx.h"
+            
 #include "pigraphps.h"
 
@@ -34,4 +40,10 @@
   virtual void       AssignKeyboard();
 
+// Acces aux caracteristiques du dernier evenement 
+  virtual void       GetLastEventInfo(PIKeyModifier& kmod, unsigned long& tm);
+
+// On redefinit IsVisible() pour tenir compte de l appel a FinsihCreate  
+  virtual bool       IsVisible();
+
 //  Appel depuis le PIXtBaseWidget uniquement (ExposeEvt de Xt )
   virtual void       eXposeProcess(int x0, int y0, int dx, int dy);
@@ -41,4 +53,5 @@
   PIPointer mPtrS;
   PIColors mBCol;
+  bool finishDone;       // Si FinsihCreate appele
 };
 
Index: trunk/SophyaPI/PI/picons.cc
===================================================================
--- trunk/SophyaPI/PI/picons.cc	(revision 157)
+++ trunk/SophyaPI/PI/picons.cc	(revision 158)
@@ -586,5 +586,6 @@
 int x,y;
 
-// printf("PIConsole::DisplayLines(%d %d ) \n ", l1, l2);
+// DBG printf("PIConsole::DisplayLines(%d %d ) -> %d - %lx \n ", l1, l2, 
+//            (int)IsVisible(), (long)XtWindow(XtWdg()));
 
 if (! IsVisible() )   return;
Index: trunk/SophyaPI/PI/picontainergen.cc
===================================================================
--- trunk/SophyaPI/PI/picontainergen.cc	(revision 157)
+++ trunk/SophyaPI/PI/picontainergen.cc	(revision 158)
@@ -4,4 +4,6 @@
 //                  E.Aubourg , R. Ansari  96 - 98
 // LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
+#include <stdio.h>
 
 #include "picontainergen.h"
@@ -15,5 +17,10 @@
 //	organise la hiérarchie des objets "PIWdg" et donc aussi des "PIMsgHandler",
 //	contrôle la géométrie des objets "PIWdg" contenus, ainsi que leur 
-//	visibilité et activité. La classe "PIContainer" est une des 
+//	visibilité et activité. Le positionnement initial est controle par
+//	un objet *PILayoutMgr* qui peut eventuellement modifier la postion
+//	ou la taille de l'objet "PIWdg" ajouté. Les attributs d'attachement
+//	de l'objet ("PIWdg::SetBinding()") contrôle le repositionnement
+//	lors du changement de taille du "PIContainer".
+//	La classe "PIContainer" est une des 
 //	classes de PI qui ont une implementation dépendante du systeme utilisé
 //	(Mac, XWindow, ...). La classe "PIContainerGen" est la classe qui
@@ -26,4 +33,8 @@
 // Links	Parents
 // PIWdg
+//--
+//++
+// Links	Voir aussi
+// PILayoutMgr
 //--
 //++
@@ -43,4 +54,13 @@
 //--
 //++
+// void SetLayoutMgr(PILayoutMgr* nlay)
+//	Permet de changer le gestionnaire de positions ("PILayoutMgr") du conteneur,
+//	et donc la stratégie de positionnement des objets "PIWdg" fils. 
+//	le LayoutMgr par défaut n'applique aucune contrainte sur la position
+//	ou la taille des objets ajoutés.
+//	Cette méthode ne peut être appelé que pour un conteneur vide (sans PIWdg fils).
+//	Il est conseillé de l'appeler juste après la création du "PIContainer"
+// PILayoutMgr* GetLayoutMgr()
+//	Retourne le gestionnaire de positions/tailles du conteneur.
 // void Show()
 //	Rend l'objet visible à l'écran. Tous les objets "PIWdg" contenus et qui sont dans 
@@ -50,11 +70,26 @@
 // void  PSPrint(PSFile *psf, int ofx=0, int ofy=0)
 //	Appelle la méthode "PSPrint()" pour tous les objets contenus.
-// void  SetAutoDelChilds(bool ad = false)
+// void  SetAutoDelChilds(bool ad = true)
 //	Contrôle le comportement de l'objet conteneur vis à vis des objets
 //	contenus lors de la destruction. si "ad=true", les objets contenus 
 //	sont détruits lors de l'appel du destructeur de l'objet conteneur. 
-//--
-
-#define NCHALGRP 8
+// int  NbChilds()
+//	Retourne le nombre de "PIWdg" contenus.
+// PIWdg* GetChild(int n)
+//	Retourne le "PIWdg" numéro "n" (0..NbChilds()-1) 
+//--
+//++
+// Titre 	Méthodes particulières
+//	Les méthodes ci-dessous ne doivent pas être appelées directement.
+//--
+//++
+// void ChildAdd(PIWdg* child)
+//	Méthode qui est appelée lors de l'attachement d'un nouvel objet (création)
+//	Appelle la méthode correspondante du "PILayoutMgr"
+// void ChildAdd(PIWdg* child)
+//	Méthode qui est appelée lors du détachement d'un objet (destruction)
+//	Appelle la méthode correspondante du "PILayoutMgr"	
+//--
+
 
 /* --Methode-- */
@@ -63,16 +98,156 @@
 : PIWdg(par, nom, sx, sy, px, py)  
 {
+stvis = false;
+stfcr = false;
+layout = new PILayoutMgr;
+layout->SetContainer(this); 
+}
+
+
+/* --Methode-- */
+PIContainerGen::~PIContainerGen()
+{
+delete layout;
+}
+
+/* --Methode-- */
+void PIContainerGen::SetLayoutMgr(PILayoutMgr* nlay)
+{
+if (nlay == NULL) return;
+if (NbChilds() > 0) {
+  fprintf(stderr, "PIContainerGen::SetLayoutMgr()/ Error! Container has childs (N = %d) \n", NbChilds()); 
+  return;
+  }
+delete layout;
+layout = nlay;
+layout->SetContainer(this); 
+}
+
+/* --Methode-- */
+void PIContainerGen::PSPrint(PSFile *psf, int ofx, int ofy)
+{
+int i;
+if (!psf)  return;
+if (!Visible())  return;
+for(i=0; i<NbChilds(); i++)  GetChild(i)->PSPrint(psf, ofx+XPos(), ofy+YPos()); 
+return;
+}
+
+/* --Methode-- */
+void PIContainerGen::Show()
+{
+stvis = true;
+Manage();
+return;
+}
+
+/* --Methode-- */
+void PIContainerGen::Hide()
+{
+stvis = false;
+UnManage();
+return;
+}
+
+/* --Methode-- */
+bool PIContainerGen::Visible()
+{
+if (Parent())  return(stvis && Parent()->Visible());
+else return(stvis && IsVisible());
+}
+
+/* --Methode-- */
+void PIContainerGen::ChildAdd(PIWdg* child)
+{
+layout->ChildAdd(child);
+// Reza 13/10/98 : il faut que child->FinishCreate() 
+// soit appele pour les PIWdg ajoute quand le  container est deja affiche et son FinishCreate() appele
+if (stfcr)  child->FinishCreate(); 
+return;
+}
+
+/* --Methode-- */
+void PIContainerGen::ChildDel(PIWdg* child)
+{
+layout->ChildDel(child);
+}
+
+/* --Methode-- */
+int PIContainerGen::NbChilds()
+{
+return(layout->NbChilds());
+}
+
+/* --Methode-- */
+PIWdg* PIContainerGen::GetChild(int n)
+{
+return(layout->GetChild(n));
+}
+
+/* --Methode-- */
+void PIContainerGen::SetAutoDelChilds(bool ad)
+{
+layout->SetAutoDelChilds(ad) ;
+}
+
+
+/* --Methode-- */
+void PIContainerGen::FinishCreate()
+{
+if (stfcr)  return;
+int k;
+for(k=0; k<NbChilds(); k++)  GetChild(k)->FinishCreate();
+stfcr = true;
+}
+
+
+// ------------------------------------------------------------------
+//  Classe PILayoutMgr (Gestionnaire de positions/tailles PIWdg fils
+// ------------------------------------------------------------------
+//++
+// Class	PILayoutMgr
+// Lib		PI
+// include	picontainergen.h
+//
+//	Classe de gestionnaire de positions/tailles initiales des "PIWdg"
+//	fils pour les "PIContainer".
+//	La classe de base n'impose aucune contrainte sur les positions/tailles.
+//--
+//++
+// Links	Voir
+// PIContainer
+//--
+
+//++
+// Titre	Constructeur, méthodes
+//--
+//++
+// PILayoutMgr()
+//	Constructeur
+// void ChildAdd(PIWdg* child)
+//	Méthode appelé lors de l'ajout d'un nouveau "PIWdg" au conteneur.
+// void ChildDel(PIWdg* child)
+//	Méthode appelé lors de la suppression d'un "PIWdg"
+// int  NbChilds() 
+//	Nombre de "PIWdg" gérés.
+// PIWdg* GetChild(int n)
+//	Retourne l'objet "PIWdg" numéro "n"
+//--
+
+#define NCHALGRP 8
+
+/* --Methode-- */
+PILayoutMgr::PILayoutMgr()
+{
 mNCh = 0;
-mACSup = false;   // Suppression automatique des widgets fils au delete
+mACSup = true;   // Suppression automatique des widgets fils au delete
 mPaSup = false;
 mChilds = new (PIWdg* [NCHALGRP]);
 mMxCh = NCHALGRP;
-stvis = false;
-stfcr = false;
-}
-
-
-/* --Methode-- */
-PIContainerGen::~PIContainerGen()
+mCont = NULL;
+}
+
+/* --Methode-- */
+PILayoutMgr::~PILayoutMgr()
 {
 mPaSup = true;   // Pour prevenir ChildDel()
@@ -83,38 +258,5 @@
 
 /* --Methode-- */
-void PIContainerGen::PSPrint(PSFile *psf, int ofx, int ofy)
-{
-int i;
-if (!psf)  return;
-if (!Visible())  return;
-for(i=0; i<mNCh; i++)  mChilds[i]->PSPrint(psf, ofx+XPos(), ofy+YPos()); 
-return;
-}
-
-/* --Methode-- */
-void PIContainerGen::Show()
-{
-stvis = true;
-Manage();
-return;
-}
-
-/* --Methode-- */
-void PIContainerGen::Hide()
-{
-stvis = false;
-UnManage();
-return;
-}
-
-/* --Methode-- */
-bool PIContainerGen::Visible()
-{
-if (Parent())  return(stvis && Parent()->Visible());
-else return(stvis && IsVisible());
-}
-
-/* --Methode-- */
-void PIContainerGen::ChildAdd(PIWdg* child)
+void PILayoutMgr::ChildAdd(PIWdg* child)
 {
 if (child == NULL)  return;
@@ -128,14 +270,11 @@
   }  
 mChilds[mNCh] = child;   mNCh++; 
-// Reza 13/10/98 : il faut que child->FinishCreate() 
-// soit appele pour les PIWdg ajoute quand le  container est deja affiche et son FinishCreate() appele
-if (stfcr)  child->FinishCreate(); 
-return;
-}
-
-/* --Methode-- */
-void PIContainerGen::ChildDel(PIWdg* child)
-{
-if (mPaSup) return;  // Ne rien faire si delete initie par Container-parent
+return;
+}
+
+/* --Methode-- */
+void PILayoutMgr::ChildDel(PIWdg* child)
+{
+if (mPaSup) return;  // Ne rien faire si delete initie par Container-parent : Le LayoutMgr lui-meme
 if ((child == NULL) || (mNCh < 1))  return;
 for(int i=0; i<mNCh; i++)  
@@ -149,31 +288,2 @@
 }
 
-/* --Methode-- */
-int PIContainerGen::NbChilds()
-{
-return(mNCh);
-}
-
-/* --Methode-- */
-PIWdg* PIContainerGen::GetChild(int n)
-{
-if ( (n < 0) || (n >= mNCh))  return(NULL);
-return ((PIWdg*)mChilds[n]);
-}
-
-/* --Methode-- */
-void PIContainerGen::SetAutoDelChilds(bool ad)
-{
-mACSup = ad;
-return;
-}
-
-/* --Methode-- */
-void PIContainerGen::FinishCreate()
-{
-if (stfcr)  return;
-int k;
-for(k=0; k<mNCh; k++)  mChilds[k]->FinishCreate();
-stfcr = true;
-}
-
Index: trunk/SophyaPI/PI/picontainergen.h
===================================================================
--- trunk/SophyaPI/PI/picontainergen.h	(revision 157)
+++ trunk/SophyaPI/PI/picontainergen.h	(revision 158)
@@ -1,2 +1,7 @@
+// This may look like C code, but it is really -*- C++ -*-
+// Module PI : Peida Interactive    PIContainerGen
+//                  E.Aubourg , R. Ansari  96 - 98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PICONTAINERBASE_SEEN
 #define PICONTAINERBASE_SEEN
@@ -6,5 +11,30 @@
 #include PIWDG_H
 
+class PIContainerGen;
+//  Classe gestionnaire du positionnement/tailles des PIWdg d'un PIContainer
+class PILayoutMgr {
+public:
+  			PILayoutMgr();
+  virtual 		~PILayoutMgr();
 
+  inline  void		SetContainer(PIContainerGen* pic) { mCont = pic; }
+
+  virtual void		ChildAdd(PIWdg* child);
+  virtual void		ChildDel(PIWdg* child);
+
+  inline  int		NbChilds() { return(mNCh); }
+  inline  PIWdg*	GetChild(int n) 
+                        { if ( (n < 0) || (n >= mNCh))  return(NULL);
+                        else return (mChilds[n]); }
+  inline  void		SetAutoDelChilds(bool ad = true) { mACSup = ad; } 
+
+protected:
+  PIWdg                ** mChilds;
+  int                  mNCh, mMxCh;
+  bool                 mPaSup, mACSup;
+  PIContainerGen*      mCont;   // Le PIContainer auquel on est attache
+};
+
+// Classe conteneur pour le regroupement hierarchique (Fenetre/MsgHandler) des PIWdg
 class PIContainerGen : public PIWdg 
 {
@@ -18,4 +48,7 @@
   virtual long         kind() {return ClassId; }
 
+  virtual void	       SetLayoutMgr(PILayoutMgr* nlay);
+  inline  PILayoutMgr* GetLayoutMgr() { return(layout); }
+
   virtual void         PSPrint(PSFile *psf, int ofx=0, int ofy=0);
 
@@ -28,13 +61,11 @@
   virtual int          NbChilds();
   virtual PIWdg*       GetChild(int n);
+          void         SetAutoDelChilds(bool ad = true);
 
-          void         SetAutoDelChilds(bool ad = false);
   virtual void	       FinishCreate(); // appelle FinishCreate() pour les descendants 
 
 protected:
   bool                 stvis, stfcr;  // Statut visible ou pas, FinishCreate appele ou pas
-  PIWdg                ** mChilds;
-  int                  mNCh, mMxCh;
-  bool                 mPaSup, mACSup;
+  PILayoutMgr*         layout;        // Gestionnaire de positionnement (/tailles) des PIWdg fils
 };
 
Index: trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- trunk/SophyaPI/PI/pidrawer.cc	(revision 157)
+++ trunk/SophyaPI/PI/pidrawer.cc	(revision 158)
@@ -1,4 +1,31 @@
+// Module PI : Peida Interactive     PIDrawer
+// Classe de traceurs pouvat être attachés à une PIBaseWdg
+//	      E. Aubourg , R.Ansari     96-98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pidrawer.h"
 #include "psfile.h"
+
+//++
+// Class	PIDrawer
+// Lib		PI
+// include	pidrawer.h
+//
+//	Classe pour la création d'objets, capables de se dessiner
+//	dans une composante graphique ("PIBaseWdg").
+//--
+//++
+// Links	Voir
+// PIBaseWdg
+//--
+
+//++
+// Titre	Constructeurs et méthodes
+//--
+
+//++
+// PIDawer()
+//	Constructeur.
+//--
 
 PIDrawer::PIDrawer()
@@ -32,4 +59,15 @@
 }
 
+//++
+// void  SetLimits(float xmin, float xmax, float ymin, float ymax, -
+//                 int axrl=kAxeDirSame, int ayud=kAxeDirSame)
+//	Définit les limites du système de coordonnées.
+// void  SetAxesFlags(unsigned int flags=kAxesNone)
+//	Attributs de tracé d'axes
+//|	kStdAxes , kBoxAxes , kTicks , kIntTicks , kExtTicks 
+//|	kMajTicks , kMinTicks , kLabels , kAxesDflt , kAxesNone
+// void  DrawAxes(PIGraphicUC* g)
+//	Méthode de tracé des axes
+//--
 
 void
@@ -62,4 +100,15 @@
 }
 
+//++
+//  void  Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax)
+//	Méthode qui est appelé lorsquer l'objet PIDrawer doit rafraichir la zone
+//	définie par "xmin-xmax" , "ymin-ymax" dans le système de coordonnées du
+//	PIDrawer.
+//  void  Refresh()
+//	Rafraîchit le dessin du PIDrawer sur tous les PIBaseWdg auxquel il est attaché.
+//  void  UpdateLimits()
+//	Cette méthode doit calculer les limites (X/Y Min-Max) préferées par l'objet
+//	et doit appeler "SetLimits()". L'implementation par défaut ne fait rien.
+//--
 
 void
@@ -78,4 +127,23 @@
 
 }
+
+//++
+// Titre	Les attributs graphiques
+//--
+//++
+// void  SetColAtt(PIColors fg=PI_NotDefColor, PIColors bg=PI_NotDefColor)
+//	Modifie la couleur d'avant-plan et de fond par défaut
+// void  SetLineAtt(PILineAtt lat=PI_NotDefLineAtt)
+//	Modifie l'attribut type de ligne
+// void  SetFontAtt(PIFontSize fsz=PI_NotDefFontSize, PIFontAtt fat=PI_NotDefFontAtt)
+//	L'attribut Type de fonte 
+// void  SetMarkerAtt(int sz=-1, PIMarker mrk=PI_NotDefMarker)
+//	L'attribut type et taille de marker
+// void  SetColMapId(CMapId cid=CMAP_OTHER)
+//	L'attribut choix de la table de couleurs
+// void  SelGraAtt(PIGraphicUC* g)
+//	Modifie les attributs graphiques de "g" à partir des attributs courant
+//	de l'objet "PIDrawer"
+//--
 
 void 
@@ -384,4 +452,5 @@
 {
 mEn = 0;
+titleT = titleB = "";
 }
 
@@ -392,4 +461,17 @@
 
 /* --Methode-- */
+void PIElDrawer::SetTitles(const char* tt, const char* tb)
+{
+if (tt != NULL)  titleT = tt;
+if (tb != NULL)  titleB = tb;
+}
+
+/* --Methode-- */
+void PIElDrawer::SetTitles(string const & tt, string const & tb)
+{
+titleT = tt;  titleB = tb;
+}
+
+/* --Methode-- */
 void  PIElDrawer::Draw(PIGraphicUC* g, float /*xmin*/, float /*ymin*/, float /*xmax*/, float /*ymax*/)
 {
@@ -397,7 +479,37 @@
 
 SelGraAtt(g);   // DrawAxes change certains attributs graphiques
+if (mFSz == PI_NotDefFontSize) g->SelFont(PI_NormalSizeFont);
+// Trace des titres 
+if ( (titleT.length() > 0) || (titleB.length() > 0) ) {
+  aXdir = false;  // Vrai si Axe X de Droite vers Gauche 
+  aYdir = false;  // Vrai si Axe Y de Haut vers Bas
+  PIGrCoord gas, gds;
+  float fx, fy, fh;
+//  fh = g->GetFontHeightUC(gas, gds);
+  fh = 0.075*(YMax()-YMin());
+  if ( titleT.length() > 0) {
+      fx = g->CalcStringWidth(titleT.c_str());
+      if(aXdir) fx = XMax()-(XMax()-XMin()-fx)/2.;
+      else fx = XMin()+(XMax()-XMin()-fx)/2.;
+      if (aYdir) fy = YMin()-fh;
+      else fy = YMax()+fh;
+      g->DrawString(fx, fy, titleT.c_str());
+//      printf(" PIElDrawer::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
+    }
+  if ( titleB.length() > 0) {
+      fx = g->CalcStringWidth(titleB.c_str());
+      if(aXdir) fx = XMax()-(XMax()-XMin()-fx)/2.;
+      else fx = XMin()+(XMax()-XMin()-fx)/2.;
+      if (aYdir) fy =  YMax()+fh*1.5;
+      else fy = YMin()-fh*1.5;
+      g->DrawString(fx, fy, titleB.c_str());
+//      printf(" PIElDrawer::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
+    }
+  }
 DrwElList::iterator it;
+PIColors cc = g->GetForeground();
 for (it = mElist.begin(); it != mElist.end(); it++)
   {
+  if ((*it).col != PI_NotDefColor)  g->SelForeground((*it).col);
   switch ( (*it).etyp )
     {
@@ -423,10 +535,11 @@
       break;
     }
-  }
-}
-
-
-/* --Methode-- */
-int PIElDrawer::ElAdd(int typ, PIGrCoord x, PIGrCoord  y, PIGrCoord dx, PIGrCoord dy, char* s)
+  g->SelForeground(cc);
+  }
+}
+
+
+/* --Methode-- */
+int PIElDrawer::ElAdd(int typ, PIGrCoord x, PIGrCoord  y, PIGrCoord dx, PIGrCoord dy, const char* s, PIColors c)
 {
 DrwEl dre;
@@ -435,4 +548,5 @@
 dre.ex = x;   dre.ey = y;
 dre.edx = dx;  dre.edy = dy;
+dre.col = c;
 if (s)  dre.es = s;
 mElist.push_back(dre);
Index: trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- trunk/SophyaPI/PI/pidrawer.h	(revision 157)
+++ trunk/SophyaPI/PI/pidrawer.h	(revision 158)
@@ -125,18 +125,24 @@
   virtual           ~PIElDrawer();
 
+  virtual void	     SetTitles(const char* tt=NULL, const char* tb=NULL);
+  virtual void       SetTitles(string const & tt, string const & tb);
+
   virtual void       Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax); 
 
-  inline int         ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
-    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL) ); }  
-  inline int         ElAddText(PIGrCoord x, PIGrCoord y, char* s)
-    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s) ); }  
-  inline int         ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL) ); }  
-  inline int         ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
-    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL) ); }  
-  inline int         ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL) ); }  
-  inline int         ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
-    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL) ); }  
+  inline int         ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
+                               PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, c) ); }  
+  inline int         ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s, c) ); }  
+  inline int         ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
+                               PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, c) ); }  
+  inline int         ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy,
+                               PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, c) ); }  
+  inline int         ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, c) ); }  
+  inline int         ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
+    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, c) ); }  
 
   void               ElDel(int id);
@@ -144,5 +150,6 @@
 
 protected:
-  int                ElAdd(int typ, PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, char* s);
+  int                ElAdd(int typ, PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
+                           const char* s, PIColors c=PI_NotDefColor);
 #ifdef __DECCXX
 public:
@@ -153,4 +160,5 @@
     PIGrCoord edx,edy;
     string es;
+    PIColors col;
   };
 #ifdef __DECCXX
@@ -162,4 +170,6 @@
   int mEn;
 
+  string titleT, titleB;       // Titre Haut - Bas
+
 };
 
Index: trunk/SophyaPI/PI/pidrwtools.cc
===================================================================
--- trunk/SophyaPI/PI/pidrwtools.cc	(revision 157)
+++ trunk/SophyaPI/PI/pidrwtools.cc	(revision 158)
@@ -184,9 +184,12 @@
 mOpt[4]->AppendItem("Ital", 513);
 mOpt[4]->AppendItem("Small-Font", 521);
-mOpt[4]->AppendItem("Small-Bold-Font", 522);
-mOpt[4]->AppendItem("Small-Ital-Font", 523);
+mOpt[4]->AppendItem("Small-Bold", 522);
+mOpt[4]->AppendItem("Small-Ital", 523);
 mOpt[4]->AppendItem("Big-Font", 531);
 mOpt[4]->AppendItem("Big-Bold", 532);
 mOpt[4]->AppendItem("Big-Ital", 533);
+mOpt[4]->AppendItem("Huge-Font", 541);
+mOpt[4]->AppendItem("Huge-Bold", 542);
+mOpt[4]->AppendItem("Huge-Ital", 543);
 mOpt[4]->SetValue(500);
 mOpt[4]->SetBinding(PIBK_elastic, PIBK_elastic, PIBK_elastic, PIBK_elastic);
@@ -305,5 +308,6 @@
 
 PIFontAtt fntatt[4] = { PI_NotDefFontAtt, PI_RomanFont, PI_BoldFont, PI_ItalicFont };
-PIFontSize fntsz[4] = { PI_NotDefFontSize, PI_NormalSizeFont, PI_SmallSizeFont, PI_BigSizeFont };
+PIFontSize fntsz[5] = { PI_NotDefFontSize, PI_NormalSizeFont, PI_SmallSizeFont, 
+                        PI_BigSizeFont, PI_HugeSizeFont };
 CMapId cmap[11] = {  CMAP_OTHER, CMAP_GREY32, CMAP_GREYINV32,
                      CMAP_COLRJ32, CMAP_COLBR32, CMAP_COLRV32,  
Index: trunk/SophyaPI/PI/pigraph3d.cc
===================================================================
--- trunk/SophyaPI/PI/pigraph3d.cc	(revision 157)
+++ trunk/SophyaPI/PI/pigraph3d.cc	(revision 158)
@@ -6,4 +6,30 @@
 #include <math.h>
 #include "pigraph3d.h"
+
+//++
+// Class	PIGraphic3D
+// Lib		PI
+// include	pigraph3d.h
+//
+//   	Classe fournissant les services de tracé graphique 
+//	en coordonnées utilisateur, et quelques primitives de tracé 3D
+//--
+//++
+// Links	Parent
+// PIGraphicUC
+//--
+
+//++
+// Titre	Constructeurs, méthodes
+//--
+//++
+// PIGraphic3D(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Constructeur d'un objet "PIGraph3D" à partir d'un "PIGraphic* g". L'espace
+//	de travail du nouvel objet "PIGraphic" correspond au rectangle défini par
+//	"(x0,y0)" , "dx,dy" du "PIGraphic" de départ.
+// 
+// int  kind()
+//	Renvoie le type ("= PI_3DGraphics")
+//--
 
 /* --Methode-- */
@@ -33,4 +59,41 @@
   return PI_3DGraphics; 
 }
+
+//++
+// Titre	Système de coordonnées 3D et projection
+//	Le système de coordonnées 3D est défini par la position de l'observateur (caméra),
+//	la direction de visée ou la position du centre du champ, 
+//	l'ouverture angulaire de la caméra selon les deux 
+//	axes de la projection (X,Y), eventuellement un angle correspondant à la rotation
+//	du plan image ("psi"). Les angles d'Euler ("teta", "phi", "psi" ) sont utilisés
+//	dans la définition du système de coordonnées et la projection est de type 
+//	perspective. 
+//
+//	Les coordonnées utilisateur définissant le plan image ("PIGraphicUC") vont de 
+//	X: "-dax , +dax"   Y : "-day , +day".  
+//--
+
+//++
+// void  Set3DCS_Obs(float xo, float yo, float zo, float teta, float phi, float psi, -
+//                  float dax, float day, float co, float dco=0.2)
+//	Définition du système de projection 3D à l'aide de la position de l'observateur 
+//	et de la direction de visée.
+//|	xo,yo,zo : Position de l'observateur (camera)
+//|	teta,phi : Direction de visee
+//|	psi : rotation du plan image
+//|	dax , day : Ouverture du plan image selon les deux axes = Xmax,Ymax / Z
+//|	co : distance au centre du champ
+//|	dco : profondeur de champ 
+//
+// void  Set3DCS(float xc, float yc, float zc, float xo, float yo, float zo, -
+//               float dax, float day, float dco=0.2, float psi=0.)
+//	Définition du système de projection 3D à partir de la position de l'observateur et 
+//	du centre du champ.
+//|	xc,yc,zc : Position du centre du champ
+//|	xo,yo,zo : Position de l'observateur (camera)
+//|	dax , day : Ouverture du plan image selon les deux axes = Xmax,Ymax / Z
+//|	dco : profondeur de champ 
+//|	psi : rotation du plan image
+//--
 
 static float deuxpi = 2*M_PI;
@@ -128,4 +191,27 @@
 }
 
+//++
+// bool Get3DCS(float& xc, float& yc, float& zc, float& xo, float& yo, float& zo, -
+//             float& teta, float& phi, float& psi, float& dax, float& day, float& co, float& dco);
+//	Renvoie les paramètres de définition du système de projection 3D.
+//	"Rc= true" si défini par  "Set3DCS_Obs()"
+//	
+// void  RotateObserver(float teta, float phi, float psi=0., bool rel=true)
+//	Positionne l'observateur (la caméra) en maintenant la position  
+//	du centre de champ fixe. Si "rel=false" : "teta, phi" determine la nouvelle
+//	direction de visée. Si "rel=false" : la direction de visée est tournée
+//	de l'angle "teta,phi". 
+// void  RotateObject(float teta, float phi, bool rel=true)
+//	Repostionne le centre du champ en maintenant la position de l'observateur fixe.
+//	Si "rel=false" : "teta, phi" determine la nouvelle direction de visée.
+//	Si "rel=false" : la direction de visée est tournée de l'angle "teta,phi". 
+// 
+// void  ZoomInOut(float fco, float fdax, float fday, bool rel=true)
+//	Eloigne ou approche l'observateur et modifie l'ouverture du plan image.
+//	si "real=true" : "fco, fdax, fday" sont des facteurs multiplicatifs
+//	par rapport aux valeurs actuelles, sinon des valeurs absolues. 
+//|	fco : distance observateur - centre du champ
+//|	fdax, fday : ouverture du plan image
+//--
 
 /* --Methode-- */
@@ -141,4 +227,232 @@
 }
 
+
+/* --Methode-- */
+void PIGraphic3D::RotateObserver(float teta, float phi, float psi, bool rel)
+// Positionne l'observateur (la camera) de maniere a ce que la direction de 
+// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
+// en conservant le centre de champ fixe  
+{
+  if (rel) {
+    teta += tO;
+    phi += fO;
+    psi += pO;
+    }
+  while (teta < 0.)  teta += deuxpi;
+  while (teta > deuxpi)  teta -= deuxpi;
+  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
+  float xo,yo,zo; 
+  zo = -cos((double)teta)*lCO+zC;
+  xo = -sin((double)teta)*cos((double)phi)*lCO+xC;
+  yo = -sin((double)teta)*sin((double)phi)*lCO+yC;
+  Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi);
+}
+
+/* --Methode-- */
+void PIGraphic3D::RotateObject(float teta, float phi, bool rel)
+// Positionne l'objet (centre du champ) de maniere a ce que la direction de 
+// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
+// en conservant la position de l'observateur fixe.  
+{
+  if (rel) {
+    teta += tO;
+    phi += fO;
+    }
+  while (teta < 0.)  teta += deuxpi;
+  while (teta > deuxpi)  teta -= deuxpi;
+  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
+  float xc,yc,zc; 
+  zc = cos((double)teta)*lCO+zO;
+  xc = sin((double)teta)*cos((double)phi)*lCO+xO;
+  yc = sin((double)teta)*sin((double)phi)*lCO+yO;
+  Set3DCS(xc,yc,zc, xO,yO,zO, daxO, dayO, dlCO, pO);
+}
+
+/* --Methode-- */
+void PIGraphic3D::ZoomInOut(float fco, float fdax, float fday, bool rel)
+{
+  if (fco < 0.001) fco = 1.;
+  if (fdax < 0.001) fdax = 1.;
+  if (fday < 0.001) fday = 1.;
+  double dl;
+  if (rel) {
+    dl = fco*lCO;  
+    fdax *= daxO;
+    fday *= dayO;
+  }
+  else dl = fco; 
+  float xo,yo,zo; 
+  if (dl < 1.e-5) dl = 1.e-5;
+  zo = zC-cos((double)tO)*dl;
+  xo = xC-sin((double)tO)*cos((double)fO)*dl;
+  yo = yC-sin((double)tO)*sin((double)fO)*dl;
+  Set3DCS(xC,yC,zC, xo,yo,zo, fdax, fday, dlCO, pO);
+//  Set3DCS_Obs(xo, yo, zo, tO, fO, pO, daxO*fda, dayO*fda, dl, dlCO);
+}
+
+/* --Methode-- */
+void PIGraphic3D::C3DC2ObsCS(float x, float y, float z, float& xp, float& yp, float& zp)
+{
+  double xc, yc, zc;
+  xc = x-xO;   yc = y-yO;    zc = z-zO;
+  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;
+  yp = -RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;  
+  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
+}
+
+/* --Methode-- */
+void PIGraphic3D::Proj3DC2GrC(float x, float y, float z, float& xpix, float& ypix)
+{
+  double xc, yc, zc;
+  float xp, yp, zp;
+  xc = x-xO;   yc = y-yO;    zc = z-zO;
+  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;   
+  yp = RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;
+  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
+  if ((zp>-1.e-6) && (zp < 1.e-6))   // Protection Divide/0
+    { xpix = ypix = 0.;   return; }
+  xpix = (float)(xOrg + (xp/zp)*xScale);
+  ypix = (float)(yOrg + (yp/zp)*yScale);
+//  printf("-DBG-Proj3DC2GrC() %g %g %g -> %g %g %g -> %g %g %g -> (%g %g)\n", x,y,z,xc,yc,zc,xp,yp,zp,xp/zp,yp/zp);
+//  printf("-DBG- ... (%g %g %g - %g %g) %g %g - %g %g -> %g %g \n", xO,yO,zO, tO,fO, xOrg, yOrg,xScale,yScale ,xpix,ypix);
+}
+
+//++
+// Titre	Primitives de tracé 3D
+//--
+//++
+// void  DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
+//	Tracé de chaîne de caractères à la position "(x0,y0,z0)"
+// void  DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
+//	Tracé de chaîne opaque à la position "(x0,y0,z0)"
+// void  DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, -
+//                  PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
+//	Tracé d'une ligne entre les deux points "(x1,y1,z1)" et "(x2,y2,z2)"
+// void  DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de contour de polygone - sommets définis par le tableau 
+//	"(x[i],y[i],z[i])" , "i=0..n-1"
+// void  DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de polygone - "(x[i],y[i],z[i])" , "i=0..n-1"
+// void  DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
+//	Tracé d'un signe (marker) au point "(x0,y0,z0)"
+// void  DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de signes (marker) aux points "(x[i],y[i],z[i])" , "i=0..n-1"
+//--
+
+/* --Methode-- */
+void PIGraphic3D::DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawString(xf, yf, s);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawOpaqueString(xf, yf, s);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
+                             PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
+{
+  if (!mGrC) return;
+  float xf1, yf1, xf2, yf2;
+  Proj3DC2GrC(x1, y1, z1, xf1, yf1);
+  Proj3DC2GrC(x2, y2, z2, xf2, yf2);
+//  printf("-DBG-DrawLine3D() : %g %g %g -> %g %g | %g %g %g -> %g %g\n", 
+//         (float)x1, (float)y1, (float)z1, xf1, yf1, 
+//         (float)x2, (float)y2, (float)z2, xf2, yf2 );
+  mGrC->DrawLine(xf1, yf1, xf2, yf2);
+}
+
+#define NMXMULTP  30   // Pour multipoint sans new
+
+/* --Methode-- */
+void PIGraphic3D::DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawPolygon(pxc, pyc, n, false);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+
+/* --Methode-- */
+void PIGraphic3D::DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawFPolygon(pxc, pyc, n, false);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawMarker(xf, yf);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n]; }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawMarkers(pxc, pyc, n);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+
+//  Methode pour debugger 
 /* --Methode-- */
 void PIGraphic3D::PrintCS()
@@ -164,205 +478,2 @@
 printf("C+(0,1,1) -> %g %g %g -> %g %g \n", xp, yp, zp, xpix, ypix); 
 }
-
-/* --Methode-- */
-void PIGraphic3D::RotateObserver(float teta, float phi, float psi, bool rel)
-// Positionne l'observateur (la camera) de maniere a ce que la direction de 
-// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
-// en conservant le centre de champ fixe  
-{
-  if (rel) {
-    teta += tO;
-    phi += fO;
-    psi += pO;
-    }
-  while (teta < 0.)  teta += deuxpi;
-  while (teta > deuxpi)  teta -= deuxpi;
-  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
-  float xo,yo,zo; 
-  zo = -cos((double)teta)*lCO+zC;
-  xo = -sin((double)teta)*cos((double)phi)*lCO+xC;
-  yo = -sin((double)teta)*sin((double)phi)*lCO+yC;
-  Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi);
-}
-
-/* --Methode-- */
-void PIGraphic3D::RotateObject(float teta, float phi, bool rel)
-// Positionne l'objet (centre du champ) de maniere a ce que la direction de 
-// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
-// en conservant la position de l'observateur fixe.  
-{
-  if (rel) {
-    teta += tO;
-    phi += fO;
-    }
-  while (teta < 0.)  teta += deuxpi;
-  while (teta > deuxpi)  teta -= deuxpi;
-  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
-  float xc,yc,zc; 
-  zc = cos((double)teta)*lCO+zO;
-  xc = sin((double)teta)*cos((double)phi)*lCO+xO;
-  yc = sin((double)teta)*sin((double)phi)*lCO+yO;
-  Set3DCS(xc,yc,zc, xO,yO,zO, daxO, dayO, dlCO, pO);
-}
-
-/* --Methode-- */
-void PIGraphic3D::ZoomInOut(float fco, float fdax, float fday, bool rel)
-{
-  if (fco < 0.001) fco = 1.;
-  if (fdax < 0.001) fdax = 1.;
-  if (fday < 0.001) fday = 1.;
-  double dl;
-  if (rel) {
-    dl = fco*lCO;  
-    fdax *= daxO;
-    fday *= dayO;
-  }
-  else dl = fco; 
-  float xo,yo,zo; 
-  if (dl < 1.e-5) dl = 1.e-5;
-  zo = zC-cos((double)tO)*dl;
-  xo = xC-sin((double)tO)*cos((double)fO)*dl;
-  yo = yC-sin((double)tO)*sin((double)fO)*dl;
-  Set3DCS(xC,yC,zC, xo,yo,zo, fdax, fday, dl, pO);
-//  Set3DCS_Obs(xo, yo, zo, tO, fO, pO, daxO*fda, dayO*fda, dl, dlCO);
-}
-
-/* --Methode-- */
-void PIGraphic3D::C3DC2ObsCS(float x, float y, float z, float& xp, float& yp, float& zp)
-{
-  double xc, yc, zc;
-  xc = x-xO;   yc = y-yO;    zc = z-zO;
-  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;
-  yp = -RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;  
-  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
-}
-
-/* --Methode-- */
-void PIGraphic3D::Proj3DC2GrC(float x, float y, float z, float& xpix, float& ypix)
-{
-  double xc, yc, zc;
-  float xp, yp, zp;
-  xc = x-xO;   yc = y-yO;    zc = z-zO;
-  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;   
-  yp = RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;
-  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
-  if ((zp>-1.e-6) && (zp < 1.e-6))   // Protection Divide/0
-    { xpix = ypix = 0.;   return; }
-  xpix = (float)(xOrg + (xp/zp)*xScale);
-  ypix = (float)(yOrg + (yp/zp)*yScale);
-//  printf("-DBG-Proj3DC2GrC() %g %g %g -> %g %g %g -> %g %g %g -> (%g %g)\n", x,y,z,xc,yc,zc,xp,yp,zp,xp/zp,yp/zp);
-//  printf("-DBG- ... (%g %g %g - %g %g) %g %g - %g %g -> %g %g \n", xO,yO,zO, tO,fO, xOrg, yOrg,xScale,yScale ,xpix,ypix);
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawString(xf, yf, s);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawOpaqueString(xf, yf, s);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
-                             PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
-{
-  if (!mGrC) return;
-  float xf1, yf1, xf2, yf2;
-  Proj3DC2GrC(x1, y1, z1, xf1, yf1);
-  Proj3DC2GrC(x2, y2, z2, xf2, yf2);
-//  printf("-DBG-DrawLine3D() : %g %g %g -> %g %g | %g %g %g -> %g %g\n", 
-//         (float)x1, (float)y1, (float)z1, xf1, yf1, 
-//         (float)x2, (float)y2, (float)z2, xf2, yf2 );
-  mGrC->DrawLine(xf1, yf1, xf2, yf2);
-}
-
-#define NMXMULTP  30   // Pour multipoint sans new
-
-/* --Methode-- */
-void PIGraphic3D::DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawPolygon(pxc, pyc, n, false);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
-
-
-/* --Methode-- */
-void PIGraphic3D::DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawFPolygon(pxc, pyc, n, false);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawMarker(xf, yf);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n]; }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawMarkers(pxc, pyc, n);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
Index: trunk/SophyaPI/PI/pigraph3d.h
===================================================================
--- trunk/SophyaPI/PI/pigraph3d.h	(revision 157)
+++ trunk/SophyaPI/PI/pigraph3d.h	(revision 158)
@@ -1,2 +1,3 @@
+// This may look like C code, but it is really -*- C++ -*-
 // Module PI : Peida Interactive     PIGraphic3D
 // Trace graphiques 3D               R. Ansari  06/98
@@ -34,6 +35,6 @@
   virtual void       Proj3DC2GrC(float x, float y, float z, float& xpix, float& ypix);
   
-  virtual void       DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s);
-  virtual void       DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s);
+  virtual void       DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s);
+  virtual void       DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s);
   virtual void       DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
                                 PIGrCoord x2, PIGrCoord y2, PIGrCoord z2);
Index: trunk/SophyaPI/PI/pigraphgen.cc
===================================================================
--- trunk/SophyaPI/PI/pigraphgen.cc	(revision 157)
+++ trunk/SophyaPI/PI/pigraphgen.cc	(revision 158)
@@ -17,17 +17,42 @@
 //   	"PIGraphicWin" ou "PIGraphicUC" ou ...
 //   	La classe "PIGraphicWin" a une implementation dépendante du système 
-//   	utilisé et sa 
-//   	"
-//   	Un type particulier *PIGrCoord* permettant de passer les coordonnées
-//   	graphiques en entier ("int") ou en flottant ("float").
-//--
-
-//
-//   	"
-//   	"
-//   	"
-//   	"
-//   	"
-//   	"
+//   	utilisé (Mac, XWindow, ...). 
+//   	Un type particulier *PIGrCoord* est défini pour la spécification 
+//	des coordonnées graphiques. 
+//--
+//++
+// Links	Voir aussi
+// PIGrCoord
+// PIColorMap
+//--
+
+//++
+// Titre	Constructeurs
+//--
+//++
+// PIGraphic()
+//	Constructeur utilisé par les classes dérivées.
+// PIGraphic(PIWdg* wdg)
+//	Constructeur pour les *PIGraphicWin*. Objet "PIGraphic" capable 
+//	de tracer dans un "PIWdg".
+//--
+//++
+//--
+// Titre	Méthodes
+//++
+// int  kind()
+//	Renvoie le type de l'objet "PIGraphic" .
+//	* PI_ScrWindowGraphics : Objet PIGraphic associé à une fenêtre sur l'écran (PIWdg)
+//	* PI_PSFileGraphics : Objet PIGraphic à un fichier PostScript (pour impression papier)
+//	* PI_UCGraphics : Objet PIGraphic travaillant dans un système de coordonnées utilisateur.
+//	* PI_3DGraphics : Objet PIGraphic fournissant des méthodes de tracé en coordonnées 3-D
+// void  GetGrSpace(PIGrCoord& xmin, PIGrCoord& xmax, PIGrCoord& ymin, PIGrCoord& ymax)
+//	Renvoie les limites de l'espace graphique - Coordonnées fenêtre pour un PIGraphicWin, 
+//	Limites définies par l'utilisateur pour un PIGraphicUC
+// void  Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy) 
+//	Efface le rectangle défini par le coin "x0,y0", de longeur et de largeur "dx,dy"
+//	en utilisant la couleur d'arrière plan (Background)
+//--
+
 
 /* --Methode-- */
@@ -52,4 +77,5 @@
 return PI_ScrWindowGraphics; 
 }
+
 
 /* --Methode-- */
@@ -63,4 +89,159 @@
   }
 }
+
+//++ 
+// Titre	Tracés de texte
+//--
+//++
+// void  DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0)
+//	Trace la chaîne de caractères "s" à la position "x,y", 
+//	en utilisant la couleur d'avant-plan (Foreground)
+// void  DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0) 
+//	Trace la chaîne de caractères "s" à la position "x,y" . La couleur d'
+//	arrière-plan est utilisée pour remplir la zone rectangulaire occupée par
+//	le tracé de texte.
+//--
+
+//++ 
+// Titre	Tracés de lignes et de figures géometriques
+//--
+//++
+// void  DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
+//	Trace une ligne entre les points de coordonnées "(x1,y1)" et "(x2,y2)", 
+//	en utilisant la couleur d'avant-plan (Foreground)
+// void  DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Tracé du contour d'un rectangle défini par la position du coin "(x0,y0)"
+//	et de taille "dx,dy" avec la couleur d'avant-plan.
+// void  DrawFBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Tracé d'un rectangle plein, défini par la position du coin "(x0,y0)"
+//	et de taille "dx,dy" avec la couleur d'avant-plan.
+// void  DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)  
+//	Tracé du contour d'un cercle centré en "(x0,y0)", de rayon "r"
+// void  DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)  
+//	Tracé d'un cercle plein centré en "(x0,y0)", de rayon "r"
+// void  DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Tracé d'une ellipse incluse dans le rectangle "(x0,y0)" , "dx,dy"
+// void  DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Tracé d'une ellipse pleine incluse dans le rectangle "(x0,y0)" , "dx,dy"
+// void  DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)
+//	Tracé du contour d'un polygone défini par le tableau des "n" points "x,y".
+//	Si "cinc==true", les coordonnées seront considérées comme relatives
+//	à la position du point "(x[0], y[0])". Dans le cas contraire, chaque couple
+//	"(x[i], y[i])" représentera les coordonnées absolues d'un coin du polygone.
+// void  DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)
+//	Tracé d'un polygone plein de la couleur d'avant-plan.
+// void  DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, float degdeb, float degfin)
+//	Tracé d'un arc de cercle ou d'ellipse, inclu dans le "(x0,y0)" , "dx,dy" 
+//	entre les angles (en degré) "degdeb" - "degfin" 
+// void  DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, float degdeb, float degfin)
+//	Tracé d'un arc plein, inclu dans le "(x0,y0)" , "dx,dy" 
+//	entre les angles (en degré) "degdeb" - "degfin" 
+//--
+
+//++ 
+// Titre	Tracés de signes
+//--
+//++
+// void  DrawMarker(PIGrCoord x0, PIGrCoord y0)  
+//	Tracé d'un signe au point "(x0,y0)". Le choix du signe tracé s'effectue
+//	à travers la méthode "SelMarker()"
+// void  DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n)
+//	Tracé de "n" signes aux points "(x[i],y[i])"
+//--
+
+//++
+// Titre	Tracé d'images (pixmap)
+//--
+//++
+// void  DrawPixmap(PIGrCoord x, PIGrCoord y, unsigned char *pix, int sx, int sy, PIColorMap* cmap)
+//	Tracé d'un pixmap dans un rectangle positionné en "(x,y)". Le tableau des pixels
+//	"pix", de taille "sx,sy" représente les index dans la table de couleur "cmap".
+//--
+
+//++
+// Titre	Modifications des attributs graphiques	
+//--
+//++
+// void  SelForeground(PIColors col=PI_Black)
+//	Choix de la couleur de tracé d'avant-plan
+//|	PI_Black , PI_White,  PI_Grey , PI_Red , PI_Blue , PI_Green ,  
+//|	PI_Yellow , PI_Magenta , PI_Cyan , PI_Turquoise , PI_NavyBlue , 
+//|	PI_Orange , PI_SiennaRed , PI_Purple , PI_LimeGreen , PI_Gold 
+// void  SelBackground(PIColors col=PI_White)
+//	Choix de la couleur d'arrière-plan
+// void  SelForeground(PIColorMap& cmap, int cid) 
+//	Choix de la couleur de tracé d'avant-plan: Couleur numéro "cid" de la table de couleur "cmap"
+// void  SelBackground(PIColorMap& cmap, int cid)
+//	Choix de la couleur d'arrière-plan: Couleur numéro "cid" de la table de couleur "cmap"
+// void  SelGOMode(PIGOMode mod=PI_GOCopy) 
+//	Choix du mode de tracé graphique: "PI_GOCopy" ou "PI_GOXOR"	
+// void  SelFont(PIFontSize sz=PI_NormalSizeFont, PIFontAtt att=PI_RomanFont)
+//	Choix de la fonte pour le tracé de texte
+//|	PI_SmallSizeFont , PI_NormalSizeFont , PI_BigSizeFont, PI_HugeSizeFont
+//|	PI_RomanFont , PI_BoldFont , PI_ItalicFont 
+// void  SelFontSzPt(int npt=12, PIFontAtt att=PI_RomanFont)
+//	Choix de la fonte avec spécification de taille en points (pixels sur l'écran)
+// void  SelLine(PILineAtt att=PI_NormalLine)
+//	Choix du type de ligne pour le tracé des lignes et contours
+//|	PI_NormalLine, PI_ThinLine , PI_ThickLine
+//|	PI_DashedLine, PI_ThinDashedLine , PI_ThickDashedLine
+// void  SelMarker(int msz=3, PIMarker mrk=PI_DotMarker) 
+//	Choix de la taille et du type de signe pour "DrawMarker() / DrawMarkers()"
+//|	PI_DotMarker , PI_PlusMarker , PI_CrossMarker
+//|	PI_CircleMarker , PI_FCircleMarker , PI_BoxMarker , PI_FBoxMarker
+//|	PI_TriangleMarker , PI_FTriangleMarker , PI_StarMarker , PI_FStarMarker
+//	(Les "StarMaker" ne sont pas encore implémentés  11/98) 
+//--
+
+//++
+// Titre	Sélection de la zone de tracé (clip)	
+//--
+//++
+// void  SetClipRectangle(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Limite la zone de tracé permise au rectangle "(x0,y0)", "dx,dy"
+// void  ClearClipRectangle() 
+//	Supprime si nécéssaire la limitation de la zone de tracé.	
+//--
+
+//++
+// Titre	Accès aux attributs graphiques
+//--
+//++
+// PIColors  GetForeground()
+//	Renvoie la couleur de tracé d'avant-plan courante. 
+//	("PI_ColorFromMap" si défini à partir d'une table de couleur
+// PIColors  GetBackground()
+//	Renvoie la couleur d'arrière-plan courante.
+// PIGOMode  GetGOMode()
+//	Renvoie le mode de tracé graphique courante.
+// PIFontAtt GetFontAtt()
+//	Renvoie les attributs de la fonte courante.
+// int GetFontSize() 
+//	Renvoie la taille de la fonte courante.
+// PILineAtt GetLineAtt() 
+//	Renvoie le type de ligne courant
+// PIMarker  GetMarker() 
+//	Renvoie le type de signe (Marker) courant
+// int GetMarkerSize()
+//	Renvoie la taille des signes (Marker) pour le marker courant
+// int GetFontHeight(int& asc, int& desc) 
+//	Renvoie la hauteur des caractères, ainsi que la taille au dessus
+//	et en-dessous de la ligne de base ("asc , desc") pour la fonte courante
+// PIGrCoord CalcStringWidth(char const* s)
+//	Renvoie la largeur occupé par un texte s'il était affiché dans le 
+//	système de coordonnées courant (Fenêtre ou UC).
+//--
+
+//++
+// Titre	Sauvegarde et rappel des attributs graphiques
+//--
+//++
+// void  SaveGraphicAtt()
+//	Sauvegarde des attributs graphiques courants
+// void  RestoreGraphicAtt()
+//	Utilisation de l'ensemble des attributs graphiques sauvegardés par un appel
+//	à "SaveGraphicAtt()"
+//--
+
 
 /* --Methode-- */
@@ -89,2 +270,67 @@
   return;
 }
+
+
+
+
+//++
+// Class	PIGrCoord
+// Lib		PI
+// include	pigraphgen.h
+//
+//   	Classe utilisé pour la spécifiaction de coordonnées graphique.
+//	Des constructeurs et des méthodes de conversion à partir 
+//	et vers des "int", "float" et "double" sont définis.
+//	L'objet conserve le type effectif de l'argument lors de la 
+//	création ou de la dernière affectation.
+// 
+//|	PIGrCoord gco;
+//|	gco = 3.141596 ; 
+//|	int ic = gco;     // ic -> 3
+//|	float fc = gco;   // fc -> 3.141596
+//--
+//++
+// Links	Voir aussi
+// PIGraphic
+//--
+
+//++
+// Titre	Constructeurs
+//--
+//++
+// 
+// PIGrCoord() 
+//	Constructeur par défaut ("intVal=floatVal=0")
+// PIGrCoord(int a)
+//	Constructeur à partir de l'entier "a"
+// PIGrCoord(float a) 
+//	Constructeur à partir de la valeur flottante "a"
+// PIGrCoord(double a) 
+//	Constructeur à partir de la valeur flottante double précision "a"
+//--
+//++
+// Titre	Opérateurs de conversion
+//--
+//++
+// operator int() 
+//	Conversion en entier "int"
+// operator short() 
+//	Conversion en entier "short"
+// operator unsigned int() 
+//	Conversion en entier non signé "unsigned int"
+// operator unsigned short() 
+//	Conversion en entier non signé "unsigned short"
+// operator float() 
+//	Conversion en réél "float"
+//--
+//++
+// Titre	Opérateurs d'affectation
+//--
+//++
+// PIGrCoord& operator= (int a) 
+//	Affectation à partir de valeur entière "int"
+// PIGrCoord& operator= (float a) 
+//	Affectation à partir de valeur réélle "float"
+// PIGrCoord& operator= (double a) 
+//	Affectation à partir de valeur réélle double précision "double"
+//--
Index: trunk/SophyaPI/PI/pigraphgen.h
===================================================================
--- trunk/SophyaPI/PI/pigraphgen.h	(revision 157)
+++ trunk/SophyaPI/PI/pigraphgen.h	(revision 158)
@@ -21,5 +21,6 @@
 
 enum PIFontSize { PI_NotDefFontSize = -1, 
-                  PI_SmallSizeFont = 1, PI_NormalSizeFont = 2, PI_BigSizeFont = 3 };
+                  PI_SmallSizeFont = 1, PI_NormalSizeFont = 2, 
+                  PI_BigSizeFont = 3, PI_HugeSizeFont = 4 };
 
 enum PIFontAtt { PI_NotDefFontAtt = -1,
@@ -78,6 +79,6 @@
 //  Trace graphiques
   virtual void       Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)     = 0;
-  virtual void       DrawString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0)        = 0;
-  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0)  = 0;
+  virtual void       DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0)        = 0;
+  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0)  = 0;
   virtual void       DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)  = 0;
   virtual void       DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)   = 0;
@@ -85,6 +86,12 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)               = 0;
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)              = 0;
+  virtual void       DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)  = 0;
+  virtual void       DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy) = 0;
   virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)    = 0;  
   virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)   = 0;  
+  virtual void       DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                             float degdeb, float degfin)                               = 0;
+  virtual void       DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                              float degdeb, float degfin)                              = 0;
   virtual void       DrawMarker(PIGrCoord x0, PIGrCoord y0)                            = 0;
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n)                    = 0;
Index: trunk/SophyaPI/PI/pigraphps.cc
===================================================================
--- trunk/SophyaPI/PI/pigraphps.cc	(revision 157)
+++ trunk/SophyaPI/PI/pigraphps.cc	(revision 158)
@@ -1,6 +1,44 @@
+// Module PI : Peida Interactive     PIGraphicPS
+// Trace graphiques en PostScript    R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdio.h>
 
 #include "pigraphps.h"
 
+//++
+// Class	PIGraphicPS
+// Lib		PI
+// include	pigraphps.h
+//
+//   	Classe les services de tracé graphique avec sortie PostScript
+//	Toutes les méthodes de tracé de "PIGraphic" sont redéfinies pour
+//	produire du PostScript 
+//--
+//++
+// Links	Parent
+// PIGraphic
+//--
+//++
+// Links	Voir aussi
+// PSFile
+//--
+
+//++
+// Titre	Constructeurs, méthodes
+//--
+//++
+// PIGraphicPS(PSFile * psf, float x0, float y0, float dx, float dy)
+//	Création d'un objet "PIGraphicPS" à partir d'un objet "PSFIle* psf".
+//	"(x0, y0)" détermine l'origine du nouveau bloc rectangulaire sur 
+//	la page et "dx, dy" l'extension du bloc. 
+// PIGraphicPS(PSFile * psf, PIWdg* wdg, float ofx, float ofy)
+//	Création d'un objet "PIGraphicPS" à partir d'un objet "PSFIle* psf"
+//|	x0 = wdg->XPos()+ofx    y0 = wdg->YPos()+ofy
+//|	dx = wdg->XSize()       dy = wdg->YSize()
+//
+// int kind()
+//	 Renvoie le type ("= PI_PSFileGraphics")
+//--
 
 /* --Methode-- */
@@ -70,5 +108,5 @@
 
 /* --Methode-- */
-void PIGraphicPS::DrawString(PIGrCoord x, PIGrCoord y, char* s, int /*pos*/)
+void PIGraphicPS::DrawString(PIGrCoord x, PIGrCoord y, const char* s, int /*pos*/)
 {
 if(mPSOut)
@@ -78,5 +116,5 @@
 
 /* --Methode-- */
-void PIGraphicPS::DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int /*pos*/)
+void PIGraphicPS::DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int /*pos*/)
 {
 if(mPSOut)
@@ -125,4 +163,16 @@
   mPSOut->DrawFCircle((float)x0,(float)y0,(float)r,mFCol,mFCol,mLAtt);
 return;
+}
+
+/* --Methode-- */
+void PIGraphicPS::DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+// $CHECK$ Reza/ Nicolas  12 Nov 98 - A faire
+}
+
+/* --Methode-- */
+void PIGraphicPS::DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+// $CHECK$ Reza/ Nicolas  12 Nov 98 - A faire
 }
 
@@ -182,4 +232,16 @@
 
 return;
+}
+
+/* --Methode-- */
+void PIGraphicPS::DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,float degdeb, float degfin)
+{
+// $CHECK$ Reza/ Nicolas  12 Nov 98 - A faire
+}
+
+/* --Methode-- */
+void PIGraphicPS::DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,float degdeb, float degfin)
+{
+// $CHECK$ Reza/ Nicolas  12 Nov 98 - A faire
 }
 
Index: trunk/SophyaPI/PI/pigraphps.h
===================================================================
--- trunk/SophyaPI/PI/pigraphps.h	(revision 157)
+++ trunk/SophyaPI/PI/pigraphps.h	(revision 158)
@@ -20,6 +20,6 @@
 //  Trace graphiques
   virtual void       Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
-  virtual void       DrawString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
-  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
+  virtual void       DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
+  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
   virtual void       DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2);
   virtual void       DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
@@ -27,6 +27,12 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
+  virtual void       DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
+  virtual void       DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
   virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
   virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
+  virtual void       DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                             float degdeb, float degfin);
+  virtual void       DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                              float degdeb, float degfin);
   virtual void       DrawMarker(PIGrCoord x0, PIGrCoord y0);
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n);
Index: trunk/SophyaPI/PI/pigraphuc.cc
===================================================================
--- trunk/SophyaPI/PI/pigraphuc.cc	(revision 157)
+++ trunk/SophyaPI/PI/pigraphuc.cc	(revision 158)
@@ -5,4 +5,18 @@
 #include "pigraphuc.h"
 
+//++
+// Class	PIGraphicUC
+// Lib		PI
+// include	pigraphuc.h
+//
+//   	Classe fournissant les services de tracé graphique 
+//	en coordonnées utilisateur.
+//	Toutes les méthodes de tracé de "PIGraphic" sont redéfinies pour 
+//	accepter les arguments en système de coordonnées utilisateur.
+//--
+//++
+// Links	Parent
+// PIGraphic
+//--
 
 // Pour echanger deux valeurs PIGrCoord
@@ -10,4 +24,24 @@
 static inline void fl_swap(float& grc1, float& grc2)
 { swpfl = grc1; grc1 = grc2; grc2 = swpfl; }
+
+//++
+// Titre	Constructeurs, méthodes
+//--
+//++
+// PIGraphicUC(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Constructeur d'un objet "PIGraphUC" à partir d'un "PIGraphicGen* g". L'espace
+//	de travail du nouvel objet "PIGraphic" correspond au rectangle défini par
+//	"(x0,y0)" , "dx,dy" du "PIGraphic" de départ.
+// 
+// int  kind()
+//	Renvoie le type ("= PI_UCGraphics")
+// void SetBaseGraphic(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Permet de modifier l'objet "PIGraphic" de départ et l'espace graphique correspondant.
+//
+// void  SelFontSz(PIGrCoord sz, PIFontAtt att=PI_RomanFont)
+//	Sélection de fonte avec la taille exprimée en coordonnées utilisateur
+// void  SelMarkerSz(PIGrCoord msz, PIMarker mrk=PI_DotMarker)
+//	Sélection de marker avec la taille exprimée en coordonnées utilisateur
+//--
 
 /* --Methode-- */
@@ -35,4 +69,5 @@
 }
 
+
 /* --Methode-- */
 void PIGraphicUC::SetBaseGraphic(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
@@ -51,4 +86,35 @@
 }
 
+//++
+// Titre	Système de coordonnées utilisateur
+//--
+//++
+// void       SetUCS(float xmin, float xmax, float ymin, float ymax, -
+// int axrl=kAxeDirSame, int ayud=kAxeDirSame)
+//	Définit le système de coordonnées utilisateur. Axe X de "xmin" à "xmax" , 
+//	Axe Y de "ymin" à "ymax". "axrl", "ayud" définit le sens des axes 
+//	sur la fenêtre :
+//|	kAxeDirSame : Pas de changement de sens
+//|	kAxeDirLtoR : Axe X croissant de gauche à droite   
+//|	kAxeDirRtoL : Axe X croissant de droite à gauche 
+//|	kAxeDirDownUp : Axe Y croissant de Bas vers Haut
+//|	kAxeDirUpDown : Axe Y croissant de Haut vers Bas
+//|	kAxeDirAuto : Sens determine a partir de la valeur relative de xmin, xmax, ymin, ymax
+//|	              xmin < xmax : kAxeDirLtoR   -  xmax < xmin : kAxeDirRtoL
+//|	              ymin < ymax : kAxeDirDownUp -  ymax < ymin : kAxeDirUpDown
+//	Par défaut : "xmin=ymin=0." , "ymin=ymax=0." , "kAxeDirLtoR" , "kAxeDirDownUp"
+// 
+// void  UC2GrC(float x, float y, float& xpix, float& ypix)
+//	Transformation de coordonnées utilisateur "(x,y)" en coordoonnées 
+//	de l'espace graphic de départ "(xpix, ypix)"
+// void  GrC2UC(float xpix, float ypix, float& x, float& y)
+//	Transformation de coordonnées de l'espace graphic de départ. en coordonnées utilisateur.
+// void  DUC2GrC(float dx, float dy, float& dxpix, float& dypix)
+//	Transformation de distances selon X,Y en coordonnées utilisateur "dx, dy" en distance
+//	dans l'espace graphique de départ "dxpix , dypix".
+// void  DGrC2UC(float dxpix, float dypix, float& dx, float& dy)
+//	Transformation de distances selon X,Y dans l'espace graphique de départ en distance
+//	dans l'espace de  coordonnées utilisateur.
+//--
 
 /* --Methode-- */
@@ -172,5 +238,5 @@
 
 /* --Methode-- */
-void PIGraphicUC::DrawString(PIGrCoord x, PIGrCoord y, char* s, int pos)
+void PIGraphicUC::DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos)
 {
   if (!mGrC) return;
@@ -181,5 +247,5 @@
 
 /* --Methode-- */
-void PIGraphicUC::DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int pos)
+void PIGraphicUC::DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos)
 {
   if (!mGrC) return;
@@ -338,4 +404,26 @@
 }
 
+/* --Methode-- */
+void PIGraphicUC::DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+  if (!mGrC) return;
+
+  float xf, yf, dxf, dyf;
+  UC2GrC(x0, y0, xf, yf);
+  DUC2GrC(dx, dy, dxf, dyf);
+  mGrC->DrawOval(xf, yf, dxf, dyf);
+}
+
+/* --Methode-- */
+void PIGraphicUC::DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+  if (!mGrC) return;
+
+  float xf, yf, dxf, dyf;
+  UC2GrC(x0, y0, xf, yf);
+  DUC2GrC(dx, dy, dxf, dyf);
+  mGrC->DrawFOval(xf, yf, dxf, dyf);
+}
+
 #define NMXMULTP  30   // Pour multipoint sans new
 
@@ -384,4 +472,27 @@
 }
 
+
+/* --Methode-- */
+void PIGraphicUC::DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                          float degdeb, float degfin)
+{
+  if (!mGrC) return;
+
+  float xf, yf, dxf, dyf;
+  UC2GrC(x0, y0, xf, yf);
+  DUC2GrC(dx, dy, dxf, dyf);
+  mGrC->DrawArc(xf, yf, dxf, dyf, degdeb, degfin);
+}
+/* --Methode-- */
+void PIGraphicUC::DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                           float degdeb, float degfin)
+{
+  if (!mGrC) return;
+
+  float xf, yf, dxf, dyf;
+  UC2GrC(x0, y0, xf, yf);
+  DUC2GrC(dx, dy, dxf, dyf);
+  mGrC->DrawFArc(xf, yf, dxf, dyf, degdeb, degfin);
+}
 
 /* --Methode-- */
@@ -596,4 +707,18 @@
   return(mGrC->GetMarkerSize());
 }
+/* --Methode-- */
+PIGrCoord PIGraphicUC::GetFontHeightUC(PIGrCoord& asc, PIGrCoord& desc)
+{
+  asc = desc = 0;
+  if (!mGrC) return(0);
+  int h,a,d;
+  float fh, fa, fd, x;
+  h = mGrC->GetFontHeight(a, d) ;
+  DGrC2UC(0., h, x, fh);
+  DGrC2UC(0., a, x, fa);
+  DGrC2UC(0., d, x, fd);
+  asc = a;  desc = d;
+  return(fh);
+}
 
 /* --Methode-- */
Index: trunk/SophyaPI/PI/pigraphuc.h
===================================================================
--- trunk/SophyaPI/PI/pigraphuc.h	(revision 157)
+++ trunk/SophyaPI/PI/pigraphuc.h	(revision 158)
@@ -37,6 +37,6 @@
 //  Trace graphiques
   virtual void       Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
-  virtual void       DrawString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
-  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
+  virtual void       DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
+  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
   virtual void       DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2);
   virtual void       DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
@@ -44,6 +44,13 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
+  virtual void       DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
+  virtual void       DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
   virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
-  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
+  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true); 
+  virtual void       DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                             float degdeb, float degfin);
+  virtual void       DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                              float degdeb, float degfin);
+ 
   virtual void       DrawMarker(PIGrCoord x0, PIGrCoord y0);
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n);
@@ -66,4 +73,5 @@
   virtual void       SelFontSz(PIGrCoord sz, PIFontAtt att=PI_RomanFont);
   virtual void       SelMarkerSz(PIGrCoord msz, PIMarker mrk=PI_DotMarker);
+  virtual PIGrCoord  GetFontHeightUC(PIGrCoord& asc, PIGrCoord& desc);
 
 // Selection de zone de trace (clip)
@@ -81,5 +89,5 @@
   virtual int        GetMarkerSize();
 
-  virtual int        GetFontHeight(int& asc, int& desc);
+  virtual int	     GetFontHeight(int& asc, int& desc);
   virtual PIGrCoord  CalcStringWidth(char const* s);
 
Index: trunk/SophyaPI/PI/pigraphx.cc
===================================================================
--- trunk/SophyaPI/PI/pigraphx.cc	(revision 157)
+++ trunk/SophyaPI/PI/pigraphx.cc	(revision 158)
@@ -14,8 +14,9 @@
 #define NMAXFONTSZ  7
 static XFontStruct * fntst[NMAXFONTSZ][3];
-static int fntsz[NMAXFONTSZ] = {8,10,12,14,16,20,24};
+static int fntsz[NMAXFONTSZ] = {8,10,12,14,18,24,36};
 static int SmallFontIndex = 1; 
 static int NormalFontIndex = 3;
-static int BigFontIndex = 6;
+static int BigFontIndex = 5;
+static int HugeFontIndex = 6;
 static  PIFontAtt fntatt[3] = { PI_RomanFont, PI_BoldFont, PI_ItalicFont }; 
 #define NMAXCOL  16
@@ -31,7 +32,15 @@
 : PIGraphicGen(wdg)
 {
+
 Init();
 
+if (MyWdg()) {
+  mDisp = XtDisplay(MyWdg());       // Structure Display X associe
+  mWId = XtWindow(MyWdg());   // Le drawable X
+  }
+else mDisp = PIXDisplay();       // Structure Display X associe
+
 mDefGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), 0, NULL);
+
 mGOm = PI_GOCopy;
 
@@ -53,14 +62,22 @@
 
 /* --Methode-- */
+void PIGraphicX::TerminateInit()
+{
+if (MyWdg() == NULL)  { fprintf(stderr, "BUG/PIGraphicX::TerminateInit() for NULL Wdg \n"); return; }
+mDisp = XtDisplay(MyWdg());       // Structure Display X associe
+mWId = XtWindow(MyWdg());   // Le drawable X
+}
+
+/* --Methode-- */
 void PIGraphicX::Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
 {
-XClearArea (XtDisplay(MyWdg()),XtWindow(MyWdg()), (int)x0, (int)y0, (int)dx, (int)dy, False );
-return;
-}
-
-/* --Methode-- */
-void PIGraphicX::DrawString(PIGrCoord x, PIGrCoord y, char* s, int /*pos*/)
-{
-XDrawString (XtDisplay (MyWdg()),XtWindow(MyWdg()), 
+XClearArea (mDisp,mWId, (int)x0, (int)y0, (int)dx, (int)dy, False );
+return;
+}
+
+/* --Methode-- */
+void PIGraphicX::DrawString(PIGrCoord x, PIGrCoord y, const char* s, int /*pos*/)
+{
+XDrawString (XtDisplay (MyWdg()),mWId, 
                   DefGC(), (int)x, (int)y, s, strlen(s));
 return;
@@ -68,7 +85,7 @@
 
 /* --Methode-- */
-void PIGraphicX::DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int /*pos*/)
-{
-XDrawImageString (XtDisplay (MyWdg()),XtWindow(MyWdg()), 
+void PIGraphicX::DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int /*pos*/)
+{
+XDrawImageString (XtDisplay (MyWdg()),mWId, 
                   DefGC(), (int)x, (int)y, s, strlen(s));
 return;
@@ -79,5 +96,5 @@
 void PIGraphicX::DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
 {
-XDrawLine(XtDisplay (MyWdg()), XtWindow(MyWdg()), DefGC(), (int)x1, (int)y1, (int)x2, (int)y2);
+XDrawLine(XtDisplay (MyWdg()), mWId, DefGC(), (int)x1, (int)y1, (int)x2, (int)y2);
 return;
 }
@@ -93,5 +110,5 @@
 if (idx < 0)  { ix0 += idx;  idx = -idx; }
 if (idy < 0)  { iy0 += idy;  idy = -idy; }
-XDrawRectangle(XtDisplay (MyWdg()), XtWindow(MyWdg()), 
+XDrawRectangle(XtDisplay (MyWdg()), mWId, 
                DefGC(), ix0, iy0, idx, idy);
 return;
@@ -107,5 +124,5 @@
 if (idx < 0)  { ix0 += idx;  idx = -idx; }
 if (idy < 0)  { iy0 += idy;  idy = -idy; }
-XFillRectangle(XtDisplay (MyWdg()), XtWindow(MyWdg()), 
+XFillRectangle(XtDisplay (MyWdg()), mWId, 
                DefGC(), ix0, iy0, idx, idy);
 return;
@@ -115,5 +132,5 @@
 void PIGraphicX::DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)
 {
-XDrawArc(XtDisplay (MyWdg()), XtWindow(MyWdg()), DefGC(),
+XDrawArc(XtDisplay (MyWdg()), mWId, DefGC(),
          (int)x0-(int)r, (int)y0-(int)r, 2*(int)r, 2*(int)r, 0, 360*64);
 return;
@@ -123,6 +140,22 @@
 void PIGraphicX::DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)
 {
-XFillArc(XtDisplay (MyWdg()), XtWindow(MyWdg()), DefGC(),
+XFillArc(XtDisplay (MyWdg()), mWId, DefGC(),
          (int)x0-(int)r, (int)y0-(int)r, 2*(int)r, 2*(int)r, 0, 360*64);
+return;
+}
+
+/* --Methode-- */
+void PIGraphicX::DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+XDrawArc(XtDisplay (MyWdg()), mWId, DefGC(),
+         (int)x0, (int)y0, (int)dx, (int)dy, 0, 360*64);
+return;
+}
+
+/* --Methode-- */
+void PIGraphicX::DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+XFillArc(XtDisplay (MyWdg()), mWId, DefGC(),
+         (int)x0, (int)y0, (int)dx, (int)dy, 0, 360*64);
 return;
 }
@@ -144,5 +177,5 @@
 int mode = CoordModeOrigin;
 if (cinc) mode =  CoordModePrevious;
-XDrawLines(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, mode);
+XDrawLines(mDisp, mWId, DefGC(), pxp, n, mode);
 if (n > NMXXPOINTS)  delete[] pxp;
 
@@ -164,8 +197,26 @@
 int mode = CoordModeOrigin;
 if (cinc) mode =  CoordModePrevious;
-XFillPolygon(XtDisplay (MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, 
+XFillPolygon(XtDisplay (MyWdg()), mWId, DefGC(), pxp, n, 
                         Complex, mode);
 if (n > NMXXPOINTS)  delete[] pxp;
 
+return;
+}
+
+/* --Methode-- */
+void PIGraphicX::DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                         float degdeb, float degfin)
+{
+XDrawArc(XtDisplay (MyWdg()), mWId, DefGC(),
+         (int)x0, (int)y0, (int)dx, (int)dy, (int)(degdeb*64.), (int)(degfin*64.));
+return;
+}
+
+/* --Methode-- */
+void PIGraphicX::DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                         float degdeb, float degfin)
+{
+XFillArc(XtDisplay (MyWdg()), mWId, DefGC(),
+         (int)x0, (int)y0, (int)dx, (int)dy, (int)(degdeb*64.), (int)(degfin*64.));
 return;
 }
@@ -180,5 +231,5 @@
 
 if (mMrk == PI_DotMarker)
-  XDrawPoint(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), (int)x0, (int)y0);
+  XDrawPoint(mDisp, mWId, DefGC(), (int)x0, (int)y0);
 
 else  {
@@ -217,5 +268,5 @@
       break;
     default :
-      XDrawPoint(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), x0, y0);
+      XDrawPoint(mDisp, mWId, DefGC(), x0, y0);
       break;
     }
@@ -238,5 +289,5 @@
   else pxp = multipoint;
   for(i=0; i<n; i++)  { pxp[i].x = x[i];  pxp[i].y = y[i]; } 
-  XDrawPoints(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, CoordModeOrigin);
+  XDrawPoints(mDisp, mWId, DefGC(), pxp, n, CoordModeOrigin);
   if (n > NMXXPOINTS)  delete[] pxp;  
   }
@@ -263,5 +314,5 @@
 
   
-xw = XtWindow(MyWdg());
+xw = mWId;
 mdsp = PIXDisplay();
 scr = PIXScreen();
@@ -294,5 +345,5 @@
 if (col == mFCol)  return;
 if ( (col < 0) || (col >= NMAXCOL))  return;
-XSetForeground(XtDisplay(MyWdg()), DefGC(), colpix[col]); 
+XSetForeground(mDisp, DefGC(), colpix[col]); 
 mFCol = col;  
 return;
@@ -304,5 +355,5 @@
 if (col == mBCol)  return;
 if ( (col < 0) || (col >= NMAXCOL))  return;
-XSetBackground(XtDisplay(MyWdg()), DefGC(), colpix[col]); 
+XSetBackground(mDisp, DefGC(), colpix[col]); 
 mBCol = col;  
 return;
@@ -328,9 +379,9 @@
   {
   case PI_GOCopy :
-    XSetFunction(XtDisplay(MyWdg()), DefGC(), GXcopy);
+    XSetFunction(mDisp, DefGC(), GXcopy);
     mGOm = mod;
     break;
   case PI_GOXOR :
-    XSetFunction(XtDisplay(MyWdg()), DefGC(), GXxor);
+    XSetFunction(mDisp, DefGC(), GXxor);
     mGOm = mod;
     break;
@@ -377,4 +428,7 @@
     i = BigFontIndex;
     break;
+  case PI_HugeSizeFont:
+    i = HugeFontIndex;
+    break;
   default:
     i = NormalFontIndex;
@@ -432,6 +486,9 @@
     break;
   }
-    
-XSetLineAttributes(XtDisplay(MyWdg()), DefGC(), lt, lstyle, CapButt, JoinMiter);
+if (lstyle != LineSolid) { 
+  char dash[2]= {3,3};   
+  XSetDashes( mDisp, DefGC(), 0, dash, 2);
+  }
+XSetLineAttributes(mDisp, DefGC(), lt, lstyle, CapButt, JoinMiter);
 mLAtt = att;
 return;
@@ -454,6 +511,6 @@
 xr.x = x0;  xr.y = y0;
 xr.width = dx;  xr.height = dy;
-XSetClipRectangles(XtDisplay(MyWdg()), DefGC(), 0, 0, &xr, 1, Unsorted);
-XSetClipRectangles(XtDisplay(MyWdg()), dpxgc, 0, 0, &xr, 1, Unsorted);
+XSetClipRectangles(mDisp, DefGC(), 0, 0, &xr, 1, Unsorted);
+XSetClipRectangles(mDisp, dpxgc, 0, 0, &xr, 1, Unsorted);
 return;
 }
@@ -462,6 +519,6 @@
 void PIGraphicX::ClearClipRectangle()
 { 
-XSetClipMask(XtDisplay(MyWdg()), DefGC(), None);
-XSetClipMask(XtDisplay(MyWdg()), dpxgc, None);
+XSetClipMask(mDisp, DefGC(), None);
+XSetClipMask(mDisp, dpxgc, None);
 return;
 }
@@ -673,7 +730,10 @@
   if (kkj < kkdsz)  {  kksel = kkk;  kkdsz = kkj; }
   }
+if (kksel == NMAXFONTSZ-1)  kksel = NMAXFONTSZ-2;
 NormalFontIndex = kksel;
 SmallFontIndex = (kksel > 1) ? kksel-2 : 0 ;
-BigFontIndex = (kksel < NMAXFONTSZ-3) ? kksel+3 : NMAXFONTSZ-1 ;
+BigFontIndex =  NMAXFONTSZ-2 ;
+if (BigFontIndex < NormalFontIndex)  BigFontIndex = NormalFontIndex;
+HugeFontIndex = NMAXFONTSZ-1;
 
 //printf("PIGraphicX::Init()-DBG- FontIndex= %d %d %d (%d) \n", 
@@ -754,7 +814,7 @@
 mFSize = fntsz[isz];
 mFSt = fntst[isz][jat];
-XSetFont(XtDisplay(MyWdg()), DefGC(), fntst[isz][jat]->fid);
-return;
-}
-
-
+XSetFont(mDisp, DefGC(), fntst[isz][jat]->fid);
+return;
+}
+
+
Index: trunk/SophyaPI/PI/pigraphx.h
===================================================================
--- trunk/SophyaPI/PI/pigraphx.h	(revision 157)
+++ trunk/SophyaPI/PI/pigraphx.h	(revision 158)
@@ -1,2 +1,3 @@
+// This may look like C code, but it is really -*- C++ -*-
 // Module PI : Peida Interactive     PIGraphicX
 // Trace graphiques- Implementation X11  R. Ansari  97
@@ -17,6 +18,6 @@
 //  Trace graphiques
   virtual void       Erase(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
-  virtual void       DrawString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
-  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, char* s, int pos = 0);
+  virtual void       DrawString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
+  virtual void       DrawOpaqueString(PIGrCoord x, PIGrCoord y, const char* s, int pos = 0);
   virtual void       DrawLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2);
   virtual void       DrawBox(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
@@ -24,6 +25,12 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
+  virtual void       DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
+  virtual void       DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
   virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
   virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true);  
+  virtual void       DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
+                             float degdeb, float degfin);
+  virtual void       DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, 
+                              float degdeb, float degfin);
   virtual void       DrawMarker(PIGrCoord x0, PIGrCoord y0);
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n);
@@ -66,4 +73,7 @@
 //  Pour recuperer le pixcol d une couleur  (pour X) 
   PIXColor           GetPixelValueforColor(PIColors col);
+//  Pour initialiser mWId apres creation de fenetre
+  virtual void	     TerminateInit();
+
 protected:
   void           Init();
@@ -72,10 +82,13 @@
   inline SysDWdg MyWdg()  {return(myWdg->XtWdg()); }
   inline void    SelectBCol(PIXColor col) 
-    {XSetBackground(XtDisplay(MyWdg()), DefGC(), col);  mBCol = PI_ColorFromMap; mBCfMap = col; }
+    {XSetBackground(mDisp, DefGC(), col);  mBCol = PI_ColorFromMap; mBCfMap = col; }
   inline void    SelectFCol(PIXColor col) 
-    {XSetForeground(XtDisplay(MyWdg()), DefGC(), col);  mFCol = PI_ColorFromMap; mFCfMap = col; }
+    {XSetForeground(mDisp, DefGC(), col);  mFCol = PI_ColorFromMap; mFCfMap = col; }
 
+//  Structure et identificateur XWindow  associe
+  GC mDefGC;
+  Display* mDisp;  // Display X associe
+  Drawable mWId;   // Identificateur Window/Drawable X
 
-  GC mDefGC;
   PIColors  mFCol, mBCol;
   PIGOMode mGOm;
Index: trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 157)
+++ trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 158)
@@ -17,4 +17,5 @@
   xEndDrag = yEndDrag = xBegDrag = yBegDrag = 0;
   SetDefaultDrawRectangle(0.12, 0.12, 0.88, 0.88, true);
+//  SetDefaultDrawRectangle(0.12, 0.08, 0.88, 0.92, true);
   AddDrawer(mBDrw, true, false, false);
   
Index: trunk/SophyaPI/PI/piscdrawwdg.h
===================================================================
--- trunk/SophyaPI/PI/piscdrawwdg.h	(revision 157)
+++ trunk/SophyaPI/PI/piscdrawwdg.h	(revision 158)
@@ -31,4 +31,9 @@
 
   inline void        SetAxesFlags(unsigned int flags=kAxesDflt) { mBDrw->SetAxesFlags(flags); }
+
+  inline void	     SetTitles(const char* tt=NULL, const char* tb=NULL)
+                            { mBDrw->SetTitles(tt, tb); }
+  inline void	     SetTitles(string const & tt, string const & tb)
+                            { mBDrw->SetTitles(tt, tb); }
 
   int                AddScDrawer(PIDrawer*, bool ad=false);   // Ajoute un Drawer en auto 
@@ -76,5 +81,4 @@
   PIWindow * mTrW;
 
-
 private:
   bool  UpdateText(int xp, int yp);
Index: trunk/SophyaPI/PI/pistzwin.cc
===================================================================
--- trunk/SophyaPI/PI/pistzwin.cc	(revision 157)
+++ trunk/SophyaPI/PI/pistzwin.cc	(revision 158)
@@ -1,4 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
-// Module PI : Peida Interactive  PIStackWindow  PIZoneWindow
+// Module PI : Peida Interactive  - Zone/Stack Layout
+// PIStackLayout , PIZone Layout , PIStackWindow , PIZoneWindow
 //                             R. Ansari  08/98
 
@@ -8,34 +9,24 @@
 #include "psfile.h"
 
-// Fonction de l'objet PIPeriodic de PIStackWindow
-static void myadperpact(void* a);
-
-void myadperpact(void* a)
-{
-((PIStackWindow*)a)->DispNext();
-}
-/* --Methode-- */
-PIStackWindow::PIStackWindow(PIMsgHandler* par, char* nom, PIWindowKind k,
-                             int sx, int sy, int px, int py)
-        : PIWindow(par, nom, k, sx, sy, px, py) , mPerad(1)
+// -------------- Classe PIStackLayout --------------
+
+/* --Methode-- */
+PIStackLayout::PIStackLayout()
+	: PILayoutMgr()
 {
 mCurdisp = -1;
-mPerad.SetAction(myadperpact, this);
-} 
-
-
-/* --Methode-- */
-PIStackWindow::~PIStackWindow()
-{
-mPerad.Stop();
-Hide();
-}
-
-/* --Methode-- */
-void PIStackWindow::ChildAdd(PIWdg* child)
+}
+
+/* --Methode-- */
+PIStackLayout::~PIStackLayout()
+{
+}
+
+/* --Methode-- */
+void PIStackLayout::ChildAdd(PIWdg* child)
 {
 int k;
 for(k=0; k<NbChilds(); k++) GetChild(k)->UnManage();
-PIWindow::ChildAdd(child);
+PILayoutMgr::ChildAdd(child);
 child->Manage();
 mCurdisp = NbChilds()-1;
@@ -44,9 +35,9 @@
 
 /* --Methode-- */
-void PIStackWindow::ChildDel(PIWdg* child)
+void PIStackLayout::ChildDel(PIWdg* child)
 {
 int k;
 for(k=0; k<NbChilds(); k++) GetChild(k)->UnManage();
-PIWindow::ChildDel(child);
+PILayoutMgr::ChildDel(child);
 if (NbChilds() > 0) {
   mCurdisp--;
@@ -60,4 +51,59 @@
 
 /* --Methode-- */
+void PIStackLayout::DispNext()
+{
+if (NbChilds() < 1) return;
+int n = (mCurdisp+1)%NbChilds();
+DispWdgNum(n);
+}
+
+/* --Methode-- */
+void PIStackLayout::DispWdgNum(int n)
+{
+if ( (n < 0) || (n >= NbChilds()) )  return;
+for(int k=0; k<NbChilds(); k++) GetChild(k)->UnManage();
+mCurdisp = n;
+GetChild(mCurdisp)->Manage();
+return;
+}
+
+
+// -------------- Classe PIStackWindow --------------
+
+// Fonction de l'objet PIPeriodic de PIStackWindow
+static void myadperpact(void* a);
+
+void myadperpact(void* a)
+{
+((PIStackWindow*)a)->DispNext();
+}
+
+/* --Methode-- */
+PIStackWindow::PIStackWindow(PIMsgHandler* par, char* nom, PIWindowKind k,
+                             int sx, int sy, int px, int py)
+        : PIWindow(par, nom, k, sx, sy, px, py) , mPerad(1)
+{
+mPerad.SetAction(myadperpact, this);
+delete layout;
+layout = new PIStackLayout;
+layout->SetContainer(this); 
+} 
+
+
+/* --Methode-- */
+PIStackWindow::~PIStackWindow()
+{
+mPerad.Stop();
+Hide();
+}
+
+/* --Methode-- */
+void PIStackWindow::SetLayoutMgr(PILayoutMgr*)
+{
+fprintf(stderr, "PIStackWindow::SetLayoutMgr() - LayoutMgr cannot be changed \n");
+return;
+}
+
+/* --Methode-- */
 void PIStackWindow::PSPrint(PSFile *psf, int ofx, int ofy)
 {
@@ -70,22 +116,4 @@
 }
 
-/* --Methode-- */
-PIWdg* PIStackWindow::CurrentWdg()
-{
-return(GetChild(mCurdisp));
-}
-
-/* --Methode-- */
-void PIStackWindow::DispNext()
-{
-if (NbChilds() < 1) return;
-mCurdisp = (mCurdisp+1)%NbChilds();
-PIWdg* wc = GetChild(mCurdisp);
-wc->Manage();
-int k;
-for(k=0; k<NbChilds(); k++) 
-  if (k != mCurdisp) GetChild(k)->UnManage();
-return;
-}
 
 /* --Methode-- */
@@ -101,10 +129,9 @@
 }
 
-//-------------------------------------------------------------------------------
-
-/* --Methode-- */
-PIZoneWindow::PIZoneWindow(PIMsgHandler* par, char* nom, PIWindowKind k,
-                           int nzx, int nzy, int sx, int sy, int px, int py)
-        : PIWindow(par, nom, k, sx, sy, px, py)
+//-------------------- Classe PIZoneLayout ------------------------------
+
+/* --Methode-- */
+PIZoneLayout::PIZoneLayout(int nzx, int nzy)
+	: PILayoutMgr()
 {
 mZWdg = NULL;
@@ -113,11 +140,12 @@
 
 /* --Methode-- */
-PIZoneWindow::~PIZoneWindow()
+PIZoneLayout::~PIZoneLayout()
 {
 delete[] mZWdg;
 }
 
-/* --Methode-- */
-void PIZoneWindow::SetZone(int nzx, int nzy)
+
+/* --Methode-- */
+void PIZoneLayout::SetZone(int nzx, int nzy)
 {
 int i;
@@ -140,13 +168,13 @@
 
 /* --Methode-- */
-void PIZoneWindow::ChildAdd(PIWdg * child)
+void PIZoneLayout::ChildAdd(PIWdg * child)
 {
 if (!child) return;
 int nx = mZc%mZx;
 int ny = mZc/mZx;
-PIWindow::ChildAdd(child);
+PILayoutMgr::ChildAdd(child);
 child->SetBinding(PIBK_free,PIBK_free,PIBK_free, PIBK_free);
-int sx = XSize()/mZx;
-int sy = YSize()/mZy;
+int sx = mCont->XSize()/mZx;
+int sy = mCont->YSize()/mZy;
 child->SetPos(nx*sx, ny*sy);
 child->SetSize(sx, sy);
@@ -162,5 +190,5 @@
 
 /* --Methode-- */
-void PIZoneWindow::ChildDel(PIWdg * child)
+void PIZoneLayout::ChildDel(PIWdg * child)
 {
 if (!child)  return;
@@ -168,10 +196,10 @@
 for(k=0; k<mZx*mZy; k++) 
   if (mZWdg[k] == child) mZWdg[k] = NULL;  
-PIWindow::ChildDel(child);
-return;
-}
-
-/* --Methode-- */
-void PIZoneWindow::NbZone(int& nzx, int& nzy)
+PILayoutMgr::ChildDel(child);
+return;
+}
+
+/* --Methode-- */
+void PIZoneLayout::NbZone(int& nzx, int& nzy)
 {
 nzx = mZx;   nzy = mZy;
@@ -179,8 +207,8 @@
 
 /* --Methode-- */
-PIWdg* PIZoneWindow::NextChildPosSize(int& px, int& py, int& sx, int& sy)
-{
-sx = XSize()/mZx;
-sy = YSize()/mZy;
+PIWdg* PIZoneLayout::NextChildPosSize(int& px, int& py, int& sx, int& sy)
+{
+sx = mCont->XSize()/mZx;
+sy = mCont->YSize()/mZy;
 int nx = mZc%mZx;
 int ny = mZc/mZx;
@@ -188,2 +216,29 @@
 return ((PIWdg*)mZWdg[mZc]);
 }
+
+
+//-------------------- Classe PIZoneWindow ------------------------------
+
+/* --Methode-- */
+PIZoneWindow::PIZoneWindow(PIMsgHandler* par, char* nom, PIWindowKind k,
+                           int nzx, int nzy, int sx, int sy, int px, int py)
+        : PIWindow(par, nom, k, sx, sy, px, py)
+{
+delete layout;
+layout = new PIZoneLayout(nzx, nzy);
+layout->SetContainer(this); 
+}
+
+/* --Methode-- */
+PIZoneWindow::~PIZoneWindow()
+{
+Hide();
+}
+
+/* --Methode-- */
+void PIZoneWindow::SetLayoutMgr(PILayoutMgr*)
+{
+fprintf(stderr, "PIZoneWindow::SetLayoutMgr() - LayoutMgr cannot be changed \n");
+return;
+}
+
Index: trunk/SophyaPI/PI/pistzwin.h
===================================================================
--- trunk/SophyaPI/PI/pistzwin.h	(revision 157)
+++ trunk/SophyaPI/PI/pistzwin.h	(revision 158)
@@ -10,7 +10,27 @@
 #include PIPERIODIC_H
 
+// ----------------------- Classe PIStackLayout ----------------------------
+// Pour Fenetre de type empilement , tout widget occupe la totalite 
+// de la fenetre - Un seul des widget visible (active) a chaque moment
+
+class PIStackLayout : public PILayoutMgr {
+public:
+		PIStackLayout();
+  virtual 	~PIStackLayout();
+
+  virtual void  ChildAdd(PIWdg* child);
+  virtual void  ChildDel(PIWdg* child);
+
+  inline PIWdg*  CurrentWdg() { return(GetChild(mCurdisp)); }
+  inline int    NumCurrentWdg() { return(mCurdisp); } 
+  virtual void  DispNext();
+  virtual void  DispWdgNum(int n);
+
+protected:
+  int mCurdisp;
+};
+		
 // ----------------------- Classe PIStackWindow ----------------------------
-// Fenetre de type empilement , tout widget occupe la totalite de la fenetre,
-// Un seul des widget visible (active) a chaque moment
+//                    Fenetre avec un PIStackLayout
 
 class PIStackWindow : public PIWindow {
@@ -18,13 +38,12 @@
 		PIStackWindow(PIMsgHandler* par, char* nom, PIWindowKind k=PIWK_normal,
                               int sx=100, int sy=100, int px=0, int py=0);
-		~PIStackWindow();
+  virtual	~PIStackWindow();
 
-  virtual void  ChildAdd(PIWdg* child);
-  virtual void  ChildDel(PIWdg* child);
-
+  virtual void  SetLayoutMgr(PILayoutMgr* nlay);
   virtual void  PSPrint(PSFile *psf, int ofx=0, int ofy=0);
 
-  virtual PIWdg*  CurrentWdg();
-  virtual void  DispNext();
+  inline  void  DispNext() { ((PIStackLayout*)layout)->DispNext(); }
+  inline  PIWdg* CurrentWdg() { return( ((PIStackLayout*)layout)->CurrentWdg() ); }
+
   virtual void  StartAutoDisp(int dt);
   virtual void  StopAutoDisp();
@@ -32,10 +51,29 @@
 protected:
   PIPeriodic mPerad;
-  int mCurdisp;
+};
+
+// ----------------------- Classe PIZoneLayout ----------------------------
+// Pour fenetre avec nzx*nzy zone d affichage - Les nouveaux widgets dans chaque
+// zone viennent remplacer les anciennes - Ceux-ci sont detruits automatiquement
+
+
+class PIZoneLayout : public PILayoutMgr {
+public:
+		PIZoneLayout(int nzx=1, int nzy=1);
+  virtual 	~PIZoneLayout();
+
+  virtual void  ChildAdd(PIWdg* child);
+  virtual void  ChildDel(PIWdg* child);
+  virtual void  SetZone(int nzx, int nzy);
+  virtual void  NbZone(int& nzx, int& nzy);
+  virtual PIWdg* NextChildPosSize(int& px, int& py, int& sx, int& sy);
+
+protected:
+  int mZx, mZy, mZc;
+  PIWdg** mZWdg;
 };
 
 // ----------------------- Classe PIZoneWindow ----------------------------
-// Fenetre avec nzx*nzy zone d affichage - Les nouveaux widgets dans chaque
-// zone viennent remplacer les anciennes - Ceux-ci sont detruits automatiquement
+//                    Fenetre avec un PIZoneLayout 
  
 class PIZoneWindow : public PIWindow {
@@ -43,15 +81,15 @@
 		PIZoneWindow(PIMsgHandler* par, char* nom, PIWindowKind k=PIWK_normal,
                              int nzx=1, int nzy=1, int sx=100, int sy=100, int px=0, int py=0);
-		~PIZoneWindow();
+  virtual	~PIZoneWindow();
 
-  virtual void  ChildAdd(PIWdg* child);
-  virtual void  ChildDel(PIWdg* child);
-  virtual void  SetZone(int nzx, int nzy);
-  virtual void  NbZone(int& nzx, int& nzy);
-  virtual PIWdg*  NextChildPosSize(int& px, int& py, int& sx, int& sy);
+  virtual void  SetLayoutMgr(PILayoutMgr* nlay);
+
+  inline  void  SetZone(int nzx, int nzy) { ((PIZoneLayout*)layout)->SetZone(nzx, nzy); }
+  inline  void  NbZone(int& nzx, int& nzy)  { ((PIZoneLayout*)layout)->NbZone(nzx, nzy); }
+  inline PIWdg* NextChildPosSize(int& px, int& py, int& sx, int& sy)
+                { return ( ((PIZoneLayout*)layout)->NextChildPosSize(px, py, sx, sy) ); }
 
 protected:
-  int mZx, mZy, mZc;
-  PIWdg** mZWdg;
 };
+
 #endif
Index: trunk/SophyaPI/PI/piwdggen.h
===================================================================
--- trunk/SophyaPI/PI/piwdggen.h	(revision 157)
+++ trunk/SophyaPI/PI/piwdggen.h	(revision 158)
@@ -1,5 +1,6 @@
 // This may look like C code, but it is really -*- C++ -*-
-// Module PI : Peida Interactive      PIWindowGen
+// Module PI : Peida Interactive      PIWdgGen
 //                                    Reza 10/95            
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
 
 #ifndef PIWDG_H_SEEN
Index: trunk/SophyaPI/PI/piwdgx.h
===================================================================
--- trunk/SophyaPI/PI/piwdgx.h	(revision 157)
+++ trunk/SophyaPI/PI/piwdgx.h	(revision 158)
@@ -90,4 +90,5 @@
 unsigned long PIXGetLastEventSerial();
 void PIXSetLastEventTimeSerial(Time t, unsigned long ser);
+void PIXGetLastEventInfo(unsigned int& st, Time& t);
 
 
Index: trunk/SophyaPI/PI/pixtbase.cc
===================================================================
--- trunk/SophyaPI/PI/pixtbase.cc	(revision 157)
+++ trunk/SophyaPI/PI/pixtbase.cc	(revision 158)
@@ -97,7 +97,9 @@
 
 
-/*  Last XEvent Serial Number and Time-Stamp  */
+/*  Last XEvent Serial Number and Time-Stamp , and Key-state */
 static Time last_time_xevt = 0;
 static unsigned long last_serial_xevt = 0;
+static unsigned int  last_state_xevt = 0;
+
 
 Time PIXGetLastEventTime() { return(last_time_xevt); }
@@ -105,4 +107,6 @@
 void PIXSetLastEventTimeSerial(Time t, unsigned long ser) 
 { last_time_xevt = t;  last_serial_xevt = ser; }
+void PIXGetLastEventInfo(unsigned int& st, Time& t)
+{ st = last_state_xevt;  t = last_time_xevt; }
 
 /* Nouvelle-Fonction */
@@ -203,4 +207,5 @@
     last_time_xevt = evt->xcrossing.time;
     last_serial_xevt = evt->xcrossing.serial;
+    last_state_xevt = evt->xcrossing.state;
 //    if (((PIXtBaseWidget)wdgp)->pixtbase.objet) 
     (((PIXtBaseWidget)wdgp)->pixtbase.objet)->Enter();
@@ -214,4 +219,5 @@
     last_time_xevt = evt->xcrossing.time;
     last_serial_xevt = evt->xcrossing.serial;
+    last_state_xevt = evt->xcrossing.state;
 //    if (((PIXtBaseWidget)wdgp)->pixtbase.objet) 
        (((PIXtBaseWidget)wdgp)->pixtbase.objet)->Leave();
@@ -221,4 +227,5 @@
     last_time_xevt = evt->xbutton.time;
     last_serial_xevt = evt->xbutton.serial;
+    last_state_xevt = evt->xbutton.state;
     if ( (evt->xbutton.button == 1) && ( ((PIXtBaseWidget)wdgp)->pixtbase.myeventmask & Button1Mask) )
       (((PIXtBaseWidget)wdgp)->pixtbase.objet)->But1Press(evt->xbutton.x, evt->xbutton.y);
@@ -232,4 +239,5 @@
     last_time_xevt = evt->xbutton.time;
     last_serial_xevt = evt->xbutton.serial;
+    last_state_xevt = evt->xbutton.state;
     if ( (evt->xbutton.button == 1) && ( ((PIXtBaseWidget)wdgp)->pixtbase.myeventmask & Button1Mask) )
       (((PIXtBaseWidget)wdgp)->pixtbase.objet)->But1Release(evt->xbutton.x, evt->xbutton.y);
@@ -250,7 +258,8 @@
       }
     else { key_but =  evt->xmotion.state ; xw = evt->xmotion.x;  yw = evt->xmotion.y; }
-    if  ( !(key_but & ( Button1Mask | Button2Mask | Button3Mask ) ) ) break;
+//    if  ( !(key_but & ( Button1Mask | Button2Mask | Button3Mask ) ) ) break;
       last_time_xevt = evt->xmotion.time;
       last_serial_xevt = evt->xmotion.serial;
+      last_state_xevt = evt->xmotion.state;
       if  (key_but & Button1Mask ) 
         (((PIXtBaseWidget)wdgp)->pixtbase.objet)->Ptr1Move(xw, yw);
@@ -259,4 +268,6 @@
       else  if (key_but & Button3Mask ) 
         (((PIXtBaseWidget)wdgp)->pixtbase.objet)->Ptr3Move(xw, yw);
+      else if ( !(key_but & (Button4Mask|Button5Mask)) ) 
+        (((PIXtBaseWidget)wdgp)->pixtbase.objet)->PtrMove(xw, yw);
     }
   break;
Index: trunk/SophyaPI/PI/psfile.cc
===================================================================
--- trunk/SophyaPI/PI/psfile.cc	(revision 157)
+++ trunk/SophyaPI/PI/psfile.cc	(revision 158)
@@ -14,4 +14,19 @@
 
 #include "psfile.h"
+
+//++
+// Class	PSFile
+// Lib		PI
+// include	psfile.h
+//
+//   	Classe encapsulant un fichier PostScript, fournissant des primitives
+//	graphiques produisant du code PostScript.
+//--
+//++
+// Links	Voir aussi
+// PIGraphicPS
+//--
+
+
 
 /* En cm */
@@ -259,4 +274,15 @@
 "
 
+//++
+// Titre	Constructeurs
+//--
+//++
+// PSFile (const char * FileName, float sc = 1.0)
+//	Créateur pour fichier Encapsulated Postscript
+// PSFile (const char * FileName, PIOrientation orientation, -
+//         PIPaperSize paperSize= PI_A4, -
+//         float marginX = 5.0, float marginY = 5.0 )
+//	Créateur pour fichier Postscript
+//--
 
 /* 
@@ -671,5 +697,5 @@
 
 
-void  PSFile::DrawString  (float x,  float y, char *s, 
+void  PSFile::DrawString  (float x,  float y, const char *s, 
 			   PIColors DrawColor, 
 			   PIFontAtt FontAtt, 
Index: trunk/SophyaPI/PI/psfile.h
===================================================================
--- trunk/SophyaPI/PI/psfile.h	(revision 157)
+++ trunk/SophyaPI/PI/psfile.h	(revision 158)
@@ -103,5 +103,5 @@
 
     /* Trace */
-    virtual void  DrawString  (float x,  float y, char *s, 
+    virtual void  DrawString  (float x,  float y, const char *s, 
 			       PIColors DrawColor  = PI_NotDefColor, 
 			       PIFontAtt FontAtt   = PI_NotDefFontAtt, 
