]> OCCT Git - occt.git/commitdiff
0027674: BRepOffsetAPI_ThruSections make invalid shape if sections are connected...
authoraka <aka@opencascade.com>
Thu, 8 Dec 2016 13:22:13 +0000 (16:22 +0300)
committerapn <apn@opencascade.com>
Thu, 8 Dec 2016 13:22:33 +0000 (16:22 +0300)
The edge which will be created between same vertexes should be degenerated and without 3d curve.

Small correction of test case for issue CR27674

src/BRepFill/BRepFill_Generator.cxx
tests/bugs/modalg_6/bug27674 [new file with mode: 0644]

index 6e70529a995ea944e4b302a32ef243ce793a118d..19c47ba8064a7ed632fa46b751bd4c4031b70e99 100644 (file)
@@ -728,37 +728,52 @@ void BRepFill_Generator::Perform()
       // make the missing edges
       Standard_Real first,last;
       Surf->Bounds(f1,l1,f2,l2);
+      if (IType == 0)
+      {
+        first = f2;
+        last = l2;
+      }
+      else
+      {
+        first = 0.;
+        last = 1.;
+      }
 
       if ( Map.IsBound(Vf_toMap)) {
        TopoDS_Shape aLocalShape = Map(Vf_toMap).Reversed();
        Edge3 = TopoDS::Edge(aLocalShape);
 //     Edge3 = TopoDS::Edge(Map(V1f).Reversed());
       }
-      else {
-       Handle(Geom_Curve) CC;
-       TColgp_Array1OfPnt Extremities(1,2);
-       if (IType==0) {
-         // general case : Edge3 corresponds to iso U=f1
-         CC = Surf->UIso(f1);
-         first=f2;
-         last=l2;
-       }
-       else {
-         // particular case : it is required to calculate the curve 3d
-         Extremities(1) = BRep_Tool::Pnt(V1f);
-         Extremities(2) = BRep_Tool::Pnt(V2f);
-         CC = new Geom_BezierCurve(Extremities);
-         first=0.;
-         last=1.;
-       }
-       B.MakeEdge(Edge3,CC,Precision::Confusion());
-       V1f.Orientation(TopAbs_FORWARD);
-       B.Add(Edge3,V1f);
-       V2f.Orientation(TopAbs_REVERSED);
-       B.Add(Edge3,V2f);
-       B.Range(Edge3,first,last);
-       Edge3.Reverse();
-       Map.Bind(Vf_toMap, Edge3);
+      else
+      {
+        if (V1f.IsSame(V2f))
+        {
+          B.MakeEdge(Edge3);
+          B.Degenerated(Edge3, Standard_True);
+        }
+        else
+        {
+          Handle(Geom_Curve) CC;
+          TColgp_Array1OfPnt Extremities(1, 2);
+          if (IType == 0) {
+            // general case : Edge3 corresponds to iso U=f1
+            CC = Surf->UIso(f1);
+          }
+          else {
+            // particular case : it is required to calculate the curve 3d
+            Extremities(1) = BRep_Tool::Pnt(V1f);
+            Extremities(2) = BRep_Tool::Pnt(V2f);
+            CC = new Geom_BezierCurve(Extremities);
+          }
+          B.MakeEdge(Edge3, CC, Precision::Confusion());
+        }
+        V1f.Orientation(TopAbs_FORWARD);
+        B.Add(Edge3, V1f);
+        V2f.Orientation(TopAbs_REVERSED);
+        B.Add(Edge3, V2f);
+        B.Range(Edge3, first, last);
+        Edge3.Reverse();
+        Map.Bind(Vf_toMap, Edge3);
       }
 
       Standard_Boolean CommonEdge = Standard_False;
@@ -775,30 +790,35 @@ void BRepFill_Generator::Perform()
        Edge4 = TopoDS::Edge(aLocalShape);
 //     Edge4 = TopoDS::Edge(Map(V1l).Reversed());
       }
-      else {
-       Handle(Geom_Curve) CC;
-       TColgp_Array1OfPnt Extremities(1,2);
-       if (IType==0) {
-         // general case : Edge4 corresponds to iso U=l1
-         CC = Surf->UIso(l1);
-         first=f2;
-         last=l2;
-       }
-       else {
-         // particular case : it is required to calculate the curve 3d
-         Extremities(1) = BRep_Tool::Pnt(V1l);
-         Extremities(2) = BRep_Tool::Pnt(V2l);
-         CC = new Geom_BezierCurve(Extremities);
-         first=0.;
-         last=1.;
-       }
-       B.MakeEdge(Edge4,CC,Precision::Confusion());
-       V1l.Orientation(TopAbs_FORWARD);
-       B.Add(Edge4,V1l);
-       V2l.Orientation(TopAbs_REVERSED);
-       B.Add(Edge4,V2l);
-       B.Range(Edge4,first,last);
-       Map.Bind(Vl_toMap, Edge4);
+      else
+      {
+        if (V1l.IsSame(V2l))
+        {
+          B.MakeEdge(Edge4);
+          B.Degenerated(Edge4, Standard_True);
+        }
+        else
+        {
+          Handle(Geom_Curve) CC;
+          TColgp_Array1OfPnt Extremities(1, 2);
+          if (IType == 0) {
+            // general case : Edge4 corresponds to iso U=l1
+            CC = Surf->UIso(l1);
+          }
+          else {
+            // particular case : it is required to calculate the curve 3d
+            Extremities(1) = BRep_Tool::Pnt(V1l);
+            Extremities(2) = BRep_Tool::Pnt(V2l);
+            CC = new Geom_BezierCurve(Extremities);
+          }
+          B.MakeEdge(Edge4, CC, Precision::Confusion());
+        }
+        V1l.Orientation(TopAbs_FORWARD);
+        B.Add(Edge4, V1l);
+        V2l.Orientation(TopAbs_REVERSED);
+        B.Add(Edge4, V2l);
+        B.Range(Edge4, first, last);
+        Map.Bind(Vl_toMap, Edge4);
       }
 
       // make the wire
diff --git a/tests/bugs/modalg_6/bug27674 b/tests/bugs/modalg_6/bug27674
new file mode 100644 (file)
index 0000000..edc996b
--- /dev/null
@@ -0,0 +1,47 @@
+puts "============"
+puts "OCC27674"
+puts "============"
+puts ""
+############################################################################
+# BRepOffsetAPI_ThruSections make invalid
+# shape if sections are connected at ends
+############################################################################
+
+restore [locate_data_file bug27674_CircleLineWires.brep] a
+
+explode a
+wire w a_1 a_2
+explode w
+wire a1 w_1
+wire a2 w_2
+thrusections r 0 0 a1 a2
+checkshape r
+
+checknbshapes r -vertex 2 -edge 4
+
+puts "Check that edges degenerated and has no 3d curve..."
+explode r E
+if [regexp {degenerated} [dump r_2]] {
+   puts "OK: r_2 is a degenerated edge."
+   if [catch {mkcurve c1 r_2} catch_result] {
+      puts "OK: r_2 has no 3d curve."
+   } else {
+      puts "Faulty: r_2 has 3d curve"
+   }
+} else {
+   puts "Faulty: r_2 is not degenerated edge."
+}
+
+if [regexp {degenerated} [dump r_4]] {
+   puts "OK: r_4 is a degenerated edge."
+   if [catch {mkcurve c1 r_4} catch_result] {
+      puts "OK: r_4 has no 3d curve."
+   } else {
+      puts "Faulty: r_4 has 3d curve"
+   }
+} else {
+   puts "Faulty: r_4 is not degenerated edge."
+}
+
+checkview -display r -2d -path ${imagedir}/${test_image}.png
+