Salome HOME
Merge branch 'master' into gni/adaptation
[modules/smesh.git] / src / StdMeshers / StdMeshers_RadialQuadrangle_1D2D.cxx
index 8c5869107d5e0cc5859628bd117bbc22ae3b71bf..4ecfb7dd8576fcf1464a111058c00570f0c3f0e8 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -164,9 +164,9 @@ namespace
       return &theEdgeMarker;
     }
     //! Clear edge sumbesh if something happens on face
-    void ProcessEvent(const int          event,
+    void ProcessEvent(const int          /*event*/,
                       const int          eventType,
-                      SMESH_subMesh*     faceSubMesh,
+                      SMESH_subMesh*     /*faceSubMesh*/,
                       EventListenerData* edgesHolder,
                       const SMESH_Hypothesis*  /*hyp*/)
     {
@@ -226,12 +226,19 @@ namespace
     if ( nbWire > 2 || nbEdgesInWire.front() < 1 ) return 0;
 
     // remove degenerated EDGEs
+    TopTools_MapOfShape degenVV;
     list<TopoDS_Edge>::iterator edge = edges.begin();
     while ( edge != edges.end() )
       if ( SMESH_Algo::isDegenerated( *edge ))
+      {
+        degenVV.Add( SMESH_MesherHelper::IthVertex( 0, *edge ));
+        degenVV.Add( SMESH_MesherHelper::IthVertex( 1, *edge ));
         edge = edges.erase( edge );
+      }
       else
+      {
         ++edge;
+      }
     int nbEdges = edges.size();
 
     // find VERTEXes between continues EDGEs
@@ -327,9 +334,25 @@ namespace
       double len1 = (++l2i)->first;
       double len2 = (++l2i)->first;
       if ( len1 - len0 > len2 - len1 )
-        deviation2sideInd.insert( make_pair( 0., len2sideInd.begin()->second ));
+        deviation2sideInd.insert( std::make_pair( 0., len2sideInd.begin()->second ));
       else
-        deviation2sideInd.insert( make_pair( 0., len2sideInd.rbegin()->second ));
+        deviation2sideInd.insert( std::make_pair( 0., len2sideInd.rbegin()->second ));
+    }
+
+    double minDevi = deviation2sideInd.begin()->first;
+    int   iMinCurv = deviation2sideInd.begin()->second;
+    if ( sides.size() == 3 && degenVV.Size() == 1 &&
+         minDevi / sides[ iMinCurv ]->Length() > 1e-3 )
+    {
+      // a triangle with curved sides and a degenerated EDGE (IPAL54585);
+      // use a side opposite to the degenerated EDGE as an elliptic one
+      for ( size_t iS = 0; iS < sides.size(); ++iS )
+        if ( degenVV.Contains( sides[ iS ]->FirstVertex() ))
+        {
+          deviation2sideInd.clear();
+          deviation2sideInd.insert( std::make_pair( 0.,( iS + 1 ) % sides.size() ));
+          break;
+        }
     }
 
     int iCirc = deviation2sideInd.rbegin()->second; 
@@ -379,9 +402,9 @@ namespace
    */
   //================================================================================
 
-  bool isCornerInsideCircle(const StdMeshers_FaceSidePtr& CircSide,
-                            const StdMeshers_FaceSidePtr& LinSide1,
-                            const StdMeshers_FaceSidePtr& LinSide2)
+  bool isCornerInsideCircle(const StdMeshers_FaceSidePtr& /*CircSide*/,
+                            const StdMeshers_FaceSidePtr& /*LinSide1*/,
+                            const StdMeshers_FaceSidePtr& /*LinSide2*/)
   {
     // if ( CircSide && LinSide1 && LinSide2 )
     // {
@@ -416,7 +439,7 @@ namespace
   {
     // find the center and a point most distant from it
 
-    double maxDist = 0, normPar;
+    double maxDist = 0, normPar = 0;
     gp_XY uv1, uv2;
     for ( int i = 0; i < 32; ++i )
     {
@@ -758,11 +781,23 @@ protected:
 void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMesh)
 {
   if ( !faceSubMesh->IsEmpty() )
+    SetEventListener( faceSubMesh );
+}
+
+//=======================================================================
+/*!
+ * \brief Sets event listener to a submesh
+ * \param subMesh - submesh where algo is set
+ *
+ * This method is called when a submesh gets HYP_OK algo_state.
+ */
+//=======================================================================
+
+void StdMeshers_RadialQuadrangle_1D2D::SetEventListener(SMESH_subMesh* faceSubMesh)
+{
+  for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
   {
-    for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
-    {
-      TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh );
-    }
+    TEdgeMarker::markEdge( TopoDS::Edge( e.Current() ), faceSubMesh );
   }
 }
 
@@ -982,6 +1017,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
   quad->side[1] = linSide1;
   quad->side[2] = StdMeshers_FaceSide::New( circSide.get(), centerNode, &centerUV );
   quad->side[3] = linSide2;
+  quad->face    = F;
 
   myQuadList.push_back( quad );
 
@@ -992,6 +1028,12 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
   else
     ok = StdMeshers_Quadrangle_2D::computeTriangles( aMesh, F, quad );
 
+  if ( helper.HasDegeneratedEdges() )
+  {
+    StdMeshers_Quadrangle_2D::myNeedSmooth = true;
+    StdMeshers_Quadrangle_2D::smooth( quad );
+  }
+
   StdMeshers_Quadrangle_2D::myHelper = 0;
 
   return ok;
@@ -1237,4 +1279,4 @@ bool StdMeshers_RadialQuadrangle_1D2D::IsApplicable( const TopoDS_Shape & aShape
   }
   if( toCheckAll && nbFoundFaces != 0 ) return true;
   return false;
-};
+}