From 3026fe8712957e4312f2c4a261c555c7968b889a Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 17 Apr 2015 20:07:21 +0300 Subject: [PATCH] 22264: EDF 2648 GEOM: Propagate edges automatic orientation Fix for sub-meshes --- src/OBJECT/SMESH_PreviewActorsCollection.cxx | 11 ++++++ src/OBJECT/SMESH_PreviewActorsCollection.h | 1 + .../StdMeshersGUI_PropagationHelperWdg.cxx | 37 ++++++++++++------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.cxx b/src/OBJECT/SMESH_PreviewActorsCollection.cxx index aee863d1f..06c67439c 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.cxx +++ b/src/OBJECT/SMESH_PreviewActorsCollection.cxx @@ -128,6 +128,17 @@ TopoDS_Shape SMESH_PreviewActorsCollection::GetShapeByIndex( int index ) return IsValidIndex( index ) ? myMapOfShapes.FindKey( index ) : TopoDS_Shape(); } +int SMESH_PreviewActorsCollection::NbShapesOfType( TopAbs_ShapeEnum type ) +{ + if ( type == TopAbs_SHAPE ) return myMapOfShapes.Extent(); + + int nb = 0; + for ( int i = 1; i <= myMapOfShapes.Extent(); ++i ) + nb += ( myMapOfShapes(i).ShapeType() == type ); + + return nb; +} + void SMESH_PreviewActorsCollection::SetIndices( const QList& indices) { if ( myIndices != indices ) diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.h b/src/OBJECT/SMESH_PreviewActorsCollection.h index 3b3cb12a0..afb0730c5 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.h +++ b/src/OBJECT/SMESH_PreviewActorsCollection.h @@ -61,6 +61,7 @@ public: int GetIndexByShape( const TopoDS_Shape& ); TopoDS_Shape GetShapeByIndex( int i ); + int NbShapesOfType( TopAbs_ShapeEnum type ); void SetIndices( const QList& indices); const QList& GetIndices() const { return myIndices; } diff --git a/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx index 3369aaa95..c84b40be9 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx @@ -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 ); @@ -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,6 +275,11 @@ bool StdMeshersGUI_PropagationHelperWdg::buildChains() TColStd_IndexedMapOfInteger chain, chainedEdges; + TColStd_MapOfInteger shapeEdges; + if ( !shape.IsSame( mainShape )) + for ( QList::const_iterator ieIt = egdeIDs.begin(); ieIt != egdeIDs.end(); ++ieIt ) + shapeEdges.Add( *ieIt ); + // loop on all EDGEs in mainShape for ( QList::const_iterator ieIt = egdeIDs.begin(); ieIt != egdeIDs.end(); ++ieIt ) { @@ -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 egdeIDs + return !myChains.empty(); } -- 2.30.2