0027664: Incomplete intersection curve from the attached shapes
authornbv <nbv@opencascade.com>
Wed, 6 Jul 2016 13:42:19 +0000 (16:42 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 14 Jul 2016 10:05:15 +0000 (13:05 +0300)
Computation of correct offset values in order to make correspondence (with adjusting to periods) between Domain of WLine and surface domain.

Creation of test cases for this issue.

Small correction in the test case.

src/IntPatch/IntPatch_RstInt.cxx
tests/bugs/modalg_6/bug27664_1 [new file with mode: 0644]
tests/bugs/modalg_6/bug27664_2 [new file with mode: 0644]

index c2d9a98..9b66768 100644 (file)
@@ -47,6 +47,8 @@
 #include <TColgp_SequenceOfPnt.hxx>
 #include <TColgp_SequenceOfPnt2d.hxx>
 
+#include <ElCLib.hxx>
+
 #define myInfinite 1.e15 // the same as was in Adaptor3d_TopolTool
 
 static void Recadre(GeomAbs_SurfaceType typeS1,
@@ -589,29 +591,40 @@ void IntPatch_RstInt::PutVertexOnLine (const Handle(IntPatch_Line)& L,
     }
 
     Bnd_Box2d BPLin = PLin.Bounding();
-
-    if(SurfaceIsPeriodic) { 
-      Standard_Real xmin,ymin,xmax,ymax,g;
-      BPLin.Get(xmin,ymin,xmax,ymax);
-      g = BPLin.GetGap();
-      BPLin.SetVoid();
-      BPLin.Update(xmin-M_PI-M_PI,ymin,
-                  xmax+M_PI+M_PI,ymax);
-      BPLin.SetGap(g);
-    }
-    if(SurfaceIsBiPeriodic) { 
-      Standard_Real xmin,ymin,xmax,ymax,g;
-      BPLin.Get(xmin,ymin,xmax,ymax);
-      g = BPLin.GetGap();
-      BPLin.SetVoid();
-      BPLin.Update(xmin,ymin-M_PI-M_PI,
-                  xmax,ymax+M_PI+M_PI);
-      BPLin.SetGap(g);
-    }
+    Standard_Real OffsetV = 0.0;
+    Standard_Real OffsetU = 0.0;
 
     switch(arc->GetType())
     { 
-      case GeomAbs_Line: NbEchant=10; break;
+      case GeomAbs_Line:
+        {
+          NbEchant=10;
+          
+          Standard_Real aXmin, aYmin, aXmax, aYmax;
+          BPLin.Get(aXmin, aYmin, aXmax, aYmax);
+          gp_Lin2d aLin = arc->Curve2d().Line();
+          const gp_Pnt2d& aLoc = aLin.Location();
+          const gp_Dir2d& aDir = aLin.Direction();
+
+          //Here, we consider rectangular axis-aligned domain only.
+          const Standard_Boolean isAlongU = (Abs(aDir.X()) > Abs(aDir.Y()));
+
+          if(SurfaceIsPeriodic && !isAlongU)
+          {
+            //Shift along U-direction
+            const Standard_Real aNewLocation = 
+                      ElCLib::InPeriod(aLoc.X(), aXmin, aXmin + M_PI + M_PI);
+            OffsetU = aNewLocation - aLoc.X();
+          }
+          else if(SurfaceIsBiPeriodic && isAlongU)
+          {
+            //Shift along V-direction
+            const Standard_Real aNewLocation = 
+                      ElCLib::InPeriod(aLoc.Y(), aYmin, aYmin + M_PI + M_PI);
+            OffsetV = aNewLocation - aLoc.Y();
+          }
+        }
+        break;
       case GeomAbs_BezierCurve:
       {
         NbEchant = (3 + arc->NbPoles());
@@ -634,26 +647,45 @@ void IntPatch_RstInt::PutVertexOnLine (const Handle(IntPatch_Line)& L,
       }
     }
 
+    if(SurfaceIsPeriodic) { 
+      Standard_Real xmin,ymin,xmax,ymax,g;
+      BPLin.Get(xmin,ymin,xmax,ymax);
+      g = BPLin.GetGap();
+      BPLin.SetVoid();
+      BPLin.Update(xmin-M_PI-M_PI,ymin,
+                  xmax+M_PI+M_PI,ymax);
+      BPLin.SetGap(g);
+    }
+    if(SurfaceIsBiPeriodic) { 
+      Standard_Real xmin,ymin,xmax,ymax,g;
+      BPLin.Get(xmin,ymin,xmax,ymax);
+      g = BPLin.GetGap();
+      BPLin.SetVoid();
+      BPLin.Update(xmin,ymin-M_PI-M_PI,
+                  xmax,ymax+M_PI+M_PI);
+      BPLin.SetGap(g);
+    }
+
     IntPatch_PolyArc Brise(arc,NbEchant,PFirst,PLast,BPLin);
 
     Standard_Integer IndiceOffsetBiPeriodic = 0;    
-    Standard_Integer IndiceOffsetPeriodic   = 0;    
-    Standard_Real OffsetV = 0.0;
-    Standard_Real OffsetU = 0.0;
-    
+    Standard_Integer IndiceOffsetPeriodic   = 0;
+    const Standard_Real aRefOU = OffsetU,
+                        aRefOV = OffsetV;
+
     do { 
       if(IndiceOffsetBiPeriodic == 1) 
-       OffsetV = -M_PI-M_PI;
+        OffsetV = aRefOV - M_PI - M_PI;
       else if(IndiceOffsetBiPeriodic == 2) 
-       OffsetV = M_PI+M_PI;
-      
+        OffsetV = aRefOV + M_PI + M_PI;
+
       do { 
-       if(IndiceOffsetPeriodic == 1) 
-         OffsetU = -M_PI-M_PI;
-       else if(IndiceOffsetPeriodic == 2) 
-         OffsetU = M_PI+M_PI;
-       
-       Brise.SetOffset(OffsetU,OffsetV);
+        if(IndiceOffsetPeriodic == 1) 
+          OffsetU = aRefOU - M_PI - M_PI;
+        else if(IndiceOffsetPeriodic == 2) 
+          OffsetU = aRefOU + M_PI + M_PI;
+
+        Brise.SetOffset(OffsetU,OffsetV);
        
        static int debug_polygon2d =0;
        if(debug_polygon2d) { 
diff --git a/tests/bugs/modalg_6/bug27664_1 b/tests/bugs/modalg_6/bug27664_1
new file mode 100644 (file)
index 0000000..6639479
--- /dev/null
@@ -0,0 +1,56 @@
+puts "========"
+puts "OCC27664"
+puts "========"
+puts ""
+#################################################
+# Incomplete intersection curve from the attached shapes
+#################################################
+
+set ExpTol 1.0e-7
+set GoodNbCurv 3
+set GoodLength 0.6288896355727489
+
+restore [locate_data_file bug27664_pl0.brep] pl0
+restore [locate_data_file bug27664_nsh_8.brep] nsh_8
+explode nsh_8 f
+explode pl0 f
+
+set log [bopcurves pl0_1 nsh_8_4 -2d]
+
+regexp {Tolerance Reached=+([-0-9.+eE]+)\n+([-0-9.+eE]+)} ${log} full Toler NbCurv
+
+if {${NbCurv} != ${GoodNbCurv}} {
+  puts "Error: Number of curves is bad!"
+}
+
+checkreal TolReached $Toler $ExpTol 0.0 0.1
+
+set clen 0.0
+
+for {set ic 1} { $ic <= ${NbCurv} } { incr ic} {
+  
+  set le [length c_$ic]
+  regexp "The length c_$ic is +(\[-0-9.+eE\]+)" ${le} full ll
+  
+  puts "ll = $ll"
+  
+  set clen [expr $clen+$ll]
+}
+
+puts "Summary length = $clen"
+
+checkreal Length $clen $GoodLength 0.0 1.0e-5
+
+smallview
+don c_*
+fit
+display pl0_1 nsh_8_4
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}_1.png
+
+top
+don c_*
+fit
+display pl0_1 nsh_8_4
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}_2.png
diff --git a/tests/bugs/modalg_6/bug27664_2 b/tests/bugs/modalg_6/bug27664_2
new file mode 100644 (file)
index 0000000..b1ab6bf
--- /dev/null
@@ -0,0 +1,38 @@
+puts "========"
+puts "OCC27664"
+puts "========"
+puts ""
+#################################################
+# Incomplete intersection curve from the attached shapes
+#################################################
+
+restore [locate_data_file bug27664_pl0.brep] pl0
+restore [locate_data_file bug27664_nsh_8.brep] nsh_8
+
+bclearobjects
+bcleartools
+
+baddobjects pl0
+baddtools nsh_8
+
+bfillds
+
+# section
+bbop rs 4
+
+if { [string compare -nocase [checksection rs] " nb alone Vertices : 0\n\n"] } {
+  puts "ERROR: the section is not closed"
+} else {
+  puts "The section is OK"
+}
+
+# cut
+bbop result 2
+
+smallview
+donly result
+fit
+
+checkview -screenshot -2d -path ${imagedir}/${test_image}.png
+
+checkprops result -s 33.8629