]> SALOME platform Git repositories - modules/visu.git/blobdiff - src/VISU_I/VISU_CorbaMedConvertor.cxx
Salome HOME
Merge from V5_1_main 14/05/2010
[modules/visu.git] / src / VISU_I / VISU_CorbaMedConvertor.cxx
index 56c39876d4d2fea091de8ace7501fd8a9826bde7..898ad2c38924d19fad78d9b52aa355c101e85a1c 100644 (file)
@@ -1,40 +1,42 @@
-//  VISU OBJECT : interactive object for VISU entities implementation
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
 //
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
 //
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  VISU OBJECT : interactive object for VISU entities implementation
 //  File   : VISU_CorbaMedConvertor.cxx
 //  Author : Alexey PETROV
 //  Module : VISU
 //  $Header$
-//  Copyright (C) 2003  CEA/DEN, EDF R&D
-
+//
 #include "VISU_CorbaMedConvertor.hxx"
+#include "VISU_ConvertorUtils.hxx"
 
 #include <vtkCellType.h>
 
 #include <boost/tuple/tuple.hpp>
 
-using namespace std;
-using namespace VISU;
+#include "ReceiverFactory.hxx"
+#include "MED_SliceArray.hxx"
+
+#include "utilities.h"
 
 #define USER_INTERLACE MED_FULL_INTERLACE
 
@@ -58,165 +60,276 @@ extern "C" {
   }
 }
 
-namespace{
-  using namespace SALOME_MED;
-  
-  const int MED_NBR_GEOMETRIE_MAILLE = 15;
+namespace
+{
+  const int MED_NBR_GEOMETRIE_MAILLE = 17;
   
-  medGeometryElement 
+  SALOME_MED::medGeometryElement 
   CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = {
-    MED_POINT1,
-    MED_SEG2,
-    MED_SEG3,
-    MED_TRIA3,
-    MED_QUAD4,
-    MED_TRIA6,
-    MED_QUAD8,
-    MED_TETRA4,
-    MED_PYRA5,
-    MED_PENTA6,
-    MED_HEXA8,
-    MED_TETRA10,
-    MED_PYRA13,
-    MED_PENTA15,
-    MED_HEXA20
+    SALOME_MED::MED_POINT1,
+    SALOME_MED::MED_SEG2,
+    SALOME_MED::MED_SEG3,
+    SALOME_MED::MED_TRIA3,
+    SALOME_MED::MED_QUAD4,
+    SALOME_MED::MED_TRIA6,
+    SALOME_MED::MED_QUAD8,
+    SALOME_MED::MED_TETRA4,
+    SALOME_MED::MED_PYRA5,
+    SALOME_MED::MED_PENTA6,
+    SALOME_MED::MED_HEXA8,
+    SALOME_MED::MED_TETRA10,
+    SALOME_MED::MED_PYRA13,
+    SALOME_MED::MED_PENTA15,
+    SALOME_MED::MED_HEXA20,
+    SALOME_MED::MED_POLYGON,
+    SALOME_MED::MED_POLYHEDRA
   };
   
-  const int MED_NBR_GEOMETRIE_FACE = 4;
+  const int MED_NBR_GEOMETRIE_FACE = 5;
   
-  medGeometryElement
+  SALOME_MED::medGeometryElement
   FACEGEOM[MED_NBR_GEOMETRIE_FACE] = {
-    MED_TRIA3,
-    MED_QUAD4,
-    MED_TRIA6,
-    MED_QUAD8
+    SALOME_MED::MED_TRIA3,
+    SALOME_MED::MED_QUAD4,
+    SALOME_MED::MED_TRIA6,
+    SALOME_MED::MED_QUAD8,
+    SALOME_MED::MED_POLYGON
   };
   
   const int MED_NBR_GEOMETRIE_ARETE = 2;
   
-  medGeometryElement
+  SALOME_MED::medGeometryElement
   EDGEGEOM[MED_NBR_GEOMETRIE_ARETE] = {
-    MED_SEG2,
-    MED_SEG3
+    SALOME_MED::MED_SEG2,
+    SALOME_MED::MED_SEG3
   };
   
   const int MED_NBR_GEOMETRIE_NODE = 1;
   
-  medGeometryElement
+  SALOME_MED::medGeometryElement
   NODEGEOM[MED_NBR_GEOMETRIE_NODE] = {
-    MED_POINT1,
+    SALOME_MED::MED_POINT1,
   };
   
-  int GetEntity2Geom(const VISU::TEntity& theEntity, medGeometryElement*& theVector)
+
+  //---------------------------------------------------------------
+  int
+  GetEntity2Geom(const VISU::TEntity& theEntity, 
+                 SALOME_MED::medGeometryElement*& theVector)
   {
     switch(theEntity){
-    case CELL_ENTITY: theVector = CELLGEOM; return MED_NBR_GEOMETRIE_MAILLE; break;
-    case FACE_ENTITY: theVector = FACEGEOM; return MED_NBR_GEOMETRIE_FACE; break;
-    case EDGE_ENTITY: theVector = EDGEGEOM; return MED_NBR_GEOMETRIE_ARETE; break;
-    case NODE_ENTITY: theVector = NODEGEOM; return MED_NBR_GEOMETRIE_NODE; break;
+    case VISU::CELL_ENTITY: 
+      theVector = CELLGEOM; 
+      return MED_NBR_GEOMETRIE_MAILLE; 
+    case VISU::FACE_ENTITY: 
+      theVector = FACEGEOM; 
+      return MED_NBR_GEOMETRIE_FACE; 
+    case VISU::EDGE_ENTITY: 
+      theVector = EDGEGEOM; 
+      return MED_NBR_GEOMETRIE_ARETE; 
+    case VISU::NODE_ENTITY: 
+      theVector = NODEGEOM; 
+      return MED_NBR_GEOMETRIE_NODE; 
     }
     return -1;
   }
   
-  int MEDGeom2NbNodes(int theMEDGeomType)
+
+  //---------------------------------------------------------------
+  int
+  MEDGeom2NbNodes(int theMEDGeomType)
   { 
     switch(theMEDGeomType){
-    case MED_NONE: return 0;
-    case MED_POINT1: return 1;
-    case MED_SEG2: return 2;
-    case MED_SEG3: return 3;
-    case MED_TRIA3: return 3;
-    case MED_TRIA6: return 6;
-    case MED_QUAD4: return 4;
-    case MED_QUAD8: return 8;
-    case MED_TETRA4: return 4;
-    case MED_TETRA10: return 10;
-    case MED_HEXA8: return 8;
-    case MED_HEXA20: return 20;
-    case MED_PENTA6: return 6;
-    case MED_PENTA15: return 15;
-    case MED_PYRA5: return 5;
-    case MED_PYRA13: return 13;
+    case SALOME_MED::MED_NONE: 
+      return 0;
+    case SALOME_MED::MED_POINT1: 
+      return 1;
+    case SALOME_MED::MED_SEG2: 
+      return 2;
+    case SALOME_MED::MED_SEG3: 
+      return 3;
+    case SALOME_MED::MED_TRIA3: 
+      return 3;
+    case SALOME_MED::MED_TRIA6: 
+      return 6;
+    case SALOME_MED::MED_QUAD4: 
+      return 4;
+    case SALOME_MED::MED_QUAD8: 
+      return 8;
+    case SALOME_MED::MED_TETRA4: 
+      return 4;
+    case SALOME_MED::MED_TETRA10: 
+      return 10;
+    case SALOME_MED::MED_HEXA8: 
+      return 8;
+    case SALOME_MED::MED_HEXA20: 
+      return 20;
+    case SALOME_MED::MED_PENTA6: 
+      return 6;
+    case SALOME_MED::MED_PENTA15: 
+      return 15;
+    case SALOME_MED::MED_PYRA5: 
+      return 5;
+    case SALOME_MED::MED_PYRA13: 
+      return 13;
     }
     return -1;
   }
   
-  int MEDGeomToVTK(medGeometryElement theMEDGeomType)
+
+  //---------------------------------------------------------------
+  VISU::EGeometry
+  MEDGeom2VISU(SALOME_MED::medGeometryElement theGeom)
   { 
-    switch(theMEDGeomType){
-    case MED_NONE: return VTK_EMPTY_CELL;
-    case MED_POINT1: return VTK_VERTEX;
-    case MED_SEG2: return VTK_LINE;
-    case MED_SEG3: return VTK_LINE;
-    case MED_TRIA3: return VTK_TRIANGLE;
-    case MED_TRIA6: return VTK_TRIANGLE;
-    case MED_QUAD4: return VTK_QUAD;
-    case MED_QUAD8: return VTK_QUAD;
-    case MED_TETRA4: return VTK_TETRA;
-    case MED_TETRA10: return VTK_TETRA;
-    case MED_HEXA8: return VTK_HEXAHEDRON;
-    case MED_HEXA20: return VTK_HEXAHEDRON;
-    case MED_PENTA6: return VTK_WEDGE;
-    case MED_PENTA15: return VTK_WEDGE;
-    case MED_PYRA5: return VTK_PYRAMID;
-    case MED_PYRA13: return VTK_PYRAMID;
+    switch(theGeom){
+    case SALOME_MED::MED_POINT1:
+      return VISU::ePOINT1;
+    case SALOME_MED::MED_SEG2: 
+      return VISU::eSEG2;
+    case SALOME_MED::MED_SEG3: 
+      return VISU::eSEG3;
+    case SALOME_MED::MED_TRIA3: 
+      return VISU::eTRIA3;
+    case SALOME_MED::MED_TRIA6: 
+      return VISU::eTRIA6;
+    case SALOME_MED::MED_QUAD4: 
+      return VISU::eQUAD4;
+    case SALOME_MED::MED_QUAD8: 
+      return VISU::eQUAD8;
+    case SALOME_MED::MED_TETRA4: 
+      return VISU::eTETRA4;
+    case SALOME_MED::MED_TETRA10: 
+      return VISU::eTETRA10;
+    case SALOME_MED::MED_HEXA8: 
+      return VISU::eHEXA8;
+    case SALOME_MED::MED_HEXA20: 
+      return VISU::eHEXA20;
+    case SALOME_MED::MED_PENTA6: 
+      return VISU::ePENTA6;
+    case SALOME_MED::MED_PENTA15: 
+      return VISU::ePENTA15;
+    case SALOME_MED::MED_PYRA5: 
+      return VISU::ePYRA5;
+    case SALOME_MED::MED_PYRA13: 
+      return VISU::ePYRA13;
+    case SALOME_MED::MED_POLYGON: 
+      return VISU::ePOLYGONE;
+    case SALOME_MED::MED_POLYHEDRA: 
+      return VISU::ePOLYEDRE;
     }
-    return -1;
+    return VISU::eNONE;
   }
   
-  int VTKGeom2NbNodes(int theVTKGeomType)
+  //---------------------------------------------------------------
+  SALOME_MED::medGeometryElement 
+  VISUGeomToMED(int theGeom)
   { 
-    switch(theVTKGeomType){
-    case VTK_VERTEX: return 1;
-    case VTK_LINE: return 2;
-    case VTK_TRIANGLE: return 3;
-    case VTK_QUAD: return 4;
-    case VTK_TETRA: return 4;
-    case VTK_HEXAHEDRON: return 8;
-    case VTK_WEDGE: return 6;
-    case VTK_PYRAMID: return 5;
+    switch(theGeom){
+    case VISU::ePOINT1: 
+      return SALOME_MED::MED_POINT1;
+    case VISU::eSEG2: 
+      return SALOME_MED::MED_SEG2;
+    case VISU::eTRIA3: 
+      return SALOME_MED::MED_TRIA3;
+    case VISU::eQUAD4: 
+      return SALOME_MED::MED_QUAD4;
+    case VISU::eTETRA4: 
+      return SALOME_MED::MED_TETRA4;
+    case VISU::eHEXA8: 
+      return SALOME_MED::MED_HEXA8;
+    case VISU::ePENTA6: 
+      return SALOME_MED::MED_PENTA6;
+    case VISU::ePYRA5: 
+      return SALOME_MED::MED_PYRA5;
+
+    case VISU::eSEG3: 
+      return SALOME_MED::MED_SEG3;
+    case VISU::eTRIA6: 
+      return SALOME_MED::MED_TRIA6;
+    case VISU::eQUAD8: 
+      return SALOME_MED::MED_QUAD8;
+    case VISU::eTETRA10: 
+      return SALOME_MED::MED_TETRA10;
+    case VISU::eHEXA20: 
+      return SALOME_MED::MED_HEXA20;
+    case VISU::ePENTA15: 
+      return SALOME_MED::MED_PENTA15;
+    case VISU::ePYRA13: 
+      return SALOME_MED::MED_PYRA13;
+    case VISU::ePOLYGONE: 
+      return SALOME_MED::MED_POLYGON;
+    case VISU::ePOLYEDRE: 
+      return  SALOME_MED::MED_POLYHEDRA;
     }
-    return -1;
+    return SALOME_MED::medGeometryElement(-1);
   }
-  
-  medGeometryElement VTKGeomToMED(int theVTKGeomType)
+
+  //---------------------------------------------------------------
+  SALOME_MED::medGeometryElement 
+  VTKGeomToMED(int theVTKGeomType)
   { 
     switch(theVTKGeomType){
-    case VTK_VERTEX: return MED_POINT1;
-    case VTK_LINE: return MED_SEG2;
-    case VTK_TRIANGLE: return MED_TRIA3;
-    case VTK_QUAD: return MED_QUAD4;
-    case VTK_TETRA: return MED_TETRA4;
-    case VTK_HEXAHEDRON: return MED_HEXA8;
-    case VTK_WEDGE: return MED_PENTA6;
-    case VTK_PYRAMID: return MED_PYRA5;
+    case VTK_VERTEX: 
+      return SALOME_MED::MED_POINT1;
+    case VTK_LINE: 
+      return SALOME_MED::MED_SEG2;
+    case VTK_TRIANGLE:
+      return SALOME_MED::MED_TRIA3;
+    case VTK_QUAD: 
+      return SALOME_MED::MED_QUAD4;
+    case VTK_TETRA: 
+      return SALOME_MED::MED_TETRA4;
+    case VTK_HEXAHEDRON: 
+      return SALOME_MED::MED_HEXA8;
+    case VTK_WEDGE:
+      return SALOME_MED::MED_PENTA6;
+    case VTK_PYRAMID: 
+      return SALOME_MED::MED_PYRA5;
+    case VTK_POLYGON: 
+      return SALOME_MED::MED_POLYGON;
     }
-    return medGeometryElement(-1);
+    return SALOME_MED::medGeometryElement(-1);
   }
   
-  VISU::TEntity MEDEntityToVTK(medEntityMesh theMEDEntity)
+  //---------------------------------------------------------------
+  VISU::TEntity
+  MEDEntityToVTK(SALOME_MED::medEntityMesh theMEDEntity)
   {
     switch(theMEDEntity){
-    case MED_NODE: return NODE_ENTITY;
-    case MED_EDGE: return EDGE_ENTITY;
-    case MED_FACE: return FACE_ENTITY;
-    case MED_CELL: return CELL_ENTITY;
+    case SALOME_MED::MED_NODE: 
+      return VISU::NODE_ENTITY;
+    case SALOME_MED::MED_EDGE: 
+      return VISU::EDGE_ENTITY;
+    case SALOME_MED::MED_FACE: 
+      return VISU::FACE_ENTITY;
+    case SALOME_MED::MED_CELL: 
+      return VISU::CELL_ENTITY;
     }
     return VISU::TEntity(-1);
   }
   
-  medEntityMesh VTKEntityToMED(VISU::TEntity theVTKEntity)
+  //---------------------------------------------------------------
+  SALOME_MED::medEntityMesh 
+  VTKEntityToMED(VISU::TEntity theVTKEntity)
   {
     switch(theVTKEntity){
-    case NODE_ENTITY: return MED_NODE;
-    case EDGE_ENTITY: return MED_EDGE;
-    case FACE_ENTITY: return MED_FACE;
-    case CELL_ENTITY: return MED_CELL;
+    case VISU::NODE_ENTITY: 
+      return SALOME_MED::MED_NODE;
+    case VISU::EDGE_ENTITY: 
+      return SALOME_MED::MED_EDGE;
+    case VISU::FACE_ENTITY: 
+      return SALOME_MED::MED_FACE;
+    case VISU::CELL_ENTITY: 
+      return SALOME_MED::MED_CELL;
     }
-    return medEntityMesh(-1);
+    return SALOME_MED::medEntityMesh(-1);
   }
+
   
-  string GetSObjectName(SALOMEDS::SObject_ptr aSObject){
+  //---------------------------------------------------------------
+  std::string 
+  GetSObjectName(SALOMEDS::SObject_ptr aSObject)
+  {
     SALOMEDS::GenericAttribute_var anAttr;
     if (aSObject->FindAttribute(anAttr,"AttributeName")) {
       SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
@@ -226,84 +339,292 @@ namespace{
     return "";
   }
   
+
+  //---------------------------------------------------------------
   void 
-  GetCellsSize(vtkIdType& theNbCells, vtkIdType& theCellsSize,
-              SALOME_MED::MESH_ptr theMEDMesh,
-              const VISU::TEntity& theVEntity)
+  GetCellsSize(vtkIdType& theNbCells, 
+               vtkIdType& theCellsSize,
+               SALOME_MED::MESH_ptr theMEDMesh,
+               const VISU::TEntity& theVEntity)
   {
-    medGeometryElement* aGeomElems;
     theNbCells = theCellsSize = 0;
-    int iGeomEnd = GetEntity2Geom(theVEntity,aGeomElems);
-    const medEntityMesh& aMEntity = VTKEntityToMED(theVEntity);
     if(MYDEBUG) MESSAGE("GetCellsSize - theVEntity = "<<theVEntity);
-      for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
-       medGeometryElement aMEDGeom = aGeomElems[iGeom];
-       int iNumElemEnd = theMEDMesh->getNumberOfElements(aMEntity,aMEDGeom);
-       if(iNumElemEnd > 0){
-         if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
-         theCellsSize += iNumElemEnd*(MEDGeom2NbNodes(aMEDGeom) + 1);
-         theNbCells += iNumElemEnd;
-       }
+    const SALOME_MED::medEntityMesh& aMEntity = VTKEntityToMED(theVEntity);
+    SALOME_MED::MESH::connectivityInfos_var connInfo=theMEDMesh->getConnectGlobal(aMEntity);
+    int iGeomEnd = connInfo->meshTypes.length();
+    for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
+      int iNumElemEnd = connInfo->numberOfElements[iGeom];
+      if(iNumElemEnd > 0){
+        if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
+        theCellsSize += iNumElemEnd + connInfo->nodalConnectivityLength[iGeom];
+        theNbCells += iNumElemEnd;
       }
+    }
   }
   
   
+  //---------------------------------------------------------------
   void 
-  GetCellsSize(vtkIdType& theNbCells, vtkIdType& theCellsSize,
-              SALOME_MED::FAMILY_ptr theMEDFamily)
+  GetCellsSize(vtkIdType& theNbCells, 
+               vtkIdType& theCellsSize,
+               SALOME_MED::FAMILY_ptr theMEDFamily)
   {
-    medGeometryElement_array_var aGeom = theMEDFamily->getTypes();
-    int iGeomEnd = aGeom->length();
     theNbCells = theCellsSize = 0;
+    SALOME_MED::SUPPORT::supportInfos_var suppInfo=theMEDFamily->getSupportGlobal();
+    int iGeomEnd = suppInfo->types.length();
     if(MYDEBUG) MESSAGE("GetCellsSize - iGeomEnd = "<<iGeomEnd);
     for(int iGeom = 0; iGeom < iGeomEnd; iGeom++) {
-      medGeometryElement aMEDGeom = aGeom[iGeom];
-      long_array_var aCellNumForType = theMEDFamily->getNumber(aMEDGeom);
-      int iNumElemEnd = aCellNumForType->length();
+      int iNumElemEnd = suppInfo->nbEltTypes[iGeom];
       if(iNumElemEnd > 0){
-       if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
-       theNbCells += iNumElemEnd;
-       theCellsSize += iNumElemEnd*(MEDGeom2NbNodes(aMEDGeom) + 1);
+        if(MYDEBUG) MESSAGE("GetCellsSize - iNumElemEnd = "<<iNumElemEnd);
+        theNbCells += iNumElemEnd;
+        theCellsSize += iNumElemEnd + suppInfo->nodalConnectivityLength[iGeom];
       }
     }
   }
   
   
+  //---------------------------------------------------------------
   void
   GetCellsSize(VISU::PCMesh theMesh, 
-              SALOME_MED::MESH_ptr theMEDMesh, 
-              const VISU::TEntity& theEntity)
+               SALOME_MED::MESH_ptr theMEDMesh, 
+               const VISU::TEntity& theEntity)
   {
-    TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap;
+    VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap;
     VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[theEntity];
-    if(theEntity == NODE_ENTITY){
-      theMesh->myNbPoints = theMEDMesh->getNumberOfNodes();
+    if(theEntity == VISU::NODE_ENTITY){
       aMeshOnEntity->myNbCells = theMesh->myNbPoints;
       aMeshOnEntity->myCellsSize = 2*theMesh->myNbPoints;
-      vtkIdType aNbCells, aCellsSize;
-      GetCellsSize(aNbCells,aCellsSize,theMEDMesh,CELL_ENTITY);
-      if(aNbCells > 0){
-       
-       TMeshOnEntityMap::iterator aIter = aMeshOnEntityMap.find(CELL_ENTITY);
-       if (aIter != aMeshOnEntityMap.end()){
-         VISU::PCMeshOnEntity aMeshOnCells = aIter->second;
-       
-         aMeshOnCells->myEntity = VISU::CELL_ENTITY;
-         aMeshOnCells->myMeshName = theMesh->myName;
-         aMeshOnCells->myNbCells = aNbCells;
-         aMeshOnCells->myCellsSize = aCellsSize;
-       }
-      }
     }else{
       GetCellsSize(aMeshOnEntity->myNbCells,aMeshOnEntity->myCellsSize,theMEDMesh,theEntity);
     }
   }
+
+  //---------------------------------------------------------------
+  VISU::PCMeshOnEntity 
+  InitMeshOnEntity(const VISU::PCMesh& theMesh,
+                   const VISU::TEntity& theEntity,
+                   const VISU::PCMeshOnEntity& theMeshOnEntity)
+  {
+    VISU::PCMeshOnEntity aMeshOnEntity;
+    VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap;
+    VISU::TMeshOnEntityMap::const_iterator anIter = aMeshOnEntityMap.find(theEntity);
+    if(anIter == aMeshOnEntityMap.end()){
+      aMeshOnEntity.reset(new VISU::TCMeshOnEntity());
+      *aMeshOnEntity = *theMeshOnEntity;
+      aMeshOnEntity->myEntity = theEntity;
+      aMeshOnEntityMap[theEntity] = aMeshOnEntity;
+    }else
+      aMeshOnEntity = anIter->second;
+
+    GetCellsSize(theMesh,theMesh->myMesh,theEntity);
+
+    return aMeshOnEntity;
+  }
+
+  
+  VISU::PCSubProfile
+  CrSubProfile(const VISU::PCMesh theMesh,
+               const VISU::PCField theField,
+               const VISU::TCMeshOnEntity& theMeshOnEntity,
+               SALOME_MED::medGeometryElement theMGeom,
+               int theNbElems)
+  {
+    if (MYDEBUG) MESSAGE("CrSubProfile");
+    VISU::EGeometry aEGeom = MEDGeom2VISU(theMGeom);
+    vtkIdType aVNbNodes = VISUGeom2NbNodes(aEGeom);
+
+    VISU::PCSubProfile aSubProfile(new VISU::TCSubProfile());
+    aSubProfile->myGeom = aEGeom;
+    aSubProfile->myMGeom = theMGeom;
+    aSubProfile->myStatus = VISU::eAddAll;
+    if(MYDEBUG) MESSAGE("theMGeom = "<<theMGeom);
+    const VISU::TCellsFirstIndex& aCellsFirstIndex = theMeshOnEntity.myCellsFirstIndex;
+    VISU::TCellsFirstIndex::const_iterator aTimeStampIter = aCellsFirstIndex.find(theMGeom);
+    if(aTimeStampIter == (theMeshOnEntity.myCellsFirstIndex).end() && 
+       theMGeom != SALOME_MED::MED_POINT1)
+      aSubProfile->myStatus = VISU::eRemoveAll;
+    else if(aTimeStampIter == aCellsFirstIndex.end() && theMGeom == SALOME_MED::MED_POINT1){
+      if(theNbElems > 0){
+        aSubProfile->myName = "";
+        aSubProfile->myStatus = VISU::eAddPart;
+        
+        aSubProfile->myNbCells = theNbElems;
+        aSubProfile->myCellsSize = aSubProfile->myNbCells;
+      }
+    }else{
+        if(theNbElems > 0){
+          aSubProfile->myName = "";
+          aSubProfile->myStatus = VISU::eAddPart;
+          
+          aSubProfile->myNbCells = theNbElems;
+          aSubProfile->myCellsSize = aSubProfile->myNbCells*aVNbNodes;
+        }
+      }
+    
+    if (MYDEBUG) MESSAGE("CrSubProfile done");
+    return aSubProfile;
+  }
+
+  VISU::TProfileKey
+  GetProfileKey(const VISU::PCMesh theMesh,
+                const VISU::PCField theField,
+                const VISU::PCValForTime theValForTime,
+                const VISU::TCMeshOnEntity& theMeshOnEntity)
+  {
+    if (MYDEBUG) MESSAGE("GetProfileKey");
+
+    VISU::TProfileKey aProfileKey;
+
+    const VISU::TCellsFirstIndex& aFirstIndex = theMeshOnEntity.myCellsFirstIndex;
+    VISU::TCellsFirstIndex::const_iterator anIter = aFirstIndex.begin();
+    SALOME_MED::SUPPORT_var aSupport = theValForTime->myField->getSupport();
+    int aNbElems = 0;
+    if(anIter == aFirstIndex.end() && aSupport->getEntity() == SALOME_MED::MED_NODE){
+      SALOME_MED::medGeometryElement aMGeom = SALOME_MED::MED_POINT1;
+      try{
+        aNbElems = aSupport->getNumberOfElements(SALOME_MED::MED_NONE);
+        if(MYDEBUG)MESSAGE("aMGeom="<<aMGeom<<"   aNbElems="<<aNbElems);
+      }catch(...){
+        MESSAGE("Error in theValForTime->myField->getSupport()->getNumberOfElements(aMGeom);");
+      }
+        
+      VISU::PCSubProfile aSubProfile = CrSubProfile(theMesh,
+                                                    theField,
+                                                    theMeshOnEntity,
+                                                    aMGeom,
+                                                    aNbElems);
+      aProfileKey.insert(aSubProfile);
+    }
+    
+    for(; anIter != aFirstIndex.end(); anIter++){
+      SALOME_MED::medGeometryElement aMGeom = anIter->first;
+      try{
+        aNbElems = aSupport->getNumberOfElements(aMGeom);
+        if(MYDEBUG)MESSAGE("aMGeom="<<aMGeom<<"   aNbElems="<<aNbElems);
+      } catch(...){
+        MESSAGE("Error in theValForTime->myField->getSupport()->getNumberOfElements(aMGeom);");
+        continue;
+      }
+      VISU::PCSubProfile aSubProfile = CrSubProfile(theMesh,
+                                                    theField,
+                                                    theMeshOnEntity,
+                                                    aMGeom,
+                                                    aNbElems);
+      aProfileKey.insert(aSubProfile);
+    }
+
+    if (MYDEBUG) MESSAGE("GetProfileKey done");
+    return aProfileKey;
+  }
   
+  void
+  InitProfile(VISU::PCMesh theMesh,
+              VISU::PCField theField,
+              VISU::PCValForTime theValForTime,
+              VISU::TCMeshOnEntity& theMeshOnEntity)
+  {
+    if (MYDEBUG) MESSAGE("InitProfile");
+    
+    VISU::TProfileMap& aProfileMap = theMeshOnEntity.myProfileMap;
+
+    VISU::TProfileKey aProfileKey = GetProfileKey(theMesh,
+                                                  theField,
+                                                  theValForTime,
+                                                  theMeshOnEntity);
+    
+    VISU::TProfileMap::const_iterator anIter = aProfileMap.find(aProfileKey);
+    if(anIter != aProfileMap.end()){
+      theValForTime->myProfile = anIter->second;
+      if(MYDEBUG) MESSAGE("aProfileMap.find(aProfileKey) aProfile->myGeom=");
+    }else{
+      VISU::PCProfile aProfile(new VISU::TCProfile());
+      VISU::TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile;
+      
+      VISU::TProfileKey::const_iterator anIter = aProfileKey.begin();
+      for(; anIter != aProfileKey.end(); anIter++){
+        VISU::PCSubProfile aSubProfile(*anIter);
+        
+        if(aProfile->myIsAll && aSubProfile->myStatus != VISU::eAddAll)
+          aProfile->myIsAll = false;
+        
+        VISU::EGeometry aEGeom = aSubProfile->myGeom;
+        aGeom2SubProfile[aEGeom] = aSubProfile;
+      }
+      
+      aProfileMap[aProfileKey] = aProfile;
+      theValForTime->myProfile = aProfile;
+    }
+    if (MYDEBUG) MESSAGE("InitProfile done");
+  }
+
+  void
+  LoadProfile(VISU::PCMesh theMesh,
+              VISU::PCField theField,
+              VISU::PCValForTime theValForTime,
+              VISU::PCMeshOnEntity theMeshOnEntity)
+  {
+    VISU::PCProfile aProfile = theValForTime->myProfile;
+    if (MYDEBUG) MESSAGE("LoadProfile aProfile->myIsDone="<<aProfile->myIsDone);
+    if(aProfile->myIsDone)
+      return;
+    
+    const VISU::TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile;
+    VISU::TGeom2SubProfile::const_iterator aGeom2SubProfileIter = aGeom2SubProfile.begin();
+    if(aGeom2SubProfileIter == aGeom2SubProfile.end()){
+      MESSAGE("Warning! No geom 2 sub profile");
+    }
+    SALOME_MED::SUPPORT_var aSupport = theValForTime->myField->getSupport();
+    for(; aGeom2SubProfileIter != aGeom2SubProfile.end(); aGeom2SubProfileIter++){
+      VISU::EGeometry aEGeom = aGeom2SubProfileIter->first;
+      SALOME_MED::medGeometryElement aMGeom = VISUGeomToMED(aEGeom);
+      VISU::PCSubProfile aSubProfile = aGeom2SubProfileIter->second;
+      SALOME_MED::long_array_var aGeom2ProfileIds;
+      std::vector<int> aGeom2Profile;
+      if(!aSupport->isOnAllElements()){
+        try{
+          if(aMGeom == SALOME_MED::MED_POINT1)
+            aGeom2ProfileIds = aSupport->getNumberFromFile(SALOME_MED::MED_NONE);
+          else
+            aGeom2ProfileIds = aSupport->getNumberFromFile(aMGeom);
+          int aLen = aGeom2ProfileIds->length();
+          if(MYDEBUG) MESSAGE_BEGIN(" - aMGeom="<<aMGeom<<"; aNbCells="<<aLen);
+          for(int i = 0; i < aLen; i++){
+            int anId = aGeom2ProfileIds[i];
+            aGeom2Profile.push_back(anId);
+            if(MYDEBUG) MESSAGE_ADD(std::endl << "------------------------------->" << anId);
+          }
+          if(MYDEBUG) MESSAGE_END(" ");
+        } catch(...) {
+          continue;
+        }
+      } else {
+        SALOME_MED::medEntityMesh aMEntity = aSupport->getEntity();
+        int aNbElems = theMesh->myMesh->getNumberOfElements(aMEntity,aMGeom);
+        for(int i = 0; i < aNbElems; i++) 
+          aGeom2Profile.push_back(i+1);
+      }
+      if(aGeom2Profile.size()>0){
+        VISU::TSubMeshID& aSubMeshID = aSubProfile->mySubMeshID;
+        int aSize = aGeom2Profile.size();
+        aSubMeshID.resize(aSize);
+        for(int anId = 0; anId < aSize; anId++){
+          aSubMeshID[anId] = aGeom2Profile[anId] - 1;
+        }
+      }
+    }
+    
+    aProfile->myIsDone = true;
+    if (MYDEBUG) MESSAGE("LoadProfile done");
+  }
 }
 
 
+//---------------------------------------------------------------
 VISU_Convertor* 
-VISU_MEDFieldConvertor::Build()
+VISU_MEDFieldConvertor
+::Build()
 {
   if(myField->_is_nil()) 
     throw std::runtime_error("VISU_MEDFieldConvertor::Build >> myField->_is_nil() !!!");
@@ -313,7 +634,7 @@ VISU_MEDFieldConvertor::Build()
     throw std::runtime_error("VISU_MEDFieldConvertor::Build >> aMEDSupport->_is_nil() !!!");
 
   SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-  TEntity aVEntity = MEDEntityToVTK(aMEntity);
+  VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
   SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh();
   if(aMEDMesh->_is_nil()) 
     throw std::runtime_error("VISU_MEDFieldConvertor::Build >> aMEDMesh->_is_nil() !!!");
@@ -321,64 +642,72 @@ VISU_MEDFieldConvertor::Build()
   CORBA::String_var aMeshName = aMEDMesh->getName();
   CORBA::String_var aFieldName = myField->getName();
 
-  PCMesh aMesh = myMeshMap[aMeshName.in()](new TCMesh());
+  VISU::PCMesh aMesh = myMeshMap[aMeshName.in()](new VISU::TCMesh());
+  aMesh->myNamedPointCoords(new VISU::TNamedPointCoords());
+  aMesh->myNbPoints = aMEDMesh->getNumberOfNodes();
   aMesh->myDim = aMEDMesh->getSpaceDimension();
-  aMesh->myPointsDim.resize(aMesh->myDim);
   aMesh->myName = aMeshName.in();
   aMesh->myMesh = aMEDMesh;
 
   if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh->myDim);
 
-  TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
-  PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[aVEntity](new TCMeshOnEntity());
+  VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
+  VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[aVEntity](new VISU::TCMeshOnEntity());
   aMeshOnEntity->myEntity = aVEntity;
   aMeshOnEntity->myMeshName = aMeshName.in();
   aMeshOnEntity->mySupport = aMEDSupport;
 
-  if(aVEntity == NODE_ENTITY){
-    PCMeshOnEntity aMeshOnEntity2 = aMeshOnEntityMap[CELL_ENTITY](new TCMeshOnEntity());
-    *aMeshOnEntity2 = *aMeshOnEntity;
-    aMeshOnEntity->myEntity = CELL_ENTITY;
-    GetCellsSize(aMesh,aMEDMesh,CELL_ENTITY);
-  }else{
-    PCMeshOnEntity aMeshOnEntity2 = aMeshOnEntityMap[NODE_ENTITY](new TCMeshOnEntity());
-    *aMeshOnEntity2 = *aMeshOnEntity;
-    aMeshOnEntity->myEntity = NODE_ENTITY;
-    GetCellsSize(aMesh,aMEDMesh,NODE_ENTITY);
-  }
-  GetCellsSize(aMesh,aMEDMesh,aVEntity);
+  if(aVEntity == VISU::NODE_ENTITY)
+    ::InitMeshOnEntity(aMesh, VISU::CELL_ENTITY, aMeshOnEntity);
+  else
+    ::InitMeshOnEntity(aMesh, VISU::NODE_ENTITY, aMeshOnEntity);
 
-  TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
-  PCField aField = aFieldMap[aFieldName.in()](new TCField());
+  ::GetCellsSize(aMesh, aMEDMesh, aVEntity);
+
+  VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
+  VISU::PCField aField = aFieldMap[aFieldName.in()](new VISU::TCField());
   aField->myId = myField->getOrderNumber();
   aField->myName = aFieldName.in();
   aField->myEntity = aVEntity;
   aField->myMeshName = aMeshName.in();
-  aField->myNbComp = myField->getNumberOfComponents();
   aField->myDataSize = aMeshOnEntity->myNbCells * aField->myNbComp;
-  aField->myCompNames.resize(aField->myNbComp);
-  aField->myUnitNames.resize(aField->myNbComp);
+
+  vtkIdType aDataType = VTK_DOUBLE;
+  SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(myField);
+  if(aFieldDouble->_is_nil()) {
+    // PAL18313: Mandriva 64 porting: CRASH at creating presentation on "Import Structure".
+    if (sizeof(long) == 4 ) // Size of CORBA::Long is always 4 (see CORBA_basetypes.h)
+      aDataType = VTK_LONG;
+    else if (sizeof(int) == 4)
+      aDataType = VTK_INT;
+    else {
+      throw std::runtime_error("Can't map CORBA::Long to a VTK type");
+    }
+  }
+  aField->Init(myField->getNumberOfComponents(), aDataType);
 
   if(MYDEBUG) MESSAGE("VISU_MEDFieldConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh->myDim);
 
-  TValField& aValField = aField->myValField;
+  VISU::TValField& aValField = aField->myValField;
   int anId = myField->getIterationNumber();
-  PCValForTime aValForTime = aValField[anId](new TCValForTime());
+  VISU::PCValForTime aValForTime = aValField[anId](new VISU::TCValForTime());
   aValForTime->myId = anId;
   CORBA::Double aDT = myField->getTime();
-  aValForTime->myTime = TTime(aDT,"");
+  aValForTime->myTime = VISU::TTime(aDT,"");
   aValForTime->myField = myField;
 
   if(MYDEBUG) 
     MESSAGE("VISU_MEDFieldConvertor::Build - aFieldName = '"<<aFieldName<<
-           "'; myId = "<<anId<<"; myTime = "<<aDT);
+            "'; myId = "<<anId<<"; myTime = "<<aDT);
 
   return this;
 }
 
 
+//---------------------------------------------------------------
 VISU_Convertor* 
-VISU_MEDConvertor::Build() 
+VISU_MEDConvertor
+::Build() 
 {
   if(mySObject->_is_nil()) 
     throw std::runtime_error("VISU_MEDConvertor::Build >> mySObject->_is_nil() !!!");
@@ -394,11 +723,14 @@ VISU_MEDConvertor::Build()
   return Build(aTimeStampIterator);
 }
 
-namespace{
 
+namespace
+{
   using namespace boost;
 
-  struct TSObjectByName{
+  //---------------------------------------------------------------
+  struct TSObjectByName
+  {
     std::string myName;
     typedef tuple<SALOMEDS::SObject_var> TRet;
 
@@ -410,18 +742,21 @@ namespace{
     {
       SALOMEDS::GenericAttribute_var anAttr;
       if(theSObj->FindAttribute(anAttr,"AttributeName")){
-       SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
-       CORBA::String_var aValue = aName->Value();
-       theIsSuccess = (myName == aValue.in());
-       if(theIsSuccess)
-         return TRet(SALOMEDS::SObject::_duplicate(theSObj));
+        SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
+        CORBA::String_var aValue = aName->Value();
+        theIsSuccess = (myName == aValue.in());
+        if(theIsSuccess)
+          return TRet(SALOMEDS::SObject::_duplicate(theSObj));
       }
       return TRet();
     }
 
   };
 
-  struct TMeshByName{
+
+  //---------------------------------------------------------------
+  struct TMeshByName
+  {
     std::string myName;
     typedef tuple<SALOME_MED::MESH_var,SALOMEDS::SObject_var> TRet;
 
@@ -433,18 +768,20 @@ namespace{
     {
       CORBA::Object_var anObj = VISU::SObjectToObject(theSObj);
       if(!CORBA::is_nil(anObj)){
-       SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
-       if(!CORBA::is_nil(aMesh)){
-         CORBA::String_var aName = aMesh->getName();
-         theIsSuccess = (myName == aName.in());
-         if(theIsSuccess)
-           return TRet(aMesh,SALOMEDS::SObject::_duplicate(theSObj));
-       }
+        SALOME_MED::MESH_var aMesh = SALOME_MED::MESH::_narrow(anObj);
+        if(!CORBA::is_nil(aMesh)){
+          CORBA::String_var aName = aMesh->getName();
+          theIsSuccess = (myName == aName.in());
+          if(theIsSuccess)
+            return TRet(aMesh,SALOMEDS::SObject::_duplicate(theSObj));
+        }
       }
       return TRet();
     }
   };
 
+
+  //---------------------------------------------------------------
   template<typename TFun>
   typename TFun::TRet
   Find(SALOMEDS::SObject_ptr theStartSObj, 
@@ -459,15 +796,18 @@ namespace{
       SALOMEDS::SObject_var aSObj = anIter->Value();
       typename TFun::TRet aRet = theFun(aSObj,theIsSuccess);
       if(theIsSuccess)
-       return aRet;
+        return aRet;
     }
     return typename TFun::TRet();
   }
 
 }
 
+
+//---------------------------------------------------------------
 VISU_Convertor* 
-VISU_MEDConvertor::Build(SALOME_MED::MED_ptr theMED)
+VISU_MEDConvertor
+::Build(SALOME_MED::MED_ptr theMED)
 {
   if(CORBA::is_nil(theMED)) 
     return NULL;
@@ -490,21 +830,22 @@ VISU_MEDConvertor::Build(SALOME_MED::MED_ptr theMED)
       anIsSuccess = false;
       CORBA::String_var aMeshName = aMeshNames[iMesh];
       TMeshByName::TRet aMeshByNameRet = 
-       Find(aMeshesSObj,aStudy,TMeshByName(aMeshName.in()),anIsSuccess);
+        Find(aMeshesSObj,aStudy,TMeshByName(aMeshName.in()),anIsSuccess);
       if(MYDEBUG) 
-       MESSAGE("VISU_MEDConvertor::Build - Find aMeshName('"<<aMeshName.in()<<"') = "<<anIsSuccess);
+        MESSAGE("VISU_MEDConvertor::Build - Find aMeshName('"<<aMeshName.in()<<"') = "<<anIsSuccess);
       if(!anIsSuccess)
-       continue;
+        continue;
 
-      PCMesh aMesh = myMeshMap[aMeshName.in()](new TCMesh());
+      VISU::PCMesh aMesh = myMeshMap[aMeshName.in()](new VISU::TCMesh());
       SALOME_MED::MESH_var aMEDMesh = boost::get<0>(aMeshByNameRet);
+      aMesh->myNamedPointCoords(new VISU::TNamedPointCoords());
+      aMesh->myNbPoints = aMEDMesh->getNumberOfNodes();
       aMesh->myDim = aMEDMesh->getSpaceDimension();
       aMesh->myName = aMeshName.in();
-      aMesh->myPointsDim.resize(aMesh->myDim);
       aMesh->myMesh = aMEDMesh;
 
       if(MYDEBUG) 
-       MESSAGE("VISU_MEDConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh->myDim);
+        MESSAGE("VISU_MEDConvertor::Build - aMeshName = "<<aMeshName<<"; myDim = "<<aMesh->myDim);
 
       std::string aName = aMeshName.in();
       std::replace(aName.begin(),aName.end(),' ','_');
@@ -514,165 +855,167 @@ VISU_MEDConvertor::Build(SALOME_MED::MED_ptr theMED)
       aStream<<"MEDSUPPORTS_OF_"<<aName;
       std::string aSupportsName(aStream.str());
       TSObjectByName::TRet aSObjectByNameRet = 
-       Find(aMeshesSObj,aStudy,TSObjectByName(aSupportsName.c_str()),anIsSuccess);
+        Find(aMeshesSObj,aStudy,TSObjectByName(aSupportsName.c_str()),anIsSuccess);
       if(MYDEBUG) 
-       MESSAGE("VISU_MEDConvertor::Build - Find aSupportsName('"<<aSupportsName<<"') = "<<anIsSuccess);
+        MESSAGE("VISU_MEDConvertor::Build - Find aSupportsName('"<<aSupportsName<<"') = "<<anIsSuccess);
       if(!anIsSuccess)
-       continue;
+        continue;
 
-      TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
+      VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
       SALOMEDS::SObject_var aSupportsSObj = boost::get<0>(aSObjectByNameRet);
       SALOMEDS::ChildIterator_var aSupportIterator = aStudy->NewChildIterator(aSupportsSObj);
 
       // Fill all MeshOnEntity
       aSupportIterator->InitEx(true);
       for(; aSupportIterator->More(); aSupportIterator->Next()){
-       SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
-       
-       CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
-       if(CORBA::is_nil(aMedSupport)) 
-         continue;
-       
-       SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
-       if(aMEDSupport->_is_nil()) 
-         continue;
-       
-       SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
-       SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-       VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
-       CORBA::String_var aSupportName = aMEDSupport->getName();
-       
-       if(aMEDSupport->isOnAllElements() && strcmp(aSupportName.in(),"SupportOnAll_MED_") > 0){
-         if(MYDEBUG) 
-           MESSAGE("VISU_MEDConvertor::Build - Support isOnAllElements = '"<<aSupportName<<
-                   "' aVEntity = "<<aVEntity);
-         int aNbCells, aCellsSize;
-         //Check, if there is any data on the support?
-         if(aVEntity == NODE_ENTITY){
-           aMesh->myNbPoints = aMeshOnSupport->getNumberOfNodes();
-           aNbCells = aMesh->myNbPoints;
-           aCellsSize = 2*aMesh->myNbPoints;
-         }else
-           GetCellsSize(aNbCells,aCellsSize,aMeshOnSupport,aVEntity);
-         
-         if(aNbCells > 0){
-           PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[aVEntity](new TCMeshOnEntity());
-           aMeshOnEntity->myMeshName = aMeshName.in();
-           aMeshOnEntity->myEntity = aVEntity;
-           aMeshOnEntity->myNbCells = aNbCells;
-           aMeshOnEntity->myCellsSize = aCellsSize;
-           aMeshOnEntity->mySupport = aMEDSupport;
-         }
-       }
+        SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
+        
+        CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
+        if(CORBA::is_nil(aMedSupport)) 
+          continue;
+        
+        SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
+        if(aMEDSupport->_is_nil()) 
+          continue;
+        
+        SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
+        SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
+        VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
+        CORBA::String_var aSupportName = aMEDSupport->getName();
+        
+        if(aMEDSupport->isOnAllElements() && strcmp(aSupportName.in(),"SupportOnAll_MED_") > 0){
+          if(MYDEBUG) 
+            MESSAGE("VISU_MEDConvertor::Build - Support isOnAllElements = '"<<aSupportName<<
+                    "' aVEntity = "<<aVEntity);
+          vtkIdType aNbCells, aCellsSize;
+          //Check, if there is any data on the support?
+          if(aVEntity == VISU::NODE_ENTITY){
+            aMesh->myNbPoints = aMeshOnSupport->getNumberOfNodes();
+            aNbCells = aMesh->myNbPoints;
+            aCellsSize = 2*aMesh->myNbPoints;
+          }else
+            ::GetCellsSize(aNbCells,aCellsSize,aMeshOnSupport,aVEntity);
+          
+          if(aNbCells > 0){
+            if(aMeshOnEntityMap.find(aVEntity) == aMeshOnEntityMap.end()){
+              VISU::PCMeshOnEntity aMeshOnEntity(new VISU::TCMeshOnEntity());
+              aMeshOnEntity->myMeshName = aMeshName.in();
+              aMeshOnEntity->myEntity = aVEntity;
+              aMeshOnEntity->myNbCells = aNbCells;
+              aMeshOnEntity->myCellsSize = aCellsSize;
+              aMeshOnEntity->mySupport = aMEDSupport;
+              aMeshOnEntityMap[aVEntity] = aMeshOnEntity;
+            }
+          }
+        }
       }
 
       // Fill all Family
       aSupportIterator->InitEx(true);
       for(; aSupportIterator->More(); aSupportIterator->Next()){
-       SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
-       
-       CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
-       if(CORBA::is_nil(aMedSupport)) 
-         continue;
-       
-       SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
-       if(aMEDSupport->_is_nil()) 
-         continue;
-       
-       SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
-       SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-       VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
-       CORBA::String_var aSupportName = aMEDSupport->getName();
-       
-       SALOME_MED::FAMILY_var aMEDFamily = SALOME_MED::FAMILY::_narrow(aMedSupport);
-       if(!aMEDFamily->_is_nil()) {
-         TMeshOnEntityMap::iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(aVEntity);
-         if(aMeshOnEntityMapIter == aMeshOnEntityMap.end())
-           continue;
-         PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second;
-
-         int aNbCells = aMeshOnEntity->myNbCells, aCellsSize = aMeshOnEntity->myCellsSize;
-         CORBA::Boolean anIsOnAllElements = aMEDSupport->isOnAllElements();
-         if(!anIsOnAllElements)
-           GetCellsSize(aNbCells,aCellsSize,aMEDFamily);
-
-         if(MYDEBUG) 
-           MESSAGE("VISU_MEDConvertor::Build - aFamily = '"<<aSupportName<<
-                   "'; anIsOnAllElements = "<<anIsOnAllElements<<
-                   "; aVEntity = "<<aVEntity<<
-                   "; aNbCells = "<<aNbCells);
-
-         if(aNbCells > 0){
-           TFamilyMap& aFamilyMap = aMeshOnEntity->myFamilyMap;
-           PCFamily aFamily = aFamilyMap[aSupportName.in()](new TCFamily());
-           aFamily->myName = aSupportName.in();
-           aFamily->myEntity = aVEntity;
-           aFamily->myNbCells = aNbCells;
-           aFamily->myCellsSize = aCellsSize;
-           aFamily->myId = aMEDFamily->getIdentifier();
-           aFamily->myFamily = aMEDFamily;
-         }
-       }
+        SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
+        
+        CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
+        if(CORBA::is_nil(aMedSupport)) 
+          continue;
+        
+        SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
+        if(aMEDSupport->_is_nil()) 
+          continue;
+        
+        SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
+        SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
+        VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
+        CORBA::String_var aSupportName = aMEDSupport->getName();
+        
+        SALOME_MED::FAMILY_var aMEDFamily = SALOME_MED::FAMILY::_narrow(aMedSupport);
+        if(!aMEDFamily->_is_nil()) {
+          VISU::TMeshOnEntityMap::iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(aVEntity);
+          if(aMeshOnEntityMapIter == aMeshOnEntityMap.end())
+            continue;
+          VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second;
+
+          vtkIdType aNbCells = aMeshOnEntity->myNbCells, aCellsSize = aMeshOnEntity->myCellsSize;
+          CORBA::Boolean anIsOnAllElements = aMEDSupport->isOnAllElements();
+          if(!anIsOnAllElements)
+            ::GetCellsSize(aNbCells,aCellsSize,aMEDFamily);
+
+          if(MYDEBUG) 
+            MESSAGE("VISU_MEDConvertor::Build "<<
+                    "- aFamily = '"<<aSupportName<<"'"<<
+                    "; anIsOnAllElements = "<<anIsOnAllElements<<
+                    "; aVEntity = "<<aVEntity<<
+                    "; aNbCells = "<<aNbCells);
+
+          if(aNbCells > 0){
+            VISU::TFamilyMap& aFamilyMap = aMeshOnEntity->myFamilyMap;
+            VISU::TFamilyMap::const_iterator aFamilyMapIter = aFamilyMap.find(aSupportName.in());
+            if(aFamilyMapIter == aFamilyMap.end()){
+              VISU::PCFamily aFamily(new VISU::TCFamily());
+              aFamily->myEntity = aVEntity;
+              aFamily->myNbCells = aNbCells;
+              aFamily->myCellsSize = aCellsSize;
+              aFamily->myId = aMEDFamily->getIdentifier();
+              aFamily->myName = aSupportName.in();
+              aFamily->myFamily = aMEDFamily;
+              aFamilyMap[aSupportName.in()] = aFamily;
+            }
+          }
+        }
       }
-       
+        
       // Fill all Groups
       aSupportIterator->InitEx(true);
       for(; aSupportIterator->More(); aSupportIterator->Next()){
-       SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
-       
-       CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
-       if(CORBA::is_nil(aMedSupport)) 
-         continue;
-       
-       SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
-       if(aMEDSupport->_is_nil()) 
-         continue;
-       
-       SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
-       SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-       VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
-       CORBA::String_var aSupportName = aMEDSupport->getName();
-       
-       SALOME_MED::GROUP_var aMEDGroup = SALOME_MED::GROUP::_narrow(aMedSupport);
-       if(!aMEDGroup->_is_nil()){
-         CORBA::Boolean anIsOnAllElements = aMEDSupport->isOnAllElements();
-
-         if(MYDEBUG) 
-           MESSAGE("VISU_MEDConvertor::Build - aGroup = '"<<aSupportName<<
-                   "'; anIsOnAllElements = "<<anIsOnAllElements<<
-                   "; aVEntity = "<<aVEntity);
-
-         PCGroup aGroup(new TCGroup());
-         aGroup->myGroup = aMEDGroup;
-         aGroup->myName = aSupportName.in();
-         aGroup->myMeshName = aMeshName.in();
-         VISU::TFamilyAndEntitySet& aFamilyAndEntitySet = aGroup->myFamilyAndEntitySet;
-         
-         SALOME_MED::Family_array_var aFamilies = aMEDGroup->getFamilies();
-         int iFamilyEnd = aFamilies->length();
-         for(int iFamaily = 0; iFamaily < iFamilyEnd; iFamaily++){
-           SALOME_MED::FAMILY_var aMEDFamily = aFamilies[iFamaily];
-           CORBA::String_var aFamilyName = aMEDFamily->getName();
-           PFamily aFamily = FindFamily(aMesh,aFamilyName.in());
-           if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aGroup - aFamilyName = '"<<aFamilyName.in()<<"' = "<<bool(aFamily));
-           if(aFamily){
-             TFamilyAndEntity aFamilyAndEntity(aFamilyName.in(),aFamily->myEntity);
-             aFamilyAndEntitySet.insert(aFamilyAndEntity);
-             
-             aGroup->myNbCells += aFamily->myNbCells;
-             aGroup->myCellsSize += aFamily->myCellsSize;
-             
-             VISU::TBindGroups& aBindGroups = aFamily->myGroups;
-             aBindGroups.insert(aSupportName.in());
-           }
-         }
-         
-         if(!aGroup->myFamilyAndEntitySet.empty()){
-           TGroupMap& aGroupMap = aMesh->myGroupMap;
-           aGroupMap[aSupportName.in()] = aGroup;
-         }
-
-       }
+        SALOMEDS::SObject_var aSupportSObj = aSupportIterator->Value();
+        
+        CORBA::Object_var aMedSupport = VISU::SObjectToObject(aSupportSObj);
+        if(CORBA::is_nil(aMedSupport)) 
+          continue;
+        
+        SALOME_MED::SUPPORT_var aMEDSupport = SALOME_MED::SUPPORT::_narrow(aMedSupport); 
+        if(aMEDSupport->_is_nil()) 
+          continue;
+        
+        SALOME_MED::MESH_var aMeshOnSupport = aMEDSupport->getMesh();
+        SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
+        VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
+        CORBA::String_var aSupportName = aMEDSupport->getName();
+        
+        SALOME_MED::GROUP_var aMEDGroup = SALOME_MED::GROUP::_narrow(aMedSupport);
+        if(!aMEDGroup->_is_nil()){
+          CORBA::Boolean anIsOnAllElements = aMEDSupport->isOnAllElements();
+
+          if(MYDEBUG) 
+            MESSAGE("VISU_MEDConvertor::Build "<<
+                    "- aGroup = '"<<aSupportName<<"'"<<
+                    "; anIsOnAllElements = "<<anIsOnAllElements<<
+                    "; aVEntity = "<<aVEntity);
+
+          VISU::PCGroup aGroup(new VISU::TCGroup());
+          aGroup->myGroup = aMEDGroup;
+          VISU::TFamilySet& aFamilySet = aGroup->myFamilySet;
+          
+          SALOME_MED::Family_array_var aFamilies = aMEDGroup->getFamilies();
+          int iFamilyEnd = aFamilies->length();
+          for(int iFamaily = 0; iFamaily < iFamilyEnd; iFamaily++){
+            SALOME_MED::FAMILY_var aMEDFamily = aFamilies[iFamaily];
+            CORBA::String_var aFamilyName = aMEDFamily->getName();
+            TFindFamilyOnEntity aFindFamilyOnEntity = 
+              FindFamilyOnEntity(aMeshName.in(), aVEntity, aFamilyName.in());
+            VISU::PCFamily aFamily = boost::get<2>(aFindFamilyOnEntity);
+            if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aGroup - aFamilyName = '"<<aFamilyName.in()<<"' = "<<bool(aFamily));
+            if(aFamily){
+              aFamilySet.insert(VISU::TEnity2Family(aVEntity, aFamily));
+            }
+          }
+          
+          if(!aFamilySet.empty()){
+            VISU::TGroupMap& aGroupMap = aMesh->myGroupMap;
+            aGroupMap[aSupportName.in()] = aGroup;
+          }
+
+        }
       }
     }
   }
@@ -688,68 +1031,81 @@ VISU_MEDConvertor::Build(SALOME_MED::MED_ptr theMED)
       if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aFieldName = '"<<GetSObjectName(aFieldSObj)<<"'");
       SALOMEDS::ChildIterator_var aTimeStampIterator = aStudy->NewChildIterator(aFieldSObj);
       for(; aTimeStampIterator->More(); aTimeStampIterator->Next()){
-       SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value();
-       if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<<GetSObjectName(aTimeStampSObj)<<"'");
-       CORBA::Object_var aMedField = VISU::SObjectToObject(aTimeStampSObj);
-       if(CORBA::is_nil(aMedField)) 
-         continue;
-
-       SALOME_MED::FIELD_var aMEDField = SALOME_MED::FIELD::_narrow(aMedField);
-       if(aMEDField->_is_nil()) 
-         continue;
-
-       SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport();
-       if(aMEDSupport->_is_nil()) 
-         continue;
-
-       SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-       VISU::TEntity anEntity = MEDEntityToVTK(aMEntity);
-       SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh();
-       if(aMEDMesh->_is_nil()) 
-         continue;
-
-       CORBA::String_var aMeshName = aMEDMesh->getName();
-       CORBA::String_var aFieldName = aMEDField->getName();
-       
-       TMeshMap::iterator aMeshMapIter = myMeshMap.find(aMeshName.in());
-       if(aMeshMapIter == myMeshMap.end())
-         continue;
-
-       PCMesh aMesh = aMeshMapIter->second;
-       TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
-       TMeshOnEntityMap::iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity);
-       if(aMeshOnEntityMapIter == aMeshOnEntityMap.end())
-         continue;
-
-       PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second;
-       TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
-       TFieldMap::iterator aFieldMapIter = aFieldMap.find(aFieldName.in());
-       PCField aField;
-       if(aFieldMapIter == aFieldMap.end()){
-         aField = aFieldMap[aFieldName.in()](new TCField());
-         aField->myId = iField;
-         aField->myName = aFieldName.in();
-         aField->myEntity = anEntity;
-         aField->myMeshName = aMeshName.in();
-         aField->myNbComp = aMEDField->getNumberOfComponents();
-         aField->myDataSize = aMeshOnEntity->myNbCells * aField->myNbComp;
-         if(MYDEBUG) 
-           MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity->myNbCells = "<<aMeshOnEntity->myNbCells);
-         aField->myCompNames.resize(aField->myNbComp);
-         aField->myUnitNames.resize(aField->myNbComp);
-       }else
-         aField = aFieldMapIter->second;
-
-       TValField& aValField = aField->myValField;
-       int anId = aMEDField->getIterationNumber();
-       PCValForTime aValForTime = aValField[anId](new TCValForTime());
-       aValForTime->myId = anId;
-       CORBA::Double aDT = aMEDField->getTime();
-       aValForTime->myTime = TTime(aDT,"");
-       aValForTime->myField = aMEDField;
-       if(MYDEBUG) 
-         MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<
-                 "'; myEntity = "<<anEntity<<"; myTime = "<<aDT);
+        SALOMEDS::SObject_var aTimeStampSObj = aTimeStampIterator->Value();
+        if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aTimeStampSObj = '"<<GetSObjectName(aTimeStampSObj)<<"'");
+        CORBA::Object_var aMedField = VISU::SObjectToObject(aTimeStampSObj);
+        if(CORBA::is_nil(aMedField)) 
+          continue;
+
+        SALOME_MED::FIELD_var aMEDField = SALOME_MED::FIELD::_narrow(aMedField);
+        if(aMEDField->_is_nil()) 
+          continue;
+
+        SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport();
+        if(aMEDSupport->_is_nil()) 
+          continue;
+
+        SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
+        VISU::TEntity anEntity = MEDEntityToVTK(aMEntity);
+        SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh();
+        if(aMEDMesh->_is_nil()) 
+          continue;
+
+        CORBA::String_var aMeshName = aMEDMesh->getName();
+        CORBA::String_var aFieldName = aMEDField->getName();
+        
+        VISU::TMeshMap::iterator aMeshMapIter = myMeshMap.find(aMeshName.in());
+        if(aMeshMapIter == myMeshMap.end())
+          continue;
+
+        VISU::PCMesh aMesh = aMeshMapIter->second;
+        VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
+        VISU::TMeshOnEntityMap::iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity);
+        if(aMeshOnEntityMapIter == aMeshOnEntityMap.end())
+          continue;
+
+        VISU::PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second;
+        VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
+        VISU::TFieldMap::iterator aFieldMapIter = aFieldMap.find(aFieldName.in());
+        VISU::PCField aField;
+        if(aFieldMapIter == aFieldMap.end()){
+          aField = aFieldMap[aFieldName.in()](new VISU::TCField());
+          aField->myId = iField;
+          aField->myName = aFieldName.in();
+          aField->myEntity = anEntity;
+          aField->myMeshName = aMeshName.in();
+          aField->myDataSize = aMeshOnEntity->myNbCells * aField->myNbComp;
+
+          vtkIdType aDataType = VTK_DOUBLE;
+          SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField);
+          if(aFieldDouble->_is_nil()) {
+            // PAL18313: Mandriva 64 porting: CRASH at creating presentation on "Import Structure".
+            if (sizeof(long) == 4 ) // Size of CORBA::Long is always 4 (see CORBA_basetypes.h)
+              aDataType = VTK_LONG;
+            else if (sizeof(int) == 4)
+              aDataType = VTK_INT;
+            else {
+              MESSAGE("Can't map CORBA::Long to a VTK type, for Field " << aFieldName);
+              continue;
+            }
+          }
+          aField->Init(aMEDField->getNumberOfComponents(), aDataType);
+
+          if(MYDEBUG) 
+            MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity->myNbCells = "<<aMeshOnEntity->myNbCells);
+        }else
+          aField = aFieldMapIter->second;
+
+        VISU::TValField& aValField = aField->myValField;
+        int anId = aMEDField->getIterationNumber();
+        VISU::PCValForTime aValForTime = aValField[anId](new VISU::TCValForTime());
+        aValForTime->myId = anId;
+        CORBA::Double aDT = aMEDField->getTime();
+        aValForTime->myTime = VISU::TTime(aDT,"");
+        aValForTime->myField = aMEDField;
+        if(MYDEBUG) 
+          MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<
+                  "'; myEntity = "<<anEntity<<"; myTime = "<<aDT);
       }      
     }
   }
@@ -757,8 +1113,10 @@ VISU_MEDConvertor::Build(SALOME_MED::MED_ptr theMED)
 }
  
 
+//---------------------------------------------------------------
 VISU_Convertor* 
-VISU_MEDConvertor::Build(SALOMEDS::ChildIterator_ptr theTimeStampIterator)
+VISU_MEDConvertor
+::Build(SALOMEDS::ChildIterator_ptr theTimeStampIterator)
 {
   if(theTimeStampIterator->_is_nil()) return NULL;
   for(; theTimeStampIterator->More(); theTimeStampIterator->Next()){
@@ -778,395 +1136,759 @@ VISU_MEDConvertor::Build(SALOMEDS::ChildIterator_ptr theTimeStampIterator)
       continue;
 
     SALOME_MED::medEntityMesh aMEntity = aMEDSupport->getEntity();
-    TEntity aVEntity = MEDEntityToVTK(aMEntity);
+    VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity);
     SALOME_MED::MESH_var aMEDMesh = aMEDSupport->getMesh();
     if(aMEDMesh->_is_nil()) continue;
     CORBA::String_var aMeshName = aMEDMesh->getName();
     CORBA::String_var aFieldName = aMEDField->getName();
 
-    PCMesh aMesh = myMeshMap[aMeshName.in()](new TCMesh());
-    aMesh->myDim = aMEDMesh->getSpaceDimension();
-    aMesh->myPointsDim.resize(aMesh->myDim);
-    aMesh->myName = aMeshName.in();
-    aMesh->myNbPoints = aMEDMesh->getNumberOfNodes();
-    aMesh->myMesh = aMEDMesh;
-    if(MYDEBUG) MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<"'; myDim = "<<aMesh->myDim);
-
-    TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
-    PCMeshOnEntity aMeshOnEntity = aMeshOnEntityMap[aVEntity](new TCMeshOnEntity());
-    aMeshOnEntity->myEntity = aVEntity;
-    aMeshOnEntity->myMeshName = aMeshName.in();
-    aMeshOnEntity->mySupport = aMEDSupport;
-    if(aVEntity == NODE_ENTITY){
-      PCMeshOnEntity aMeshOnEntity2 = aMeshOnEntityMap[CELL_ENTITY](new TCMeshOnEntity());
-      *aMeshOnEntity2 = *aMeshOnEntity;
-      aMeshOnEntity->myEntity = CELL_ENTITY;
-      GetCellsSize(aMesh,aMEDMesh,CELL_ENTITY);
-    }else{
-      PCMeshOnEntity aMeshOnEntity2 = aMeshOnEntityMap[NODE_ENTITY](new TCMeshOnEntity());
-      *aMeshOnEntity2 = *aMeshOnEntity;
-      aMeshOnEntity->myEntity = NODE_ENTITY;
-      GetCellsSize(aMesh,aMEDMesh,NODE_ENTITY);
-    }
-    GetCellsSize(aMesh,aMEDMesh,aVEntity);
-    TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
-    TFieldMap::iterator aFieldMapIter = aFieldMap.find(aFieldName.in());
-    PCField aField;
+    VISU::PCMesh aMesh;
+    VISU::TMeshMap::const_iterator aMeshMapIter = myMeshMap.find(aMeshName.in());
+    if(aMeshMapIter == myMeshMap.end()){
+      aMesh.reset(new VISU::TCMesh());
+      aMesh->myNamedPointCoords(new VISU::TNamedPointCoords());
+      aMesh->myNbPoints = aMEDMesh->getNumberOfNodes();
+      aMesh->myDim = aMEDMesh->getSpaceDimension();
+      aMesh->myName = aMeshName.in();
+      aMesh->myMesh = aMEDMesh;
+      
+      myMeshMap[aMeshName.in()] = aMesh;
+
+      if(MYDEBUG) 
+        MESSAGE("VISU_MEDConvertor::Build "<<
+                "- aMeshName = '"<<aMeshName<<"'"<<
+                "; aDim = "<<aMesh->myDim);
+    }else
+      aMesh = aMeshMapIter->second;
+
+    VISU::PCMeshOnEntity aMeshOnEntity;
+    VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
+    VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter = aMeshOnEntityMap.find(aVEntity);
+    if(aMeshOnEntityMapIter == aMeshOnEntityMap.end()){
+      aMeshOnEntity.reset(new VISU::TCMeshOnEntity());
+      aMeshOnEntity->myEntity = aVEntity;
+      aMeshOnEntity->myMeshName = aMeshName.in();
+      aMeshOnEntity->mySupport = aMEDSupport;
+      aMeshOnEntityMap[aVEntity] = aMeshOnEntity;
+    }else
+      aMeshOnEntity = aMeshOnEntityMapIter->second;
+
+    if(aVEntity == VISU::NODE_ENTITY)
+      ::InitMeshOnEntity(aMesh,VISU::CELL_ENTITY,aMeshOnEntity);
+    else
+      ::InitMeshOnEntity(aMesh,VISU::NODE_ENTITY,aMeshOnEntity);
+
+    ::GetCellsSize(aMesh,aMEDMesh,aVEntity);
+
+    VISU::PCField aField;
+    VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap;
+    VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.find(aFieldName.in());
     if(aFieldMapIter == aFieldMap.end()){
-      aField = aFieldMap[aFieldName.in()](new TCField());
-      CORBA::Short iField = mySObject->Tag();
-      aField->myId = iField;
+      aField.reset(new VISU::TCField());
+      aField->myId = mySObject->Tag();
       aField->myName = aFieldName.in();
       aField->myEntity = aVEntity;
       aField->myMeshName = aMeshName.in();
-      aField->myNbComp = aMEDField->getNumberOfComponents();
       aField->myDataSize = aMeshOnEntity->myNbCells * aField->myNbComp;
+      
+      vtkIdType aDataType = VTK_DOUBLE;
+      SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField);
+      if(aFieldDouble->_is_nil()){
+        if (sizeof(long) == 4 ) // Size of CORBA::Long is always 4 (see CORBA_basetypes.h)
+          //Fix for IPAL20325 Crash on create presentation for imported field 
+          aDataType = VTK_LONG;
+        else if (sizeof(int) == 4)
+          aDataType = VTK_INT;
+        else {
+          throw std::runtime_error("Can't map CORBA::Long to a VTK type");
+        }
+      }
+      aField->Init(aMEDField->getNumberOfComponents(), aDataType);
+
+      aFieldMap[aFieldName.in()] = aField;
+
       if(MYDEBUG) 
-       MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity->myNbCells = "<<aMeshOnEntity->myNbCells);
-      aField->myCompNames.resize(aField->myNbComp);
-      aField->myUnitNames.resize(aField->myNbComp);
-    }
-    TValField& aValField = aField->myValField;
+        MESSAGE("VISU_MEDConvertor::Build - aMeshOnEntity->myNbCells = "<<aMeshOnEntity->myNbCells);
+    }else
+      aField = aFieldMapIter->second;
+
+    VISU::TValField& aValField = aField->myValField;
     int anId = aMEDField->getIterationNumber();
-    PCValForTime aValForTime = aValField[anId](new TCValForTime());
+    VISU::PCValForTime aValForTime = aValField[anId](new VISU::TCValForTime());
     aValForTime->myId = anId;
     CORBA::Double aDT = aMEDField->getTime();
-    aValForTime->myTime = TTime(aDT,"");
+    aValForTime->myTime = VISU::TTime(aDT,"");
     aValForTime->myField = aMEDField;
     if(MYDEBUG) 
-      MESSAGE("VISU_MEDConvertor::Build - aMeshName = '"<<aMeshName<<
-             "'; myEntity = "<<aVEntity<<"; myTime = "<<aDT);
+      MESSAGE("VISU_MEDConvertor::Build "<<
+              "- aMeshName = '"<<aMeshName<<"'"<<
+              "; myEntity = "<<aVEntity<<
+              "; myTime = "<<aDT<<
+              "; anId = "<<anId);
   }
   return this; 
 }
 
 
+//---------------------------------------------------------------
 int
-VISU_MEDConvertor::LoadMeshOnEntity(VISU::PMeshOnEntityImpl theMeshOnEntity, 
-                                   const string& theFamilyName)
+VISU_MEDConvertor
+::LoadMeshOnEntity(VISU::PMeshImpl theMesh,
+                   VISU::PMeshOnEntityImpl theMeshOnEntity)
 {
-  //Main part of code
-  const string& aMeshName = theMeshOnEntity->myMeshName;
-  const TEntity& aVEntity = theMeshOnEntity->myEntity;
-  PCMesh aMesh = myMeshMap[aMeshName];
-  int isPointsUpdated;
-  if(aVEntity == NODE_ENTITY) 
-    isPointsUpdated = LoadPoints(aMesh,theFamilyName);
-  else 
-    isPointsUpdated = LoadPoints(aMesh);
-  int isCellsOnEntityUpdated = LoadCellsOnEntity(aMesh,theMeshOnEntity,theFamilyName);
-
-  return (isPointsUpdated || isCellsOnEntityUpdated);
+  int anIsUpdated = LoadPoints(theMesh);
+  const VISU::TEntity& aVEntity = theMeshOnEntity->myEntity;
+  if(aVEntity != VISU::NODE_ENTITY)
+    anIsUpdated |= LoadCellsOnEntity(theMesh,theMeshOnEntity);
+
+  return anIsUpdated;
 }
  
  
+//---------------------------------------------------------------
+int
+VISU_MEDConvertor
+::LoadFamilyOnEntity(VISU::PMeshImpl theMesh,
+                     VISU::PMeshOnEntityImpl theMeshOnEntity, 
+                     VISU::PFamilyImpl theFamily)
+{
+  int anIsUpdated = LoadPoints(theMesh);
+  const VISU::TEntity& anEntity = theMeshOnEntity->myEntity;
+  if(anEntity == VISU::NODE_ENTITY){
+    anIsUpdated |= LoadPointsOnFamily(theMesh,theFamily);
+  }else{
+    anIsUpdated |= LoadCellsOnEntity(theMesh,theMeshOnEntity);
+    anIsUpdated |= LoadCellsOnFamily(theMesh,theMeshOnEntity,theFamily);
+  }
+
+  return anIsUpdated;
+}
+
+
+//---------------------------------------------------------------
 int 
-VISU_MEDConvertor::LoadMeshOnGroup(VISU::PMeshImpl theMesh, 
-                                  const VISU::TFamilyAndEntitySet& theFamilyAndEntitySet)
+VISU_MEDConvertor
+::LoadMeshOnGroup(VISU::PMeshImpl theMesh, 
+                  const VISU::TFamilySet& theFamilySet)
 {
   //Main part of code
-  int isPointsUpdated = 0;
-  int isCellsOnEntityUpdated = 0;
-  VISU::TFamilyAndEntitySet::const_iterator aFamilyAndEntitySetIter = theFamilyAndEntitySet.begin();
-  for(; aFamilyAndEntitySetIter != theFamilyAndEntitySet.end(); aFamilyAndEntitySetIter++){
-    const string& aFamilyName = aFamilyAndEntitySetIter->first;
-    const VISU::TEntity& aVEntity = aFamilyAndEntitySetIter->second;
-    PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[aVEntity];
+  int anIsUpdated = LoadPoints(theMesh);
+  VISU::TFamilySet::const_iterator aFamilyIter = theFamilySet.begin();
+  for(; aFamilyIter != theFamilySet.end(); aFamilyIter++){
+    VISU::PCFamily aFamily = (*aFamilyIter).second;
+    const VISU::TEntity& aVEntity = aFamily->myEntity;
+    VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[aVEntity];
     if(aVEntity == VISU::NODE_ENTITY){
-      isPointsUpdated += LoadPoints(theMesh,aFamilyName);
-      isCellsOnEntityUpdated += LoadCellsOnEntity(theMesh,aMeshOnEntity);
+      anIsUpdated |= LoadPointsOnFamily(theMesh,aFamily);
     }else{
-      isPointsUpdated += LoadPoints(theMesh);
-      isCellsOnEntityUpdated += LoadCellsOnEntity(theMesh,aMeshOnEntity,aFamilyName);
+      anIsUpdated |= LoadCellsOnEntity(theMesh,aMeshOnEntity);
+      anIsUpdated |= LoadCellsOnFamily(theMesh,aMeshOnEntity,aFamily);
     }
   }
 
-  return (isPointsUpdated || isCellsOnEntityUpdated);
+  return anIsUpdated;
 }
 
 
+//---------------------------------------------------------------
 int 
-VISU_MEDConvertor::LoadFieldOnMesh(VISU::PMeshImpl theMesh, 
-                                  VISU::PMeshOnEntityImpl theMeshOnEntity, 
-                                  VISU::PFieldImpl theField, 
-                                  VISU::PValForTimeImpl theValForTime)
+VISU_MEDConvertor
+::LoadValForTimeOnMesh(VISU::PMeshImpl theMesh, 
+                       VISU::PMeshOnEntityImpl theMeshOnEntity, 
+                       VISU::PFieldImpl theField, 
+                       VISU::PValForTimeImpl theValForTime)
 {
   //Main part of code
-  int isPointsUpdated = LoadPoints(theMesh);
-  int isCellsOnEntityUpdated = LoadCellsOnEntity(theMesh,theMeshOnEntity);
-  int isFieldUpdated = LoadField(theMesh,theMeshOnEntity,theField,theValForTime);
+  int anIsUpdated = LoadPoints(theMesh);
+  const VISU::TEntity& aVEntity = theMeshOnEntity->myEntity;
+  if(aVEntity != VISU::NODE_ENTITY)
+    anIsUpdated |= LoadCellsOnEntity(theMesh,theMeshOnEntity);
+
+  anIsUpdated |= LoadField(theMesh,theMeshOnEntity,theField,theValForTime);
   
-  return (isPointsUpdated || isCellsOnEntityUpdated || isFieldUpdated);
+  return anIsUpdated;
 }
 
+
+//---------------------------------------------------------------
 int 
-VISU_MEDConvertor::LoadPoints(VISU::PCMesh theMesh, 
-                             const string& theFamilyName)
+VISU_MEDConvertor
+::LoadPoints(VISU::PCMesh theMesh)
 {
   //Check on existing family
-  PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY];
-  PCFamily aFamily = GetFamily(aMeshOnEntity,theFamilyName);
+  VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY];
+  
   //Check on loading already done
-  bool isPointsLoaded = !theMesh->myPointsCoord.empty();
-  if(isPointsLoaded) 
-    if(!aFamily) 
-      return 0;
-    else if(!aFamily->mySubMesh.empty()) 
-      return 0;
-
-  if(MYDEBUG) 
-    MESSAGE("LoadPoints - isPointsLoaded = "<<isPointsLoaded<<"; theFamilyName = '"<<theFamilyName<<"'");
-
+  if(theMesh->myIsDone) 
+    return 0;
+  
   SALOME_MED::MESH_var& aMedMesh = theMesh->myMesh;
-  int iNumElemEnd = aMedMesh->getNumberOfNodes();
-  TMeshImpl::TPointsCoord& aPointsCoord = theMesh->myPointsCoord;
+  vtkIdType aDim = theMesh->GetDim();
+  vtkIdType aNbElem = theMesh->GetNbPoints();
 
-  if(MYDEBUG) MESSAGE("LoadPoints - iNumElemEnd = "<<iNumElemEnd);
+  if(MYDEBUG) MESSAGE("LoadPoints - aNbElem = "<<aNbElem);
 
-  if (iNumElemEnd <= 0) 
+  if(aNbElem <= 0) 
     throw std::runtime_error("LoadPoints >> There is no points in the mesh !!!");
 
-  aPointsCoord.resize(theMesh->myDim*iNumElemEnd,0.0);
-  SALOME_MED::double_array_var coord = aMedMesh->getCoordinates(SALOME_MED::MED_FULL_INTERLACE);
-  if(!isPointsLoaded){
-    for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) 
-      for(int iDim = 0, iNumElem2Dim = iNumElem*theMesh->myDim; iDim < theMesh->myDim; iDim++, iNumElem2Dim++)
-       aPointsCoord[iNumElem2Dim] = coord[iNumElem2Dim];
+  SALOME_MED::double_array_var aCCoord = aMedMesh->getCoordinates(SALOME_MED::MED_FULL_INTERLACE);
+  VISU::TCMEDCoordHolder* aCoordHolder = new VISU::TCMEDCoordHolder();
+  aCoordHolder->Init(aNbElem, aDim, aCCoord);
 
-    if(MYDEBUG) MESSAGE("LoadPoints - Filling aMeshOnEntity with type NODE_ENTITY");
+  VISU::TNamedPointCoords& aCoords = theMesh->myNamedPointCoords;
+  aCoords.Init(VISU::PCoordHolder(aCoordHolder));
+  
+  if(MYDEBUG) MESSAGE("LoadPoints - Filling aMeshOnEntity with type NODE_ENTITY");
+  
+  VISU::TGeom2SubMesh& aGeom2SubMesh = aMeshOnEntity->myGeom2SubMesh;
+  VISU::PSubMeshImpl aSubMesh = aGeom2SubMesh[VISU::ePOINT1](new VISU::TCSubMesh());
 
-    TMeshOnEntityImpl::TConnForCellType& aConnForCellType = aMeshOnEntity->myCellsConn[VTK_VERTEX];
-    aConnForCellType.resize(iNumElemEnd);
-    for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++)
-      aConnForCellType[iNumElem] = TMeshOnEntityImpl::TConnect(1,iNumElem);
-  }
-  if(aFamily){
-    if(MYDEBUG) MESSAGE("LoadPoints - Filling aFamily SubMesh");
-
-    SALOME_MED::FAMILY_var aMedFamily = aFamily->myFamily;
-    CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements();
-    TFamilyImpl::TSubMeshOnCellType& aSubMeshOnCellType = aFamily->mySubMesh[VTK_VERTEX];
-
-    if(!anIsOnAllElements){
-      SALOME_MED::medGeometryElement_array_var aGeom = aMedFamily->getTypes();
-      SALOME_MED::long_array_var aCellNumForType = aMedFamily->getNumber(aGeom[0]);
-      int iNumElemEndTmp = iNumElemEnd;
-      iNumElemEnd = aCellNumForType->length();
-      for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) {
-       int tmp = aCellNumForType[iNumElem]-1;
-       if(0 > tmp || tmp >= iNumElemEndTmp) {
-         static QString aString;
-         aString.sprintf("LoadPoints >> iNumElemEndTmp(%d) <= aCellNumForType[%d]=%d < 0 !!!",iNumElemEnd,iNumElem,tmp);
-         throw std::runtime_error(aString.latin1());
-       }
-       aSubMeshOnCellType.insert(tmp);
-      }
-    }else{
-      for(int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++){
-       aSubMeshOnCellType.insert(iNumElem);
+  aSubMesh->myNbCells = theMesh->myNbPoints;
+  aSubMesh->myCellsSize = 2*theMesh->myNbPoints;
+
+  VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+  aCell2Connect.resize(aNbElem);
+  if(MYDEBUG) MESSAGE("LoadPoints - aNbElem="<<aNbElem);
+  for(int iElem = 0; iElem < aNbElem; iElem++)
+    aCell2Connect[iElem] = VISU::TConnect(1,iElem);
+  
+  theMesh->myIsDone = true;
+
+  return 1;
+}
+
+
+//---------------------------------------------------------------
+int 
+VISU_MEDConvertor
+::LoadPointsOnFamily(VISU::PCMesh theMesh, 
+                     VISU::PCFamily theFamily)
+{
+  VISU::PCMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY];
+
+  if(theFamily->myIsDone) 
+    return 0;
+
+  vtkIdType aNbElem = theMesh->GetNbPoints();
+  SALOME_MED::FAMILY_var aMedFamily = theFamily->myFamily;
+  CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements();
+  VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[VISU::ePOINT1];
+  
+  if(!anIsOnAllElements){
+    SALOME_MED::medGeometryElement_array_var aGeom = aMedFamily->getTypes();
+    SALOME_MED::long_array_var aCellNumForType = aMedFamily->getNumber(aGeom[0]);
+    int aSize = aNbElem;
+    aNbElem = aCellNumForType->length();
+    for(int iElem = 0; iElem < aNbElem; iElem++){
+      int anID = aCellNumForType[iElem] - 1;
+      if(0 > anID || anID >= aSize){
+        static QString aString;
+        aString.sprintf("LoadPointsOnFamily - aSize(%d) <= aCellNumForType[%d] = %d < 0",aSize,iElem,anID);
+        throw std::runtime_error((const char*)aString.toLatin1());
       }
+      aSubMeshID.push_back(anID);
+    }
+  }else{
+    for(int iElem = 0; iElem < aNbElem; iElem++){
+      aSubMeshID.push_back(iElem);
     }
   }
+  
+  theFamily->myIsDone = true;
+  
   return 1;
 }
 
+//---------------------------------------------------------------
+namespace 
+{
+  typedef MED::TCSlice<int> TA;
+  //---------------------------------------------------------------
+  typedef std::set<int> TConnSet;
+  typedef std::vector<int> TIntArray;
+  typedef MED::TCSlice<int> TConnSlice;
+
+  //---------------------------------------------------------------
+  class MEDPolygonConnectivity //! retriver of polygon connectivity
+  {
+    TIntArray myConn;
+    TIntArray myConnIndex;
+  public:
+
+    MEDPolygonConnectivity(SALOME_MED::MESH_var theMesh,
+                           SALOME_MED::medEntityMesh theEntity) 
+    {
+      {
+        SALOME::SenderInt_var aSender = 
+          theMesh->getSenderForPolygonsConnectivity(SALOME_MED::MED_NODAL, theEntity);
+        long int aSize;
+        int* aValuePtr = ReceiverFactory::getValue(aSender.in(), aSize);
+        myConn.assign(aValuePtr, aValuePtr + aSize);
+      }
+      {
+        SALOME::SenderInt_var aSender = 
+          theMesh->getSenderForPolygonsConnectivityIndex(SALOME_MED::MED_NODAL, theEntity);
+        long int aSize;
+        int* aValuePtr = ReceiverFactory::getValue(aSender, aSize);
+        myConnIndex.assign(aValuePtr, aValuePtr + aSize);
+      }
+    }
 
+    TConnSlice 
+    GetConn(int theId) const 
+    {
+      int anOffSet = myConnIndex[theId] - 1;
+      int aSize = myConnIndex[theId + 1] - myConnIndex[ theId ];
+      return TConnSlice(&myConn[0], myConn.size(), std::slice(anOffSet, aSize, 1));
+    }
+
+    int 
+    GetNbElem() const 
+    {
+      return myConnIndex.size() - 1;
+    }
+
+    int
+    GetCellSize() const
+    {
+      return myConn.size() + GetNbElem();
+    }
+  };
+
+
+  //---------------------------------------------------------------
+  class MEDPolyhedraConnectivity //! retriver of polyhedron connectivity
+  {
+    TIntArray myConn;
+    TIntArray myConnIndex;
+    TIntArray myFaceIndex;
+  public:
+
+    MEDPolyhedraConnectivity(SALOME_MED::MESH_var theMesh)
+    {
+      {
+        SALOME::SenderInt_var aSender = 
+          theMesh->getSenderForPolyhedronConnectivity(SALOME_MED::MED_NODAL);
+        long int aSize;
+        int* aValuePtr = ReceiverFactory::getValue(aSender, aSize);
+        myConn.assign(aValuePtr, aValuePtr + aSize);
+      }
+      {
+        SALOME::SenderInt_var aSender = 
+          theMesh->getSenderForPolyhedronIndex(SALOME_MED::MED_NODAL);
+        long int aSize;
+        int* aValuePtr = ReceiverFactory::getValue(aSender, aSize);
+        myConnIndex.assign(aValuePtr, aValuePtr + aSize);
+      }
+      {
+        SALOME::SenderInt_var aSender = 
+          theMesh->getSenderForPolyhedronFacesIndex();
+        long int aSize;
+        int* aValuePtr = ReceiverFactory::getValue(aSender, aSize);
+        myFaceIndex.assign(aValuePtr, aValuePtr + aSize);
+      }
+    }
+
+    int
+    GetUniqueConn(int theId, 
+                  TConnSet& theConnSet) const 
+    {
+      theConnSet.clear();
+      int aStartFaceId = myConnIndex[theId] - 1;
+      int anEndFaceId = myConnIndex[theId + 1] - 2;
+      int aStartConnId = myFaceIndex[aStartFaceId] - 1;
+      int anEndConnId = myFaceIndex[anEndFaceId + 1] - 1;
+      for(int aConnId = aStartConnId; aConnId < anEndConnId; aConnId++)
+        theConnSet.insert(myConn[aConnId]);
+      return theConnSet.size();
+    }
+
+    int
+    GetNbElem() const
+    {
+      return myConnIndex.size() - 1;
+    }
+
+    int
+    GetCellSize() const
+    {
+      TConnSet aConnSet;
+      int aCellSize = 0;
+      for(int anElemId = 0; anElemId < GetNbElem(); anElemId++)
+        aCellSize += GetUniqueConn(anElemId, aConnSet);
+      return aCellSize;
+    }
+  };
+}
+
+//---------------------------------------------------------------
 int 
-VISU_MEDConvertor::LoadCellsOnEntity(VISU::PCMesh theMesh,
-                                    VISU::PCMeshOnEntity theMeshOnEntity, 
-                                    const string& theFamilyName)
+VISU_MEDConvertor
+::LoadCellsOnEntity(VISU::PCMesh theMesh,
+                    VISU::PCMeshOnEntity theMeshOnEntity)
 {
-  //Check on existing family
-  PCFamily aFamily = GetFamily(theMeshOnEntity,theFamilyName);
-  //Check on loading already done
-  bool isCellsLoaded = !theMeshOnEntity->myCellsConn.empty();
-  if(isCellsLoaded) 
-    if(!aFamily) 
-      return 0;
-    else if(!aFamily->mySubMesh.empty()) 
-      return 0;
+  if(theMeshOnEntity->myIsDone) 
+    return 0;
 
   SALOME_MED::SUPPORT_var& aMedSupport = theMeshOnEntity->mySupport;
   SALOME_MED::MESH_var aMedMesh = aMedSupport->getMesh();
-  if(MYDEBUG) {
-    MESSAGE("LoadCellsOnEntity - theFamilyName = '"<<theFamilyName<<"'");
-    MESSAGE("LoadCellsOnEntity - isCellsLoaded = "<<isCellsLoaded<<"; isFamilyPresent = "<<bool(aFamily));
-  }
 
   //Main part of code
-  SALOME_MED::medGeometryElement* aGeomElems;
-  const TEntity& aVEntity = theMeshOnEntity->myEntity;
-  int iGeomEnd = GetEntity2Geom(aVEntity,aGeomElems);
+  const VISU::TEntity& aVEntity = theMeshOnEntity->myEntity;
   const SALOME_MED::medEntityMesh& aMEntity = VTKEntityToMED(aVEntity);
-  int aNbPoints = theMesh->myPointsCoord.size()/theMesh->myDim;
-  if(!isCellsLoaded){
-    for(int iGeom = 0, aCounter = 0; iGeom < iGeomEnd; iGeom++){
-      SALOME_MED::medGeometryElement aGeom = aGeomElems[iGeom];
-      int aMNbNodes = MEDGeom2NbNodes(aGeom);
-      int aVGeom = MEDGeomToVTK(aGeom);
-      int aVNbNodes = VTKGeom2NbNodes(aVGeom);
-      int iNumElemEnd = aMedMesh->getNumberOfElements(aMEntity,aGeom);
-      if (iNumElemEnd > 0) {
-       SALOME_MED::long_array_var conn = 
-         aMedMesh->getConnectivity(SALOME_MED::MED_FULL_INTERLACE,SALOME_MED::MED_NODAL,aMEntity,aGeom);
-       TMeshOnEntityImpl::TConnForCellType& aConnForCellType = theMeshOnEntity->myCellsConn[aVGeom];
-       //APO - aConnForCellType.resize(iNumElemEnd);
-       vector<int> aConnect(aMNbNodes);
-       int aNbConnForElem = conn->length()/iNumElemEnd;
-       if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aGeom = "<<aGeom<<
-                           "; iNumElemEnd = "<<iNumElemEnd<<
-                           "; aNbConnForElem = "<<aNbConnForElem);
-       for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) {
-         VISU::TMeshOnEntityImpl::TConnect anArray(aVNbNodes);
-         for (int k = 0, kj = iNumElem*aNbConnForElem; k < aMNbNodes; k++) {
-           aConnect[k] = conn[kj+k] - 1;
-         }
-         switch(aGeom){
-         case SALOME_MED::MED_TETRA4 :
-         case SALOME_MED::MED_TETRA10 :
-           anArray[0] = aConnect[0];
-           anArray[1] = aConnect[1];
-           anArray[2] = aConnect[3];  
-           anArray[3] = aConnect[2];  
-           break;
-         case SALOME_MED::MED_PYRA5 :
-         case SALOME_MED::MED_PYRA13 :
-           anArray[0] = aConnect[0];
-           anArray[1] = aConnect[3];  
-           anArray[2] = aConnect[2];
-           anArray[3] = aConnect[1];  
-           anArray[4] = aConnect[4];
-           break;
-         default:
-           for (int k = 0; k < aVNbNodes; k++) 
-             anArray[k] = aConnect[k];
-         }
-         for (int k = 0; k < aVNbNodes; k++) 
-           if(anArray[k] < 0 || aNbPoints <= anArray[k]){
-             static QString aString;
-             aString.sprintf("ImportCells >> aNbPoints(%d) <= anArray[%d][%d]=%d < 0 !!!",aNbPoints,iNumElem,k,anArray[k]);
-             throw std::runtime_error(aString.latin1());
-           }
-         aConnForCellType.push_back(anArray);
-       }
-       //Workaround for MED Component data structure
-       int aSize = aConnForCellType.size();
-       theMeshOnEntity->myCellsFirstIndex[aGeom] = TCMeshOnEntity::TIndexAndSize(aCounter,aSize);
-       aCounter += aSize;
+  VISU::TCellsFirstIndex& aFirstIndex = theMeshOnEntity->myCellsFirstIndex;
+
+  SALOME_MED::MESH::connectivityInfos_var anInfo = aMedMesh->getConnectGlobal(aMEntity);
+  int iGeomEnd = anInfo->meshTypes.length();
+
+  VISU::TGeom2SubMesh& aGeom2SubMesh = theMeshOnEntity->myGeom2SubMesh;
+  vtkIdType aNbPoints = theMesh->GetNbPoints();
+
+  for(int iGeom = 0, aCounter = 0; iGeom < iGeomEnd; iGeom++) {
+    SALOME_MED::medGeometryElement aMGeom = anInfo->meshTypes[iGeom];
+    VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom);
+    switch (aMGeom) {
+    case SALOME_MED::MED_POLYGON:
+    {
+      MEDPolygonConnectivity aConn(aMedMesh, aMEntity);
+      int aNbElem = aConn.GetNbElem();
+      if (aNbElem > 0) {
+        VISU::PSubMeshImpl aSubMesh = aGeom2SubMesh[aEGeom](new VISU::TCSubMesh());
+        aSubMesh->myNbCells   = aNbElem;
+        aSubMesh->myCellsSize = aConn.GetCellSize();
+
+        VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+        aCell2Connect.resize(aNbElem);
+
+        for(int iElem = 0; iElem < aNbElem; iElem++) {
+          TConnSlice aConnSlice = aConn.GetConn(iElem);
+          VISU::TConnect& anArray = aCell2Connect[iElem];
+          anArray.resize(aConnSlice.size());
+          for(int iConn = 0; iConn < aConnSlice.size(); iConn++)
+            anArray[iConn] = aConnSlice[iConn] - 1;
+        }
       }
     }
-  }
-  //Filling aFamily SubMesh
-  if(aFamily){
-    SALOME_MED::FAMILY_var aMedFamily = aFamily->myFamily;
-    CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements();
-    if(!anIsOnAllElements){
-      SALOME_MED::medGeometryElement_array_var aGeoms = aMedFamily->getTypes();
-      iGeomEnd = aGeoms->length();
-      if(MYDEBUG) MESSAGE("LoadCellsOnEntity - iGeomEnd = "<<iGeomEnd);
-      for (int iGeom = 0; iGeom < iGeomEnd; iGeom++) {
-       SALOME_MED::medGeometryElement aGeom = aGeoms[iGeom];
-       SALOME_MED::long_array_var aCellNumForType = aMedFamily->getNumber(aGeom);
-       int aVGeom = MEDGeomToVTK(aGeom);
-       TFamilyImpl::TSubMeshOnCellType& aSubMeshOnCellType = aFamily->mySubMesh[aVGeom]; 
-       int iNumElemEndTmp = theMeshOnEntity->myCellsConn[aVGeom].size();
-       int iNumElemEnd = aCellNumForType->length();
-       int aCounter = theMeshOnEntity->myCellsFirstIndex[aGeom].first;
-       if(MYDEBUG) 
-         MESSAGE("LoadCellsOnEntity - aGeom = "<<aGeom<<
-                 "; iNumElemEnd = "<<iNumElemEnd<<
-                 "; aCounter = "<<aCounter);
-       for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) {
-         int tmp = aCellNumForType[iNumElem]-aCounter-1;
-         if(0 > tmp || tmp >= iNumElemEndTmp) {
-           static QString aString;
-           aString.sprintf("LoadCellsOnEntity >> iNumElemEndTmp(%d) <= aCellNumForType[%d]=%d < 0 !!!",iNumElemEndTmp,iNumElem,tmp);
-           throw std::runtime_error(aString.latin1());
-         }
-         aSubMeshOnCellType.insert(tmp);
-       }
+    break;
+    case SALOME_MED::MED_POLYHEDRA:
+    {
+      MEDPolyhedraConnectivity aConn( aMedMesh );
+      int aNbElem = aConn.GetNbElem();
+      if (aNbElem > 0) {
+        VISU::PSubMeshImpl aSubMesh = aGeom2SubMesh[aEGeom](new VISU::TCSubMesh());
+        aSubMesh->myNbCells = aNbElem;
+        aSubMesh->myCellsSize = aConn.GetCellSize();
+
+        VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+        aCell2Connect.resize(aNbElem);
+
+        TConnSet aConnectSet;
+        for(int iElem = 0; iElem < aNbElem; iElem++){
+          if(aConn.GetUniqueConn(iElem, aConnectSet)){
+            int aNbConn = aConnectSet.size();
+            VISU::TConnect& anArray = aCell2Connect[iElem];
+            anArray.resize(aNbConn);
+            std::set<int>::iterator anIter = aConnectSet.begin();
+            for(int i = 0; anIter != aConnectSet.end(); anIter++, i++)
+              anArray[i] = *anIter - 1;
+          }
+        }
       }
-    }else{
-      const TMeshOnEntityImpl::TCellsConn& aCellsConn = theMeshOnEntity->myCellsConn;
-      TMeshOnEntityImpl::TCellsConn::const_iterator aCellsConnIter = aCellsConn.begin();
-      for(; aCellsConnIter != aCellsConn.end(); aCellsConnIter++){
-       int aVGeom = aCellsConnIter->first;
-       const TMeshOnEntityImpl::TConnForCellType& aConnForCellType = aCellsConnIter->second;
-       TFamilyImpl::TSubMeshOnCellType& aSubMeshOnCellType = aFamily->mySubMesh[aVGeom];
-       int iNumElemEnd = aConnForCellType.size();
-       for(int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++)
-         aSubMeshOnCellType.insert(iNumElem);
+    }
+    break;
+    default:
+    {        
+      int aMNbNodes = MEDGeom2NbNodes(aMGeom);
+      int aVNbNodes = VISUGeom2NbNodes(aEGeom);
+      int aNbElem = anInfo->numberOfElements[iGeom];
+      if (aNbElem > 0) {
+        SALOME_MED::long_array_var aConn = 
+          aMedMesh->getConnectivity(SALOME_MED::MED_FULL_INTERLACE,
+                                    SALOME_MED::MED_NODAL,
+                                    aMEntity,
+                                    aMGeom);
+        VISU::PSubMeshImpl aSubMesh = aGeom2SubMesh[aEGeom](new VISU::TCSubMesh());
+
+        aSubMesh->myNbCells = aNbElem;
+        aSubMesh->myCellsSize = aNbElem*(aVNbNodes+1);
+
+        VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+        std::vector<int> aConnect(aMNbNodes);
+        int aNbConnForElem = aConn->length() / aNbElem;
+
+        if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aMGeom = "<<aMGeom<<
+                            "; aNbElem = "<<aNbElem<<
+                            "; aMNbNodes = "<<aMNbNodes<<
+                            "; aVNbNodes = "<<aVNbNodes<<
+                            "; aNbConnForElem = "<<aNbConnForElem);
+
+        for(int iElem = 0; iElem < aNbElem; iElem++) {
+          VISU::TConnect anArray(aVNbNodes);
+          for(int k = 0, kj = iElem*aNbConnForElem; k < aMNbNodes; k++)
+            aConnect[k] = aConn[kj+k] - 1;
+
+          switch(aMGeom){
+#if !(defined(VTK_QUADRATIC_EDGE) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+          case SALOME_MED::MED_SEG3:
+            anArray[0] = aConnect[0];
+            anArray[2] = aConnect[1];  
+
+            anArray[1] = aConnect[2];
+            break;
+#endif
+#if !(defined(VTK_QUADRATIC_TRIANGLE) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+          case SALOME_MED::MED_TRIA6:
+            anArray[0] = aConnect[0];
+            anArray[2] = aConnect[1];  
+            anArray[4] = aConnect[2];  
+
+            anArray[1] = aConnect[3];
+            anArray[3] = aConnect[4];  
+            anArray[5] = aConnect[5];  
+            break;
+#endif
+#if !(defined(VTK_QUADRATIC_QUAD) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+          case SALOME_MED::MED_QUAD8:
+            anArray[0] = aConnect[0];
+            anArray[2] = aConnect[1];  
+            anArray[4] = aConnect[2];  
+            anArray[6] = aConnect[3];  
+
+            anArray[1] = aConnect[4];
+            anArray[3] = aConnect[5];  
+            anArray[5] = aConnect[6];  
+            anArray[7] = aConnect[7];  
+            break;
+#endif
+#if (defined(VTK_QUADRATIC_TETRA) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+          case SALOME_MED::MED_TETRA10 :
+#endif
+          case SALOME_MED::MED_TETRA4 :
+            anArray[0] = aConnect[0];
+            anArray[1] = aConnect[1];
+            anArray[2] = aConnect[3];  
+            anArray[3] = aConnect[2];  
+            break;
+#if (defined(VTK_QUADRATIC_PYRAMID) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+          case SALOME_MED::MED_PYRA13:
+#endif
+          case SALOME_MED::MED_PYRA5 :
+            anArray[0] = aConnect[0];
+            anArray[1] = aConnect[3];  
+            anArray[2] = aConnect[2];
+            anArray[3] = aConnect[1];  
+            anArray[4] = aConnect[4];
+            break;
+          default:
+            for (int k = 0; k < aVNbNodes; k++) 
+              anArray[k] = aConnect[k];
+          }
+          for (int k = 0; k < aVNbNodes; k++) 
+            if(anArray[k] < 0 || aNbPoints <= anArray[k]){
+              static QString aString;
+              aString.sprintf("LoadCellsOnEntity >> aNbPoints(%d) <= anArray[%d][%d]=%d < 0 !!!",int(aNbPoints),iElem,k,anArray[k]);
+              throw std::runtime_error((const char*)aString.toLatin1());
+            }
+          aCell2Connect.push_back(anArray);
+        } // loop on elements
       }
+    }} // switch( aMGeom )
+    VISU::TGeom2SubMesh::iterator anIter = aGeom2SubMesh.find(aEGeom);
+    if(anIter != aGeom2SubMesh.end()){
+      const VISU::PSubMeshImpl& aSubMesh = anIter->second;
+      const VISU::TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+      int aSize = aCell2Connect.size();
+      if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aCounter = "<<aCounter<<"; aSize = "<<aSize<<"; aMGeom = "<<aMGeom);
+      aFirstIndex[aMGeom] = VISU::TIndexAndSize(aCounter, aSize);
+      aCounter += aSize;
     }
-  }
+  } //loop on types
+
+  // Dump result connectivity
+// #ifdef _DEBUG_
+//   TGeom2SubMesh::iterator geom_sm = aGeom2SubMesh.begin();
+//   for ( ; geom_sm!=aGeom2SubMesh.end(); ++geom_sm ) {
+//     cout << "TYPE: " << geom_sm->first << endl;
+//     PSubMeshImpl aSubMesh = geom_sm->second;
+//     TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
+//     TCell2Connect::iterator id_conn = aCell2Connect.begin();
+//     for ( int i = 0; id_conn !=aCell2Connect.end(); ++id_conn ) {
+//       cout << "\t" << i++ << ": [";
+//       TConnect& anArray = *id_conn;
+//       TConnect::iterator n = anArray.begin();
+//       for ( ; n != anArray.end(); ++n )
+//         cout << " " << *n + 1;
+//       cout << " ]"<< endl;
+//     }
+//   }
+// #endif
+
+  theMeshOnEntity->myIsDone = true;
+
   return 1;
 }
 
-template<class TArray> 
+
+//---------------------------------------------------------------
 int 
-ImportField(TArray& theArray, 
-           VISU::PCMesh theMesh,
-           VISU::PCField theField,
-           VISU::PCValForTime theValForTime,
-           VISU::PCMeshOnEntity theMeshOnEntity)
+VISU_MEDConvertor
+::LoadCellsOnFamily(VISU::PCMesh theMesh,
+                    VISU::PCMeshOnEntity theMeshOnEntity, 
+                    VISU::PCFamily theFamily)
 {
-  if(theField->myEntity == NODE_ENTITY){
-    TValForTimeImpl::TValForCellsWithType& aValForCellsWithType = 
-      theValForTime->myValForCells[VTK_VERTEX];
-    int iNumElemEnd = theMesh->myPointsCoord.size()/theMesh->myDim*theField->myNbComp;
-    if(MYDEBUG) MESSAGE("ImportField - iNumElemEnd = "<<iNumElemEnd);
-    aValForCellsWithType.resize(iNumElemEnd);
-    for (int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++) 
-      aValForCellsWithType[iNumElem] = theArray[iNumElem];
+  if(theFamily->myIsDone) 
+    return 0;
+
+  SALOME_MED::FAMILY_var aMedFamily = theFamily->myFamily;
+  CORBA::Boolean anIsOnAllElements = aMedFamily->isOnAllElements();
+  if(!anIsOnAllElements){
+    SALOME_MED::medGeometryElement_array_var aGeoms = aMedFamily->getTypes();
+    int iGeomEnd = aGeoms->length();
+    if(MYDEBUG) MESSAGE("LoadCellsOnFamily - iGeomEnd = "<<iGeomEnd);
+    for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
+      SALOME_MED::medGeometryElement aMGeom = aGeoms[iGeom];
+      SALOME_MED::long_array_var aCellNumForType = aMedFamily->getNumber(aMGeom);
+      VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom);
+
+      int aNbElem = aCellNumForType->length();
+      int aCounter = theMeshOnEntity->myCellsFirstIndex[aMGeom].first;
+      int aSize = theMeshOnEntity->myCellsFirstIndex[aMGeom].second;
+      VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[aEGeom]; 
+      
+      if(MYDEBUG) 
+        MESSAGE("LoadCellsOnFamily "<<
+                "- aMGeom = "<<aMGeom<<
+                "; aNbElem = "<<aNbElem<<
+                "; aSize = "<<aSize<<
+                "; aCounter = "<<aCounter);
+      
+      for(int iElem = 0; iElem < aNbElem; iElem++){
+        int anID = aCellNumForType[iElem] - aCounter - 1;
+        if(0 > anID || anID >= aSize){
+          static QString aString;
+          aString.sprintf("LoadCellsOnFamily - aNbElem(%d) <= aCellNumForType[%d] = %d < 0 !!!",aNbElem,iElem,anID);
+          throw std::runtime_error((const char*)aString.toLatin1());
+        }
+        aSubMeshID.push_back(anID);
+      }
+    }
+  }else{
+    const VISU::TGeom2SubMesh& aGeom2SubMesh = theMeshOnEntity->myGeom2SubMesh;
+    VISU::TGeom2SubMesh::const_iterator anIter = aGeom2SubMesh.begin();
+    for(; anIter != aGeom2SubMesh.end(); anIter++){
+      VISU::EGeometry aEGeom = anIter->first;
+      const VISU::TSubMeshImpl& aSubMesh = anIter->second;
+      const VISU::TCell2Connect& aCell2Connect = aSubMesh.myCell2Connect;
+      VISU::TSubMeshID& aSubMeshID = theFamily->myGeom2SubMeshID[aEGeom];
+      int iNumElemEnd = aCell2Connect.size();
+      for(int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++)
+        aSubMeshID.push_back(iNumElem);
+    }
+  }
+  
+  theFamily->myIsDone = true;
+
+  return 1;
+}
+
+
+template<class TValueType,
+         class TContainerType> 
+void 
+ImportField(TContainerType& theContainer, 
+            VISU::PCMesh theMesh,
+            VISU::PCField theField,
+            VISU::PCValForTime theValForTime,
+            VISU::PCMeshOnEntity theMeshOnEntity)
+{
+  typedef VISU::TTCMEDMeshValue<TValueType, TContainerType> TVMeshValue;
+  vtkIdType aNbComp = theField->myNbComp;
+  if(theField->myEntity == VISU::NODE_ENTITY){
+    VISU::EGeometry aEGeom = VISU::ePOINT1;
+    vtkIdType aNbGauss = theValForTime->GetNbGauss(aEGeom);
+    vtkIdType aNbElem = theMesh->GetNbPoints();
+
+    if(MYDEBUG) MESSAGE("ImportField - aNbElem = "<<aNbElem);
+
+    VISU::PMeshValue& aVMeshValue = theValForTime->GetMeshValue(VISU::ePOINT1);
+    TVMeshValue* aMeshValue = new TVMeshValue();
+    aMeshValue->Init(aNbElem, aNbGauss, aNbComp, theContainer, 0);
+    aVMeshValue.reset(aMeshValue);
   }else{
     SALOME_MED::medGeometryElement* aGeomElems;
-    const TEntity& aVEntity = theField->myEntity;
+    const VISU::TEntity& aVEntity = theField->myEntity;
     int iGeomEnd = GetEntity2Geom(aVEntity,aGeomElems);
     for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
-      SALOME_MED::medGeometryElement aGeom = aGeomElems[iGeom];
-      int aVGeom = MEDGeomToVTK(aGeom);
-      const TCMeshOnEntity::TCellsFirstIndex& aCellsFirstIndex = theMeshOnEntity->myCellsFirstIndex;
-      TCMeshOnEntity::TCellsFirstIndex::const_iterator aCellsFirstIndexIter = aCellsFirstIndex.find(aGeom);
+      SALOME_MED::medGeometryElement aMGeom = aGeomElems[iGeom];
+      VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom);
+      vtkIdType aNbGauss = theValForTime->GetNbGauss(aEGeom);
+      const VISU::TCellsFirstIndex& aCellsFirstIndex = theMeshOnEntity->myCellsFirstIndex;
+      VISU::TCellsFirstIndex::const_iterator aCellsFirstIndexIter = aCellsFirstIndex.find(aMGeom);
       if(aCellsFirstIndexIter != aCellsFirstIndex.end()){
-       const TCMeshOnEntity::TIndexAndSize& aIndexAndSize = aCellsFirstIndexIter->second;
-       int iNumElemEnd = aIndexAndSize.second;
-       if(MYDEBUG) 
-         MESSAGE("ImportField - aGeom = "<<aGeom<<
-                 "; aIndexAndSize = {"<<aIndexAndSize.first<<
-                 ","<<aIndexAndSize.second<<"}");
-       TValForTimeImpl::TValForCellsWithType& aValForCellsWithType = theValForTime->myValForCells[aVGeom];
-       aValForCellsWithType.resize(iNumElemEnd*theField->myNbComp);
-       for(int iNumElem = 0; iNumElem < iNumElemEnd; iNumElem++)
-         for(int k = 0, kj = iNumElem*theField->myNbComp; k < theField->myNbComp; k++)
-           aValForCellsWithType[kj+k] = theArray[aIndexAndSize.first*theField->myNbComp+kj+k];
+        const VISU::TIndexAndSize& aIndexAndSize = aCellsFirstIndexIter->second;
+        if(MYDEBUG) 
+          MESSAGE("ImportField - aMGeom = "<<aMGeom<<
+                  "; aIndexAndSize = {"<<aIndexAndSize.first<<
+                  ","<<aIndexAndSize.second<<"}");
+
+        vtkIdType aNbElem = aIndexAndSize.second;
+        vtkIdType aStart = aIndexAndSize.first * aNbComp;
+        VISU::PMeshValue& aVMeshValue = theValForTime->GetMeshValue(aEGeom);
+        TVMeshValue* aMeshValue = new TVMeshValue();
+        aMeshValue->Init(aNbElem, aNbGauss, aNbComp, theContainer, aStart);
+        aVMeshValue.reset(aMeshValue);
       }
     }
   }
-  return 1;
 }
 
 int
-VISU_MEDConvertor::LoadField(VISU::PCMesh theMesh,
-                            VISU::PCMeshOnEntity theMeshOnEntity,
-                            VISU::PField theField, 
-                            VISU::PCValForTime theValForTime)
+VISU_MEDConvertor
+::LoadField(VISU::PCMesh theMesh,
+            VISU::PCMeshOnEntity theMeshOnEntity,
+            VISU::PField theField, 
+            VISU::PCValForTime theValForTime)
 {
+  MESSAGE("VISU_MEDConvertor::LoadField");
   //Check on loading already done
-  if(!theValForTime->myValForCells.empty()) 
+  VISU::PUnstructuredGridIDMapperImpl anUnstructuredGridIDMapper = theValForTime->myUnstructuredGridIDMapper;
+  if(anUnstructuredGridIDMapper->myIsVTKDone) 
     return 0;
+  
+  VISU::PCProfile aProfile(new VISU::TCProfile());
+  aProfile->myIsAll = true;
+  theValForTime->myProfile = aProfile;
+
   SALOME_MED::FIELD_var aMEDField = theValForTime->myField;
+
+  SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport();
+
+  if(aMEDSupport->isOnAllElements()) aProfile->myIsDone = true;
+  
   SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField);
   if(!aFieldDouble->_is_nil()){
     SALOME_MED::double_array_var anArray = aFieldDouble->getValue(SALOME_MED::MED_FULL_INTERLACE);
     if(MYDEBUG) MESSAGE("VISU_MEDConvertor::LoadField - There is FIELDDOUBLE = "<<anArray->length());
-    ::ImportField(anArray,theMesh,theField,theValForTime,theMeshOnEntity);
+    ImportField<CORBA::Double>(anArray,
+                               theMesh,
+                               theField,
+                               theValForTime,
+                               theMeshOnEntity);
   }
+
   SALOME_MED::FIELDINT_ptr aFieldInt = SALOME_MED::FIELDINT::_narrow(aMEDField);
   if(!aFieldInt->_is_nil()){
     SALOME_MED::long_array_var anArray = aFieldInt->getValue(SALOME_MED::MED_FULL_INTERLACE);
     if(MYDEBUG) MESSAGE("VISU_MEDConvertor::LoadField - There is FIELDINT = "<<anArray->length());
-    ::ImportField(anArray,theMesh,theField,theValForTime,theMeshOnEntity);
+    ImportField<CORBA::Long>(anArray,
+                             theMesh,
+                             theField,
+                             theValForTime,
+                             theMeshOnEntity);
   }
+
+  anUnstructuredGridIDMapper->myIsVTKDone = true;
+
+  MESSAGE("VISU_MEDConvertor::LoadField done");
   return 1;
 }