From: vsr Date: Mon, 13 Feb 2017 13:56:14 +0000 (+0300) Subject: 0021803: EDF 2351 : Available versions of MED in TUI function ExportMED aren't consis... X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=66911d7aa9e23e7424847ded4f17d9814e15aac9;p=modules%2Fsmesh.git 0021803: EDF 2351 : Available versions of MED in TUI function ExportMED aren't consistent with GUI behavior Step 2: Remove deprecated MED_VERSION enumerator. --- diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index 75fbe0894..5e03a34ee 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -406,10 +406,20 @@ module SMESH */ long GetObjectId(in Object theObject); + /*! + * \brief Get version of MED format being used. + */ + string GetMEDFileVersion(); + /*! * \brief Get MED version of the file by its name. */ - boolean GetMEDVersion(in string theFileName, out MED_VERSION theVersion); + string GetMEDVersion(in string theFileName); + + /*! + * \brief Check compatibility of file with MED format being used. + */ + boolean CheckCompatibility(in string theFileName); /*! * \brief Get names of meshes defined in file with the specified name. diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index 51c98282c..51ba75dd6 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -235,15 +235,6 @@ module SMESH DRS_FAIL // general failure (exception etc.) }; - /*! - * Enumeration for ExportToMED*() - */ - enum MED_VERSION - { - MED_V2_1, - MED_V2_2 - }; - /*! * \brief A structure containing information about MED file */ @@ -634,7 +625,6 @@ module SMESH * - auto_groups : boolean parameter for creating/not creating * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; * the typical use is auto_groups=false. - * - version : defines the version of format of MED file, that will be created * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists * - autoDimension : if @c true, a space dimension of a MED mesh can be either * - 1D if all mesh nodes lie on OX coordinate axis, or @@ -644,7 +634,6 @@ module SMESH */ void ExportToMEDX( in string file, in boolean auto_groups, - in MED_VERSION version, in boolean overwrite, in boolean autoDimension) raises (SALOME::SALOME_Exception); @@ -653,7 +642,6 @@ module SMESH * @params * - meshPart : a part of mesh to store * - file : name of the MED file - * - version : define the version of format of MED file, that will be created * - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists * - autoDimension : if @c True, a space dimension for export is defined by mesh * configuration; for example a planar mesh lying on XOY plane @@ -670,25 +658,23 @@ module SMESH void ExportPartToMED( in SMESH_IDSource meshPart, in string file, in boolean auto_groups, - in MED_VERSION version, in boolean overwrite, in boolean autoDimension, in GEOM::ListOfFields fields, in string geomAssocFields ) raises (SALOME::SALOME_Exception); /*! - * Export Mesh to a MED Format file + * Export Mesh to a MED file * Works, just the same as ExportToMEDX, with overwrite parameter equal to true. * The method is kept in order to support old functionality */ - void ExportToMED( in string file, in boolean auto_groups, in MED_VERSION theVersion ) + void ExportToMED( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); /*! - * Export Mesh to MED_V2_1 MED format - * Works, just the same as ExportToMEDX with MED_VERSION parameter equal to MED_V2_1 - * and overwrite parameter equal to true - * The method is kept in order to support old functionality + * Export Mesh to MED file. + * This method is deprecated; it is kept only to support old functionality. + * Works exactly as ExportToMED method. */ void ExportMED( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); @@ -700,11 +686,6 @@ module SMESH void ExportSAUV( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); - /*! - * Return string representation of a MED file version comprising nbDigits - */ - string GetVersionString(in MED_VERSION version, in short nbDigits); - /*! * Export Mesh to different Formats * (UNV supported version is I-DEAS 10) diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 283ed6355..1842ec9b9 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -68,21 +68,6 @@ void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName) Driver_SMESHDS_Mesh::SetFile(theFileName); } -string DriverMED_W_SMESHDS_Mesh::GetVersionString(int theNbDigits) -{ - TInt majeur, mineur, release; - majeur = mineur = release = 0; - MED::GetVersionRelease(majeur, mineur, release); - ostringstream name; - if ( theNbDigits > 0 ) - name << majeur; - if ( theNbDigits > 1 ) - name << "." << mineur; - if ( theNbDigits > 2 ) - name << "." << release; - return name.str(); -} - void DriverMED_W_SMESHDS_Mesh::AddGroup(SMESHDS_GroupBase* theGroup) { myGroups.push_back(theGroup); diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h index 27a44bf4b..e4ae890c1 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h @@ -50,8 +50,6 @@ class MESHDRIVERMED_EXPORT DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh void SetFile(const std::string& theFileName); void SetAutoDimension(bool toFindOutDimension) { myAutoDimension = toFindOutDimension; } - static std::string GetVersionString(int theNbDigits=2); - void AddGroupOfNodes(); void AddGroupOfEdges(); void AddGroupOfFaces(); diff --git a/src/MEDWrapper/MED_Factory.cxx b/src/MEDWrapper/MED_Factory.cxx index 34f85e894..a9b8bd2e7 100644 --- a/src/MEDWrapper/MED_Factory.cxx +++ b/src/MEDWrapper/MED_Factory.cxx @@ -36,110 +36,89 @@ extern "C" #endif } -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - namespace MED { - enum EStatus { eBad, eDeprecated, eGood }; - - EStatus GetVersionId(const std::string& theFileName) + bool exists(const std::string& fileName) { - INITMSG(MYDEBUG,"GetVersionId - theFileName = '"<= 0) { + med_int major, minor, release; + med_err ret = MEDfileNumVersionRd(aFid, &major, &minor, &release); + if (ret >= 0) { + int version = 100*major + minor; + if (version >= 202) + ok = true; + } + } + MEDfileClose(aFid); + } } - // 3. Try to open the file with MED API - if ( ok ) { - med_idt aFid = MEDfileOpen(theFileName.c_str(), MED_ACC_RDONLY); + return ok; + } - MSG(MYDEBUG,"GetVersionId - theFileName = '"< + namespace MED { + MEDWRAPPER_EXPORT + std::string GetMEDVersion( const std::string& ); + MEDWRAPPER_EXPORT bool GetMEDVersion( const std::string&, int&, int&, int& ); + MEDWRAPPER_EXPORT + bool CheckCompatibility( const std::string& ); + MEDWRAPPER_EXPORT PWrapper CrWrapperR( const std::string& ); diff --git a/src/MEDWrapper/MED_V2_2_Wrapper.hxx b/src/MEDWrapper/MED_V2_2_Wrapper.hxx index 3c56cd6ed..49b2b26f4 100644 --- a/src/MEDWrapper/MED_V2_2_Wrapper.hxx +++ b/src/MEDWrapper/MED_V2_2_Wrapper.hxx @@ -29,36 +29,6 @@ namespace MED { - MEDWRAPPER_EXPORT - TInt - GetDESCLength(); - - MEDWRAPPER_EXPORT - TInt - GetIDENTLength(); - - MEDWRAPPER_EXPORT - TInt - GetNOMLength(); - - MEDWRAPPER_EXPORT - TInt - GetLNOMLength(); - - MEDWRAPPER_EXPORT - TInt - GetPNOMLength(); - - MEDWRAPPER_EXPORT - void - GetVersionRelease(TInt& majeur, TInt& mineur, TInt& release); - - MEDWRAPPER_EXPORT - TInt - GetNbConn(EGeometrieElement typmai, - EEntiteMaillage typent, - TInt mdim); - namespace V2_2 { //---------------------------------------------------------------------------- diff --git a/src/MEDWrapper/MED_Wrapper.hxx b/src/MEDWrapper/MED_Wrapper.hxx index 19b29f8a8..10a9907a7 100644 --- a/src/MEDWrapper/MED_Wrapper.hxx +++ b/src/MEDWrapper/MED_Wrapper.hxx @@ -978,6 +978,10 @@ namespace MED public: SharedPtr() {} + SharedPtr(TWrapper* p): + boost::shared_ptr(p) + {} + template explicit SharedPtr(Y * p): boost::shared_ptr(p) diff --git a/src/MEDWrapper/mprint_version.cxx b/src/MEDWrapper/mprint_version.cxx index 354769c11..7ade43cdc 100644 --- a/src/MEDWrapper/mprint_version.cxx +++ b/src/MEDWrapper/mprint_version.cxx @@ -27,18 +27,22 @@ int main (int argc, char **argv) { - med_idt aFid = MEDfileOpen(argv[1],MED_ACC_RDONLY); - if(aFid < 0) - exit(1); + if ( argc < 2 ) + return -1; - med_int aMajor, aMinor, aRelease; - med_err aRet = MEDfileNumVersionRd(aFid,&aMajor,&aMinor,&aRelease); - MEDfileClose(aFid); - if(aRet < 0) { - // VSR: simulate med 2.3.6 behavior, med file version is assumed to 2.1 - aMajor=2; - aMinor=aRelease=-1; + med_idt fid = MEDfileOpen(argv[1], MED_ACC_RDONLY); + if (fid < 0) + return 1; + + med_int major, minor, release; + med_err aRet = MEDfileNumVersionRd(fid, &major, &minor, &release); + MEDfileClose(fid); + if (aRet < 0) { + // VSR: simulate med 2.3.6 behavior, med file version is assumed to be 2.1 or older + major = 2; + minor = release = -1; } - printf("%d.%d.%d\n",aMajor,aMinor,aRelease); + printf("%d.%d.%d\n", major, minor, release); + return 0; } diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index e0a067a6d..8344f7de4 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1379,7 +1379,6 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() * \param [in] theAutoGroups - boolean parameter for creating/not creating * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; * the typical use is auto_groups=false. - * \param [in] theVersion - defines the version of format of MED file, that will be created * \param [in] meshPart - mesh data to export * \param [in] theAutoDimension - if \c true, a space dimension of a MED mesh can be either * - 1D if all mesh nodes lie on OX coordinate axis, or @@ -1393,7 +1392,6 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() void SMESH_Mesh::ExportMED(const char * file, const char* theMeshName, bool theAutoGroups, - int /*theVersion*/, const SMESHDS_Mesh* meshPart, bool theAutoDimension, bool theAddODOnVertices) @@ -1474,7 +1472,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; cmd += "\""; system(cmd.c_str()); - ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1); + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups); #ifdef WIN32 cmd = "%PYTHONBIN% "; #else diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 6a6953074..5110b444c 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -250,7 +250,6 @@ class SMESH_EXPORT SMESH_Mesh void ExportMED(const char * theFile, const char* theMeshName = NULL, bool theAutoGroups = true, - int theVersion = 0, const SMESHDS_Mesh* theMeshPart = 0, bool theAutoDimension = false, bool theAddODOnVertices = false) diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 31f16a61f..0b0679335 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -234,8 +234,8 @@ namespace } #endif else if ( theCommandID == SMESHOp::OpImportSAUV ) { - filter.append( QObject::tr( "SAUV files (*.sauv*)" ) ); - filter.append( QObject::tr( "All files (*)" ) ); + filter.append( QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)" ); + filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); } else if ( theCommandID == SMESHOp::OpImportGMF ) { filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" ); @@ -640,8 +640,7 @@ namespace // Get parameters of export operation - QString aFilename; - SMESH::MED_VERSION aFormat = SMESH::MED_V2_2; + QString aFilename; // Init the parameters with the default values bool aIsASCII_STL = true; bool toCreateGroups = false; @@ -718,27 +717,14 @@ namespace } else if ( isMED || isSAUV ) // Export to MED or SAUV { - QMap aFilterMap; - //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2)); + QStringList filters; if ( isMED ) { - QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2)); - //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 ); - aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 ); + filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)"; } else { // isSAUV - aFilterMap.insert("All files (*)", SMESH::MED_V2_1 ); - aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 ); - aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 ); + filters << QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)"; } - QStringList filters; - QString aDefaultFilter; - QMap::const_iterator it = aFilterMap.begin(); - for ( ; it != aFilterMap.end(); ++it ) { - filters.push_back( it.key() ); - if (it.value() == SMESH::MED_V2_2) - aDefaultFilter = it.key(); - } QStringList checkBoxes; checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM"); @@ -751,7 +737,6 @@ namespace new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList ); fd->setWindowTitle( aTitle ); fd->setNameFilters( filters ); - fd->selectNameFilter( aDefaultFilter ); fd->SetChecked( toCreateGroups, 0 ); fd->SetChecked( toFindOutDim, 1 ); if ( !anInitialPath.isEmpty() ) @@ -779,34 +764,13 @@ namespace aFilename = QString::null; break; } - aFormat = aFilterMap[fd->selectedNameFilter()]; toOverwrite = fv->isOverwrite(); is_ok = true; if ( !aFilename.isEmpty() ) { - // med-2.1 does not support poly elements - if ( aFormat==SMESH::MED_V2_1 ) - for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) { - SMESH::SMESH_IDSource_var aMeshItem = (*aMeshIter).first; - SMESH::long_array_var nbElems = aMeshItem->GetMeshInfo(); - if ( nbElems[ SMESH::Entity_Polygon ] + nbElems[ SMESH::Entity_Quad_Polygon ] + - nbElems[ SMESH::Entity_Polyhedra ] + nbElems[ SMESH::Entity_Quad_Polyhedra ]) - { - int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_EXPORT_MED_V2_1").arg((*aMeshIter).second), - QObject::tr("SMESH_BUT_YES"), - QObject::tr("SMESH_BUT_NO"), 0, 1); - if (aRet != 0) { - is_ok = false; - break; - } - } - } if( !toOverwrite ) { // can't append to an existing using other format - SMESH::MED_VERSION aVersion = SMESH::MED_V2_1; - bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toUtf8().constData(), aVersion ); - if( !isVersionOk || aVersion != aFormat ) { + bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckCompatibility( aFilename.toUtf8().constData() ); + if ( !isVersionOk ) { int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename), @@ -892,10 +856,10 @@ namespace const bool hasFields = ( fields.length() || !geoAssFields.isEmpty() ); if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem )) aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim ); + toOverwrite && aMeshIndex == 0, toFindOutDim ); else aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, - aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim, + toOverwrite && aMeshIndex == 0, toFindOutDim, fields, geoAssFields.toLatin1().data() ); } } diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index ec5537169..4f68dc2a6 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER MED files + + SAUV_FILES_FILTER + SAUV files + IDEAS_FILES_FILTER IDEAS files @@ -23,10 +27,6 @@ TEXT_FILES_FILTER TXT files - - MED_VX_FILES_FILTER - MED %1 files - STL_FILES_FILTER STL files @@ -1764,13 +1764,6 @@ Do you want to continue? SMESH_EXPORT_ONLY_GPOUP You are going to export the group without its mesh. Do you want to continue? - - - SMESH_EXPORT_MED_V2_1 - During export mesh with name - "%1" to MED 2.1 -polygons and polyhedrons elements will be missed -For correct export use MED 2.2 -Are you sure want to export to MED 2.1? SMESH_EXPORT_MED_VERSION_COLLISION diff --git a/src/SMESHGUI/SMESH_msg_fr.ts b/src/SMESHGUI/SMESH_msg_fr.ts index 258d8ad78..a8791df48 100755 --- a/src/SMESHGUI/SMESH_msg_fr.ts +++ b/src/SMESHGUI/SMESH_msg_fr.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER Fichiers MED + + SAUV_FILES_FILTER + Fichiers SAUV + IDEAS_FILES_FILTER Fichiers IDEAS @@ -23,10 +27,6 @@ TEXT_FILES_FILTER Fichiers TXT - - MED_VX_FILES_FILTER - Fichiers MED %1 - STL_FILES_FILTER Fichiers STL @@ -1748,13 +1748,6 @@ Voulez-vous continuer ? SMESH_EXPORT_ONLY_GPOUP Vous allez export le groupe sans son maillage. Voulez-vous continuer ? - - - SMESH_EXPORT_MED_V2_1 - Les éléments polygonaux et polyèdriques seront omis -dans le cas d'exportation du maillage "%1" à MED 2.1 -Utilisez MED 2.2 pour l'exportation correcte. -Voulez-vous effectuer l'exportation à MED 2.1 ? SMESH_EXPORT_MED_VERSION_COLLISION diff --git a/src/SMESHGUI/SMESH_msg_ja.ts b/src/SMESHGUI/SMESH_msg_ja.ts index d18673c16..c877ebeb7 100644 --- a/src/SMESHGUI/SMESH_msg_ja.ts +++ b/src/SMESHGUI/SMESH_msg_ja.ts @@ -11,6 +11,10 @@ MED_FILES_FILTER MEDファイル + + SAUV_FILES_FILTER + SAUVファイル + IDEAS_FILES_FILTER IDEAS ファイル @@ -23,10 +27,6 @@ TEXT_FILES_FILTER TXT ファイル - - MED_VX_FILES_FILTER - ファイル MED %1 - STL_FILES_FILTER STL ファイル @@ -1731,10 +1731,6 @@ SMESH_EXPORT_ONLY_GPOUP そのメッシュなしでグループのエクスポートをしようとしています。続行しますか? - - SMESH_EXPORT_MED_V2_1 - 多角形、多面体要素は正しいエクスポート用 MED 2.1 MED 2.2 にメッシュ '%' のエクスポートの場合省略されます。MED 2.1 をエクスポートしますか。 - SMESH_EXPORT_MED_VERSION_COLLISION ファイル「%1」MED バージョンは知られていないか、選択したバージョンと一致しません。ファイルを上書きしますか。 diff --git a/src/SMESH_I/CMakeLists.txt b/src/SMESH_I/CMakeLists.txt index 155916e38..37683dacf 100644 --- a/src/SMESH_I/CMakeLists.txt +++ b/src/SMESH_I/CMakeLists.txt @@ -114,7 +114,7 @@ SET(SMESHEngine_HEADERS SET(SMESHEngine_SOURCES SMESH_Gen_i.cxx SMESH_Gen_i_1.cxx - SMESH_DumpPython.cxx + SMESH_PythonDump.cxx SMESH_Mesh_i.cxx SMESH_subMesh_i.cxx SMESH_MeshEditor_i.cxx diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 17ee75746..ba4b90f06 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -440,6 +440,18 @@ namespace { } } } + + bool _FilterArg( const _AString& theArg ) + { + static std::list<_AString> filteredArgs; + static bool initialized = false; + if ( !initialized ) { + initialized = true; + filteredArgs.push_back( "SMESH.MED_V2_1" ); + filteredArgs.push_back( "SMESH.MED_V2_2" ); + } + return std::find( filteredArgs.begin(), filteredArgs.end(), theArg ) != filteredArgs.end(); + } } //================================================================================ @@ -1978,12 +1990,21 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) method == "ExportToMEDX" ) // ExportToMEDX() --> ExportMED() { theCommand->SetMethod( "ExportMED" ); - if ( theCommand->GetNbArgs() == 5 ) + // filter out deprecated version parameter + vector< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( !_FilterArg( theCommand->GetArg( i ) ) ) + args.push_back( theCommand->GetArg( i ) ); + } + theCommand->RemoveArgs(); + for ( uint i = 0; i < args.size(); i++ ) + theCommand->SetArg( i+1, args[i] ); + if ( theCommand->GetNbArgs() == 4 ) { // ExportToMEDX(...,autoDimension) -> ExportToMEDX(...,meshPart=None,autoDimension) - _AString autoDimension = theCommand->GetArg( 5 ); - theCommand->SetArg( 5, "None" ); - theCommand->SetArg( 6, autoDimension ); + _AString autoDimension = theCommand->GetArg( 4 ); + theCommand->SetArg( 4, "None" ); + theCommand->SetArg( 5, autoDimension ); } } else if ( method == "ExportCGNS" ) @@ -2009,6 +2030,15 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand ) TCollection_AsciiString newMethod = method; newMethod.Remove( /*where=*/7, /*howmany=*/6 ); theCommand->SetMethod( newMethod ); + // filter out deprecated version parameter + vector< _AString > args; + for ( int i = 1; i <= theCommand->GetNbArgs(); i++ ) { + if ( !_FilterArg( theCommand->GetArg( i ) ) ) + args.push_back( theCommand->GetArg( i ) ); + } + theCommand->RemoveArgs(); + for ( uint i = 0; i < args.size(); i++ ) + theCommand->SetArg( i+1, args[i] ); // make the 1st arg be the last one (or last but three for ExportMED()) _pyID partID = theCommand->GetArg( 1 ); int nbArgs = theCommand->GetNbArgs() - 3 * (newMethod == "ExportMED"); diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx deleted file mode 100644 index e22a87c77..000000000 --- a/src/SMESH_I/SMESH_DumpPython.cxx +++ /dev/null @@ -1,1402 +0,0 @@ -// Copyright (C) 2007-2016 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 -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -// -// File : SMESH_DumpPython.cxx -// Created : Thu Mar 24 17:17:59 2005 -// Author : Julia DOROVSKIKH -// Module : SMESH - -#include "SMESH_PythonDump.hxx" - -#include "SMESH_2smeshpy.hxx" -#include "SMESH_Comment.hxx" -#include "SMESH_Filter_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_MeshEditor_i.hxx" - -#include - -#include -#include -#include -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -#include "SMESH_TryCatch.hxx" - -namespace SMESH -{ - - size_t TPythonDump::myCounter = 0; - const char theNotPublishedObjectName[] = "__NOT__Published__Object__"; - - TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } - TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true) - { - for ( size_t i = 0; i < value.length(); i++) - myVals[i] = SMESH_Comment(value[i]); - } - - TPythonDump:: - TPythonDump():myVarsCounter(0) - { - ++myCounter; - } - TPythonDump:: - ~TPythonDump() - { - if(--myCounter == 0){ - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - std::string aString = myStream.str(); - TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); - SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); - if(!aStudy->_is_nil() && !aCollection.IsEmpty()) - { - const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); - if ( !objEntry.empty() ) - aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); - aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection); - if(MYDEBUG) MESSAGE(aString); - // prevent misuse of already treated variables - aSMESHGen->UpdateParameters(CORBA::Object_var().in(),""); - } - } - } - - TPythonDump& //!< store a variable value. Write either a value or '$varID$' - TPythonDump:: - operator<<(const TVar& theVarValue) - { - const std::vector< int >& varIDs = SMESH_Gen_i::GetSMESHGen()->GetLastParamIndices(); - if ( theVarValue.myIsList ) - { - myStream << "[ "; - for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i ) - { - if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) - myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); - else - myStream << theVarValue.myVals[i-1]; - if ( i < theVarValue.myVals.size() ) - myStream << ", "; - ++myVarsCounter; - } - myStream << " ]"; - } - else - { - if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) - myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); - else - myStream << theVarValue.myVals[0]; - ++myVarsCounter; - } - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(long int theArg){ - myStream< - void DumpArray(const TArray& theArray, TPythonDump & theStream) - { - if ( theArray.length() == 0 ) - { - theStream << "[]"; - } - else - { - theStream << "[ "; - for (CORBA::ULong i = 1; i <= theArray.length(); i++) { - theStream << theArray[i-1]; - if ( i < theArray.length() ) - theStream << ", "; - } - theStream << " ]"; - } - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::long_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::double_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::nodes_array& theArg) - { - DumpArray( theArg, *this ); - return *this; - } - - TPythonDump& - TPythonDump::operator<<(const SMESH::string_array& theArray) - { - myStream << "[ "; - for ( CORBA::ULong i = 1; i <= theArray.length(); i++ ) { - myStream << "'" << theArray[i-1] << "'"; - if ( i < theArray.length() ) - myStream << ", "; - } - myStream << " ]"; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SALOMEDS::SObject_ptr aSObject) - { - if ( !aSObject->_is_nil() ) { - CORBA::String_var entry = aSObject->GetID(); - myStream << entry.in(); - } - else { - myStream << theNotPublishedObjectName; - } - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(CORBA::Object_ptr theArg) - { - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); - if(!aSObject->_is_nil()) { - CORBA::String_var id = aSObject->GetID(); - myStream << id; - } else if ( !CORBA::is_nil(theArg)) { - if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object - myStream << "smeshObj_" << size_t(theArg); - else - myStream << theNotPublishedObjectName; - } - else - myStream << "None"; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::SMESH_Hypothesis_ptr theArg) - { - SALOMEDS::Study_var aStudy = SMESH_Gen_i::GetSMESHGen()->GetCurrentStudy(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); - if(aSObject->_is_nil() && !CORBA::is_nil(theArg)) - myStream << "hyp_" << theArg->GetId(); - else - *this << aSObject; - return *this; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::SMESH_IDSource_ptr theArg) - { - if ( CORBA::is_nil( theArg ) ) - return *this << "None"; - SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); - SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); - if(!aSObject->_is_nil()) - { - return *this << aSObject; - } - if ( SMESH::Filter_i* filter = SMESH::DownCast( theArg )) - { - return *this << filter; - } - if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theArg )) - { - SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); - SMESH::long_array_var anElementsId = theArg->GetIDs(); - SMESH::array_of_ElementType_var types = theArg->GetTypes(); - SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; - SALOMEDS::SObject_wrap meshSO = SMESH_Gen_i::ObjectToSObject(aStudy,mesh); - if ( meshSO->_is_nil() ) // don't waste memory for dumping not published objects - return *this << mesh << ".GetIDSource([], " << type << ")"; - else - return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")"; - } - return *this << theNotPublishedObjectName; - } - - TPythonDump& - TPythonDump:: - operator<<(SMESH::FilterLibrary_i* theArg) - { - myStream<<"aFilterLibrary"<GetFunctorType(); - switch(aFunctorType) { - case FT_AspectRatio: myStream<< "aAspectRatio"; break; - case FT_AspectRatio3D: myStream<< "aAspectRatio3D"; break; - case FT_Warping: myStream<< "aWarping"; break; - case FT_MinimumAngle: myStream<< "aMinimumAngle"; break; - case FT_Taper: myStream<< "aTaper"; break; - case FT_Skew: myStream<< "aSkew"; break; - case FT_Area: myStream<< "aArea"; break; - case FT_Volume3D: myStream<< "aVolume3D"; break; - case FT_MaxElementLength2D: myStream<< "aMaxElementLength2D"; break; - case FT_MaxElementLength3D: myStream<< "aMaxElementLength3D"; break; - case FT_FreeBorders: myStream<< "aFreeBorders"; break; - case FT_FreeEdges: myStream<< "aFreeEdges"; break; - case FT_FreeNodes: myStream<< "aFreeNodes"; break; - case FT_FreeFaces: myStream<< "aFreeFaces"; break; - case FT_EqualNodes: myStream<< "aEqualNodes"; break; - case FT_EqualEdges: myStream<< "aEqualEdges"; break; - case FT_EqualFaces: myStream<< "aEqualFaces"; break; - case FT_EqualVolumes: myStream<< "aEqualVolumes"; break; - case FT_MultiConnection: myStream<< "aMultiConnection"; break; - case FT_MultiConnection2D: myStream<< "aMultiConnection2D"; break; - case FT_Length: myStream<< "aLength"; break; - case FT_Length2D: myStream<< "aLength2D"; break; - case FT_NodeConnectivityNumber:myStream<< "aNodeConnectivityNumber";break; - case FT_BelongToMeshGroup: myStream<< "aBelongToMeshGroup"; break; - case FT_BelongToGeom: myStream<< "aBelongToGeom"; break; - case FT_BelongToPlane: myStream<< "aBelongToPlane"; break; - case FT_BelongToCylinder: myStream<< "aBelongToCylinder"; break; - case FT_BelongToGenSurface: myStream<< "aBelongToGenSurface"; break; - case FT_LyingOnGeom: myStream<< "aLyingOnGeom"; break; - case FT_RangeOfIds: myStream<< "aRangeOfIds"; break; - case FT_BadOrientedVolume: myStream<< "aBadOrientedVolume"; break; - case FT_BareBorderVolume: myStream<< "aBareBorderVolume"; break; - case FT_BareBorderFace: myStream<< "aBareBorderFace"; break; - case FT_OverConstrainedVolume: myStream<< "aOverConstrainedVolume"; break; - case FT_OverConstrainedFace: myStream<< "aOverConstrainedFace"; break; - case FT_LinearOrQuadratic: myStream<< "aLinearOrQuadratic"; break; - case FT_GroupColor: myStream<< "aGroupColor"; break; - case FT_ElemGeomType: myStream<< "aElemGeomType"; break; - case FT_EntityType: myStream<< "aEntityType"; break; - case FT_CoplanarFaces: myStream<< "aCoplanarFaces"; break; - case FT_BallDiameter: myStream<< "aBallDiameter"; break; - case FT_ConnectedElements: myStream<< "aConnectedElements"; break; - case FT_LessThan: myStream<< "aLessThan"; break; - case FT_MoreThan: myStream<< "aMoreThan"; break; - case FT_EqualTo: myStream<< "aEqualTo"; break; - case FT_LogicalNOT: myStream<< "aLogicalNOT"; break; - case FT_LogicalAND: myStream<< "aLogicalAND"; break; - case FT_LogicalOR: myStream<< "aLogicalOR"; break; - case FT_Undefined: myStream<< "anUndefined"; break; - //default: -- commented to have a compilation warning - } - myStream<GetMeshId() : -1 ); return *this; - } - - TPythonDump& TPythonDump::operator<<(const TCollection_AsciiString & theStr) - { - myStream << theStr; return *this; - } - - - TPythonDump& TPythonDump::operator<<(SMESH::MED_VERSION theVersion) - { - switch (theVersion) { - case SMESH::MED_V2_1: myStream << "SMESH.MED_V2_1"; break; - case SMESH::MED_V2_2: myStream << "SMESH.MED_V2_2"; break; - default: myStream << theVersion; - } - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::AxisStruct & theAxis) - { - *this << "SMESH.AxisStruct( " - << TVar( theAxis.x ) << ", " - << TVar( theAxis.y ) << ", " - << TVar( theAxis.z ) << ", " - << TVar( theAxis.vx ) << ", " - << TVar( theAxis.vy ) << ", " - << TVar( theAxis.vz ) << " )"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::DirStruct & theDir) - { - const SMESH::PointStruct & P = theDir.PS; - *this << "SMESH.DirStruct( SMESH.PointStruct ( " - << TVar( P.x ) << ", " - << TVar( P.y ) << ", " - << TVar( P.z ) << " ))"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::PointStruct & P) - { - *this << "SMESH.PointStruct ( " - << TVar( P.x ) << ", " - << TVar( P.y ) << ", " - << TVar( P.z ) << " )"; - return *this; - } - - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups * theList) - { - DumpArray( *theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGO& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGBO& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::ListOfIDSources& theList) - { - DumpArray( theList, *this ); - return *this; - } - TPythonDump& TPythonDump::operator<<(const SMESH::CoincidentFreeBorders& theCFB) - { - // dump CoincidentFreeBorders as a list of lists, each enclosed list - // contains node IDs of a group of coincident free borders where - // each consequent triple of IDs describe a free border: (n1, n2, nLast) - // For example [[1, 2, 10, 20, 21, 40], [11, 12, 15, 55, 54, 41]] describes - // two groups of coincident free borders, each group including two borders - - myStream << "["; - for ( CORBA::ULong i = 0; i < theCFB.coincidentGroups.length(); ++i ) - { - const SMESH::FreeBordersGroup& aGRP = theCFB.coincidentGroups[ i ]; - if ( i ) myStream << ","; - myStream << "["; - for ( CORBA::ULong iP = 0; iP < aGRP.length(); ++iP ) - { - const SMESH::FreeBorderPart& aPART = aGRP[ iP ]; - if ( 0 <= aPART.border && aPART.border < (CORBA::Long)theCFB.borders.length() ) - { - if ( iP ) myStream << ", "; - const SMESH::FreeBorder& aBRD = theCFB.borders[ aPART.border ]; - myStream << aBRD.nodeIDs[ aPART.node1 ] << ","; - myStream << aBRD.nodeIDs[ aPART.node2 ] << ","; - myStream << aBRD.nodeIDs[ aPART.nodeLast ]; - } - } - myStream << "]"; - } - myStream << "]"; - - return *this; - } - - const char* TPythonDump::NotPublishedObjectName() - { - return theNotPublishedObjectName; - } - - TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" ); - TCollection_AsciiString myLongStringEnd ( "TPythonDump::LongStringEnd" ); - - //================================================================================ - /*! - * \brief Return marker of long string literal beginning - * \param type - a name of functionality producing the string literal - * \retval TCollection_AsciiString - the marker string to be written into - * a raw python script - */ - //================================================================================ - - TCollection_AsciiString TPythonDump::LongStringStart(const char* type) - { - return - myLongStringStart + - (Standard_Integer) strlen(type) + - " " + - (char*) type; - } - - //================================================================================ - /*! - * \brief Return marker of long string literal end - * \retval TCollection_AsciiString - the marker string to be written into - * a raw python script - */ - //================================================================================ - - TCollection_AsciiString TPythonDump::LongStringEnd() - { - return myLongStringEnd; - } - - //================================================================================ - /*! - * \brief Cut out a long string literal from a string - * \param theText - text possibly containing string literals - * \param theFrom - position in the text to search from - * \param theLongString - the retrieved literal - * \param theStringType - a name of functionality produced the literal - * \retval bool - true if a string literal found - * - * The literal is removed from theText; theFrom points position right after - * the removed literal - */ - //================================================================================ - - bool TPythonDump::CutoutLongString( TCollection_AsciiString & theText, - int & theFrom, - TCollection_AsciiString & theLongString, - TCollection_AsciiString & theStringType) - { - if ( theFrom < 1 || theFrom > theText.Length() ) - return false; - - // ...script \ beg marker \ \ type \ literal \ end marker \ script... - // "theText myLongStringStart7 Pattern!!! SALOME Mesh Pattern file myLongStringEndtextEnd" - // 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 - // 0 1 2 3 4 5 6 7 8 - - theFrom = theText.Location( myLongStringStart, theFrom, theText.Length() ); // = 09 - if ( !theFrom ) - return false; - - // find where literal begins - int literalBeg = theFrom + myLongStringStart.Length(); // = 26 - char* typeLenStr = (char*) theText.ToCString() + literalBeg - 1; // = "7 Pattern!!! SALO...." - int typeLen = atoi ( typeLenStr ); // = 7 - while ( *typeLenStr != ' ' ) { // look for ' ' after typeLen - literalBeg++; // 26 -> 27 - typeLenStr++; - } - literalBeg += typeLen + 1; // = 35 - if ( literalBeg > theText.Length() ) - return false; - - // where literal ends (i.e. end marker begins) - int literalEnd = theText.Location( myLongStringEnd, literalBeg, theText.Length() ); // = 64 - if ( !literalEnd ) - literalEnd = theText.Length(); - - // literal - theLongString = theText.SubString( literalBeg, literalEnd - 1); // "!!! SALOME Mesh Pattern file " - // type - theStringType = theText.SubString( literalBeg - typeLen, literalBeg - 1 ); // "Pattern" - // cut off literal - literalEnd += myLongStringEnd.Length(); // = 79 - TCollection_AsciiString textEnd = theText.SubString( literalEnd, theText.Length() ); // "textE..." - theText = theText.SubString( 1, theFrom - 1 ) + textEnd; - - return true; - } - - void printException( const char* text ) - { -#ifdef _DEBUG_ - cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << endl; -#endif - } -} - -//======================================================================= -//function : RemoveTabulation -//purpose : -//======================================================================= -void RemoveTabulation( TCollection_AsciiString& theScript ) -{ - std::string aString( theScript.ToCString() ); - std::string::size_type aPos = 0; - while( aPos < aString.length() ) - { - aPos = aString.find( "\n\t", aPos ); - if( aPos == std::string::npos ) - break; - aString.replace( aPos, 2, "\n" ); - aPos++; - } - theScript = aString.c_str(); -} - -//======================================================================= -//function : DumpPython -//purpose : -//======================================================================= -Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy, - CORBA::Boolean isPublished, - CORBA::Boolean isMultiFile, - CORBA::Boolean& isValidScript) -{ - SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy); - if (CORBA::is_nil(aStudy)) - return new Engines::TMPFile(0); - - CORBA::String_var compDataType = ComponentDataType(); - SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); - if (CORBA::is_nil(aSO)) - return new Engines::TMPFile(0); - - // Map study entries to object names - Resource_DataMapOfAsciiStringAsciiString aMap; - Resource_DataMapOfAsciiStringAsciiString aMapNames; - - SALOMEDS::ChildIterator_wrap Itr = aStudy->NewChildIterator(aSO); - for (Itr->InitEx(true); Itr->More(); Itr->Next()) { - SALOMEDS::SObject_wrap aValue = Itr->Value(); - CORBA::String_var anID = aValue->GetID(); - CORBA::String_var aName = aValue->GetName(); - TCollection_AsciiString aGUIName ( (char*) aName.in() ); - TCollection_AsciiString anEntry ( (char*) anID.in() ); - if (aGUIName.Length() > 0) { - aMapNames.Bind( anEntry, aGUIName ); - aMap.Bind( anEntry, aGUIName ); - } - } - - // Get trace of restored study - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - SALOMEDS::GenericAttribute_wrap anAttr = - aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); - - SALOMEDS::AttributePythonObject_var pyAttr = - SALOMEDS::AttributePythonObject::_narrow(anAttr); - CORBA::String_var oldValue = pyAttr->GetObject(); - TCollection_AsciiString aSavedTrace (oldValue.in()); - - // Add trace of API methods calls and replace study entries by names - TCollection_AsciiString aScript; - aScript += DumpPython_impl(aStudy, aMap, aMapNames, isPublished, isMultiFile, - myIsHistoricalPythonDump, isValidScript, aSavedTrace); - - int aLen = aScript.Length(); - unsigned char* aBuffer = new unsigned char[aLen+1]; - strcpy((char*)aBuffer, aScript.ToCString()); - - CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; - Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); - - bool hasNotPublishedObjects = aScript.Location( SMESH::theNotPublishedObjectName, 1, aLen); - isValidScript = isValidScript && !hasNotPublishedObjects; - - return aStreamFile._retn(); -} - -//============================================================================= -/*! - * AddToPythonScript - */ -//============================================================================= -void SMESH_Gen_i::AddToPythonScript (int theStudyID, const TCollection_AsciiString& theString) -{ - if (myPythonScripts.find(theStudyID) == myPythonScripts.end()) { - myPythonScripts[theStudyID] = new TColStd_HSequenceOfAsciiString; - } - myPythonScripts[theStudyID]->Append(theString); -} - -//============================================================================= -/*! - * RemoveLastFromPythonScript - */ -//============================================================================= -void SMESH_Gen_i::RemoveLastFromPythonScript (int theStudyID) -{ - if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { - int aLen = myPythonScripts[theStudyID]->Length(); - myPythonScripts[theStudyID]->Remove(aLen); - } -} - -//======================================================================= -//function : SavePython -//purpose : -//======================================================================= -void SMESH_Gen_i::SavePython (SALOMEDS::Study_ptr theStudy) -{ - // Dump trace of API methods calls - TCollection_AsciiString aScript = GetNewPythonLines(theStudy->StudyId()); - - // Check contents of PythonObject attribute - CORBA::String_var compDataType = ComponentDataType(); - SALOMEDS::SObject_wrap aSO = theStudy->FindComponent( compDataType.in() ); - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::GenericAttribute_wrap anAttr = - aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); - - SALOMEDS::AttributePythonObject_var pyAttr = - SALOMEDS::AttributePythonObject::_narrow(anAttr); - CORBA::String_var oldValue = pyAttr->GetObject(); - TCollection_AsciiString oldScript (oldValue.in()); - - if (oldScript.Length() > 0) { - oldScript += "\n"; - oldScript += aScript; - } else { - oldScript = aScript; - } - - // Store in PythonObject attribute - pyAttr->SetObject(oldScript.ToCString(), 1); - - // Clean trace of API methods calls - CleanPythonTrace(theStudy->StudyId()); -} - - -// impl - - -//============================================================================= -/*! - * FindEntries: Returns a sequence of start/end positions of entries in the string - */ -//============================================================================= -Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theString) -{ - Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; - Standard_Integer aLen = theString.Length(); - Standard_Boolean isFound = Standard_False; - - char* arr = (char*) theString.ToCString(); - Standard_Integer i = 0, j; - - while(i < aLen) { - int c = (int)arr[i]; - j = i+1; - if ( isdigit( c )) { //Is digit? - - isFound = Standard_False; - while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry - c = (int)arr[j++]; - if(c == ':') isFound = Standard_True; - } - - if (isFound) { - int prev = (i < 1) ? 0 : (int)arr[i - 1]; - // to distinguish from a sketcher command: - // last char should be a digit, not ":", - // previous char should not be '"'. - if (arr[j-2] != ':' && prev != '"') { - aSeq->Append(i+1); // +1 because AsciiString starts from 1 - aSeq->Append(j-1); - } - } - } - - i = j; - } - - return aSeq; -} - -namespace { - - //================================================================================ - /*! - * \brief Make a string be a valid python name - * \param aName - a string to fix - * \retval bool - true if aName was not modified - */ - //================================================================================ - - bool fixPythonName(TCollection_AsciiString & aName) - { - bool isValidName = true; - int nbUnderscore = 0; - int p; - // replace not allowed chars by underscore - const char* name = aName.ToCString(); - for ( p = 0; name[p]; ++p ) { - if ( !isalnum( name[p] ) && name[p] != '_' ) - { - if ( p == 0 || p+1 == aName.Length() || name[p-1] == '_') - { - aName.Remove( p+1, 1 ); // remove __ and _ from the start and the end - --p; - name = aName.ToCString(); - } - else - { - aName.SetValue( p+1, '_'); - nbUnderscore++; - } - isValidName = false; - } - } - // aName must not start with a digit - if ( aName.IsIntegerValue() ) { - aName.Insert( 1, 'a' ); - isValidName = false; - } - // shorten names like CartesianParameters3D_400_400_400_1000000_1 - const int nbAllowedUnderscore = 3; /* changed from 2 to 3 by an user request - posted to SALOME Forum */ - if ( aName.Length() > 20 && nbUnderscore > nbAllowedUnderscore ) - { - p = aName.Location( "_", 20, aName.Length()); - if ( p > 1 ) - aName.Trunc( p-1 ); - } - return isValidName; - } - - //================================================================================ - /*! - * \brief Return Python module names of available plug-ins. - */ - //================================================================================ - - std::vector getPluginNames() - { - std::vector pluginNames; - std::vector< std::string > xmlPaths = SMESH_Gen::GetPluginXMLPaths(); - LDOMParser xmlParser; - for ( size_t i = 0; i < xmlPaths.size(); ++i ) - { - bool error = xmlParser.parse( xmlPaths[i].c_str() ); - if ( error ) - { - TCollection_AsciiString data; - INFOS( xmlParser.GetError(data) ); - continue; - } - // - LDOM_Document xmlDoc = xmlParser.getDocument(); - LDOM_NodeList nodeList = xmlDoc.getElementsByTagName( "meshers-group" ); - for ( int i = 0; i < nodeList.getLength(); ++i ) - { - LDOM_Node node = nodeList.item( i ); - LDOM_Element& elem = (LDOM_Element&) node; - LDOMString idlModule = elem.getAttribute( "idl-module" ); - if ( strlen( idlModule.GetString() ) > 0 ) - pluginNames.push_back( idlModule.GetString() ); - } - } - return pluginNames; - } -} - -//================================================================================ -/*! - * \brief Createa a Dump Python script - * \param [in] theStudy - the study to dump - * \param [in,out] theObjectNames - map of an entry to a study and python name - * \param [in] theNames - - map of an entry to a study name - * \param [in] isPublished - \c true if dump of object publication in study is needed - * \param [in] isMultiFile - \c true if dump of each module goes to a separate file - * \param [in] isHistoricalDump - \c true if removed object should be dumped - * \param [out] aValidScript - returns \c true if the returned script seems valid - * \param [in,out] theSavedTrace - the dump stored in the study. It's cleared to - * decrease memory usage. - * \return TCollection_AsciiString - the result dump script. - */ -//================================================================================ - -TCollection_AsciiString SMESH_Gen_i::DumpPython_impl - (SALOMEDS::Study_ptr theStudy, - Resource_DataMapOfAsciiStringAsciiString& theObjectNames, - Resource_DataMapOfAsciiStringAsciiString& theNames, - bool isPublished, - bool isMultiFile, - bool isHistoricalDump, - bool& aValidScript, - TCollection_AsciiString& theSavedTrace) -{ - SMESH_TRY; - const int aStudyID = theStudy->StudyId(); - - const TCollection_AsciiString aSmeshpy ( SMESH_2smeshpy::SmeshpyName() ); - const TCollection_AsciiString aSMESHGen( SMESH_2smeshpy::GenName() ); - const TCollection_AsciiString anOldGen ( SMESH::TPythonDump::SMESHGenName() ); - const TCollection_AsciiString helper; // to comfortably append C strings to TCollection_AsciiString - const TCollection_AsciiString tab( isMultiFile ? "\t" : "" ), nt = helper + "\n" + tab; - - std::list< TCollection_AsciiString > lines; // lines of a script - std::list< TCollection_AsciiString >::iterator linesIt; - - if ( isPublished ) - lines.push_back( aSMESHGen + " = smeshBuilder.New(theStudy)" ); - else - lines.push_back( aSMESHGen + " = smeshBuilder.New(None)" ); - lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); - lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); - - // Treat dump trace of restored study - if (theSavedTrace.Length() > 0) - { - linesIt = --lines.end(); - // Split theSavedTrace into lines - int from = 1, end = theSavedTrace.Length(), to; - while ( from < end && ( to = theSavedTrace.Location( "\n", from, end ))) - { - if ( theSavedTrace.ToCString()[from-1] == '\t' ) - ++from; - if ( to != from ) - lines.push_back( theSavedTrace.SubString( from, to - 1 )); - from = to + 1; - } - // For the convertion of IDL API calls -> smeshBuilder.py API, "smesh" standing for SMESH_Gen - // was replaces with "smeshgen" (==TPythonDump::SMESHGenName()). - // Change "smesh" -> "smeshgen" in the trace saved before passage to smeshBuilder.py API - bool isNewVersion = - theSavedTrace.Location( anOldGen + ".", 1, theSavedTrace.Length() ); - theSavedTrace.Clear(); - if ( !isNewVersion ) - { - const TCollection_AsciiString aSmeshCall ( "smesh." ), gen( "gen" ); - int beg, end, from; - for ( ++linesIt; linesIt != lines.end(); ++linesIt ) - { - TCollection_AsciiString& aSavedLine = *linesIt; - end = aSavedLine.Length(), from = 1; - while ( from < end && ( beg = aSavedLine.Location( aSmeshCall, from, end ))) - { - char charBefore = ( beg == 1 ) ? ' ' : aSavedLine.Value( beg - 1 ); - if ( isspace( charBefore ) || charBefore == '=' ) { // "smesh." is not a part of a long word - aSavedLine.Insert( beg + aSmeshCall.Length() - 1, gen );// "smesh" -> "smeshgen" - end += gen.Length(); - } - from = beg + aSmeshCall.Length(); - } - } - } - } - - // Add new dump trace of API methods calls to script lines - if (myPythonScripts.find( aStudyID ) != myPythonScripts.end()) - { - Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScripts[ aStudyID ]; - Standard_Integer istr, aLen = aPythonScript->Length(); - for (istr = 1; istr <= aLen; istr++) - lines.push_back( aPythonScript->Value( istr )); - } - - // Convert IDL API calls into smeshBuilder.py API. - // Some objects are wrapped with python classes and - // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects - Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod; - std::set< TCollection_AsciiString > aRemovedObjIDs; - if ( !getenv("NO_2smeshpy_conversion")) - SMESH_2smeshpy::ConvertScript( lines, anEntry2AccessorMethod, - theObjectNames, aRemovedObjIDs, - theStudy, isHistoricalDump ); - - bool importGeom = false; - GEOM::GEOM_Gen_ptr geom = GetGeomEngine(); - { - // Add names of GEOM objects to theObjectNames to exclude same names of SMESH objects - GEOM::string_array_var aGeomNames = geom->GetAllDumpNames(); - int ign = 0, nbgn = aGeomNames->length(); - for (; ign < nbgn; ign++) { - TCollection_AsciiString aName = aGeomNames[ign].in(); - theObjectNames.Bind(aName, "1"); - } - } - - TCollection_AsciiString anUpdatedScript; - - Resource_DataMapOfAsciiStringAsciiString mapRemoved; - Resource_DataMapOfAsciiStringAsciiString mapEntries; // names and entries present in anUpdatedScript - Standard_Integer objectCounter = 0; - TCollection_AsciiString anEntry, aName, aGUIName, aBaseName("smeshObj_"); - - // Treat every script line and add it to anUpdatedScript - for ( linesIt = lines.begin(); linesIt != lines.end(); ++linesIt ) - { - TCollection_AsciiString& aLine = *linesIt; - anUpdatedScript += tab; - { - //Replace characters used instead of quote marks to quote notebook variables - int pos = 1; - while (( pos = aLine.Location( 1, SMESH::TVar::Quote(), pos, aLine.Length() ))) - aLine.SetValue( pos, '"' ); - } - // Find entries to be replaced by names - Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aLine); - const Standard_Integer aSeqLen = aSeq->Length(); - Standard_Integer aStart = 1; - for (Standard_Integer i = 1; i <= aSeqLen; i += 2) - { - if ( aStart < aSeq->Value(i) ) - anUpdatedScript += aLine.SubString( aStart, aSeq->Value(i) - 1 ); // line part before i-th entry - anEntry = aLine.SubString( aSeq->Value(i), aSeq->Value(i + 1) ); - // is a GEOM object? - CORBA::String_var geomName = geom->GetDumpName( anEntry.ToCString() ); - if ( !geomName.in() || !geomName.in()[0] ) { - // is a SMESH object - if ( theObjectNames.IsBound( anEntry )) { - // The Object is in Study - aName = theObjectNames.Find( anEntry ); - // check validity of aName - bool isValidName = fixPythonName( aName ); - if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) { - // diff objects have same name - make a new name by appending a digit - TCollection_AsciiString aName2; - Standard_Integer i = 0; - do { - aName2 = aName + "_" + ++i; - } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2)); - aName = aName2; - isValidName = false; - } - if ( !isValidName ) - theObjectNames(anEntry) = aName; - - if ( aLine.Value(1) != '#' ) - mapEntries.Bind(anEntry, aName); - } - else - { - // Removed Object - do { - aName = aBaseName + (++objectCounter); - } while (theObjectNames.IsBound(aName)); - - if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') - mapRemoved.Bind(anEntry, aName); - - theObjectNames.Bind(anEntry, aName); - } - theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects - } - else - { - aName = geomName.in(); - importGeom = true; - } - anUpdatedScript += aName; - aStart = aSeq->Value(i + 1) + 1; - - } // loop on entries within aLine - - if ( aSeqLen == 0 ) - anUpdatedScript += aLine; - else if ( aSeq->Value( aSeqLen ) < aLine.Length() ) - anUpdatedScript += aLine.SubString( aSeq->Value(aSeqLen) + 1, aLine.Length() ); - - anUpdatedScript += '\n'; - } - - // Make an initial part of aSript - - TCollection_AsciiString initPart = "import "; - if ( isMultiFile ) - initPart += "salome, "; - initPart += " SMESH, SALOMEDS\n"; - initPart += "from salome.smesh import smeshBuilder\n"; - if ( importGeom && isMultiFile ) - { - initPart += ("\n## import GEOM dump file ## \n" - "import string, os, sys, re, inspect\n" - "thisFile = inspect.getfile( inspect.currentframe() )\n" - "thisModule = os.path.splitext( os.path.basename( thisFile ))[0]\n" - "sys.path.insert( 0, os.path.dirname( thisFile ))\n" - "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",thisModule)+\" import *\")\n\n"); - } - // import python files corresponding to plugins if they are used in anUpdatedScript - { - TCollection_AsciiString importStr; - std::vector pluginNames = getPluginNames(); - for ( size_t i = 0; i < pluginNames.size(); ++i ) - { - // Convert access to plugin members: - // e.g. StdMeshers.QUAD_REDUCED -> StdMeshersBuilder.QUAD_REDUCED - TCollection_AsciiString pluginAccess = (pluginNames[i] + ".").c_str() ; - int iFrom = 1, iPos; - while (( iPos = anUpdatedScript.Location( pluginAccess, iFrom, anUpdatedScript.Length() ))) - { - anUpdatedScript.Insert( iPos + pluginNames[i].size(), "Builder" ); - iFrom = iPos + pluginNames[i].size() + 8; - } - // if any plugin member is used, import the plugin - if ( iFrom > 1 ) - importStr += ( helper + "\n" "from salome." + pluginNames[i].c_str() + - " import " + pluginNames[i].c_str() +"Builder" ); - } - if ( !importStr.IsEmpty() ) - initPart += importStr + "\n"; - } - - if ( isMultiFile ) - initPart += "def RebuildData(theStudy):"; - initPart += "\n"; - - anUpdatedScript.Prepend( initPart ); - - // Make a final part of aScript - - // Dump object removal - TCollection_AsciiString removeObjPart; - if ( !mapRemoved.IsEmpty() ) { - removeObjPart += nt + "## some objects were removed"; - removeObjPart += nt + "aStudyBuilder = theStudy.NewBuilder()"; - Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapRemovedIt; - for ( mapRemovedIt.Initialize( mapRemoved ); mapRemovedIt.More(); mapRemovedIt.Next() ) { - aName = mapRemovedIt.Value(); // python name - anEntry = mapRemovedIt.Key(); - removeObjPart += nt + "SO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR("; - removeObjPart += aName; - // for object wrapped by class of smeshBuilder.py - if ( anEntry2AccessorMethod.IsBound( anEntry ) ) - removeObjPart += helper + "." + anEntry2AccessorMethod( anEntry ); - removeObjPart += helper + "))" + nt + "if SO: aStudyBuilder.RemoveObjectWithChildren(SO)"; - } - } - - // Set object names - TCollection_AsciiString setNamePart; - Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapEntriesIt; - for ( mapEntriesIt.Initialize( mapEntries ); mapEntriesIt.More(); mapEntriesIt.Next() ) - { - anEntry = mapEntriesIt.Key(); - aName = mapEntriesIt.Value(); // python name - if ( theNames.IsBound( anEntry )) - { - aGUIName = theNames.Find(anEntry); - aGUIName.RemoveAll('\''); // remove a quote from a name (issue 22360) - setNamePart += nt + aSMESHGen + ".SetName(" + aName; - if ( anEntry2AccessorMethod.IsBound( anEntry ) ) - setNamePart += helper + "." + anEntry2AccessorMethod( anEntry ); - setNamePart += helper + ", '" + aGUIName + "')"; - } - } - if ( !setNamePart.IsEmpty() ) - { - setNamePart.Insert( 1, nt + "## Set names of Mesh objects" ); - } - - // Store visual properties of displayed objects - - TCollection_AsciiString visualPropertiesPart; - if (isPublished) - { - //Output the script that sets up the visual parameters. - CORBA::String_var compDataType = ComponentDataType(); - CORBA::String_var script = theStudy->GetDefaultScript( compDataType.in(), tab.ToCString() ); - if ( script.in() && script.in()[0] ) { - visualPropertiesPart += nt + "### Store presentation parameters of displayed objects\n"; - visualPropertiesPart += script.in(); - } - } - - anUpdatedScript += removeObjPart + '\n' + setNamePart + '\n' + visualPropertiesPart; - - if ( isMultiFile ) - { - anUpdatedScript += - "\n\tpass" - "\n" - "\nif __name__ == '__main__':" - "\n\tSMESH_RebuildData = RebuildData" - "\n\texec('import '+re.sub('SMESH$','GEOM',thisModule)+' as GEOM_dump')" - "\n\tGEOM_dump.RebuildData( salome.myStudy )" - "\n\texec('from '+re.sub('SMESH$','GEOM',thisModule)+' import * ')" - "\n\tSMESH_RebuildData( salome.myStudy )"; - } - anUpdatedScript += "\n"; - - // no need now as we use 'tab' and 'nt' variables depending on isMultiFile - // if( !isMultiFile ) // remove unnecessary tabulation - // RemoveTabulation( anUpdatedScript ); - - // ----------------------------------------------------------------- - // put string literals describing patterns into separate functions - // ----------------------------------------------------------------- - - TCollection_AsciiString aLongString, aFunctionType; - int where = 1; - std::set< std::string > functionNameSet; - while ( SMESH::TPythonDump::CutoutLongString( anUpdatedScript, where, aLongString, aFunctionType )) - { - // make a python string literal - aLongString.Prepend(":\n\treturn '''\n"); - aLongString += "\n\t'''\n\tpass\n"; - - TCollection_AsciiString functionName; - - // check if the function returning this literal is already defined - int posAlready = anUpdatedScript.Location( aLongString, where, anUpdatedScript.Length() ); - if ( posAlready ) // already defined - { - // find the function name - int functBeg = posAlready; - char* script = (char*) anUpdatedScript.ToCString() + posAlready - 1; // look at ":" after "def fuction()" - while ( *script != ' ' ) { - script--; - functBeg--; - } - functBeg++; // do not take ' ' - posAlready--; // do not take ':' - functionName = anUpdatedScript.SubString( functBeg, posAlready ); - } - else // not defined yet - { - // find a unique function name - fixPythonName( aFunctionType ); - Standard_Integer nb = 0; - do functionName = aFunctionType + "_" + ( nb++ ) + "()"; - while ( !functionNameSet.insert( functionName.ToCString() ).second ); - - // define function - TCollection_AsciiString funDef = helper + "def " + functionName + aLongString; - if ( isMultiFile ) - { - anUpdatedScript += helper + "\n\n" + funDef; - } - else - { - funDef += "\n\n"; - anUpdatedScript.Insert( 1, funDef); - where += funDef.Length(); - } - } - anUpdatedScript.InsertBefore( where, functionName ); // call function - } - - aValidScript = true; - - return anUpdatedScript; - - SMESH_CATCH( SMESH::printException ); - - aValidScript = false; - return ""; -} - -//============================================================================= -/*! - * GetNewPythonLines - */ -//============================================================================= -TCollection_AsciiString SMESH_Gen_i::GetNewPythonLines (int theStudyID) -{ - TCollection_AsciiString aScript; - - // Dump trace of API methods calls - if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { - Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScripts[theStudyID]; - Standard_Integer istr, aLen = aPythonScript->Length(); - for (istr = 1; istr <= aLen; istr++) { - aScript += "\n"; - aScript += aPythonScript->Value(istr); - } - aScript += "\n"; - } - - return aScript; -} - -//============================================================================= -/*! - * CleanPythonTrace - */ -//============================================================================= -void SMESH_Gen_i::CleanPythonTrace (int theStudyID) -{ - TCollection_AsciiString aScript; - - // Clean trace of API methods calls - if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { - myPythonScripts[theStudyID]->Clear(); - } -} diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 64e0c3e69..858f1eedc 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -131,6 +131,7 @@ #include #include +#include #include #include @@ -2955,6 +2956,22 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CopyMesh(SMESH::SMESH_IDSource_ptr meshPart, return newMesh._retn(); } +//================================================================================ +/*! + * \brief Get version of MED format being used. + */ +//================================================================================ + +char* SMESH_Gen_i::GetMEDFileVersion() +{ + MED::TInt majeur, mineur, release; + majeur = mineur = release = 0; + MED::GetVersionRelease(majeur, mineur, release); + std::ostringstream version; + version << majeur << "." << mineur << "." << release; + return CORBA::string_dup( version.str().c_str() ); +} + //================================================================================ /*! * SMESH_Gen_i::GetMEDVersion @@ -2962,20 +2979,22 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CopyMesh(SMESH::SMESH_IDSource_ptr meshPart, * Get MED version of the file by its name */ //================================================================================ -CORBA::Boolean SMESH_Gen_i::GetMEDVersion(const char* theFileName, - SMESH::MED_VERSION& theVersion) +char* SMESH_Gen_i::GetMEDVersion(const char* theFileName) { - theVersion = SMESH::MED_V2_2; - - int major, minor, release; - bool result = MED::GetMEDVersion( theFileName, major, minor, release ); - if ( result ) { - int version = major * 100 + minor; - if ( version < 202 ) theVersion = SMESH::MED_V2_1; - else theVersion = SMESH::MED_V2_2; - } + std::string version = MED::GetMEDVersion( theFileName ); + return CORBA::string_dup( version.c_str() ); +} - return result; +//================================================================================ +/*! + * SMESH_Gen_i::CheckCompatibility + * + * Check compatibility of file with MED format being used. + */ +//================================================================================ +CORBA::Boolean SMESH_Gen_i::CheckCompatibility(const char* theFileName) +{ + return MED::CheckCompatibility( theFileName ); } //================================================================================ diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 1e869462c..f8c6a552e 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -378,9 +378,14 @@ public: CORBA::Double mergeTolerance) throw ( SALOME::SALOME_Exception ); + // Get version of MED format being used. + char* GetMEDFileVersion(); + // Get MED version of the file by its name - CORBA::Boolean GetMEDVersion(const char* theFileName, - SMESH::MED_VERSION& theVersion); + char* GetMEDVersion(const char* theFileName); + + // Check compatibility of file with MED format being used. + CORBA::Boolean CheckCompatibility(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 f2712cab2..38f9afd27 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -406,8 +406,8 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName ) CreateGroupServants(); int major, minor, release; - if( !MED::GetMEDVersion( theFileName, major, minor, release ) ) - major = minor = release = -1; + major = minor = release = 0; + MED::GetMEDVersion(theFileName, major, minor, release); _medFileInfo = new SMESH::MedFileInfo(); _medFileInfo->fileName = theFileName; _medFileInfo->fileSize = 0; @@ -447,18 +447,6 @@ SMESH::DriverMED_ReadStatus SMESH_Mesh_i::ImportCGNSFile( const char* theFileNa return ConvertDriverMEDReadStatus(status); } -//================================================================================ -/*! - * \brief Return string representation of a MED file version comprising nbDigits - */ -//================================================================================ - -char* SMESH_Mesh_i::GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits) -{ - string ver = DriverMED_W_SMESHDS_Mesh::GetVersionString(nbDigits); - return CORBA::string_dup( ver.c_str() ); -} - //============================================================================= /*! * ImportUNVFile @@ -3010,7 +2998,6 @@ string SMESH_Mesh_i::prepareMeshNameAndGroups(const char* file, void SMESH_Mesh_i::ExportToMEDX (const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion, CORBA::Boolean overwrite, CORBA::Boolean autoDimension) throw(SALOME::SALOME_Exception) @@ -3020,11 +3007,11 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file, _preMeshInfo->FullLoadFromFile(); string aMeshName = prepareMeshNameAndGroups(file, overwrite); - _impl->ExportMED( file, aMeshName.c_str(), auto_groups, theVersion, 0, autoDimension ); + _impl->ExportMED( file, aMeshName.c_str(), auto_groups, 0, autoDimension ); TPythonDump() << SMESH::SMESH_Mesh_var(_this()) << ".ExportToMEDX( r'" << file << "', " << auto_groups << ", " - << theVersion << ", " << overwrite << ", " + << overwrite << ", " << autoDimension << " )"; SMESH_CATCH( SMESH::throwCorbaException ); @@ -3037,11 +3024,10 @@ void SMESH_Mesh_i::ExportToMEDX (const char* file, //================================================================================ void SMESH_Mesh_i::ExportToMED (const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion) + CORBA::Boolean auto_groups) throw(SALOME::SALOME_Exception) { - ExportToMEDX(file,auto_groups,theVersion,true); + ExportToMEDX(file, auto_groups, true); } //================================================================================ @@ -3054,7 +3040,7 @@ void SMESH_Mesh_i::ExportMED (const char* file, CORBA::Boolean auto_groups) throw(SALOME::SALOME_Exception) { - ExportToMEDX(file,auto_groups,SMESH::MED_V2_2,true); + ExportToMEDX(file, auto_groups, true); } //================================================================================ @@ -3157,7 +3143,6 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii) void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, CORBA::Boolean overwrite, CORBA::Boolean autoDimension, const GEOM::ListOfFields& fields, @@ -3211,7 +3196,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, { aMeshName = prepareMeshNameAndGroups(file, overwrite); _impl->ExportMED( file, aMeshName.c_str(), auto_groups, - version, 0, autoDimension, /*addODOnVertices=*/have0dField); + 0, autoDimension, /*addODOnVertices=*/have0dField); meshDS = _impl->GetMeshDS(); } else @@ -3231,7 +3216,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, } SMESH_MeshPartDS* partDS = new SMESH_MeshPartDS( meshPart ); _impl->ExportMED( file, aMeshName.c_str(), auto_groups, - version, partDS, autoDimension, /*addODOnVertices=*/have0dField); + partDS, autoDimension, /*addODOnVertices=*/have0dField); meshDS = tmpDSDeleter._obj = partDS; } @@ -3257,7 +3242,7 @@ void SMESH_Mesh_i::ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, } TPythonDump() << _this() << ".ExportPartToMED( " << meshPart << ", r'" << file << "', " - << auto_groups << ", " << version << ", " << overwrite << ", " + << auto_groups << ", " << overwrite << ", " << autoDimension << ", " << goList << ", '" << ( geomAssocFields ? geomAssocFields : "" ) << "'" << " )"; diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 8aaa79bae..47230bd9b 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -228,19 +228,13 @@ public: * Consider maximum group name length stored in MED file. */ CORBA::Boolean HasDuplicatedGroupNamesMED(); - /*! - * Return string representation of a MED file version comprising nbDigits - */ - char* GetVersionString(SMESH::MED_VERSION version, CORBA::Short nbDigits); void ExportToMEDX( const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, CORBA::Boolean overwrite, CORBA::Boolean autoDimension=true) throw (SALOME::SALOME_Exception); void ExportToMED ( const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION version ) throw (SALOME::SALOME_Exception); + CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); void ExportMED ( const char* file, CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); @@ -259,7 +253,6 @@ public: void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart, const char* file, CORBA::Boolean auto_groups, - SMESH::MED_VERSION version, CORBA::Boolean overwrite, CORBA::Boolean autoDim, const GEOM::ListOfFields& fields, diff --git a/src/SMESH_I/SMESH_PythonDump.cxx b/src/SMESH_I/SMESH_PythonDump.cxx new file mode 100644 index 000000000..a46c9b513 --- /dev/null +++ b/src/SMESH_I/SMESH_PythonDump.cxx @@ -0,0 +1,1390 @@ +// Copyright (C) 2007-2016 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 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_DumpPython.cxx +// Created : Thu Mar 24 17:17:59 2005 +// Author : Julia DOROVSKIKH +// Module : SMESH + +#include "SMESH_PythonDump.hxx" + +#include "SMESH_2smeshpy.hxx" +#include "SMESH_Comment.hxx" +#include "SMESH_Filter_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "SMESH_MeshEditor_i.hxx" + +#include + +#include +#include +#include +#include + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +#include "SMESH_TryCatch.hxx" + +namespace SMESH +{ + + size_t TPythonDump::myCounter = 0; + const char theNotPublishedObjectName[] = "__NOT__Published__Object__"; + + TVar::TVar(CORBA::Double value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Long value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(CORBA::Short value):myVals(1), myIsList(false) { myVals[0] = SMESH_Comment(value); } + TVar::TVar(const SMESH::double_array& value):myVals(value.length()), myIsList(true) + { + for ( size_t i = 0; i < value.length(); i++) + myVals[i] = SMESH_Comment(value[i]); + } + + TPythonDump:: + TPythonDump():myVarsCounter(0) + { + ++myCounter; + } + TPythonDump:: + ~TPythonDump() + { + if(--myCounter == 0){ + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + std::string aString = myStream.str(); + TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); + SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); + if(!aStudy->_is_nil() && !aCollection.IsEmpty()) + { + const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); + if ( !objEntry.empty() ) + aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); + aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection); + if(MYDEBUG) MESSAGE(aString); + // prevent misuse of already treated variables + aSMESHGen->UpdateParameters(CORBA::Object_var().in(),""); + } + } + } + + TPythonDump& //!< store a variable value. Write either a value or '$varID$' + TPythonDump:: + operator<<(const TVar& theVarValue) + { + const std::vector< int >& varIDs = SMESH_Gen_i::GetSMESHGen()->GetLastParamIndices(); + if ( theVarValue.myIsList ) + { + myStream << "[ "; + for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i ) + { + if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) + myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); + else + myStream << theVarValue.myVals[i-1]; + if ( i < theVarValue.myVals.size() ) + myStream << ", "; + ++myVarsCounter; + } + myStream << " ]"; + } + else + { + if ( myVarsCounter < (int)varIDs.size() && varIDs[ myVarsCounter ] >= 0 ) + myStream << TVar::Quote() << varIDs[ myVarsCounter ] << TVar::Quote(); + else + myStream << theVarValue.myVals[0]; + ++myVarsCounter; + } + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(long int theArg){ + myStream< + void DumpArray(const TArray& theArray, TPythonDump & theStream) + { + if ( theArray.length() == 0 ) + { + theStream << "[]"; + } + else + { + theStream << "[ "; + for (CORBA::ULong i = 1; i <= theArray.length(); i++) { + theStream << theArray[i-1]; + if ( i < theArray.length() ) + theStream << ", "; + } + theStream << " ]"; + } + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::long_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::double_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::nodes_array& theArg) + { + DumpArray( theArg, *this ); + return *this; + } + + TPythonDump& + TPythonDump::operator<<(const SMESH::string_array& theArray) + { + myStream << "[ "; + for ( CORBA::ULong i = 1; i <= theArray.length(); i++ ) { + myStream << "'" << theArray[i-1] << "'"; + if ( i < theArray.length() ) + myStream << ", "; + } + myStream << " ]"; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SALOMEDS::SObject_ptr aSObject) + { + if ( !aSObject->_is_nil() ) { + CORBA::String_var entry = aSObject->GetID(); + myStream << entry.in(); + } + else { + myStream << theNotPublishedObjectName; + } + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(CORBA::Object_ptr theArg) + { + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); + if(!aSObject->_is_nil()) { + CORBA::String_var id = aSObject->GetID(); + myStream << id; + } else if ( !CORBA::is_nil(theArg)) { + if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object + myStream << "smeshObj_" << size_t(theArg); + else + myStream << theNotPublishedObjectName; + } + else + myStream << "None"; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::SMESH_Hypothesis_ptr theArg) + { + SALOMEDS::Study_var aStudy = SMESH_Gen_i::GetSMESHGen()->GetCurrentStudy(); + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); + if(aSObject->_is_nil() && !CORBA::is_nil(theArg)) + myStream << "hyp_" << theArg->GetId(); + else + *this << aSObject; + return *this; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::SMESH_IDSource_ptr theArg) + { + if ( CORBA::is_nil( theArg ) ) + return *this << "None"; + SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); + SALOMEDS::SObject_wrap aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); + if(!aSObject->_is_nil()) + { + return *this << aSObject; + } + if ( SMESH::Filter_i* filter = SMESH::DownCast( theArg )) + { + return *this << filter; + } + if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theArg )) + { + SMESH::SMESH_Mesh_var mesh = theArg->GetMesh(); + SMESH::long_array_var anElementsId = theArg->GetIDs(); + SMESH::array_of_ElementType_var types = theArg->GetTypes(); + SMESH::ElementType type = types->length() ? types[0] : SMESH::ALL; + SALOMEDS::SObject_wrap meshSO = SMESH_Gen_i::ObjectToSObject(aStudy,mesh); + if ( meshSO->_is_nil() ) // don't waste memory for dumping not published objects + return *this << mesh << ".GetIDSource([], " << type << ")"; + else + return *this << mesh << ".GetIDSource(" << anElementsId << ", " << type << ")"; + } + return *this << theNotPublishedObjectName; + } + + TPythonDump& + TPythonDump:: + operator<<(SMESH::FilterLibrary_i* theArg) + { + myStream<<"aFilterLibrary"<GetFunctorType(); + switch(aFunctorType) { + case FT_AspectRatio: myStream<< "aAspectRatio"; break; + case FT_AspectRatio3D: myStream<< "aAspectRatio3D"; break; + case FT_Warping: myStream<< "aWarping"; break; + case FT_MinimumAngle: myStream<< "aMinimumAngle"; break; + case FT_Taper: myStream<< "aTaper"; break; + case FT_Skew: myStream<< "aSkew"; break; + case FT_Area: myStream<< "aArea"; break; + case FT_Volume3D: myStream<< "aVolume3D"; break; + case FT_MaxElementLength2D: myStream<< "aMaxElementLength2D"; break; + case FT_MaxElementLength3D: myStream<< "aMaxElementLength3D"; break; + case FT_FreeBorders: myStream<< "aFreeBorders"; break; + case FT_FreeEdges: myStream<< "aFreeEdges"; break; + case FT_FreeNodes: myStream<< "aFreeNodes"; break; + case FT_FreeFaces: myStream<< "aFreeFaces"; break; + case FT_EqualNodes: myStream<< "aEqualNodes"; break; + case FT_EqualEdges: myStream<< "aEqualEdges"; break; + case FT_EqualFaces: myStream<< "aEqualFaces"; break; + case FT_EqualVolumes: myStream<< "aEqualVolumes"; break; + case FT_MultiConnection: myStream<< "aMultiConnection"; break; + case FT_MultiConnection2D: myStream<< "aMultiConnection2D"; break; + case FT_Length: myStream<< "aLength"; break; + case FT_Length2D: myStream<< "aLength2D"; break; + case FT_NodeConnectivityNumber:myStream<< "aNodeConnectivityNumber";break; + case FT_BelongToMeshGroup: myStream<< "aBelongToMeshGroup"; break; + case FT_BelongToGeom: myStream<< "aBelongToGeom"; break; + case FT_BelongToPlane: myStream<< "aBelongToPlane"; break; + case FT_BelongToCylinder: myStream<< "aBelongToCylinder"; break; + case FT_BelongToGenSurface: myStream<< "aBelongToGenSurface"; break; + case FT_LyingOnGeom: myStream<< "aLyingOnGeom"; break; + case FT_RangeOfIds: myStream<< "aRangeOfIds"; break; + case FT_BadOrientedVolume: myStream<< "aBadOrientedVolume"; break; + case FT_BareBorderVolume: myStream<< "aBareBorderVolume"; break; + case FT_BareBorderFace: myStream<< "aBareBorderFace"; break; + case FT_OverConstrainedVolume: myStream<< "aOverConstrainedVolume"; break; + case FT_OverConstrainedFace: myStream<< "aOverConstrainedFace"; break; + case FT_LinearOrQuadratic: myStream<< "aLinearOrQuadratic"; break; + case FT_GroupColor: myStream<< "aGroupColor"; break; + case FT_ElemGeomType: myStream<< "aElemGeomType"; break; + case FT_EntityType: myStream<< "aEntityType"; break; + case FT_CoplanarFaces: myStream<< "aCoplanarFaces"; break; + case FT_BallDiameter: myStream<< "aBallDiameter"; break; + case FT_ConnectedElements: myStream<< "aConnectedElements"; break; + case FT_LessThan: myStream<< "aLessThan"; break; + case FT_MoreThan: myStream<< "aMoreThan"; break; + case FT_EqualTo: myStream<< "aEqualTo"; break; + case FT_LogicalNOT: myStream<< "aLogicalNOT"; break; + case FT_LogicalAND: myStream<< "aLogicalAND"; break; + case FT_LogicalOR: myStream<< "aLogicalOR"; break; + case FT_Undefined: myStream<< "anUndefined"; break; + //default: -- commented to have a compilation warning + } + myStream<GetMeshId() : -1 ); return *this; + } + + TPythonDump& TPythonDump::operator<<(const TCollection_AsciiString & theStr) + { + myStream << theStr; return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::AxisStruct & theAxis) + { + *this << "SMESH.AxisStruct( " + << TVar( theAxis.x ) << ", " + << TVar( theAxis.y ) << ", " + << TVar( theAxis.z ) << ", " + << TVar( theAxis.vx ) << ", " + << TVar( theAxis.vy ) << ", " + << TVar( theAxis.vz ) << " )"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::DirStruct & theDir) + { + const SMESH::PointStruct & P = theDir.PS; + *this << "SMESH.DirStruct( SMESH.PointStruct ( " + << TVar( P.x ) << ", " + << TVar( P.y ) << ", " + << TVar( P.z ) << " ))"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::PointStruct & P) + { + *this << "SMESH.PointStruct ( " + << TVar( P.x ) << ", " + << TVar( P.y ) << ", " + << TVar( P.z ) << " )"; + return *this; + } + + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfGroups * theList) + { + DumpArray( *theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGO& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const GEOM::ListOfGBO& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::ListOfIDSources& theList) + { + DumpArray( theList, *this ); + return *this; + } + TPythonDump& TPythonDump::operator<<(const SMESH::CoincidentFreeBorders& theCFB) + { + // dump CoincidentFreeBorders as a list of lists, each enclosed list + // contains node IDs of a group of coincident free borders where + // each consequent triple of IDs describe a free border: (n1, n2, nLast) + // For example [[1, 2, 10, 20, 21, 40], [11, 12, 15, 55, 54, 41]] describes + // two groups of coincident free borders, each group including two borders + + myStream << "["; + for ( CORBA::ULong i = 0; i < theCFB.coincidentGroups.length(); ++i ) + { + const SMESH::FreeBordersGroup& aGRP = theCFB.coincidentGroups[ i ]; + if ( i ) myStream << ","; + myStream << "["; + for ( CORBA::ULong iP = 0; iP < aGRP.length(); ++iP ) + { + const SMESH::FreeBorderPart& aPART = aGRP[ iP ]; + if ( 0 <= aPART.border && aPART.border < (CORBA::Long)theCFB.borders.length() ) + { + if ( iP ) myStream << ", "; + const SMESH::FreeBorder& aBRD = theCFB.borders[ aPART.border ]; + myStream << aBRD.nodeIDs[ aPART.node1 ] << ","; + myStream << aBRD.nodeIDs[ aPART.node2 ] << ","; + myStream << aBRD.nodeIDs[ aPART.nodeLast ]; + } + } + myStream << "]"; + } + myStream << "]"; + + return *this; + } + + const char* TPythonDump::NotPublishedObjectName() + { + return theNotPublishedObjectName; + } + + TCollection_AsciiString myLongStringStart( "TPythonDump::LongStringStart" ); + TCollection_AsciiString myLongStringEnd ( "TPythonDump::LongStringEnd" ); + + //================================================================================ + /*! + * \brief Return marker of long string literal beginning + * \param type - a name of functionality producing the string literal + * \retval TCollection_AsciiString - the marker string to be written into + * a raw python script + */ + //================================================================================ + + TCollection_AsciiString TPythonDump::LongStringStart(const char* type) + { + return + myLongStringStart + + (Standard_Integer) strlen(type) + + " " + + (char*) type; + } + + //================================================================================ + /*! + * \brief Return marker of long string literal end + * \retval TCollection_AsciiString - the marker string to be written into + * a raw python script + */ + //================================================================================ + + TCollection_AsciiString TPythonDump::LongStringEnd() + { + return myLongStringEnd; + } + + //================================================================================ + /*! + * \brief Cut out a long string literal from a string + * \param theText - text possibly containing string literals + * \param theFrom - position in the text to search from + * \param theLongString - the retrieved literal + * \param theStringType - a name of functionality produced the literal + * \retval bool - true if a string literal found + * + * The literal is removed from theText; theFrom points position right after + * the removed literal + */ + //================================================================================ + + bool TPythonDump::CutoutLongString( TCollection_AsciiString & theText, + int & theFrom, + TCollection_AsciiString & theLongString, + TCollection_AsciiString & theStringType) + { + if ( theFrom < 1 || theFrom > theText.Length() ) + return false; + + // ...script \ beg marker \ \ type \ literal \ end marker \ script... + // "theText myLongStringStart7 Pattern!!! SALOME Mesh Pattern file myLongStringEndtextEnd" + // 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 + // 0 1 2 3 4 5 6 7 8 + + theFrom = theText.Location( myLongStringStart, theFrom, theText.Length() ); // = 09 + if ( !theFrom ) + return false; + + // find where literal begins + int literalBeg = theFrom + myLongStringStart.Length(); // = 26 + char* typeLenStr = (char*) theText.ToCString() + literalBeg - 1; // = "7 Pattern!!! SALO...." + int typeLen = atoi ( typeLenStr ); // = 7 + while ( *typeLenStr != ' ' ) { // look for ' ' after typeLen + literalBeg++; // 26 -> 27 + typeLenStr++; + } + literalBeg += typeLen + 1; // = 35 + if ( literalBeg > theText.Length() ) + return false; + + // where literal ends (i.e. end marker begins) + int literalEnd = theText.Location( myLongStringEnd, literalBeg, theText.Length() ); // = 64 + if ( !literalEnd ) + literalEnd = theText.Length(); + + // literal + theLongString = theText.SubString( literalBeg, literalEnd - 1); // "!!! SALOME Mesh Pattern file " + // type + theStringType = theText.SubString( literalBeg - typeLen, literalBeg - 1 ); // "Pattern" + // cut off literal + literalEnd += myLongStringEnd.Length(); // = 79 + TCollection_AsciiString textEnd = theText.SubString( literalEnd, theText.Length() ); // "textE..." + theText = theText.SubString( 1, theFrom - 1 ) + textEnd; + + return true; + } + + void printException( const char* text ) + { +#ifdef _DEBUG_ + cout << "Exception in SMESH_Gen_i::DumpPython(): " << text << endl; +#endif + } +} + +//======================================================================= +//function : RemoveTabulation +//purpose : +//======================================================================= +void RemoveTabulation( TCollection_AsciiString& theScript ) +{ + std::string aString( theScript.ToCString() ); + std::string::size_type aPos = 0; + while( aPos < aString.length() ) + { + aPos = aString.find( "\n\t", aPos ); + if( aPos == std::string::npos ) + break; + aString.replace( aPos, 2, "\n" ); + aPos++; + } + theScript = aString.c_str(); +} + +//======================================================================= +//function : DumpPython +//purpose : +//======================================================================= +Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean isMultiFile, + CORBA::Boolean& isValidScript) +{ + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy); + if (CORBA::is_nil(aStudy)) + return new Engines::TMPFile(0); + + CORBA::String_var compDataType = ComponentDataType(); + SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); + if (CORBA::is_nil(aSO)) + return new Engines::TMPFile(0); + + // Map study entries to object names + Resource_DataMapOfAsciiStringAsciiString aMap; + Resource_DataMapOfAsciiStringAsciiString aMapNames; + + SALOMEDS::ChildIterator_wrap Itr = aStudy->NewChildIterator(aSO); + for (Itr->InitEx(true); Itr->More(); Itr->Next()) { + SALOMEDS::SObject_wrap aValue = Itr->Value(); + CORBA::String_var anID = aValue->GetID(); + CORBA::String_var aName = aValue->GetName(); + TCollection_AsciiString aGUIName ( (char*) aName.in() ); + TCollection_AsciiString anEntry ( (char*) anID.in() ); + if (aGUIName.Length() > 0) { + aMapNames.Bind( anEntry, aGUIName ); + aMap.Bind( anEntry, aGUIName ); + } + } + + // Get trace of restored study + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::GenericAttribute_wrap anAttr = + aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); + + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow(anAttr); + CORBA::String_var oldValue = pyAttr->GetObject(); + TCollection_AsciiString aSavedTrace (oldValue.in()); + + // Add trace of API methods calls and replace study entries by names + TCollection_AsciiString aScript; + aScript += DumpPython_impl(aStudy, aMap, aMapNames, isPublished, isMultiFile, + myIsHistoricalPythonDump, isValidScript, aSavedTrace); + + int aLen = aScript.Length(); + unsigned char* aBuffer = new unsigned char[aLen+1]; + strcpy((char*)aBuffer, aScript.ToCString()); + + CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; + Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aLen+1, aLen+1, anOctetBuf, 1); + + bool hasNotPublishedObjects = aScript.Location( SMESH::theNotPublishedObjectName, 1, aLen); + isValidScript = isValidScript && !hasNotPublishedObjects; + + return aStreamFile._retn(); +} + +//============================================================================= +/*! + * AddToPythonScript + */ +//============================================================================= +void SMESH_Gen_i::AddToPythonScript (int theStudyID, const TCollection_AsciiString& theString) +{ + if (myPythonScripts.find(theStudyID) == myPythonScripts.end()) { + myPythonScripts[theStudyID] = new TColStd_HSequenceOfAsciiString; + } + myPythonScripts[theStudyID]->Append(theString); +} + +//============================================================================= +/*! + * RemoveLastFromPythonScript + */ +//============================================================================= +void SMESH_Gen_i::RemoveLastFromPythonScript (int theStudyID) +{ + if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { + int aLen = myPythonScripts[theStudyID]->Length(); + myPythonScripts[theStudyID]->Remove(aLen); + } +} + +//======================================================================= +//function : SavePython +//purpose : +//======================================================================= +void SMESH_Gen_i::SavePython (SALOMEDS::Study_ptr theStudy) +{ + // Dump trace of API methods calls + TCollection_AsciiString aScript = GetNewPythonLines(theStudy->StudyId()); + + // Check contents of PythonObject attribute + CORBA::String_var compDataType = ComponentDataType(); + SALOMEDS::SObject_wrap aSO = theStudy->FindComponent( compDataType.in() ); + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + SALOMEDS::GenericAttribute_wrap anAttr = + aStudyBuilder->FindOrCreateAttribute(aSO, "AttributePythonObject"); + + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow(anAttr); + CORBA::String_var oldValue = pyAttr->GetObject(); + TCollection_AsciiString oldScript (oldValue.in()); + + if (oldScript.Length() > 0) { + oldScript += "\n"; + oldScript += aScript; + } else { + oldScript = aScript; + } + + // Store in PythonObject attribute + pyAttr->SetObject(oldScript.ToCString(), 1); + + // Clean trace of API methods calls + CleanPythonTrace(theStudy->StudyId()); +} + + +// impl + + +//============================================================================= +/*! + * FindEntries: Returns a sequence of start/end positions of entries in the string + */ +//============================================================================= +Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theString) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + Standard_Integer aLen = theString.Length(); + Standard_Boolean isFound = Standard_False; + + char* arr = (char*) theString.ToCString(); + Standard_Integer i = 0, j; + + while(i < aLen) { + int c = (int)arr[i]; + j = i+1; + if ( isdigit( c )) { //Is digit? + + isFound = Standard_False; + while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry + c = (int)arr[j++]; + if(c == ':') isFound = Standard_True; + } + + if (isFound) { + int prev = (i < 1) ? 0 : (int)arr[i - 1]; + // to distinguish from a sketcher command: + // last char should be a digit, not ":", + // previous char should not be '"'. + if (arr[j-2] != ':' && prev != '"') { + aSeq->Append(i+1); // +1 because AsciiString starts from 1 + aSeq->Append(j-1); + } + } + } + + i = j; + } + + return aSeq; +} + +namespace { + + //================================================================================ + /*! + * \brief Make a string be a valid python name + * \param aName - a string to fix + * \retval bool - true if aName was not modified + */ + //================================================================================ + + bool fixPythonName(TCollection_AsciiString & aName) + { + bool isValidName = true; + int nbUnderscore = 0; + int p; + // replace not allowed chars by underscore + const char* name = aName.ToCString(); + for ( p = 0; name[p]; ++p ) { + if ( !isalnum( name[p] ) && name[p] != '_' ) + { + if ( p == 0 || p+1 == aName.Length() || name[p-1] == '_') + { + aName.Remove( p+1, 1 ); // remove __ and _ from the start and the end + --p; + name = aName.ToCString(); + } + else + { + aName.SetValue( p+1, '_'); + nbUnderscore++; + } + isValidName = false; + } + } + // aName must not start with a digit + if ( aName.IsIntegerValue() ) { + aName.Insert( 1, 'a' ); + isValidName = false; + } + // shorten names like CartesianParameters3D_400_400_400_1000000_1 + const int nbAllowedUnderscore = 3; /* changed from 2 to 3 by an user request + posted to SALOME Forum */ + if ( aName.Length() > 20 && nbUnderscore > nbAllowedUnderscore ) + { + p = aName.Location( "_", 20, aName.Length()); + if ( p > 1 ) + aName.Trunc( p-1 ); + } + return isValidName; + } + + //================================================================================ + /*! + * \brief Return Python module names of available plug-ins. + */ + //================================================================================ + + std::vector getPluginNames() + { + std::vector pluginNames; + std::vector< std::string > xmlPaths = SMESH_Gen::GetPluginXMLPaths(); + LDOMParser xmlParser; + for ( size_t i = 0; i < xmlPaths.size(); ++i ) + { + bool error = xmlParser.parse( xmlPaths[i].c_str() ); + if ( error ) + { + TCollection_AsciiString data; + INFOS( xmlParser.GetError(data) ); + continue; + } + // + LDOM_Document xmlDoc = xmlParser.getDocument(); + LDOM_NodeList nodeList = xmlDoc.getElementsByTagName( "meshers-group" ); + for ( int i = 0; i < nodeList.getLength(); ++i ) + { + LDOM_Node node = nodeList.item( i ); + LDOM_Element& elem = (LDOM_Element&) node; + LDOMString idlModule = elem.getAttribute( "idl-module" ); + if ( strlen( idlModule.GetString() ) > 0 ) + pluginNames.push_back( idlModule.GetString() ); + } + } + return pluginNames; + } +} + +//================================================================================ +/*! + * \brief Createa a Dump Python script + * \param [in] theStudy - the study to dump + * \param [in,out] theObjectNames - map of an entry to a study and python name + * \param [in] theNames - - map of an entry to a study name + * \param [in] isPublished - \c true if dump of object publication in study is needed + * \param [in] isMultiFile - \c true if dump of each module goes to a separate file + * \param [in] isHistoricalDump - \c true if removed object should be dumped + * \param [out] aValidScript - returns \c true if the returned script seems valid + * \param [in,out] theSavedTrace - the dump stored in the study. It's cleared to + * decrease memory usage. + * \return TCollection_AsciiString - the result dump script. + */ +//================================================================================ + +TCollection_AsciiString SMESH_Gen_i::DumpPython_impl + (SALOMEDS::Study_ptr theStudy, + Resource_DataMapOfAsciiStringAsciiString& theObjectNames, + Resource_DataMapOfAsciiStringAsciiString& theNames, + bool isPublished, + bool isMultiFile, + bool isHistoricalDump, + bool& aValidScript, + TCollection_AsciiString& theSavedTrace) +{ + SMESH_TRY; + const int aStudyID = theStudy->StudyId(); + + const TCollection_AsciiString aSmeshpy ( SMESH_2smeshpy::SmeshpyName() ); + const TCollection_AsciiString aSMESHGen( SMESH_2smeshpy::GenName() ); + const TCollection_AsciiString anOldGen ( SMESH::TPythonDump::SMESHGenName() ); + const TCollection_AsciiString helper; // to comfortably append C strings to TCollection_AsciiString + const TCollection_AsciiString tab( isMultiFile ? "\t" : "" ), nt = helper + "\n" + tab; + + std::list< TCollection_AsciiString > lines; // lines of a script + std::list< TCollection_AsciiString >::iterator linesIt; + + if ( isPublished ) + lines.push_back( aSMESHGen + " = smeshBuilder.New(theStudy)" ); + else + lines.push_back( aSMESHGen + " = smeshBuilder.New(None)" ); + lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); + lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); + + // Treat dump trace of restored study + if (theSavedTrace.Length() > 0) + { + linesIt = --lines.end(); + // Split theSavedTrace into lines + int from = 1, end = theSavedTrace.Length(), to; + while ( from < end && ( to = theSavedTrace.Location( "\n", from, end ))) + { + if ( theSavedTrace.ToCString()[from-1] == '\t' ) + ++from; + if ( to != from ) + lines.push_back( theSavedTrace.SubString( from, to - 1 )); + from = to + 1; + } + // For the convertion of IDL API calls -> smeshBuilder.py API, "smesh" standing for SMESH_Gen + // was replaces with "smeshgen" (==TPythonDump::SMESHGenName()). + // Change "smesh" -> "smeshgen" in the trace saved before passage to smeshBuilder.py API + bool isNewVersion = + theSavedTrace.Location( anOldGen + ".", 1, theSavedTrace.Length() ); + theSavedTrace.Clear(); + if ( !isNewVersion ) + { + const TCollection_AsciiString aSmeshCall ( "smesh." ), gen( "gen" ); + int beg, end, from; + for ( ++linesIt; linesIt != lines.end(); ++linesIt ) + { + TCollection_AsciiString& aSavedLine = *linesIt; + end = aSavedLine.Length(), from = 1; + while ( from < end && ( beg = aSavedLine.Location( aSmeshCall, from, end ))) + { + char charBefore = ( beg == 1 ) ? ' ' : aSavedLine.Value( beg - 1 ); + if ( isspace( charBefore ) || charBefore == '=' ) { // "smesh." is not a part of a long word + aSavedLine.Insert( beg + aSmeshCall.Length() - 1, gen );// "smesh" -> "smeshgen" + end += gen.Length(); + } + from = beg + aSmeshCall.Length(); + } + } + } + } + + // Add new dump trace of API methods calls to script lines + if (myPythonScripts.find( aStudyID ) != myPythonScripts.end()) + { + Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScripts[ aStudyID ]; + Standard_Integer istr, aLen = aPythonScript->Length(); + for (istr = 1; istr <= aLen; istr++) + lines.push_back( aPythonScript->Value( istr )); + } + + // Convert IDL API calls into smeshBuilder.py API. + // Some objects are wrapped with python classes and + // Resource_DataMapOfAsciiStringAsciiString holds methods returning wrapped objects + Resource_DataMapOfAsciiStringAsciiString anEntry2AccessorMethod; + std::set< TCollection_AsciiString > aRemovedObjIDs; + if ( !getenv("NO_2smeshpy_conversion")) + SMESH_2smeshpy::ConvertScript( lines, anEntry2AccessorMethod, + theObjectNames, aRemovedObjIDs, + theStudy, isHistoricalDump ); + + bool importGeom = false; + GEOM::GEOM_Gen_ptr geom = GetGeomEngine(); + { + // Add names of GEOM objects to theObjectNames to exclude same names of SMESH objects + GEOM::string_array_var aGeomNames = geom->GetAllDumpNames(); + int ign = 0, nbgn = aGeomNames->length(); + for (; ign < nbgn; ign++) { + TCollection_AsciiString aName = aGeomNames[ign].in(); + theObjectNames.Bind(aName, "1"); + } + } + + TCollection_AsciiString anUpdatedScript; + + Resource_DataMapOfAsciiStringAsciiString mapRemoved; + Resource_DataMapOfAsciiStringAsciiString mapEntries; // names and entries present in anUpdatedScript + Standard_Integer objectCounter = 0; + TCollection_AsciiString anEntry, aName, aGUIName, aBaseName("smeshObj_"); + + // Treat every script line and add it to anUpdatedScript + for ( linesIt = lines.begin(); linesIt != lines.end(); ++linesIt ) + { + TCollection_AsciiString& aLine = *linesIt; + anUpdatedScript += tab; + { + //Replace characters used instead of quote marks to quote notebook variables + int pos = 1; + while (( pos = aLine.Location( 1, SMESH::TVar::Quote(), pos, aLine.Length() ))) + aLine.SetValue( pos, '"' ); + } + // Find entries to be replaced by names + Handle(TColStd_HSequenceOfInteger) aSeq = FindEntries(aLine); + const Standard_Integer aSeqLen = aSeq->Length(); + Standard_Integer aStart = 1; + for (Standard_Integer i = 1; i <= aSeqLen; i += 2) + { + if ( aStart < aSeq->Value(i) ) + anUpdatedScript += aLine.SubString( aStart, aSeq->Value(i) - 1 ); // line part before i-th entry + anEntry = aLine.SubString( aSeq->Value(i), aSeq->Value(i + 1) ); + // is a GEOM object? + CORBA::String_var geomName = geom->GetDumpName( anEntry.ToCString() ); + if ( !geomName.in() || !geomName.in()[0] ) { + // is a SMESH object + if ( theObjectNames.IsBound( anEntry )) { + // The Object is in Study + aName = theObjectNames.Find( anEntry ); + // check validity of aName + bool isValidName = fixPythonName( aName ); + if (theObjectNames.IsBound(aName) && anEntry != theObjectNames(aName)) { + // diff objects have same name - make a new name by appending a digit + TCollection_AsciiString aName2; + Standard_Integer i = 0; + do { + aName2 = aName + "_" + ++i; + } while (theObjectNames.IsBound(aName2) && anEntry != theObjectNames(aName2)); + aName = aName2; + isValidName = false; + } + if ( !isValidName ) + theObjectNames(anEntry) = aName; + + if ( aLine.Value(1) != '#' ) + mapEntries.Bind(anEntry, aName); + } + else + { + // Removed Object + do { + aName = aBaseName + (++objectCounter); + } while (theObjectNames.IsBound(aName)); + + if ( !aRemovedObjIDs.count( anEntry ) && aLine.Value(1) != '#') + mapRemoved.Bind(anEntry, aName); + + theObjectNames.Bind(anEntry, aName); + } + theObjectNames.Bind(aName, anEntry); // to detect same name of diff objects + } + else + { + aName = geomName.in(); + importGeom = true; + } + anUpdatedScript += aName; + aStart = aSeq->Value(i + 1) + 1; + + } // loop on entries within aLine + + if ( aSeqLen == 0 ) + anUpdatedScript += aLine; + else if ( aSeq->Value( aSeqLen ) < aLine.Length() ) + anUpdatedScript += aLine.SubString( aSeq->Value(aSeqLen) + 1, aLine.Length() ); + + anUpdatedScript += '\n'; + } + + // Make an initial part of aSript + + TCollection_AsciiString initPart = "import "; + if ( isMultiFile ) + initPart += "salome, "; + initPart += " SMESH, SALOMEDS\n"; + initPart += "from salome.smesh import smeshBuilder\n"; + if ( importGeom && isMultiFile ) + { + initPart += ("\n## import GEOM dump file ## \n" + "import string, os, sys, re, inspect\n" + "thisFile = inspect.getfile( inspect.currentframe() )\n" + "thisModule = os.path.splitext( os.path.basename( thisFile ))[0]\n" + "sys.path.insert( 0, os.path.dirname( thisFile ))\n" + "exec(\"from \"+re.sub(\"SMESH$\",\"GEOM\",thisModule)+\" import *\")\n\n"); + } + // import python files corresponding to plugins if they are used in anUpdatedScript + { + TCollection_AsciiString importStr; + std::vector pluginNames = getPluginNames(); + for ( size_t i = 0; i < pluginNames.size(); ++i ) + { + // Convert access to plugin members: + // e.g. StdMeshers.QUAD_REDUCED -> StdMeshersBuilder.QUAD_REDUCED + TCollection_AsciiString pluginAccess = (pluginNames[i] + ".").c_str() ; + int iFrom = 1, iPos; + while (( iPos = anUpdatedScript.Location( pluginAccess, iFrom, anUpdatedScript.Length() ))) + { + anUpdatedScript.Insert( iPos + pluginNames[i].size(), "Builder" ); + iFrom = iPos + pluginNames[i].size() + 8; + } + // if any plugin member is used, import the plugin + if ( iFrom > 1 ) + importStr += ( helper + "\n" "from salome." + pluginNames[i].c_str() + + " import " + pluginNames[i].c_str() +"Builder" ); + } + if ( !importStr.IsEmpty() ) + initPart += importStr + "\n"; + } + + if ( isMultiFile ) + initPart += "def RebuildData(theStudy):"; + initPart += "\n"; + + anUpdatedScript.Prepend( initPart ); + + // Make a final part of aScript + + // Dump object removal + TCollection_AsciiString removeObjPart; + if ( !mapRemoved.IsEmpty() ) { + removeObjPart += nt + "## some objects were removed"; + removeObjPart += nt + "aStudyBuilder = theStudy.NewBuilder()"; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapRemovedIt; + for ( mapRemovedIt.Initialize( mapRemoved ); mapRemovedIt.More(); mapRemovedIt.Next() ) { + aName = mapRemovedIt.Value(); // python name + anEntry = mapRemovedIt.Key(); + removeObjPart += nt + "SO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR("; + removeObjPart += aName; + // for object wrapped by class of smeshBuilder.py + if ( anEntry2AccessorMethod.IsBound( anEntry ) ) + removeObjPart += helper + "." + anEntry2AccessorMethod( anEntry ); + removeObjPart += helper + "))" + nt + "if SO: aStudyBuilder.RemoveObjectWithChildren(SO)"; + } + } + + // Set object names + TCollection_AsciiString setNamePart; + Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString mapEntriesIt; + for ( mapEntriesIt.Initialize( mapEntries ); mapEntriesIt.More(); mapEntriesIt.Next() ) + { + anEntry = mapEntriesIt.Key(); + aName = mapEntriesIt.Value(); // python name + if ( theNames.IsBound( anEntry )) + { + aGUIName = theNames.Find(anEntry); + aGUIName.RemoveAll('\''); // remove a quote from a name (issue 22360) + setNamePart += nt + aSMESHGen + ".SetName(" + aName; + if ( anEntry2AccessorMethod.IsBound( anEntry ) ) + setNamePart += helper + "." + anEntry2AccessorMethod( anEntry ); + setNamePart += helper + ", '" + aGUIName + "')"; + } + } + if ( !setNamePart.IsEmpty() ) + { + setNamePart.Insert( 1, nt + "## Set names of Mesh objects" ); + } + + // Store visual properties of displayed objects + + TCollection_AsciiString visualPropertiesPart; + if (isPublished) + { + //Output the script that sets up the visual parameters. + CORBA::String_var compDataType = ComponentDataType(); + CORBA::String_var script = theStudy->GetDefaultScript( compDataType.in(), tab.ToCString() ); + if ( script.in() && script.in()[0] ) { + visualPropertiesPart += nt + "### Store presentation parameters of displayed objects\n"; + visualPropertiesPart += script.in(); + } + } + + anUpdatedScript += removeObjPart + '\n' + setNamePart + '\n' + visualPropertiesPart; + + if ( isMultiFile ) + { + anUpdatedScript += + "\n\tpass" + "\n" + "\nif __name__ == '__main__':" + "\n\tSMESH_RebuildData = RebuildData" + "\n\texec('import '+re.sub('SMESH$','GEOM',thisModule)+' as GEOM_dump')" + "\n\tGEOM_dump.RebuildData( salome.myStudy )" + "\n\texec('from '+re.sub('SMESH$','GEOM',thisModule)+' import * ')" + "\n\tSMESH_RebuildData( salome.myStudy )"; + } + anUpdatedScript += "\n"; + + // no need now as we use 'tab' and 'nt' variables depending on isMultiFile + // if( !isMultiFile ) // remove unnecessary tabulation + // RemoveTabulation( anUpdatedScript ); + + // ----------------------------------------------------------------- + // put string literals describing patterns into separate functions + // ----------------------------------------------------------------- + + TCollection_AsciiString aLongString, aFunctionType; + int where = 1; + std::set< std::string > functionNameSet; + while ( SMESH::TPythonDump::CutoutLongString( anUpdatedScript, where, aLongString, aFunctionType )) + { + // make a python string literal + aLongString.Prepend(":\n\treturn '''\n"); + aLongString += "\n\t'''\n\tpass\n"; + + TCollection_AsciiString functionName; + + // check if the function returning this literal is already defined + int posAlready = anUpdatedScript.Location( aLongString, where, anUpdatedScript.Length() ); + if ( posAlready ) // already defined + { + // find the function name + int functBeg = posAlready; + char* script = (char*) anUpdatedScript.ToCString() + posAlready - 1; // look at ":" after "def fuction()" + while ( *script != ' ' ) { + script--; + functBeg--; + } + functBeg++; // do not take ' ' + posAlready--; // do not take ':' + functionName = anUpdatedScript.SubString( functBeg, posAlready ); + } + else // not defined yet + { + // find a unique function name + fixPythonName( aFunctionType ); + Standard_Integer nb = 0; + do functionName = aFunctionType + "_" + ( nb++ ) + "()"; + while ( !functionNameSet.insert( functionName.ToCString() ).second ); + + // define function + TCollection_AsciiString funDef = helper + "def " + functionName + aLongString; + if ( isMultiFile ) + { + anUpdatedScript += helper + "\n\n" + funDef; + } + else + { + funDef += "\n\n"; + anUpdatedScript.Insert( 1, funDef); + where += funDef.Length(); + } + } + anUpdatedScript.InsertBefore( where, functionName ); // call function + } + + aValidScript = true; + + return anUpdatedScript; + + SMESH_CATCH( SMESH::printException ); + + aValidScript = false; + return ""; +} + +//============================================================================= +/*! + * GetNewPythonLines + */ +//============================================================================= +TCollection_AsciiString SMESH_Gen_i::GetNewPythonLines (int theStudyID) +{ + TCollection_AsciiString aScript; + + // Dump trace of API methods calls + if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { + Handle(TColStd_HSequenceOfAsciiString) aPythonScript = myPythonScripts[theStudyID]; + Standard_Integer istr, aLen = aPythonScript->Length(); + for (istr = 1; istr <= aLen; istr++) { + aScript += "\n"; + aScript += aPythonScript->Value(istr); + } + aScript += "\n"; + } + + return aScript; +} + +//============================================================================= +/*! + * CleanPythonTrace + */ +//============================================================================= +void SMESH_Gen_i::CleanPythonTrace (int theStudyID) +{ + TCollection_AsciiString aScript; + + // Clean trace of API methods calls + if (myPythonScripts.find(theStudyID) != myPythonScripts.end()) { + myPythonScripts[theStudyID]->Clear(); + } +} diff --git a/src/SMESH_I/SMESH_PythonDump.hxx b/src/SMESH_I/SMESH_PythonDump.hxx index 7fb82c564..a1e213b4f 100644 --- a/src/SMESH_I/SMESH_PythonDump.hxx +++ b/src/SMESH_I/SMESH_PythonDump.hxx @@ -201,9 +201,6 @@ namespace SMESH TPythonDump& operator<<(SMESH_MeshEditor_i* theArg); - TPythonDump& - operator<<(SMESH::MED_VERSION theArg); - TPythonDump& operator<<(const SMESH::AxisStruct & theAxis); diff --git a/src/SMESH_SWIG/smeshBuilder.py b/src/SMESH_SWIG/smeshBuilder.py index f289a5fe7..f9f4fda87 100644 --- a/src/SMESH_SWIG/smeshBuilder.py +++ b/src/SMESH_SWIG/smeshBuilder.py @@ -84,6 +84,10 @@ import salome from salome.geom import geomBuilder import SMESH # This is necessary for back compatibility +import omniORB # back compatibility +SMESH.MED_V2_1 = omniORB.EnumItem("MED_V2_1", 0) # back compatibility +SMESH.MED_V2_2 = omniORB.EnumItem("MED_V2_2", 1) # back compatibility + from SMESH import * from salome.smesh.smesh_algorithm import Mesh_Algorithm @@ -1789,13 +1793,10 @@ class Mesh: ## Export the mesh in a file in MED format ## allowing to overwrite the file if it exists or add the exported data to its contents - # @param f is the file name + # @param fileName is the file name # @param auto_groups boolean parameter for creating/not creating # the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; # the typical use is auto_groups=False. - # @param version MED format version (MED_V2_1 or MED_V2_2, - # the latter meaning any current version). The parameter is - # obsolete since MED_V2_1 is no longer supported. # @param overwrite boolean parameter for overwriting/not overwriting the file # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh # @param autoDimension if @c True (default), a space dimension of a MED mesh can be either @@ -1811,17 +1812,33 @@ class Mesh: # - 'f' stands for "_faces _" field; # - 's' stands for "_solids _" field. # @ingroup l2_impexp - def ExportMED(self, f, auto_groups=0, version=MED_V2_2, - overwrite=1, meshPart=None, autoDimension=True, fields=[], geomAssocFields=''): + def ExportMED(self, *args, **kwargs): + # process positional arguments + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + fileName = args[0] + auto_groups = args[1] if len(args) > 1 else 0 + overwrite = args[2] if len(args) > 2 else 1 + meshPart = args[3] if len(args) > 3 else None + autoDimension = args[4] if len(args) > 4 else True + fields = args[5] if len(args) > 5 else [] + geomAssocFields = args[6] if len(args) > 6 else '' + # process keywords arguments + auto_groups = kwargs.get("auto_groups", auto_groups) + overwrite = kwargs.get("overwrite", overwrite) + meshPart = kwargs.get("meshPart", meshPart) + autoDimension = kwargs.get("autoDimension", autoDimension) + fields = kwargs.get("fields", fields) + geomAssocFields = kwargs.get("geomAssocFields", geomAssocFields) + # invoke engine's function if meshPart or fields or geomAssocFields: unRegister = genObjUnRegister() if isinstance( meshPart, list ): meshPart = self.GetIDSource( meshPart, SMESH.ALL ) unRegister.set( meshPart ) - self.mesh.ExportPartToMED( meshPart, f, auto_groups, version, overwrite, autoDimension, + self.mesh.ExportPartToMED( meshPart, fileName, auto_groups, overwrite, autoDimension, fields, geomAssocFields) else: - self.mesh.ExportToMEDX(f, auto_groups, version, overwrite, autoDimension) + self.mesh.ExportToMEDX(fileName, auto_groups, overwrite, autoDimension) ## Export the mesh in a file in SAUV format # @param f is the file name @@ -1911,10 +1928,7 @@ class Mesh: ## Deprecated, used only for compatibility! Please, use ExportMED() method instead. # Export the mesh in a file in MED format # allowing to overwrite the file if it exists or add the exported data to its contents - # @param f the file name - # @param version MED format version (MED_V2_1 or MED_V2_2, - # the latter meaning any current version). The parameter is - # obsolete since MED_V2_1 is no longer supported. + # @param fileName the file name # @param opt boolean parameter for creating/not creating # the groups Group_On_All_Nodes, Group_On_All_Faces, ... # @param overwrite boolean parameter for overwriting/not overwriting the file @@ -1924,8 +1938,19 @@ class Mesh: # - 3D in the rest cases.
# If @a autoDimension is @c False, the space dimension is always 3. # @ingroup l2_impexp - def ExportToMED(self, f, version=MED_V2_2, opt=0, overwrite=1, autoDimension=True): - self.mesh.ExportToMEDX(f, opt, version, overwrite, autoDimension) + def ExportToMED(self, *args, **kwargs): + # process positional arguments + args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility + fileName = args[0] + opt = args[1] if len(args) > 1 else 0 + overwrite = args[2] if len(args) > 2 else 1 + autoDimension = args[3] if len(args) > 3 else True + # process keywords arguments + opt = kwargs.get("opt", opt) + overwrite = kwargs.get("overwrite", overwrite) + autoDimension = kwargs.get("autoDimension", autoDimension) + # invoke engine's function + self.mesh.ExportToMEDX(fileName, opt, overwrite, autoDimension) # Operations with groups: # ---------------------- diff --git a/src/Tools/ZCracksPlug/casTests/genereCube.py b/src/Tools/ZCracksPlug/casTests/genereCube.py index 2ab20472e..feeb4ae71 100644 --- a/src/Tools/ZCracksPlug/casTests/genereCube.py +++ b/src/Tools/ZCracksPlug/casTests/genereCube.py @@ -109,7 +109,7 @@ def cube3D(L, N, outFile): aFilter_1.SetMesh(Maillage_1.GetMesh()) FACE_temp = Maillage_1.GroupOnFilter( SMESH.FACE, noms[cont], aFilter_1 ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) #if salome.sg.hasDesktop(): #salome.sg.updateObjBrowser(1) @@ -191,7 +191,7 @@ def cube2D(L, N, outFile): aFilter_1.SetMesh(Maillage_1.GetMesh()) EDGE_temp = Maillage_1.GroupOnFilter( SMESH.EDGE, noms[cont], aFilter_1 ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) #if salome.sg.hasDesktop(): #salome.sg.updateObjBrowser(1) \ No newline at end of file diff --git a/src/Tools/ZCracksPlug/ellipse.py b/src/Tools/ZCracksPlug/ellipse.py index 9ffeb8b66..7130d0931 100644 --- a/src/Tools/ZCracksPlug/ellipse.py +++ b/src/Tools/ZCracksPlug/ellipse.py @@ -189,7 +189,7 @@ def generate(data_demi_grand_axe, data_centre, data_normale, Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: print 'ExportToMEDX() failed. Invalid file name?' diff --git a/src/Tools/ZCracksPlug/genereCrack.py b/src/Tools/ZCracksPlug/genereCrack.py index 372772b43..9389fecff 100644 --- a/src/Tools/ZCracksPlug/genereCrack.py +++ b/src/Tools/ZCracksPlug/genereCrack.py @@ -228,7 +228,7 @@ def generateCustom(crack, outFile): else: Group_1 = Maillage_1.CreateEmptyGroup( SMESH.NODE, 'crack' ) nbAdd = Group_1.AddFrom( Maillage_1.GetMesh() ) - Maillage_1.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage_1.ExportMED(outFile) return(True) diff --git a/src/Tools/ZCracksPlug/rectangle.py b/src/Tools/ZCracksPlug/rectangle.py index 2f6933e25..155e2531e 100644 --- a/src/Tools/ZCracksPlug/rectangle.py +++ b/src/Tools/ZCracksPlug/rectangle.py @@ -216,7 +216,7 @@ def generate(data_longueur,data_largeur,data_centre, Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: print 'ExportToMEDX() failed. Invalid file name?' diff --git a/src/Tools/ZCracksPlug/sphere.py b/src/Tools/ZCracksPlug/sphere.py index 79542b2c5..7b8bbf954 100644 --- a/src/Tools/ZCracksPlug/sphere.py +++ b/src/Tools/ZCracksPlug/sphere.py @@ -57,7 +57,7 @@ def generate(data_rayon,data_centre,outFile): Maillage=uF.meshCrack(FACE_FISSURE, minSize, maxSize, chordal, dim=3) try: - Maillage.ExportMED( outFile, 0, SMESH.MED_V2_2, 1, None ,1) + Maillage.ExportMED(outFile) smesh.SetName(Maillage.GetMesh(), 'MAILLAGE_FISSURE') except: print 'ExportToMEDX() failed. Invalid file name?' diff --git a/src/Tools/ZCracksPlug/utilityFunctions.py b/src/Tools/ZCracksPlug/utilityFunctions.py index 36db72580..e53e63925 100644 --- a/src/Tools/ZCracksPlug/utilityFunctions.py +++ b/src/Tools/ZCracksPlug/utilityFunctions.py @@ -227,7 +227,7 @@ def extendElsets(meshFile, outFile=None): if len(front)==0: crackOnly=False if crackOnly: - mesh.ExportMED(outFile, 0, SMESH.MED_V2_2, 1, None ,1) + mesh.ExportMED(outFile) return('crack') # Propagates color using elem connectivity @@ -298,7 +298,7 @@ def extendElsets(meshFile, outFile=None): mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.EDGE,grElemList[2][n]) if outFile==None: outFile=meshFile - mesh.ExportMED(outFile, 0, SMESH.MED_V2_2, 1, None ,1) + mesh.ExportMED(outFile) return(True) @@ -422,7 +422,7 @@ def getMaxAspectRatio(tmpdir): #for elem in surfElemList: #maxAR=max(mesh.GetAspectRatio(elem),maxAR) - #mesh.ExportMED(meshFile, 0, SMESH.MED_V2_2, 1, None ,1) + #mesh.ExportMED(meshFile) #return(maxAR) diff --git a/src/Tools/blocFissure/exemple2.py b/src/Tools/blocFissure/exemple2.py index 1b0141f65..e03da8d7d 100644 --- a/src/Tools/blocFissure/exemple2.py +++ b/src/Tools/blocFissure/exemple2.py @@ -59,7 +59,7 @@ Quadrangle_2D = boite.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = boite.Hexahedron(algo=smeshBuilder.Hexa) isDone = boite.Compute() smesh.SetName(boite, 'boite') -boite.ExportMED( r'boite.med', 0, SMESH.MED_V2_2, 1 ) +boite.ExportMED(r'boite.med') ## set object names smesh.SetName(boite.GetMesh(), 'boite') diff --git a/src/Tools/blocFissure/gmu/construitFissureGenerale.py b/src/Tools/blocFissure/gmu/construitFissureGenerale.py index 8db3cabb0..ad00d0a0e 100644 --- a/src/Tools/blocFissure/gmu/construitFissureGenerale.py +++ b/src/Tools/blocFissure/gmu/construitFissureGenerale.py @@ -328,7 +328,7 @@ def construitFissureGenerale(maillagesSains, fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) logging.info("export maillage fini") - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py b/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py index d4270fcea..7bcd8c482 100644 --- a/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py +++ b/src/Tools/blocFissure/gmu/creeZoneDefautDansObjetSain.py @@ -59,7 +59,7 @@ def creeZoneDefautDansObjetSain(geometriesSaines, maillagesSains, shapesFissure, [origShapes, verticesShapes, dmoyen] = \ creeZoneDefautMaillage(maillagesSains, shapeDefaut, tailleDefaut, nomZones, coordsNoeudsFissure) - maillageSain.ExportMED( fichierMaillageSain, 0, SMESH.MED_V2_2, 1 ) + maillageSain.ExportMED(fichierMaillageSain) logging.debug("fichier maillage sain %s", fichierMaillageSain) [maillageSain, internalBoundary, zoneDefaut, zoneDefaut_skin, zoneDefaut_internalFaces, zoneDefaut_internalEdges] = \ peauInterne(fichierMaillageSain, shapeDefaut, nomZones) diff --git a/src/Tools/blocFissure/gmu/insereFissureElliptique.py b/src/Tools/blocFissure/gmu/insereFissureElliptique.py index de8fbeb17..7c54b4388 100644 --- a/src/Tools/blocFissure/gmu/insereFissureElliptique.py +++ b/src/Tools/blocFissure/gmu/insereFissureElliptique.py @@ -189,7 +189,7 @@ def insereFissureElliptique(geometriesSaines, maillagesSains, if step == 18: return None - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure : %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/insereFissureGenerale.py b/src/Tools/blocFissure/gmu/insereFissureGenerale.py index a8619bdda..1b343a8ee 100644 --- a/src/Tools/blocFissure/gmu/insereFissureGenerale.py +++ b/src/Tools/blocFissure/gmu/insereFissureGenerale.py @@ -1373,7 +1373,7 @@ def insereFissureGenerale(maillagesSains, fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) logging.info("export maillage fini") - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/gmu/insereFissureLongue.py b/src/Tools/blocFissure/gmu/insereFissureLongue.py index 347fb401c..a7ff04609 100644 --- a/src/Tools/blocFissure/gmu/insereFissureLongue.py +++ b/src/Tools/blocFissure/gmu/insereFissureLongue.py @@ -649,7 +649,7 @@ def insereFissureLongue(geometriesSaines, maillagesSains, #isDone = maillageComplet.ReorientObject( grps[0] ) fond = maillageComplet.GetMesh().CreateDimGroup( grps, SMESH.NODE, 'FACE2' ) - maillageComplet.ExportMED( fichierMaillageFissure, 0, SMESH.MED_V2_2, 1 ) + maillageComplet.ExportMED(fichierMaillageFissure) putName(maillageComplet, nomFicFissure) logging.info("fichier maillage fissure %s", fichierMaillageFissure) diff --git a/src/Tools/blocFissure/materielCasTests/cubeAngle.py b/src/Tools/blocFissure/materielCasTests/cubeAngle.py index a9c4769aa..647d71908 100644 --- a/src/Tools/blocFissure/materielCasTests/cubeAngle.py +++ b/src/Tools/blocFissure/materielCasTests/cubeAngle.py @@ -65,7 +65,7 @@ Quadrangle_2D = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa) isDone = Mesh_1.Compute() smesh.SetName(Mesh_1, 'Mesh_1') -Mesh_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/CubeAngle.med"), 0, SMESH.MED_V2_2, 1 ) +Mesh_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/CubeAngle.med")) ## set object names smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1') diff --git a/src/Tools/blocFissure/materielCasTests/cubeFin.py b/src/Tools/blocFissure/materielCasTests/cubeFin.py index 3eeb130df..567744020 100644 --- a/src/Tools/blocFissure/materielCasTests/cubeFin.py +++ b/src/Tools/blocFissure/materielCasTests/cubeFin.py @@ -124,7 +124,7 @@ smesh.SetName(ENCASTR_1, 'ENCASTR') smesh.SetName(cubeFin_1.GetMesh(), 'cubeFin') smesh.SetName(Nb_Segments_1, 'Nb. Segments_1') -cubeFin_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/cubeFin.med"), 0, SMESH.MED_V2_2, 1 ) +cubeFin_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/cubeFin.med")) if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(True) diff --git a/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py b/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py index c43889c94..c3bb1911d 100644 --- a/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py +++ b/src/Tools/blocFissure/materielCasTests/decoupeCylindre.py @@ -144,7 +144,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(6,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = CylindreSain_1.Compute() smesh.SetName(CylindreSain_1, 'CylindreSain') -CylindreSain_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests//CylindreSain.med"), 0, SMESH.MED_V2_2, 1 ) +CylindreSain_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests//CylindreSain.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/disque_perce.py b/src/Tools/blocFissure/materielCasTests/disque_perce.py index 7fc7173dc..6b3ccc22e 100644 --- a/src/Tools/blocFissure/materielCasTests/disque_perce.py +++ b/src/Tools/blocFissure/materielCasTests/disque_perce.py @@ -71,7 +71,7 @@ status = Disque_1.AddHypothesis(Nb_Segments_2,Compound_4) Quadrangle_2D = Disque_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) isDone = Disque_1.Compute() smesh.SetName(Disque_1, 'Disque') -Disque_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/disque.med"), 0, SMESH.MED_V2_2, 1 ) +Disque_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/disque.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py b/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py index 343070352..78df7eef1 100644 --- a/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py +++ b/src/Tools/blocFissure/materielCasTests/eprouvetteCourbe.py @@ -88,7 +88,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(25) Nb_Segments_3.SetDistrType( 0 ) isDone = EprouvetteCourbe_1.Compute() smesh.SetName(EprouvetteCourbe_1, 'EprouvetteCourbe') -EprouvetteCourbe_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/EprouvetteCourbe.med"), 0, SMESH.MED_V2_2, 1 ) +EprouvetteCourbe_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/EprouvetteCourbe.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py b/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py index 1b2ef1c47..890a6f933 100644 --- a/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py +++ b/src/Tools/blocFissure/materielCasTests/eprouvetteDroite.py @@ -123,7 +123,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(10,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = eprouvetteDroite_1.Compute() smesh.SetName(eprouvetteDroite_1, 'eprouvetteDroite') -eprouvetteDroite_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/eprouvetteDroite.med"), 0, SMESH.MED_V2_2, 1 ) +eprouvetteDroite_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/eprouvetteDroite.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/fissureGauche.py b/src/Tools/blocFissure/materielCasTests/fissureGauche.py index a6d4e3999..d8b87f1e1 100644 --- a/src/Tools/blocFissure/materielCasTests/fissureGauche.py +++ b/src/Tools/blocFissure/materielCasTests/fissureGauche.py @@ -117,7 +117,7 @@ Nb_Segments_3 = Regular_1D_2.NumberOfSegments(5,[],[ ]) Nb_Segments_3.SetDistrType( 0 ) isDone = objetSain_1.Compute() smesh.SetName(objetSain_1, 'objetSain') -objetSain_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/faceGaucheSain.med"), 0, SMESH.MED_V2_2, 1 ) +objetSain_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/faceGaucheSain.med")) SubMesh_1 = Regular_1D_1.GetSubMesh() SubMesh_2 = Regular_1D_2.GetSubMesh() diff --git a/src/Tools/blocFissure/materielCasTests/fissureGauche2.py b/src/Tools/blocFissure/materielCasTests/fissureGauche2.py index 0f08fd715..65dac7358 100644 --- a/src/Tools/blocFissure/materielCasTests/fissureGauche2.py +++ b/src/Tools/blocFissure/materielCasTests/fissureGauche2.py @@ -85,7 +85,7 @@ Quadrangle_2D = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE) Hexa_3D = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa) isDone = Mesh_1.Compute() smesh.SetName(Mesh_1, 'Mesh_1') -Mesh_1.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/boiteSaine.med"), 0, SMESH.MED_V2_2, 1 ) +Mesh_1.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/boiteSaine.med")) ## set object names smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1') diff --git a/src/Tools/blocFissure/materielCasTests/vis.py b/src/Tools/blocFissure/materielCasTests/vis.py index ce9aa6805..21e0f2c1d 100644 --- a/src/Tools/blocFissure/materielCasTests/vis.py +++ b/src/Tools/blocFissure/materielCasTests/vis.py @@ -193,7 +193,7 @@ visHex80 = smesh.CopyMesh( coupe_vis_1, 'visHex80', 1, 0) [ tige_2, section_2, tige_haute_2, rond_2, tete_2, section_tete_2, conge_2, appui_2, p_imp_2, tige_rotated, tige_top, section_rotated, section_top, tige_haute_rotated, tige_haute_top, rond_rotated, rond_top, tete_rotated, tete_top, section_tete_rotated, section_tete_top, conge_rotated, conge_top, appui_rotated, appui_top, p_imp_rotated, p_imp_top ] = visHex80.GetGroups() Sub_mesh_1 = Regular_1D_1.GetSubMesh() Sub_mesh_2 = Regular_1D_2.GetSubMesh() -visHex80.ExportMED( os.path.join(gmu.pathBloc, "materielCasTests/visSain.med"), 0, SMESH.MED_V2_2, 1 ) +visHex80.ExportMED(os.path.join(gmu.pathBloc, "materielCasTests/visSain.med")) ## Set names of Mesh objects diff --git a/src/Tools/padder/spadderpy/gui/plugindialog.py b/src/Tools/padder/spadderpy/gui/plugindialog.py index 8bd4294a4..46c804aa5 100644 --- a/src/Tools/padder/spadderpy/gui/plugindialog.py +++ b/src/Tools/padder/spadderpy/gui/plugindialog.py @@ -210,7 +210,7 @@ class PluginDialog(QDialog): name. This returns the filename. ''' filename=str("/tmp/padder_inputfile_"+meshName+".med") - meshObject.ExportToMEDX( filename, 0, SMESH.MED_V2_2, 1, 1 ) + meshObject.ExportToMEDX( filename, 0, 1, 1 ) return filename def clear(self):