Salome HOME
#16648 [CEA] RadialQuadrangle algorithm hypothesis change requires a Clear Mesh Data...
[modules/smesh.git] / src / SMESH / SMESH_Algo.cxx
index c4fbb42cfe3a73b423ebda23500bf2a467e04058..4de1879f1c231c776c864765bf238f28eebaab66 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -20,7 +20,7 @@
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-//  SMESH SMESH : implementaion of SMESH idl descriptions
+//  SMESH SMESH : implementation of SMESH idl descriptions
 //  File   : SMESH_Algo.cxx
 //  Author : Paul RASCLE, EDF
 //  Module : SMESH
@@ -42,8 +42,6 @@
 #include "SMESH_TypeDefs.hxx"
 #include "SMESH_subMesh.hxx"
 
-#include <Basics_OCCTVersion.hxx>
-
 #include <BRepAdaptor_Curve.hxx>
 #include <BRepLProp.hxx>
 #include <BRep_Tool.hxx>
@@ -87,7 +85,7 @@ using namespace std;
 bool SMESH_Algo::Features::IsCompatible( const SMESH_Algo::Features& algo2 ) const
 {
   if ( _dim > algo2._dim ) return algo2.IsCompatible( *this );
-  // algo2 is of highter dimension
+  // algo2 is of higher dimension
   if ( _outElemTypes.empty() || algo2._inElemTypes.empty() )
     return false;
   bool compatible = true;
@@ -265,6 +263,10 @@ SMESH_Algo::GetUsedHypothesis(SMESH_Mesh &         aMesh,
                               const bool           ignoreAuxiliary) const
 {
   SMESH_Algo* me = const_cast< SMESH_Algo* >( this );
+
+  std::list<const SMESHDS_Hypothesis *> savedHyps; // don't delete the list if 
+  savedHyps.swap( me->_usedHypList );              // it does not change (#16578)
+
   me->_usedHypList.clear();
   if ( const SMESH_HypoFilter* filter = GetCompatibleHypoFilter( ignoreAuxiliary ))
   {
@@ -272,6 +274,9 @@ SMESH_Algo::GetUsedHypothesis(SMESH_Mesh &         aMesh,
     if ( ignoreAuxiliary && _usedHypList.size() > 1 )
       me->_usedHypList.clear(); //only one compatible hypothesis allowed
   }
+  if ( _usedHypList == savedHyps )
+    savedHyps.swap( me->_usedHypList );
+
   return _usedHypList;
 }
 
@@ -289,10 +294,17 @@ SMESH_Algo::GetAppliedHypothesis(SMESH_Mesh &         aMesh,
                                  const bool           ignoreAuxiliary) const
 {
   SMESH_Algo* me = const_cast< SMESH_Algo* >( this );
+
+  std::list<const SMESHDS_Hypothesis *> savedHyps; // don't delete the list if 
+  savedHyps.swap( me->_appliedHypList );           // it does not change (#16578)
+
   me->_appliedHypList.clear();
   if ( const SMESH_HypoFilter* filter = GetCompatibleHypoFilter( ignoreAuxiliary ))
     aMesh.GetHypotheses( aShape, *filter, me->_appliedHypList, false );
 
+  if ( _appliedHypList == savedHyps )
+    savedHyps.swap( me->_appliedHypList );
+
   return _appliedHypList;
 }
 
@@ -360,12 +372,9 @@ bool SMESH_Algo::GetNodeParamOnEdge(const SMESHDS_Mesh* theMesh,
     SMDS_NodeIteratorPtr nIt = eSubMesh->GetNodes();
     while ( nIt->more() )
     {
-      const SMDS_MeshNode* node = nIt->next();
-      const SMDS_PositionPtr& pos = node->GetPosition();
-      if ( pos->GetTypeOfPosition() != SMDS_TOP_EDGE )
+      SMDS_EdgePositionPtr epos = nIt->next()->GetPosition();
+      if ( !epos )
         return false;
-      const SMDS_EdgePosition* epos =
-        static_cast<const SMDS_EdgePosition*>(node->GetPosition());
       if ( !paramSet.insert( epos->GetUParameter() ).second )
         return false; // equal parameters
     }
@@ -426,11 +435,9 @@ bool SMESH_Algo::GetSortedNodesOnEdge(const SMESHDS_Mesh*                   theM
       const SMDS_MeshNode* node = nIt->next();
       if ( ignoreMediumNodes && SMESH_MesherHelper::IsMedium( node, typeToCheck ))
         continue;
-      const SMDS_PositionPtr& pos = node->GetPosition();
-      if ( pos->GetTypeOfPosition() != SMDS_TOP_EDGE )
+      SMDS_EdgePositionPtr epos = node->GetPosition();
+      if ( ! epos )
         return false;
-      const SMDS_EdgePosition* epos =
-        static_cast<const SMDS_EdgePosition*>(node->GetPosition());
       theNodes.insert( theNodes.end(), make_pair( epos->GetUParameter(), node ));
       ++nbNodes;
     }
@@ -758,7 +765,7 @@ SMESH_Algo::EMeshError SMESH_Algo::GetMeshError(SMESH_subMesh* subMesh)
     if ( !fIt->more() )
       return MEr_EMPTY;
 
-    // We check that only links on EDGEs encouter once, the rest links, twice
+    // We check that only links on EDGEs encounter once, the rest links, twice
     set< SMESH_TLink > links;
     while ( fIt->more() )
     {
@@ -916,7 +923,12 @@ bool SMESH_Algo::error(SMESH_ComputeErrorPtr error)
   if ( error ) {
     _error   = error->myName;
     _comment = error->myComment;
-    _badInputElements = error->myBadElements;
+    if ( error->HasBadElems() )
+    {
+      SMESH_BadInputElements* badElems = static_cast<SMESH_BadInputElements*>( error.get() );
+      _badInputElements = badElems->GetElements();
+      _mesh             = badElems->GetMesh();
+    }
     return error->IsOK();
   }
   return true;
@@ -930,11 +942,15 @@ bool SMESH_Algo::error(SMESH_ComputeErrorPtr error)
 
 SMESH_ComputeErrorPtr SMESH_Algo::GetComputeError() const
 {
-  SMESH_ComputeErrorPtr err = SMESH_ComputeError::New( _error, _comment, this );
-  // hope this method is called by only SMESH_subMesh after this->Compute()
-  err->myBadElements.splice( err->myBadElements.end(),
-                             (list<const SMDS_MeshElement*>&) _badInputElements );
-  return err;
+  if ( !_badInputElements.empty() && _mesh )
+  {
+    SMESH_BadInputElements* err = new SMESH_BadInputElements( _mesh, _error, _comment, this );
+    // hope this method is called by only SMESH_subMesh after this->Compute()
+    err->myBadElements.splice( err->myBadElements.end(),
+                               (list<const SMDS_MeshElement*>&) _badInputElements );
+    return SMESH_ComputeErrorPtr( err );
+  }
+  return SMESH_ComputeError::New( _error, _comment, this );
 }
 
 //================================================================================
@@ -952,6 +968,7 @@ void SMESH_Algo::InitComputeError()
     if ( (*elem)->GetID() < 1 )
       delete *elem;
   _badInputElements.clear();
+  _mesh = 0;
 
   _computeCanceled = false;
   _progressTic     = 0;
@@ -1245,7 +1262,7 @@ bool SMESH_2D_Algo::FixInternalNodes(const SMESH_ProxyMesh& mesh,
       gp_Pnt p = S->Value( uv.Coord(1), uv.Coord(2));
       const SMDS_MeshNode* n = nodeRows[iRow][iCol];
       meshDS->MoveNode( n, p.X(), p.Y(), p.Z() );
-      if ( SMDS_FacePosition* pos = dynamic_cast< SMDS_FacePosition*>( n->GetPosition() ))
+      if ( SMDS_FacePositionPtr pos = n->GetPosition() )
         pos->SetParameters( uv.Coord(1), uv.Coord(2) );
     }
   }