diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 8ca54a409..3c3dca37f 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -592,19 +592,9 @@ SMESH_Hypothesis::Hypothesis_Status if ( !subMesh || !subMesh->GetId()) return SMESH_Hypothesis::HYP_BAD_SUBSHAPE; - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); - if(MYDEBUG) { - SCRUTE(_studyId); - SCRUTE(anHypId); - } + SMESH_Hypothesis *anHyp = GetHypothesis( anHypId ); + if ( !anHyp ) throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() ); bool isGlobalHyp = IsMainShape( aSubShape ); @@ -876,6 +866,22 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, return nbHyps; } +//================================================================================ +/*! + * \brief Return a hypothesis by its ID + */ +//================================================================================ + +SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const +{ + StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) + return false; + + SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; + return anHyp; +} + //============================================================================= /*! * @@ -1301,6 +1307,12 @@ void SMESH_Mesh::ExportMED(const char * file, myWriter.Perform(); } +//================================================================================ +/*! + * \brief Export the mesh to a SAUV file + */ +//================================================================================ + void SMESH_Mesh::ExportSAUV(const char *file, const char* theMeshName, bool theAutoGroups) @@ -1445,6 +1457,54 @@ void SMESH_Mesh::ExportGMF(const char * file, myWriter.Perform(); } +//================================================================================ +/*! + * \brief Return a ratio of "compute cost" of computed sub-meshes to the whole + * "compute cost". + */ +//================================================================================ + +double SMESH_Mesh::GetComputeProgress() const +{ + double totalCost = 1e-100, computedCost = 0; + const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh(); + + // get cost of already treated sub-meshes + if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 )) + { + SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true); + while ( smIt->more() ) + { + SMESH_subMesh* sm = smIt->next(); + const int smCost = sm->GetComputeCost(); + totalCost += smCost; + if ( sm != curSM && + ( !sm->IsEmpty() || + sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE )) + { + 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; + return computedCost / totalCost; +} + //================================================================================ /*! * \brief Return number of nodes in the mesh diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 5dc907eae..fa6abc0bb 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -148,6 +148,8 @@ public: const bool andAncestors, std::list< TopoDS_Shape > * assignedTo=0) const; + SMESH_Hypothesis * GetHypothesis(const int aHypID) const; + const std::list & GetLog() throw(SALOME_Exception); void ClearLog() throw(SALOME_Exception); @@ -252,6 +254,8 @@ public: void ExportSAUV(const char *file, const char* theMeshName = NULL, bool theAutoGroups = true) throw(SALOME_Exception); + + double GetComputeProgress() const; int NbNodes() const throw(SALOME_Exception); int Nb0DElements() const throw(SALOME_Exception);