]> SALOME platform Git repositories - modules/smesh.git/blobdiff - src/SMESH/SMESH_Mesh.cxx
Salome HOME
Compute Progress bar
[modules/smesh.git] / src / SMESH / SMESH_Mesh.cxx
index 8ca54a4092537a0468d89ce16e356aca8bfbf7fb..d630792175db9a40c38d1601cbd30248dd95772d 100644 (file)
@@ -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,61 @@ 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();
+      if ( sm->GetComputeState() != SMESH_subMesh::NOT_READY )
+      {
+        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 if ( curSM->IsEmpty() )
+      {
+        computedCost += algo->GetProgressByTic() * algo->GetComputeCost();
+      }
+      else
+      {
+        computedCost += 0.99 * algo->GetComputeCost();
+      }
+    }
+  //cout << "Total: " << totalCost << " progress: " << computedCost / totalCost << endl;
+  return computedCost / totalCost;
+}
+
 //================================================================================
 /*!
  * \brief Return number of nodes in the mesh