Index: /trunk/SophyaPI/PI/pieldrw.cc
===================================================================
--- /trunk/SophyaPI/PI/pieldrw.cc	(revision 2257)
+++ /trunk/SophyaPI/PI/pieldrw.cc	(revision 2258)
@@ -380,5 +380,5 @@
 {
   if (axesFlags == kAxesNone) return;
-  g->NoClip();
+  //  g->NoClip();
   g->SaveGraphicAtt();
   PIAxes axes;
@@ -389,5 +389,5 @@
     axes.DrawYCaption(g, labelAtt, axesFlags, yLabel);
   }
-  g->Clip();
+  //  g->Clip();
   g->RestoreGraphicAtt(); 
 }
@@ -397,4 +397,5 @@
 {
 SelGraAtt(g);   
+g->NoClip();  // On ne clip pas les BaseDrawer - Reza Nov 2002
 DrawAxes(g);   // Trace des axes 
 // g->SelFont(PI_NormalSizeFont);
Index: /trunk/SophyaPI/PI/pigraphgen.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphgen.cc	(revision 2257)
+++ /trunk/SophyaPI/PI/pigraphgen.cc	(revision 2258)
@@ -250,7 +250,7 @@
 //	Tracé d'un cercle plein centré en "(x0,y0)", de rayon "r"
 // void  DrawOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
-//	Tracé d'une ellipse incluse dans le rectangle "(x0,y0)" , "dx,dy"
+//	Tracé d'une ellipse centrée en "(x0,y0)" de demi-axes "dx,dy"
 // void  DrawFOval(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
-//	Tracé d'une ellipse pleine incluse dans le rectangle "(x0,y0)" , "dx,dy"
+//	Tracé d'une ellipse pleine centrée en "(x0,y0)" de demi-axes "dx,dy"
 // void  DrawPolygon(PIGrCoord *x, PIGrCoord *y, int n, bool cinc=true)
 //	Tracé du contour d'un polygone défini par le tableau des "n" points "x,y".
@@ -261,16 +261,20 @@
 //	Tracé d'un polygone plein de la couleur d'avant-plan.
 // void  DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, double degdeb, double degfin)
-//	Tracé d'un arc de cercle ou d'ellipse, inclu dans le "(x0,y0)" , "dx,dy" 
-//	entre les angles (en degré) "degdeb" - "degfin" 
+//	Tracé d'un arc de cercle ou d'ellipse, centrée en "(x0,y0)" de demi-axes "dx,dy"
+//	L'arc couvre un angle "deltadeg" en degré, et commence au point défini
+//	par l'angle "degdeb". Le sens positif angulaire est celui de la rotation
+//	de l'axe X vers Y. Le point (0,1) a 90 deg. (-1,0) a 180 deg.
 // void  DrawFArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy, double degdeb, double degfin)
-//	Tracé d'un arc plein, inclu dans le "(x0,y0)" , "dx,dy" 
-//	entre les angles (en degré) "degdeb" - "degfin" 
+//	Tracé d'un arc de cercle ou d'ellipse plein, centrée en "(x0,y0)" de demi-axes "dx,dy"
+//	L'arc couvre un angle "deltadeg" en degré, et commence au point défini
+//	par l'angle "degdeb". Le sens positif angulaire est celui de la rotation
+//	de l'axe X vers Y. Le point (0,1) a 90 deg. (-1,0) a 180 deg.
 //
 // Draw3PtArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, \
 //            PIGrCoord x3, PIGrCoord y3)
-//	Tracé d'un arc spécifié par trois points "(x1,y1)", "(x2,y2)" et "(x3,y3)"
+//	Tracé d'un arc de cercle spécifié par trois points "(x1,y1)", "(x2,y2)" et "(x3,y3)"
 // Draw3PtFArc(PIGrCoord x1, PIGrCoord y1, PIGrCoord x2, PIGrCoord y2, \
 //             PIGrCoord x3, PIGrCoord y3)
-//	Tracé d'un arc plein spécifié par trois points "(x1,y1)", "(x2,y2)" et "(x3,y3)"
+//	Tracé d'un arc de cercle plein spécifié par trois points "(x1,y1)", "(x2,y2)" et "(x3,y3)"
 //--
 
@@ -314,4 +318,12 @@
 }
 
+//++
+// ComputeArcFrom3Pt(double x1, double y1, double x2, double y2, \
+//                   double x3, double y3, double& x0, double& y0, 
+//                   double& dx, double& dy, double& degdeb, double& deltadeg)
+//	Calcul des coordonnees du centre, du rayon, ainsi que l'extension
+//	angulaire d'un arc de cercle specifie par trois points. 
+//	*methode statique*
+//--
 /* --Methode-- */
 int PIGraphicGen::ComputeArcFrom3Pt(double x1, double y1, double x2, double y2,
@@ -322,7 +334,8 @@
   degdeb = deltadeg = 0.;
   double px[2], py[2];
-  cout << "DBG - Arc3Pt" << x1 << "," << y1 << " - "
-       << x2 << "," << y2 << " - " 
-       << x3 << "," << y3 << endl;
+  //  cout << "DBG - Arc3Pt" << x1 << "," << y1 << " - "
+  //     << x2 << "," << y2 << " - " 
+  //     << x3 << "," << y3 << endl;
+
   // Milieu de M1-M2
   px[0] = (x1+x2)*0.5;
@@ -380,5 +393,5 @@
   else {
     if (fabs(dela) < PETIT_DBLE) {
-      cerr << " PIGraphicGen::ComputeArcFrom3Pt()/Error - a[1]-a[0]=" << dela << endl; 
+      cerr << " PIGraphicGen::ComputeArcFrom3Pt()/Error - a[1]-a[0]=" << dela << " a[0]=" << a[0] << " a[1]=" << a[1] << endl; 
       return(3);    
     }
@@ -395,10 +408,21 @@
   double cda = (delx*delx2+dely*dely2)/sqrt(delx*delx+dely*dely)/sqrt(delx2*delx2+dely2*dely2);
   double dang = acos(cda);
+  double sda = 0.;
+  double daopi = 1;
+  if (fabs(dang-M_PI) < 1.e-19) {
+    delx2 = x2-xc;
+    dely2 = y2-yc;
+  // angle M1-O-M2 : Produit vectoriel OM1 X OM2 - Signe de l'angle deltaAngle
+    sda = (delx*dely2-dely*delx2);
+  }
+  else {
   // angle M1-O-M3 : Produit vectoriel OM1 X OM3 - Signe de l'angle deltaAngle
-  double sda = (delx*dely2-dely*delx2);
+    sda = (delx*dely2-dely*delx2);
   // Produit scalaire (OM1 + OM3) . OM2 : deltaAngle ou 2*PI-DeltaAngle
-  delx = (x1+x3)-xc; 
-  dely = (y1+y3)-yc;
-  double daopi = (delx*delx2+dely*dely2)/sqrt(delx*delx+dely*dely)/sqrt(delx2*delx2+dely2*dely2);
+    delx = (x1+x3)-2*xc; 
+    dely = (y1+y3)-2*yc;
+    daopi = (delx*delx2+dely*dely2)/sqrt(delx*delx+dely*dely)
+                                   /sqrt(delx2*delx2+dely2*dely2);
+  }
   if (sda >= 0.) {
     if (daopi < 0.) { 
@@ -421,9 +445,11 @@
     }
   }
-  x0 = (xc-r);
-  y0 = (yc-r);
-  dx = dy = 2.*r;
-  cout << "DBG - Arc3Pt-2  " << xc << "," << yc << " R=" << r << " deg= "
-       << degdeb << " Delta= " << deltadeg << endl;
+  while (degdeb < 0.) degdeb += 360.;
+  while (degdeb > 360.) degdeb -= 360.;
+  x0 = xc;
+  y0 = yc;
+  dx = dy = r;
+  //  cout << "DBG - Arc3Pt-2  " << xc << "," << yc << " R=" << r << " deg= "
+  //       << degdeb << " Delta= " << deltadeg << endl;
   return(0);
 }
Index: /trunk/SophyaPI/PI/pigraphx.cc
===================================================================
--- /trunk/SophyaPI/PI/pigraphx.cc	(revision 2257)
+++ /trunk/SophyaPI/PI/pigraphx.cc	(revision 2258)
@@ -203,5 +203,5 @@
 {
 XDrawArc(mDisp, mWId, DefGC(),
-         (int)x0, (int)y0, (int)dx, (int)dy, 0, 360*64);
+         (int)x0-(int)dx, (int)y0-(int)dy, (int)dx*2, (int)dy*2, 0, 360*64);
 return;
 }
@@ -211,5 +211,5 @@
 {
 XFillArc(mDisp, mWId, DefGC(),
-         (int)x0, (int)y0, (int)dx, (int)dy, 0, 360*64);
+         (int)x0-(int)dx, (int)y0-(int)dy, (int)dx*2, (int)dy*2, 0, 360*64);
 return;
 }
@@ -266,5 +266,5 @@
 degdeb = 360. - (degdeb+deltadeg);
 XDrawArc(mDisp, mWId, DefGC(),
-         (int)x0, (int)y0, (int)dx, (int)dy, (int)(degdeb*64.), (int)(deltadeg*64.));
+         (int)x0-(int)dx, (int)y0-(int)dy, (int)dx*2, (int)dy*2, (int)(degdeb*64.), (int)(deltadeg*64.));
 return;
 }
@@ -276,5 +276,5 @@
 degdeb = 360. - (degdeb+deltadeg);
 XFillArc(mDisp, mWId, DefGC(),
-         (int)x0, (int)y0, (int)dx, (int)dy, (int)(degdeb*64.), (int)(deltadeg*64.));
+         (int)x0-(int)dx, (int)y0-(int)dy, (int)dx*2, (int)dy*2, (int)(degdeb*64.), (int)(deltadeg*64.));
 return;
 }
Index: /trunk/SophyaPI/PI/psfile.cc
===================================================================
--- /trunk/SophyaPI/PI/psfile.cc	(revision 2257)
+++ /trunk/SophyaPI/PI/psfile.cc	(revision 2258)
@@ -195,4 +195,16 @@
 closepath savematrix setmatrix } def\n\
 \
+%% pipsarc Arc \n\
+/pipsarc {/endangle exch def /startangle exch def /yrad exch def\n\
+/xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def\n\
+x y tr xrad yrad sc 0 0 1 startangle endangle arc\n\
+savematrix setmatrix } def\n\
+\
+%% pipsfarc Arc plein \n\
+/pipsfarc {/endangle exch def /startangle exch def /yrad exch def\n\
+/xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def\n\
+x y tr 0 0 moveto xrad yrad sc 0 0 1 startangle endangle arc 0 0  lineto\n\
+closepath savematrix setmatrix } def\n\
+\
 %% Gestion des images\n\
 %% ColorImage, pompee sur xv (qui les avait pompees sur xgrab)\n\
@@ -1126,9 +1138,11 @@
 	fprintf(mPSFile, "C%d ", mDrawColor); 
     }
-
-
+    
+    double degfin = degdeb+deltadeg;
+    while (degfin > 360.) degfin -= 360.;
+    while (degfin < 0.)   degfin += 360.;
     /* Dessin */
-    fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f ellipse s gr\n",
-	    x0+dx/2, y0+dy/2, dx/2, dy/2, degdeb, deltadeg) ;
+    fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f pipsarc s gr\n",
+	    x0, y0, dx, dy, degdeb, degfin) ;
 }
 
@@ -1144,4 +1158,7 @@
       SelectLine(LineAtt);
 
+    double degfin = degdeb+deltadeg;
+    while (degfin > 360.) degfin -= 360.;
+    while (degfin < 0.)   degfin += 360.;
     /* Dessin du fond */
     if ( (FillColor != PI_NotDefColor) || (FillColor != mDrawColor) ){
@@ -1149,6 +1166,6 @@
 	fprintf(mPSFile, "C%d ", mDrawColor) ;
     }
-    fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f ellipse f gr\n",
-	    x0+dx/2, y0+dy/2, dx/2, dy/2, degdeb, deltadeg);
+    fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f pipsfarc f gr\n",
+	    x0, y0, dx, dy, degdeb, degfin);
 
     /* Dessin du contour (s'il y a lieu) */
@@ -1156,6 +1173,6 @@
 	mDrawColor = DrawColor;
 	fprintf(mPSFile, "C%d ", mDrawColor); 
-	fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f ellipse s gr\n",
-		x0+dx/2, y0+dy/2, dx/2, dy/2, degdeb, deltadeg) ;
+	fprintf(mPSFile, "gs n %.2f Ux %.2f Uy %.2f Ux %.2f Uy %.2f %.2f pipsfarc s gr\n",
+		x0, y0, dx, dy, degdeb, degfin) ;
     }
 }
