Index: /trunk/SophyaPI/PI/Makefile
===================================================================
--- /trunk/SophyaPI/PI/Makefile	(revision 112)
+++ /trunk/SophyaPI/PI/Makefile	(revision 113)
@@ -4,5 +4,5 @@
  
 all: $(LIB)libPI.a
-$(LIB)libPI.a : $(OBJ)lut.o $(OBJ)pi3ddrw.o $(OBJ)piapplgen.o $(OBJ)piapplx.o $(OBJ)pibwdggen.o $(OBJ)pibwdgx.o $(OBJ)picmap.o $(OBJ)picmapgen.o $(OBJ)picmapx.o $(OBJ)picons.o $(OBJ)picontainergen.o $(OBJ)picontainerx.o $(OBJ)pidrawer.o $(OBJ)pidrawwin.o $(OBJ)pidrwtools.o $(OBJ)pifilechogen.o $(OBJ)pifilechox.o $(OBJ)pigraph3d.o $(OBJ)pigraphgen.o $(OBJ)pigraphps.o $(OBJ)pigraphuc.o $(OBJ)pigraphx.o $(OBJ)pihisto.o $(OBJ)pihisto2d.o $(OBJ)piimage.o $(OBJ)piimgtools.o $(OBJ)piinit.o $(OBJ)pilistgen.o $(OBJ)pilistx.o $(OBJ)pimenubargen.o $(OBJ)pimenubarx.o $(OBJ)pimenugen.o $(OBJ)pimenux.o $(OBJ)pimsghandler.o $(OBJ)pintuple.o $(OBJ)pioptmenugen.o $(OBJ)pioptmenux.o $(OBJ)piperiodx.o $(OBJ)pipixmapgen.o $(OBJ)pipixmapx.o $(OBJ)piscdrawwdg.o $(OBJ)pistdwdggen.o $(OBJ)pistdwdgx.o $(OBJ)pistlist.o $(OBJ)piup.o $(OBJ)piwdggen.o $(OBJ)piwdgx.o $(OBJ)piwindowgen.o $(OBJ)piwindowx.o $(OBJ)pixtbase.o $(OBJ)psfile.o
+$(LIB)libPI.a : $(OBJ)lut.o $(OBJ)parradapter.o $(OBJ)pi3ddrw.o $(OBJ)piapplgen.o $(OBJ)piapplx.o $(OBJ)pibwdggen.o $(OBJ)pibwdgx.o $(OBJ)picmap.o $(OBJ)picmapgen.o $(OBJ)picmapview.o $(OBJ)picmapx.o $(OBJ)picons.o $(OBJ)picontainergen.o $(OBJ)picontainerx.o $(OBJ)pidrawer.o $(OBJ)pidrawwin.o $(OBJ)pidrwtools.o $(OBJ)pifilechogen.o $(OBJ)pifilechox.o $(OBJ)pigraph3d.o $(OBJ)pigraphgen.o $(OBJ)pigraphps.o $(OBJ)pigraphuc.o $(OBJ)pigraphx.o $(OBJ)pihisto.o $(OBJ)pihisto2d.o $(OBJ)piimage.o $(OBJ)piimgtools.o $(OBJ)piinit.o $(OBJ)pilistgen.o $(OBJ)pilistx.o $(OBJ)pimenubargen.o $(OBJ)pimenubarx.o $(OBJ)pimenugen.o $(OBJ)pimenux.o $(OBJ)pimsghandler.o $(OBJ)pintup3d.o $(OBJ)pintuple.o $(OBJ)pioptmenugen.o $(OBJ)pioptmenux.o $(OBJ)piperiodx.o $(OBJ)pipixmapgen.o $(OBJ)pipixmapx.o $(OBJ)piscdrawwdg.o $(OBJ)pistdwdggen.o $(OBJ)pistdwdgx.o $(OBJ)pistlist.o $(OBJ)pisurfdr.o $(OBJ)piup.o $(OBJ)piwdggen.o $(OBJ)piwdgx.o $(OBJ)piwindowgen.o $(OBJ)piwindowx.o $(OBJ)pixtbase.o $(OBJ)psfile.o
 	$(AR) $(ARFLAGS)  $@ $? 
 ifeq ($(CXX),cxx)
@@ -11,9 +11,22 @@
 endif 
  
+clean:
+	rm -f $(OBJ)lut.o $(OBJ)parradapter.o $(OBJ)pi3ddrw.o $(OBJ)piapplgen.o $(OBJ)piapplx.o $(OBJ)pibwdggen.o $(OBJ)pibwdgx.o $(OBJ)picmap.o $(OBJ)picmapgen.o $(OBJ)picmapview.o $(OBJ)picmapx.o $(OBJ)picons.o $(OBJ)picontainergen.o $(OBJ)picontainerx.o $(OBJ)pidrawer.o $(OBJ)pidrawwin.o $(OBJ)pidrwtools.o $(OBJ)pifilechogen.o $(OBJ)pifilechox.o $(OBJ)pigraph3d.o $(OBJ)pigraphgen.o $(OBJ)pigraphps.o $(OBJ)pigraphuc.o $(OBJ)pigraphx.o $(OBJ)pihisto.o $(OBJ)pihisto2d.o $(OBJ)piimage.o $(OBJ)piimgtools.o $(OBJ)piinit.o $(OBJ)pilistgen.o $(OBJ)pilistx.o $(OBJ)pimenubargen.o $(OBJ)pimenubarx.o $(OBJ)pimenugen.o $(OBJ)pimenux.o $(OBJ)pimsghandler.o $(OBJ)pintup3d.o $(OBJ)pintuple.o $(OBJ)pioptmenugen.o $(OBJ)pioptmenux.o $(OBJ)piperiodx.o $(OBJ)pipixmapgen.o $(OBJ)pipixmapx.o $(OBJ)piscdrawwdg.o $(OBJ)pistdwdggen.o $(OBJ)pistdwdgx.o $(OBJ)pistlist.o $(OBJ)pisurfdr.o $(OBJ)piup.o $(OBJ)piwdggen.o $(OBJ)piwdgx.o $(OBJ)piwindowgen.o $(OBJ)piwindowx.o $(OBJ)pixtbase.o $(OBJ)psfile.o
+ifeq ($(CXX),cxx)
+	cd $(REPM); rm -f *.o
+endif 
+ 
 $(OBJ)lut.o: lut.cc $(EROSDEVREP)/Include/defs.h lut.h
-$(OBJ)pi3ddrw.o: pi3ddrw.cc pi3ddrw.h pidrawer.h pibwdggen.h pisysdep.h \
- piwdgx.h piwdggen.h pimsghandler.h picmap.h picmapx.h picmapgen.h \
- pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
- $(EROSDEVREP)/Include/defs.h
+$(OBJ)parradapter.o: parradapter.cc $(EROSDEVREP)/Include/ctimer.h \
+ $(EROSDEVREP)/Include/peida.h $(EROSDEVREP)/Include/defs.h \
+ $(EROSDEVREP)/Include/utils.h $(EROSDEVREP)/Include/machine.h \
+ $(EROSDEVREP)/Include/perrors.h \
+ $(EROSDEVREP)/Include/exceptions.h \
+ $(EROSDEVREP)/Include/peidainit.h $(EROSDEVREP)/Include/fmath.h \
+ parradapter.h lut.h
+$(OBJ)pi3ddrw.o: pi3ddrw.cc pi3ddrw.h pisysdep.h pidrawer.h pibwdggen.h \
+ piwdgx.h piwdggen.h pimsghandler.h picmap.h picmapx.h picmapgen.h \
+ pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
+ $(EROSDEVREP)/Include/defs.h pigraph3d.h pibwdgx.h pigraphps.h
 $(OBJ)piapplgen.o: piapplgen.cc piapplgen.h pimsghandler.h pisysdep.h \
  picontainerx.h picontainergen.h piwdgx.h piwdggen.h pimenubarx.h \
@@ -38,4 +51,8 @@
 $(OBJ)picmap.o: picmap.cc picmap.h pisysdep.h picmapx.h picmapgen.h
 $(OBJ)picmapgen.o: picmapgen.cc picmapgen.h pisysdep.h picmapx.h picmap.h
+$(OBJ)picmapview.o: picmapview.cc picmapview.h pisysdep.h pibwdgx.h \
+ pibwdggen.h piwdgx.h piwdggen.h pimsghandler.h picmap.h picmapx.h \
+ picmapgen.h pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
+ $(EROSDEVREP)/Include/defs.h pigraphps.h
 $(OBJ)picmapx.o: picmapx.cc piwdgx.h piwdggen.h pimsghandler.h picmapx.h \
  picmapgen.h pisysdep.h
@@ -63,6 +80,6 @@
  pistdwdgx.h pistdwdggen.h pibwdgx.h pibwdggen.h picmap.h picmapx.h \
  picmapgen.h pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
- $(EROSDEVREP)/Include/defs.h pigraphps.h pioptmenux.h \
- pioptmenugen.h piscdrawwdg.h piwindowx.h piwindowgen.h pidrawer.h
+ $(EROSDEVREP)/Include/defs.h pigraphps.h piscdrawwdg.h piwindowx.h \
+ piwindowgen.h pidrawer.h
 $(OBJ)pifilechogen.o: pifilechogen.cc pifilechogen.h pisysdep.h piwdgx.h \
  piwdggen.h pimsghandler.h
@@ -115,13 +132,13 @@
  pistdwdgx.h pistdwdggen.h piwindowx.h piwindowgen.h picontainerx.h \
  picontainergen.h
-$(OBJ)piimgtools.o: piimgtools.cc piimgtools.h pisysdep.h pimenux.h \
- pimenugen.h piwdgx.h piwdggen.h pimsghandler.h piapplx.h piapplgen.h \
- picontainerx.h picontainergen.h pimenubarx.h pimenubargen.h picons.h \
- pistdwdgx.h pistdwdggen.h pibwdgx.h pibwdggen.h picmap.h picmapx.h \
- picmapgen.h pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
- $(EROSDEVREP)/Include/defs.h pigraphps.h pioptmenux.h \
- pioptmenugen.h piimage.h parradapter.h \
+$(OBJ)piimgtools.o: piimgtools.cc piimgtools.h pisysdep.h pistdwdgx.h \
+ pistdwdggen.h piwdgx.h piwdggen.h pimsghandler.h pimenux.h \
+ pimenugen.h pioptmenux.h pioptmenugen.h piwindowx.h piwindowgen.h \
+ picontainerx.h picontainergen.h piapplx.h piapplgen.h pimenubarx.h \
+ pimenubargen.h picons.h pibwdgx.h pibwdggen.h picmap.h picmapx.h \
+ picmapgen.h pigraphx.h pigraphgen.h pigraphuc.h psfile.h \
+ $(EROSDEVREP)/Include/defs.h pigraphps.h piimage.h parradapter.h \
  $(EROSDEVREP)/Include/machine.h lut.h pidrawer.h pipixmapx.h \
- pipixmapgen.h piwindowx.h piwindowgen.h
+ pipixmapgen.h
 $(OBJ)piinit.o: piinit.cc $(EROSDEVREP)/Include/defs.h piinit.h \
  $(EROSDEVREP)/Include/strecinit.h \
@@ -149,4 +166,13 @@
  pimenugen.h piwdgx.h piwdggen.h pimsghandler.h
 $(OBJ)pimsghandler.o: pimsghandler.cc pimsghandler.h
+$(OBJ)pintup3d.o: pintup3d.cc pintup3d.h $(EROSDEVREP)/Include/ntuple.h \
+ $(EROSDEVREP)/Include/ppersist.h $(EROSDEVREP)/Include/defs.h \
+ $(EROSDEVREP)/Include/machine.h $(EROSDEVREP)/Include/perrors.h \
+ $(EROSDEVREP)/Include/exceptions.h \
+ $(EROSDEVREP)/Include/peidainit.h \
+ $(EROSDEVREP)/Include/pclassids.h pi3ddrw.h pisysdep.h pidrawer.h \
+ pibwdggen.h piwdgx.h piwdggen.h pimsghandler.h picmap.h picmapx.h \
+ picmapgen.h pigraphx.h pigraphgen.h pigraphuc.h psfile.h pigraph3d.h \
+ pibwdgx.h pigraphps.h
 $(OBJ)pintuple.o: pintuple.cc pintuple.h $(EROSDEVREP)/Include/ntuple.h \
  $(EROSDEVREP)/Include/ppersist.h $(EROSDEVREP)/Include/defs.h \
@@ -218,4 +244,9 @@
  piwdgx.h piwdggen.h pimsghandler.h picmap.h picmapx.h picmapgen.h \
  pigraphx.h pigraphgen.h pigraphuc.h psfile.h
+$(OBJ)pisurfdr.o: pisurfdr.cc pisurfdr.h parradapter.h \
+ $(EROSDEVREP)/Include/defs.h $(EROSDEVREP)/Include/machine.h \
+ lut.h pi3ddrw.h pisysdep.h pidrawer.h pibwdggen.h piwdgx.h piwdggen.h \
+ pimsghandler.h picmap.h picmapx.h picmapgen.h pigraphx.h pigraphgen.h \
+ pigraphuc.h psfile.h pigraph3d.h pibwdgx.h pigraphps.h
 $(OBJ)piup.o: piup.cc $(EROSDEVREP)/Include/ctimer.h \
  $(EROSDEVREP)/Include/peida.h $(EROSDEVREP)/Include/defs.h \
Index: /trunk/SophyaPI/PI/exapp_1.cc
===================================================================
--- /trunk/SophyaPI/PI/exapp_1.cc	(revision 112)
+++ /trunk/SophyaPI/PI/exapp_1.cc	(revision 113)
@@ -3,19 +3,128 @@
 #include <string.h>
 
-#include "ctimer.h"
-#include "strecinit.h"
-
-#include "pidrawwin.h"
-#include "pihisto.h"
-#include "psfile.h"
-
 #include "exapp_1.h"
 
-static int nbhis = 0;
+
+/* ........................................................... */
+/*                    Classe ArgsWindow  
+/* ........................................................... */
+
+
+/* --Methode-- */
+ArgsWind::ArgsWind(PIApplication *par)
+: PIWindow((PIMsgHandler *)par, "Args", PIWK_dialog, 100, 100, 150, 150)
+{
+int bsx, bsy;
+
+// On definit la taille a partir de la taille par defaut des composantes 
+PIApplicationPrefCompSize(bsx, bsy);
+// On redefinit la taille de la fenetre
+SetSize(bsx*7, bsy*6);
+
+// Creation de champs "labels"
+mLab[0] = new PILabel(this, "UserArg-1:", bsx*2, bsy, bsx/3, bsy/4); 
+mLab[1] = new PILabel(this, "UserArg-2", bsx*2, bsy, bsx/3, bsy/4 + (bsy/4+bsy) );
+mLab[2] = new PILabel(this, "UserArg-3", bsx*2, bsy, bsx/3, bsy/4 + 2*(bsy/4+bsy) );
+
+// Creation de champs textes 
+mText[0] = new PIText(this, "UsArg1", bsx*4, bsy, bsx*2+(bsx*2/3), bsy/4);
+mText[0]->SetText("Hello ");
+mText[1] = new PIText(this, "UsArg2", bsx*4, bsy, bsx*2+(bsx*2/3), bsy/4 + (bsy/4+bsy) );
+mText[1]->SetText("1. -1.");
+mText[2] = new PIText(this, "UsArg3", bsx*4, bsy, bsx*2+(bsx*2/3), bsy/4 + 2*(bsy/4+bsy) );
+mText[2]->SetText("1. -1.");
+
+// Creation de bouton d'action 
+//  Attention : Numero de message pour Process()
+mBut[0] = new PIButton(this, "OK",  555, bsx*2, bsy, bsx, 4.5*bsy);
+mBut[1] = new PIButton(this, "Cancel", 777, bsx*2, bsy, 4*bsx, 4.5*bsy);
+
+//  Taille et position proportionnelles a la taille de la fenetre pour les elements
+for(int i=0; i<3; i++) {
+  mLab[i]->SetBinding(PIBK_elastic , PIBK_elastic , PIBK_elastic , PIBK_elastic);
+  mText[i]->SetBinding(PIBK_elastic , PIBK_elastic , PIBK_elastic , PIBK_elastic);
+  }
+for(int i=0; i<2; i++) mBut[i]->SetBinding(PIBK_elastic , PIBK_elastic , PIBK_elastic , PIBK_elastic);
+
+}
+
+/* --Methode-- */
+ArgsWind::~ArgsWind()
+{
+for(int i=0; i<3; i++)
+  {
+  delete mLab[i];
+  delete mText[i];
+  }
+
+delete mBut[0]; 
+delete mBut[1]; 
+}
+
+/* --Methode-- */
+void ArgsWind::SetLabels(char *lab1, char *lab2, char *lab3)
+// Permet de changer les etiquettes (les label)
+{
+mLab[0]->SetLabel(lab1);
+mLab[1]->SetLabel(lab2);
+mLab[2]->SetLabel(lab3);
+}
+
+/* --Methode-- */
+void ArgsWind::SetTexts(char *tx1, char *tx2, char *tx3)
+// Permet de changer les contenu des champs texte
+{
+mText[0]->SetText(tx1);
+mText[1]->SetText(tx2);
+mText[2]->SetText(tx3);
+
+}
+
+/* --Methode-- */
+void ArgsWind::GetTexts(char *tx1, char *tx2, char *tx3)
+// Permet de recuperer les contenus des champs texte
+// ATTENTION : Il faut qu'il y ait assez de place 
+// ds tx1, tx2, tx3 pour que la fonction puisse y copier 
+// les chaines
+{
+strcpy(tx1, mText[0]->GetText().c_str());
+strcpy(tx2, mText[1]->GetText().c_str());
+strcpy(tx3, mText[2]->GetText().c_str());
+}
+
+/* --Methode-- */
+void ArgsWind::Process(PIMessage msg, PIMsgHandler* /*sender*/, void* /*data*/)
+{
+float xmin, xmax, ymin, ymax;
+float fmin, fmax;
+
+switch (UserMsg(msg))
+  {
+  case 777:   // Bouton cancel - On s'en va 
+    this->Hide();
+    break;
+
+  case 555:    // Bouton OK
+// On recupere les textes des 3 champs :
+    printf("ArgsWind::Process() Txt[0] = %s \n", mText[0]->GetText().c_str());
+    sscanf(mText[1]->GetText().c_str(),"%g %g", &xmin, &xmax);
+    printf("... XMin/Max= %g %g \n", xmin, xmax);
+    this->Hide();
+    break;    
+  }
+    
+return;
+}
+
+
+/* ........................................................... */
+/*                    Classe PITApp 
+/* ........................................................... */
+
 static void mypact(void *);
 
 /* --Methode-- */
 PITApp::PITApp(int narg, char* arg[])
-: PIApplication(230, 100, narg, arg), mPeriod(1)   // Periode de 1 seconde pour le "timer"
+: PIApplication(270, 100, narg, arg), mPeriod(1)   // Periode de 1 seconde pour le "timer"
 {
 
@@ -32,35 +141,22 @@
 //  Arret et sortie du programme
 
-m[0] = new PIPDMenu((PIMsgHandler *)Menubar(),"Fichier");
-m[0]->AppendItem("Update", 10101);
-m[0]->AppendItem("Start", 10102);
-m[0]->AppendItem("Stop", 10103);
-m[0]->AppendItem("Exit", 10105);
+m = new PIMenu(Menubar(),"Fichier");
+m->AppendItem("Update", 10101);
+m->AppendItem("Start", 10102);
+m->AppendItem("Stop", 10103);
+m->AppendItem("ArgsWindow", 10104);
+m->AppendItem("Exit", 10105);
 // On accroche le menu au Menubar
-AppendMenu(m[0]);
-
-// 2eme Menu
-// Histo :  Creation, affichage d'un histo
-// Args : Affichage d'une fenetre de dialogue avec champs texte
-// Fermeture fenetre histo + suppression d'histo
-
-m[1] = new PIPDMenu((PIMsgHandler *)Menubar(),"Actions");
-m[1]->AppendItem("Histo", 10201);
-m[1]->AppendItem("Args", 10202);
-m[1]->AppendItem("Close", 10203);
-m[1]->AppendItem("PS", 10205);
-// On accroche le menu au Menubar
-AppendMenu(m[1]);
+AppendMenu(m);
+
 
 // Creation de deux labels - Un pour l'heure, l'autre pour X-Y 
 // de la fenetre histo
-lab[0] = new PILabel(this->MainWin(), "time", 210, 30, 10, 10);
-lab[1] = new PILabel(this->MainWin(), "info", 210, 30, 10, 50);
+lab = new PILabel(this->MainWin(), "time", 250, 50, 10, 10);
+
 mPeriod.SetAction(mypact);
 
 // Fenetre de dialogue
 mAW = new ArgsWind(this);
-
-mCurW = NULL;    // Fenetre courante
 SetReady();
 }
@@ -69,6 +165,5 @@
 PITApp::~PITApp()
 {
-int i;
-for(i=0; i<2; i++)  { delete lab[i]; delete m[i]; }
+delete m; delete lab;
 delete mAW;
 }  
@@ -80,18 +175,8 @@
 char strg[64];
 
-// Gestion fenetre courante
-if (ModMsg(msg) == PIMsg_Active)
-  {
-  PIWdg *sndw;
-  sndw = (PIWdg *)sender;      
-  if (sndw->kind() ==  PIWindow::ClassId)   mCurW = (PIWindow *)sender;
-  }
-
-else
-  {
-  switch(UserMsg(msg))
-    {
-
-// --------- 1er menu ----------
+// Gestion des actions en fonctions des messages
+
+switch(UserMsg(msg))    {
+
     case 10101:     // On met a l'heure
       mypact(NULL);    
@@ -103,64 +188,13 @@
 
     case 10103:
-      mPeriod.Stop();    // On demarre la montre 
+      mPeriod.Stop();    // On arrete la montre 
+      break;
+
+    case 10104 :     // Apparition de la fenetre de dialogue
+      mAW->Show();
       break;
 
     case 10105:          // Sortie d'application
       Stop();
-      break;
-
-// ----------  2eme menu --------
-
-    case 10201 :        //  Creation, Affichage d'histo
-      PIDrawWindow *  draw;
-      PIHisto *pih;
-      Histo *h;
-      float x;
-
-      SetBusy();    // souris -> montre 
-      // Creation et remplissage d'histo 
-      h = new Histo(0., 200., 100);  
-      for(int i=0; i<100; i++)  
-        { x = (2*i+1.);  h->Add(x, x*(200.-x)); }
-
-      nbhis++;  sprintf(strg, "Histo %d", nbhis);
-      // Creation d'une fenetre de trace 
-      draw = new PIDrawWindow(this, strg, PIWK_normal, 200, 200, 300, 300);
-      // Creation d'un traceur d'histo
-      pih = new PIHisto(h);   
-
-      pih->SetAutoDelHisto(true);   // Histo delete quand window -> close
-      // Accrochage du traceur d'histo a la fenetre de Draw
-      draw->AddDrawer(pih);   
-      // Designation du champ label pour affichage coordonnees quand click souris
-      draw->DrawWdg()->SetTextWin(lab[1]);
-      draw->SetAutoDelChilds(true);  
-      // On affiche  la fenetre 
-      draw->Show();    
-
-      SetReady();    //  souris->pointeur , on n'est plus occupe
-      break;
-
-    case 10202 :     // Apparition de la fenetre de dialogue
-      mAW->Show();
-      break;
-
-    case 10203 :     // Suppression de la fenetre courante
-      if (mCurW)  { mCurW->Hide();  delete mCurW;}
-      lab[1]->SetLabel("");
-      mCurW = NULL;
-      break;
-
-
-    case 10205 :      // Creation fichier PostScript 
-      if(mCurW) {
-        PSFile *mps;
-        printf("Open PSFile (exapp_1.ps) \n");
-	mps = new PSFile("exapp_1.ps",14,10,
-			 mCurW->XSize(),mCurW->YSize());
-	// Contenu fenetre courante ds .ps 
-	mCurW->PSPrint(mps,0,0);
-	delete mps;
-      }
       break;
 
@@ -169,114 +203,6 @@
             (int)msg, (int)UserMsg(msg),(int)ModMsg(msg));
      break;
-    }
-  }
-return;
-}
-
-/* ........................................................... */
-/*       Classe ArgsWindow  (Appel UserProc Function)      */
-/* ........................................................... */
-
-
-/* --Methode-- */
-ArgsWind::ArgsWind(PIApplication *par)
-: PIWindow((PIMsgHandler *)par, "Args", PIWK_dialog, 260, 200, 150, 150)
-{
-pap = par;
-
-// Creation de champs "labels"
-mLab[0] = new PILabel(this, "FMin Max:", 100, 35, 20, 10); 
-mLab[1] = new PILabel(this, "XMin Max:", 100, 35, 20, 55);
-mLab[2] = new PILabel(this, "YMin Max:", 100, 35, 20, 100);
-
-// Creation de champs textes 
-mText[0] = new PIText(this, "UsArg1", 130, 35, 120, 10);
-mText[0]->SetText("1. -1.");
-mText[1] = new PIText(this, "UsArg2", 130, 35, 120, 55);
-mText[1]->SetText("1. -1.");
-mText[2] = new PIText(this, "UsArg3", 130, 35, 120, 100);
-mText[2]->SetText("1. -1.");
-
-// Creation de bouton d'action 
-//  Attention : Numero de message pour Process()
-mBut[0] = new PIButton(this, "OK", 555, 70, 30, 30, 160);
-mBut[1] = new PIButton(this, "Cancel", 777, 70, 30, 160, 160);
-FinishCreate();
-
-}
-
-/* --Methode-- */
-ArgsWind::~ArgsWind()
-{
-for(int i=0; i<3; i++)
-  {
-  delete mLab[i];
-  delete mText[i];
-  }
-
-delete mBut[0]; 
-delete mBut[1]; 
-}
-
-/* --Methode-- */
-void ArgsWind::SetLabels(char *lab1, char *lab2, char *lab3)
-// Permet de changer les etiquettes (les label)
-{
-mLab[0]->SetLabel(lab1);
-mLab[1]->SetLabel(lab2);
-mLab[2]->SetLabel(lab3);
-}
-
-/* --Methode-- */
-void ArgsWind::SetTexts(char *tx1, char *tx2, char *tx3)
-// Permet de changer les contenu des champs texte
-{
-mText[0]->SetText(tx1);
-mText[1]->SetText(tx2);
-mText[2]->SetText(tx3);
-
-}
-
-/* --Methode-- */
-void ArgsWind::GetTexts(char *tx1, char *tx2, char *tx3)
-// Permet de recuperer les contenus des champs texte
-// ATTENTION : Il faut qu'il y ait assez de place 
-// ds tx1, tx2, tx3 pour que la fonction puisse y copier 
-// les chaines
-{
-strcpy(tx1, mText[0]->GetText().c_str());
-strcpy(tx2, mText[1]->GetText().c_str());
-strcpy(tx3, mText[2]->GetText().c_str());
-
-}
-
-/* --Methode-- */
-void ArgsWind::Process(PIMessage msg, PIMsgHandler* /*sender*/, void* /*data*/)
-{
-float xmin, xmax, ymin, ymax;
-float fmin, fmax;
-
-switch (UserMsg(msg))
-  {
-  case 777:   // Bouton cancel - On s'en va 
-    this->Hide();
-    pap->SetReady();
-    break;
-
-  case 555:    // Bouton OK
-// On recupere les textes des 3 champs :
-    for(int i=0; i<3; i++)  
-      printf("ArgsWind::Process() Txt[%d] = %s \n", i, mText[i]->GetText().c_str());
-    sscanf(mText[0]->GetText().c_str(),"%g %g", &fmin, &fmax);
-    sscanf(mText[1]->GetText().c_str(),"%g %g", &xmin, &xmax);
-    sscanf(mText[2]->GetText().c_str(),"%g %g", &ymin, &ymax);
     
-    printf("... FMin/Max= %g %g  XMin/Max= %g %g YMin/Max= %g %g\n",
-           fmin, fmax, xmin, xmax, ymin, ymax); 
-    this->Hide();
-    pap->SetReady();
-    break;    
-  }
-    
+  }
 return;
 }
@@ -288,19 +214,20 @@
 // Fonction pour lire l'heure de la machine et mettre a jour le champ label
 {
-int tm;
+time_t tm;
 char *s;
 time(&tm);
 s = ctime(&tm);
 // printf("mypact_Info:  %d  (%s)", tm, s);
-app->lab[0]->SetLabel((string)s);
+app->lab->SetLabel((string)s);
 return;
 }
 
+// ................................................................
+//                   programme principal 
+// ................................................................
+
 int main(int narg, char *arg[])
 {
-
-// Initialisation de tout PEIDA (avec StarReco++)
-PeidaStarRecoInitiator InitStar;
-
+//  Creation de l'objet application et appel de Run()
 app = new PITApp(narg, arg);
 puts("appel de Application.Run() ... ");
Index: /trunk/SophyaPI/PI/exapp_1.h
===================================================================
--- /trunk/SophyaPI/PI/exapp_1.h	(revision 112)
+++ /trunk/SophyaPI/PI/exapp_1.h	(revision 113)
@@ -1,4 +1,2 @@
-#include <string.h>
-
 #include "pisysdep.h"
 
@@ -7,23 +5,5 @@
 #include PISTDWDG_H 
 #include PIWIN_H
-#include "piperiodx.h"  // PIPERIODIC_H
-
-class ArgsWind;
-
-class PITApp : public PIApplication {
-public:
-     PITApp(int narg=0, char* arg[]=NULL);
-     ~PITApp();
-     virtual void   Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);
-
-// protected :
-     
-  PIPDMenu * m[2];
-  PILabel *lab[2];
-  PIPeriodX mPeriod;
-  PIWindow *mCurW;
-  ArgsWind *mAW;
-};
-
+#include PIPERIODIC_H
 
 class ArgsWind : public PIWindow {
@@ -37,7 +17,22 @@
 
 private:
-  PIApplication * pap;
   PILabel  * mLab[3];
   PIButton * mBut[2];
   PIText * mText[3];
   };
+
+class PITApp : public PIApplication {
+public:
+     PITApp(int narg=0, char* arg[]=NULL);
+     ~PITApp();
+     virtual void   Process(PIMessage msg, PIMsgHandler* sender, void* data=NULL);
+
+  PILabel *lab;
+
+private :
+  PIMenu * m;
+  PIPeriodX mPeriod;
+  ArgsWind *mAW;
+};
+
+
Index: /trunk/SophyaPI/PI/exclude
===================================================================
--- /trunk/SophyaPI/PI/exclude	(revision 112)
+++ /trunk/SophyaPI/PI/exclude	(revision 113)
@@ -26,4 +26,5 @@
 sc_sample.cc
 exapp_1.cc
+exapp_2.cc
 pitestapp.cc
 piup_def.cc
Index: /trunk/SophyaPI/PI/parradapter.cc
===================================================================
--- /trunk/SophyaPI/PI/parradapter.cc	(revision 112)
+++ /trunk/SophyaPI/PI/parradapter.cc	(revision 113)
@@ -16,4 +16,5 @@
 offX = offY = 0;
 invX = invY = eXY = false;
+DefineXYCoordinates(0.,0.,1.,1.);
 }
 
@@ -28,15 +29,22 @@
 invX = invx;  invY = invy;  eXY = exy; 
 if ( (sx > 0) && (sy > 0) )   { sX = sx; sY = sy; }
-if (invX) { sgnX = -1;  offX = sX; } 
+if (invX) { sgnX = -1;  offX = sX-1; } 
 else { sgnX = 1; offX = 0; }
-if (invY) { sgnY = -1;  offY = sY; } 
+if (invY) { sgnY = -1;  offY = sY-1; } 
 else { sgnY = 1; offY = 0; }
 }
 
 /* --Methode-- */
+void P2DArrayAdapter::DefineXYCoordinates(float x0, float y0, float dx, float dy)
+{
+mOx = x0;   mOy = y0;
+mDx = dx;   mDy = dy;
+}
+
+/* --Methode-- */
 void P2DArrayAdapter::XYfromxy(int ix, int iy, float& x, float& y)
 {
-x = ix;
-y = iy; 
+x = mOx+ix*mDx;
+y = mOy+iy*mDy; 
 }
 
Index: /trunk/SophyaPI/PI/parradapter.h
===================================================================
--- /trunk/SophyaPI/PI/parradapter.h	(revision 112)
+++ /trunk/SophyaPI/PI/parradapter.h	(revision 113)
@@ -25,4 +25,6 @@
   inline void     GetAxesConfiguration(bool& invx, bool& invy, bool& exy)
                                { invx = invX; invy = invY; exy = eXY; }
+
+  virtual void    DefineXYCoordinates(float x0, float y0, float dx, float dy);
 // Doit etre defini par les classes derivees
   virtual float   Value(int ix, int iy) = 0;   
@@ -58,4 +60,5 @@
 protected :
   int sX, sY;
+  float mOx, mDx, mOy, mDy;
   int sgnX, sgnY;
   int offX, offY;
Index: /trunk/SophyaPI/PI/pi3ddrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 113)
@@ -1,9 +1,418 @@
+// Module PI : Peida Interactive PIDrawer3D PIDraw3DWdg
+// Drawer et DrawWidget 3D       R. Ansari 06/98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
 #include "pi3ddrw.h"
 
-PI3DDrawer::PI3DDrawer()
+
+// ......................................................................
+// ........................  Classe PIDrawer3D ..........................
+// ......................................................................
+
+
+/* --Methode-- */
+PIDrawer3D::PIDrawer3D()
         : PIDrawer()
 {
-}
-PI3DDrawer::~PI3DDrawer()
-{
-}
+  xO = yC = 0.; zO = -10.;
+  xC = yC = zC = 0.;
+  tO = fO = pO = 0.; 
+  daxO = dayO = 0.25;
+  lCO = 10.;  dlCO = 3.;  
+  v3D_obs = false;
+}
+
+/* --Methode-- */
+PIDrawer3D::~PIDrawer3D()
+{
+}
+
+/* --Methode-- */
+void PIDrawer3D::Set3DView_Obs(float xo, float yo, float zo, float teta, float phi, float psi, 
+                               float dax, float day, float co, float dco)
+{
+  tO = teta;  fO = phi;  pO = psi;
+  daxO = dax;  dayO = day;
+  lCO = co;   dlCO = dco;
+  v3D_obs = true;
+}
+
+/* --Methode-- */
+void PIDrawer3D::Set3DView(float xc, float yc, float zc, float xo, float yo, float zo, 
+                           float dax, float day, float dco, float psi)
+{
+  xC = xc;  yC = yc;  zC = zc;
+  xO = xo;  yO = yo;  zO = zo;
+  pO = psi;
+  daxO = dax;  dayO = day;
+  dlCO = dco;
+  v3D_obs = false;
+}
+
+/* --Methode-- */
+bool PIDrawer3D::Get3DView(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)
+{
+  xo = xO;  yo = yO;  zo = zO;
+  xc = xC;  yc = yC;  zc = zC;
+  teta = tO;  phi = fO;  psi = pO;
+  dax = daxO;   day = dayO;
+  co = lCO;     dco = dlCO;
+  return(v3D_obs);
+}
+
+/* --Methode-- */
+PIGraphicUC* PIDrawer3D::SetDrwWdg(PIBaseWdgGen* drw, int x0, int y0, int dx, int dy, PIGraphicGen* g)
+{
+  mBWdg = drw;
+  xW0 = x0;   yW0 = y0;
+  xWd = dx;   yWd = dy;
+  if (mGrUC)  delete mGrUC;
+  PIGraphic3D* gr3d;
+  gr3d = new PIGraphic3D(g, x0, y0, dx, dy);
+  if (v3D_obs)  gr3d->Set3DCS_Obs(xO, yO, zO, tO, fO, pO, daxO, dayO, lCO, dlCO);
+  else  gr3d->Set3DCS(xC,yC,zC, xO, yO, zO, daxO, dayO, dlCO, pO);
+  mGrUC = gr3d;
+  return(gr3d); 
+}
+
+
+
+// ......................................................................
+// ........................  Classe PIDrawer3D ..........................
+// ......................................................................
+
+
+/* --Methode-- */
+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., 0., 1., 1., true);
+
+  lPx = lPy = 0;
+  lCol = PI_Black;
+  cTeta = cPhi = 0.;  cUlen = 1.;
+
+  ActivateButton(1);    //  Pour pouvoir tourner la camera
+  ActivateMove(1);      
+  ActivateButton(2);    //  Pour deplacer la camera le long de son axe
+  ActivateMove(2);
+  ActivateButton(3);    //  Pour pouvoir tourner la camera
+
+  mGr3d = new PIGraphic3D(mWGrC, 0, 0, sx, sy);
+}
+
+/* --Methode-- */
+PIDraw3DWdg::~PIDraw3DWdg()
+{
+  delete mGr3d;
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::Set3DView_Obs(float xo, float yo, float zo, float teta, float phi, float psi, 
+                                float dax, float day, float co, float dco)
+{
+  mGr3d->Set3DCS_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  list<int>::iterator it;
+  for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)   
+    (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)))->Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  vfixed = true;
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::Set3DView(float xc, float yc, float zc, float xo, float yo, float zo, 
+                            float dax, float day, float dco, float psi)
+{
+  mGr3d->Set3DCS(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  list<int>::iterator it;
+  for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)   
+    (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)))->Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  vfixed = true;
+}
+
+/* --Methode-- */
+bool PIDraw3DWdg::Get3DView(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)
+{
+  return(mGr3d->Get3DCS(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco));
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::Update3DView()
+{
+  float xc, yc, zc, xo, yo, zo;
+  float teta, phi, psi;
+  float dax, day, co, dco;
+  bool vo;
+  vo = mGr3d->Get3DCS( xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  list<int>::iterator it;
+  if (vo)   for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)   
+    (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)))->Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  else   for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)   
+    (dynamic_cast<PIDrawer3D*>(GetDrawerId(*it)))->Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);    
+}
+
+/* --Methode-- */
+int PIDraw3DWdg::AddDrawer3D(PIDrawer3D* dr3, bool ad)
+{
+if (!vfixed)  { 
+  dr3->UpdateSize();
+  float xo, yo, zo, xc, yc, zc, teta, phi, psi, dax, day, co, dco;
+  bool vobs;
+  vobs = dr3->Get3DView(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  if (vobs) Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  else Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  }
+else { 
+  float xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco;
+  if ( Get3DView(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco) ) 
+      dr3->Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  else  dr3->Set3DView(xc, yc, zc, xo, yo, zo, dax, day, co, psi);
+  }
+int id = AddDrawer(dr3, false, false, ad);
+m3DrIl.push_back(id);
+return(id);
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::RemoveDrawer(int id)
+{
+  list<int>::iterator it;
+  for(it = m3DrIl.begin(); it != m3DrIl.end(); it++)   
+    if ( (*it) == id )  { m3DrIl.erase(it);  break; }
+  PIBaseWdg::RemoveDrawer(id);
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::DeleteDrawers()
+{
+  m3DrIl.erase(m3DrIl.begin(),  m3DrIl.end());
+  PIBaseWdg::DeleteDrawers();
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::But1Press(int x, int y)
+{
+  mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize());
+  float xc, yc, zc, xo, yo, zo;
+  float teta, phi, psi;
+  float dax, day, co, dco;
+  mGr3d->Get3DCS(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+//   puts("\n PIDraw3DWdg::But1Press() ");
+//   mGr3d->PrintCS();
+  lPx = x;  lPy = y;    
+  cUlen = 0.5*(dax+day)*co*0.3;    cDax = dax;   cDay = day;  clCO = co; 
+  cTeta = teta;   cPhi = phi;
+  SelPointerShape(PI_TDLRArrowPointer);
+  lCol = mWGrC->GetForeground();
+  mWGrC->SelForeground(GetBackgroundColor());
+/*
+  {
+  char buff[256];
+  sprintf(buff, "But1Press() C=%g %g %g  T,P=%g %g   ", xc, yc, zc, cTeta, cPhi); 
+  mWGrC->DrawOpaqueString(0,20,buff);
+  }
+*/
+  DrawXYZAxes();
+  Send(Msg(), PIMsg_Active);
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::Ptr1Move(int x, int y)
+{
+  DrawXYZAxes();
+  float phi = M_PI+cPhi;
+  float teta = M_PI-cTeta;
+  phi += (M_PI*0.4*(float)(x-lPx)/XSize());
+  teta -= (M_PI*0.4*(float)(y-lPy)/YSize());
+  mGr3d->RotateObserver(teta, phi, 0., false);
+/*  {
+  char buff[256];
+  sprintf(buff, "Ptr1Move() T,P=%g %g -> %g %g  ", cTeta, cPhi, teta, phi); 
+  mWGrC->DrawOpaqueString(0,20,buff);
+  }
+*/
+  DrawXYZAxes();
+}
+
+
+/* --Methode-- */
+void PIDraw3DWdg::But1Release(int x, int y)
+{
+  DrawXYZAxes();
+//  puts("\n PIDraw3DWdg::But1Release()");
+//  mGr3d->PrintCS();
+  SelPointerShape(PI_ArrowPointer);
+  mWGrC->SelForeground(lCol);
+  Update3DView();
+  Refresh();
+}
+
+
+/* --Methode-- */
+void PIDraw3DWdg::But2Press(int x, int y)
+{
+  float xc, yc, zc, xo, yo, zo;
+  float teta, phi, psi;
+  float dax, day, co, dco;
+  mGr3d->Get3DCS(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  mGr3d->SetBaseGraphic(mWGrC, 0, 0, XSize(), YSize());
+  lPx = x;  lPy = y;  
+  cUlen = 0.5*(dax+day)*co*0.3;    cDax = dax;   cDay = day;  clCO = co;
+  cTeta = teta;   cPhi = phi;
+  SelPointerShape(PI_TDLRArrowPointer);
+  lCol = mWGrC->GetForeground();
+  mWGrC->SelForeground(GetBackgroundColor());
+/*
+  {
+  char buff[256];
+  sprintf(buff, "But2Press() C=%g %g %g  O= %g %g %g  L= %g   ", xc, yc, zc, xo, yo, zo, co); 
+  mWGrC->DrawOpaqueString(0,20,buff);
+  }
+*/
+  DrawXYZAxes();
+  Send(Msg(), PIMsg_Active);
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::Ptr2Move(int x, int y)
+{
+  DrawXYZAxes();
+  float rapx = (float)(x-lPx)/XSize();
+  if (rapx > 0.) rapx = rapx*2.+1;
+  else rapx += 1.;
+  if (rapx < 0.3)  rapx = 0.3;
+  if (rapx > 3.)  rapx = 3.;
+  float rapy = (float)(y-lPy)/YSize();
+  if (rapy > 0.) rapy = rapy*2.+1;
+  else rapy += 1.;
+  if (rapy < 0.3)  rapy = 0.3;
+  if (rapy > 3.)  rapy = 3.;
+/*
+  {
+  char buff[256];
+  sprintf(buff, "Ptr2Move() Rap=%g %g -> %g %g %g     ", rapx, rapy, rapy*clCO, rapx*cDax, rapx*cDay);
+  mWGrC->DrawOpaqueString(0,20,buff);
+  }
+*/
+  mGr3d->ZoomInOut(rapy*clCO, rapx*cDax, rapx*cDay, false);
+  DrawXYZAxes();
+}
+
+/* --Methode-- */
+void PIDraw3DWdg::But2Release(int x, int y)
+{
+  DrawXYZAxes();
+  SelPointerShape(PI_ArrowPointer);
+  mWGrC->SelForeground(lCol);
+  Update3DView();
+  Refresh();
+}
+
+
+/* --Methode-- */
+void PIDraw3DWdg::DrawXYZAxes()
+{
+  mWGrC->SelGOMode(PI_GOXOR);
+  PIGrCoord x1,y1,z1,x2,y2,z2;
+  float xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco;
+  mGr3d->Get3DCS(xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco);
+  float len = cUlen;
+  x1 = xc;  y1 = yc;  z1 = zc;
+  x2 = xc+len;   y2 = yc;   z2 = zc; 
+  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
+  x2 = xc+len*1.1;
+  mGr3d->DrawString3D(x2, y2, z2, "X");
+  x2 = xc;   y2 = yc+len;   z2 = zc; 
+  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
+  y2 = yc+len*1.1;
+  mGr3d->DrawString3D(x2, y2, z2, "Y");   
+  x2 = xc;   y2 = yc;   z2 = zc+len; 
+  mGr3d->DrawLine3D(x1, y1, z1, x2, y2, z2);
+  z2 = zc+len*1.1;
+  mGr3d->DrawString3D(x2, y2, z2, "Z");   
+//   mGr3d->DrawCircle(0., 0., daxO*0.30);
+  char buff[256];
+  sprintf(buff, " C: %g %g %g -> O: %g %g %g  (T/P0= %g %g)     ", xc,yc,zc, xo, yo, zo, cTeta, cPhi);
+  mWGrC->DrawString(0,20,buff);
+  sprintf(buff, " T,P= %g %g %g lCO= %g  dax= %g %g UL=%g    ", teta,phi,psi,co,dax,day,cUlen); 
+  mWGrC->DrawString(0,40,buff);
+  mWGrC->SelGOMode(PI_GOCopy);  
+
+}
+
+
+/* --Methode-- */
+void PIDraw3DWdg::But3Press(int x, int y)
+{
+  list<int>::iterator it = m3DrIl.begin();
+  if (it == m3DrIl.end())  return;
+  PIDrawer3D* dr3 = dynamic_cast<PIDrawer3D*>(GetDrawerId(*it));
+  if (dr3 == NULL)  return;
+  dr3->UpdateSize();
+  float xo, yo, zo, xc, yc, zc, teta, phi, psi, dax, day, co, dco;
+  bool vobs;
+  vobs = dr3->Get3DView(xc, yc, zc, xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  if (vobs) Set3DView_Obs(xo, yo, zo, teta, phi, psi, dax, day, co, dco);
+  else Set3DView(xc, yc, zc, xo, yo, zo, dax, day, dco, psi);
+  Refresh();
+}
+
+/*   Pour debugger sur bouton-3 
+static int isw = 0;
+void PIDraw3DWdg::But3Press(int x, int y)
+x -= XSize()/2;
+y -= YSize()/2;
+
+float fx = (float)x/XSize(); 
+float fy = (float)y/YSize(); 
+if ( (fx<0.2) && (fx>-0.2) && (fy<0.2) && (fy>-0.2) ) {
+  
+  if ((isw%3) == 0) { 
+    Set3DView(0., 0., 0., 0., 0., -3. , 0.3, 0.3, 2); 
+    puts("\n Set3DView(0., 0., 0., 0., 0., -3. , 0.3, 0.3, 2)");
+  }
+  else if ((isw%3) == 1) { 
+    Set3DView(0., 0., 0., 2., 1., 3. , 0.3, 0.3, 2);
+    puts("\n Set3DView(0., 0., 0., 2., 1., 3. , 0.3, 0.3, 2)");
+  }
+  else if ((isw%3) == 2) { 
+    Set3DView_Obs(0.,4.,0.,3.14159/2.,-3.14159/2.,0.,0.25,0.25,4.,2.);
+    puts("\n Set3DView_Obs(0.,4.,0.,3.14159/2.,3.14159/2.,0.,0.25,0.25,4.,2.)");
+  }
+  isw++;
+  mGr3d->PrintCS();
+  float xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco;
+  mGr3d->Get3DCS(xc,yc,zc,xo,yo,zo,teta,phi,psi,dax,day,co,dco);
+  mGr3d->Set3DCS(xc,yc,zc,xo,yo,zo,dax,day,dco,psi);
+  mGr3d->PrintCS();
+  mGr3d->Set3DCS_Obs(xo,yo,zo,teta,phi,psi,dax,day,co,dco);
+  mGr3d->PrintCS();
+  puts(" --------------------- \n");
+  Refresh();
+  return;
+}
+if ((x > 0) && (y > 0) )  { 
+  puts(" But3Press()Set3DView(0., 0., 0., 5., 0., 0. , 0.3, 0.3, 2)");
+  Set3DView(0., 0., 0., 5., 0., 0. , 0.3, 0.3, 2);
+}
+else if ((x < 0) && (y > 0) )  { 
+  puts(" But3Press()Set3DView(0., 0., 0., 0., 5., 1. , 0.3, 0.3, 2) ");
+  Set3DView(0., 0., 0., 0., 5., 1. , 0.3, 0.3, 2);
+}
+else  if ((x < 0) && (y < 0) ) {
+  puts(" But3Press()Set3DView(0., 0., 0., 1., 1., 5. , 0.3, 0.3, 2)");
+  Set3DView(0., 0., 0., 1., 1., 5. , 0.3, 0.3, 2);
+}
+else {
+  puts(" But3Press()Set3DView(0., 0., 0., -3., -3., 3. , 0.3, 0.3, 2)");
+  Set3DView(0., 0., 0., -3., -3., 3. , 0.3, 0.3, 2);
+}
+
+Refresh();
+*/
Index: /trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.h	(revision 112)
+++ /trunk/SophyaPI/PI/pi3ddrw.h	(revision 113)
@@ -1,9 +1,88 @@
-#ifndef PI3DDRW_H_SEEN
-#define PI3DDRW_H_SEEN
+// Module PI : Peida Interactive PIDrawer3D PIDraw3DWdg
+// Drawer et DrawWidget 3D       R. Ansari 06/98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
+#ifndef PIDRW3D_H_SEEN
+#define PIDRW3D_H_SEEN
+
+#include "pisysdep.h"
 #include "pidrawer.h"
-class PI3DDrawer : PIDrawer
+#include "pigraph3d.h"
+
+#include PIBWDG_H
+
+#include <list>
+
+// Traceur (Drawer) 3D 
+class PIDrawer3D : public PIDrawer
 {
-PI3DDrawer();
-virtual ~PI3DDrawer();
+public :
+			PIDrawer3D();
+  virtual		~PIDrawer3D();
+
+  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);
+  virtual void       	Set3DView(float xc, float yc, float zc, float xo, float yo, float zo, 
+                                  float dax, float day, float dco=0.2, float psi=0.);
+  bool           	Get3DView(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);
+  
+  virtual PIGraphicUC*	SetDrwWdg(PIBaseWdgGen* drw, int x0, int y0, int dx, int dy, PIGraphicGen* g);
+
+protected :
+  float xO, yO, zO;  // Position observateur = camera
+  float xC, yC, zC;  // Position centre du champ
+  float tO,fO,pO;    // Orientation observateur (Teta, Phi, Psi, Angles d Euler)
+  float daxO, dayO;  // Demi-ouverture de la camera suivant les deux axes de projection (xp/zp, yp/zp) 
+  float lCO, dlCO;   // Distance Camera-Centre du champ et profondeur de champ 
+  bool v3D_obs;      // Si defini par Set3DView_Obs 
 };
+
+
+
+class PIDraw3DWdg : public PIBaseWdg {
+public:
+  enum {ClassId = 5500};
+
+			PIDraw3DWdg(PIContainerGen *par, char *nom,
+                                    int sx=100, int sy=100, int px=0, int py=0);
+  virtual		~PIDraw3DWdg();
+  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);
+  virtual void       	Set3DView(float xc, float yc, float zc, float xo, float yo, float zo, 
+                                  float dax, float day, float dco=0.2, float psi=0.);
+  bool           	Get3DView(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);
+
+  int                   AddDrawer3D(PIDrawer3D*, bool ad=false);   // Ajoute un Drawer 
+
+//  Pour tenir trace des Drawers-3D qui sont detruits 
+  virtual void      	RemoveDrawer(int id);       
+  virtual void       	DeleteDrawers();            
+
+  virtual void		But1Press(int x, int y);
+  virtual void		But1Release(int x, int y);
+  virtual void		Ptr1Move(int x, int y);
+
+  virtual void		But2Press(int x, int y);
+  virtual void		But2Release(int x, int y);
+  virtual void		Ptr2Move(int x, int y);
+
+  virtual void		But3Press(int x, int y);
+
+protected :
+  virtual void		Update3DView();
+  virtual void		DrawXYZAxes();
+
+  bool vfixed;       // SetView fait ou pas
+  list<int> m3DrIl;  // Liste des Id drawers 3D 
+  PIGraphic3D* mGr3d;   // PIGraphic3D courante
+  int lPx, lPy;         // dernier position pointeur
+  PIColors lCol;        // Couleur
+  float cTeta, cPhi, cUlen;    // Pour garder valeurs avant rotation, Unite de longeur 
+  float clCO, cDax, cDay;      // Pour garder les valeurs avant Zoom In/Out
+};
+
 #endif
Index: /trunk/SophyaPI/PI/pibwdggen.cc
===================================================================
--- /trunk/SophyaPI/PI/pibwdggen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pibwdggen.cc	(revision 113)
@@ -57,4 +57,5 @@
 puts("Debug_PIBaseWdgGen::Draw() Efface la fenetre par defaut ! ");
 #endif
+EraseWindow(0, 0, XSize(), YSize());
 if (fgdrawloop == 0) 
   { fgdrawloop=2;  Draw(g, 0, 0, XSize(), YSize()); }
Index: /trunk/SophyaPI/PI/pibwdggen.h
===================================================================
--- /trunk/SophyaPI/PI/pibwdggen.h	(revision 112)
+++ /trunk/SophyaPI/PI/pibwdggen.h	(revision 113)
@@ -81,20 +81,20 @@
 // ------ Gestion des Drawers  ------
   friend class PIDrawer;
-          void       SetDefaultDrawRectangle(PIGrCoord x1, PIGrCoord y1, 
+  virtual void       SetDefaultDrawRectangle(PIGrCoord x1, PIGrCoord y1, 
                                              PIGrCoord x2, PIGrCoord y2, bool psz=true); 
-          void       SetDefaultDrawerLimits(float xmin, float xmax, float ymin, float ymax,
+  virtual void       SetDefaultDrawerLimits(float xmin, float xmax, float ymin, float ymax,
                                             int axrl=kAxeDirSame, int ayud=kAxeDirSame); 
-          int        AddDrawer(PIDrawer* drw, PIGrCoord x1, PIGrCoord y1, 
+  virtual int        AddDrawer(PIDrawer* drw, PIGrCoord x1, PIGrCoord y1, 
                                PIGrCoord x2, PIGrCoord y2, 
                                bool psz=true, bool clip=true, bool ad=false);
-          int        AddDrawer(PIDrawer* drw, bool autolim=false, bool clip=true, bool ad=false);
-          void       MoveResizeDrawer(int id, PIGrCoord x1, PIGrCoord y1, 
+  virtual int        AddDrawer(PIDrawer* drw, bool autolim=false, bool clip=true, bool ad=false);
+  virtual void       MoveResizeDrawer(int id, PIGrCoord x1, PIGrCoord y1, 
                                       PIGrCoord x2, PIGrCoord y2, bool psz=true);
-          void       RemoveDrawer(int id);       // Ote un drawer de la liste
-          void       DeleteDrawers();            // Ote et detruit tous les drawers
+  virtual void       RemoveDrawer(int id);       // Ote un drawer de la liste
+  virtual void       DeleteDrawers();            // Ote et detruit tous les drawers
 // Acces aux drawers 
-          int        NbDrawers();
-          PIDrawer*  GetDrawerId(int id);   
-          PIDrawer*  GetDrawer(int n);   
+  virtual int        NbDrawers();
+  virtual PIDrawer*  GetDrawerId(int id);   
+  virtual PIDrawer*  GetDrawer(int n);   
 
 //  Trace des Drawers ...          
Index: /trunk/SophyaPI/PI/picmapview.cc
===================================================================
--- /trunk/SophyaPI/PI/picmapview.cc	(revision 113)
+++ /trunk/SophyaPI/PI/picmapview.cc	(revision 113)
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "picmapview.h"
+
+
+
+/* --Methode-- */
+PICMapView::PICMapView(PIContainerGen *par, char *nom,
+                       int sx, int sy, int px, int py) 
+: PIBaseWdg(par, nom, sx, sy, px, py)
+
+{
+
+}
+
+
+/* --Methode-- */
+PICMapView::~PICMapView()
+{
+}
+
+ 
+
+
+/* --Methode-- */
+void PICMapView::Resize()
+{
+
+}
+
+
+/* --Methode-- */
+void PICMapView::Draw(PIGraphicGen* g)
+{
+EraseWindow();
+g->SelLine(PI_NormalLine);
+g->DrawBox(10,10, XSize()-20, YSize()-20);
+
+g->SelLine(PI_ThinLine);
+g->DrawFBox(20, 20, 20, 20);
+g->DrawCircle(30, 30, 15);
+
+g->SelForeground(PI_Red);
+g->DrawFCircle(70, 30, 15);
+
+g->SelForeground(PI_Yellow);
+g->DrawFBox(10, 60, 100, 15);
+
+g->SelForeground(PI_Black);
+
+g->SelLine(PI_ThinLine);
+g->DrawLine(10, 120, 40, 120);
+g->SelLine(PI_NormalLine);
+g->DrawLine(40, 120, 70, 120);
+g->SelLine(PI_ThickLine);
+g->DrawLine(70, 120, 100, 120);
+
+g->SelForeground(PI_Magenta);
+g->DrawFCircle(120, 30, 15);
+g->SelForeground(PI_Grey);
+g->DrawFCircle(120, 60, 15);
+
+PIGrCoord x[5] = { 20, 35, 50, 65, 80 };
+PIGrCoord y[5] = { 130, 130, 130, 130, 130 };
+
+g->SelForeground(PI_Black);
+g->DrawMarkers(x, y, 5);
+return;
+}
+
+
+
+
+
+
Index: /trunk/SophyaPI/PI/picmapview.h
===================================================================
--- /trunk/SophyaPI/PI/picmapview.h	(revision 113)
+++ /trunk/SophyaPI/PI/picmapview.h	(revision 113)
@@ -0,0 +1,26 @@
+#ifndef PICMAPVIEW_H_SEEN
+#define PICMAPVIEW_H_SEEN
+
+#include "pisysdep.h"
+
+#include PIBWDG_H
+
+class PICMapView : public PIBaseWdg
+{
+public:
+                  PICMapView(PIContainerGen *par, char *nom,
+                         int sx=10, int sy=10, int px=0, int py=0);
+  virtual         ~PICMapView();
+
+
+// Traitement des evenements   
+
+  virtual void   Resize();
+  virtual void   Draw(PIGraphicGen* g);
+
+
+protected:
+};
+
+
+#endif 
Index: /trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pidrawer.cc	(revision 113)
@@ -20,4 +20,5 @@
   mMSz = -1;
   mMrk = PI_NotDefMarker;
+  mCmapid = CMAP_OTHER;
 }
 
@@ -106,4 +107,10 @@
 
 void 
+PIDrawer::SetColMapId(CMapId cid)
+{
+  mCmapid = cid;
+}
+
+void 
 PIDrawer::SelGraAtt(PIGraphicUC* g)
 {
@@ -116,4 +123,5 @@
                                   g->SelMarker(mMSz, mMrk);
 }
+
 
 void
Index: /trunk/SophyaPI/PI/pidrawer.h
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.h	(revision 112)
+++ /trunk/SophyaPI/PI/pidrawer.h	(revision 113)
@@ -52,4 +52,5 @@
                                 PIFontAtt fat=PI_NotDefFontAtt);
   void               SetMarkerAtt(int sz=-1, PIMarker mrk=PI_NotDefMarker);
+  void               SetColMapId(CMapId cid=CMAP_OTHER);
 
   void               SelGraAtt(PIGraphicUC* g);
@@ -102,5 +103,6 @@
   PIFontAtt          mFAtt;
   int                mMSz;
-  PIMarker           mMrk;     
+  PIMarker           mMrk;  
+  CMapId             mCmapid;
   
 };
Index: /trunk/SophyaPI/PI/pifilechogen.cc
===================================================================
--- /trunk/SophyaPI/PI/pifilechogen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pifilechogen.cc	(revision 113)
@@ -1,6 +1,52 @@
+// Module PI : Peida Interactive     PIFileChooser
+// Selecteur de fichier                    96-97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pifilechogen.h"
 
 
 /************* PIFileChooserGen ************/
+
+//++
+// Class	PIFileChooser
+// Lib		PI
+// include	pifilechogen.h
+//
+//	Composant graphique de type sélecteur de fichier, permettant de choisir 
+//	un nom de fichier et de naviguer dans les répertoires.
+//	"PIFileChooserGen" définit l'interface (classe virtuelle pure). Les objets 
+//	instanciés doivent être de la classe "PIFileChooser" déclarée dans le fichier
+//	entête "PIFILECHO_H". Le message associé à l'objet est envoyé completé 
+//	avec "PIMsg_OK" si un nom de fichier a été choisi. la variable "data"
+//	est alors un pointeur sur une chaîne de caractères ("char *"), 
+//	contenant le nom complet du fichier. Si aucun fichier n'a été 
+//	sélectionné, le message de l'objet est completé avec "PIMsg_Cancel" et 
+//	le "datä contient le pointeur "NULL".
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+//++
+// Titre	Constructeur et méthodes
+//--
+//++
+// PIFileChooser(PIMsgHandler* par, char* nom, PIMessage msg)
+//	Création d'un objet sélecteur de fichier, avec le message "msg".
+// void  Show()
+//	Affiche la fenêtre de sélection des fichiers
+// void  AcceptNewFile(bool acc)
+//	Active ("acc=true") ou désactive la possibilité de spécifier
+//	un nouveau fichier.
+// void  SetPath(string const&)
+//	Définit le chemin d'accès (répertoire) choisi par défaut
+// void  SetFileName(string const&) 
+//	Nom de fichier sélectionné par défaut
+// string  GetPath()
+//	Retourne le chemin d'accès. NON IMPLEMENTE EN X/MOTIF (06/98)
+// string  GetFileName()
+//	Retourne le nom complet du fichier sélectionné. 
+//--
+
 
 PIFileChooserGen::PIFileChooserGen(PIMsgHandler* par, char* nom, PIMessage msg)
Index: /trunk/SophyaPI/PI/pigraph3d.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraph3d.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pigraph3d.cc	(revision 113)
@@ -1,12 +1,335 @@
+// Module PI : Peida Interactive     PIGraphic3D
+// Trace graphiques 3D               R. Ansari  06/98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdio.h>
+#include <math.h>
 #include "pigraph3d.h"
 
+/* --Methode-- */
 PIGraphic3D::PIGraphic3D(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
         : PIGraphicUC(g, x0, y0, dx, dy)
 {
-printf("PIGraphic3D::PIGraphic3D : Rien n'est code ! \n");
-}
-
+  int i,j;
+  for(i=0; i<3; i++) 
+    for(j=0; j<3; j++)  RE[i][j] = 0.;
+  RE[0][0] = RE[1][1] = RE[2][2] = 1.;
+  xO = yC = 0.; zO = -10.;
+  xC = yC = zC = 0.;
+  tO = fO = pO = 0.; 
+  daxO = dayO = 0.25;
+  lCO = 10.;  dlCO = 0.2;  
+  sO = false;
+}
+
+/* --Methode-- */
 PIGraphic3D::~PIGraphic3D()
 {
 }
+
+/* --Methode-- */
+int PIGraphic3D::kind() 
+{
+  return PI_3DGraphics; 
+}
+
+static float deuxpi = 2*M_PI;
+static double ddeuxpi = 2*M_PI;
+
+/* --Methode-- */
+void PIGraphic3D::Set3DCS_Obs(float xo, float yo, float zo, float teta, float phi, float psi, 
+                              float dax, float day, float co, float dco)
+{
+  sO = true;
+  xO = xo;  yO = yo;  zO = zo;
+  if (teta > M_PI)  teta = M_PI;
+  if (teta < 0.) teta = 0.;
+  if (phi < 0.)  phi = 0.;
+  if (phi > deuxpi) phi = deuxpi;
+  tO = teta;  fO = phi;  pO = psi;
+  if (dax < 0.) dax = -dax;
+  if (day < 0.) day = -day;
+  daxO = dax;  dayO = day;
+  lCO = co;   dlCO = dco;
+  SetUCS(-dax, dax, -day, day, kAxeDirLtoR, kAxeDirDownUp);
+  double ct = cos((double)tO);
+  double st = sin((double)tO);
+// (Teta,Phi) = Direction de visee 
+// Les angles d'Euler correspondants sont Teta, Phi+Pi/2
+  double cf = cos((double)fO+M_PI_2);
+  double sf = sin((double)fO+M_PI_2);
+  double cp = cos((double)pO);
+  double sp = sin((double)pO);
+  RE[0][0] = cf*cp-sf*ct*sp;     RE[0][1] = sf*cp+cf*ct*sp;      RE[0][2] = st*sp;
+  RE[1][0] = -cf*sp-sf*ct*cp;    RE[1][1] = -sf*sp+cf*ct*cp;     RE[1][2] = st*cp;
+  RE[2][0] = sf*st;              RE[2][1] = -cf*st;              RE[2][2] = ct;
+  cf = cos((double)fO);
+  sf = sin((double)fO);
+  zC = ct*lCO+zO;
+  xC = st*cf*lCO+xO;
+  yC = st*sf*lCO+yO;
+}
+
+/* --Methode-- */
+void PIGraphic3D::Set3DCS(float xc, float yc, float zc, float xo, float yo, float zo, 
+                          float dax, float day, float dco, float psi)
+{
+  sO = false;
+  xO = xo;  yO = yo;  zO = zo;
+  xC = xc;  yC = yc;  zC = zc;
+  double dx,dy,dz,dl;
+// On calcule le vecteur  OC  Observateur -> Centre du champ, ca nous donne donc teta,phi de visee
+  dx = xc-xo;  dy = yc-yo;  dz = zc-zo;
+  if (dax < 0.) dax = -dax;
+  if (day < 0.) day = -day;
+  daxO = dax;  dayO = day;  
+  SetUCS(-dax, dax, -day, day, kAxeDirLtoR, kAxeDirDownUp);
+  lCO = sqrt(dx*dx+dy*dy+dz*dz);
+  if (lCO < 1.e-6) {
+    printf("PIGraphic3D::Set3DCS()/Warning : Length(CO) = %g -> CS par defaut \n", lCO);
+    int i,j;
+    for(i=0; i<3; i++) 
+      for(j=0; j<3; j++)  RE[i][j] = 0.;
+    RE[0][0] = RE[1][1] = RE[2][2] = 1.;
+    xO = yC = 0.; zO = -10.;
+    xC = yC = zC = 0.;
+    tO = fO = pO = 0.; 
+    daxO = dayO = 0.25;
+    lCO = 10.;  dlCO = 0.2;      
+    return;
+  }
+  dlCO = dco;
+  double lxy = sqrt(dx*dx+dy*dy);
+  double ct,st,cf,sf;
+  ct = dz/lCO;
+  st = sqrt(1-ct*ct);
+  pO = psi;
+  tO = acos(ct);
+  if (lxy < 1.e-6) { fO = 0.;  cf = 0.;  }
+  else {  cf = dx/lxy;  fO = acos(cf);  if (dy < 0.)  fO = ddeuxpi-fO;   }
+// (Teta,Phi) = Direction de visee 
+// Les angles d'Euler correspondants sont Teta, Phi+Pi/2
+  cf = cos((double)fO+M_PI_2);
+  sf = sin((double)fO+M_PI_2);
+  double cp = cos((double)psi);
+  double sp = sin((double)psi);
+  RE[0][0] = cf*cp-sf*ct*sp;     RE[0][1] = sf*cp+cf*ct*sp;      RE[0][2] = st*sp;
+  RE[1][0] = -cf*sp-sf*ct*cp;    RE[1][1] = -sf*sp+cf*ct*cp;     RE[1][2] = st*cp;
+  RE[2][0] = sf*st;              RE[2][1] = -cf*st;              RE[2][2] = ct;
+}
+
+
+/* --Methode-- */
+bool PIGraphic3D::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)
+{
+  xc = xC;  yc = yC;  zc = zC;
+  xo = xO;  yo = yO;  zo = zO;
+  teta = tO;  phi = fO;  psi = pO;
+  dax = daxO;   day = dayO;
+  co = lCO;     dco = dlCO;
+  return(sO);
+}
+
+/* --Methode-- */
+void PIGraphic3D::PrintCS()
+{
+if (sO)  printf("PIGraphic3D::PrintCS() : Set3DCS_Obs(...) \n");
+else  printf("PIGraphic3D::PrintCS() : Set3DCS(...) \n");
+printf("C: %g %g %g ->O: %g %g %g - T,P= %g %g %g lCO= %g %g  |  %g %g - %g %g \n", 
+        xC,yC,zC, xO, yO, zO, tO, fO, pO, lCO, dlCO, xOrg, xScale, yOrg, yScale ); 
+printf("RE[3][3]=  %g %g %g | %g %g %g | %g %g %g\n", 
+        RE[0][0], RE[0][1], RE[0][2], RE[1][0], RE[1][1], RE[1][2], RE[2][0], RE[2][1], RE[2][2]); 
+float x,y,z,xp,yp,zp, xpix, ypix;
+x = xC, y = yC, z= zC;
+C3DC2ObsCS(x, y, z, xp, yp, zp);
+Proj3DC2GrC(x, y, z, xpix, ypix);
+printf("C -> %g %g %g -> %g %g \n", xp, yp, zp, xpix, ypix); 
+x = xC+1, y = yC, z= zC;
+C3DC2ObsCS(x, y, z, xp, yp, zp);
+Proj3DC2GrC(x, y, z, xpix, ypix);
+printf("C+(1,0,0) -> %g %g %g -> %g %g ", xp, yp, zp, xpix, ypix); 
+x = xC, y = yC+1, z= zC+1;
+C3DC2ObsCS(x, y, z, xp, yp, zp);
+Proj3DC2GrC(x, y, z, xpix, ypix);
+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)
+{
+  if (rel) {
+    teta = M_PI-tO-teta;
+    phi = M_PI+fO+phi;
+    psi = pO+psi;
+    }
+  if (teta < 0.) teta = 0.;
+  if (teta > M_PI)  teta = 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::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 112)
+++ /trunk/SophyaPI/PI/pigraph3d.h	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphic3D
+// Trace graphiques 3D               R. Ansari  06/98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PIGRAPHIC3D_H_SEEN
 #define PIGRAPHIC3D_H_SEEN
@@ -6,9 +10,44 @@
 
 
-class PIGraphic3D : PIGraphicUC 
+class PIGraphic3D : public PIGraphicUC 
 {
+public:
                      PIGraphic3D(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
   virtual           ~PIGraphic3D();
 
+  virtual int        kind();
+
+//  Definition du systeme de projection 3D-2D
+  virtual 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);
+  virtual 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.);
+  virtual 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);
+
+  virtual void       PrintCS();  // Pour debugger
+  virtual void       RotateObserver(float teta, float phi, float psi=0., bool rel=true);
+  virtual void       ZoomInOut(float fco, float fdax, float fday, bool rel=true);
+
+  virtual void       C3DC2ObsCS(float x, float y, float z, float& xp, float& yp, float& zp);
+  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       DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
+                                PIGrCoord x2, PIGrCoord y2, PIGrCoord z2);
+  virtual void       DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n);  
+  virtual void       DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n);  
+  virtual void       DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0);
+  virtual void       DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n);
+  
+protected:
+  double xO, yO, zO;  // Position observateur = camera
+  double xC, yC, zC;  // Position centre du champ
+  double tO,fO,pO;    // Orientation observateur (Teta, Phi, Psi, Angles d Euler)
+  double daxO, dayO;  // Demi-ouverture de la camera suivant les deux axes de projection (xp/zp, yp/zp) 
+  double lCO, dlCO;   // Distance Camera-Centre du champ et profondeur de champ 
+  double RE[3][3];    // Matrice de rotation  
+  bool sO;            // Vrai si fait par Set3DCS_Obs()
 };
 
Index: /trunk/SophyaPI/PI/pigraphgen.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphgen.cc	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphic 
+// Primitives de trace graphiques    R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 // Classe generique de trace graphique de base (Ne peut etre instancie)
 
Index: /trunk/SophyaPI/PI/pigraphgen.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.h	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphgen.h	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphic 
+// Primitives de trace graphiques    R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PIGRAPHICGEN_H_SEEN
 #define PIGRAPHICGEN_H_SEEN
@@ -52,5 +56,5 @@
 
 enum PIGraphicsType { PI_ScrWindowGraphics = 0, PI_PSFileGraphics = 1, 
-                      PI_UCGraphics = 2, PI_UC3DGraphics = 3 };
+                      PI_UCGraphics = 2, PI_3DGraphics = 3 };
 
 // Classe generique de trace graphique de base :
@@ -77,6 +81,6 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)               = 0;
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r)              = 0;
-  virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n)                    = 0;  
-  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n)                   = 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       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 112)
+++ /trunk/SophyaPI/PI/pigraphps.cc	(revision 113)
@@ -127,5 +127,5 @@
 
 /* --Methode-- */
-void PIGraphicPS::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicPS::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
 int i;
@@ -137,7 +137,11 @@
 xtmp = new float[n];
 ytmp = new float[n];
-for(i=0;i<n;i++){
-  xtmp[i] = (float)x[i];
-  ytmp[i] = (float)y[i];
+
+float xoff,yoff;
+if (cinc) { xoff=yoff=0.; }   // Coord en mode incremental
+else { xoff = (float)x[0];  yoff = (float)y[0]; }   //   Coord en mode absolu
+for(i=0;i<n;i++) {
+  xtmp[i] = (float)x[i]-xoff;
+  ytmp[i] = (float)y[i]-yoff;
 }
 mPSOut->DrawPolygon(xtmp,ytmp,n,mFCol,mLAtt);
@@ -150,5 +154,5 @@
 
 /* --Methode-- */
-void PIGraphicPS::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicPS::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
 int i;
@@ -160,7 +164,11 @@
 xtmp = new float[n];
 ytmp = new float[n];
-for(i=0;i<n;i++){
-  xtmp[i] = (float)x[i];
-  ytmp[i] = (float)y[i];
+
+float xoff,yoff;
+if (cinc) { xoff=yoff=0.; }   // Coord en mode incremental
+else { xoff = (float)x[0];  yoff = (float)y[0]; }   //   Coord en mode absolu
+for(i=0;i<n;i++) {
+  xtmp[i] = (float)x[i]-xoff;
+  ytmp[i] = (float)y[i]-yoff;
 }
 mPSOut->DrawFPolygon(xtmp,ytmp,n,mFCol,mFCol,mLAtt);
Index: /trunk/SophyaPI/PI/pigraphps.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphps.h	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphps.h	(revision 113)
@@ -27,6 +27,6 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
-  virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
-  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
+  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       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 112)
+++ /trunk/SophyaPI/PI/pigraphuc.cc	(revision 113)
@@ -1,4 +1,7 @@
+// Module PI : Peida Interactive     PIGraphicUC 
+// Trace graphiques User-Coordinates    R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pigraphuc.h"
-
 
 
@@ -30,4 +33,13 @@
 {
 return PI_UCGraphics; 
+}
+
+/* --Methode-- */
+void PIGraphicUC::SetBaseGraphic(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+{
+  mGrC = g;
+  xW0 = x0;  yW0 = y0; 
+  xWd = dx;  yWd = dy; 
+  SetUCS(xMin, xMax, yMin, yMax, kAxeDirSame, kAxeDirSame);
 }
 
@@ -89,6 +101,6 @@
 void PIGraphicUC::UC2GrC(float x, float y, float& xpix, float& ypix)
 {
-  xpix = (float)(xOrg + x*xScale + .5);
-  ypix = (float)(yOrg + y*yScale + .5);
+  xpix = (float)(xOrg + x*xScale);  // $CHECK$ Reza 21/06/98 ? + .5);
+  ypix = (float)(yOrg + y*yScale);  // $CHECK$ Reza 21/06/98 ?+ .5);
 }
 
@@ -327,5 +339,5 @@
 
 /* --Methode-- */
-void PIGraphicUC::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicUC::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
   PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
@@ -343,5 +355,5 @@
     pxc[i] = xf;  pyc[i] = yf; 
   }
-  mGrC->DrawPolygon(pxc, pyc, n);
+  mGrC->DrawPolygon(pxc, pyc, n, cinc);
   if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
   return;
@@ -349,5 +361,5 @@
   
 /* --Methode-- */
-void PIGraphicUC::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicUC::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
   PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
@@ -365,5 +377,5 @@
     pxc[i] = xf;  pyc[i] = yf; 
   }
-  mGrC->DrawFPolygon(pxc, pyc, n);
+  mGrC->DrawFPolygon(pxc, pyc, n, cinc);
   if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
   return;
Index: /trunk/SophyaPI/PI/pigraphuc.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphuc.h	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphuc.h	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphicUC 
+// Trace graphiques User-Coordinates    R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PIGRAPHICUC_H_SEEN
 #define PIGRAPHICUC_H_SEEN
@@ -22,4 +26,6 @@
   virtual int        kind();
 
+  virtual void       SetBaseGraphic(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy);
+
 //  Espace des coordonnees
   virtual void       GetGrSpace(PIGrCoord& xmin, PIGrCoord& xmax, PIGrCoord& ymin, PIGrCoord& ymax);
@@ -38,6 +44,6 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
-  virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
-  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
+  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       DrawMarker(PIGrCoord x0, PIGrCoord y0);
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n);
Index: /trunk/SophyaPI/PI/pigraphx.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphx.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphx.cc	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphicX
+// Trace graphiques- Implementation X11  R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include <stdio.h>
 
@@ -125,5 +129,5 @@
 
 /* --Methode-- */
-void PIGraphicX::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicX::DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
 XPoint multipoint[NMXXPOINTS];
@@ -135,5 +139,7 @@
 else pxp = multipoint;
 for(i=0; i<n; i++)  { pxp[i].x = x[i];  pxp[i].y = y[i]; } 
-XDrawLines(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, CoordModePrevious);
+int mode = CoordModeOrigin;
+if (cinc) mode =  CoordModePrevious;
+XDrawLines(XtDisplay(MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, mode);
 if (n > NMXXPOINTS)  delete[] pxp;
 
@@ -143,5 +149,5 @@
 
 /* --Methode-- */
-void PIGraphicX::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n)
+void PIGraphicX::DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc)
 {
 XPoint multipoint[NMXXPOINTS];
@@ -153,6 +159,8 @@
 else pxp = multipoint;
 for(i=0; i<n; i++)  { pxp[i].x = x[i];  pxp[i].y = y[i]; } 
+int mode = CoordModeOrigin;
+if (cinc) mode =  CoordModePrevious;
 XFillPolygon(XtDisplay (MyWdg()), XtWindow(MyWdg()), DefGC(), pxp, n, 
-                        Complex, CoordModePrevious);
+                        Complex, mode);
 if (n > NMXXPOINTS)  delete[] pxp;
 
Index: /trunk/SophyaPI/PI/pigraphx.h
===================================================================
--- /trunk/SophyaPI/PI/pigraphx.h	(revision 112)
+++ /trunk/SophyaPI/PI/pigraphx.h	(revision 113)
@@ -1,2 +1,6 @@
+// Module PI : Peida Interactive     PIGraphicX
+// Trace graphiques- Implementation X11  R. Ansari  97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #ifndef PIGRAPHICX_H_SEEN
 #define PIGRAPHICX_H_SEEN
@@ -20,6 +24,6 @@
   virtual void       DrawCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
   virtual void       DrawFCircle(PIGrCoord x0, PIGrCoord y0, PIGrCoord r);
-  virtual void       DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
-  virtual void       DrawFPolygon(PIGrCoord *x, PIGrCoord *y, int n);  
+  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       DrawMarker(PIGrCoord x0, PIGrCoord y0);
   virtual void       DrawMarkers(PIGrCoord *x, PIGrCoord *y, int n);
Index: /trunk/SophyaPI/PI/piimage.cc
===================================================================
--- /trunk/SophyaPI/PI/piimage.cc	(revision 112)
+++ /trunk/SophyaPI/PI/piimage.cc	(revision 113)
@@ -1,2 +1,3 @@
+// Module PI : Peida Interactive     PIImage
 // Affichage d'image            R. Ansari  05/95
 // LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
@@ -740,8 +741,7 @@
 if (winovis)  return;      // $CHECK$ Reza A enlever si possible 17/6/96
 
-g->SelGOMode(PI_GOXOR);
-if (GetColMapId() == CMAP_COLRJ32)
-g->SelForeground(PI_Yellow);
-else g->SelForeground(PI_Magenta);
+g->SelGOMode(PI_GOCopy);
+if ( (GetColMapId() == CMAP_GREY32) || (GetColMapId() == CMAP_GREYINV32) )  g->SelForeground(PI_Red);
+else  g->SelForeground(PI_White);
 
 if (zoom < 3)  g->SelLine(PI_NormalLine);
@@ -749,9 +749,6 @@
 
 if ((xcurs>=0) && (ycurs>=0)) {
-//  PIPixmap::Draw(g, xcurs-CURSHSIZE, ycurs-CURSHSIZE, CURSHSIZE*2, CURSHSIZE*2); 
-  g->DrawLine(xcurs-CURSHSIZE, ycurs, xcurs-4, ycurs);
-  g->DrawLine(xcurs+4, ycurs, xcurs+CURSHSIZE, ycurs);
-  g->DrawLine(xcurs, ycurs-CURSHSIZE, xcurs, ycurs-4);
-  g->DrawLine(xcurs, ycurs+4, xcurs, ycurs+CURSHSIZE);
+  PIPixmap::Draw(g, xcurs-3, ycurs-CURSHSIZE, 6, CURSHSIZE*2); 
+  PIPixmap::Draw(g, xcurs-CURSHSIZE, ycurs-3, CURSHSIZE*2, 6); 
 }
 if ((xc >= 0) && (yc >= 0)) 
Index: /trunk/SophyaPI/PI/piimage.h
===================================================================
--- /trunk/SophyaPI/PI/piimage.h	(revision 112)
+++ /trunk/SophyaPI/PI/piimage.h	(revision 113)
@@ -1,4 +1,4 @@
-// This may look like C code, but it is really -*- C++ -*-
-// Affichage d'image            R. Ansari  05/95
+// Module PI : Peida Interactive     PIImage
+// Affichage d image            R. Ansari  05/95
 // LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
 
Index: /trunk/SophyaPI/PI/pilistgen.cc
===================================================================
--- /trunk/SophyaPI/PI/pilistgen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pilistgen.cc	(revision 113)
@@ -1,4 +1,68 @@
+// Module PI : Peida Interactive     PIList
+// Liste                                     96-97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pilistgen.h"
 
+//++
+// Class	PIList
+// Lib		PI
+// include	pilistgen.h
+//
+//	Composant graphique de type liste, permettant d'afficher une liste 
+//	d'éléments, qui peuvent être sélectionnés à l'aide du pointeur (souris). 
+//	"PIListGen" définit l'interface (classe virtuelle pure). Les objets 
+//	instanciés doivent être de la classe "PIList" déclarée dans le fichier
+//	entête "PILIST_H". Lors de la sélection d'un des éléments, 
+//	le message correspondant complété par "PIMsg_Select" est envoyé.
+//	Le modifier "PIMsg_ClearSel" est appliqué lorsque d'une dé-sélection.
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+
+//++
+// Titre	Constructeur
+//--
+//++
+// PIListGen(PIContainerGen* par, char* nom, int sx=100, int sy=100, int px=0, int py=0)
+//	Création d'un objet liste (PIList). 
+//--
+
+//++
+// Titre	Ajout et suppression d'éléments
+//--
+//++
+// void  AppendItem(char* nom, PIMessage msg)
+//	Ajoute un élément à la liste.
+// void  DeleteItem(const char *item)
+//	Supprime l'élément "item" de la liste.
+// void  DeleteItemMsg(PIMessage msg)
+//	Supprime l'élément identifié par le message "msg" de la liste.
+//--
+//++
+// Titre	Gestion des sélections
+//--
+//++
+// void  SetMultipleSelect(bool ms=false)
+//	Active ("ms=true") ou désactive la possibilité de sélection multiple.
+// int   GetNbSelection()
+//	Renvoie le nombre d'éléments sélectionnés.
+// PIMessage  GetSelection(int num=0)
+//	Renvoie le message correspondant à la sélection numéro "n". L'ordre 
+//	dans lequel les sélections sont retournées est indéfini.
+// string   GetSelectionStr(int num=0)
+//	Renvoie la chaîne de caractères correspondant à l'élément sélectionné 
+//	numéro "n".
+// void  SelectItem(const char* item)
+//	Permet de sélectionner l'élément "item".
+// void  SelectItemMsg(PIMessage msg)
+//	Permet de sélectionner l'élément identifié par le message "msg".
+// void  ClearSelItem(const char* item)
+//	Efface la sélection pour l'élément "item".
+// void  ClearSelItemMsg(PIMessage msg)
+//	Efface la sélection pour l'élément identifié par le message "msg".
+//--
 
 PIListGen::PIListGen(PIContainerGen *par, char *nom,
Index: /trunk/SophyaPI/PI/pilistgen.h
===================================================================
--- /trunk/SophyaPI/PI/pilistgen.h	(revision 112)
+++ /trunk/SophyaPI/PI/pilistgen.h	(revision 113)
@@ -16,5 +16,5 @@
   virtual void	     AppendItem(const char * item, PIMessage msg)=0;
   virtual void       DeleteItem(const char *item)=0;
-  virtual void       DeleteItem(PIMessage msg)=0;
+  virtual void       DeleteItemMsg(PIMessage msg)=0;
   
   virtual void       SetMultipleSelect(bool ms=false)=0;
@@ -25,7 +25,7 @@
 
   virtual void       SelectItem(const char * item)=0;
-  virtual void       SelectItem(PIMessage msg)=0;
+  virtual void       SelectItemMsg(PIMessage msg)=0;
   virtual void       ClearSelItem(const char * item)=0;
-  virtual void       ClearSelItem(PIMessage msg)=0;
+  virtual void       ClearSelItemMsg(PIMessage msg)=0;
 
   virtual long       kind() {return ClassId; }
Index: /trunk/SophyaPI/PI/pilistx.cc
===================================================================
--- /trunk/SophyaPI/PI/pilistx.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pilistx.cc	(revision 113)
@@ -123,5 +123,5 @@
 
 /* --Methode-- */
-void PIListX::DeleteItem(PIMessage msg)
+void PIListX::DeleteItemMsg(PIMessage msg)
 {
 int n;
@@ -179,5 +179,5 @@
 
 /* --Methode-- */
-void PIListX::SelectItem(PIMessage msg)
+void PIListX::SelectItemMsg(PIMessage msg)
 {
 int n;
@@ -200,5 +200,5 @@
 
 /* --Methode-- */
-void PIListX::ClearSelItem(PIMessage msg)
+void PIListX::ClearSelItemMsg(PIMessage msg)
 {
 int n;
Index: /trunk/SophyaPI/PI/pilistx.h
===================================================================
--- /trunk/SophyaPI/PI/pilistx.h	(revision 112)
+++ /trunk/SophyaPI/PI/pilistx.h	(revision 113)
@@ -12,5 +12,5 @@
   virtual void	     AppendItem(const char * item, PIMessage msg);
   virtual void       DeleteItem(const char *item);
-  virtual void       DeleteItem(PIMessage msg);
+  virtual void       DeleteItemMsg(PIMessage msg);
 
   virtual void       SetMultipleSelect(bool ms=false);
@@ -21,7 +21,7 @@
 
   virtual void       SelectItem(const char * item);
-  virtual void       SelectItem(PIMessage msg);
+  virtual void       SelectItemMsg(PIMessage msg);
   virtual void       ClearSelItem(const char * item);
-  virtual void       ClearSelItem(PIMessage msg);
+  virtual void       ClearSelItemMsg(PIMessage msg);
 
 // Mis en public pour Callback Xt
Index: /trunk/SophyaPI/PI/pimenubargen.cc
===================================================================
--- /trunk/SophyaPI/PI/pimenubargen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pimenubargen.cc	(revision 113)
@@ -1,5 +1,45 @@
+// Module PI : Peida Interactive     PIMenubar
+// Barre de menu                        96-97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pimenubargen.h"
 
 #include PIAPP_H
+
+//++
+// Class	PIMenubar
+// Lib		PI
+// include	pimenubargen.h
+//
+//	Composant graphique de type Barre des menus . 
+//	"PIMenubarGen" définit l'interface (classe virtuelle pure). Les objets 
+//	instanciés doivent être de la classe "PIMenubar" déclarée dans le fichier
+//	entête "PIMENUBAR_H". 
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+//++
+// Links	Voir aussi
+// PIMenu
+//--
+
+//++
+// Titre	Constructeur, méthodes
+//--
+//++
+// PIMenubar(PIApplicationGen* par, char* nom)
+//	Création d'un objet Menubar.
+// void  AppendMenu(PIMenu* pdm)
+//	Rajoute un menu à la barre de menu. Le menu sera affiché avec un titre identique à son nom.
+// void  RemoveMenu(PIMenu* pdm)
+//	Supprime le menu "pdm" de la barre de menu, sans le détruire (delete).
+// void  SetSensitivity(PIMenu* pdm, bool sens=true)
+//	Permet de rendre sensible ("sens=true") ou insensible un menu. Le titre d'un menu
+//	insensible est affiché, mais ne peut être séléctionné.
+// bool  IsSensitive(PIMenu* pdm)
+//	Indique si le menu "pdm" est sensible ou pas.
+//--
 
 PIMenubarGen::PIMenubarGen(PIApplicationGen* par, char* nom)
Index: /trunk/SophyaPI/PI/pimenugen.cc
===================================================================
--- /trunk/SophyaPI/PI/pimenugen.cc	(revision 112)
+++ /trunk/SophyaPI/PI/pimenugen.cc	(revision 113)
@@ -1,3 +1,115 @@
+// Module PI : Peida Interactive     PIMenu
+// Menu                                     96-97
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
 #include "pimenugen.h"
+
+//++
+// Class	PIMenu
+// Lib		PI
+// include	pimenugen.h
+//
+//	Composant graphique de type menu. 
+//	"PIMenuGen" définit l'interface (classe virtuelle pure). Les objets 
+//	instanciés doivent être de la classe "PIMenu" déclarée dans le fichier
+//	entête "PIMENUBAR_H". Lors de la séléction d'une des options du menu
+//	Le message correspondant complété par "PIMsg_Click" est envoyé à l'objet
+//	par "SendSelf()".
+//--
+//++
+// Links	Parents
+// PIWdg
+//--
+//++
+// Links	Voir aussi
+// PIMenubar
+//--
+
+
+
+//++
+// Titre	Constructeur
+//--
+//++
+// PIMenu(PIWdg* par, char* nom, PIMenuType pdpu=k_UTMenu)
+//	Création d'un objet Menubar. "pdpu" peut prendre les valeurs
+//	"k_UTMenu", "k_PopupMenu", "k_PulldownMenu". Un menu de type
+//	"PulldownMenu" est destiné à être accroché à un Menubar ou
+//	comme sous-menu d'un autre menu. Si l'objet parent est de type
+//	"PIMenu" ou "PIMenubar", un PulldownMenu est créé par défaut. Un 
+//	menu de type PopupMenu est créé dans les autres cas.
+// PIMenuType MType() 
+//	Renvoie le type du menu : "k_PopupMenu" ou  "k_PulldownMenu".
+//--
+
+//++
+// Titre	Ajout et suppression des options du menu
+//--
+//
+//++
+// void  AppendItem(char* nom, PIMessage msg, char* sc=NULL)
+//	Permet d'ajouter une option au menu. Un raccourci clavier peut être spécifié
+//	par "sc".
+// void  AppendCheckItem(char* nom, PIMessage msg, char* sc=NULL)
+//	Permet d'ajouter une option avec état ON/OFF au menu.
+// void	 AppendPDMenu(PIMenu* pdm, char* sc=NULL)
+//	Ajoute un menu déroulant comme sous-menu.
+// void  DeleteItem(char* nom)
+//	Permet de supprimer une option du menu identifiée par le titre ("nom").
+//	Si le nom désigne un menu déroulant, celui-ci n'est pas détruit (par "delete").
+// void  DeleteItemMsg(PIMessage msg)
+//	Permet de supprimer une option du menu identifiée par le message ("msg").
+// void  DeleteItemNum(int n)
+//	Suppression de l'option numéro "n".
+//--
+//++
+// Titre	Gestion des options 
+//--
+//++
+// void  SetSensitivity(char* nom, bool sens=true)
+//	Rend sensible ("sens=true") ou insensible l'option du menu identifiée par "nom".
+//	Une option insensible est affichée, mais ne peut être sélectionnée.
+// void  SetSensitivityMsg(PIMessage msg, bool sens=true)
+//	Rend sensible ("sens=true") ou insensible l'option du menu identifiée par le message "msg".
+// void  SetSensitivityNum(int n, bool sens=true)
+//	Rend sensible ("sens=true") ou insensible l'option numéro "n".
+// bool  IsSensitive(char* nom)
+//	Indique si l'option "nom" est sensible ou pas.
+// bool  IsSensitiveMsg(PIMessage msg)
+//	Indique si l'option identifiée par le message "msg" est sensible ou pas.
+// bool  IsSensitiveNum(int n)
+//	Indique si l'option numéro "n" est sensible ou pas.
+//--
+//++
+// Titre	Options à état (CheckItem)
+//	Le champ "data" de "Send()/SendSelf()" contient un pointeur sur une variable
+//	de type bool, indiquant l'état (On/Off) de l'option, lors de la séléction des
+//	options à état ("CheckItem"). Les méthodes suivantes ne s'appliquent qu'aux 
+//	options de type CheckItem.
+//--
+//++
+// void  SetState(char* nom, bool st=false)
+//	Change l'état de l'option "nom".
+// void  SetStateMsg(PIMessage msg, bool st=false)
+//	Change l'état de l'option identifiée par le message "msg".
+// void  SetStateNum(int n, bool st=false)
+//	Change l'état de l'option numéro "n".
+// bool GetState(char* nom)
+//	Renvoie l'état de l'option "nom".
+// bool GetStateMsg(PIMessage msg)
+//	Renvoie l'état de l'option identifiée par le message "msg".
+// bool GetStateNum(int n)
+//	Renvoie l'état de l'option numéro "n".
+//--
+
+//++
+// Titre	Affichage des PopupMenu
+//--
+//++
+// void  Show()
+//	Affiche le menu (de type "k_PopupMenu" uniquement) à la position courante du pointeur.
+// void  Show(PIWdg* w, int px, int py)
+//	Affiche le menu (de type "k_PopupMenu" uniquement) à la position "px,py" de l'objet "w". 
+//--
 
 PIMenuGen::PIMenuGen(PIWdg* par, char* nom, PIMenuType pdpu)
Index: /trunk/SophyaPI/PI/pintup3d.cc
===================================================================
--- /trunk/SophyaPI/PI/pintup3d.cc	(revision 113)
+++ /trunk/SophyaPI/PI/pintup3d.cc	(revision 113)
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include "pintup3d.h"
+
+ 
+/* --Methode-- */
+PINTuple3D::PINTuple3D(NTuple* nt, bool ad)
+: PIDrawer3D()
+{
+  mNT = nt;
+  mAdDO = ad; 
+  SelectXYZ(NULL, NULL, NULL);
+  SelectErrBar();
+}
+
+PINTuple3D::~PINTuple3D()
+{
+  if (mAdDO && mNT)  delete mNT;
+}
+
+/* --Methode-- */
+void  PINTuple3D::SelectXYZ(char* px, char* py, char* pz)
+{
+if (mNT == NULL)  xK = yK = zK = -1;
+if (px == NULL) xK = -1;
+else xK = mNT->IndexNom(px);
+if (py == NULL) yK = -1;
+else yK = mNT->IndexNom(py);
+if (pz == NULL) zK = -1;
+else zK = mNT->IndexNom(pz);
+}
+
+/* --Methode-- */
+void  PINTuple3D::SelectErrBar(char* erbx, char* erby, char* erbz)
+{
+if (mNT == NULL)  xebK = yebK = zebK = -1;
+if (erbx == NULL) xebK = -1;
+else xebK = mNT->IndexNom(erbx);
+if (erby == NULL) yebK = -1;
+else yebK = mNT->IndexNom(erby);
+if (erbz == NULL) zebK = -1;
+else zebK = mNT->IndexNom(erbz);
+}
+
+
+/* --Methode-- */
+void PINTuple3D::UpdateSize()
+{
+  if (!mNT) return;
+  if (mNT->NEntry() <= 0)  return;
+  if ( (xK < 0) || (yK < 0)  || (zK < 0) )   return;
+
+  // Commencer par trouver nos limites
+  float xmin, xmax, ymin, ymax, zmin, zmax;
+  xmin = ymin = 9.e19;
+  xmax = ymax = -9.e19;
+  zmax = zmax = -9.e19;
+  mNT->GetMinMax(xK, xmin, xmax);
+  mNT->GetMinMax(yK, ymin, ymax);
+  mNT->GetMinMax(zK, zmin, zmax);
+
+// Centre du champ en C = (xmin+xmax)/2., (ymin+ymax)/2  (zmin+zmax)*0.5
+// Distance D = Max(xmax-xmin,ymin-ymax)*2
+// Observateur en O = X+D, Yc+2*D 
+  float D = xmax-xmin;
+  if (D < (ymax-ymin))  D = ymax-ymin;
+  D *= 1.4;
+  
+  Set3DView((xmin+xmax)/2., (ymin+ymax)/2, (zmin+zmax)/2., 
+            (xmin+xmax)/2.+D , (ymin+ymax)/2.+2.*D , zmin+(zmax-zmin)*0.1, 0.3, 0.3);  
+//  printf("PINTuple3D::UpdateSize() : %g-%g  %g-%g  %g-%g (%g) \n", xmin,xmax,ymin,ymax,zmin,zmax,D);
+//  printf("PINTuple3D::UpdateSize() :  %g %g %g << %g %g %g \n", 
+//         (xmin+xmax)/2., (ymin+ymax)/2, (zmin+zmax)*0.5, 
+//         (xmin+xmax)/2.+D , (ymin+ymax)/2.+2.*D , zmin+(zmax-zmin)*0.1);
+}
+
+
+/* --Methode-- */
+void PINTuple3D::Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax)
+{
+float xp,yp,zp,xer,yer,zer;
+int nok;
+
+if (!mNT) return;
+if ( (xK < 0) || (yK < 0) || (zK < 0) )  return;
+PIGraphic3D* g3 = dynamic_cast<PIGraphic3D*>(g);
+
+nok = 0;  
+for (int i=0; i<mNT->NEntry(); i++) {
+  xp = mNT->GetVal(i, xK);
+  yp = mNT->GetVal(i, yK);
+  zp = mNT->GetVal(i, zK);
+  nok++;
+  g3->DrawMarker3D(xp, yp, zp); 
+  if ( xebK >= 0 ) {
+    xer = mNT->GetVal(i, xebK);
+    g3->DrawLine3D(xp-xer, yp, zp, xp+xer, yp, zp);
+  }
+  if ( yebK >= 0 ) {
+    yer = mNT->GetVal(i, yebK);
+    g3->DrawLine3D(xp, yp-yer, zp, xp, yp+yer, zp);
+  }
+  if ( zebK >= 0 ) {
+    zer = mNT->GetVal(i, zebK);
+    g3->DrawLine3D(xp, yp, zp-zer, xp, yp, zp+zer);
+  }
+}
+
+return;
+}
+
Index: /trunk/SophyaPI/PI/pintup3d.h
===================================================================
--- /trunk/SophyaPI/PI/pintup3d.h	(revision 113)
+++ /trunk/SophyaPI/PI/pintup3d.h	(revision 113)
@@ -0,0 +1,31 @@
+#ifndef PINTUPLE3D_H
+#define PINTUPLE3D_H
+
+#include "ntuple.h"
+#include "pi3ddrw.h"
+
+class PINTuple3D : public PIDrawer3D {
+public:
+                     PINTuple3D(NTuple* nt, bool ad=false);
+  virtual           ~PINTuple3D();
+  
+  virtual void       Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax);
+  virtual void       UpdateSize();
+  
+          void       SelectXYZ(char* px, char* py, char* pz);
+          void       SelectErrBar(char* erbx=NULL, char* erby=NULL, char* erbz=NULL);
+
+       
+protected:
+  NTuple* mNT;
+  bool mAdDO;
+  int xK, yK, zK;           // Index du nom de variable en X/Y/Z ds le ntuple
+  int xebK, yebK, zebK;     // Index du nom de variable en ErrBarX/Y/Z ds le ntuple
+
+};
+
+#endif
+
+
+
+
Index: /trunk/SophyaPI/PI/piscdrawwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 112)
+++ /trunk/SophyaPI/PI/piscdrawwdg.cc	(revision 113)
@@ -52,4 +52,9 @@
 PIScDrawWdg::AddScDrawer(PIDrawer* d, bool ad)
 {
+  if (d == NULL)  return(-1);
+  if (! LimitsFixed() ) {  //  On met a jour les limites 
+    d->UpdateSize();
+    SetLimits(d->XMin(), d->XMax(), d->YMin(), d->YMax());
+  }
   return(AddDrawer(d, true, ad));
 }
@@ -77,4 +82,6 @@
 }
 
+
+/*
 void
 PIScDrawWdg::Draw(PIGraphic* g)
@@ -104,5 +111,5 @@
     }
 }
-
+*/
 
 // Gestion affichage coordonnees du point 
Index: /trunk/SophyaPI/PI/piscdrawwdg.h
===================================================================
--- /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 112)
+++ /trunk/SophyaPI/PI/piscdrawwdg.h	(revision 113)
@@ -18,11 +18,11 @@
 
                      PIScDrawWdg(PIContainerGen *par, char *nom,
-                                   int sx=10, int sy=10, int px=0, int py=0);
+                                   int sx=100, int sy=100, int px=0, int py=0);
   virtual            ~PIScDrawWdg();
 
   virtual long       kind() {return ClassId; }
   
-  virtual void       Draw(PIGraphic* g);
-  virtual void       Draw(PIGraphic* g, int x0, int y0, int dx, int dy);
+//  virtual void       Draw(PIGraphic* g);
+//  virtual void       Draw(PIGraphic* g, int x0, int y0, int dx, int dy);
   
   void               SetLimits(float xmin, float xmax, float ymin, float ymax, 
Index: /trunk/SophyaPI/PI/pisurfdr.cc
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.cc	(revision 113)
+++ /trunk/SophyaPI/PI/pisurfdr.cc	(revision 113)
@@ -0,0 +1,224 @@
+#include <math.h>
+#include "pisurfdr.h"
+
+/* --Methode-- */
+PISurfaceDrawer::PISurfaceDrawer(P2DArrayAdapter* arr, bool asxy, bool asz, bool ad)
+{
+  mArr = arr;  mAda = ad;
+  mScx = mScy = mScz = 1.;
+  mZmin = 0.; mZmax = 1.;
+  mLut = NULL;
+  if (arr == NULL)  return;
+  arr->XYfromxy(0,0,mXmin, mYmin);
+  arr->XYfromxy(arr->XSize(),arr->YSize(),mXmax, mYmax);
+  if (asxy)  mScy = (mXmax-mXmin)/(mYmax-mYmin);
+  float scm =  ((mXmax-mXmin) > (mYmax-mYmin)) ? (mXmax-mXmin)  : (mYmax-mYmin);
+  int i,j;   float cv;
+  mZmin = mZmax = arr->Value(0,0);
+  for(i=0; i<arr->XSize(); i++) 
+    for(j=0; j<arr->YSize(); j++) {
+      cv  = arr->Value(i,j);
+      if (cv < mZmin) mZmin = cv;
+      if (cv > mZmax) mZmax = cv;
+    }
+  if ((mZmax-mZmin) <= 1.e-19)  mZmax = mZmin + 1.e-19;
+  if (asz) mScz = scm/(mZmax-mZmin);
+//  printf("PISurfaceDrawer::PISurfaceDrawer Min/Max: %g,%g  %g,%g  %g,%g  Sc: %g %g %g \n",
+//          mXmin, mXmax, mYmin, mYmax, mZmin, mZmax, mScx, mScy, mScz);
+  float zmin = mZmin; 
+  float zmax = mZmax;
+  float dzz = (mZmax-mZmin)*0.05;
+  mLut = new LUT(zmin-dzz*2, zmax-dzz, 256);
+}
+
+/* --Methode-- */
+PISurfaceDrawer::~PISurfaceDrawer()
+{
+  if (mAda) delete mArr;
+  if (mLut) delete mLut;
+}
+
+/* --Methode-- */
+void PISurfaceDrawer::UpdateSize()
+{
+  if (mArr == NULL)  return;
+  float xmin, xmax, ymin, ymax, zmin, zmax;
+  xmin = mXmin*mScx;  xmax = mXmax*mScx;
+  ymin = mYmin*mScy;  ymax = mYmax*mScy;
+  zmin = mZmin*mScz;  zmax = mZmax*mScz;
+// Centre du champ en C = (xmin+xmax)/2., (ymin+ymax)/2  (zmin+zmax)*0.5
+// Distance D = Max(xmax-xmin,ymin-ymax)*2
+// Observateur en O = X+D, Yc+2*D 
+  float D = xmax-xmin;
+  if (D < (ymax-ymin))  D = ymax-ymin;
+  D *= 1.4;
+  
+  Set3DView((xmin+xmax)/2., (ymin+ymax)/2, (zmin+zmax)/2., 
+            (xmin+xmax)/2.+D , (ymin+ymax)/2.+2.*D , zmin+(zmax-zmin)*0.1, 0.3, 0.3);  
+//  printf("PISurfaceDrawer::UpdateSize() : %g-%g  %g-%g  %g-%g (%g) \n", xmin,xmax,ymin,ymax,zmin,zmax,D);
+//  printf("PISurfaceDrawer::UpdateSize() :  %g %g %g <<- %g %g %g \n", 
+//         (xmin+xmax)/2., (ymin+ymax)/2, (zmin+zmax)*0.5, 
+//         (xmin+xmax)/2.+D , (ymin+ymax)/2.+2.*D , zmin+(zmax-zmin)*0.1 );
+
+}
+
+
+typedef struct   /*  structures pour trier en ZP les facettes */
+  { double dp;  float zh;  int ij;  } ZPSORT;
+/* Nouvelle-Fonction */
+static int ijzpsort(const void * sp1, const void * sp2)
+/*  Fonctions de tri des etoiles en flux ds un starlist */
+{
+  ZPSORT* p1 = (ZPSORT*)sp1;   
+  ZPSORT* p2 = (ZPSORT*)sp2;  
+  if (p1->dp > p2->dp)  return(-1);
+  else if (p1->dp < p2->dp)  return(1);
+  return(0);
+}
+
+/* --Methode-- */
+void PISurfaceDrawer::Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax)
+{
+  if (mArr == NULL)  return;
+  PIGraphic3D* g3 = dynamic_cast<PIGraphic3D*>(g);
+//  g3->SelForeground(PI_White);
+  g3->SelBackground(PI_White);
+  g3->Erase(xmin, ymin, xmax-xmin, ymax-ymin);
+
+  int xsz = mArr->XSize();
+  int ysz = mArr->YSize();
+
+  ZPSORT* ijzp = new ZPSORT[xsz*ysz];
+  float* xw = new float[(xsz+1)*(ysz+1)];
+  float* yw = new float[(xsz+1)*(ysz+1)];
+  float* zw = new float[(xsz+1)*(ysz+1)];
+
+  float dx,dy;   // taille du bin 
+  dx = (mXmax-mXmin)*mScx/xsz; 
+  dy = (mYmax-mYmin)*mScy/ysz;
+ 
+  int i1,j1;
+  int i,j,k,l;
+  float x,y,z,xp,yp,zp;
+
+  k = 0;
+  for(i=0; i<xsz; i++) 
+    for(j=0; j<ysz; j++) { 
+      ijzp[k].ij = j*xsz+i; 
+      mArr->XYfromxy(i,j,x,y);
+      x *= mScx; x += dx/2.;
+      y *= mScy; y += dy/2.;
+      ijzp[k].zh = mArr->Value(i,j);
+      z = ijzp[k].zh * mScz;
+      g3->C3DC2ObsCS(x,y,z,xp,yp,zp);
+      ijzp[k].dp = zp; 
+      k++;
+
+// Calcul de la projection du coin de la facette
+      x -= dx/2.;   y -= dy/2.;
+      i1 = (i>0) ? i-1 : 0;
+      j1 = (j>0) ? j-1 : 0;
+      z = mArr->Value(i,j) + mArr->Value(i1,j) + mArr->Value(i1,j1) +  mArr->Value(i,j1);
+      z = z/4.*mScz;        
+//      g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);
+      xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;    zw[j*(xsz+1)+i] = z;    
+    }
+
+  j = ysz;
+  for(i=0; i<xsz; i++) {
+     mArr->XYfromxy(i,j-1,x,y);
+     x *= mScx; 
+     y *= mScy; y += dy;
+     i1 = (i>0) ? i-1 : 0;
+     j1 = j-1;
+     z = mArr->Value(i,j-1) + mArr->Value(i1,j-1) + mArr->Value(i1,j1) +  mArr->Value(i,j1);
+     z = z/4.*mScz;
+//     g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
+     xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;   zw[j*(xsz+1)+i] = z;   
+  }
+  i = xsz;
+  for(j=0; j<ysz; j++) {
+     mArr->XYfromxy(i-1,j,x,y);
+     x *= mScx; x += dx;
+     y *= mScy; 
+     i1 = i-1;
+     j1 = (j>0) ? j-1 : 0;
+     z = mArr->Value(i-1,j) + mArr->Value(i1,j) + mArr->Value(i1,j1) +  mArr->Value(i-1,j1);
+     z = z/4.*mScz;
+//     g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
+     xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;   zw[j*(xsz+1)+i] = z;   
+  }
+  i = xsz;  j = ysz;
+  mArr->XYfromxy(i-1,j-1,x,y);
+  i1 = i-1;   j1 = j-1;
+  x *= mScx; x += dx;
+  y *= mScy; y += dy;
+  z = mArr->Value(i-1,j-1) + mArr->Value(i1,j-1) + mArr->Value(i1,j1) +  mArr->Value(i-1,j1);
+  z = z/4.*mScz;
+//  g3->Proj3DC2GrC(x,y,z, xw[j*(xsz+1)+i], yw[j*(xsz+1)+i]);     
+  xw[j*(xsz+1)+i] = x;      yw[j*(xsz+1)+i] = y;    zw[j*(xsz+1)+i] = z;   
+
+// On trie par ordre de distance zp de projection / observateur, du plus loin au plus proche
+  qsort(ijzp,(size_t) k,sizeof(ZPSORT),ijzpsort);
+
+  PIGrCoord xg[5],yg[5],zg[5];
+  PIColors fgc; 
+
+  if (mLAtt == PI_NotDefLineAtt)    g3->SelLine(PI_ThinLine);
+
+  if (mCmapid == CMAP_OTHER) {   // Trace avec des lignes
+    fgc = ( mFCol == PI_NotDefColor ) ? PI_Black : mFCol;
+    for(l=0;l<k;l++) {
+      i =  ijzp[l].ij%xsz;
+      j =  ijzp[l].ij/xsz;
+      xg[4] = xg[0] = xw[i+j*(xsz+1)];    yg[4] = yg[0] = yw[i+j*(xsz+1)];  
+      zg[4] = zg[0] =   zw[i+j*(xsz+1)];
+      xg[1] = xw[i+1+j*(xsz+1)];          yg[1] = yw[i+1+j*(xsz+1)];   
+      zg[1] = zw[i+1+j*(xsz+1)];   
+      xg[2] = xw[i+1+(j+1)*(xsz+1)];      yg[2] = yw[i+1+(j+1)*(xsz+1)];
+      zg[2] = zw[i+1+(j+1)*(xsz+1)];
+      xg[3] = xw[i+(j+1)*(xsz+1)];        yg[3] = yw[i+(j+1)*(xsz+1)];  
+      zg[3] = zw[i+(j+1)*(xsz+1)]; 
+// On efface derriere 
+      g3->SelForeground(PI_White);
+//      g3->BaseGraphic()->DrawFPolygon(xg,yg,5);
+      g3->DrawFPolygon3D(xg,yg,zg,5);
+// On trace 
+      g3->SelForeground(fgc);
+//      g3->BaseGraphic()->DrawPolygon(xg,yg,5);
+      g3->DrawPolygon3D(xg,yg,zg,5);
+    }
+  }
+  else {   // Trace avec niveaux de couleur
+    PIColorMap* cmap = new PIColorMap(mCmapid);
+    PIColors fgc; 
+    if ( (mCmapid == CMAP_GREY32) || (mCmapid == CMAP_GREYINV32) || 
+         (mCmapid == CMAP_GREY128)  || (mCmapid == CMAP_GREYINV128) )
+      fgc = ( mFCol == PI_NotDefColor ) ? PI_Red : mFCol;
+    else  fgc = ( mFCol == PI_NotDefColor ) ? PI_Black : mFCol;
+    for(l=0;l<k;l++) {
+      i =  ijzp[l].ij%xsz;
+      j =  ijzp[l].ij/xsz;
+      xg[4] = xg[0] = xw[i+j*(xsz+1)];    yg[4] = yg[0] = yw[i+j*(xsz+1)];  
+      zg[4] = zg[0] =   zw[i+j*(xsz+1)];
+      xg[1] = xw[i+1+j*(xsz+1)];          yg[1] = yw[i+1+j*(xsz+1)];   
+      zg[1] = zw[i+1+j*(xsz+1)];   
+      xg[2] = xw[i+1+(j+1)*(xsz+1)];      yg[2] = yw[i+1+(j+1)*(xsz+1)];
+      zg[2] = zw[i+1+(j+1)*(xsz+1)];
+      xg[3] = xw[i+(j+1)*(xsz+1)];        yg[3] = yw[i+(j+1)*(xsz+1)];  
+      zg[3] = zw[i+(j+1)*(xsz+1)]; 
+// On efface derriere 
+      g3->SelForeground(*cmap, mLut->ApplyFast(ijzp[l].zh));
+      g3->DrawFPolygon3D(xg,yg,zg,5);
+// On trace 
+      g3->SelForeground(fgc);
+      g3->DrawPolygon3D(xg,yg,zg,5);
+    }
+      
+  }
+
+  delete[] ijzp;
+  delete[] xw; 
+  delete[] yw;
+  delete[] zw;
+}
Index: /trunk/SophyaPI/PI/pisurfdr.h
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.h	(revision 113)
+++ /trunk/SophyaPI/PI/pisurfdr.h	(revision 113)
@@ -0,0 +1,30 @@
+// Module PI : Peida Interactive PISurfaceDrawer
+// Drawer et DrawWidget 3D       R. Ansari 06/98
+// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
+
+#ifndef PISURFDRW_H_SEEN
+#define PISURFDRW_H_SEEN
+
+#include "parradapter.h"
+#include "pi3ddrw.h"
+
+// Trace d une surface defini par Z=f(x,y)  travers un tableau 
+class PISurfaceDrawer : public PIDrawer3D {
+public :
+  			PISurfaceDrawer(P2DArrayAdapter* arr, bool asxy=false, bool asz=true, bool ad = true);
+  			~PISurfaceDrawer();
+
+  virtual void 		UpdateSize();   // Calcule et change la vue-3D
+
+  virtual void 		Draw(PIGraphicUC* g, float xmin, float ymin, float xmax, float ymax); 
+protected :
+  P2DArrayAdapter* mArr;
+  bool mAda;
+  float mScz, mScx, mScy;
+  float mXmin, mXmax;
+  float mYmin, mYmax;
+  float mZmin, mZmax;
+  LUT* mLut;
+};
+
+#endif
Index: /trunk/SophyaPI/PI/pisysdep.h
===================================================================
--- /trunk/SophyaPI/PI/pisysdep.h	(revision 112)
+++ /trunk/SophyaPI/PI/pisysdep.h	(revision 113)
@@ -44,5 +44,5 @@
   #define PIPIXMAP_H "pipixmapx.h"
 
-  #define PIPERIODIC_H "piperiodicx.h"
+  #define PIPERIODIC_H "piperiodx.h"
 
 #endif
