]> OCCT Git - occt.git/commitdiff
0033226: Data Exchange - Infinite loop in HLRBRep_InternalAlgo::Update() generating... CR33226
authordorlov <dorlov@opencascade.com>
Fri, 10 Feb 2023 15:15:40 +0000 (15:15 +0000)
committerdorlov <dorlov@opencascade.com>
Tue, 7 Mar 2023 16:48:48 +0000 (16:48 +0000)
Infinite loop is removed from IntWalk_IWalking::ComputeOpenLine method test case was created

src/IntWalk/IntWalk_IWalking_3.gxx
tests/hlr/exact_hlr/bug33226 [new file with mode: 0644]

index 224d2575086b578ad34fa70310aa0a6c45bc879b..d9ac58f80e5f5e520f34a408dd5d7cc576cbca3f 100644 (file)
@@ -66,7 +66,7 @@ void IntWalk_IWalking::ComputeOpenLine(const TColStd_SequenceOfReal& Umult,
   Standard_Integer I = 0, N = 0, SaveN = 0;
   Standard_Real aBornInf[2] = {}, aBornSup[2] = {}, aUVap[2] = {};
   math_Vector BornInf(aBornInf,1,2), BornSup(aBornSup,1,2), UVap(aUVap,1,2);
-  Standard_Real PasC = 0.0, PasCu = 0.0, PasCv = 0.0;
+  Standard_Real PasC = 0.0, PasCPrev = 0.0, PasCu = 0.0, PasCv = 0.0;
   Standard_Boolean Arrive = false; // shows if the line ends
   Standard_Boolean Cadre = false;  // shows if one is on border of the domain
   Standard_Boolean ArretAjout = false;  //shows if one is on added point
@@ -171,6 +171,7 @@ void IntWalk_IWalking::ComputeOpenLine(const TColStd_SequenceOfReal& Umult,
       // modified by NIZHNY-MKK  Fri Oct 27 12:39:37 2000
       Standard_Integer IndexOfPathPointDoNotCheck=0;
       Standard_Integer aNbIter = 10;
+      Standard_Boolean aSamePasC = Standard_False;
       while (!Arrive) { //    as one of stop tests is not checked
         Cadre = Cadrage(BornInf,BornSup,UVap,PasC,StepSign);
         //  Border?
@@ -190,10 +191,14 @@ void IntWalk_IWalking::ComputeOpenLine(const TColStd_SequenceOfReal& Umult,
         }
         if (Rsnld.IsDone()) {
           if (Abs(Func.Root()) > Func.Tolerance()) {
+            if (Abs(PasC - PasCPrev) < Precision::Confusion())
+              aSamePasC = Standard_True;
+            PasCPrev = PasC;
             PasC = PasC / 2.0;
             PasCu = Abs(PasC*previousd2d.X());
             PasCv = Abs(PasC*previousd2d.Y());
-            if (PasCu <= tolerance(1) && PasCv <= tolerance(2)) {
+            if ((PasCu <= tolerance(1) && PasCv <= tolerance(2)) || (Cadre && aSamePasC))
+            {
               if (CurrentLine->NbPoints() == 1) break;
               Arrive = Standard_True;
               CurrentLine->AddStatusLast(Standard_False);
@@ -201,7 +206,7 @@ void IntWalk_IWalking::ComputeOpenLine(const TColStd_SequenceOfReal& Umult,
               Rajout = Standard_True;
               seqAlone.Append(lines.Length() + 1);
               seqAjout.Append(lines.Length() + 1);
-            }  
+            }
           }
           else { // test stop
             Rsnld.Root(UVap);
diff --git a/tests/hlr/exact_hlr/bug33226 b/tests/hlr/exact_hlr/bug33226
new file mode 100644 (file)
index 0000000..2abc8c2
--- /dev/null
@@ -0,0 +1,10 @@
+puts "====================================="
+puts "OCC33226: Data Exchange - Infinite loop in HLRBRep_InternalAlgo::Update() generating 2D view of right hand side from STEP file"
+puts "====================================="
+puts "" 
+
+set viewname "vright" 
+set length 45.4352
+
+restore [locate_data_file bug33226_1189.brep] a
+COMPUTE_HLR $viewname $algotype 
\ No newline at end of file