X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_MeshEditor.cxx;h=7b0d86fdba9c23c097570b391eeef16067897d8d;hp=b11f6c32adc78541bcf1e5eeb10638a17f6b0974;hb=9655cb578db3659e41763af22c9de67724bdd66d;hpb=c656333fb4f2415a0b88821a721072f28b30a53a diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index b11f6c32a..7b0d86fdb 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -7979,33 +7979,29 @@ void SMESH_MeshEditor::FindEqualElements(TIDSortedElemSet & theElements, typedef map< SortableElement, int > TMapOfNodeSet; typedef list TGroupOfElems; - if ( theElements.empty() ) - { // get all elements in the mesh - SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator(); - while ( eIt->more() ) - theElements.insert( theElements.end(), eIt->next() ); - } + SMDS_ElemIteratorPtr elemIt; + if ( theElements.empty() ) elemIt = GetMeshDS()->elementsIterator(); + else elemIt = elemSetIterator( theElements ); vector< TGroupOfElems > arrayOfGroups; TGroupOfElems groupOfElems; TMapOfNodeSet mapOfNodeSet; - TIDSortedElemSet::iterator elemIt = theElements.begin(); - for ( int i = 0; elemIt != theElements.end(); ++elemIt ) + for ( int iGroup = 0; elemIt->more(); ) { - const SMDS_MeshElement* curElem = *elemIt; + const SMDS_MeshElement* curElem = elemIt->next(); SortableElement SE(curElem); // check uniqueness - pair< TMapOfNodeSet::iterator, bool> pp = mapOfNodeSet.insert(make_pair(SE, i)); + pair< TMapOfNodeSet::iterator, bool> pp = mapOfNodeSet.insert(make_pair(SE, iGroup)); if ( !pp.second ) { // one more coincident elem TMapOfNodeSet::iterator& itSE = pp.first; - int ind = (*itSE).second; - arrayOfGroups[ind].push_back( curElem->GetID() ); + int iG = itSE->second; + arrayOfGroups[ iG ].push_back( curElem->GetID() ); } else { arrayOfGroups.push_back( groupOfElems ); arrayOfGroups.back().push_back( curElem->GetID() ); - i++; + iGroup++; } } @@ -11189,6 +11185,9 @@ void SMESH_MeshEditor::DoubleElements( const TIDSortedElemSet& theElements ) elemIt = elemSetIterator( theElements ); } + // un-mark all elements to avoid duplicating just created elements + SMESH_MeshAlgos::MarkElems( mesh->elementsIterator( type ), false ); + // duplicate elements ElemFeatures elemType; @@ -11197,13 +11196,14 @@ void SMESH_MeshEditor::DoubleElements( const TIDSortedElemSet& theElements ) while ( elemIt->more() ) { const SMDS_MeshElement* elem = elemIt->next(); - if ( elem->GetType() != type ) + if ( elem->GetType() != type || elem->isMarked() ) continue; elemType.Init( elem, /*basicOnly=*/false ); nodes.assign( elem->begin_nodes(), elem->end_nodes() ); - AddElement( nodes, elemType ); + if ( const SMDS_MeshElement* newElem = AddElement( nodes, elemType )) + newElem->setIsMarked( true ); } }