]> 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>
Fri, 14 May 2021 17:43:58 +0000 (20:43 +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 accb9fb5ebdec2440a71766a351ded4d8138e819..b3dbcdb33aecb59f3ad832d44e06a3e6db8ce139 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 04f82610e1fd84cf6e448567879ec74036fe11d9..a541ddcf34d55bd092770903c81f29db7150887a 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 7563ccaadf564d7440fc8f16856cc41bdc244320..e1646bc09838d86257b9b3b53302bc42f59a53fa 100644 (file)
@@ -412,7 +412,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;
@@ -429,7 +430,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 3ed9415b27f1b73ce9865e50f32a98baf6eec9d8..d83e4ef08a6ee0674dc3b47d2ee345472c7c60a2 100644 (file)
@@ -164,7 +164,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"
+
+