diff --git a/src/GeomFill/GeomFill_CorrectedFrenet.cxx b/src/GeomFill/GeomFill_CorrectedFrenet.cxx index 4bf7413036..5ed15909cb 100644 --- a/src/GeomFill/GeomFill_CorrectedFrenet.cxx +++ b/src/GeomFill/GeomFill_CorrectedFrenet.cxx @@ -882,7 +882,7 @@ Standard_Real GeomFill_CorrectedFrenet::GetAngleAT(const Standard_Real Param) co frenet->Intervals(FrenetInt, S); EvolAroundT->Intervals(LawInt, S); - GeomLib::FuseIntervals(FrenetInt, LawInt, Fusion); + GeomLib::FuseIntervals(FrenetInt, LawInt, Fusion, Precision::PConfusion(), Standard_True); return Fusion.Length()-1; } @@ -913,7 +913,7 @@ Standard_Real GeomFill_CorrectedFrenet::GetAngleAT(const Standard_Real Param) co frenet->Intervals(FrenetInt, S); EvolAroundT->Intervals(LawInt, S); - GeomLib::FuseIntervals(FrenetInt, LawInt, Fusion); + GeomLib::FuseIntervals(FrenetInt, LawInt, Fusion, Precision::PConfusion(), Standard_True); for(Standard_Integer i = 1; i <= Fusion.Length(); i++) T.ChangeValue(i) = Fusion.Value(i); diff --git a/src/GeomFill/GeomFill_Frenet.cxx b/src/GeomFill/GeomFill_Frenet.cxx index 5ca4c9eec0..568061a0a4 100644 --- a/src/GeomFill/GeomFill_Frenet.cxx +++ b/src/GeomFill/GeomFill_Frenet.cxx @@ -692,7 +692,7 @@ Standard_Boolean myCurve->Intervals(TrimInt, tmpS); TColStd_SequenceOfReal Fusion; - GeomLib::FuseIntervals(TrimInt, mySngl->Array1(), Fusion); + GeomLib::FuseIntervals(TrimInt, mySngl->Array1(), Fusion, Precision::PConfusion(), Standard_True); return Fusion.Length() - 1; } @@ -726,7 +726,7 @@ Standard_Boolean myCurve->Intervals(TrimInt, tmpS); TColStd_SequenceOfReal Fusion; - GeomLib::FuseIntervals(TrimInt, mySngl->Array1(), Fusion); + GeomLib::FuseIntervals(TrimInt, mySngl->Array1(), Fusion, Precision::PConfusion(), Standard_True); for (Standard_Integer i = 1; i <= Fusion.Length(); i++) T.ChangeValue(i) = Fusion.Value(i); diff --git a/src/GeomLib/GeomLib.cxx b/src/GeomLib/GeomLib.cxx index f357273633..a2989bfb86 100644 --- a/src/GeomLib/GeomLib.cxx +++ b/src/GeomLib/GeomLib.cxx @@ -415,7 +415,8 @@ void GeomLib::DensifyArray1OfReal(const Standard_Integer MinNumPoints, void GeomLib::FuseIntervals(const TColStd_Array1OfReal& I1, const TColStd_Array1OfReal& I2, TColStd_SequenceOfReal& Seq, - const Standard_Real Epspar) + const Standard_Real Epspar, + const Standard_Boolean IsAdjustToFirstInterval) { Standard_Integer ind1=1, ind2=1; Standard_Real v1, v2; @@ -432,7 +433,14 @@ void GeomLib::FuseIntervals(const TColStd_Array1OfReal& I1, v2 = I2(ind2); if (Abs(v1-v2)<= Epspar) { // Ici les elements de I1 et I2 conviennent . - Seq.Append((v1+v2)/2); + if (IsAdjustToFirstInterval) + { + Seq.Append(v1); + } + else + { + Seq.Append((v1 + v2) / 2); + } ind1++; ind2++; } diff --git a/src/GeomLib/GeomLib.hxx b/src/GeomLib/GeomLib.hxx index f77b997c7b..bddd150767 100644 --- a/src/GeomLib/GeomLib.hxx +++ b/src/GeomLib/GeomLib.hxx @@ -170,7 +170,19 @@ public: //! non decreasing Standard_EXPORT static void DensifyArray1OfReal (const Standard_Integer MinNumPoints, const TColStd_Array1OfReal& InParameters, Handle(TColStd_HArray1OfReal)& OutParameters); - Standard_EXPORT static void FuseIntervals (const TColStd_Array1OfReal& Interval1, const TColStd_Array1OfReal& Interval2, TColStd_SequenceOfReal& Fusion, const Standard_Real Confusion = 1.0e-9); + //! This method fuse intervals Interval1 and Interval2 with specified Confusion + //! @param Interval1 [in] first interval to fuse + //! @param Interval2 [in] second interval to fuse + //! @param Confision [in] tolerance to compare intervals + //! @param IsAdjustToFirstInterval [in] flag to set method of fusion, if intervals are close + //! if false, intervals are fusing by half-division methdod + //! if true, intervals are fusing by selecting value from Interval1 + //! @param Fusion [out] output interval + Standard_EXPORT static void FuseIntervals (const TColStd_Array1OfReal& Interval1, + const TColStd_Array1OfReal& Interval2, + TColStd_SequenceOfReal& Fusion, + const Standard_Real Confusion = 1.0e-9, + const Standard_Boolean IsAdjustToFirstInterval = Standard_False); //! this will compute the maximum distance at the //! parameters given in the Parameters array by diff --git a/tests/pipe/bugs/bug29645 b/tests/pipe/bugs/bug29645 new file mode 100644 index 0000000000..9ec819f4f6 --- /dev/null +++ b/tests/pipe/bugs/bug29645 @@ -0,0 +1,15 @@ +puts "========" +puts "0029645: Hang on making pipe shell using BRepOffsetAPI_MakePipeShell" +puts "========" +puts "" + +restore [locate_data_file bug29645_spine.brep] spine +restore [locate_data_file bug29645_profile.brep] profile + +mksweep spine +addsweep profile +buildsweep result -S -C + +puts "TEST COMPLETED" + +