22264: EDF 2648 GEOM: Propagate edges automatic orientation

Fix for sub-meshes
This commit is contained in:
eap 2015-04-17 20:07:21 +03:00
parent 5c372c1659
commit 3026fe8712
3 changed files with 35 additions and 14 deletions

View File

@ -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<int>& indices)
{
if ( myIndices != indices )

View File

@ -61,6 +61,7 @@ public:
int GetIndexByShape( const TopoDS_Shape& );
TopoDS_Shape GetShapeByIndex( int i );
int NbShapesOfType( TopAbs_ShapeEnum type );
void SetIndices( const QList<int>& indices);
const QList<int>& GetIndices() const { return myIndices; }

View File

@ -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<int>& egdeIDs = previewActor->GetIndices();
for ( QList<int>::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<TGeomID>::const_iterator ieIt = egdeIDs.begin(); ieIt != egdeIDs.end(); ++ieIt )
shapeEdges.Add( *ieIt );
// loop on all EDGEs in mainShape
for ( QList<TGeomID>::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();
}