Salome HOME
22264: EDF 2648 GEOM: Propagate edges automatic orientation
authoreap <eap@opencascade.com>
Fri, 17 Apr 2015 17:07:21 +0000 (20:07 +0300)
committereap <eap@opencascade.com>
Fri, 17 Apr 2015 17:07:21 +0000 (20:07 +0300)
   Fix for sub-meshes

src/OBJECT/SMESH_PreviewActorsCollection.cxx
src/OBJECT/SMESH_PreviewActorsCollection.h
src/StdMeshersGUI/StdMeshersGUI_PropagationHelperWdg.cxx

index aee863d1f3f9d9eca7f4dcb70d227fad4893ea24..06c67439c32213fcd0f24ef3b5c4e75f93ab5d22 100644 (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 )
index 3b3cb12a0d90d5e0f35632e07fc2c0819803756f..afb0730c52277a8c02ce5c592395157acb5aed96 100644 (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; }
index 3369aaa95f133114d16b939ba94e5aa9cda6e2b5..c84b40be9d8c1413765714ae6fc69f348e5b98f3 100644 (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();
 }