debug exporting MED files, adding meshes, different MED versions...

This commit is contained in:
Paul RASCLE 2018-07-18 15:51:37 +02:00
parent 49ff23c94f
commit c58add1af5
9 changed files with 79 additions and 32 deletions

View 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.
*/

View 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);
}

View 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& );

View 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++ )
{

View File

@ -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;
}

View File

@ -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;

View 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++ ) {

View 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);

View 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();