diff --git a/src/IntPatch/IntPatch_WLineTool.cxx b/src/IntPatch/IntPatch_WLineTool.cxx index 4ebe1e4136..5e9e0103cc 100644 --- a/src/IntPatch/IntPatch_WLineTool.cxx +++ b/src/IntPatch/IntPatch_WLineTool.cxx @@ -385,11 +385,34 @@ static Standard_Boolean IsInsideIn3d(const gp_Pnt& aBasePnt, static const Standard_Integer aMinNbBadDistr = 15; static const Standard_Integer aNbSingleBezier = 30; +//========================================================================= +// function : IsSurfPlaneLike +// purpose : Define is surface plane like or not. +// Static subfunction in DeleteByTube. +//========================================================================= +static Standard_Boolean IsSurfPlaneLike(const Handle(Adaptor3d_Surface) &theS) +{ + if (theS->GetType() == GeomAbs_Plane) + { + return Standard_True; + } + + if (theS->GetType() == GeomAbs_BSplineSurface) + { + if (theS->UDegree() == 1 && theS->VDegree() == 1) + { + return Standard_True; + } + } + + return Standard_False; +} //========================================================================= // function : DeleteByTube // purpose : Check and delete points using tube criteria. // Static subfunction in ComputePurgedWLine. //========================================================================= + static Handle(IntPatch_WLine) DeleteByTube(const Handle(IntPatch_WLine) &theWLine, const Handle(Adaptor3d_Surface) &theS1, @@ -419,6 +442,7 @@ static Handle(IntPatch_WLine) gp_Vec2d aBase2dVec2(UonS2[1] - UonS2[0], VonS2[1] - VonS2[0]); gp_Pnt aBase3dPnt = theWLine->Point(1).Value(); gp_Vec aBase3dVec(theWLine->Point(1).Value(), theWLine->Point(2).Value()); + Standard_Real aPrevStep = aBase3dVec.SquareMagnitude(); // Choose base tolerance and scale it to pipe algorithm. const Standard_Real aBaseTolerance = Precision::Approximation(); @@ -431,6 +455,8 @@ static Handle(IntPatch_WLine) Standard_Real aTol3d = aBaseTolerance * aBaseTolerance; const Standard_Real aLimitCoeff = 0.99 * 0.99; + const Standard_Real aMaxSqrRatio = 15. * 15.; + Standard_Boolean isPlanePlane = IsSurfPlaneLike(theS1) && IsSurfPlaneLike(theS2); for(i = 3; i <= theWLine->NbPnts(); i++) { Standard_Boolean isDeleteState = Standard_False; @@ -466,14 +492,27 @@ static Handle(IntPatch_WLine) if (Min(aStepOnS1, aStepOnS2) >= aLimitCoeff * Max(aStepOnS1, aStepOnS2)) { // Set hash flag to "Delete" state. - isDeleteState = Standard_True; - aNewPointsHash.SetValue(i - 1, 1); + Standard_Real aCurrStep = aBase3dPnt.SquareDistance(aPnt3d); + Standard_Real aSqrRatio = 0.; + if (!isPlanePlane) + { + aSqrRatio = aPrevStep / aCurrStep; + if (aSqrRatio < 1.) + { + aSqrRatio = 1. / aSqrRatio; + } + } + if (aSqrRatio < aMaxSqrRatio) + { + isDeleteState = Standard_True; + aNewPointsHash.SetValue(i - 1, 1); - // Change middle point. - UonS1[1] = UonS1[2]; - UonS2[1] = UonS2[2]; - VonS1[1] = VonS1[2]; - VonS2[1] = VonS2[2]; + // Change middle point. + UonS1[1] = UonS1[2]; + UonS2[1] = UonS2[2]; + VonS1[1] = VonS1[2]; + VonS2[1] = VonS2[2]; + } } } @@ -497,6 +536,8 @@ static Handle(IntPatch_WLine) aBase3dPnt = theWLine->Point(i - 1).Value(); aBase3dVec = gp_Vec(theWLine->Point(i - 1).Value(), theWLine->Point(i).Value()); + aPrevStep = aBase3dVec.SquareMagnitude(); + aNbPnt++; } } diff --git a/tests/bugs/modalg_7/bug32569 b/tests/bugs/modalg_7/bug32569 new file mode 100644 index 0000000000..4f3bfc6338 --- /dev/null +++ b/tests/bugs/modalg_7/bug32569 @@ -0,0 +1,16 @@ +puts "=================================================" +puts "0032569: Modeling Algorithm - Section not found" +puts "=================================================" +puts "" + +restore [locate_data_file bug32569.brep] s +explode s + +bop s_1 s_2 +bopsection result + +checknbshapes result -vertex 2 -edge 1 + +checkmaxtol result -min_tol 4.5e-4 + +checkprops result -l 5.5227 diff --git a/tests/lowalgos/intss/bug29972_1 b/tests/lowalgos/intss/bug29972_1 index 3e14357e2b..ffc0987898 100644 --- a/tests/lowalgos/intss/bug29972_1 +++ b/tests/lowalgos/intss/bug29972_1 @@ -37,8 +37,8 @@ while { $AllowRepeat != 0 } { puts "Error: Wrong curve's range!" } - xdistcs res_$ic s1 U1 U2 100 2.0e-6 - xdistcs res_$ic s2 U1 U2 100 2.0e-6 + xdistcs res_$ic s1 U1 U2 100 3.0e-6 + xdistcs res_$ic s2 U1 U2 100 3.0e-6 mkedge ee res_$ic baddobjects ee