Salome HOME
23315: [CEA 1929] Too much memory used to display a mesh in shading and wireframe
[modules/smesh.git] / src / StdMeshers / StdMeshers_RadialQuadrangle_1D2D.cxx
index 4f2329d5932db1ad5f770be021cdb6c6a5a6898f..ec3c297fcf8fe37280da30f10d2dc3f877e9592a 100644 (file)
@@ -306,6 +306,24 @@ namespace
       }
       deviation2sideInd.insert( make_pair( devia, iS ));
     }
+    double maxDevi = deviation2sideInd.rbegin()->first;
+    if ( maxDevi < 1e-7 && sides.size() == 3 )
+    {
+      // a triangle FACE; use a side with the most outstanding length as an elliptic one
+      deviation2sideInd.clear();
+      multimap< double, int > len2sideInd;
+      for ( size_t iS = 0; iS < sides.size(); ++iS )
+        len2sideInd.insert( make_pair( sides[iS]->Length(), iS ));
+
+      multimap< double, int >::iterator l2i = len2sideInd.begin();
+      double len0 = l2i->first;
+      double len1 = (++l2i)->first;
+      double len2 = (++l2i)->first;
+      if ( len1 - len0 > len2 - len1 )
+        deviation2sideInd.insert( make_pair( 0., len2sideInd.begin()->second ));
+      else
+        deviation2sideInd.insert( make_pair( 0., len2sideInd.rbegin()->second ));
+    }
 
     int iCirc = deviation2sideInd.rbegin()->second; 
     aCircSide = sides[ iCirc ];
@@ -582,7 +600,7 @@ namespace
     {
       if ( meshDS->FindEdge( nodes[i].node, nodes[i-1].node )) continue;
 
-      const SMDS_MeshElement* seg = meshDS->AddEdge( nodes[i].node, nodes[i-1].node );
+      const SMDS_MeshElement* seg = helper->AddEdge( nodes[i].node, nodes[i-1].node );
 
       double normParam = 0.5 * ( nodes[i].normParam + nodes[i-1].normParam );
       edgeID = linSide->EdgeID( linSide->EdgeIndex( normParam ));
@@ -732,13 +750,13 @@ protected:
 
 void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMesh)
 {
-  // if ( !faceSubMesh->IsEmpty() )
-  // {
-  //   for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
-  //   {
-  //     markEdgeAsComputedByMe( TopoDS::Edge( e.Current() ), faceSubMesh );
-  //   }
-  // }
+  if ( !faceSubMesh->IsEmpty() )
+  {
+    for ( TopExp_Explorer e( faceSubMesh->GetSubShape(), TopAbs_EDGE ); e.More(); e.Next() )
+    {
+      markEdgeAsComputedByMe( TopoDS::Edge( e.Current() ), faceSubMesh );
+    }
+  }
 }
 
 //=======================================================================
@@ -762,12 +780,12 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
                  "of edges is less or equal to 3 and one of them is an ellipse curve)");
 
   // get not yet computed EDGEs
-  // list< TopoDS_Edge > emptyEdges;
-  // for ( TopExp_Explorer e( aShape, TopAbs_EDGE ); e.More(); e.Next() )
-  // {
-  //   if ( aMesh.GetSubMesh( e.Current() )->IsEmpty() )
-  //     emptyEdges.push_back( TopoDS::Edge( e.Current() ));
-  // }
+  list< TopoDS_Edge > emptyEdges;
+  for ( TopExp_Explorer e( aShape, TopAbs_EDGE ); e.More(); e.Next() )
+  {
+    if ( aMesh.GetSubMesh( e.Current() )->IsEmpty() )
+      emptyEdges.push_back( TopoDS::Edge( e.Current() ));
+  }
 
   TNodeDistributor* algo1d = TNodeDistributor::GetDistributor(aMesh);
 
@@ -941,9 +959,9 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
     centerUV   = nodes2.back().UV();
   }
 
-  // list< TopoDS_Edge >::iterator ee = emptyEdges.begin();
-  // for ( ; ee != emptyEdges.end(); ++ee )
-  //   markEdgeAsComputedByMe( *ee, aMesh.GetSubMesh( F ));
+  list< TopoDS_Edge >::iterator ee = emptyEdges.begin();
+  for ( ; ee != emptyEdges.end(); ++ee )
+    markEdgeAsComputedByMe( *ee, aMesh.GetSubMesh( F ));
 
   circSide->GetUVPtStruct(); // let sides take into account just computed nodes
   linSide1->GetUVPtStruct();
@@ -1202,7 +1220,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::IsApplicable( const TopoDS_Shape & aShape
   for (TopExp_Explorer exp( aShape, TopAbs_FACE ); exp.More(); exp.Next(), ++nbFoundFaces )
   {
     StdMeshers_FaceSidePtr circSide, linSide1, linSide2;
-    int nbSides = analyseFace( aShape, NULL, circSide, linSide1, linSide2 );
+    int nbSides = analyseFace( exp.Current(), NULL, circSide, linSide1, linSide2 );
     bool ok = ( 0 < nbSides && nbSides <= 3 &&
                 isCornerInsideCircle( circSide, linSide1, linSide2 ));
     if( toCheckAll  && !ok ) return false;