From: nbv Date: Wed, 6 Jul 2016 13:42:19 +0000 (+0300) Subject: 0027664: Incomplete intersection curve from the attached shapes X-Git-Tag: V7_1_0_beta~255 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=f7991731de17c77aeb59860ea8efa367f9487c1e 0027664: Incomplete intersection curve from the attached shapes 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. --- diff --git a/src/IntPatch/IntPatch_RstInt.cxx b/src/IntPatch/IntPatch_RstInt.cxx index c2d9a98fbf..9b66768053 100644 --- a/src/IntPatch/IntPatch_RstInt.cxx +++ b/src/IntPatch/IntPatch_RstInt.cxx @@ -47,6 +47,8 @@ #include #include +#include + #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 index 0000000000..6639479167 --- /dev/null +++ b/tests/bugs/modalg_6/bug27664_1 @@ -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 index 0000000000..b1ab6bf1a5 --- /dev/null +++ b/tests/bugs/modalg_6/bug27664_2 @@ -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