]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
fix SIGSEGV in ConvertFromQuadratic() on torus
authoreap <eap@opencascade.com>
Fri, 5 May 2006 08:22:25 +0000 (08:22 +0000)
committereap <eap@opencascade.com>
Fri, 5 May 2006 08:22:25 +0000 (08:22 +0000)
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_MeshEditor.hxx

index 1650e1bd746f45c641e9fe5ab175be4e1cd3d551..6ce462963e2f4892e6e964c93550b7b0287259e6 100644 (file)
@@ -2481,9 +2481,6 @@ void SMESH_MeshEditor::Smooth (map<int,const SMDS_MeshElement*> & theElems,
     // move medium nodes of quadratic elements
     if ( isQuadratic )
     {
-      SMESH_MesherHelper helper( *GetMesh() );
-      if ( !face.IsNull() )
-        helper.SetSubShape( face );
       list< const SMDS_MeshElement* >::iterator elemIt = elemsOnFace.begin();
       for ( ; elemIt != elemsOnFace.end(); ++elemIt ) {
         const SMDS_QuadraticFaceOfNodes* QF =
@@ -6234,7 +6231,8 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d)
 //purpose  :
 //=======================================================================
 void SMESH_MeshEditor::RemoveQuadElem(SMESHDS_SubMesh *theSm, 
-                                     SMDS_ElemIteratorPtr theItr)
+                                     SMDS_ElemIteratorPtr theItr,
+                                     RemoveQuadNodeMap& theRemoveNodeMap)
 {
   SMESHDS_Mesh* meshDS = GetMeshDS();
   while( theItr->more() )
@@ -6249,22 +6247,18 @@ void SMESH_MeshEditor::RemoveQuadElem(SMESHDS_SubMesh *theSm,
 
       int nbNodes = elem->NbNodes(), idx = 0;
       vector<const SMDS_MeshNode *> aNds; 
-      vector<const SMDS_MeshNode *> aQuadNds; 
 
-      //remove all quadratic nodes 
       for(int i = 0; i < nbNodes; i++)
       {
        const SMDS_MeshNode* n = elem->GetNode(i);
 
        if( elem->IsMediumNode( n ) )
        {
-         aQuadNds.push_back( n );
-         /*  ItRemoveQuadNodeMap itRNM = myRemoveNodeMap.find( n );
-           if( itRNM == myRemoveNodeMap.end() )
-           {
-             aQuadNds.push_back( n );
-             myRemoveNodeMap.insert(RemoveQuadNodeMap::value_type( n,theSm ));
-             }*/
+         ItRemoveQuadNodeMap itRNM = theRemoveNodeMap.find( n );
+         if( itRNM == theRemoveNodeMap.end() )
+         {
+           theRemoveNodeMap.insert(RemoveQuadNodeMap::value_type( n,theSm ));
+         }
        }
        else 
          aNds.push_back( n );
@@ -6277,10 +6271,6 @@ void SMESH_MeshEditor::RemoveQuadElem(SMESHDS_SubMesh *theSm,
       //remove old quadratic elements
       meshDS->RemoveFreeElement( elem, theSm );
 
-      for( int j = 0; j < aQuadNds.size(); j++ )
-      {
-       meshDS->RemoveFreeNode( aQuadNds[j], theSm );   
-      }
       SMDS_MeshElement * NewElem = 0;
       switch(aType)
       {
@@ -6321,7 +6311,7 @@ void SMESH_MeshEditor::RemoveQuadElem(SMESHDS_SubMesh *theSm,
 bool  SMESH_MeshEditor::ConvertFromQuadratic()
 {
   SMESHDS_Mesh* meshDS = GetMeshDS();
-  //  myRemoveNodeMap.clear();
+  RemoveQuadNodeMap aRemoveNodeMap;
 
   const TopoDS_Shape& aShape = meshDS->ShapeToMesh();
 
@@ -6335,23 +6325,24 @@ bool  SMESH_MeshEditor::ConvertFromQuadratic()
     {
       SMESHDS_SubMesh *sm = ((*itsub).second)->GetSubMeshDS();
       if( sm )
-       RemoveQuadElem( sm, sm->GetElements() );
+       RemoveQuadElem( sm, sm->GetElements(), aRemoveNodeMap );
     }
     SMESHDS_SubMesh *Sm = aSubMesh->GetSubMeshDS();
     if( Sm )
-      RemoveQuadElem( Sm, Sm->GetElements() );
+      RemoveQuadElem( Sm, Sm->GetElements(), aRemoveNodeMap );
   }
   else
   {
     SMESHDS_SubMesh *aSM = 0;
-    RemoveQuadElem( aSM, meshDS->elementsIterator() );
+    RemoveQuadElem( aSM, meshDS->elementsIterator(), aRemoveNodeMap );
   }
 
-  /*  ItRemoveQuadNodeMap itRNM = myRemoveNodeMap.begin();
-  for ( ; itRNM != myRemoveNodeMap.end(); itRNM++ ) {
+  //remove all quadratic nodes 
+  ItRemoveQuadNodeMap itRNM = aRemoveNodeMap.begin();
+  for ( ; itRNM != aRemoveNodeMap.end(); itRNM++ ) 
   {
-    meshDS->RemoveFreeNode( (*itRNM), (*itRNM).second  );      
-    }*/
+    meshDS->RemoveFreeNode( (*itRNM).first, (*itRNM).second  );        
+  }
 
   return true;
 }
index 68a15d1b37ed584f04744c3fc9dade77119deea6..65658bcc41d368ccb778a16123376380e99a7012 100644 (file)
@@ -44,6 +44,9 @@
 typedef map<const SMDS_MeshElement*,
             list<const SMDS_MeshElement*> > TElemOfElemListMap;
 
+typedef map<const SMDS_MeshNode*, SMESHDS_SubMesh*> RemoveQuadNodeMap;
+typedef map<const SMDS_MeshNode*, SMESHDS_SubMesh*>::iterator ItRemoveQuadNodeMap;
+
 class SMDS_MeshElement;
 class SMDS_MeshFace;
 class SMDS_MeshNode;
@@ -396,6 +399,8 @@ class SMESH_MeshEditor {
 
   SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
 
+  SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
+
   SMESH_SequenceOfElemPtr GetLastCreatedNodes() { return myLastCreatedNodes; }
 
   SMESH_SequenceOfElemPtr GetLastCreatedElems() { return myLastCreatedElems; }
@@ -409,7 +414,8 @@ private:
   //elements contained in submesh to quadratic
 
   void RemoveQuadElem( SMESHDS_SubMesh *theSm,
-                      SMDS_ElemIteratorPtr theItr);
+                      SMDS_ElemIteratorPtr theItr,
+                      RemoveQuadNodeMap& theRemoveNodeMap);
   //Auxiliary function for "ConvertFromQuadratic" is intended to convert quadratic
   //element to ordinary and for removing quadratic nodes