From c58add1af5c5f2bb0c9ae42b3ff1e8169bfa7281 Mon Sep 17 00:00:00 2001 From: Paul RASCLE Date: Wed, 18 Jul 2018 15:51:37 +0200 Subject: [PATCH] debug exporting MED files, adding meshes, different MED versions... --- idl/SMESH_Gen.idl | 7 +++- src/MEDWrapper/MED_Factory.cxx | 15 ++++--- src/MEDWrapper/MED_Factory.hxx | 2 +- src/SMESHGUI/SMESHGUI.cxx | 53 ++++++++++++++++--------- src/SMESHGUI/SMESHGUI_FileValidator.cxx | 7 ++++ src/SMESHGUI/SMESHGUI_FileValidator.h | 2 +- src/SMESH_I/SMESH_Gen_i.cxx | 16 +++++++- src/SMESH_I/SMESH_Gen_i.hxx | 5 ++- src/SMESH_I/SMESH_Mesh_i.cxx | 4 +- 9 files changed, 79 insertions(+), 32 deletions(-) diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index ec7b9ebba..81e4a48cc 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -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. */ diff --git a/src/MEDWrapper/MED_Factory.cxx b/src/MEDWrapper/MED_Factory.cxx index 52558d0f4..51fe44ce3 100644 --- a/src/MEDWrapper/MED_Factory.cxx +++ b/src/MEDWrapper/MED_Factory.cxx @@ -35,6 +35,7 @@ extern "C" #include #endif } +#include 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); } diff --git a/src/MEDWrapper/MED_Factory.hxx b/src/MEDWrapper/MED_Factory.hxx index 7313da7ec..fe5e0032c 100644 --- a/src/MEDWrapper/MED_Factory.hxx +++ b/src/MEDWrapper/MED_Factory.hxx @@ -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& ); diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 25977a776..99aa9608c 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -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; iiGetVersionString(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++ ) { diff --git a/src/SMESHGUI/SMESHGUI_FileValidator.cxx b/src/SMESHGUI/SMESHGUI_FileValidator.cxx index cf17da474..3583310ce 100755 --- a/src/SMESHGUI/SMESHGUI_FileValidator.cxx +++ b/src/SMESHGUI/SMESHGUI_FileValidator.cxx @@ -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; +} diff --git a/src/SMESHGUI/SMESHGUI_FileValidator.h b/src/SMESHGUI/SMESHGUI_FileValidator.h index f80e8c5df..764a221bf 100755 --- a/src/SMESHGUI/SMESHGUI_FileValidator.h +++ b/src/SMESHGUI/SMESHGUI_FileValidator.h @@ -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; diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 3a575aa0a..1e97d50b2 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -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++ ) { diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index dc0f27f95..2360fd4d1 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -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); diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index dbf9013d5..10bfa8d8e 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -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(); -- 2.30.2