0025699: Crash while importing STeP file
authorakz <akz@opencascade.com>
Fri, 13 Feb 2015 13:34:08 +0000 (16:34 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 13 Feb 2015 14:24:52 +0000 (17:24 +0300)
1) Try-catch block was added on a StepToTopoDS_TranslateEdgeLoop::Init() to
catch Standard_ConstructionError during the Curve conversion.

2) Checks of BSpline curve degree added to prevent construction error when converting edges to BSpline_Curve.
3) Warning message was added in case of incorrect curve definition.

Correct of the test cases according to the new error message added with fix

Conflicts:
tests/de/step_1/R9

Modified test cases according to new reference data

src/StepToGeom/StepToGeom_MakeBoundedCurve.cxx
src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx
tests/de/iges_3/A4
tests/de/step_1/R7
tests/de/step_2/G5
tests/de/step_2/H1

index 4deceed..5588b0e 100644 (file)
@@ -33,6 +33,7 @@
 #include <StepGeom_Polyline.hxx>
 #include <StepToGeom_MakePolyline.hxx>
 #include <StepToGeom_MakeTrimmedCurve.hxx>
+#include <Geom_BSplineCurve.hxx>
 
 #include <TColStd_HArray1OfInteger.hxx>
 #include <TColStd_HArray1OfReal.hxx>
@@ -63,8 +64,11 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
   // STEP BSplineCurve before being mapped onto CAS.CADE/SF
   if (SC->IsKind(STANDARD_TYPE(StepGeom_BezierCurve))) {
     const Handle(StepGeom_BezierCurve) BzC = Handle(StepGeom_BezierCurve)::DownCast(SC);
+    Standard_Integer aDegree = BzC->Degree();
+    if (aDegree < 1 || aDegree > Geom_BSplineCurve::MaxDegree())
+      return Standard_False;
     const Handle(StepGeom_BSplineCurveWithKnots) BSPL = new StepGeom_BSplineCurveWithKnots;
-    BSPL->SetDegree(BzC->Degree());
+    BSPL->SetDegree(aDegree);
     BSPL->SetControlPointsList(BzC->ControlPointsList());
     BSPL->SetCurveForm(BzC->CurveForm());
     BSPL->SetClosedCurve(BzC->ClosedCurve());
@@ -82,8 +86,11 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
   }
   if (SC->IsKind(STANDARD_TYPE(StepGeom_UniformCurve))) {
     const Handle(StepGeom_UniformCurve) UC = Handle(StepGeom_UniformCurve)::DownCast(SC);
+    Standard_Integer aDegree = UC->Degree();
+    if (aDegree < 1 || aDegree > Geom_BSplineCurve::MaxDegree())
+      return Standard_False;
     const Handle(StepGeom_BSplineCurveWithKnots) BSPL = new StepGeom_BSplineCurveWithKnots;
-    BSPL->SetDegree(UC->Degree());
+    BSPL->SetDegree(aDegree);
     BSPL->SetControlPointsList(UC->ControlPointsList());
     BSPL->SetCurveForm(UC->CurveForm());
     BSPL->SetClosedCurve(UC->ClosedCurve());
@@ -103,8 +110,11 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
   if (SC->IsKind(STANDARD_TYPE(StepGeom_QuasiUniformCurve))) {
     const Handle(StepGeom_QuasiUniformCurve) QUC = 
       Handle(StepGeom_QuasiUniformCurve)::DownCast(SC);
+    Standard_Integer aDegree = QUC->Degree();
+    if (aDegree < 1 || aDegree > Geom_BSplineCurve::MaxDegree())
+      return Standard_False;
     const Handle(StepGeom_BSplineCurveWithKnots) BSPL = new StepGeom_BSplineCurveWithKnots;
-    BSPL->SetDegree(QUC->Degree());
+    BSPL->SetDegree(aDegree);
     BSPL->SetControlPointsList(QUC->ControlPointsList());
     BSPL->SetCurveForm(QUC->CurveForm());
     BSPL->SetClosedCurve(QUC->ClosedCurve());
@@ -126,10 +136,13 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
   if (SC->IsKind(STANDARD_TYPE(StepGeom_UniformCurveAndRationalBSplineCurve))) {
     const Handle(StepGeom_UniformCurveAndRationalBSplineCurve) RUC = 
       Handle(StepGeom_UniformCurveAndRationalBSplineCurve)::DownCast(SC);
+    Standard_Integer aDegree = RUC->Degree();
+    if (aDegree < 1 || aDegree > Geom_BSplineCurve::MaxDegree())
+      return Standard_False;
     const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve) RBSPL = 
       new StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve;
     // Compute Knots and KnotsMultiplicity
-    const Standard_Integer nbK = RUC->NbControlPointsList() + RUC->Degree() + 1;
+    const Standard_Integer nbK = RUC->NbControlPointsList() + aDegree + 1;
     const Handle(TColStd_HArray1OfInteger) Kmult = new TColStd_HArray1OfInteger(1,nbK);
     const Handle(TColStd_HArray1OfReal) Knots = new TColStd_HArray1OfReal(1,nbK);
     for (Standard_Integer iUC = 1 ; iUC <= nbK ; iUC ++) {
@@ -137,7 +150,7 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
       Knots->SetValue(iUC, iUC - 1.);
     }
     // Initialize the BSplineCurveWithKnotsAndRationalBSplineCurve
-    RBSPL->Init(RUC->Name(), RUC->Degree(), RUC->ControlPointsList(), RUC->CurveForm(),
+    RBSPL->Init(RUC->Name(), aDegree, RUC->ControlPointsList(), RUC->CurveForm(),
                RUC->ClosedCurve(), RUC->SelfIntersect(), Kmult, Knots, StepGeom_ktUnspecified,
                RUC->WeightsData());
        return StepToGeom_MakeBSplineCurve::Convert(RBSPL,*((Handle(Geom_BSplineCurve)*)&CC));
@@ -145,20 +158,23 @@ Standard_Boolean StepToGeom_MakeBoundedCurve::Convert
   if (SC->IsKind(STANDARD_TYPE(StepGeom_QuasiUniformCurveAndRationalBSplineCurve))) {
     const Handle(StepGeom_QuasiUniformCurveAndRationalBSplineCurve) RQUC = 
       Handle(StepGeom_QuasiUniformCurveAndRationalBSplineCurve)::DownCast(SC);
+    Standard_Integer aDegree = RQUC->Degree();
+    if (aDegree < 1 || aDegree > Geom_BSplineCurve::MaxDegree())
+      return Standard_False;
     const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve) RBSPL = 
       new StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve;
     // Compute Knots and KnotsMultiplicity
-    const Standard_Integer nbK = RQUC->NbControlPointsList() - RQUC->Degree() + 1;
+    const Standard_Integer nbK = RQUC->NbControlPointsList() - aDegree + 1;
     const Handle(TColStd_HArray1OfInteger) Kmult = new TColStd_HArray1OfInteger(1,nbK);
     const Handle(TColStd_HArray1OfReal) Knots = new TColStd_HArray1OfReal(1,nbK);
     for (Standard_Integer iRQUC = 1 ; iRQUC <= nbK ; iRQUC ++) {
       Kmult->SetValue(iRQUC, 1);
       Knots->SetValue(iRQUC, iRQUC - 1.);
     }
-    Kmult->SetValue(1, RQUC->Degree() + 1);
-    Kmult->SetValue(nbK, RQUC->Degree() + 1);
+    Kmult->SetValue(1, aDegree + 1);
+    Kmult->SetValue(nbK, aDegree + 1);
     // Initialize the BSplineCurveWithKnotsAndRationalBSplineCurve
-    RBSPL->Init(RQUC->Name(), RQUC->Degree(), RQUC->ControlPointsList(), RQUC->CurveForm(),
+    RBSPL->Init(RQUC->Name(), aDegree, RQUC->ControlPointsList(), RQUC->CurveForm(),
                RQUC->ClosedCurve(), RQUC->SelfIntersect(), Kmult, Knots, StepGeom_ktUnspecified,
                RQUC->WeightsData());
        return StepToGeom_MakeBSplineCurve::Convert(RBSPL,*((Handle(Geom_BSplineCurve)*)&CC));
index 6ad9804..bc4c0c7 100644 (file)
@@ -89,6 +89,7 @@
 #include <XSAlgo.hxx>
 #include <XSAlgo_AlgoContainer.hxx>
 #include <ElCLib.hxx>
+#include <Standard_ErrorHandler.hxx>
 
 // ============================================================================
 // Method  : RemoveSinglePCurve
@@ -319,10 +320,24 @@ void StepToTopoDS_TranslateEdgeLoop::Init(const Handle(StepShape_FaceBound)& Fac
 //    }
     Handle(Geom_Curve) C1;
     if (!C.IsNull()) {
-      C1 = Handle(Geom_Curve)::DownCast (TP->FindTransient(C));
-      if (C1.IsNull()) {
-        if (StepToGeom_MakeCurve::Convert(C,C1))
-          TP->BindTransient (C,C1);
+      try
+      {
+        OCC_CATCH_SIGNALS
+        C1 = Handle(Geom_Curve)::DownCast (TP->FindTransient(C));
+        if (C1.IsNull()) {
+          if (StepToGeom_MakeCurve::Convert(C,C1))
+            TP->BindTransient (C,C1);
+          else
+            TP->AddWarning(C,"Could not convert a curve. Curve definition is incorrect");
+        }
+      }
+      catch (Standard_Failure)
+      {
+        TP->AddFail(C,"Exeption was raised. Curve geometry definition is incorrect");
+#ifdef OCCT_DEBUG
+  cout << "Warning: StepToTopoDS_TranslateEdgeLoop: Exception: ";
+  Standard_Failure::Caught()->Print(cout); cout << endl;
+#endif
       }
     }
 
index 1a79476..17bc8df 100755 (executable)
@@ -11,12 +11,12 @@ set filename BUC40132.igs
 
 set ref_data {
 DATA        : Faulties = 6  ( 0 )  Warnings = 0  ( 0 )  Summary  = 6  ( 0 )
-TPSTAT      : Faulties = 12  ( 238 )  Warnings = 470  ( 2526 )  Summary  = 482  ( 2764 )
+TPSTAT      : Faulties = 12  ( 238 )  Warnings = 470  ( 2529 )  Summary  = 482  ( 2767 )
 CHECKSHAPE  : Wires    = 3  ( 3 )  Faces    = 3  ( 3 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
-NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 0  ( 0 )  Face     = 1346  ( 1345 )   Summary  = 22207  ( 22290 )
-STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 0  ( 0 )  Face     = 1346  ( 1345 )   FreeWire = 96  ( 170 )   FreeEdge  = 1061 ( 1061 )   SharedEdge = 9265  ( 9275 )
-TOLERANCE   : MaxTol   =   0.8630766579  (    1.367916315 )  AvgTol   =   0.00803262355  (  0.008257993798 )
-LABELS      : N0Labels = 27  ( 27 )  N1Labels = 2100  ( 6099 )  N2Labels = 0  ( 0 )   TotalLabels = 2127  ( 6126 )   NameLabels = 2127  ( 2596 )   ColorLabels = 2114  ( 6125 )   LayerLabels = 2114  ( 6125 )
+NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 0  ( 0 )  Face     = 1346  ( 1345 )   Summary  = 22209  ( 22292 )
+STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 0  ( 0 )  Face     = 1346  ( 1345 )   FreeWire = 96  ( 170 )   FreeEdge  = 1061 ( 1061 )   SharedEdge = 9267  ( 9277 )
+TOLERANCE   : MaxTol   =   0.8099726869  (    1.367966665 )  AvgTol   =  0.008047307184  (  0.008376960654 )
+LABELS      : N0Labels = 27  ( 27 )  N1Labels = 2100  ( 6101 )  N2Labels = 0  ( 0 )   TotalLabels = 2127  ( 6128 )   NameLabels = 2127  ( 2596 )   ColorLabels = 2114  ( 6127 )   LayerLabels = 2114  ( 6127 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 11  ( 12 )
 COLORS      : Colors   = BLUE1 CYAN1 CYAN2 DARKGOLDENROD GREEN MAGENTA1 PALEVIOLETRED1 RED TURQUOISE2 WHITE YELLOW  ( BLUE1 CYAN1 CYAN2 DARKGOLDENROD GRAY53 GREEN MAGENTA1 PALEVIOLETRED1 RED TURQUOISE2 WHITE YELLOW )
index 8e95ed5..409a979 100644 (file)
@@ -7,7 +7,7 @@ TPSTAT      : Faulties = 0  ( 0 )  Warnings = 0  ( 0 )  Summary  = 0  ( 0 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 0 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
 NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 10  ( 10 )  Face     = 10  ( 10 )   Summary  = 125  ( 123 )
 STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 10  ( 10 )  Face     = 10  ( 10 )   FreeWire = 0  ( 0 )   FreeEdge  = 2 ( 2 )   SharedEdge = 44  ( 44 )
-TOLERANCE   : MaxTol   = 8.886924154e-05  ( 8.886893947e-05 )  AvgTol   =  2.639044083e-05  (  2.639042883e-05 )
+TOLERANCE   : MaxTol   =    0.018462436  (  0.04645590147 )  AvgTol   =  0.001814589339  (  0.007120077124 )
 LABELS      : N0Labels = 3  ( 3 )  N1Labels = 4  ( 4 )  N2Labels = 0  ( 0 )   TotalLabels = 7  ( 7 )   NameLabels = 5  ( 5 )   ColorLabels = 2  ( 2 )   LayerLabels = 0  ( 0 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 1  ( 1 )
index 11b37bc..f5cd3c7 100644 (file)
@@ -3,7 +3,7 @@ set filename Inventor_iPartExample.stp
 
 set ref_data {
 DATA        : Faulties = 0  ( 0 )  Warnings = 0  ( 0 )  Summary  = 0  ( 0 )
-TPSTAT      : Faulties = 0  ( 2 )  Warnings = 0  ( 0 )  Summary  = 0  ( 2 )
+TPSTAT      : Faulties = 0  ( 16 )  Warnings = 0  ( 0 )  Summary  = 0  ( 16 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 0 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
 NBSHAPES    : Solid    = 8  ( 8 )  Shell    = 8  ( 8 )  Face     = 517  ( 517 )   Summary  = 3521  ( 3521 )
 STATSHAPE   : Solid    = 8  ( 8 )  Shell    = 8  ( 8 )  Face     = 517  ( 517 )   FreeWire = 0  ( 0 )   FreeEdge  = 0 ( 0 )   SharedEdge = 1464  ( 1464 )
index dca3050..b06beb6 100644 (file)
@@ -3,11 +3,11 @@ set filename PRO7073.stp
 
 set ref_data {
 DATA        : Faulties = 0  ( 123 )  Warnings = 0  ( 0 )  Summary  = 0  ( 123 )
-TPSTAT      : Faulties = 0  ( 0 )  Warnings = 18  ( 18 )  Summary  = 18  ( 18 )
+TPSTAT      : Faulties = 0  ( 0 )  Warnings = 7  ( 19 )  Summary  = 7  ( 19 )
 CHECKSHAPE  : Wires    = 0  ( 0 )  Faces    = 0  ( 0 )  Shells   = 0  ( 0 )   Solids   = 0 ( 0 )
 NBSHAPES    : Solid    = 0  ( 0 )  Shell    = 1  ( 1 )  Face     = 66  ( 66 )   Summary  = 955  ( 833 )
 STATSHAPE   : Solid    = 0  ( 0 )  Shell    = 1  ( 1 )  Face     = 66  ( 66 )   FreeWire = 0  ( 0 )   FreeEdge  = 122 ( 122 )   SharedEdge = 325  ( 325 )
-TOLERANCE   : MaxTol   =  0.05706634351  (  0.05706634351 )  AvgTol   =   0.01188180152  (   0.01188858328 )
+TOLERANCE   : MaxTol   =   0.1618955924  (   0.3526187023 )  AvgTol   =   0.03794615013  (   0.05391633347 )
 LABELS      : N0Labels = 3  ( 3 )  N1Labels = 124  ( 124 )  N2Labels = 0  ( 0 )   TotalLabels = 127  ( 127 )   NameLabels = 5  ( 5 )   ColorLabels = 123  ( 123 )   LayerLabels = 0  ( 0 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 7  ( 7 )