Salome HOME
debug exporting MED files, adding meshes, different MED versions...
authorPaul RASCLE <paul.rascle@edf.fr>
Wed, 18 Jul 2018 13:51:37 +0000 (15:51 +0200)
committerPaul RASCLE <paul.rascle@edf.fr>
Wed, 18 Jul 2018 13:51:37 +0000 (15:51 +0200)
idl/SMESH_Gen.idl
src/MEDWrapper/MED_Factory.cxx
src/MEDWrapper/MED_Factory.hxx
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_FileValidator.cxx
src/SMESHGUI/SMESHGUI_FileValidator.h
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_Mesh_i.cxx

index ec7b9ebba6250876b1eee7ca8e349bf89de83d02..81e4a48cc1636577b28140beb3dbf56043cabd12 100644 (file)
@@ -422,10 +422,15 @@ module SMESH
     string GetMEDVersion(in string theFileName);
 
     /*!
-     * \brief Check compatibility of file with MED format being used.
+     * \brief Check compatibility of file with MED format being used, for read only.
      */
     boolean CheckCompatibility(in string theFileName);
 
+    /*!
+     * \brief Check compatibility of file with MED format being used, for append on write.
+     */
+    boolean CheckWriteCompatibility(in string theFileName);
+
     /*!
      * \brief Get names of meshes defined in file with the specified name.
      */
index 52558d0f43c3e0210eda60ea00ec8a06ebfc11bc..51fe44ce3f79263b688e5b8713381086a9ccebde 100644 (file)
@@ -35,6 +35,7 @@ extern "C"
   #include <unistd.h>
 #endif
 }
+#include <utilities.h>
 
 namespace MED
 {
@@ -47,22 +48,24 @@ namespace MED
 #endif
   }
 
-  bool CheckCompatibility(const std::string& fileName)
+  bool CheckCompatibility(const std::string& fileName, bool isForAppend)
   {
     bool ok = false;
     // check that file is accessible
     if ( exists(fileName) ) {
       // check HDF5 && MED compatibility
       med_bool hdfok, medok;
-      MEDfileCompatibility(fileName.c_str(), &hdfok, &medok);
-      if ( hdfok && medok ) {
+      med_err r0 = MEDfileCompatibility(fileName.c_str(), &hdfok, &medok);
+      //MESSAGE(r0 << " " << hdfok << " " << medok);
+      if ( r0==0 && hdfok && medok ) {
         med_idt aFid = MEDfileOpen(fileName.c_str(), MED_ACC_RDONLY);
         if (aFid >= 0) {
           med_int major, minor, release;
           med_err ret = MEDfileNumVersionRd(aFid, &major, &minor, &release);
+          //MESSAGE(ret << " " << major << "." << minor << "." << release);
           if (ret >= 0) {
-            int version = 100*major + minor;
-            if (version >= 202)
+            bool isReadOnly = !isForAppend;
+            if ( isReadOnly  || ((major == MED_MAJOR_NUM) && (minor == MED_MINOR_NUM)))
               ok = true;
           }
         }
@@ -113,7 +116,7 @@ namespace MED
 
   PWrapper CrWrapperW(const std::string& fileName, int theMinor)
   {
-    if (!CheckCompatibility(fileName))
+    if (!CheckCompatibility(fileName, true))
       remove(fileName.c_str());
     return new MED::TWrapper(fileName, theMinor);
   }
index 7313da7ec210ce7217ec2581dce697ff349bc14d..fe5e0032ce95b60b60600db5c7365d62c707dff1 100644 (file)
@@ -37,7 +37,7 @@ namespace MED
   bool GetMEDVersion( const std::string&, int&, int&, int& );
 
   MEDWRAPPER_EXPORT
-  bool CheckCompatibility( const std::string& );
+  bool CheckCompatibility( const std::string& , bool isForAppend=false);
 
   MEDWRAPPER_EXPORT
   PWrapper CrWrapperR( const std::string& );
index 25977a776107cdba7778dd5282133e89d001bae3..99aa9608c63e6f87fdd1e38b8854f1b5c6352baa 100644 (file)
@@ -655,7 +655,8 @@ namespace
     // Get parameters of export operation
 
     QString aFilename;
-    int aFormat =-1; // for MED minor versions
+    int aFormat =-1;         // for MED minor versions
+    bool isOkToWrite = true; // to check MED file version compatibility before adding a mesh in an existing file
 
     // Init the parameters with the default values
     bool aIsASCII_STL   = true;
@@ -708,7 +709,7 @@ namespace
 
       if ( fd->exec() )
         aFilename = fd->selectedFile();
-      toOverwrite    = fv->isOverwrite();
+      toOverwrite    = fv->isOverwrite(aFilename);
       toCreateGroups = fd->IsChecked(0);
       SMESHGUI::resourceMgr()->setValue("SMESH", theByTypeResource, toCreateGroups );
 
@@ -747,19 +748,19 @@ namespace
       if ( isMED ) {
         //filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)";
         QString vmed (aMesh->GetVersionString(-1, 2));
-        MESSAGE("MED version: " << vmed.toStdString());
+        //MESSAGE("MED version: " << vmed.toStdString());
         int minor = vmed.split(".").last().toInt();
-        MESSAGE("MED version minor: "<< minor);
-        minor +=3; // TODO test, to remove
+        //MESSAGE("MED version minor: "<< minor);
+        //minor +=3;                  // TODO remove: test multiple minor
         aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vmed ) + " (*.med)", minor );
         for (int ii=0; ii<minor; ii++)
           {
             QString vs = aMesh->GetVersionString(ii, 2);
-            std::ostringstream vss; // TODO test, to remove
-            vss << "4.";            //
-            vss << ii;              //
-            vs = vss.str().c_str(); // TODO test, to remove
-            MESSAGE("MED version: " << vs.toStdString());
+            //std::ostringstream vss; // TODO remove: test multiple minor
+            //vss << "4.";            // TODO remove: test multiple minor
+            //vss << ii;              // TODO remove: test multiple minor
+            //vs = vss.str().c_str(); // TODO remove: test multiple minor
+            //MESSAGE("MED version: " << vs.toStdString());
             aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)",  ii);
           }
       }
@@ -810,6 +811,8 @@ namespace
 
       bool is_ok = false;
       while (!is_ok) {
+        //MESSAGE("******* Loop on file dialog ***********");
+        isOkToWrite =true;
         if ( fd->exec() )
           aFilename = fd->selectedFile();
         else {
@@ -817,13 +820,13 @@ namespace
           break;
         }
         aFormat = aFilterMap[fd->selectedNameFilter()];
-        MESSAGE("selected minor: " << aFormat);
-        toOverwrite = fv->isOverwrite();
+        //MESSAGE("selected minor: " << aFormat << " file: " << aFilename.toUtf8().constData());
+        toOverwrite = fv->isOverwrite(aFilename);
         is_ok = true;
         if ( !aFilename.isEmpty() ) {
           if( !toOverwrite ) {
             // can't append to an existing using other format
-            bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckCompatibility( aFilename.toUtf8().constData() );
+            bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckWriteCompatibility( aFilename.toUtf8().constData() );
             if ( !isVersionOk ) {
               int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                                   QObject::tr("SMESH_WRN_WARNING"),
@@ -831,11 +834,17 @@ namespace
                                                   QObject::tr("SMESH_BUT_YES"),
                                                   QObject::tr("SMESH_BUT_NO"), 0, 1);
               if (aRet == 0)
-                toOverwrite = true;
+                {
+                  toOverwrite = true;
+                  MESSAGE("incompatible MED file version for add, overwrite accepted");
+                }
               else
-                is_ok = false;
+                {
+                  isOkToWrite = false;
+                  is_ok = false;
+                  MESSAGE("incompatible MED file version for add, overwrite refused");
+                }
             }
-
             QStringList aMeshNamesCollisionList;
             SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() );
             for( int i = 0, n = aMeshNames->length(); i < n; i++ ) {
@@ -848,7 +857,8 @@ namespace
                 }
               }
             }
-            if( !aMeshNamesCollisionList.isEmpty() ) {
+           if( !aMeshNamesCollisionList.isEmpty() ) {
+              isOkToWrite = false;
               QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " );
               int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
                                                   QObject::tr("SMESH_WRN_WARNING"),
@@ -856,14 +866,18 @@ namespace
                                                   QObject::tr("SMESH_BUT_YES"),
                                                   QObject::tr("SMESH_BUT_NO"),
                                                   QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
-              if (aRet == 0)
+             //MESSAGE("answer collision name " << aRet);
+             if (aRet == 0) {
                 toOverwrite = true;
+                isOkToWrite = true;
+              }
               else if (aRet == 2)
                 is_ok = false;
             }
           }
         }
       }
+      //MESSAGE(" ****** end of file dialog loop")
       toCreateGroups = fd->IsChecked(0);
       toFindOutDim   = fd->IsChecked(1);
       fieldSelWdg->GetSelectedFields();
@@ -898,8 +912,9 @@ namespace
 //           if ( SMESHGUI::automaticUpdate() )
 //             SMESH::UpdateView();
 //         }
-        if ( isMED )
+        if ( isMED && isOkToWrite)
         {
+          //MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData());
           aMeshIter = aMeshList.begin();
           for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
           {
index cf17da47412ecd9470c22cd4428033999e7bf313..3583310ce4ff1025ec07cbbf25333bf2370b4f1a 100755 (executable)
@@ -72,3 +72,10 @@ bool SMESHGUI_FileValidator::canSave( const QString& fileName, bool checkPermiss
   }
   return true;
 }
+
+bool SMESHGUI_FileValidator::isOverwrite( const QString& fileName) const
+{
+  if ( QFile::exists( fileName ) )
+    return myIsOverwrite;
+  return true;
+}
index f80e8c5df075cde4aacb2c9d3adcae455f81d548..764a221bfe690cc42a8fb296c205351ef355fbec 100755 (executable)
@@ -37,7 +37,7 @@ public:
   
   virtual bool canSave( const QString&, bool = true );
 
-  bool         isOverwrite() const { return myIsOverwrite; }
+  bool         isOverwrite( const QString& fileName) const;
 
 private:
   bool         myIsOverwrite;
index 3a575aa0a20e5997b409d47dbbb376c5297631e1..1e97d50b23dd4d8bea3025862e5d755f44c0191f 100644 (file)
@@ -2959,7 +2959,7 @@ char* SMESH_Gen_i::GetMEDVersion(const char* theFileName)
 /*!
  *  SMESH_Gen_i::CheckCompatibility
  *
- *  Check compatibility of file with MED format being used.
+ *  Check compatibility of file with MED format being used, read only.
  */
 //================================================================================
 CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName)
@@ -2967,6 +2967,18 @@ CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName)
   return MED::CheckCompatibility( theFileName );
 }
 
+//================================================================================
+/*!
+ *  SMESH_Gen_i::CheckWriteCompatibility
+ *
+ *  Check compatibility of file with MED format being used, for append on write.
+ */
+//================================================================================
+CORBA::Boolean SMESH_Gen_i::CheckWriteCompatibility(const char* theFileName)
+{
+  return MED::CheckCompatibility( theFileName, true );
+}
+
 //================================================================================
 /*!
  *  SMESH_Gen_i::GetMeshNames
@@ -2976,10 +2988,12 @@ CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName)
 //================================================================================
 SMESH::string_array* SMESH_Gen_i::GetMeshNames(const char* theFileName)
 {
+  //MESSAGE("GetMeshNames " << theFileName);
   SMESH::string_array_var aResult = new SMESH::string_array();
   MED::PWrapper aMed = MED::CrWrapperR( theFileName );
   MED::TErr anErr;
   MED::TInt aNbMeshes = aMed->GetNbMeshes( &anErr );
+  //MESSAGE("---" << aNbMeshes);
   if( anErr >= 0 ) {
     aResult->length( aNbMeshes );
     for( MED::TInt i = 0; i < aNbMeshes; i++ ) {
index dc0f27f957426dc32891c7db677c47cfb66125ca..2360fd4d17ea482d0307e8326fd7871056dfebac 100644 (file)
@@ -348,9 +348,12 @@ public:
   // Get MED version of the file by its name
   char* GetMEDVersion(const char* theFileName);
 
-  // Check compatibility of file with MED format being used.
+  // Check compatibility of file with MED format being used, read only.
   CORBA::Boolean CheckCompatibility(const char* theFileName);
 
+  // Check compatibility of file with MED format being used, for append on write.
+  CORBA::Boolean CheckWriteCompatibility(const char* theFileName);
+
   // Get names of meshes defined in file with the specified name
   SMESH::string_array* GetMeshNames(const char* theFileName);
 
index dbf9013d5621f75bbbf8b6cdd6771ab42012662a..10bfa8d8ed6ad68ca63e07a7f6d44d7a0c9d69ea 100644 (file)
@@ -3005,7 +3005,7 @@ void SMESH_Mesh_i::ExportMED(const char*        file,
                              CORBA::Boolean     autoDimension)
   throw(SALOME::SALOME_Exception)
 {
-  MESSAGE("MED minor version: "<< minor);
+  //MESSAGE("MED minor version: "<< minor);
   SMESH_TRY;
   if ( _preMeshInfo )
     _preMeshInfo->FullLoadFromFile();
@@ -3136,7 +3136,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
                                    const char*               geomAssocFields)
   throw (SALOME::SALOME_Exception)
 {
-  MESSAGE("MED minor version: "<< minor);
+  //MESSAGE("MED minor version: "<< minor);
   SMESH_TRY;
   if ( _preMeshInfo )
     _preMeshInfo->FullLoadFromFile();