X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=4a00711b7a6f76286586fd9afc2cf8cc7fed0186;hp=4ae04c64775e0d12dd4e132d5caf3a1169682bb5;hb=072a73120b6db7bba2389aa7ada0cde20e22ee57;hpb=9a4f5e4852afef4eac26f069ea33de5bcbfdc72b diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 4ae04c647..4a00711b7 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -66,10 +66,15 @@ #include #include -#include "Utils_ExceptHandlers.hxx" +#include "SMESH_TryCatch.hxx" // include after OCCT headers! +#include "Utils_ExceptHandlers.hxx" +#ifndef WIN32 #include #include +#else +#include +#endif using namespace std; @@ -137,11 +142,23 @@ SMESH_Mesh::SMESH_Mesh(): namespace { - void deleteMeshDS(SMESHDS_Mesh* meshDS) +#ifndef WIN32 + void deleteMeshDS(SMESHDS_Mesh* meshDS) { //cout << "deleteMeshDS( " << meshDS << endl; delete meshDS; } +#else + static void* deleteMeshDS(void* meshDS) + { + //cout << "deleteMeshDS( " << meshDS << endl; + SMESHDS_Mesh* m = (SMESHDS_Mesh*)meshDS; + if(m) { + delete m; + } + return 0; + } +#endif } //============================================================================= @@ -189,9 +206,15 @@ SMESH_Mesh::~SMESH_Mesh() _myDocument->RemoveMesh( _id ); _myDocument = 0; - if ( _myMeshDS ) - // delete _myMeshDS, in a thread in order not to block closing a study with large meshes + if ( _myMeshDS ) { + // delete _myMeshDS, in a thread in order not to block closing a study with large meshes +#ifndef WIN32 boost::thread aThread(boost::bind( & deleteMeshDS, _myMeshDS )); +#else + pthread_t thread; + int result=pthread_create(&thread, NULL, deleteMeshDS, (void*)_myMeshDS); +#endif + } } //================================================================================ @@ -364,13 +387,10 @@ void SMESH_Mesh::Clear() { if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) ) { - SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true, - /*complexShapeFirst=*/true); - while ( smIt->more() ) - { - sm = smIt->next(); - sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); - } + sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN ); + sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); + sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } } _isModified = false; @@ -877,7 +897,7 @@ SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const { StudyContextStruct *sc = _gen->GetStudyContext(_studyId); if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - return false; + return NULL; SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; return anHyp; @@ -1259,7 +1279,7 @@ void SMESH_Mesh::ExportMED(const char * file, bool theAutoDimension) throw(SALOME_Exception) { - Unexpect aCatch(SalomeException); + SMESH_TRY; DriverMED_W_SMESHDS_Mesh myWriter; myWriter.SetFile ( file, MED::EVersion(theVersion) ); @@ -1306,6 +1326,8 @@ void SMESH_Mesh::ExportMED(const char * file, } // Perform export myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); } //================================================================================ @@ -1322,7 +1344,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, std::string medfilename(file); medfilename += ".med"; std::string cmd; -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1332,7 +1354,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "\""; system(cmd.c_str()); ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, 1); -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1341,7 +1363,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')"; cmd += "\""; system(cmd.c_str()); -#ifdef WNT +#ifdef WIN32 cmd = "%PYTHONBIN% "; #else cmd = "python "; @@ -1485,7 +1507,17 @@ double SMESH_Mesh::GetComputeProgress() const algoDoneCost += smToCompute[i]->GetComputeCost(); currentSubIds.Add( smToCompute[i]->GetId() ); } - double rate = algo->GetProgress(); + double rate = 0; + try + { + OCC_CATCH_SIGNALS; + rate = algo->GetProgress(); + } + catch (...) { +#ifdef _DEBUG_ + cerr << "Exception in " << algo->GetName() << "::GetProgress()" << endl; +#endif + } if ( 0. < rate && rate < 1.001 ) { computedCost += rate * ( algoDoneCost + algoNotDoneCost );