Salome HOME
22580: EDF 8049 SMESH: Problems with viscous layer
[modules/smesh.git] / src / SMESH / SMESH_subMesh.cxx
index c6e3d54647c8fa38c2310308fc7037f31d6533ea..e87b147c3fb068a431aa755607360a22c7ef35c3 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -116,8 +116,6 @@ SMESH_subMesh::SMESH_subMesh(int                  Id,
 
 SMESH_subMesh::~SMESH_subMesh()
 {
-  MESSAGE("SMESH_subMesh::~SMESH_subMesh");
-  // ****
   deleteOwnListeners();
 }
 
@@ -1555,7 +1553,7 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
             if ( !algo->NeedDiscreteBoundary() && !subFailed )
               _computeError =
                 SMESH_ComputeError::New(COMPERR_BAD_INPUT_MESH,
-                                        "Unexpected computed submesh",algo);
+                                        "Unexpected computed sub-mesh",algo);
             break; // goto exit
           }
         }
@@ -1589,8 +1587,8 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
           {
             ret = algo->Compute((*_father), shape);
           }
-          if ( !_computeError || (/* !ret && */_computeError->IsOK() ) ) // algo can set _computeError of submesh
-            _computeError = algo->GetComputeError();
+          // algo can set _computeError of submesh
+          _computeError = SMESH_ComputeError::Worst( _computeError, algo->GetComputeError() );
         }
         catch ( ::SMESH_ComputeError& comperr ) {
           cout << " SMESH_ComputeError caught" << endl;
@@ -1654,7 +1652,10 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
         if (ret)
         {
           for (; ret && subS.More(); subS.Next())
-            ret = _father->GetSubMesh( subS.Current() )->IsMeshComputed();
+            if ( !_father->GetSubMesh( subS.Current() )->IsMeshComputed() &&
+                 ( _subShape.ShapeType() != TopAbs_EDGE ||
+                   !algo->isDegenerated( TopoDS::Edge( subS.Current() ))))
+              ret = false;
         }
         // Set _computeError
         if (!ret && !isComputeErrorSet)
@@ -2119,7 +2120,7 @@ TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * theGen,
     theAlgo->GetUsedHypothesis( *_father, _subShape, ignoreAuxiliaryHyps ); // copy
 
   // put in a compound all shapes with the same hypothesis assigned
-  // and a good ComputState
+  // and a good ComputeState
 
   TopoDS_Compound aCompound;
   BRep_Builder aBuilder;
@@ -2285,7 +2286,7 @@ void SMESH_subMesh::setEventListener(EventListener*     listener,
         EventListenerData* curData = l_d->second;
         if ( curData && curData != data && curData->IsDeletable() )
           delete curData;
-        if ( l_d->first->IsDeletable() )
+        if ( l_d->first != listener && l_d->first->IsDeletable() )
           delete l_d->first;
         _eventListeners.erase( l_d );
         break;