Index: /trunk/SophyaPI/PI/pi3ddrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/pi3ddrw.cc	(revision 2164)
@@ -46,4 +46,7 @@
 //                double& teta, double& phi, double& psi, double& dax, double& day, double& co, double& dco)
 //	Renvoie la définition de la Vue-3D. Retourne "true " si définie par "Set3DView_Obs()"
+// void Set3DBox(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax)
+//	Définition de la boite 3D.
+//
 // void Draw3DBoxe(PIGraphic3D* g3, double xx1, double xx2, double yy1, double yy2,  -
 //                 double zz1, double zz2, double xl1, double xl2, -
@@ -62,6 +65,5 @@
   lCO = 10.;  dlCO = 3.;  
   v3D_obs = false;
-  x3Min = y3Min = z3Min = -1.;  
-  x3Max = y3Max = z3Max = 1.;
+  Set3DBox(-1., 1., -1., 1., -1., 1.);
 }
 
@@ -103,4 +105,12 @@
   co = lCO;     dco = dlCO;
   return(v3D_obs);
+}
+/* --Methode-- */
+void PIDrawer3D::Set3DBox(double xmin, double xmax, double ymin, double ymax,
+			  double zmin, double zmax)
+{
+  x3Min = xmin;  x3Max = xmax;
+  y3Min = ymin;  y3Max = ymax;
+  z3Min = zmin;  z3Max = zmax;
 }
 
@@ -221,2 +231,123 @@
 }
 
+/*  --------------------------------------------------------------  */
+/*  ------------------- Classe PIElDrawer3D ------------------------  */
+/*  --------------------------------------------------------------  */
+
+//++
+// Class	PIElDrawer3D
+// Lib		PI
+// include	p3ddrw.h
+//
+//	Classe de traceur ("Drawer") capable de gérer et de 
+//	tracer une liste d'éléments simples. Cette classe
+//	est utilisé pour le tracé des axes et des éléments de
+//	texte ds les "PIScDrawWdg", "PIDraw3DWdg" et "PIImage".
+//--
+//++
+// Links	Parents
+// PIDrawer3D
+//--
+//++
+// Links	Voir aussi
+// PIElDrawer
+// PIElDrwMgr
+//--
+
+//++
+// Titre	Constructeurs et méthodes
+//--
+
+//++
+// PIElDrawer3D()
+//	Constructeur
+//--
+
+/* --Methode-- */
+PIElDrawer3D::PIElDrawer3D()
+{
+  ShowTitles();
+}
+
+/* --Methode-- */
+PIElDrawer3D::~PIElDrawer3D()
+{
+}
+
+
+//++
+//  void  SetTitles(string tt, string tb)
+//  void  SetTitles(string tt, string tb, PIGraphicAtt const& att)
+//	Ajout de titres haut ("tt") et bas ("tb")
+//--
+
+
+/* --Methode-- */
+int PIElDrawer3D::DecodeOptionString(vector<string> & opt, bool rmdecopt)
+{
+  int nopt0 = opt.size();
+  if (nopt0 < 1)  return(0);  
+  int ndec1 = PIDrawer::DecodeOptionString(opt, rmdecopt);
+  if ((nopt0 - ndec1) < 1) return(ndec1);  // si tout a ete decode
+  vector<string> udopt;
+  unsigned int k = 0;
+  int ndec = opt.size();
+  for( k=0; k<opt.size(); k++ ) {
+    string opts = opt[k];
+    if (opts == "title") ShowTitles(true);
+    else if (opts == "notitle") ShowTitles(false);
+
+    else {
+      ndec--;
+      if (rmdecopt)  udopt.push_back(opts);
+    }
+  }  
+
+  if (rmdecopt)  opt = udopt;
+  return(ndec+ndec1);
+}
+
+
+/* --Methode-- */
+void  PIElDrawer3D::Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
+{
+SelGraAtt(g);   // DrawAxes change certains attributs graphiques
+DrawAxes(g);   // Trace des axes 
+g->SelFont(PI_NormalSizeFont);
+SelGraAtt(g);   // DrawAxes change certains attributs graphiques
+
+// Trace des titres 
+if ( showTitles && ((titleT.length() > 0) || (titleB.length() > 0)) ) {
+  PIGraphicAtt grs = GetGraphicAtt();
+  UpdateGraphicAtt(titleAtt);
+  SelGraAtt(g); 
+
+  aXdir = false;  // Vrai si Axe X de Droite vers Gauche 
+  aYdir = false;  // Vrai si Axe Y de Haut vers Bas
+  double fx, fy, fh;
+//  fh = g->GetFontHeightUC(gas, gds);
+  fh = 0.075*(YMax()-YMin());
+  if ( titleT.length() > 0) {
+      if (g->isAxeYDirUpDown()) fy = g->DeltaUCY(YMin(), -fh);
+      else fy = g->DeltaUCY(YMax(), fh);
+      g->DrawString((XMax()+XMin())*0.5, fy, titleT.c_str(), PI_HorizontalCenter | PI_VerticalBottom);
+//      printf(" PIElDrawer3D::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
+    }
+  if ( titleB.length() > 0) {
+      fx = g->CalcStringWidth(titleB.c_str());
+      if(aXdir) fx = g->DeltaUCX(XMax(), -(XMax()-XMin()-fx)/2.);
+      else fx = g->DeltaUCX(XMin(), (XMax()-XMin()-fx)/2.);
+      if (g->isAxeYDirUpDown()) fy =  g->DeltaUCY(YMax(), fh*1.5);
+      else fy = g->DeltaUCY(YMin(), -fh*1.5);
+      g->DrawString((XMax()+XMin())*0.5, fy, titleB.c_str(), PI_HorizontalCenter | PI_VerticalBottom);
+//      printf(" PIElDrawer3D::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
+    }
+  SetGraphicAtt(grs);
+  }
+
+ SelGraAtt(g);
+// Trace des elements
+ ElDrwMgr().DrawElements(g, xmin, ymin, xmax, ymax);
+
+}
+
Index: /trunk/SophyaPI/PI/pi3ddrw.h
===================================================================
--- /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2163)
+++ /trunk/SophyaPI/PI/pi3ddrw.h	(revision 2164)
@@ -28,4 +28,7 @@
   bool           	Get3DView(double& xc, double& yc, double& zc, double& xo, double& yo, double& zo,
                                   double& teta, double& phi, double& psi, double& dax, double& day, double& co, double& dco);
+
+  virtual void		Set3DBox(double xmin, double xmax, double ymin, double ymax,
+				 double zmin, double zmax); 
   
   virtual PIGraphicUC*	SetDrwWdg(PIBaseWdgGen* drw, int x0, int y0, int dx, int dy, PIGraphicGen* g);
@@ -56,4 +59,38 @@
 
 
+// -----------------  Traceur d'elements 3D  -------------------
+class PIElDrawer3D : public PIDrawer3D
+{
+public:
+                     PIElDrawer3D();
+  virtual           ~PIElDrawer3D();
+
+//   Methode de decodage des options
+  virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+
+  virtual void       Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
+
+  inline PIElDrwMgr& ElDrwMgr()    { return eltsMgr; }
+
+  inline void        SetTitles(string tt, string tb)   { titleT = tt;  titleB = tb; }
+  inline void        SetTitles(string tt, string tb, PIGraphicAtt const& att) 
+                        { titleT = tt;  titleB = tb; titleAtt = att; }
+  inline void        ShowTitles(bool fg=true) { showTitles = fg; }
+
+// -- Pour compatibilite avec l'interface precedente , Reza 08/2002 
+  inline void        ElDel(int id) { eltsMgr.ElDel(id); }
+  inline void        ElDelAll()    { eltsMgr.ElDelAll(); }
+  
+  inline int	     ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
+                                   { return eltsMgr.ElAddText(x, y, s); }
+
+protected:
+  PIElDrwMgr eltsMgr;
+  string titleT, titleB;       // Titre Haut - Bas
+  PIGraphicAtt titleAtt;       // Attributs graphiques de trace de titre
+  bool showTitles;             // Affichage des titres si true
+
+};
+
 
 #endif
Index: /trunk/SophyaPI/PI/pi3dwdg.cc
===================================================================
--- /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/pi3dwdg.cc	(revision 2164)
@@ -71,5 +71,5 @@
 //  SetDefaultDrawRectangle(0.12, 0.12, 0.88, 0.88, true);
   SetDefaultDrawRectangle(0., 0., 1., 1., true);
-  mBDrw = new PIElDrawer;
+  mBDrw = new PIElDrawer3D;
   mBDrw->SetLimits(0.12,0.88, 0.12,0.88, kAxeDirLtoR,kAxeDirDownUp);
   AddDrawer(mBDrw, 0.12, 0.12, 0.88, 0.88, true, false, false);
Index: /trunk/SophyaPI/PI/pi3dwdg.h
===================================================================
--- /trunk/SophyaPI/PI/pi3dwdg.h	(revision 2163)
+++ /trunk/SophyaPI/PI/pi3dwdg.h	(revision 2164)
@@ -40,5 +40,5 @@
   inline void	     	SetTitles(string const & tt, string const & tb)
                                   { mBDrw->SetTitles(tt, tb); }
-  inline PIElDrawer*    BaseDrawer() { return mBDrw; };
+  inline PIElDrawer3D*  BaseDrawer() { return mBDrw; };
 
 //   Methode permettant de decoder des options a partir de chaines
@@ -70,5 +70,5 @@
   virtual void		DrawXYZAxes();
 
-  PIElDrawer* mBDrw;   // Objet traceur d'elements de fond
+  PIElDrawer3D* mBDrw;   // Objet traceur d'elements de fond
   int mPx, mPy;        // Position pointeur - Bouton-1 
   
Index: /trunk/SophyaPI/PI/piaxes.cc
===================================================================
--- /trunk/SophyaPI/PI/piaxes.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/piaxes.cc	(revision 2164)
@@ -39,4 +39,5 @@
 PIAxes::PIAxes()
 {
+  setupDone = false;
 }
 
@@ -57,7 +58,13 @@
 //|	kGridOn, kAxesNone
 //	Si "afsz == true", la taille de fonte est choisie automatiquement.
+//
 // void DrawXYAxes(PIGraphicUC* g, PIGraphicAtt& gratt, unsigned int flags, bool afsz, \
 //      double xmin, double xmax, double ymin, double ymax)
 //	Tracé d'axes avec spécification des limites d'axes.
+//
+// void DrawXCaption(PIGraphicUC* g, string const& xLabel, PIGraphicAtt const& att)
+//	Tracé du label d'axe X.
+// void DrawYCaption(PIGraphicUC* g, string const& YLabel, PIGraphicAtt const& att)
+//	Tracé du label d'axe Y.
 //--
 
@@ -195,4 +202,65 @@
 
 /* --Methode-- */
+void PIAxes::DrawXCaption(PIGraphicUC* g, PIGraphicAtt& att, unsigned int flags, string const& xLabel)
+{
+  if (xLabel.length() < 1) return;
+  if (!setupDone) {
+    PIGrCoord xmin, xmax, ymin, ymax;
+    g->GetGrSpace(xmin, xmax, ymin, ymax);
+    Setup(g, xmin, xmax, ymin, ymax);
+  }
+  if ( (att.GetFontName() != PI_DefaultFont) ||
+       (att.GetFontAtt() != PI_NotDefFontAtt) )
+    g->SelFont(att.GetFont());
+  PIColors fcol = att.GetFgColor(); 
+  if (fcol != PI_NotDefColor)    g->SelForeground(fcol);
+
+  double fy, fh;
+  fh = 0.090*(yMax-yMin);  
+  if (flags&kBoxAxes) { 
+    if (g->isAxeYDirUpDown()) fy = yMax;
+    else fy = yMin;
+  }
+
+  else fy = 0.5*(yMin+yMax);
+  if (g->isAxeYDirUpDown()) fy += fh;
+  else fy -= fh;
+  g->DrawString(xMax-(xMax-xMin)*0.30, fy, xLabel.c_str(), 
+		PI_HorizontalCenter | PI_VerticalCenter);  
+}
+
+/* --Methode-- */
+void PIAxes::DrawYCaption(PIGraphicUC* g, PIGraphicAtt& att, unsigned int flags, string const& yLabel)
+{
+  if (yLabel.length() < 1) return;
+  if (!setupDone) {
+    PIGrCoord xmin, xmax, ymin, ymax;
+    g->GetGrSpace(xmin, xmax, ymin, ymax);
+    Setup(g, xmin, xmax, ymin, ymax);
+  }
+  if ( (att.GetFontName() != PI_DefaultFont) ||
+       (att.GetFontAtt() != PI_NotDefFontAtt) )
+    g->SelFont(att.GetFont());
+  PIColors fcol = att.GetFgColor(); 
+  if (fcol != PI_NotDefColor)    g->SelForeground(fcol);
+
+  double fx, fh;
+  fh = 0.125*(xMax-xMin);
+  if (yLabel.length() > 0) {
+    if (flags&kBoxAxes) { 
+      if (g->isAxeXDirRtoL()) fx = xMax;
+      else fx = xMin;
+    }
+    else fx = 0.5*(xMin+xMax);
+    if (g->isAxeXDirRtoL()) fx += fh;
+    else fx -= fh;
+    unsigned long txtflg = PI_HorizontalCenter | PI_VerticalCenter | PI_TextDirectionVerticalUp;
+    if (g->isAxeYDirUpDown()) 
+      txtflg = PI_HorizontalCenter | PI_VerticalCenter | PI_TextDirectionVerticalDown;
+    g->DrawString(fx, yMax-(yMax-yMin)*0.30, yLabel.c_str(), txtflg);
+  }
+}
+
+/* --Methode-- */
 void PIAxes::Setup(PIGraphicUC* g, double xmin, double xmax, 
 		       double ymin, double ymax)
@@ -219,4 +287,6 @@
   xMajTickLen = (yMax-yMin)/100;
   xMinTickLen = (yMax-yMin)/250;
+
+  setupDone = true;
 }
 
Index: /trunk/SophyaPI/PI/piaxes.h
===================================================================
--- /trunk/SophyaPI/PI/piaxes.h	(revision 2163)
+++ /trunk/SophyaPI/PI/piaxes.h	(revision 2164)
@@ -40,4 +40,10 @@
 			       double ymin, double ymax);
 
+
+  virtual void      DrawXCaption(PIGraphicUC* g, PIGraphicAtt& att, unsigned int flags,
+				 string const& xLabel); 
+  virtual void      DrawYCaption(PIGraphicUC* g, PIGraphicAtt& att, unsigned int flags,
+				 string const& YLabel); 
+
   //  virtual void      DrawHorizontalAxe(double xmin, double xmax, double y, 
 
@@ -66,4 +72,7 @@
   void DrawGrid(PIGraphicUC* g);
 
+
+  bool   setupDone;  // Si Setup a ete appele
+
   double xMin, xMax, yMin, yMax; 
   bool   aXdir, aYdir;           // Sens des axes horiz, vertical 
@@ -77,4 +86,5 @@
   double xMajTickLen,  xMinTickLen;
   double yMajTickLen,  yMinTickLen;
+
 };
 
Index: /trunk/SophyaPI/PI/pidrawer.cc
===================================================================
--- /trunk/SophyaPI/PI/pidrawer.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/pidrawer.cc	(revision 2164)
@@ -252,4 +252,7 @@
   if (GetGraphicAtt().GetMarker() != PI_NotDefMarker) 
     g->SelMarker(GetGraphicAtt().GetMarkerSize(), GetGraphicAtt().GetMarker());
+  if (GetGraphicAtt().GetArrowMarker() !=  PI_NotDefArrowMarker) 
+    g->SelArrowMarker(GetGraphicAtt().GetArrowMarkerSize(), 
+		      GetGraphicAtt().GetArrowMarker());
 }
 
Index: /trunk/SophyaPI/PI/pieldrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/pieldrw.cc	(revision 2164)
@@ -10,4 +10,224 @@
 
 #include <math.h>
+
+/*  --------------------------------------------------------------  */
+/*  ------------------- Classe PIElDrwMgr ------------------------  */
+/*  --------------------------------------------------------------  */
+
+//++
+// Class	PIElDrwMgr
+// Lib		PI
+// include	pieldrw.h
+//
+//	Classe gestionnaire de tracé d'éléments. Utilisé par "PIElDrawer".
+//--
+//++
+// Links	Voir aussi
+// PIElDrawer
+//--
+//++
+// Titre	Constructeurs et méthodes
+//--
+
+/* --Methode-- */
+//++
+PIElDrwMgr::PIElDrwMgr()
+//	Constructeur
+//--
+{
+  mEn = 0;
+}
+
+/* --Methode-- */
+//++
+PIElDrwMgr::~PIElDrwMgr()
+//	destructeur
+//--
+{
+  ElDelAll();
+}
+/* --Methode-- */
+//++
+void PIElDrwMgr::DrawElements(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
+//	Tracé des éléments
+//--
+{
+  DrwElList::iterator it;
+  g->SaveGraphicAtt();
+  for (it = mElist.begin(); it != mElist.end(); it++)
+    {
+      PIColors fcol = (*it).gatt.GetFgColor(); 
+      if (fcol != PI_NotDefColor)    g->SelForeground(fcol);
+      PIColors bcol = (*it).gatt.GetBgColor(); 
+      if (bcol != PI_NotDefColor)    g->SelBackground(bcol);
+      if ((*it).gatt.GetLineAtt() != PI_NotDefLineAtt)  
+	g->SelLine((*it).gatt.GetLineAtt());
+      if ( ((*it).gatt.GetFontName() != PI_DefaultFont) ||
+	   ((*it).gatt.GetFontAtt() != PI_NotDefFontAtt) )
+	g->SelFont((*it).gatt.GetFont());
+      if ((*it).gatt.GetMarker() != PI_NotDefMarker) 
+	g->SelMarker((*it).gatt.GetMarkerSize(), (*it).gatt.GetMarker());
+      if ((*it).gatt.GetArrowMarker() !=  PI_NotDefArrowMarker) 
+	g->SelArrowMarker((*it).gatt.GetArrowMarkerSize(), 
+			  (*it).gatt.GetArrowMarker());
+
+      switch ( (*it).etyp )
+	{
+	case PIDEL_Line :
+	  g->DrawLine((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  break;
+	case PIDEL_Mark :
+	  g->DrawMarker((*it).ex, (*it).ey); 
+	  break;
+	case PIDEL_Arrow :
+	  g->DrawArrowMarker((*it).ex, (*it).ey, (*it).edx, (*it).edy, true); 
+	  break;
+	case PIDEL_Text :
+	  g->DrawString((*it).ex, (*it).ey, (char*) ((*it).es.c_str()) ); 
+	  break;
+	case PIDEL_Rect :
+	  g->DrawBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  break;
+	case PIDEL_FRect :
+	  g->DrawFBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
+	  break;
+	case PIDEL_Circ :
+	  g->DrawCircle((*it).ex, (*it).ey, (*it).edx ); 
+	  break;
+	case PIDEL_FCirc :
+	  g->DrawFCircle((*it).ex, (*it).ey, (*it).edx ); 
+	  break;
+	case PIDEL_Poly :
+	  g->DrawPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
+	  break;
+	case PIDEL_FPoly :
+	  g->DrawFPolygon((*it).xpol, (*it).ypol, (*it).npol, false ); 
+	  break;
+	default :
+	  break;
+	}
+      g->RestoreGraphicAtt();
+    }
+}
+
+//++
+// int  ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
+// int  ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIGraphicAtt gatt)
+// int  ElAddText(PIGrCoord x, PIGrCoord y, string const & s)
+// int  ElAddText(PIGrCoord x, PIGrCoord y, string const &  s, PIGraphicAtt gatt)
+//	Ajout d'un élément texte (possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+// 
+// int  ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
+// int  ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, PIGraphicAtt gatt)
+//	Ajout d'un élément de ligne (possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+//	
+// int  ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
+// int  ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, PIGraphicAtt gatt)
+//	Ajout d'un élément de type rectangle (possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
+// int  ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy,  PIGraphicAtt gatt)
+//	Ajout d'un élément de type rectangle plein 
+//	(possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
+// int  ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt gatt)
+//	Ajout d'un élément de type cercle (possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
+// int  ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt gatt)
+//	Ajout d'un élément de type cercle plein avec un attribut de couleur.
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
+// int  ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt gatt)
+//	Ajout d'un élément de type polygone (possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+//
+// int  ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
+// int  ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt gatt)
+//	Ajout d'un élément de type polygone plein 
+//	(possibilité de spécification d'un attribut graphique).
+//	Renvoie le numéro identificateur de l'élément.
+// 
+// void  ElDel(int id)
+//	Suppression de l'élément avec l'identificateur "id".
+// void  ElDelAll()
+//	Suppression de tous les éléments de l'objet.
+//--
+
+/* --Methode-- */
+int PIElDrwMgr::ElAdd(int typ, PIGrCoord x, PIGrCoord  y, PIGrCoord dx, PIGrCoord dy, 
+		      const char* s, PIGraphicAtt const& att)
+{
+  DrwEl dre;
+  mEn++;
+  dre.eid = mEn;  dre.etyp = typ;
+  dre.ex = x;   dre.ey = y;
+  dre.edx = dx;  dre.edy = dy;
+  dre.gatt = att;
+  if (s)  dre.es = s;
+  dre.xpol = dre.ypol = NULL;
+  dre.npol = 0;
+  mElist.push_back(dre);
+  return(mEn);
+}
+
+/* --Methode-- */
+int PIElDrwMgr::ElAdd(int typ, vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const& att)
+{
+  DrwEl dre;
+  mEn++;
+  dre.eid = mEn;  dre.etyp = typ;
+  dre.ex = dre.ey = 0;
+  dre.edx = dre.edy = 0;
+  dre.gatt = att;
+  dre.xpol = dre.ypol = NULL;
+  dre.npol = (y.size() < x.size()) ? y.size() : x.size();
+  if (dre.npol > 0) {
+    dre.xpol = new PIGrCoord[dre.npol];
+    dre.ypol = new PIGrCoord[dre.npol];
+    for(int kk=0; kk<dre.npol; kk++) {
+      dre.xpol[kk] = x[kk];
+      dre.ypol[kk] = y[kk];
+    }
+  }
+  mElist.push_back(dre);
+  return(mEn);
+}
+
+/* --Methode-- */
+void  PIElDrwMgr::ElDel(int id)
+{
+  DrwElList::iterator it;
+  for (it = mElist.begin(); it != mElist.end(); it++) {
+    if ( (*it).eid == id) { 
+      if ( (*it).xpol ) delete[] (*it).xpol;
+      if ( (*it).ypol ) delete[] (*it).ypol;
+      mElist.erase(it);   
+      break; 
+    }
+  }
+  return;
+}
+
+/* --Methode-- */
+void  PIElDrwMgr::ElDelAll()
+{
+  DrwElList::iterator it;
+  for (it = mElist.begin(); it != mElist.end(); it++) {
+    if ( (*it).xpol ) delete[] (*it).xpol;
+    if ( (*it).ypol ) delete[] (*it).ypol;
+  }
+  mElist.erase(mElist.begin(), mElist.end());
+  return;
+}
+
+
 
 
@@ -30,4 +250,8 @@
 // PIDrawer
 //--
+//++
+// Links	Voir aussi
+// PIElDrwMgr
+//--
 
 //++
@@ -43,7 +267,6 @@
 PIElDrawer::PIElDrawer()
 {
-mEn = 0;
-titleT = titleB = "";
 ShowTitles();
+ ShowAxesLabels();
 }
 
@@ -55,22 +278,8 @@
 
 //++
-//  void  SetTitles(const char* tt=NULL, const char* tb=NULL)
+//  void  SetTitles(string tt, string tb)
 //	Ajout de titres haut ("tt") et bas ("tb")
-//  void  SetTitles(string const & tt, string const & tb)
-//	Ajout de titres haut ("tt") et bas ("tb")
-//--
-
-/* --Methode-- */
-void PIElDrawer::SetTitles(const char* tt, const char* tb)
-{
-if (tt != NULL)  titleT = tt;
-if (tb != NULL)  titleB = tb;
-}
-
-/* --Methode-- */
-void PIElDrawer::SetTitles(string const & tt, string const & tb)
-{
-titleT = tt;  titleB = tb;
-}
+//--
+
 
 /* --Methode-- */
@@ -119,35 +328,21 @@
 }
 
-//++
-// int  ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIColors c=PI_NotDefColor)
-//	Ajout d'un élément texte avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// int  ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, -
-//                 PIColors c=PI_NotDefColor)
-//	Ajout d'un élément de ligne avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// int  ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, -
-//                PIColors c=PI_NotDefColor)
-//	Ajout d'un élément de type rectangle avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// int  ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, -
-//                PIColors c=PI_NotDefColor)
-//	Ajout d'un élément de type rectangle plein avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// int  ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
-//	Ajout d'un élément de type cercle avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// int  ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
-//	Ajout d'un élément de type cercle plein avec un attribut de couleur.
-//	Renvoie le numéro identificateur de l'élément.
-// 
-// void  ElDel(int id)
-//	Suppression de l'élément avec l'identificateur "id".
-// void  ElDelAll()
-//	Suppression de tous les éléments du dessin.
-//--
-
-/* --Methode-- */
-void  PIElDrawer::Draw(PIGraphicUC* g, double /*xmin*/, double /*ymin*/, double /*xmax*/, double /*ymax*/)
+/* --Methode-- */
+void  PIElDrawer::DrawAxes(PIGraphicUC* g)
+{
+  g->NoClip();
+  g->SaveGraphicAtt();
+  PIAxes axes;
+  axes.DrawXYAxes(g, mGrAtt, axesFlags, axesAFSz, XMin(), XMax(), YMin(), YMax()); 
+  g->RestoreGraphicAtt();
+  if (showAxesLabels) { 
+    axes.DrawXCaption(g, labelAtt, axesFlags, xLabel);
+    axes.DrawYCaption(g, labelAtt, axesFlags, yLabel);
+  }
+  g->Clip();
+}
+
+/* --Methode-- */
+void  PIElDrawer::Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax)
 {
 SelGraAtt(g);   // DrawAxes change certains attributs graphiques
@@ -158,4 +353,8 @@
 // Trace des titres 
 if ( showTitles && ((titleT.length() > 0) || (titleB.length() > 0)) ) {
+  PIGraphicAtt grs = GetGraphicAtt();
+  UpdateGraphicAtt(titleAtt);
+  SelGraAtt(g); 
+
   aXdir = false;  // Vrai si Axe X de Droite vers Gauche 
   aYdir = false;  // Vrai si Axe Y de Haut vers Bas
@@ -164,10 +363,7 @@
   fh = 0.075*(YMax()-YMin());
   if ( titleT.length() > 0) {
-      fx = g->CalcStringWidth(titleT.c_str());
-      if(aXdir) fx = g->DeltaUCX(XMax(), -(XMax()-XMin()-fx)/2.);
-      else fx = g->DeltaUCX(XMin(), (XMax()-XMin()-fx)/2.);
       if (g->isAxeYDirUpDown()) fy = g->DeltaUCY(YMin(), -fh);
       else fy = g->DeltaUCY(YMax(), fh);
-      g->DrawString(fx, fy, titleT.c_str());
+      g->DrawString((XMax()+XMin())*0.5, fy, titleT.c_str(), PI_HorizontalCenter | PI_VerticalCenter);
 //      printf(" PIElDrawer::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
     }
@@ -178,69 +374,14 @@
       if (g->isAxeYDirUpDown()) fy =  g->DeltaUCY(YMax(), fh*1.5);
       else fy = g->DeltaUCY(YMin(), -fh*1.5);
-      g->DrawString(fx, fy, titleB.c_str());
+      g->DrawString((XMax()+XMin())*0.5, fy, titleB.c_str(), PI_HorizontalCenter | PI_VerticalCenter);
 //      printf(" PIElDrawer::Draw()/DBG (%g , %g) %s  - %g \n", fx, fy, titleT.c_str(), fh);
     }
-  }
-DrwElList::iterator it;
-PIColors cc = g->GetForeground();
-for (it = mElist.begin(); it != mElist.end(); it++)
-  {
-  if ((*it).col != PI_NotDefColor)  g->SelForeground((*it).col);
-  switch ( (*it).etyp )
-    {
-    case PIDEL_Line :
-      g->DrawLine((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
-      break;
-    case PIDEL_Text :
-      g->DrawString((*it).ex, (*it).ey, (char*) ((*it).es.c_str()) ); 
-      break;
-    case PIDEL_Rect :
-      g->DrawBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
-      break;
-    case PIDEL_FRect :
-      g->DrawFBox((*it).ex, (*it).ey, (*it).edx, (*it).edy ); 
-      break;
-    case PIDEL_Circ :
-      g->DrawCircle((*it).ex, (*it).ey, (*it).edx ); 
-      break;
-    case PIDEL_FCirc :
-      g->DrawFCircle((*it).ex, (*it).ey, (*it).edx ); 
-      break;
-    default :
-      break;
-    }
-  g->SelForeground(cc);
-  }
-}
-
-
-/* --Methode-- */
-int PIElDrawer::ElAdd(int typ, PIGrCoord x, PIGrCoord  y, PIGrCoord dx, PIGrCoord dy, const char* s, PIColors c)
-{
-DrwEl dre;
-mEn++;
-dre.eid = mEn;  dre.etyp = typ;
-dre.ex = x;   dre.ey = y;
-dre.edx = dx;  dre.edy = dy;
-dre.col = c;
-if (s)  dre.es = s;
-mElist.push_back(dre);
-return(mEn);
-}
-
-/* --Methode-- */
-void  PIElDrawer::ElDel(int id)
-{
-DrwElList::iterator it;
-for (it = mElist.begin(); it != mElist.end(); it++)
-  if ( (*it).eid == id) { mElist.erase(it);   break; }
-return;
-}
-
-/* --Methode-- */
-void  PIElDrawer::ElDelAll()
-{
-mElist.erase(mElist.begin(), mElist.end());
-return;
-}
-
+  SetGraphicAtt(grs);
+  }
+
+ SelGraAtt(g);
+// Trace des elements
+ ElDrwMgr().DrawElements(g, xmin, ymin, xmax, ymax);
+
+}
+
Index: /trunk/SophyaPI/PI/pieldrw.h
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.h	(revision 2163)
+++ /trunk/SophyaPI/PI/pieldrw.h	(revision 2164)
@@ -10,39 +10,75 @@
 //  Classe avec gestion d une liste d elements a tracer 
 
-class PIElDrawer : public PIDrawer 
+class PIElDrwMgr
 {
 public:
   enum { PIDEL_Line = 1, PIDEL_Text = 2,
          PIDEL_Rect = 3, PIDEL_FRect = 4, 
-         PIDEL_Circ = 5, PIDEL_FCirc = 6 } ; 
+         PIDEL_Circ = 5, PIDEL_FCirc = 6,
+         PIDEL_Poly = 7, PIDEL_FPoly = 8,
+	 PIDEL_Mark = 9, PIDEL_Arrow = 10 } ; 
 
-                     PIElDrawer();
-  virtual           ~PIElDrawer();
+		PIElDrwMgr();
+  virtual	~PIElDrwMgr();
 
-  virtual void	     SetTitles(const char* tt=NULL, const char* tb=NULL);
-  virtual void       SetTitles(string const & tt, string const & tb);
-  
-  inline void        ShowTitles(bool fg=true) { showTitles = fg; }
+  virtual void  DrawElements(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax);
 
-//   Methode de decodage des options
-  virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+  inline int    ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt) ); }  
+  inline int    ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
+			  PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, gatt) ); }  
 
-  virtual void       Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
+  inline int    ElAddArrow(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt) ); }  
+  inline int    ElAddArrow(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
+			   PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Arrow, x1, y1, x2, y2, NULL, gatt) ); }  
 
-  inline int         ElAddLine(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, 
-                               PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_Line, x1, y1, x2, y2, NULL, c) ); }  
-  inline int         ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s, c) ); }  
-  inline int         ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
-                               PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, c) ); }  
-  inline int         ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy,
-                               PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, c) ); }  
-  inline int         ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, c) ); }  
-  inline int         ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIColors c=PI_NotDefColor)
-    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, c) ); }  
+  inline int    ElAddMarker(PIGrCoord x, PIGrCoord y)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, 0, 0, NULL, gatt) ); }  
+  inline int    ElAddMarker(PIGrCoord x, PIGrCoord y, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Mark, x, y, 0, 0, NULL, gatt) ); }  
+
+  inline int    ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt) ); }  
+  inline int    ElAddText(PIGrCoord x, PIGrCoord y, const char* s, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s, gatt) ); }  
+  inline int    ElAddText(PIGrCoord x, PIGrCoord y, string const & s)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt) ); }  
+  inline int    ElAddText(PIGrCoord x, PIGrCoord y, string const & s, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Text, x, y, 0, 0, s.c_str(), gatt) ); }  
+
+  inline int    ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt) ); }  
+  inline int    ElAddRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
+			  PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Rect, x, y, dx, dy, NULL, gatt) ); }  
+
+  inline int    ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt) ); }  
+  inline int    ElAddFRect(PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
+			   PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_FRect, x, y, dx, dy, NULL, gatt) ); }  
+
+  inline int    ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt) ); }  
+  inline int    ElAddCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Circ, x, y, r, r, NULL, gatt) ); }  
+
+  inline int    ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt) ); }  
+  inline int    ElAddFCirc(PIGrCoord x, PIGrCoord y, PIGrCoord r, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_FCirc, x, y, r, r, NULL, gatt) ); }  
+
+  inline int    ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_Poly, x, y, gatt) ); }  
+  inline int    ElAddPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_Poly, x, y, gatt) ); } 
+ 
+  inline int    ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y)
+    { PIGraphicAtt gatt; return( ElAdd(PIDEL_FPoly, x, y, gatt) ); }  
+  inline int    ElAddFPoly(vector<PIGrCoord>& x, vector<PIGrCoord>& y, PIGraphicAtt const & gatt)
+    { return( ElAdd(PIDEL_FPoly, x, y, gatt) ); }  
 
   void               ElDel(int id);
@@ -51,8 +87,8 @@
 protected:
   int                ElAdd(int typ, PIGrCoord x, PIGrCoord y, PIGrCoord dx, PIGrCoord dy, 
-                           const char* s, PIColors c=PI_NotDefColor);
-#ifdef __DECCXX
-public:
-#endif
+                           const char* s, PIGraphicAtt const & att);
+  int                ElAdd(int typ, vector<PIGrCoord>& x, vector<PIGrCoord>& y, 
+			   PIGraphicAtt const & att);
+
   struct DrwEl{
     int eid, etyp;
@@ -60,16 +96,56 @@
     PIGrCoord edx,edy;
     string es;
-    PIColors col;
+    PIGraphicAtt gatt;
+    PIGrCoord* xpol;
+    PIGrCoord* ypol;
+    int npol;
   };
-#ifdef __DECCXX
-protected:
-#endif
+
   typedef list<DrwEl> DrwElList;
-
   DrwElList mElist;
   int mEn;
+  
+};
 
+class PIElDrawer : public PIDrawer 
+{
+public:
+                     PIElDrawer();
+  virtual           ~PIElDrawer();
+
+//   Methode de decodage des options
+  virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+
+  virtual void       DrawAxes(PIGraphicUC* g); // Trace d'axes avec label axe X,Y
+
+  virtual void       Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax); 
+
+  inline PIElDrwMgr& ElDrwMgr()    { return eltsMgr; }
+
+  inline void        SetTitles(string tt, string tb)   { titleT = tt;  titleB = tb; }
+  inline void        SetTitles(string tt, string tb, PIGraphicAtt const& att) 
+                        { titleT = tt;  titleB = tb; titleAtt = att; }
+  inline void        ShowTitles(bool fg=true) { showTitles = fg; }
+
+  inline void        SetAxesLabels(string xl, string yl) { xLabel = xl;  yLabel = yl; }
+  inline void        SetAxesLabels(string xl, string yl, PIGraphicAtt const& att) 
+                        { xLabel = xl;  yLabel = yl; labelAtt = att; }
+  inline void        ShowAxesLabels(bool fg=true) { showAxesLabels = fg; }
+
+// -- Pour compatibilite avec l'interface precedente , Reza 08/2002 
+  inline void        ElDel(int id) { eltsMgr.ElDel(id); }
+  inline void        ElDelAll()    { eltsMgr.ElDelAll(); }
+  
+  inline int	     ElAddText(PIGrCoord x, PIGrCoord y, const char* s)
+                                   { return eltsMgr.ElAddText(x, y, s); }
+
+protected:
+  PIElDrwMgr eltsMgr;
   string titleT, titleB;       // Titre Haut - Bas
-  bool showTitles;              // Affichage des titres si true
+  PIGraphicAtt titleAtt;       // Attributs graphiques de trace de titre
+  bool showTitles;             // Affichage des titres si true
+  string xLabel, yLabel;       // Label x, label y
+  PIGraphicAtt labelAtt;       // Attributs graphiques de trace de label d'axes
+  bool showAxesLabels;         // Affichage des labels d'axes si true
 
 };
Index: /trunk/SophyaPI/PI/piimage.cc
===================================================================
--- /trunk/SophyaPI/PI/piimage.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/piimage.cc	(revision 2164)
@@ -1104,10 +1104,11 @@
 gvdrw->SetLimits(xw1, xw2, yw1, yw2, kAxeDirLtoR, kAxeDirUpDown);
 int cmapid = cmap->Type();
+PIGraphicAtt gatt;
 if ( (cmapid == CMAP_GREY32) || (cmapid == CMAP_GREYINV32) || 
      (cmapid == CMAP_GREY128) || (cmapid == CMAP_GREYINV128)) 
-  gvdrw->GetGraphicAtt().SetColAtt(PI_Red); 
-else gvdrw->GetGraphicAtt().SetColAtt(PI_Turquoise);
-gvdrw->GetGraphicAtt().SetLineAtt(PI_NormalLine);
-gvdrw->ElAddRect(x,y,dx,dy);
+  gatt.SetColAtt(PI_Red); 
+else gatt.SetColAtt(PI_Turquoise);
+gatt.SetLineAtt(PI_NormalLine);
+gvdrw->ElDrwMgr().ElAddRect(x,y,dx,dy,gatt);
 gvw->AddDrawer(gvdrw, xw1, yw1, xw2, yw2, false); 
 gvw->SetColMap(cmap, false);
Index: /trunk/SophyaPI/PI/pisurfdr.cc
===================================================================
--- /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2163)
+++ /trunk/SophyaPI/PI/pisurfdr.cc	(revision 2164)
@@ -95,8 +95,6 @@
   Set3DView((xmin+xmax)/2., (ymin+ymax)/2, zmin+(zmax-zmin)*0.40, 
             (xmin+xmax)/2.+D , (ymin+ymax)/2.-2.5*D , zmin+(zmax-zmin)*0.85, 0.25, 0.25);  
-  
-  x3Min = xmin;   x3Max = xmax;
-  y3Min = ymin;   y3Max = ymax;
-  z3Min = zmin-PERC_GARDE*(zmax-zmin); z3Max = zmax+PERC_GARDE*(zmax-zmin);
+
+  Set3DBox(xmin, xmax, ymin, ymax, zmin-PERC_GARDE*(zmax-zmin), zmax+PERC_GARDE*(zmax-zmin));
 
 //  printf("PISurfaceDrawer::UpdateLimits() : %g-%g  %g-%g  %g-%g (%g) \n", xmin,xmax,ymin,ymax,zmin,zmax,D);
