X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=691b86b76dd8bbf17895aa8bb04645a815f9e335;hb=48653b1aec47ca1dfd706a1f8e7ea892b41bfb4c;hp=3c3dca37fa017cf9042db31a4b12d1746227757c;hpb=ffa2f0be827dd4e6aed92f7b5c57ba4e01f63713;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 3c3dca37f..691b86b76 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,8 @@ #include #include +#include "SMESH_TryCatch.hxx" // include after OCCT headers! + #include "Utils_ExceptHandlers.hxx" #include @@ -363,13 +366,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; @@ -1258,7 +1258,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) ); @@ -1305,6 +1305,8 @@ void SMESH_Mesh::ExportMED(const char * file, } // Perform export myWriter.Perform(); + + SMESH_CATCH( SMESH::throwSalomeEx ); } //================================================================================ @@ -1469,39 +1471,65 @@ double SMESH_Mesh::GetComputeProgress() const double totalCost = 1e-100, computedCost = 0; const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh(); + // get progress of a current algo + TColStd_MapOfInteger currentSubIds; + if ( curSM ) + if ( SMESH_Algo* algo = curSM->GetAlgo() ) + { + int algoNotDoneCost = 0, algoDoneCost = 0; + const std::vector& smToCompute = algo->SubMeshesToCompute(); + for ( size_t i = 0; i < smToCompute.size(); ++i ) + { + if ( smToCompute[i]->IsEmpty() ) + algoNotDoneCost += smToCompute[i]->GetComputeCost(); + else + algoDoneCost += smToCompute[i]->GetComputeCost(); + currentSubIds.Add( smToCompute[i]->GetId() ); + } + 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 ); + } + else + { + rate = algo->GetProgressByTic(); + computedCost += algoDoneCost + rate * algoNotDoneCost; + } + // cout << "rate: "<getDependsOnIterator(/*includeSelf=*/true); while ( smIt->more() ) { - SMESH_subMesh* sm = smIt->next(); + const SMESH_subMesh* sm = smIt->next(); const int smCost = sm->GetComputeCost(); totalCost += smCost; - if ( sm != curSM && - ( !sm->IsEmpty() || - sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE )) + if ( !currentSubIds.Contains( sm->GetId() ) ) { - computedCost += smCost; + if (( !sm->IsEmpty() ) || + ( sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE && + !sm->DependsOn( curSM ) )) + computedCost += smCost; } } } - // get progress of a current algo - if ( curSM ) - if ( SMESH_Algo* algo = curSM->GetAlgo() ) - { - double rate = algo->GetProgress(); - if ( 0. < rate && rate < 1.001 ) - { - //cout << " rate: " << rate << " cost " << algo->GetComputeCost() << endl; - computedCost += rate * algo->GetComputeCost(); - } - else - { - computedCost += algo->GetProgressByTic() * algo->GetComputeCost(); - } - } - //cout << "Total: " << totalCost << " progress: " << computedCost / totalCost << endl; + // cout << "Total: " << totalCost + // << " computed: " << computedCost << " progress: " << computedCost / totalCost + // << " nbElems: " << GetMeshDS()->GetMeshInfo().NbElements() << endl; return computedCost / totalCost; }