Salome HOME
23517: [CEA 2203] : Mesh group of polyhedron not exported in med and not saved in hdf
[modules/smesh.git] / src / DriverMED / DriverMED_W_SMESHDS_Mesh.cxx
index b4f49a216f74076c58631f5bc75d30f59d47b137..75ebf667aef77b4fd8a0999a6abb512c48e3385a 100644 (file)
@@ -70,6 +70,7 @@ void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName,
 {
   Driver_SMESHDS_Mesh::SetFile(theFileName);
   myMedVersion = theId;
+  //MESSAGE("myMedVersion:"<<myMedVersion);
 }
 
 void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName)
@@ -77,19 +78,39 @@ void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName)
   Driver_SMESHDS_Mesh::SetFile(theFileName);
 }
 
+/*!
+ * MED version is either the latest available, or with an inferior minor,
+ * to ensure backward compatibility on writing med files.
+ */
 string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion, int theNbDigits)
 {
   TInt majeur, mineur, release;
   majeur =  mineur = release = 0;
-//   if ( theVersion == eV2_1 )
-//     MED::GetVersionRelease<eV2_1>(majeur, mineur, release);
-//   else
-    MED::GetVersionRelease<eV2_2>(majeur, mineur, release);
+  MED::GetVersionRelease<eV2_2>(majeur, mineur, release);
+  TInt imposedMineur = mineur;
+  switch( theVersion ) {
+    case MED::eV2_1     :
+    case MED::eV2_2     :
+    case MED::eLATEST   : break;
+    case MED::eMINOR_0  : imposedMineur = 0; break;
+    case MED::eMINOR_1  : imposedMineur = 1; break;
+    case MED::eMINOR_2  : imposedMineur = 2; break;
+    case MED::eMINOR_3  : imposedMineur = 3; break;
+    case MED::eMINOR_4  : imposedMineur = 4; break;
+    case MED::eMINOR_5  : imposedMineur = 5; break;
+    case MED::eMINOR_6  : imposedMineur = 6; break;
+    case MED::eMINOR_7  : imposedMineur = 7; break;
+    case MED::eMINOR_8  : imposedMineur = 8; break;
+    case MED::eMINOR_9  : imposedMineur = 9; break;
+    case MED::eVUnknown : imposedMineur = mineur; break;
+  }
+  if (imposedMineur > mineur)
+    imposedMineur = mineur;
   ostringstream name;
   if ( theNbDigits > 0 )
     name << majeur;
   if ( theNbDigits > 1 )
-    name << "." << mineur;
+    name << "." << imposedMineur;
   if ( theNbDigits > 2 )
     name << "." << release;
   return name.str();
@@ -456,7 +477,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
         break;
       }
     }
-
+    //MESSAGE("myMedVersion:"<<myMedVersion);
     MED::PWrapper myMed = CrWrapper(myFile,myMedVersion);
     PMeshInfo aMeshInfo = myMed->CrMeshInfo(aMeshDimension,aSpaceDimension,aMeshName);
     //MESSAGE("Add - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName());
@@ -759,6 +780,13 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
         continue;
       }
 
+      // build map of family numbers for this type
+      if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])
+      {
+        fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType );
+        isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true;
+      }
+
       // iterator on elements of a current type
       SMDS_ElemIteratorPtr elemIterator;
       int iElem = 0;
@@ -832,7 +860,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
       else if (aElemTypeData->_geomType == ePOLYEDRE )
       {
         elemIterator = myMesh->elementGeomIterator( SMDSGeom_POLYHEDRA );
-        
+
         if ( nbPolyhedronNodes == 0 ) {
           // Count nb of nodes
           while ( elemIterator->more() ) {
@@ -909,13 +937,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
         // allocate data arrays
         PBallInfo aBallInfo = myMed->CrBallInfo( aMeshInfo, aElemTypeData->_nbElems );
 
-        // build map of family numbers for this type
-        if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])
-        {
-          fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType );
-          isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true;
-        }
-
         elemIterator = myMesh->elementsIterator( SMDSAbs_Ball );
         while ( elemIterator->more() )
         {
@@ -955,12 +976,6 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
                                                  theConnMode,
                                                  theIsElemNum,
                                                  theIsElemNames);
-        // build map of family numbers for this type
-        if ( !isElemFamMapBuilt[ aElemTypeData->_smdsType ])
-        {
-          fillElemFamilyMap( anElemFamMap, aFamilies, aElemTypeData->_smdsType );
-          isElemFamMapBuilt[ aElemTypeData->_smdsType ] = true;
-        }
 
         TInt aNbNodes = MED::GetNbNodes(aElemTypeData->_geomType);
         elemIterator = myMesh->elementsIterator( aElemTypeData->_smdsType );