Salome HOME
Compute Progress bar: ignore sub-meshes that are NOT_READY to compute
[modules/smesh.git] / src / SMESH / SMESH_Mesh.cxx
index b43a419619be3b80125541453de90b07237f659a..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 );
 
@@ -682,8 +672,7 @@ SMESH_Hypothesis::Hypothesis_Status
   
   SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
   if(MYDEBUG) {
-    int hypType = anHyp->GetType();
-    SCRUTE(hypType);
+    SCRUTE(anHyp->GetType());
   }
   
   // shape 
@@ -813,7 +802,8 @@ const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape &    aSubS
 int SMESH_Mesh::GetHypotheses(const TopoDS_Shape &                aSubShape,
                               const SMESH_HypoFilter&             aFilter,
                               list <const SMESHDS_Hypothesis * >& aHypList,
-                              const bool                          andAncestors) const
+                              const bool                          andAncestors,
+                              list< TopoDS_Shape > *              assignedTo/*=0*/) const
 {
   set<string> hypTypes; // to exclude same type hypos from the result list
   int nbHyps = 0;
@@ -842,6 +832,7 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape &                aSubShape,
         nbHyps++;
         if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() )
           mainHypFound = true;
+        if ( assignedTo ) assignedTo->push_back( aSubShape );
       }
   }
 
@@ -868,12 +859,29 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape &                aSubShape,
           nbHyps++;
           if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() )
             mainHypFound = true;
+          if ( assignedTo ) assignedTo->push_back( curSh );
         }
     }
   }
   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;
+}
+
 //=============================================================================
 /*!
  * 
@@ -918,10 +926,9 @@ SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape)
     if ( it.More() )
     {
       index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() );
-      if ( index > _nbSubShapes ) _nbSubShapes = index; // not to create sm for this group again
-
       // fill map of Ancestors
-      fillAncestorsMap(aSubShape);
+      while ( _nbSubShapes < index )
+        fillAncestorsMap( _myMeshDS->IndexToShape( ++_nbSubShapes ));
     }
   }
 //   if ( !index )
@@ -1247,19 +1254,21 @@ void SMESH_Mesh::ExportMED(const char *        file,
                            const char*         theMeshName, 
                            bool                theAutoGroups,
                            int                 theVersion,
-                           const SMESHDS_Mesh* meshPart) 
+                           const SMESHDS_Mesh* meshPart,
+                           bool                theAutoDimension)
   throw(SALOME_Exception)
 {
   Unexpect aCatch(SalomeException);
 
   DriverMED_W_SMESHDS_Mesh myWriter;
-  myWriter.SetFile    ( file, MED::EVersion(theVersion) );
-  myWriter.SetMesh    ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS   );
+  myWriter.SetFile         ( file, MED::EVersion(theVersion) );
+  myWriter.SetMesh         ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS   );
+  myWriter.SetAutoDimension( theAutoDimension );
   if ( !theMeshName ) 
-    myWriter.SetMeshId  ( _id         );
+    myWriter.SetMeshId     ( _id         );
   else {
-    myWriter.SetMeshId  ( -1          );
-    myWriter.SetMeshName( theMeshName );
+    myWriter.SetMeshId     ( -1          );
+    myWriter.SetMeshName   ( theMeshName );
   }
 
   if ( theAutoGroups ) {
@@ -1298,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)
@@ -1442,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