0027521: Standard_ConstructionError when trying to use unifySameDom into a shape
authormsv <msv@opencascade.com>
Fri, 20 May 2016 08:36:11 +0000 (11:36 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 26 May 2016 09:19:26 +0000 (12:19 +0300)
Correct the algorithm in the function MergeEdges in ShapeUpgrade_UnifySameDomain.cxx so as to take into account the orientation of the next edge added to the chain.

Test cases for issue CR27521

src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.cxx
tests/bugs/modalg_6/bug27521_1 [new file with mode: 0644]
tests/bugs/modalg_6/bug27521_2 [new file with mode: 0644]

index b36a1f7..66312ef 100644 (file)
@@ -907,7 +907,7 @@ static Standard_Boolean MergeEdges(TopTools_SequenceOfShape& SeqEdges,
           if (!aMapVE.Contains(aV))
             aMapVE.Add(aV, TopTools_ListOfShape());
           aMapVE.ChangeFromKey(aV).Append(anEdge);
-  }
+        }
       }
     }
   }
@@ -929,7 +929,7 @@ static Standard_Boolean MergeEdges(TopTools_SequenceOfShape& SeqEdges,
 
     // make chain for unite
     TopTools_SequenceOfShape aChain;
-        aChain.Append(edge);
+    aChain.Append(edge);
     aUsedEdges.Add(edge);
     TopoDS_Vertex V[2];
     TopExp::Vertices(edge, V[0], V[1], Standard_True);
@@ -949,27 +949,31 @@ static Standard_Boolean MergeEdges(TopTools_SequenceOfShape& SeqEdges,
           edge = TopoDS::Edge(itL.Value());
           if (!aUsedEdges.Contains(edge))
           {
-            if (j == 0)
-        aChain.Prepend(edge);
-            else
-              aChain.Append(edge);
-            aUsedEdges.Add(edge);
-            TopoDS_Vertex VF2, VL2;
-            TopExp::Vertices(edge, VF2, VL2, Standard_True);
-            V[j] = (VF2.IsSame(V[j]) ? VL2 : VF2);
-            isAdded = Standard_True;
-            break;
+            TopoDS_Vertex V2[2];
+            TopExp::Vertices(edge, V2[0], V2[1], Standard_True);
+            // the neighboring edge must have V[j] reversed and located on the opposite end
+            if (V2[1 - j].IsEqual(V[j].Reversed()))
+            {
+              if (j == 0)
+                aChain.Prepend(edge);
+              else
+                aChain.Append(edge);
+              aUsedEdges.Add(edge);
+              V[j] = V2[j];
+              isAdded = Standard_True;
+              break;
+            }
+          }
+        }
       }
     }
-  }
-    }
 
     if (aChain.Length() < 2)
       continue;
 
-  Standard_Boolean IsClosed = Standard_False;
+    Standard_Boolean IsClosed = Standard_False;
     if (V[0].IsSame ( V[1] ))
-    IsClosed = Standard_True;
+      IsClosed = Standard_True;
 
     // split chain by vertices at which merging is not possible
     NCollection_Sequence<SubSequenceOfEdges> aOneSeq;
@@ -1525,11 +1529,11 @@ void ShapeUpgrade_UnifySameDomain::UnifyFaces()
             }
             else
             {
-            Handle(ShapeExtend_WireData) sbwd =
+              Handle(ShapeExtend_WireData) sbwd =
                 new ShapeExtend_WireData (aWire);
-            ShapeFix_WireSegment seg ( sbwd, TopAbs_REVERSED );
-            wires.Append(seg);
-          }
+              ShapeFix_WireSegment seg ( sbwd, TopAbs_REVERSED );
+              wires.Append(seg);
+            }
           }
 
           CompShell.DispatchWires ( parts,wires );
diff --git a/tests/bugs/modalg_6/bug27521_1 b/tests/bugs/modalg_6/bug27521_1
new file mode 100644 (file)
index 0000000..6d9e4bd
--- /dev/null
@@ -0,0 +1,17 @@
+puts "============"
+puts "OCC27521"
+puts "============"
+puts ""
+###############################
+## Standard_ConstructionError when trying to use unifySameDom into a shape
+###############################
+
+restore [locate_data_file bug27521_dom8443-good.brep] a
+unifysamedom result a
+
+don result
+smallview; fit
+checkshape result
+checknbshapes result -m UnifySameDomain -face 31 -edge 286
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}.png
diff --git a/tests/bugs/modalg_6/bug27521_2 b/tests/bugs/modalg_6/bug27521_2
new file mode 100644 (file)
index 0000000..44c0155
--- /dev/null
@@ -0,0 +1,17 @@
+puts "============"
+puts "OCC27521"
+puts "============"
+puts ""
+###############################
+## Standard_ConstructionError when trying to use unifySameDom into a shape
+###############################
+
+restore [locate_data_file bug27521_dom8443-wrong.brep] a
+unifysamedom result a
+
+don result
+smallview; fit
+checkshape result
+checknbshapes result -m UnifySameDomain -face 31 -edge 286
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}.png