]> OCCT Git - occt.git/commitdiff
0029645: Hang on making pipe shell using BRepOffsetAPI_MakePipeShell
authorakaftasev <akaftasev@opencascade.com>
Tue, 4 May 2021 10:28:25 +0000 (13:28 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 29 Jul 2021 09:48:22 +0000 (12:48 +0300)
Added new boolean parameter to GeomLib::FuseIntervals() to select method of defining an element with close values

src/GeomFill/GeomFill_CorrectedFrenet.cxx
src/GeomFill/GeomFill_Frenet.cxx
src/GeomLib/GeomLib.cxx
src/GeomLib/GeomLib.hxx
tests/pipe/bugs/bug29645 [new file with mode: 0644]

index 4bf7413036a635e1a2fe5715ef9c917a662e0c11..5ed15909cb59156b9a6620786f027e3e1e92c12f 100644 (file)
@@ -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);
index 5ca4c9eec04b2b1a58ef913bec03574bd79056c6..568061a0a483ca27ef1b9e98e55d8ce834d80c14 100644 (file)
@@ -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);
index f357273633dbdf9dc505d0a587e2bd0fab009171..a2989bfb862b58e5bb35c5e5e3dc55eb251286cb 100644 (file)
@@ -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++;
        }
index f77b997c7b6340ef6e751c434dee8a113f8f5469..bddd150767ffbf7c2b0d772d5d431c2be81cac51 100644 (file)
@@ -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 (file)
index 0000000..9ec819f
--- /dev/null
@@ -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"
+
+