]> OCCT Git - occt.git/commitdiff
0026837: SameParameter algorithm throws an exception
authorifv <ifv@opencascade.com>
Tue, 17 Nov 2015 07:53:51 +0000 (10:53 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 22 Dec 2015 15:04:39 +0000 (18:04 +0300)
Test case for issue CR26837

src/GeomLib/GeomLib.cxx
tests/bugs/moddata_3/bug26837 [new file with mode: 0644]

index 2bd44e6c4a9ce1d9abc56dd01d3e0309fec17a14..063748f3be5ba31135a69ed4b5e94a8d42e3f60c 100644 (file)
@@ -882,83 +882,91 @@ void GeomLib::SameRange(const Standard_Real         Tolerance,
 {
   if(CurvePtr.IsNull()) Standard_Failure::Raise();
   if (Abs(LastOnCurve - RequestedLast) <= Tolerance &&
-      Abs(FirstOnCurve - RequestedFirst) <= Tolerance) { 
-    NewCurvePtr = CurvePtr;
-    return;
+    Abs(FirstOnCurve - RequestedFirst) <= Tolerance)
+  { 
+      NewCurvePtr = CurvePtr;
+      return;
   }
 
   // the parametrisation lentgh  must at least be the same.
   if (Abs(LastOnCurve - FirstOnCurve - RequestedLast + RequestedFirst) 
-      <= Tolerance) { 
-    if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_Line))) {
+      <= Tolerance)
+  { 
+    if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_Line)))
+    {
       Handle(Geom2d_Line) Line =
-       Handle(Geom2d_Line)::DownCast(CurvePtr->Copy());
+        Handle(Geom2d_Line)::DownCast(CurvePtr->Copy());
       Standard_Real dU = FirstOnCurve - RequestedFirst;
       gp_Dir2d D = Line->Direction() ;
       Line->Translate(dU * gp_Vec2d(D));
       NewCurvePtr = Line;
     }
-    else if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_Circle))) {
+    else if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_Circle)))
+    {
       gp_Trsf2d Trsf;
       NewCurvePtr = Handle(Geom2d_Curve)::DownCast(CurvePtr->Copy()); 
       Handle(Geom2d_Circle) Circ = 
-       Handle(Geom2d_Circle)::DownCast(NewCurvePtr);
+        Handle(Geom2d_Circle)::DownCast(NewCurvePtr);
       gp_Pnt2d P = Circ->Location();
       Standard_Real dU;
       if (Circ->Circ2d().IsDirect()) {
-       dU = FirstOnCurve - RequestedFirst;
+        dU = FirstOnCurve - RequestedFirst;
       }
       else {
-       dU = RequestedFirst - FirstOnCurve;
+        dU = RequestedFirst - FirstOnCurve;
       }
       Trsf.SetRotation(P,dU);
       NewCurvePtr->Transform(Trsf) ;
     }
-    else if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) {
+    else if (CurvePtr->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) 
+    {
       Handle(Geom2d_TrimmedCurve) TC = 
-       Handle(Geom2d_TrimmedCurve)::DownCast(CurvePtr);
+        Handle(Geom2d_TrimmedCurve)::DownCast(CurvePtr);
       GeomLib::SameRange(Tolerance,
-                        TC->BasisCurve(),
-                        FirstOnCurve  , LastOnCurve,
-                        RequestedFirst, RequestedLast,
-                        NewCurvePtr);
+        TC->BasisCurve(),
+        FirstOnCurve  , LastOnCurve,
+        RequestedFirst, RequestedLast,
+        NewCurvePtr);
       NewCurvePtr = new Geom2d_TrimmedCurve( NewCurvePtr, RequestedFirst, RequestedLast );
     }
-//
-//  attention a des problemes de limitation : utiliser le MEME test que dans
-//  Geom2d_TrimmedCurve::SetTrim car sinon comme on risque de relimite sur 
-//  RequestedFirst et RequestedLast on aura un probleme
-//
-// 
+    //
+    //  attention a des problemes de limitation : utiliser le MEME test que dans
+    //  Geom2d_TrimmedCurve::SetTrim car sinon comme on risque de relimite sur 
+    //  RequestedFirst et RequestedLast on aura un probleme
+    //
+    // 
     else if (Abs(LastOnCurve - FirstOnCurve) > Precision::PConfusion() ||
-            Abs(RequestedLast + RequestedFirst) > Precision::PConfusion()) {
-      
+             Abs(RequestedLast + RequestedFirst) > Precision::PConfusion())
+    {
+
       Handle(Geom2d_TrimmedCurve) TC =
-       new Geom2d_TrimmedCurve(CurvePtr,FirstOnCurve,LastOnCurve);
-      
+        new Geom2d_TrimmedCurve(CurvePtr,FirstOnCurve,LastOnCurve);
+
       Handle(Geom2d_BSplineCurve) BS =
-       Geom2dConvert::CurveToBSplineCurve(TC);
+        Geom2dConvert::CurveToBSplineCurve(TC);
       TColStd_Array1OfReal Knots(1,BS->NbKnots());
       BS->Knots(Knots);
-      
+
       BSplCLib::Reparametrize(RequestedFirst,RequestedLast,Knots);
-      
+
       BS->SetKnots(Knots);
       NewCurvePtr = BS;
     }
-  
   }
-  else { // On segmente le resultat
+  else 
+  { // On segmente le resultat
+    Standard_Real Udeb = Max(CurvePtr->FirstParameter(), FirstOnCurve);
+    Standard_Real Ufin = Min(CurvePtr->LastParameter(), LastOnCurve);
     Handle(Geom2d_TrimmedCurve) TC =
-      new Geom2d_TrimmedCurve( CurvePtr, FirstOnCurve, LastOnCurve );
+      new Geom2d_TrimmedCurve( CurvePtr, Udeb, Ufin );
     //
     Handle(Geom2d_BSplineCurve) BS =
       Geom2dConvert::CurveToBSplineCurve(TC);
     TColStd_Array1OfReal Knots(1,BS->NbKnots());
     BS->Knots(Knots);
-    
+
     BSplCLib::Reparametrize(RequestedFirst,RequestedLast,Knots);
-    
+
     BS->SetKnots(Knots);
     NewCurvePtr = BS;
   }
diff --git a/tests/bugs/moddata_3/bug26837 b/tests/bugs/moddata_3/bug26837
new file mode 100644 (file)
index 0000000..379b147
--- /dev/null
@@ -0,0 +1,17 @@
+puts "========================"
+puts "OCC26837"
+puts "========================"
+puts ""
+#################################################
+# SameParameter algorithm throws an exception
+#################################################
+
+restore [locate_data_file bug26837_e.brep] result
+
+if [catch {sameparameter result} catch_result] {
+    puts "Faulty : SameParameter algorithm throws an exception"
+} else {
+    puts "OK : SameParameter algorithm works properly"
+}
+
+set 2dviewer 1