X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_subMesh.cxx;h=a3b12c77e5da711defef4ca81fc533a19f275ea2;hp=05800491ba7ffb27dbff708c1a3f9ba00cea635d;hb=5552aec787c289730a35843d295811cfdadaacd3;hpb=30628bd54b2932ebfaae2ae2c24af7f173c4970e diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 05800491b..a3b12c77e 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1293,40 +1293,19 @@ static void cleanSubMesh( SMESH_subMesh * subMesh ) SMESHDS_Mesh * meshDS = subMesh->GetFather()->GetMeshDS(); int nbElems = subMeshDS->NbElements(); if ( nbElems > 0 ) - { - // start from elem with max ID to avoid filling the pool of IDs - bool rev = true; - SMDS_ElemIteratorPtr ite = subMeshDS->GetElements( rev ); - const SMDS_MeshElement * lastElem = ite->next(); - rev = ( lastElem->GetID() == meshDS->MaxElementID() ); - if ( !rev ) - ite = subMeshDS->GetElements( rev ); - else - meshDS->RemoveFreeElement( lastElem, subMeshDS ); - while (ite->more()) { - const SMDS_MeshElement * elt = ite->next(); - meshDS->RemoveFreeElement( elt, subMeshDS ); - } - } + for ( SMDS_ElemIteratorPtr ite = subMeshDS->GetElements(); ite->more(); ) + meshDS->RemoveFreeElement( ite->next(), subMeshDS ); + int nbNodes = subMeshDS->NbNodes(); if ( nbNodes > 0 ) - { - bool rev = true; - SMDS_NodeIteratorPtr itn = subMeshDS->GetNodes( rev ); - const SMDS_MeshNode * lastNode = itn->next(); - rev = ( lastNode->GetID() == meshDS->MaxNodeID() ); - if ( !rev ) - itn = subMeshDS->GetNodes( rev ); - else - meshDS->RemoveNode( lastNode ); - while (itn->more()) { + for ( SMDS_NodeIteratorPtr itn = subMeshDS->GetNodes(); itn->more() ; ) + { const SMDS_MeshNode * node = itn->next(); if ( node->NbInverseElements() == 0 ) meshDS->RemoveFreeNode( node, subMeshDS ); else // for StdMeshers_CompositeSegment_1D: node in one submesh, edge in another - meshDS->RemoveNode(node); + meshDS->RemoveNode( node ); } - } subMeshDS->Clear(); } } @@ -2297,9 +2276,9 @@ void SMESH_subMesh::setEventListener(EventListener* listener, _eventListeners.find( listener ); if ( l_d != _eventListeners.end() ) { EventListenerData* curData = l_d->second; + l_d->second = data; if ( curData && curData != data && curData->IsDeletable() ) delete curData; - l_d->second = data; } else { @@ -2307,6 +2286,7 @@ void SMESH_subMesh::setEventListener(EventListener* listener, if ( listener->GetName() == l_d->first->GetName() ) { EventListenerData* curData = l_d->second; + l_d->second = 0; if ( curData && curData != data && curData->IsDeletable() ) delete curData; if ( l_d->first != listener && l_d->first->IsDeletable() ) @@ -2569,9 +2549,9 @@ namespace { //================================================================================ /*! - * \brief Return iterator on the submeshes this one depends on - * \param includeSelf - this submesh to be returned also - * \param reverse - if true, complex shape submeshes go first + * \brief Return iterator on the submeshes this one depends on + * \param includeSelf - this submesh to be returned also + * \param reverse - if true, complex shape submeshes go first */ //================================================================================ @@ -2612,8 +2592,13 @@ const std::vector< SMESH_subMesh * > & SMESH_subMesh::GetAncestors() const SMESH_subMesh* me = const_cast< SMESH_subMesh* >( this ); me->_ancestors.reserve( ancShapes.Extent() ); + // assure that all sub-meshes exist + TopoDS_Shape mainShape = _father->GetShapeToMesh(); + if ( !mainShape.IsNull() ) + _father->GetSubMesh( mainShape )->DependsOn(); + TopTools_MapOfShape map; - + for ( TopTools_ListIteratorOfListOfShape it( ancShapes ); it.More(); it.Next() ) if ( SMESH_subMesh* sm = _father->GetSubMeshContaining( it.Value() )) if ( map.Add( it.Value() ))