Salome HOME
IPAL 0051561: Hexotic algorithm fail
[modules/smesh.git] / src / SMESH_I / SMESH_PreMeshInfo.cxx
index 43e91b71ba9393278a4ee39dacdc437f6a2b34d2..0a3d58614a4a37e466e9c35517af8492cc6d9f0b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  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
@@ -230,6 +230,17 @@ namespace
     return ids;
   }
 
+  //================================================================================
+  /*!
+   * \brief Return EEntiteMaillage by EGeometrieElement
+   */
+  //================================================================================
+
+  MED::EEntiteMaillage entityByGeom(const MED::EGeometrieElement geom )
+  {
+    return geom == MED::eBALL ? MED::eSTRUCT_ELEMENT : MED::eMAILLE;
+  }
+
   //================================================================================
   /*!
    * \brief Return a map< EGeometrieElement, SMDSAbs_EntityType >
@@ -263,6 +274,7 @@ namespace
       med2smeshTypes[ MED::ePOLYGONE ] = SMDSEntity_Polygon           ;
       med2smeshTypes[ MED::ePOLYEDRE ] = SMDSEntity_Polyhedra         ;
       med2smeshTypes[ MED::eNONE     ] = SMDSEntity_Node              ;
+      med2smeshTypes[ MED::eBALL     ] = SMDSEntity_Ball              ;
     }
     return med2smeshTypes;
   }
@@ -463,7 +475,6 @@ bool SMESH_PreMeshInfo::readPreInfoFromHDF()
   const bool infoAvailable = aFile->ExistInternalObject( hdfGroupName );
   if ( infoAvailable )
   {
-
     HDFgroup* infoHdfGroup = new HDFgroup( hdfGroupName, aFile );
     infoHdfGroup->OpenOnDisk();
 
@@ -530,7 +541,7 @@ bool SMESH_PreMeshInfo::readMeshInfo()
     Tmed2smeshElemTypeMap::const_iterator me2smeEnd = med2smeshElemTypeMap().end();
     for ( ; me2sme != me2smeEnd; ++me2sme )
     {
-      int nbElems = aMed->GetNbCells( medMeshInfo, MED::eMAILLE, me2sme->first );
+      int nbElems = aMed->GetNbCells( medMeshInfo, entityByGeom(me2sme->first), me2sme->first );
       if ( nbElems > 0 )
         setNb( me2sme->second, nbElems );
     }
@@ -600,7 +611,7 @@ void SMESH_PreMeshInfo::readGroupInfo()
   {
     famNums.resize( NbEntities( me2sme->second ));
     if ( famNums.empty() ) continue;
-    aMed->GetFamilies( medElemInfo, famNums.size(), MED::eMAILLE, me2sme->first );
+    aMed->GetFamilies( medElemInfo, famNums.size(), entityByGeom(me2sme->first), me2sme->first );
     // distribute elements of a type among groups
     map< int, vector< SMESH_PreMeshInfo* > >::iterator f2infos = famId2grInfo.begin();
     for ( size_t i = 0; i < famNums.size(); ++i )
@@ -847,7 +858,7 @@ void SMESH_PreMeshInfo::FullLoadFromFile() const
   SMESH_PreMeshInfo* meshInfo = _mesh->changePreMeshInfo();
   _mesh->changePreMeshInfo() = NULL; // to allow GUI accessing to real info
 
-  ::SMESH_Mesh& mesh = _mesh->GetImpl();
+  ::SMESH_Mesh&   mesh = _mesh->GetImpl();
   SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
 
   PreMeshInfo_TRY;
@@ -908,6 +919,18 @@ void SMESH_PreMeshInfo::readSubMeshes(DriverMED_R_SMESHDS_Mesh* reader) const
 
     SMESHDS_Mesh* meshDS = _mesh->GetImpl().GetMeshDS();
 
+    // issue 0020693. Restore _isModified flag
+    if ( aTopGroup->ExistInternalObject( "_isModified" ))
+    {
+      HDFdataset* aDataset = new HDFdataset( "_isModified", aTopGroup );
+      aDataset->OpenOnDisk();
+      hdf_size size = aDataset->GetSize();
+      int* isModified = new int[ size ];
+      aDataset->ReadFromDisk( isModified );
+      aDataset->CloseOnDisk();
+      _mesh->GetImpl().SetIsModified( bool(*isModified));
+    }
+
     bool submeshesInFamilies = ( ! aTopGroup->ExistInternalObject( "Submeshes" ));
     if ( submeshesInFamilies ) // from MED
     {
@@ -1199,14 +1222,11 @@ SMESH::array_of_ElementType* SMESH_PreMeshInfo::GetTypes() const
 
   types->length( 4 );
   int nbTypes = 0;
-  if (NbEdges())
-    types[nbTypes++] = SMESH::EDGE;
-  if (NbFaces())
-    types[nbTypes++] = SMESH::FACE;
-  if (NbVolumes())
-    types[nbTypes++] = SMESH::VOLUME;
-  if (Nb0DElements())
-    types[nbTypes++] = SMESH::ELEM0D;
+  if (NbEdges())      types[nbTypes++] = SMESH::EDGE;
+  if (NbFaces())      types[nbTypes++] = SMESH::FACE;
+  if (NbVolumes())    types[nbTypes++] = SMESH::VOLUME;
+  if (Nb0DElements()) types[nbTypes++] = SMESH::ELEM0D;
+  if (NbBalls())      types[nbTypes++] = SMESH::BALL;
   types->length( nbTypes );
 
   return types._retn();