Salome HOME
Compute Progress bar
authoreap <eap@opencascade.com>
Wed, 3 Jul 2013 16:10:31 +0000 (16:10 +0000)
committereap <eap@opencascade.com>
Wed, 3 Jul 2013 16:10:31 +0000 (16:10 +0000)
+  double GetComputeProgress() const;
+  SMESH_Hypothesis * GetHypothesis(const int aHypID) const;

src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_Mesh.hxx

index 8ca54a4092537a0468d89ce16e356aca8bfbf7fb..3c3dca37fa017cf9042db31a4b12d1746227757c 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,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
index 5dc907eae75084c8ebf3f28af5f169081ff9fc02..fa6abc0bb4e610dbca2b6e611ae8f301a066eb4c 100644 (file)
@@ -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<SMESHDS_Command*> & 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);