From: emv Date: Thu, 11 Aug 2016 08:55:29 +0000 (+0300) Subject: 0027761: Intersection loops infinitely X-Git-Tag: V7_1_0_beta~202 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=7cb2f40993b9699ca7dc80b5f3c54662d9e345dd;p=occt.git 0027761: Intersection loops infinitely The static method CorrectSurfaceBoundaries() in the class IntTools_FaceFace, which is used for correction of the boundaries of the faces before their intersection, contains two inconsistent adjustments of the boundaries of the faces based on periodic surfaces. One of these adjustments has been removed. The remaining adjustment, the one that is based on the 2D bounding boxes of the closed curves, should be sufficient. Test case for the issue. --- diff --git a/src/IntTools/IntTools_FaceFace.cxx b/src/IntTools/IntTools_FaceFace.cxx index be31b1339a..166b4f15a6 100644 --- a/src/IntTools/IntTools_FaceFace.cxx +++ b/src/IntTools/IntTools_FaceFace.cxx @@ -2381,59 +2381,6 @@ Handle(Geom_Curve) MakeBSpline (const Handle(IntPatch_WLine)& WL, } } // - { - Standard_Integer aNbP; - Standard_Real aXP, dXfact, aXmid, aX1, aX2, aTolPA; - // - aTolPA=Precision::Angular(); - // U - if (isuperiodic) { - aXP=anAdaptorSurface.UPeriod(); - dXfact=theumax-theumin; - if (dXfact-aTolPA>aXP) { - aXmid=0.5*(theumax+theumin); - aNbP=RealToInt(aXmid/aXP); - if (aXmid<0.) { - aNbP=aNbP-1; - } - aX1=aNbP*aXP; - if (theumin>aTolPA) { - aX1=theumin+aNbP*aXP; - } - aX2=aX1+aXP; - if (theuminaX2) { - theumax=aX2; - } - } - } - // V - if (isvperiodic) { - aXP=anAdaptorSurface.VPeriod(); - dXfact=thevmax-thevmin; - if (dXfact-aTolPA>aXP) { - aXmid=0.5*(thevmax+thevmin); - aNbP=RealToInt(aXmid/aXP); - if (aXmid<0.) { - aNbP=aNbP-1; - } - aX1=aNbP*aXP; - if (thevmin>aTolPA) { - aX1=thevmin+aNbP*aXP; - } - aX2=aX1+aXP; - if (thevminaX2) { - thevmax=aX2; - } - } - } - } - // if(isuperiodic || isvperiodic) { Standard_Boolean correct = Standard_False; Standard_Boolean correctU = Standard_False; @@ -2488,16 +2435,13 @@ Handle(Geom_Curve) MakeBSpline (const Handle(IntPatch_WLine)& WL, aBox.Get(umin, vmin, umax, vmax); if(isuperiodic && correctU) { - if(theumin < umin) theumin = umin; - if(theumax > umax) { theumax = umax; } } if(isvperiodic && correctV) { - if(thevmin < vmin) thevmin = vmin; if(thevmax > vmax) diff --git a/tests/bugs/modalg_6/bug27761 b/tests/bugs/modalg_6/bug27761 new file mode 100644 index 0000000000..68222063ea --- /dev/null +++ b/tests/bugs/modalg_6/bug27761 @@ -0,0 +1,19 @@ +puts "TODO OCC27766 ALL: Error : The command is not valid. The length is 0." +puts "TODO OCC27766 ALL: Error : The length of result shape is" + +puts "========" +puts "OCC27761" +puts "========" +puts "" +################################################# +# Intersection loops infinitely +################################################# + +restore [locate_data_file bug27761_c1.brep] c1 +restore [locate_data_file bug27761_c2.brep] c2 + +bsection result c1 c2 + +checkshape result +# approximate theoretical length of the result +checkprops result -l 0.00201518 \ No newline at end of file