Salome HOME
0020978: EDF 1475 SMESH: Convert linear to quadratic on a submesh
[modules/smesh.git] / src / StdMeshers / StdMeshers_ProjectionUtils.cxx
index 02b732c0b535d58d2d2bfde73c42d1b309621129..dd7db409c47f480b2675b31e17ea54a296f3c426 100644 (file)
@@ -35,7 +35,6 @@
 #include "SMESH_Block.hxx"
 #include "SMESH_Gen.hxx"
 #include "SMESH_Hypothesis.hxx"
-#include "SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx"
 #include "SMESH_Mesh.hxx"
 #include "SMESH_MesherHelper.hxx"
 #include "SMESH_subMesh.hxx"
@@ -56,6 +55,7 @@
 #include <TopTools_Array1OfShape.hxx>
 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
 #include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_MapOfShape.hxx>
@@ -979,13 +979,14 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
         list< TopoDS_Edge > edges1, edges2;
         int nbE = FindFaceAssociation( face1, VV1, face2, VV2, edges1, edges2 );
         if ( !nbE ) RETURN_BAD_RESULT("FindFaceAssociation() failed");
-        if ( nbE == 2 ) // only 2 edges
+        // take care of proper association of propagated edges
+        bool same1 = edge1.IsSame( edges1.front() );
+        bool same2 = edge2.IsSame( edges2.front() );
+        if ( same1 != same2 )
         {
-          // take care of proper association of propagated edges
-          bool same1 = edge1.IsSame( edges1.front() );
-          bool same2 = edge2.IsSame( edges2.front() );
-          if ( same1 != same2 )
-            Reverse(edges2, nbE);
+          Reverse(edges2, nbE);
+          if ( nbE != 2 ) // 2 degen edges of 4 (issue 0021144)
+            edges2.splice( edges2.end(), edges2, edges2.begin());
         }
         // store association
         list< TopoDS_Edge >::iterator eIt1 = edges1.begin();
@@ -1504,7 +1505,7 @@ StdMeshers_ProjectionUtils::GetPropagationEdge( SMESH_Mesh*        aMesh,
                                                 const TopoDS_Edge& theEdge,
                                                 const TopoDS_Edge& fromEdge)
 {
-  SMESH_IndexedMapOfShape aChain;
+  TopTools_IndexedMapOfShape aChain;
   int step = 0;
 
   // List of edges, added to chain on the previous cycle pass