X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FStdMeshersGUI%2FStdMeshersGUI_PropagationHelperWdg.cxx;h=2dee775c2c159c0a6a1159649dc6b9fcf3a8f4e9;hp=3369aaa95f133114d16b939ba94e5aa9cda6e2b5;hb=HEAD;hpb=5c372c165941502d85392e1502980931d0109c8f;ds=sidebyside diff --git a/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx index 3369aaa95..37832e257 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -174,15 +174,11 @@ void StdMeshersGUI_PropagationHelperWdg::onShowGeometry(bool toShow) BRep_Builder aBuilder; aBuilder.MakeCompound( aCompound ); - SMESH_PreviewActorsCollection* previewActor = mySubSelectWdg->GetActorCollection(); - if ( !previewActor ) return; - const QList& egdeIDs = previewActor->GetIndices(); - for ( QList::const_iterator ieIt = egdeIDs.begin(); ieIt != egdeIDs.end(); ++ieIt ) - { - TopoDS_Shape E = previewActor->GetShapeByIndex( *ieIt ); - if ( !E.IsNull() && E.ShapeType() == TopAbs_EDGE ) - aBuilder.Add( aCompound, E ); - } + TopTools_MapOfShape edgesMap; + TopExp_Explorer edge( mainShape, TopAbs_EDGE ); + for ( ; edge.More(); edge.Next() ) + if ( edgesMap.Add( edge.Current() )) + aBuilder.Add( aCompound, edge.Current() ); myModelActor = GEOM_Actor::New(); myModelActor->SetShape( aCompound, 0, 0 ); @@ -223,7 +219,7 @@ bool StdMeshersGUI_PropagationHelperWdg::buildChains() // aPreviewActor holds a map od all sub-shapes of mainShape SMESH_PreviewActorsCollection* previewActor = mySubSelectWdg->GetActorCollection(); if ( !previewActor ) return false; - const QList& egdeIDs = previewActor->GetIndices(); + const QList& edgeIDs = previewActor->GetIndices(); // Make a 'map' of WIREs of EDGE with quadrilateral WIREs only @@ -233,12 +229,13 @@ bool StdMeshersGUI_PropagationHelperWdg::buildChains() typedef std::vector< TEdgeInWire > TWiresOfEdge;// WIREs including an EDGE std::vector< TWire > quadWires; - quadWires.reserve( egdeIDs.count() ); - NCollection_DataMap< TGeomID, TWiresOfEdge > wiresOfEdge( egdeIDs.count() ); + quadWires.reserve( previewActor->NbShapesOfType( TopAbs_FACE )); + NCollection_DataMap< TGeomID, TWiresOfEdge > + wiresOfEdge( previewActor->NbShapesOfType( TopAbs_EDGE )); TopExp_Explorer wire; TopTools_MapOfShape faceMap; - for ( TopExp_Explorer face( shape, TopAbs_FACE ); face.More(); face.Next() ) + for ( TopExp_Explorer face( mainShape, TopAbs_FACE ); face.More(); face.Next() ) { if ( !faceMap.Add( face.Current() )) continue; @@ -278,8 +275,13 @@ bool StdMeshersGUI_PropagationHelperWdg::buildChains() TColStd_IndexedMapOfInteger chain, chainedEdges; + TColStd_MapOfInteger shapeEdges; + if ( !shape.IsSame( mainShape )) + for ( QList::const_iterator ieIt = edgeIDs.begin(); ieIt != edgeIDs.end(); ++ieIt ) + shapeEdges.Add( *ieIt ); + // loop on all EDGEs in mainShape - for ( QList::const_iterator ieIt = egdeIDs.begin(); ieIt != egdeIDs.end(); ++ieIt ) + for ( QList::const_iterator ieIt = edgeIDs.begin(); ieIt != edgeIDs.end(); ++ieIt ) { if ( chainedEdges.Contains( *ieIt )) continue; @@ -319,9 +321,16 @@ bool StdMeshersGUI_PropagationHelperWdg::buildChains() myChains.push_back( std::vector< TGeomID >() ); std::vector< TGeomID > & ch = myChains.back(); for ( int iC = 1; iC <= chain.Extent(); ++iC ) - ch.push_back( chain( iC ) ); + { + TGeomID iE = chain( iC ); + if ( shapeEdges.IsEmpty() || shapeEdges.Contains( Abs( iE ))) + ch.push_back( iE ); + } + if ( ch.size() < 2 ) + myChains.pop_back(); } - } + } // loop on edgeIDs + return !myChains.empty(); } @@ -346,11 +355,11 @@ void StdMeshersGUI_PropagationHelperWdg::updateList(bool enable) item->setData( Qt::UserRole, -1 ); } else - for ( size_t i = 0; i < myChains.size(); ++i ) + for ( int i = 0; i < (int)myChains.size(); ++i ) { QString text = tr( "CHAIN_NUM_NB_EDGES" ).arg( i+1 ).arg( myChains[i].size() ); item = new QListWidgetItem( text, myListWidget ); - item->setData( Qt::UserRole, (int) i ); + item->setData( Qt::UserRole, i ); } } else @@ -371,7 +380,7 @@ std::vector< int > * StdMeshersGUI_PropagationHelperWdg::getSelectedChain() if ( QListWidgetItem * item = myListWidget->currentItem() ) { int i = item->data( Qt::UserRole ).toInt(); - if ( 0 <= i && i < myChains.size() ) + if ( 0 <= i && i < (int)myChains.size() ) chain = & myChains[i]; } return chain;