Salome HOME
[SALOME platform 0013410]: SubMesh not taken into account with Netgen 1D-2D et 1D...
authoreap <eap@opencascade.com>
Tue, 16 Sep 2008 08:49:28 +0000 (08:49 +0000)
committereap <eap@opencascade.com>
Tue, 16 Sep 2008 08:49:28 +0000 (08:49 +0000)
1)        algo->Compute() depending on algo->SupportSubmeshes()
2)
+  /*!
+   * \brief Return true if no mesh entities is bound to the submesh
+   */
+  bool IsEmpty() const;

src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMesh.hxx

index 644c6fbfae139e2f8cb2e12ed229c66eac3fe762..704703404d0e8003b4fa4a9d3645f75bcba37dc8 100644 (file)
@@ -186,6 +186,19 @@ void SMESH_subMesh::SetIsAlwaysComputed(bool isAlCo)
     ComputeStateEngine( CHECK_COMPUTE_STATE );
 }
 
     ComputeStateEngine( CHECK_COMPUTE_STATE );
 }
 
+//=======================================================================
+/*!
+ * \brief Return true if no mesh entities is bound to the submesh
+ */
+//=======================================================================
+
+bool SMESH_subMesh::IsEmpty() const
+{
+  if (SMESHDS_SubMesh * subMeshDS = ((SMESH_subMesh*)this)->GetSubMeshDS())
+    return (!subMeshDS->GetNodes()->more() && !subMeshDS->GetElements()->more());
+  return true;
+}
+
 //=======================================================================
 //function : IsMeshComputed
 //purpose  : check if _subMeshDS contains mesh elements
 //=======================================================================
 //function : IsMeshComputed
 //purpose  : check if _subMeshDS contains mesh elements
@@ -968,11 +981,13 @@ SMESH_Hypothesis::Hypothesis_Status
     TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape ));
     for ( ; ( ret == SMESH_Hypothesis::HYP_OK && it.More()); it.Next() ) {
       if ( SMESH_Algo* upperAlgo = gen->GetAlgo( *_father, it.Value() ))
     TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape ));
     for ( ; ( ret == SMESH_Hypothesis::HYP_OK && it.More()); it.Next() ) {
       if ( SMESH_Algo* upperAlgo = gen->GetAlgo( *_father, it.Value() ))
-        if ( !upperAlgo->NeedDescretBoundary() )
+        if ( !upperAlgo->NeedDescretBoundary() && !upperAlgo->SupportSubmeshes())
           ret = SMESH_Hypothesis::HYP_HIDDEN_ALGO;
     }
     // is algo hiding?
           ret = SMESH_Hypothesis::HYP_HIDDEN_ALGO;
     }
     // is algo hiding?
-    if ( ret == SMESH_Hypothesis::HYP_OK && !algo->NeedDescretBoundary() ) {
+    if ( ret == SMESH_Hypothesis::HYP_OK &&
+         !algo->NeedDescretBoundary()    &&
+         !algo->SupportSubmeshes()) {
       map<int, SMESH_subMesh*>::reverse_iterator i_sm = _mapDepend.rbegin();
       for ( ; ( ret == SMESH_Hypothesis::HYP_OK && i_sm != _mapDepend.rend()) ; ++i_sm )
         if ( gen->GetAlgo( *_father, i_sm->second->_subShape ))
       map<int, SMESH_subMesh*>::reverse_iterator i_sm = _mapDepend.rbegin();
       for ( ; ( ret == SMESH_Hypothesis::HYP_OK && i_sm != _mapDepend.rend()) ; ++i_sm )
         if ( gen->GetAlgo( *_father, i_sm->second->_subShape ))
@@ -1309,6 +1324,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
           else
             subComputed = SubMeshesComputed();
           ret = ( algo->NeedDescretBoundary() ? subComputed :
           else
             subComputed = SubMeshesComputed();
           ret = ( algo->NeedDescretBoundary() ? subComputed :
+                  algo->SupportSubmeshes() ? true :
                   ( !subComputed || _father->IsNotConformAllowed() ));
           if (!ret) {
             _computeState = FAILED_TO_COMPUTE;
                   ( !subComputed || _father->IsNotConformAllowed() ));
           if (!ret) {
             _computeState = FAILED_TO_COMPUTE;
@@ -1343,7 +1359,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
           {
             ret = algo->Compute((*_father), shape);
           }
           {
             ret = algo->Compute((*_father), shape);
           }
-          if ( !ret )
+          if ( !ret && _computeError->IsOK() ) // algo can set _computeError of submesh
             _computeError = algo->GetComputeError();
         }
         catch ( std::bad_alloc& exc ) {
             _computeError = algo->GetComputeError();
         }
         catch ( std::bad_alloc& exc ) {
@@ -1389,7 +1405,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
           else
             ret = false;
         }
           else
             ret = false;
         }
-        if (ret && !_alwaysComputed) { // check if anything was built
+        if (ret && !_alwaysComputed && shape == _subShape) { // check if anything was built
           ret = ( GetSubMeshDS() && ( GetSubMeshDS()->NbElements() || GetSubMeshDS()->NbNodes() ));
         }
         bool isComputeErrorSet = !CheckComputeError( algo, shape );
           ret = ( GetSubMeshDS() && ( GetSubMeshDS()->NbElements() || GetSubMeshDS()->NbNodes() ));
         }
         bool isComputeErrorSet = !CheckComputeError( algo, shape );
@@ -1579,7 +1595,7 @@ bool SMESH_subMesh::CheckComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
       for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) {
         SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() );
         if ( sm != this ) {
       for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) {
         SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() );
         if ( sm != this ) {
-          if ( !sm->CheckComputeError( theAlgo ))
+          if ( !sm->CheckComputeError( theAlgo, sm->GetSubShape() ))
             noErrors = false;
           UpdateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED
         }
             noErrors = false;
           UpdateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED
         }
@@ -1808,8 +1824,8 @@ TopoDS_Shape SMESH_subMesh::GetCollection(SMESH_Gen * theGen,
     else if ( subMesh->GetComputeState() == READY_TO_COMPUTE )
     {
       SMESH_Algo* anAlgo = theGen->GetAlgo( *_father, S );
     else if ( subMesh->GetComputeState() == READY_TO_COMPUTE )
     {
       SMESH_Algo* anAlgo = theGen->GetAlgo( *_father, S );
-      if (anAlgo == theAlgo &&
-          anAlgo->GetUsedHypothesis( *_father, S, ignoreAuxiliaryHyps ) == aUsedHyp)
+      if (strcmp( anAlgo->GetName(), theAlgo->GetName()) == 0 && // same algo
+          anAlgo->GetUsedHypothesis( *_father, S, ignoreAuxiliaryHyps ) == aUsedHyp) // same hyps
         aBuilder.Add( aCompound, S );
       if ( !subMesh->SubMeshesComputed() )
         theSubComputed = false;
         aBuilder.Add( aCompound, S );
       if ( !subMesh->SubMeshesComputed() )
         theSubComputed = false;
index 9b3860ae0fd6a5e9d111726b890b9eaf881051dc..660d38e9fe9626a06d959c8c21c443ac20395bbe 100644 (file)
@@ -211,6 +211,11 @@ public:
   SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType);
   // check if there are several applicable hypothesis on fathers
 
   SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType);
   // check if there are several applicable hypothesis on fathers
 
+  /*!
+   * \brief Return true if no mesh entities is bound to the submesh
+   */
+  bool IsEmpty() const;
+
   bool IsMeshComputed() const;
   // check if _subMeshDS contains mesh elements
 
   bool IsMeshComputed() const;
   // check if _subMeshDS contains mesh elements