From: eap Date: Fri, 5 May 2006 08:22:25 +0000 (+0000) Subject: fix SIGSEGV in ConvertFromQuadratic() on torus X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1f23ca1d2dd76486f3c1ff10f63390cbc04d5535;p=modules%2Fsmesh.git fix SIGSEGV in ConvertFromQuadratic() on torus --- diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index 1650e1bd7..6ce462963 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -2481,9 +2481,6 @@ void SMESH_MeshEditor::Smooth (map & 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 aNds; - vector 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; } diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index 68a15d1b3..65658bcc4 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -44,6 +44,9 @@ typedef map > TElemOfElemListMap; +typedef map RemoveQuadNodeMap; +typedef map::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