]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Fix of geom/bugs_12/M2 test case
authorskv <skv@opencascade.com>
Tue, 10 Dec 2013 16:00:37 +0000 (16:00 +0000)
committerskv <skv@opencascade.com>
Tue, 10 Dec 2013 16:00:37 +0000 (16:00 +0000)
src/BlockFix/BlockFix_UnionFaces.cxx

index 29228627642ffac9b2aaf712f4179f0419bec8af..34f0e2fafe7ad27bbc14f301abe23ea149ef6fa1 100644 (file)
@@ -233,6 +233,41 @@ static Standard_Boolean IsFacesOfSameSolids
   return isSame;
 }
 
+//=======================================================================
+//function : IsEdgeValidToMerge
+//purpose  : Edge is valid if it is not seam or if it is a seam and the face
+//           has another seam edge.
+//=======================================================================
+static Standard_Boolean IsEdgeValidToMerge(const TopoDS_Edge &theEdge,
+                                           const TopoDS_Face &theFace)
+{
+  Standard_Boolean isValid = Standard_True;
+
+  if (BRep_Tool::IsClosed(theEdge, theFace)) {
+    // This is a seam edge. Check if there are another seam edges on the face.
+    TopExp_Explorer anExp(theFace, TopAbs_EDGE);
+
+    for (; anExp.More(); anExp.Next()) {
+      const TopoDS_Shape &aShEdge = anExp.Current();
+
+      // Skip same edge.
+      if (theEdge.IsSame(aShEdge)) {
+        continue;
+      }
+
+      // Check if this edge is a seam.
+      TopoDS_Edge anEdge = TopoDS::Edge(aShEdge);
+
+      if (BRep_Tool::IsClosed(anEdge, theFace)) {
+        isValid = Standard_False;
+        break;
+      }
+    }
+  }
+
+  return isValid;
+}
+
 //=======================================================================
 //function : Perform
 //purpose  :
@@ -302,7 +337,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
       Standard_Integer i;
       for (i = 1; i <= edges.Length(); i++) {
         TopoDS_Edge edge = TopoDS::Edge(edges(i));
-        if (BRep_Tool::Degenerated(edge) || BRep_Tool::IsClosed(edge, aFace))
+        if (BRep_Tool::Degenerated(edge) || !IsEdgeValidToMerge(edge, aFace))
           continue;
 
         const TopTools_ListOfShape& aList = aMapEdgeFaces.FindFromKey(edge);
@@ -315,7 +350,7 @@ TopoDS_Shape BlockFix_UnionFaces::Perform(const TopoDS_Shape& Shape)
           if (aProcessed.Contains(anCheckedFace))
             continue;
 
-          if (BRep_Tool::IsClosed(edge, anCheckedFace)) {
+          if (!IsEdgeValidToMerge(edge, anCheckedFace)) {
             // Skip seam edge.
             continue;
           }