From de09d2a2a0f14a3c9a3775336da0b51a507936ee Mon Sep 17 00:00:00 2001
From: jgv <jgv@opencascade.com>
Date: Thu, 21 Nov 2013 15:11:49 +0400
Subject: [PATCH] 0024360: Hang up trying to intersect two faces

Added test case bugs/modalg_5/bug24360
---
 src/IntWalk/IntWalk_IWalking_4.gxx |  4 ++--
 src/IntWalk/IntWalk_IWalking_5.gxx | 11 ++++++++---
 tests/bugs/modalg_5/bug24360       | 17 +++++++++++++++++
 3 files changed, 27 insertions(+), 5 deletions(-)
 create mode 100644 tests/bugs/modalg_5/bug24360

diff --git a/src/IntWalk/IntWalk_IWalking_4.gxx b/src/IntWalk/IntWalk_IWalking_4.gxx
index 849ce9080f..d059cbd056 100755
--- a/src/IntWalk/IntWalk_IWalking_4.gxx
+++ b/src/IntWalk/IntWalk_IWalking_4.gxx
@@ -51,8 +51,8 @@ void IntWalk_IWalking::ComputeCloseLine(const TColStd_SequenceOfReal& Umult,
   Standard_Real aBornInf[2], aBornSup[2], aUVap[2];
   math_Vector BornInf(aBornInf,1,2), BornSup(aBornSup,1,2);
   math_Vector Uvap(aUVap,1,2);// parameters of current approach
-  Standard_Real PasC;  // rate of advancement on the tangent
-  Standard_Real PasCu; // rate of advancement current by U
+  Standard_Real PasC;  // step of advancement on the tangent
+  Standard_Real PasCu; // step of advancement current by U
   Standard_Real PasCv; // step of advancement current by V
   Standard_Real PasSav; // save first step of advancement
   Standard_Boolean Arrive;// show if line ends
diff --git a/src/IntWalk/IntWalk_IWalking_5.gxx b/src/IntWalk/IntWalk_IWalking_5.gxx
index 4fc36d9f9e..ffc883b06b 100755
--- a/src/IntWalk/IntWalk_IWalking_5.gxx
+++ b/src/IntWalk/IntWalk_IWalking_5.gxx
@@ -255,10 +255,15 @@ IntWalk_StatusDeflection IntWalk_IWalking::TestDeflection
 	
       }
       else {
-//	if (FlecheCourante > fleche) {  // not too great
-	if (FlecheCourante > fleche*fleche) {  // not too great
+//	if (FlecheCourante > fleche) {  // step too great
+	if (FlecheCourante > fleche*fleche) {  // step too great
 	  Step = Step /2.;
-	  Status = IntWalk_PasTropGrand;
+          StepU = Abs(Step*previousd2d.X());
+          StepV = Abs(Step*previousd2d.Y());
+          if (StepU < tolerance(1) && StepV < tolerance(2)) 
+            Status = IntWalk_ArretSurPointPrecedent;
+          else 
+            Status = IntWalk_PasTropGrand;
 	}
 	else {
 	  Standard_Real d2dx = Abs(sp.Direction2d().X()); 
diff --git a/tests/bugs/modalg_5/bug24360 b/tests/bugs/modalg_5/bug24360
new file mode 100644
index 0000000000..ce860493c7
--- /dev/null
+++ b/tests/bugs/modalg_5/bug24360
@@ -0,0 +1,17 @@
+puts "============"
+puts "OCC24360"
+puts "============"
+puts ""
+######################################################
+# Hang up trying to intersect two faces
+######################################################
+
+restore [locate_data_file bug24360_Face_1.brep] b1
+restore [locate_data_file bug24360_Face_2.brep] b2
+
+bop b1 b2
+bopfuse result
+
+set square 92255.4
+set 2dviewer 1
+