Salome HOME
Update copyrights 2014.
[modules/smesh.git] / src / StdMeshers / StdMeshers_ProjectionUtils.cxx
index de59b265423948b4b4eb9698195e9e47fc51640b..730f78c62c4c628caa715a63c0ff3bc82f7a5c05 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -438,8 +438,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
                                                          TShapeShapeMap &    theMap)
 {
   // Structure of this long function is following
-  // 1) Group->group projection: theShape1 is a group member,
-  //    theShape2 is a group. We find a group theShape1 is in and recall self.
+  // 1) Group -> Group projection: theShape1 is a group member,
+  //    theShape2 is another group. We find a group theShape1 is in and recall self.
   // 2) Accosiate same shapes with different location (partners).
   // 3) If vertex association is given, perform accosiation according to shape type:
   //       switch ( ShapeType ) {
@@ -622,7 +622,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
       TopTools_ListIteratorOfListOfShape ancestIt1( edgeToFace1.FindFromKey( edge1 ));
       for ( ; F1.IsNull() && ancestIt1.More(); ancestIt1.Next() )
         if ( ancestIt1.Value().ShapeType() == TopAbs_FACE )
-          F1 = ancestIt1.Value().Oriented( TopAbs_FORWARD );
+          F1 = ancestIt1.Value().Oriented //( TopAbs_FORWARD );
+            ( SMESH_MesherHelper::GetSubShapeOri( theShape1, ancestIt1.Value() ));
       if ( F1.IsNull() )
         RETURN_BAD_RESULT(" Face1 not found");
 
@@ -630,7 +631,8 @@ bool StdMeshers_ProjectionUtils::FindSubShapeAssociation(const TopoDS_Shape& the
       TopTools_ListIteratorOfListOfShape ancestIt2( edgeToFace2.FindFromKey( edge2 ));
       for ( int i = 0; FF2[1].IsNull() && ancestIt2.More(); ancestIt2.Next() )
         if ( ancestIt2.Value().ShapeType() == TopAbs_FACE )
-          FF2[ i++ ] = ancestIt2.Value().Oriented( TopAbs_FORWARD );
+          FF2[ i++ ] = ancestIt2.Value().Oriented // ( TopAbs_FORWARD );
+            ( SMESH_MesherHelper::GetSubShapeOri( theShape2, ancestIt2.Value() ));
 
       // get oriented edge1 and edge2 from F1 and FF2[0]
       for ( exp.Init( F1, TopAbs_EDGE ); exp.More(); exp.Next() )
@@ -1330,9 +1332,15 @@ int StdMeshers_ProjectionUtils::FindFaceAssociation(const TopoDS_Face&    face1,
           CONT_BAD_RESULT("GetOrderedEdges() failed");
       }
     }
-    edgeIt = --edges2.end();
     if ( !VV2[1].IsSame( TopExp::LastVertex( edges2.front(), true ))) {
       reverse = !reverse;
+      edgeIt = --edges2.end();
+      // move a degenerated edge from back to front
+      // http://www.salome-platform.org/forum/forum_11/173031193
+      if ( TopExp::FirstVertex( *edgeIt ).IsSame( TopExp::LastVertex( *edgeIt ))) {
+        edges2.splice( edges2.begin(), edges2, edgeIt );
+        edgeIt = --edges2.end();
+      }
       // check if the second vertex belongs to the first or last edge in the wire
       if ( !VV2[1].IsSame( TopExp::FirstVertex( *edgeIt, true ))) {
         bool KO = true; // belongs to none