Salome HOME
updating or adding when merging in the main trunk with the version in the
[modules/smesh.git] / src / SMESH / SMESH_subMesh.cxx
index 982b8ef54a23142981c67a51afb681f4be689245..2e6799ed22b80a7348e8c5f73bfc0dde843632ae 100644 (file)
@@ -26,7 +26,6 @@
 //  Module : SMESH
 //  $Header$
 
-using namespace std;
 using namespace std;
 #include "SMESH_subMesh.hxx"
 #include "SMESH_Gen.hxx"
@@ -48,31 +47,29 @@ using namespace std;
  */
 //=============================================================================
 
-SMESH_subMesh::SMESH_subMesh(int Id, 
-                            SMESH_Mesh* father,
-                            const Handle(SMESHDS_Mesh)& meshDS,
-                            const TopoDS_Shape & aSubShape)
+SMESH_subMesh::SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS,
+       const TopoDS_Shape & aSubShape)
 {
-  //MESSAGE("SMESH_subMesh::SMESH_subMesh");
-  _subShape = aSubShape;
-  _meshDS = meshDS;
-  _subMeshDS =  meshDS->MeshElements(_subShape); // may be null ...
-  _father = father;
-  _Id = Id;
-  _vertexSet = false;        // only for Vertex subMesh
-  _dependenceAnalysed = false;
-  _dependantsFound = false;
-
-  if (_subShape.ShapeType() == TopAbs_VERTEX)
-    {
-      _algoState = HYP_OK;
-      _computeState = READY_TO_COMPUTE;
-    }
-  else
-    {
-      _algoState = NO_ALGO;
-      _computeState = NOT_READY;
-    }
+       //MESSAGE("SMESH_subMesh::SMESH_subMesh");
+       _subShape = aSubShape;
+       _meshDS = meshDS;
+       _subMeshDS = meshDS->MeshElements(_subShape);   // may be null ...
+       _father = father;
+       _Id = Id;
+       _vertexSet = false;                     // only for Vertex subMesh
+       _dependenceAnalysed = false;
+       _dependantsFound = false;
+
+       if (_subShape.ShapeType() == TopAbs_VERTEX)
+       {
+               _algoState = HYP_OK;
+               _computeState = READY_TO_COMPUTE;
+       }
+       else
+       {
+               _algoState = NO_ALGO;
+               _computeState = NOT_READY;
+       }
 }
 
 //=============================================================================
@@ -83,8 +80,8 @@ SMESH_subMesh::SMESH_subMesh(int Id,
 
 SMESH_subMesh::~SMESH_subMesh()
 {
-  MESSAGE("SMESH_subMesh::~SMESH_subMesh");
-  // ****
+       MESSAGE("SMESH_subMesh::~SMESH_subMesh");
+       // ****
 }
 
 //=============================================================================
@@ -93,10 +90,10 @@ SMESH_subMesh::~SMESH_subMesh()
  */
 //=============================================================================
 
-int  SMESH_subMesh::GetId()
+int SMESH_subMesh::GetId()
 {
-  //MESSAGE("SMESH_subMesh::GetId");
-  return _Id;
+       //MESSAGE("SMESH_subMesh::GetId");
+       return _Id;
 }
 
 //=============================================================================
@@ -120,39 +117,39 @@ int  SMESH_subMesh::GetId()
 //     {
 // //     case TopAbs_COMPOUND:
 // //       {
-// //  //MESSAGE("---");
-// //  throw SALOME_Exception(LOCALIZED("Compound not yet treated"));
-// //  break;
+// //   //MESSAGE("---");
+// //   throw SALOME_Exception(LOCALIZED("Compound not yet treated"));
+// //   break;
 // //       }
 //     case TopAbs_COMPSOLID:
 //       {
-//     //MESSAGE("---");
-//     for (TopExp_Explorer exp(aSubShape,TopAbs_SOLID);exp.More();exp.Next())
-//       {
-//         contains = _subShape.IsSame(exp.Current());
-//         if (contains) break;
-//       }
-//     break;
+//  //MESSAGE("---");
+//  for (TopExp_Explorer exp(aSubShape,TopAbs_SOLID);exp.More();exp.Next())
+//    {
+//      contains = _subShape.IsSame(exp.Current());
+//      if (contains) break;
+//    }
+//  break;
 //       }
 //     case TopAbs_SHELL:
 //       {
-//     //MESSAGE("---");
-//     for (TopExp_Explorer exp(aSubShape,TopAbs_FACE);exp.More();exp.Next())
-//       {
-//         contains = _subShape.IsSame(exp.Current());
-//         if (contains) break;
-//       }
-//     break;
+//  //MESSAGE("---");
+//  for (TopExp_Explorer exp(aSubShape,TopAbs_FACE);exp.More();exp.Next())
+//    {
+//      contains = _subShape.IsSame(exp.Current());
+//      if (contains) break;
+//    }
+//  break;
 //       }
 //     case TopAbs_WIRE:
 //       {
-//     //MESSAGE("---");
-//     for (TopExp_Explorer exp(aSubShape,TopAbs_EDGE);exp.More();exp.Next())
-//       {
-//         contains = _subShape.IsSame(exp.Current());
-//         if (contains) break;
-//       }
-//     break;
+//  //MESSAGE("---");
+//  for (TopExp_Explorer exp(aSubShape,TopAbs_EDGE);exp.More();exp.Next())
+//    {
+//      contains = _subShape.IsSame(exp.Current());
+//      if (contains) break;
+//    }
+//  break;
 //       }
 //     case TopAbs_COMPOUND:
 //     case TopAbs_SOLID:
@@ -160,13 +157,13 @@ int  SMESH_subMesh::GetId()
 //     case TopAbs_EDGE:
 //     case TopAbs_VERTEX:
 //       {
-//     //MESSAGE("---");
-//     contains = _subShape.IsSame(aSubShape);
-//     break;
+//  //MESSAGE("---");
+//  contains = _subShape.IsSame(aSubShape);
+//  break;
 //       }
 //     default:
 //       {
-//     break;
+//  break;
 //       }
 //     }
 //   //SCRUTE(contains);
@@ -179,22 +176,21 @@ int  SMESH_subMesh::GetId()
  */
 //=============================================================================
 
-const Handle(SMESHDS_SubMesh)& SMESH_subMesh::GetSubMeshDS()
-  throw (SALOME_Exception)
+SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() throw(SALOME_Exception)
 {
-  //MESSAGE("SMESH_subMesh::GetSubMeshDS");
-  if (_subMeshDS.IsNull())
-    {
-      //MESSAGE("subMesh pointer still null, trying to get it...");
-      _subMeshDS =  _meshDS->MeshElements(_subShape); // may be null ...
-      if (_subMeshDS.IsNull())
+       //MESSAGE("SMESH_subMesh::GetSubMeshDS");
+       if (_subMeshDS==NULL)
        {
-         MESSAGE("problem... subMesh still empty");
-         //NRI   ASSERT(0);
-         //NRI   throw SALOME_Exception(LOCALIZED(subMesh still empty));
+               //MESSAGE("subMesh pointer still null, trying to get it...");
+               _subMeshDS = _meshDS->MeshElements(_subShape);  // may be null ...
+               if (_subMeshDS==NULL)
+               {
+                       MESSAGE("problem... subMesh still empty");
+                       //NRI   ASSERT(0);
+                       //NRI   throw SALOME_Exception(LOCALIZED(subMesh still empty));
+               }
        }
-    }
-  return _subMeshDS;
+       return _subMeshDS;
 }
 
 //=============================================================================
@@ -203,39 +199,38 @@ const Handle(SMESHDS_SubMesh)& SMESH_subMesh::GetSubMeshDS()
  */
 //=============================================================================
 
-SMESH_subMesh* SMESH_subMesh::GetFirstToCompute()
-  throw (SALOME_Exception)
+SMESH_subMesh *SMESH_subMesh::GetFirstToCompute() throw(SALOME_Exception)
 {
-  //MESSAGE("SMESH_subMesh::GetFirstToCompute");
-  const map<int, SMESH_subMesh*>& subMeshes = DependsOn();
-  SMESH_subMesh* firstToCompute = 0;
-
-  map<int, SMESH_subMesh*>::const_iterator itsub;
-  for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
-    {
-      SMESH_subMesh* sm = (*itsub).second;
+       //MESSAGE("SMESH_subMesh::GetFirstToCompute");
+       const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
+       SMESH_subMesh *firstToCompute = 0;
+
+       map < int, SMESH_subMesh * >::const_iterator itsub;
+       for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+       {
+               SMESH_subMesh *sm = (*itsub).second;
 //       SCRUTE(sm->GetId());
 //       SCRUTE(sm->GetComputeState());
-      bool readyToCompute = (sm->GetComputeState() == READY_TO_COMPUTE);
-      if (readyToCompute)
+               bool readyToCompute = (sm->GetComputeState() == READY_TO_COMPUTE);
+               if (readyToCompute)
+               {
+                       firstToCompute = sm;
+                       //SCRUTE(sm->GetId());
+                       break;
+               }
+       }
+       if (firstToCompute)
        {
-         firstToCompute = sm; 
-         //SCRUTE(sm->GetId());
-         break;
+               //MESSAGE("--- submesh to compute");
+               return firstToCompute;  // a subMesh of this
        }
-    }
-  if (firstToCompute)
-    {
-      //MESSAGE("--- submesh to compute");
-      return firstToCompute;       // a subMesh of this
-    }
-  if (_computeState == READY_TO_COMPUTE)
-    {
-      //MESSAGE("--- this to compute");
-      return this;  // this
-    }
-  //MESSAGE("--- nothing to compute");
-  return 0;                                            // nothing to compute
+       if (_computeState == READY_TO_COMPUTE)
+       {
+               //MESSAGE("--- this to compute");
+               return this;                    // this
+       }
+       //MESSAGE("--- nothing to compute");
+       return 0;                                       // nothing to compute
 }
 
 //=============================================================================
@@ -244,28 +239,75 @@ SMESH_subMesh* SMESH_subMesh::GetFirstToCompute()
  */
 //=============================================================================
 
-bool SMESH_subMesh::SubMeshesComputed()
-  throw (SALOME_Exception)
+bool SMESH_subMesh::SubMeshesComputed() throw(SALOME_Exception)
 {
-  //MESSAGE("SMESH_subMesh::SubMeshesComputed");
-  const map<int, SMESH_subMesh*>& subMeshes = DependsOn();
-
-  bool subMeshesComputed = true;
-  map<int, SMESH_subMesh*>::const_iterator itsub;
-  for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
-    {
-      SMESH_subMesh* sm = (*itsub).second;
+       //MESSAGE("SMESH_subMesh::SubMeshesComputed");
+       const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
+
+       bool subMeshesComputed = true;
+       map < int, SMESH_subMesh * >::const_iterator itsub;
+       for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+       {
+               SMESH_subMesh *sm = (*itsub).second;
+
+               const TopoDS_Shape & ss = sm->GetSubShape();
+               int type = ss.ShapeType();
 //       SCRUTE(sm->GetId());
 //       SCRUTE(sm->GetComputeState());
-      bool computeOk =  (sm->GetComputeState() == COMPUTE_OK);
-      if (! computeOk)
-       {
-         subMeshesComputed = false;
-         SCRUTE(sm->GetId());
-         break;
+               bool computeOk = (sm->GetComputeState() == COMPUTE_OK);
+               if (!computeOk)
+               {
+                       subMeshesComputed = false;
+
+                       switch (type)
+                         {
+                         case TopAbs_COMPOUND:
+                           {
+                             MESSAGE("The not computed sub mesh is a COMPOUND");
+                             break;
+                           }
+                         case TopAbs_COMPSOLID:
+                           {
+                             MESSAGE("The not computed sub mesh is a COMPSOLID");
+                             break;
+                           }
+                         case TopAbs_SHELL:
+                           {
+                             MESSAGE("The not computed sub mesh is a SHEL");
+                             break;
+                           }
+                         case TopAbs_WIRE:
+                           {
+                             MESSAGE("The not computed sub mesh is a WIRE");
+                             break;
+                           }
+                         case TopAbs_SOLID:
+                           {
+                             MESSAGE("The not computed sub mesh is a SOLID");
+                             break;
+                           }
+                         case TopAbs_FACE:
+                           {
+                             MESSAGE("The not computed sub mesh is a FACE");
+                             break;
+                           }
+                         case TopAbs_EDGE:
+                           {
+                             MESSAGE("The not computed sub mesh is a EDGE");
+                             break;
+                           }
+                         default:
+                           {
+                             MESSAGE("The not computed sub mesh is of unknown type");
+                             break;
+                           }
+                         }
+
+                       SCRUTE(sm->GetId());
+                       break;
+               }
        }
-    }
-   return subMeshesComputed; 
+       return subMeshesComputed;
 }
 
 //=============================================================================
@@ -276,26 +318,26 @@ bool SMESH_subMesh::SubMeshesComputed()
 
 bool SMESH_subMesh::SubMeshesReady()
 {
-  MESSAGE("SMESH_subMesh::SubMeshesReady");
-  const map<int, SMESH_subMesh*>& subMeshes = DependsOn();
-
-  bool subMeshesReady = true;
-  map<int, SMESH_subMesh*>::const_iterator itsub;
-  for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
-    {
-      SMESH_subMesh* sm = (*itsub).second;
+       MESSAGE("SMESH_subMesh::SubMeshesReady");
+       const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
+
+       bool subMeshesReady = true;
+       map < int, SMESH_subMesh * >::const_iterator itsub;
+       for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+       {
+               SMESH_subMesh *sm = (*itsub).second;
 //       SCRUTE(sm->GetId());
 //       SCRUTE(sm->GetComputeState());
-      bool computeOk = (    (sm->GetComputeState() == COMPUTE_OK)
-                        || (sm->GetComputeState() == READY_TO_COMPUTE)) ;
-      if (! computeOk)
-       {
-         subMeshesReady = false;
-         SCRUTE(sm->GetId());
-         break;
+               bool computeOk = ((sm->GetComputeState() == COMPUTE_OK)
+                       || (sm->GetComputeState() == READY_TO_COMPUTE));
+               if (!computeOk)
+               {
+                       subMeshesReady = false;
+                       SCRUTE(sm->GetId());
+                       break;
+               }
        }
-    }
-  return subMeshesReady; 
+       return subMeshesReady;
 }
 
 //=============================================================================
@@ -310,158 +352,169 @@ bool SMESH_subMesh::SubMeshesReady()
  */
 //=============================================================================
 
-const map<int, SMESH_subMesh*>& SMESH_subMesh::DependsOn()
+const map < int, SMESH_subMesh * >&SMESH_subMesh::DependsOn()
 {
- if (_dependenceAnalysed) return _mapDepend;
-
- //MESSAGE("SMESH_subMesh::DependsOn");
-
-  int type = _subShape.ShapeType();
-  //SCRUTE(type);
-  switch (type)
-    {
-    case TopAbs_COMPOUND:
-      {
-       //MESSAGE("compound");
-       list<TopoDS_Shape> shellInSolid;
-       for (TopExp_Explorer exp(_subShape,TopAbs_SOLID);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-           for (TopExp_Explorer 
-                  exp2(exp.Current(),TopAbs_SHELL);exp2.More();exp2.Next())
-             {
-               shellInSolid.push_back(exp2.Current()); 
-             }
-         }
-       for (TopExp_Explorer exp(_subShape,TopAbs_SHELL);exp.More();exp.Next())
-         {
-           list<TopoDS_Shape>::iterator it1;
-           bool isInSolid = false;
-           for (it1 = shellInSolid.begin(); it1 != shellInSolid.end(); it1++)
-             {
-               TopoDS_Shape aShape = (*it1);
-               if (aShape.IsSame(exp.Current())) 
+       if (_dependenceAnalysed)
+               return _mapDepend;
+
+       //MESSAGE("SMESH_subMesh::DependsOn");
+
+       int type = _subShape.ShapeType();
+       //SCRUTE(type);
+       switch (type)
+       {
+       case TopAbs_COMPOUND:
+       {
+               //MESSAGE("compound");
+               list < TopoDS_Shape > shellInSolid;
+               for (TopExp_Explorer exp(_subShape, TopAbs_SOLID); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+                       for (TopExp_Explorer
+                               exp2(exp.Current(), TopAbs_SHELL); exp2.More(); exp2.Next())
+                       {
+                               shellInSolid.push_back(exp2.Current());
+                       }
+               }
+               for (TopExp_Explorer exp(_subShape, TopAbs_SHELL); exp.More();
+                       exp.Next())
+               {
+                       list < TopoDS_Shape >::iterator it1;
+                       bool isInSolid = false;
+                       for (it1 = shellInSolid.begin(); it1 != shellInSolid.end(); it1++)
+                       {
+                               TopoDS_Shape aShape = (*it1);
+                               if (aShape.IsSame(exp.Current()))
+                               {
+                                       isInSolid = true;
+                                       break;
+                               }
+                       }
+                       if (!isInSolid)
+                               InsertDependence(exp.Current());        //only shell not in solid
+               }
+               for (TopExp_Explorer exp(_subShape, TopAbs_FACE); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+               for (TopExp_Explorer exp(_subShape, TopAbs_EDGE); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+               break;
+       }
+       case TopAbs_COMPSOLID:
+       {
+               //MESSAGE("compsolid");
+               for (TopExp_Explorer exp(_subShape, TopAbs_SOLID); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+//  list<TopoDS_Shape> shapeList;
+//  for (TopExp_Explorer exp(_subShape,TopAbs_SOLID);exp.More();exp.Next())
+//    {
+//      for (TopExp_Explorer 
+//         exp2(exp.Current(),TopAbs_FACE);exp2.More();exp2.Next())
+//        {
+//      shapeList.push_back(exp2.Current()); 
+//        }
+//    }
+//  FinalizeDependence(shapeList);
+               break;
+       }
+       case TopAbs_SHELL:
+       {
+               //MESSAGE("shell");
+               for (TopExp_Explorer exp(_subShape, TopAbs_FACE); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+//  list<TopoDS_Shape> shapeList;
+//  for (TopExp_Explorer exp(_subShape,TopAbs_FACE);exp.More();exp.Next())
+//    {
+//      for (TopExp_Explorer 
+//         exp2(exp.Current(),TopAbs_EDGE);exp2.More();exp2.Next())
+//        {
+//      shapeList.push_back(exp2.Current()); 
+//        }
+//    }
+//  FinalizeDependence(shapeList);
+               break;
+       }
+       case TopAbs_WIRE:
+       {
+               //MESSAGE("wire");
+               for (TopExp_Explorer exp(_subShape, TopAbs_EDGE); exp.More();
+                       exp.Next())
                {
-                 isInSolid = true;
-                 break;
+                       InsertDependence(exp.Current());
                }
-             }
-           if (!isInSolid)
-             InsertDependence(exp.Current()); //only shell not in solid
-         }
-       for (TopExp_Explorer exp(_subShape,TopAbs_FACE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-       for (TopExp_Explorer exp(_subShape,TopAbs_EDGE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-       break;
-      }
-    case TopAbs_COMPSOLID:
-      {
-       //MESSAGE("compsolid");
-       for (TopExp_Explorer exp(_subShape,TopAbs_SOLID);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-//     list<TopoDS_Shape> shapeList;
-//     for (TopExp_Explorer exp(_subShape,TopAbs_SOLID);exp.More();exp.Next())
-//       {
-//         for (TopExp_Explorer 
-//                exp2(exp.Current(),TopAbs_FACE);exp2.More();exp2.Next())
-//           {
-//             shapeList.push_back(exp2.Current()); 
-//           }
-//       }
-//     FinalizeDependence(shapeList);
-       break;
-      }
-    case TopAbs_SHELL:
-      {
-       //MESSAGE("shell");
-       for (TopExp_Explorer exp(_subShape,TopAbs_FACE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-//     list<TopoDS_Shape> shapeList;
-//     for (TopExp_Explorer exp(_subShape,TopAbs_FACE);exp.More();exp.Next())
-//       {
-//         for (TopExp_Explorer 
-//                exp2(exp.Current(),TopAbs_EDGE);exp2.More();exp2.Next())
-//           {
-//             shapeList.push_back(exp2.Current()); 
-//           }
-//       }
-//     FinalizeDependence(shapeList);
-       break;
-      }
-    case TopAbs_WIRE:
-      {
-       //MESSAGE("wire");
-       for (TopExp_Explorer exp(_subShape,TopAbs_EDGE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-//     list<TopoDS_Shape> shapeList;
-//     for (TopExp_Explorer exp(_subShape,TopAbs_EDGE);exp.More();exp.Next())
-//       {
-//         for (TopExp_Explorer 
-//                exp2(exp.Current(),TopAbs_VERTEX);exp2.More();exp2.Next())
-//           {
-//             shapeList.push_back(exp2.Current()); 
-//           }
-//       }
-//     FinalizeDependence(shapeList);
-       break;
-      }
-    case TopAbs_SOLID:
-      {
-       //MESSAGE("solid");
-//     for (TopExp_Explorer exp(_subShape,TopAbs_SHELL);exp.More();exp.Next())
-//       {
-//         InsertDependence(exp.Current());
-//       }
-       for (TopExp_Explorer exp(_subShape,TopAbs_FACE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-       break;
-      }
-    case TopAbs_FACE:
-      {
-       //MESSAGE("face");
-//     for (TopExp_Explorer exp(_subShape,TopAbs_WIRE);exp.More();exp.Next())
-//       {
-//         InsertDependence(exp.Current());
-//       }
-       for (TopExp_Explorer exp(_subShape,TopAbs_EDGE);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-       break;
-      }
-    case TopAbs_EDGE:
-      {
-       //MESSAGE("edge");
-       for (TopExp_Explorer exp(_subShape,TopAbs_VERTEX);exp.More();exp.Next())
-         {
-           InsertDependence(exp.Current());
-         }
-       break;
-      }
-    case TopAbs_VERTEX:
-      {
-       break;
-      }
-    default:
-      {
-       break;
-      }
-    }
-  _dependenceAnalysed = true;
-  return _mapDepend;
+//  list<TopoDS_Shape> shapeList;
+//  for (TopExp_Explorer exp(_subShape,TopAbs_EDGE);exp.More();exp.Next())
+//    {
+//      for (TopExp_Explorer 
+//         exp2(exp.Current(),TopAbs_VERTEX);exp2.More();exp2.Next())
+//        {
+//      shapeList.push_back(exp2.Current()); 
+//        }
+//    }
+//  FinalizeDependence(shapeList);
+               break;
+       }
+       case TopAbs_SOLID:
+       {
+               //MESSAGE("solid");
+//  for (TopExp_Explorer exp(_subShape,TopAbs_SHELL);exp.More();exp.Next())
+//    {
+//      InsertDependence(exp.Current());
+//    }
+               for (TopExp_Explorer exp(_subShape, TopAbs_FACE); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+               break;
+       }
+       case TopAbs_FACE:
+       {
+               //MESSAGE("face");
+//  for (TopExp_Explorer exp(_subShape,TopAbs_WIRE);exp.More();exp.Next())
+//    {
+//      InsertDependence(exp.Current());
+//    }
+               for (TopExp_Explorer exp(_subShape, TopAbs_EDGE); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+               break;
+       }
+       case TopAbs_EDGE:
+       {
+               //MESSAGE("edge");
+               for (TopExp_Explorer exp(_subShape, TopAbs_VERTEX); exp.More();
+                       exp.Next())
+               {
+                       InsertDependence(exp.Current());
+               }
+               break;
+       }
+       case TopAbs_VERTEX:
+       {
+               break;
+       }
+       default:
+       {
+               break;
+       }
+       }
+       _dependenceAnalysed = true;
+       return _mapDepend;
 }
 
 //=============================================================================
@@ -472,32 +525,32 @@ const map<int, SMESH_subMesh*>& SMESH_subMesh::DependsOn()
 
 void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape)
 {
-  //MESSAGE("SMESH_subMesh::InsertDependence");
-  //SMESH_subMesh* aSubMesh = _father->GetSubMeshContaining(aSubShape);
-  //SCRUTE(aSubMesh);
-  //if (! aSubMesh) aSubMesh = _father->GetSubMesh(aSubShape);
-
-  SMESH_subMesh* aSubMesh = _father->GetSubMesh(aSubShape);
-  int type = aSubShape.ShapeType();
-  int ordType = 9 - type; // 2 = Vertex, 8 = CompSolid
-  int cle = aSubMesh->GetId();
-  cle += 10000000 * ordType; // sort map by ordType then index
-  if (_mapDepend.find(cle) == _mapDepend.end())
-    {
-      _mapDepend[cle] = aSubMesh;
-      const map<int, SMESH_subMesh*>& subMap = aSubMesh->DependsOn();
-      map<int, SMESH_subMesh*>::const_iterator im;
-      for (im = subMap.begin(); im != subMap.end(); im++)
+       //MESSAGE("SMESH_subMesh::InsertDependence");
+       //SMESH_subMesh* aSubMesh = _father->GetSubMeshContaining(aSubShape);
+       //SCRUTE(aSubMesh);
+       //if (! aSubMesh) aSubMesh = _father->GetSubMesh(aSubShape);
+
+       SMESH_subMesh *aSubMesh = _father->GetSubMesh(aSubShape);
+       int type = aSubShape.ShapeType();
+       int ordType = 9 - type;         // 2 = Vertex, 8 = CompSolid
+       int cle = aSubMesh->GetId();
+       cle += 10000000 * ordType;      // sort map by ordType then index
+       if (_mapDepend.find(cle) == _mapDepend.end())
        {
-         int clesub = (*im).first;
-         SMESH_subMesh* sm = (*im).second;
-         if (_mapDepend.find(clesub) == _mapDepend.end())
-           _mapDepend[clesub] = sm;
+               _mapDepend[cle] = aSubMesh;
+               const map < int, SMESH_subMesh * >&subMap = aSubMesh->DependsOn();
+               map < int, SMESH_subMesh * >::const_iterator im;
+               for (im = subMap.begin(); im != subMap.end(); im++)
+               {
+                       int clesub = (*im).first;
+                       SMESH_subMesh *sm = (*im).second;
+                       if (_mapDepend.find(clesub) == _mapDepend.end())
+                               _mapDepend[clesub] = sm;
+               }
        }
-    }
 
 }
+
 //=============================================================================
 /*!
  * For collection shapes (compsolid, shell, wire).
@@ -514,10 +567,10 @@ void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape)
 //       TopoDS_Shape aSubShape = (*it1);
 //       int count = 0;
 //       for(it2 = shapeList.begin(); it2 != shapeList.end(); it2++)
-//     {
-//       TopoDS_Shape other = (*it2);
-//       if (other.IsSame(aSubShape)) count++;
-//     }
+//  {
+//    TopoDS_Shape other = (*it2);
+//    if (other.IsSame(aSubShape)) count++;
+//  }
 //       if (count == 1) InsertDependence(aSubShape);
 //       SCRUTE(count);
 //     }
@@ -529,10 +582,10 @@ void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape)
  */
 //=============================================================================
 
- const TopoDS_Shape& SMESH_subMesh::GetSubShape()
+const TopoDS_Shape & SMESH_subMesh::GetSubShape()
 {
-  //MESSAGE("SMESH_subMesh::GetSubShape");
-  return _subShape;
+       //MESSAGE("SMESH_subMesh::GetSubShape");
+       return _subShape;
 }
 
 //=============================================================================
@@ -541,382 +594,414 @@ void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape)
  */
 //=============================================================================
 
-bool SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis* anHyp)
-  throw (SALOME_Exception)
+bool SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis * anHyp)
+throw(SALOME_Exception)
 {
-  //  MESSAGE("SMESH_subMesh::AlgoStateEngine");
-  //SCRUTE(_algoState);
-  //SCRUTE(event);
-
-  // **** les retour des evenement shape sont significatifs
-  // (add ou remove fait ou non)
-  // le retour des evenement father n'indiquent pas que add ou remove fait
-  int dim = SMESH_Gen::GetShapeDim(_subShape);
-
-  if (dim < 1)
-    {
-      _algoState = HYP_OK;
-      //SCRUTE(_algoState);
-      return true;
-    }
-
-  SMESH_Gen* gen =_father->GetGen();
-  bool ret;
-  _oldAlgoState = _algoState;
-  bool modifiedHyp = false;  // if set to true, force event MODIF_ALGO_STATE
-                             // in ComputeStateEngine
-
-  switch (_algoState)
-    {
-
-      // ----------------------------------------------------------------------
-
-    case NO_ALGO:
-      switch (event)
-       {
-       case ADD_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->AddHypothesis(_subShape, anHyp);
-         break;
-       case ADD_ALGO:
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
-           {
-             ret = _meshDS->AddHypothesis(_subShape, anHyp);
-//           if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
-//           if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
-             if (ret &&(anHyp->GetShapeType() & (1<< _subShape.ShapeType())))
-               {
-                 SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-                 ASSERT(algo);
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
-               }
-           }
-         break;
-       case REMOVE_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-         break;
-       case REMOVE_ALGO:
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-         break;
-       case ADD_FATHER_HYP:      // nothing to do
-         break;
-       case ADD_FATHER_ALGO:     // Algo just added in father
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-//       if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
-//       if (anHyp->GetShapeType() == _subShape.ShapeType())
-         if (anHyp->GetShapeType() & (1<< _subShape.ShapeType()))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             ASSERT(algo);
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) SetAlgoState(HYP_OK);
-             else SetAlgoState(MISSING_HYP);
-           }
-         break;
-       case REMOVE_FATHER_HYP:    // nothing to do
-         break;
-       case REMOVE_FATHER_ALGO:   // nothing to do
-         break;
-       default:
-         ASSERT(0);
-         break;
-       }
-      break;
+       //  MESSAGE("SMESH_subMesh::AlgoStateEngine");
+       //SCRUTE(_algoState);
+       //SCRUTE(event);
 
-      // ----------------------------------------------------------------------
+       // **** les retour des evenement shape sont significatifs
+       // (add ou remove fait ou non)
+       // le retour des evenement father n'indiquent pas que add ou remove fait
+       int dim = SMESH_Gen::GetShapeDim(_subShape);
 
-    case MISSING_HYP:
-      switch (event)
+       if (dim < 1)
        {
-       case ADD_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->AddHypothesis(_subShape, anHyp);
-         if (ret)
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             ASSERT(algo);
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) SetAlgoState(HYP_OK);
-             else SetAlgoState(MISSING_HYP);
-           }
-         break;
-       case ADD_ALGO:            //already existing algo : on father ?
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
-           {
-             ret = _meshDS->AddHypothesis(_subShape, anHyp);
-//           if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
-//           if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
-             if (ret &&(anHyp->GetShapeType() & (1<< _subShape.ShapeType())))
-               {
-                 SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-                 if (algo == NULL) // two algo on the same subShape...
-                   {
-                     MESSAGE("two algo on the same subshape not allowed");
-                     ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-                     ret = false;
-                   }
-                 else
-                   {
-                     ret = algo->CheckHypothesis((*_father),_subShape);
-                     if (ret) SetAlgoState(HYP_OK);
-                     else SetAlgoState(MISSING_HYP);
-                   }
-               }
-           }
-         break;
-       case REMOVE_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);  
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-         break;
-       case REMOVE_ALGO:         // perhaps a father algo applies ?
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-//       if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
-//       if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
-         if (ret &&(anHyp->GetShapeType() & (1<<_subShape.ShapeType())))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)  // no more algo applying on subShape...
-               {
-                 SetAlgoState(NO_ALGO);
-               }
-             else
-               {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
-               }
-           }
-         break;
-       case ADD_FATHER_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         {
-           SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-           ASSERT(algo);
-           ret = algo->CheckHypothesis((*_father),_subShape);
-           if (ret) SetAlgoState(HYP_OK);
-           else SetAlgoState(MISSING_HYP);
-         }
-         break;
-       case ADD_FATHER_ALGO:     // detect if two algo of same dim on father
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-//       if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
-//       if (anHyp->GetShapeType() == _subShape.ShapeType())
-         if (anHyp->GetShapeType() & (1<< _subShape.ShapeType()))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)  // two applying algo on father
-               {
-                 MESSAGE("two applying algo on fatherShape...");
-                 SetAlgoState(NO_ALGO);
-               }
-             else
-               {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
-               }
-           }
-         break;
-       case REMOVE_FATHER_HYP:    // nothing to do
-         break;
-       case REMOVE_FATHER_ALGO:
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-//       if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
-//       if (anHyp->GetShapeType() == _subShape.ShapeType())
-         if (anHyp->GetShapeType() & (1<< _subShape.ShapeType()))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)  // no more applying algo on father
-               {
-                 SetAlgoState(NO_ALGO);
-               }
-             else
-               {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
-               }
-           }
-         break;
-       default:
-         ASSERT(0);
-         break;
+               _algoState = HYP_OK;
+               //SCRUTE(_algoState);
+               return true;
        }
-      break;
 
-      // ----------------------------------------------------------------------
+       SMESH_Gen *gen = _father->GetGen();
+       bool ret;
+       _oldAlgoState = _algoState;
+       bool modifiedHyp = false;       // if set to true, force event MODIF_ALGO_STATE
+       // in ComputeStateEngine
 
-    case HYP_OK:
-      switch (event)
+       switch (_algoState)
        {
-       case ADD_HYP:
-         {
-           ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-           SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-           ASSERT(algo);
-           list<SMESHDS_Hypothesis*> originalUsedHyps
-             = algo->GetUsedHypothesis((*_father), _subShape); // copy
-           
-           ret = _meshDS->AddHypothesis(_subShape, anHyp);
-           if (ret)
-             {
-               ret = algo->CheckHypothesis((*_father),_subShape);
-               if (! ret) 
-                 {
-                   INFOS("two applying algo on the same shape not allowed");
-                   ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-                   ret = false;
-                 }
-               else  // compare SMESHDS_Hypothesis* lists (order important)
-                 {
-                   MESSAGE("---");
-                   const list<SMESHDS_Hypothesis*>& newUsedHyps
-                     = algo->GetUsedHypothesis((*_father), _subShape);
-                   modifiedHyp = (originalUsedHyps != newUsedHyps); 
-                 }
-             }
-         }
-         break;
-       case ADD_ALGO:            //already existing algo : on father ?
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
-           {
-             ret = _meshDS->AddHypothesis(_subShape, anHyp);
-//           if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
-//           if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
-             if (ret &&(anHyp->GetShapeType() & (1<< _subShape.ShapeType())))
-               {
-                 SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-                 if (algo == NULL) // two algo on the same subShape...
-                   {
-                     INFOS("two algo on the same subshape not allowed");
-                     ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-                     ret = false;
-                   }
-                 else
-                   {
-                     ret = algo->CheckHypothesis((*_father),_subShape);
-                     if (ret) SetAlgoState(HYP_OK);
-                     else SetAlgoState(MISSING_HYP);
-                   }
-               }
-           }
-         break;
-       case REMOVE_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-         if (ret)
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             ASSERT(algo);
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) SetAlgoState(HYP_OK);
-             else SetAlgoState(MISSING_HYP);
-             modifiedHyp = true;
-           }
-         break;
-       case REMOVE_ALGO:         // perhaps a father algo applies ?
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-         ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
-//       if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
-//       if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
-         if (ret &&(anHyp->GetShapeType() & (1<< _subShape.ShapeType())))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)   // no more algo applying on subShape...
-               {
-                 SetAlgoState(NO_ALGO);
-               }
-             else
+
+               // ----------------------------------------------------------------------
+
+       case NO_ALGO:
+               switch (event)
                {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
+               case ADD_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->AddHypothesis(_subShape, anHyp);
+                       break;
+               case ADD_ALGO:
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
+                       {
+                               ret = _meshDS->AddHypothesis(_subShape, anHyp);
+//        if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
+//        if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
+                               if (ret &&
+                                       (anHyp->GetShapeType() & (1 << _subShape.ShapeType())))
+                               {
+                                       SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                                       ASSERT(algo);
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               case REMOVE_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                       break;
+               case REMOVE_ALGO:
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                       break;
+               case ADD_FATHER_HYP:    // nothing to do
+                       break;
+               case ADD_FATHER_ALGO:   // Algo just added in father
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+//    if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
+//    if (anHyp->GetShapeType() == _subShape.ShapeType())
+                       if (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                       }
+                       break;
+               case REMOVE_FATHER_HYP: // nothing to do
+                       break;
+               case REMOVE_FATHER_ALGO:        // nothing to do
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
                }
-           }
-         break;
-       case ADD_FATHER_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         {
-           SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-           ASSERT(algo);
-           ret = algo->CheckHypothesis((*_father),_subShape);
-           if (ret) SetAlgoState(HYP_OK);
-           else SetAlgoState(MISSING_HYP);
-         }
-         break;
-       case ADD_FATHER_ALGO:     // detect if two algo of same dim on father
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-//       if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
-//       if (anHyp->GetShapeType() == _subShape.ShapeType())
-         if (anHyp->GetShapeType() & (1<< _subShape.ShapeType()))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)  // two applying algo on father
+               break;
+
+               // ----------------------------------------------------------------------
+
+       case MISSING_HYP:
+               switch (event)
                {
-                 MESSAGE("two applying algo on fatherShape...");
-                 SetAlgoState(NO_ALGO);
+               case ADD_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->AddHypothesis(_subShape, anHyp);
+                       if (ret)
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                       }
+                       break;
+               case ADD_ALGO:                  //already existing algo : on father ?
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
+                       {
+                               ret = _meshDS->AddHypothesis(_subShape, anHyp);
+//        if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
+//        if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
+                               if (ret &&
+                                       (anHyp->GetShapeType() & (1 << _subShape.ShapeType())))
+                               {
+                                       SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                                       if (algo == NULL)       // two algo on the same subShape...
+                                       {
+                                               MESSAGE("two algo on the same subshape not allowed");
+                                               ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                                               ret = false;
+                                       }
+                                       else
+                                       {
+                                               ret = algo->CheckHypothesis((*_father), _subShape);
+                                               if (ret)
+                                                       SetAlgoState(HYP_OK);
+                                               else
+                                                       SetAlgoState(MISSING_HYP);
+                                       }
+                               }
+                       }
+                       break;
+               case REMOVE_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                       break;
+               case REMOVE_ALGO:               // perhaps a father algo applies ?
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+//    if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
+//    if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
+                       if (ret && (anHyp->GetShapeType() & (1 << _subShape.ShapeType())))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // no more algo applying on subShape...
+                               {
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               case ADD_FATHER_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                       }
+                       break;
+               case ADD_FATHER_ALGO:   // detect if two algo of same dim on father
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+//    if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
+//    if (anHyp->GetShapeType() == _subShape.ShapeType())
+                       if (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // two applying algo on father
+                               {
+                                       MESSAGE("two applying algo on fatherShape...");
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               case REMOVE_FATHER_HYP: // nothing to do
+                       break;
+               case REMOVE_FATHER_ALGO:
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+//    if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
+//    if (anHyp->GetShapeType() == _subShape.ShapeType())
+                       if (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // no more applying algo on father
+                               {
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
                }
-             else
+               break;
+
+               // ----------------------------------------------------------------------
+
+       case HYP_OK:
+               switch (event)
                {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
-               }
-           }
-         break;
-       case REMOVE_FATHER_HYP:
-         ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
-         {
-           SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-           ASSERT(algo);
-           ret = algo->CheckHypothesis((*_father),_subShape);
-           if (ret) SetAlgoState(HYP_OK);
-           else SetAlgoState(MISSING_HYP);
-         }
-         break;
-       case REMOVE_FATHER_ALGO:
-         ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
-//       if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
-//       if (anHyp->GetShapeType() == _subShape.ShapeType())
-         if (anHyp->GetShapeType() & (1<< _subShape.ShapeType()))
-           {
-             SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape);
-             if (algo == NULL)  // no more applying algo on father
+               case ADD_HYP:
                {
-                 SetAlgoState(NO_ALGO);
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                       ASSERT(algo);
+                       list<const SMESHDS_Hypothesis *> originalUsedHyps = algo->GetUsedHypothesis((*_father), _subShape);     // copy
+
+                       ret = _meshDS->AddHypothesis(_subShape, anHyp);
+                       if (ret)
+                       {
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (!ret)
+                               {
+                                       INFOS("two applying algo on the same shape not allowed");
+                                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                                       ret = false;
+                               }
+                               else                    // compare SMESHDS_Hypothesis* lists (order important)
+                               {
+                                       MESSAGE("---");
+                                       const list <const SMESHDS_Hypothesis *> & newUsedHyps
+                                               = algo->GetUsedHypothesis((*_father), _subShape);
+                                       modifiedHyp = (originalUsedHyps != newUsedHyps);
+                               }
+                       }
                }
-             else
-               {
-                 ret = algo->CheckHypothesis((*_father),_subShape);
-                 if (ret) SetAlgoState(HYP_OK);
-                 else SetAlgoState(MISSING_HYP);
+                       break;
+               case ADD_ALGO:                  //already existing algo : on father ?
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape))
+                       {
+                               ret = _meshDS->AddHypothesis(_subShape, anHyp);
+//        if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
+//        if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
+                               if (ret &&
+                                       (anHyp->GetShapeType() & (1 << _subShape.ShapeType())))
+                               {
+                                       SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                                       if (algo == NULL)       // two algo on the same subShape...
+                                       {
+                                               INFOS("two algo on the same subshape not allowed");
+                                               ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                                               ret = false;
+                                       }
+                                       else
+                                       {
+                                               ret = algo->CheckHypothesis((*_father), _subShape);
+                                               if (ret)
+                                                       SetAlgoState(HYP_OK);
+                                               else
+                                                       SetAlgoState(MISSING_HYP);
+                                       }
+                               }
+                       }
+                       break;
+               case REMOVE_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+                       if (ret)
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                               modifiedHyp = true;
+                       }
+                       break;
+               case REMOVE_ALGO:               // perhaps a father algo applies ?
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+                       ret = _meshDS->RemoveHypothesis(_subShape, anHyp);
+//    if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)))
+//    if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType()))
+                       if (ret && (anHyp->GetShapeType() & (1 << _subShape.ShapeType())))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // no more algo applying on subShape...
+                               {
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               case ADD_FATHER_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                       }
+                       break;
+               case ADD_FATHER_ALGO:   // detect if two algo of same dim on father
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+//    if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
+//    if (anHyp->GetShapeType() == _subShape.ShapeType())
+                       if (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // two applying algo on father
+                               {
+                                       MESSAGE("two applying algo on fatherShape...");
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               case REMOVE_FATHER_HYP:
+                       ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO);
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               ASSERT(algo);
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       SetAlgoState(HYP_OK);
+                               else
+                                       SetAlgoState(MISSING_HYP);
+                       }
+                       break;
+               case REMOVE_FATHER_ALGO:
+                       ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO);
+//    if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))
+//    if (anHyp->GetShapeType() == _subShape.ShapeType())
+                       if (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))
+                       {
+                               SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape);
+                               if (algo == NULL)       // no more applying algo on father
+                               {
+                                       SetAlgoState(NO_ALGO);
+                               }
+                               else
+                               {
+                                       ret = algo->CheckHypothesis((*_father), _subShape);
+                                       if (ret)
+                                               SetAlgoState(HYP_OK);
+                                       else
+                                               SetAlgoState(MISSING_HYP);
+                               }
+                       }
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
                }
-           }
-         break;
+               break;
+
+               // ----------------------------------------------------------------------
+
        default:
-         ASSERT(0);
-         break;
+               ASSERT(0);
+               break;
        }
-      break;
-
-      // ----------------------------------------------------------------------
-
-    default:
-      ASSERT(0);
-      break;
-    }
-  //SCRUTE(_algoState);
-  if ((_algoState != _oldAlgoState) || modifiedHyp)
-    int retc = ComputeStateEngine(MODIF_ALGO_STATE);
-  return ret;
+       //SCRUTE(_algoState);
+       if ((_algoState != _oldAlgoState) || modifiedHyp)
+               int retc = ComputeStateEngine(MODIF_ALGO_STATE);
+       return ret;
 }
 
 //=============================================================================
@@ -927,9 +1012,9 @@ bool SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis* anHyp)
 
 void SMESH_subMesh::SetAlgoState(int state)
 {
-  if (state != _oldAlgoState)
+       if (state != _oldAlgoState)
 //     int retc = ComputeStateEngine(MODIF_ALGO_STATE);
-  _algoState = state;
+               _algoState = state;
 }
 
 //=============================================================================
@@ -939,22 +1024,21 @@ void SMESH_subMesh::SetAlgoState(int state)
 //=============================================================================
 
 void SMESH_subMesh::SubMeshesAlgoStateEngine(int event,
-                                            SMESH_Hypothesis* anHyp)
-    throw (SALOME_Exception)
+       SMESH_Hypothesis * anHyp) throw(SALOME_Exception)
 {
-  //MESSAGE("SMESH_subMesh::SubMeshesAlgoStateEngine");
-  int dim = SMESH_Gen::GetShapeDim(_subShape);
-  if (dim > 1)
-    {
-      const map<int, SMESH_subMesh*>& subMeshes = DependsOn();
-      
-      map<int, SMESH_subMesh*>::const_iterator itsub;
-      for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+       //MESSAGE("SMESH_subMesh::SubMeshesAlgoStateEngine");
+       int dim = SMESH_Gen::GetShapeDim(_subShape);
+       if (dim > 1)
        {
-         SMESH_subMesh* sm = (*itsub).second;
-         sm->AlgoStateEngine(event, anHyp);
+               const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
+
+               map < int, SMESH_subMesh * >::const_iterator itsub;
+               for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+               {
+                       SMESH_subMesh *sm = (*itsub).second;
+                       sm->AlgoStateEngine(event, anHyp);
+               }
        }
-    }
 }
 
 //=============================================================================
@@ -965,34 +1049,48 @@ void SMESH_subMesh::SubMeshesAlgoStateEngine(int event,
 
 void SMESH_subMesh::DumpAlgoState(bool isMain)
 {
-  int dim = SMESH_Gen::GetShapeDim(_subShape);
+       int dim = SMESH_Gen::GetShapeDim(_subShape);
 //   if (dim < 1) return;
-  if (isMain)
-    {
-      const map<int, SMESH_subMesh*>& subMeshes = DependsOn();
-      
-      map<int, SMESH_subMesh*>::const_iterator itsub;
-      for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+       if (isMain)
        {
-         SMESH_subMesh* sm = (*itsub).second;
-         sm->DumpAlgoState(false);
-       } 
-    }
-  int type = _subShape.ShapeType();
-  MESSAGE("dim = " << dim << " type of shape " << type);
-  switch(_algoState)
-    {
-    case NO_ALGO: MESSAGE(" AlgoState = NO_ALGO"); break;
-    case MISSING_HYP: MESSAGE(" AlgoState = MISSING_HYP"); break;
-    case HYP_OK: MESSAGE(" AlgoState = HYP_OK"); break;
-    }
-  switch (_computeState)
-    {
-    case NOT_READY: MESSAGE(" ComputeState = NOT_READY"); break;
-    case READY_TO_COMPUTE: MESSAGE(" ComputeState = READY_TO_COMPUTE"); break;
-    case COMPUTE_OK: MESSAGE(" ComputeState = COMPUTE_OK"); break;
-    case FAILED_TO_COMPUTE: MESSAGE(" ComputeState = FAILED_TO_COMPUTE");break;
-    }
+               const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
+
+               map < int, SMESH_subMesh * >::const_iterator itsub;
+               for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++)
+               {
+                       SMESH_subMesh *sm = (*itsub).second;
+                       sm->DumpAlgoState(false);
+               }
+       }
+       int type = _subShape.ShapeType();
+       MESSAGE("dim = " << dim << " type of shape " << type);
+       switch (_algoState)
+       {
+       case NO_ALGO:
+               MESSAGE(" AlgoState = NO_ALGO");
+               break;
+       case MISSING_HYP:
+               MESSAGE(" AlgoState = MISSING_HYP");
+               break;
+       case HYP_OK:
+               MESSAGE(" AlgoState = HYP_OK");
+               break;
+       }
+       switch (_computeState)
+       {
+       case NOT_READY:
+               MESSAGE(" ComputeState = NOT_READY");
+               break;
+       case READY_TO_COMPUTE:
+               MESSAGE(" ComputeState = READY_TO_COMPUTE");
+               break;
+       case COMPUTE_OK:
+               MESSAGE(" ComputeState = COMPUTE_OK");
+               break;
+       case FAILED_TO_COMPUTE:
+               MESSAGE(" ComputeState = FAILED_TO_COMPUTE");
+               break;
+       }
 }
 
 //=============================================================================
@@ -1001,208 +1099,217 @@ void SMESH_subMesh::DumpAlgoState(bool isMain)
  */
 //=============================================================================
 
-bool SMESH_subMesh::ComputeStateEngine(int event)
-  throw (SALOME_Exception)
+bool SMESH_subMesh::ComputeStateEngine(int event) throw(SALOME_Exception)
 {
-  //MESSAGE("SMESH_subMesh::ComputeStateEngine");
-  //SCRUTE(_computeState);
-  //SCRUTE(event);
-
-  int dim = SMESH_Gen::GetShapeDim(_subShape);
-
-  if (dim < 1)
-    {
-      if (_vertexSet) _computeState = COMPUTE_OK;
-      else _computeState = READY_TO_COMPUTE;
-      //SCRUTE(_computeState);
-      return true;
-    }
-  SMESH_Gen* gen =_father->GetGen();
-  SMESH_Algo* algo = 0;
-  bool ret;
-
-  switch(_computeState)
-    {
-
-      // ----------------------------------------------------------------------
-
-    case NOT_READY:
-      switch (event)
+       //MESSAGE("SMESH_subMesh::ComputeStateEngine");
+       //SCRUTE(_computeState);
+       //SCRUTE(event);
+
+       int dim = SMESH_Gen::GetShapeDim(_subShape);
+
+       if (dim < 1)
        {
-       case MODIF_HYP:                // nothing to do
-         break;
-       case MODIF_ALGO_STATE:
-         if (_algoState == HYP_OK)
-           _computeState = READY_TO_COMPUTE;
-         break;
-       case COMPUTE:                  // nothing to do
-         break;
-       case CLEAN:                    // nothing to do
-         break;
-       case CLEANDEP:                 // nothing to do
-         RemoveSubMeshElementsAndNodes(); // recursive call...
-         break;
-       case SUBMESH_COMPUTED:         // nothing to do
-         break;
-       default:
-         ASSERT(0);
-         break;
+               if (_vertexSet)
+                       _computeState = COMPUTE_OK;
+               else
+                       _computeState = READY_TO_COMPUTE;
+               //SCRUTE(_computeState);
+               return true;
        }
-      break;
+       SMESH_Gen *gen = _father->GetGen();
+       SMESH_Algo *algo = 0;
+       bool ret;
 
-      // ----------------------------------------------------------------------
-
-    case READY_TO_COMPUTE:
-      switch (event)
+       switch (_computeState)
        {
-       case MODIF_HYP:                // nothing to do
-         break;
-       case MODIF_ALGO_STATE:
-         _computeState = NOT_READY;
-         algo = gen->GetAlgo((*_father), _subShape);
-         if (algo)
-           {
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) _computeState = READY_TO_COMPUTE;
-           }
-         break;
-       case COMPUTE:
-         {
-           algo = gen->GetAlgo((*_father), _subShape);
-           ASSERT(algo);
-           ret = algo->CheckHypothesis((*_father),_subShape);
-           if (! ret)
-             {
-               MESSAGE("***** verify compute state *****");
-               _computeState = NOT_READY;
-               break;
-             }
-           ret = SubMeshesComputed();
-           if (!ret)
-             {
-               MESSAGE("Some SubMeshes not computed");
-               _computeState = FAILED_TO_COMPUTE;
+
+               // ----------------------------------------------------------------------
+
+       case NOT_READY:
+               switch (event)
+               {
+               case MODIF_HYP:         // nothing to do
+                       break;
+               case MODIF_ALGO_STATE:
+                       if (_algoState == HYP_OK)
+                               _computeState = READY_TO_COMPUTE;
+                       break;
+               case COMPUTE:                   // nothing to do
+                       break;
+               case CLEAN:                     // nothing to do
+                       break;
+               case CLEANDEP:                  // nothing to do
+                       RemoveSubMeshElementsAndNodes();        // recursive call...
+                       break;
+               case SUBMESH_COMPUTED:  // nothing to do
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
+               }
                break;
-             }
-           ret = algo->Compute((*_father),_subShape);
-           if (!ret)
-             {
-               MESSAGE("problem in algo execution: failed to compute");
-               _computeState = FAILED_TO_COMPUTE;
+
+               // ----------------------------------------------------------------------
+
+       case READY_TO_COMPUTE:
+               switch (event)
+               {
+               case MODIF_HYP:         // nothing to do
+                       break;
+               case MODIF_ALGO_STATE:
+                       _computeState = NOT_READY;
+                       algo = gen->GetAlgo((*_father), _subShape);
+                       if (algo)
+                       {
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       _computeState = READY_TO_COMPUTE;
+                       }
+                       break;
+               case COMPUTE:
+               {
+                       algo = gen->GetAlgo((*_father), _subShape);
+                       ASSERT(algo);
+                       ret = algo->CheckHypothesis((*_father), _subShape);
+                       if (!ret)
+                       {
+                               MESSAGE("***** verify compute state *****");
+                               _computeState = NOT_READY;
+                               break;
+                       }
+                       ret = SubMeshesComputed();
+                       if (!ret)
+                       {
+                               MESSAGE("Some SubMeshes not computed");
+                               _computeState = FAILED_TO_COMPUTE;
+                               break;
+                       }
+                       ret = algo->Compute((*_father), _subShape);
+                       if (!ret)
+                       {
+                               MESSAGE("problem in algo execution: failed to compute");
+                               _computeState = FAILED_TO_COMPUTE;
+                               break;
+                       }
+                       else
+                       {
+                               _computeState = COMPUTE_OK;
+                               UpdateDependantsState();        // send event SUBMESH_COMPUTED
+                       }
+               }
+                       break;
+               case CLEAN:
+                       _computeState = NOT_READY;
+                       algo = gen->GetAlgo((*_father), _subShape);
+                       if (algo)
+                       {
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       _computeState = READY_TO_COMPUTE;
+                       }
+                       break;
+               case CLEANDEP:
+                       RemoveSubMeshElementsAndNodes();
+                       _computeState = NOT_READY;
+                       algo = gen->GetAlgo((*_father), _subShape);
+                       if (algo)
+                       {
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       _computeState = READY_TO_COMPUTE;
+                       }
+                       break;
+               case SUBMESH_COMPUTED:  // nothing to do
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
+               }
                break;
-             }
-           else
-             {
-               _computeState = COMPUTE_OK;
-               UpdateDependantsState(); // send event SUBMESH_COMPUTED
-             }
-         }
-         break;
-       case CLEAN:
-         _computeState = NOT_READY;
-         algo = gen->GetAlgo((*_father), _subShape);
-         if (algo)
-           {
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) _computeState = READY_TO_COMPUTE;
-           }
-         break;
-       case CLEANDEP:
-         RemoveSubMeshElementsAndNodes();
-         _computeState = NOT_READY;
-         algo = gen->GetAlgo((*_father), _subShape);
-         if (algo)
-           {
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) _computeState = READY_TO_COMPUTE;
-           }
-         break;
-       case SUBMESH_COMPUTED:         // nothing to do
-         break;
-       default:
-         ASSERT(0);
-         break;
-       }
-      break;
 
-      // ----------------------------------------------------------------------
+               // ----------------------------------------------------------------------
 
-    case COMPUTE_OK:
-      switch (event)
-       {
-       case MODIF_HYP:
-         CleanDependants();           // recursive recall with event CLEANDEP
-         break;
-       case MODIF_ALGO_STATE:
-         CleanDependants();           // recursive recall with event CLEANDEP
-         break;
-       case COMPUTE:                  // nothing to do
-         break;
-       case CLEAN:
-         CleanDependants();           // recursive recall with event CLEANDEP
-         break;
-       case CLEANDEP:
-         RemoveSubMeshElementsAndNodes();
-         _computeState = NOT_READY;
-         algo = gen->GetAlgo((*_father), _subShape);
-         if (algo)
-           {
-             ret = algo->CheckHypothesis((*_father),_subShape);
-             if (ret) _computeState = READY_TO_COMPUTE;
-           }
-         break;
-       case SUBMESH_COMPUTED:         // nothing to do
-         break;
-       default:
-         ASSERT(0);
-         break;
-       }
-      break;
+       case COMPUTE_OK:
+               switch (event)
+               {
+               case MODIF_HYP:
+                       CleanDependants();      // recursive recall with event CLEANDEP
+                       break;
+               case MODIF_ALGO_STATE:
+                       CleanDependants();      // recursive recall with event CLEANDEP
+                       break;
+               case COMPUTE:                   // nothing to do
+                       break;
+               case CLEAN:
+                       CleanDependants();      // recursive recall with event CLEANDEP
+                       break;
+               case CLEANDEP:
+                       RemoveSubMeshElementsAndNodes();
+                       _computeState = NOT_READY;
+                       algo = gen->GetAlgo((*_father), _subShape);
+                       if (algo)
+                       {
+                               ret = algo->CheckHypothesis((*_father), _subShape);
+                               if (ret)
+                                       _computeState = READY_TO_COMPUTE;
+                       }
+                       break;
+               case SUBMESH_COMPUTED:  // nothing to do
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
+               }
+               break;
 
-      // ----------------------------------------------------------------------
+               // ----------------------------------------------------------------------
 
-    case FAILED_TO_COMPUTE:
-      switch (event)
-       {
-       case MODIF_HYP:
-         if (_algoState == HYP_OK)
-           _computeState = READY_TO_COMPUTE;
-         else _computeState = NOT_READY;
-         break;
-       case MODIF_ALGO_STATE:
-         if (_algoState == HYP_OK)
-           _computeState = READY_TO_COMPUTE;
-         else _computeState = NOT_READY;
-         break;
-       case COMPUTE:                  // nothing to do
-         break;
-       case CLEAN:
-         break;
-       case CLEANDEP:
-         RemoveSubMeshElementsAndNodes();
-         if (_algoState == HYP_OK)
-           _computeState = READY_TO_COMPUTE;
-         else _computeState = NOT_READY;
-         break;
-       case SUBMESH_COMPUTED:         // allow retry compute
-         if (_algoState == HYP_OK)
-           _computeState = READY_TO_COMPUTE;
-         else _computeState = NOT_READY;
-         break;
+       case FAILED_TO_COMPUTE:
+               switch (event)
+               {
+               case MODIF_HYP:
+                       if (_algoState == HYP_OK)
+                               _computeState = READY_TO_COMPUTE;
+                       else
+                               _computeState = NOT_READY;
+                       break;
+               case MODIF_ALGO_STATE:
+                       if (_algoState == HYP_OK)
+                               _computeState = READY_TO_COMPUTE;
+                       else
+                               _computeState = NOT_READY;
+                       break;
+               case COMPUTE:                   // nothing to do
+                       break;
+               case CLEAN:
+                       break;
+               case CLEANDEP:
+                       RemoveSubMeshElementsAndNodes();
+                       if (_algoState == HYP_OK)
+                               _computeState = READY_TO_COMPUTE;
+                       else
+                               _computeState = NOT_READY;
+                       break;
+               case SUBMESH_COMPUTED:  // allow retry compute
+                       if (_algoState == HYP_OK)
+                               _computeState = READY_TO_COMPUTE;
+                       else
+                               _computeState = NOT_READY;
+                       break;
+               default:
+                       ASSERT(0);
+                       break;
+               }
+               break;
+
+               // ----------------------------------------------------------------------
        default:
-         ASSERT(0);
-         break;
+               ASSERT(0);
+               break;
        }
-      break;
-
-      // ----------------------------------------------------------------------
-    default:
-      ASSERT(0);
-      break;
-    }
 
-  //SCRUTE(_computeState);
-  return ret;
+       //SCRUTE(_computeState);
+       return ret;
 }
 
 //=============================================================================
@@ -1213,16 +1320,16 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
 
 void SMESH_subMesh::UpdateDependantsState()
 {
-  //MESSAGE("SMESH_subMesh::UpdateDependantsState");
-
-  const map<int, SMESH_subMesh*>& dependants = Dependants();
-  map<int, SMESH_subMesh*>::const_iterator its;
-  for (its = dependants.begin(); its != dependants.end(); its++)
-    {
-      SMESH_subMesh* sm = (*its).second;
-      //SCRUTE((*its).first);
-      sm->ComputeStateEngine(SUBMESH_COMPUTED);
-    }
+       //MESSAGE("SMESH_subMesh::UpdateDependantsState");
+
+       const map < int, SMESH_subMesh * >&dependants = Dependants();
+       map < int, SMESH_subMesh * >::const_iterator its;
+       for (its = dependants.begin(); its != dependants.end(); its++)
+       {
+               SMESH_subMesh *sm = (*its).second;
+               //SCRUTE((*its).first);
+               sm->ComputeStateEngine(SUBMESH_COMPUTED);
+       }
 }
 
 //=============================================================================
@@ -1233,19 +1340,20 @@ void SMESH_subMesh::UpdateDependantsState()
 
 void SMESH_subMesh::CleanDependants()
 {
-  MESSAGE("SMESH_subMesh::CleanDependants");
-  // **** parcourir les ancetres dans l'ordre de dépendance
-
-  const map<int, SMESH_subMesh*>& dependants = Dependants();
-  map<int, SMESH_subMesh*>::const_iterator its;
-  for (its = dependants.begin(); its != dependants.end(); its++)
-    {
-      SMESH_subMesh* sm = (*its).second;
-      SCRUTE((*its).first);
-      sm->ComputeStateEngine(CLEANDEP);
-    }
-  ComputeStateEngine(CLEANDEP);
+       MESSAGE("SMESH_subMesh::CleanDependants");
+       // **** parcourir les ancetres dans l'ordre de dépendance
+
+       const map < int, SMESH_subMesh * >&dependants = Dependants();
+       map < int, SMESH_subMesh * >::const_iterator its;
+       for (its = dependants.begin(); its != dependants.end(); its++)
+       {
+               SMESH_subMesh *sm = (*its).second;
+               SCRUTE((*its).first);
+               sm->ComputeStateEngine(CLEANDEP);
+       }
+       ComputeStateEngine(CLEANDEP);
 }
+
 //=============================================================================
 /*!
  * 
@@ -1254,38 +1362,31 @@ void SMESH_subMesh::CleanDependants()
 
 void SMESH_subMesh::RemoveSubMeshElementsAndNodes()
 {
-  MESSAGE("SMESH_subMesh::RemoveSubMeshElementsAndNodes");
-  SCRUTE(_subShape.ShapeType());
-  SCRUTE(_Id);
-
-  _subMeshDS =  _meshDS->MeshElements(_subShape);
-  if (!_subMeshDS.IsNull())
-    {
-      const TColStd_ListOfInteger& indElt
-       = _subMeshDS->GetIDElements();
-      TColStd_ListIteratorOfListOfInteger ite(indElt);
-      for (; ite.More(); ite.Next())
-       {
-         int eltId = ite.Value();
-         SCRUTE(eltId);
-         Handle (SMDS_MeshElement) elt = _meshDS->FindElement(eltId);
-         _subMeshDS->RemoveElement(elt);
-         _meshDS->RemoveElement(eltId);
-       }
-  
-      const TColStd_ListOfInteger& indNodes
-       = _subMeshDS->GetIDNodes();
-      TColStd_ListIteratorOfListOfInteger itn(indNodes);
-      for (; itn.More(); itn.Next())
+       MESSAGE("SMESH_subMesh::RemoveSubMeshElementsAndNodes");
+       SCRUTE(_subShape.ShapeType());
+       SCRUTE(_Id);
+
+       _subMeshDS = _meshDS->MeshElements(_subShape);
+       if (_subMeshDS!=NULL)
        {
-         int nodeId = itn.Value();
-         SCRUTE(nodeId);
-         Handle (SMDS_MeshElement) elt = _meshDS->FindNode(nodeId);
-         Handle (SMDS_MeshNode) node = _meshDS->GetNode(1, elt);
-         _subMeshDS->RemoveNode(node);
-         _meshDS->RemoveNode(nodeId);
+               SMDS_Iterator<const SMDS_MeshElement *> * ite=_subMeshDS->GetElements();
+               while(ite->more())
+               {
+                       const SMDS_MeshElement * elt = ite->next();
+                       _subMeshDS->RemoveElement(elt);
+                       _meshDS->RemoveElement(elt);
+               }
+               delete ite;
+               
+               SMDS_Iterator<const SMDS_MeshNode *> * itn=_subMeshDS->GetNodes();
+               while(itn->more())
+               {
+                       const SMDS_MeshNode * node = itn->next();
+                       _subMeshDS->RemoveNode(node);
+                       _meshDS->RemoveNode(node);
+               }
+               delete itn;
        }
-    }
 }
 
 //=============================================================================
@@ -1294,48 +1395,52 @@ void SMESH_subMesh::RemoveSubMeshElementsAndNodes()
  */
 //=============================================================================
 
-const map<int, SMESH_subMesh*>& SMESH_subMesh::Dependants()
+const map < int, SMESH_subMesh * >&SMESH_subMesh::Dependants()
 {
-  if (_dependantsFound) return _mapDependants;
-
-  //MESSAGE("SMESH_subMesh::Dependants");
-
-  int shapeType = _subShape.ShapeType();
-  //SCRUTE(shapeType);
-  TopTools_IndexedDataMapOfShapeListOfShape M;
-  TopoDS_Shape mainShape = _meshDS->ShapeToMesh();
-
-  switch (shapeType)
-    {
-    case TopAbs_VERTEX:
-      break;
-    case TopAbs_EDGE:
-    case TopAbs_WIRE:
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_WIRE, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_FACE, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SHELL, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SOLID, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_COMPSOLID, M);
-      ExtractDependants(M, TopAbs_EDGE);
-      break;
-    case TopAbs_FACE:
-    case TopAbs_SHELL:
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SHELL, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SOLID, M);
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_COMPSOLID, M);
-      ExtractDependants(M, TopAbs_FACE);
-      break;
-    case TopAbs_SOLID:
-    case TopAbs_COMPSOLID:
-      TopExp::MapShapesAndAncestors(mainShape, TopAbs_SOLID, TopAbs_COMPSOLID, M);
-      ExtractDependants(M, TopAbs_SOLID);
-      break;
-     case TopAbs_COMPOUND:
-      break;
-   }
-
-  _dependantsFound = true;
-  return _mapDependants;
+       if (_dependantsFound)
+               return _mapDependants;
+
+       //MESSAGE("SMESH_subMesh::Dependants");
+
+       int shapeType = _subShape.ShapeType();
+       //SCRUTE(shapeType);
+       TopTools_IndexedDataMapOfShapeListOfShape M;
+       TopoDS_Shape mainShape = _meshDS->ShapeToMesh();
+
+       switch (shapeType)
+       {
+       case TopAbs_VERTEX:
+               break;
+       case TopAbs_EDGE:
+       case TopAbs_WIRE:
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_WIRE, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_FACE, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SHELL, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SOLID, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_COMPSOLID,
+                       M);
+               ExtractDependants(M, TopAbs_EDGE);
+               break;
+       case TopAbs_FACE:
+       case TopAbs_SHELL:
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SHELL, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SOLID, M);
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_COMPSOLID,
+                       M);
+               ExtractDependants(M, TopAbs_FACE);
+               break;
+       case TopAbs_SOLID:
+       case TopAbs_COMPSOLID:
+               TopExp::MapShapesAndAncestors(mainShape, TopAbs_SOLID, TopAbs_COMPSOLID,
+                       M);
+               ExtractDependants(M, TopAbs_SOLID);
+               break;
+       case TopAbs_COMPOUND:
+               break;
+       }
+
+       _dependantsFound = true;
+       return _mapDependants;
 }
 
 //=============================================================================
@@ -1344,72 +1449,74 @@ const map<int, SMESH_subMesh*>& SMESH_subMesh::Dependants()
  */
 //=============================================================================
 
-void SMESH_subMesh::ExtractDependants(const TopTools_IndexedDataMapOfShapeListOfShape& M,
-                                     const TopAbs_ShapeEnum etype)
+void SMESH_subMesh::
+ExtractDependants(const TopTools_IndexedDataMapOfShapeListOfShape & M,
+       const TopAbs_ShapeEnum etype)
 {
-  //MESSAGE("SMESH_subMesh::ExtractDependants");
-
-  TopoDS_Shape mainShape = _meshDS->ShapeToMesh();
-  int lg = M.Extent();
-  //SCRUTE(lg);
-
-  int shapeType = _subShape.ShapeType();
-  switch (shapeType)
-    {
-    case TopAbs_VERTEX:
-      break;
-    case TopAbs_EDGE:
-    case TopAbs_FACE:
-    case TopAbs_SOLID:
-      {
-       const TopTools_ListOfShape& ancestors = M.FindFromKey(_subShape);
-       TopTools_ListIteratorOfListOfShape it(ancestors);
-       for ( ; it.More();it.Next())
-         {
-           TopoDS_Shape ancestor = it.Value();
-           SMESH_subMesh* aSubMesh = _father->GetSubMeshContaining(ancestor);
-           //      if (! aSubMesh) aSubMesh = _father->GetSubMesh(ancestor);
-           if (aSubMesh)
-             {
-               int type = aSubMesh->_subShape.ShapeType();
-               int cle = aSubMesh->GetId();
-               cle += 10000000 * type; // sort map by ordType then index
-               if (_mapDependants.find(cle) == _mapDependants.end())
-                 {
-                   _mapDependants[cle] = aSubMesh;
-                   //SCRUTE(cle);
-                 }
-             } 
-         }
-      }
-      break;
-    case TopAbs_WIRE:
-    case TopAbs_SHELL:
-    case TopAbs_COMPSOLID:
-      for (TopExp_Explorer expE(_subShape, etype); expE.More(); expE.Next())
+       //MESSAGE("SMESH_subMesh::ExtractDependants");
+
+       TopoDS_Shape mainShape = _meshDS->ShapeToMesh();
+       int lg = M.Extent();
+       //SCRUTE(lg);
+
+       int shapeType = _subShape.ShapeType();
+       switch (shapeType)
+       {
+       case TopAbs_VERTEX:
+               break;
+       case TopAbs_EDGE:
+       case TopAbs_FACE:
+       case TopAbs_SOLID:
        {
-         TopoDS_Shape aShape = expE.Current();
-         const TopTools_ListOfShape& ancestors = M.FindFromKey( aShape);
-         TopTools_ListIteratorOfListOfShape it(ancestors);
-         for ( ; it.More();it.Next())
-           {
-             MESSAGE("---");
-             TopoDS_Shape ancestor = it.Value();
-             SMESH_subMesh* aSubMesh = _father->GetSubMeshContaining(ancestor);
-             if (! aSubMesh) aSubMesh = _father->GetSubMesh(ancestor);
-             int type = aSubMesh->_subShape.ShapeType();
-             int cle = aSubMesh->GetId();
-             cle += 10000000 * type; // sort map by ordType then index
-             if (_mapDependants.find(cle) == _mapDependants.end())
+               const TopTools_ListOfShape & ancestors = M.FindFromKey(_subShape);
+               TopTools_ListIteratorOfListOfShape it(ancestors);
+               for (; it.More(); it.Next())
+               {
+                       TopoDS_Shape ancestor = it.Value();
+                       SMESH_subMesh *aSubMesh = _father->GetSubMeshContaining(ancestor);
+                       //      if (! aSubMesh) aSubMesh = _father->GetSubMesh(ancestor);
+                       if (aSubMesh)
+                       {
+                               int type = aSubMesh->_subShape.ShapeType();
+                               int cle = aSubMesh->GetId();
+                               cle += 10000000 * type; // sort map by ordType then index
+                               if (_mapDependants.find(cle) == _mapDependants.end())
+                               {
+                                       _mapDependants[cle] = aSubMesh;
+                                       //SCRUTE(cle);
+                               }
+                       }
+               }
+       }
+               break;
+       case TopAbs_WIRE:
+       case TopAbs_SHELL:
+       case TopAbs_COMPSOLID:
+               for (TopExp_Explorer expE(_subShape, etype); expE.More(); expE.Next())
                {
-                 _mapDependants[cle] = aSubMesh;
-                 SCRUTE(cle);
+                       TopoDS_Shape aShape = expE.Current();
+                       const TopTools_ListOfShape & ancestors = M.FindFromKey(aShape);
+                       TopTools_ListIteratorOfListOfShape it(ancestors);
+                       for (; it.More(); it.Next())
+                       {
+                               MESSAGE("---");
+                               TopoDS_Shape ancestor = it.Value();
+                               SMESH_subMesh *aSubMesh =
+                                       _father->GetSubMeshContaining(ancestor);
+                               if (!aSubMesh)
+                                       aSubMesh = _father->GetSubMesh(ancestor);
+                               int type = aSubMesh->_subShape.ShapeType();
+                               int cle = aSubMesh->GetId();
+                               cle += 10000000 * type; // sort map by ordType then index
+                               if (_mapDependants.find(cle) == _mapDependants.end())
+                               {
+                                       _mapDependants[cle] = aSubMesh;
+                                       SCRUTE(cle);
+                               }
+                       }
                }
-           }   
-       } 
-      break;
-     case TopAbs_COMPOUND:
-      break;
-   }
+               break;
+       case TopAbs_COMPOUND:
+               break;
+       }
 }
-