X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESH%2FSMESH_subMesh.cxx;h=19df51879a632adabcfc1260007c7178aed8b9e1;hb=refs%2Ftags%2FV7_2_0;hp=9afb7677c3abfe8150aaea2e52626104122a413b;hpb=31ca0b3e3be91c2e0e9ea2ec70c828f373bfb086;p=modules%2Fsmesh.git diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 9afb7677c..19df51879 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -1348,6 +1348,9 @@ bool SMESH_subMesh::ComputeStateEngine(int event) default:; } + if ( event == CLEAN ) + _alwaysComputed = false; // Unset 'true' set by MergeNodes() (issue 0022182) + if (_subShape.ShapeType() == TopAbs_VERTEX) { _computeState = READY_TO_COMPUTE; @@ -1460,8 +1463,8 @@ bool SMESH_subMesh::ComputeStateEngine(int event) if (_father->HasShapeToMesh() ) { bool subComputed = false, subFailed = false; if (!algo->OnlyUnaryInput()) { - if ( event == COMPUTE && - ( algo->NeedDiscreteBoundary() || algo->SupportSubmeshes() )) + if ( event == COMPUTE /*&& + ( algo->NeedDiscreteBoundary() || algo->SupportSubmeshes() )*/) shape = getCollection( gen, algo, subComputed, subFailed ); else subComputed = SubMeshesComputed( & subFailed ); @@ -2255,19 +2258,22 @@ void SMESH_subMesh::notifyListenersOnEvent( const int event, const event_type eventType, SMESH_Hypothesis* hyp) { - map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); - for ( ; l_d != _eventListeners.end(); ) + list< pair< EventListener*, EventListenerData* > > eventListeners( _eventListeners.begin(), + _eventListeners.end()); + list< pair< EventListener*, EventListenerData* > >::iterator l_d = eventListeners.begin(); + for ( ; l_d != eventListeners.end(); ++l_d ) { - std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal - of a listener from - _eventListeners by - its ProcessEvent() */ + std::pair< EventListener*, EventListenerData* > li_da = *l_d; + if ( !_eventListeners.count( li_da.first )) continue; + if ( li_da.first->myBusySM.insert( this ).second ) { - const size_t nbListenersBefore = _eventListeners.size(); + const bool isDeletable = li_da.first->IsDeletable(); + li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); - if ( nbListenersBefore == _eventListeners.size() ) - li_da.first->myBusySM.erase( this ); // a listener hopefully not removed + + if ( !isDeletable || !_eventListeners.count( li_da.first )) + li_da.first->myBusySM.erase( this ); // a listener is hopefully not dead } } }