diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index 100d36377c4cd87f908433f8b83357ec66fc365c..aad55cd0f295d6a3f941aaa860c68d8bfa2937bb 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -97,78 +97,40 @@ void Draw_PlaneInBoundingBox(double xmin, double ymin, double zmin,
 			     double xmax, double ymax, double zmax,
 			     double a, double b, double c, double d);
 
-void Draw_ScalarPoint(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax, 
-		      double *X, double *Y, double *Z, double *V);
-void Draw_VectorPoint(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax, 
-		      double *X, double *Y, double *Z, double *V);
-void Draw_TensorPoint(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax, 
-		      double *X, double *Y, double *Z, double *V);
-void Draw_ScalarLine(Post_View *View, int preproNormals,
-		     double ValMin, double ValMax, 
-		     double *X, double *Y, double *Z, double *V);
-void Draw_VectorLine(Post_View *View, int preproNormals,
-		     double ValMin, double ValMax, 
-		     double *X, double *Y, double *Z, double *V);
-void Draw_TensorLine(Post_View *View, int preproNormals,
-		     double ValMin, double ValMax,
-		     double *X, double *Y, double *Z, double *V);
-void Draw_ScalarTriangle(Post_View *View, int preproNormals,
-			 double ValMin, double ValMax,
-			 double *X, double *Y, double *Z, double *V);
-void Draw_VectorTriangle(Post_View *View, int preproNormals,
-			 double ValMin, double ValMax,
-			 double *X, double *Y, double *Z, double *V);
-void Draw_TensorTriangle(Post_View *View, int preproNormals,
-			 double ValMin, double ValMax,
-			 double *X, double *Y, double *Z, double *V);
-void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
-			    double ValMin, double ValMax,
-			    double *X, double *Y, double *Z, double *V);
-void Draw_VectorTetrahedron(Post_View *View, int preproNormals,
-			    double ValMin, double ValMax,
-			    double *X, double *Y, double *Z, double *V);
-void Draw_TensorTetrahedron(Post_View *View, int preproNormals,
-			    double ValMin, double ValMax,
-			    double *X, double *Y, double *Z, double *V);
-void Draw_ScalarQuadrangle(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_VectorQuadrangle(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_TensorQuadrangle(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_ScalarHexahedron(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_VectorHexahedron(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_TensorHexahedron(Post_View *View, int preproNormals,
-			   double ValMin, double ValMax,
-			   double *X, double *Y, double *Z, double *V);
-void Draw_ScalarPrism(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax,
-		      double *X, double *Y, double *Z, double *V);
-void Draw_VectorPrism(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax,
-		      double *X, double *Y, double *Z, double *V);
-void Draw_TensorPrism(Post_View *View, int preproNormals,
-		      double ValMin, double ValMax,
-		      double *X, double *Y, double *Z, double *V);
-void Draw_ScalarPyramid(Post_View *View, int preproNormals,
-			double ValMin, double ValMax,
-			double *X, double *Y, double *Z, double *V);
-void Draw_VectorPyramid(Post_View *View, int preproNormals,
-			double ValMin, double ValMax,
-			double *X, double *Y, double *Z, double *V);
-void Draw_TensorPyramid(Post_View *View, int preproNormals,
-			double ValMin, double ValMax,
-			double *X, double *Y, double *Z, double *V);
+#define ARGS Post_View *View, int preproNormals, \
+             double ValMin, double ValMax, 	 \
+             double *X, double *Y, double *Z, double *V
+
+void Draw_ScalarPoint(ARGS);
+void Draw_VectorPoint(ARGS);
+void Draw_TensorPoint(ARGS);
+void Draw_ScalarLine(ARGS);
+void Draw_VectorLine(ARGS);
+void Draw_TensorLine(ARGS);
+void Draw_ScalarTriangle(ARGS);
+void Draw_VectorTriangle(ARGS);
+void Draw_TensorTriangle(ARGS);
+void Draw_ScalarTetrahedron(ARGS);
+void Draw_VectorTetrahedron(ARGS);
+void Draw_TensorTetrahedron(ARGS);
+void Draw_ScalarQuadrangle(ARGS);
+void Draw_VectorQuadrangle(ARGS);
+void Draw_TensorQuadrangle(ARGS);
+void Draw_ScalarHexahedron(ARGS);
+void Draw_VectorHexahedron(ARGS);
+void Draw_TensorHexahedron(ARGS);
+void Draw_ScalarPrism(ARGS);
+void Draw_VectorPrism(ARGS);
+void Draw_TensorPrism(ARGS);
+void Draw_ScalarPyramid(ARGS);
+void Draw_VectorPyramid(ARGS);
+void Draw_TensorPyramid(ARGS);
+
+void Draw_ScalarElement(int type, ARGS);
+void Draw_VectorElement(int type, ARGS);
+void Draw_TensorElement(int type, ARGS);
+
+#undef ARGS
 
 double GiveValueFromIndex_Lin(double ValMin, double ValMax, int NbIso, int Iso);
 double GiveValueFromIndex_Log(double ValMin, double ValMax, int NbIso, int Iso);
diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp
index 9789b1d852b31e47b9b0b4e0ff4ff909e7a61fac..401f848398ae3ca6fdfb3feefc3ebba279bac72c 100644
--- a/Graphics/PostElement.cpp
+++ b/Graphics/PostElement.cpp
@@ -1,4 +1,4 @@
-// $Id: PostElement.cpp,v 1.45 2004-10-21 17:02:26 geuzaine Exp $
+// $Id: PostElement.cpp,v 1.46 2004-10-21 21:47:27 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -861,6 +861,37 @@ void Draw_ScalarPyramid(Post_View * View, int preproNormals,
   View->ShowElement = show;
 }
 
+void Draw_ScalarElement(int type, Post_View * View, int preproNormals,
+                        double ValMin, double ValMax, 
+                        double *X, double *Y, double *Z, double *V)
+{
+  switch(type){
+  case POINT:
+    Draw_ScalarPoint(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case LINE:
+    Draw_ScalarLine(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case TRIANGLE:
+    Draw_ScalarTriangle(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case QUADRANGLE:
+    Draw_ScalarQuadrangle(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case TETRAHEDRON:
+    Draw_ScalarTetrahedron(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case HEXAHEDRON:
+    Draw_ScalarHexahedron(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case PRISM:
+    Draw_ScalarPrism(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  case PYRAMID:
+    Draw_ScalarPyramid(View, preproNormals, ValMin, ValMax, X, Y, Z, V);
+    break;
+  }
+}
 
 int GetDataFromOtherView(int type, int nbnod, Post_View *v, int *nbcomp,
 			 double *norm, double **vals, int *vectype)
@@ -1010,7 +1041,7 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
     norm[k] = sqrt(Val[k][0] * Val[k][0] + Val[k][1] * Val[k][1] + Val[k][2] * Val[k][2]);
   }
 
-  double *ext_vals;
+  double *ext_vals = NULL;
   int nbcomp = 1, ext_vectype = 0;
   if(View->VectorType == DRAW_POST_DISPLACEMENT_EXTERNAL){
     GetDataFromOtherView(type, nbnod, View, &nbcomp, norm, &ext_vals, &ext_vectype);
@@ -1038,115 +1069,57 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
     int vt = View->VectorType;
     View->VectorType = ext_vectype;
     
-    switch (type) {
-    case POINT:
-      if(nbcomp == 1){
-	Draw_ScalarPoint(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-	if(ts) {  //draw trajectory
-	  if(View->LineType) {
-	    double dx2, dy2, dz2, XX[2], YY[2], ZZ[2];
-	    // warning, warning...
-	    Raise[0][1] = Raise[0][0];
-	    Raise[1][1] = Raise[1][0];
-	    Raise[2][1] = Raise[2][0];
-	    for(int j = 0; j < ts; j++) {
-	      dx = V[3 * (ts - j)];
-	      dy = V[3 * (ts - j) + 1];
-	      dz = V[3 * (ts - j) + 2];
-	      dx2 = V[3 * (ts - j - 1)];
-	      dy2 = V[3 * (ts - j - 1) + 1];
-	      dz2 = V[3 * (ts - j - 1) + 2];
-	      dd = sqrt(dx * dx + dy * dy + dz * dz);
-	      // not perfect...
-	      PaletteContinuous(View, ValMin, ValMax, dd);
-	      XX[0] = X[0] + fact * dx;
-	      XX[1] = X[0] + fact * dx2;
-	      YY[0] = Y[0] + fact * dy;
-	      YY[1] = Y[0] + fact * dy2;
-	      ZZ[0] = Z[0] + fact * dz;
-	      ZZ[1] = Z[0] + fact * dz2;
-	      Draw_Line(View->LineType, View->LineWidth, XX, YY, ZZ, Raise, View->Light);
-	    }
+    if(nbcomp == 1){
+      Draw_ScalarElement(type, View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
+      if(type == POINT && ts > 0) {  // draw point "trajectory"
+	if(View->LineType) {
+	  double dx2, dy2, dz2, XX[2], YY[2], ZZ[2];
+	  // warning, warning...
+	  Raise[0][1] = Raise[0][0];
+	  Raise[1][1] = Raise[1][0];
+	  Raise[2][1] = Raise[2][0];
+	  for(int j = 0; j < ts; j++) {
+	    dx = V[3 * (ts - j)];
+	    dy = V[3 * (ts - j) + 1];
+	    dz = V[3 * (ts - j) + 2];
+	    dx2 = V[3 * (ts - j - 1)];
+	    dy2 = V[3 * (ts - j - 1) + 1];
+	    dz2 = V[3 * (ts - j - 1) + 2];
+	    dd = sqrt(dx * dx + dy * dy + dz * dz);
+	    // not perfect...
+	    PaletteContinuous(View, ValMin, ValMax, dd);
+	    XX[0] = X[0] + fact * dx;
+	    XX[1] = X[0] + fact * dx2;
+	    YY[0] = Y[0] + fact * dy;
+	    YY[1] = Y[0] + fact * dy2;
+	    ZZ[0] = Z[0] + fact * dz;
+	    ZZ[1] = Z[0] + fact * dz2;
+	    Draw_Line(View->LineType, View->LineWidth, XX, YY, ZZ, Raise, View->Light);
 	  }
-	  else {
-	    glBegin(GL_LINE_STRIP);
-	    for(int j = 0; j < ts + 1; j++) {
-	      dx = V[3 * (ts - j)];
-	      dy = V[3 * (ts - j) + 1];
-	      dz = V[3 * (ts - j) + 2];
-	      dd = sqrt(dx * dx + dy * dy + dz * dz);
-	      PaletteContinuous(View, ValMin, ValMax, dd);
-	      glVertex3d(X[0] + fact * dx + Raise[0][0],
-			 Y[0] + fact * dy + Raise[1][0],
-			 Z[0] + fact * dz + Raise[2][0]);
-	    }
-	    glEnd();
+	}
+	else {
+	  glBegin(GL_LINE_STRIP);
+	  for(int j = 0; j < ts + 1; j++) {
+	    dx = V[3 * (ts - j)];
+	    dy = V[3 * (ts - j) + 1];
+	    dz = V[3 * (ts - j) + 2];
+	    dd = sqrt(dx * dx + dy * dy + dz * dz);
+	    PaletteContinuous(View, ValMin, ValMax, dd);
+	    glVertex3d(X[0] + fact * dx + Raise[0][0],
+		       Y[0] + fact * dy + Raise[1][0],
+		       Z[0] + fact * dz + Raise[2][0]);
 	  }
+	  glEnd();
 	}
       }
-      else if(nbcomp == 3)
-	Draw_VectorPoint(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorPoint(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case LINE:
-      if(nbcomp == 1)
-	Draw_ScalarLine(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorLine(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorLine(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case TRIANGLE:
-      if(nbcomp == 1)
-	Draw_ScalarTriangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorTriangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorTriangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case TETRAHEDRON:
-      if(nbcomp == 1)
-	Draw_ScalarTetrahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorTetrahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorTetrahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case QUADRANGLE:
-      if(nbcomp == 1)
-	Draw_ScalarQuadrangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorQuadrangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorQuadrangle(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case HEXAHEDRON:
-      if(nbcomp == 1)
-	Draw_ScalarHexahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorHexahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorHexahedron(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case PRISM:
-      if(nbcomp == 1)
-	Draw_ScalarPrism(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorPrism(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorPrism(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
-    case PYRAMID:
-      if(nbcomp == 1)
-	Draw_ScalarPyramid(View, preproNormals, ValMin, ValMax, xx, yy, zz, norm);
-      else if(nbcomp == 3)
-	Draw_VectorPyramid(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      else if(nbcomp == 9)
-	Draw_TensorPyramid(View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
-      break;
     }
-    
+    else if(nbcomp == 3){
+      Draw_VectorElement(type, View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
+    }
+    else if(nbcomp == 9){
+      Draw_TensorElement(type, View, preproNormals, ValMin, ValMax, xx, yy, zz, ext_vals);
+    }
+
     View->TimeStep = ts;
     View->VectorType = vt;
     return;