diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index dddbde210a704018396cfbf5ea4cae19284d8027..ad831f408ae013dad8c920d90d6b80d4b4ad514f 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.132 2005-06-11 02:01:39 geuzaine Exp $
+// $Id: Mesh.cpp,v 1.133 2005-06-11 17:02:34 geuzaine Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -124,6 +124,17 @@ double intersectCutPlane(int num, Vertex **v)
   return intersectCutPlane(num, v, &dummy, &dummy);
 }
 
+int getPartition(int index)
+{
+  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, index);
+  if(!part)
+    return 0; // OK, no partitions available
+  else if(!(*part)->Visible) 
+    return -1; // partition should be hidden
+  else
+    return (*part)->Num; // partition number
+}
+
 void Draw_Mesh(Mesh * M)
 {
   InitPosition();
@@ -543,8 +554,8 @@ void Draw_Mesh_Line(void *a, void *b)
   if(!(s->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(s->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.radius_sup) {
@@ -592,7 +603,7 @@ void Draw_Mesh_Line(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(s->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.line;
 
@@ -831,8 +842,8 @@ void Draw_Mesh_Triangle(void *a, void *b)
   if(!(s->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(s->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -862,7 +873,7 @@ void Draw_Mesh_Triangle(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(s->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.triangle;
 
@@ -1000,8 +1011,8 @@ void Draw_Mesh_Quadrangle(void *a, void *b)
   if(!(q->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, q->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(q->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -1031,7 +1042,7 @@ void Draw_Mesh_Quadrangle(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(q->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.quadrangle;
 
@@ -1171,8 +1182,8 @@ void Draw_Mesh_Tetrahedron(void *a, void *b)
   if(!s->V[3] || !(s->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(s->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -1207,7 +1218,7 @@ void Draw_Mesh_Tetrahedron(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(s->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.tetrahedron;
 
@@ -1350,8 +1361,8 @@ void Draw_Mesh_Hexahedron(void *a, void *b)
   if(!(h->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, h->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(h->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -1384,7 +1395,7 @@ void Draw_Mesh_Hexahedron(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(h->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.hexahedron;
 
@@ -1541,8 +1552,8 @@ void Draw_Mesh_Prism(void *a, void *b)
   if(!(p->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, p->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(p->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -1575,7 +1586,7 @@ void Draw_Mesh_Prism(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(p->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.prism;
 
@@ -1747,8 +1758,8 @@ void Draw_Mesh_Pyramid(void *a, void *b)
   if(!(p->Visible & VIS_MESH))
     return;
 
-  MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, p->iPart);
-  if(part && !(*part)->Visible)
+  int iPart = getPartition(p->iPart);
+  if(iPart < 0)
     return;
 
   if(CTX.mesh.quality_sup) {
@@ -1781,7 +1792,7 @@ void Draw_Mesh_Pyramid(void *a, void *b)
   else if(CTX.mesh.color_carousel == 2)
     col = CTX.color.mesh.carousel[abs(thePhysical % 20)];
   else if(CTX.mesh.color_carousel == 3)
-    col = CTX.color.mesh.carousel[abs(p->iPart % 20)];
+    col = CTX.color.mesh.carousel[abs(iPart % 20)];
   else
     col = CTX.color.mesh.pyramid;