0026026: XtControl_Reader hangs when processing specific data
authoranv <anv@opencascade.com>
Thu, 8 Dec 2016 13:24:34 +0000 (16:24 +0300)
committerapn <apn@opencascade.com>
Thu, 8 Dec 2016 13:24:56 +0000 (16:24 +0300)
Small fix for a specific case (was missing).

src/AppBlend/AppBlend_AppSurf.gxx
src/BRepOffset/BRepOffset_Offset.cxx
src/BRepTest/BRepTest_SweepCommands.cxx
src/GeomFill/GeomFill_Pipe.cxx
src/GeomFill/GeomFill_Pipe.hxx
src/GeomFill/GeomFill_Pipe.lxx
src/GeometryTest/GeometryTest_SurfaceCommands.cxx
src/LocOpe/LocOpe_SplitDrafts.cxx
src/QABugs/QABugs_11.cxx

index 318c597..fd8a7f9 100644 (file)
@@ -535,9 +535,13 @@ void AppBlend_AppSurf::InternalPerform(const Handle(TheLine)& Lin,
     for (k=1; k<=NbVPoles; k++) {
       // pour les courbes rationnelles il faut maintenant diviser
       // les poles par leurs poids respectifs
-      tabPoles->ChangeValue(j,k).
-       SetXYZ(newtabP(k).XYZ()/newtabP2d->Value(k).X());
-      tabWeights->SetValue(j,k,newtabP2d->Value(k).X());
+      tabPoles->ChangeValue(j,k).SetXYZ(newtabP(k).XYZ()/newtabP2d->Value(k).X());
+      Standard_Real aWeight = newtabP2d->Value(k).X();
+      if (aWeight < gp::Resolution()) {
+        done = Standard_False;
+        return;
+      }
+      tabWeights->SetValue(j,k,aWeight);
     }
   }
 
@@ -870,9 +874,13 @@ void AppBlend_AppSurf::Perform(const Handle(TheLine)& Lin,
     for (k=1; k<=NbVPoles; k++) {
       // pour les courbes rationnelles il faut maintenant diviser
       // les poles par leurs poids respectifs
-      tabPoles->ChangeValue(j,k).
-       SetXYZ(newtabP(k).XYZ()/newtabP2d->Value(k).X());
-      tabWeights->SetValue(j,k,newtabP2d->Value(k).X());
+      tabPoles->ChangeValue(j,k).SetXYZ(newtabP(k).XYZ()/newtabP2d->Value(k).X());
+      Standard_Real aWeight = newtabP2d->Value(k).X();
+      if (aWeight < gp::Resolution()) {
+        done = Standard_False;
+        return;
+      }
+      tabWeights->SetValue(j,k,aWeight);
     }
   }
   
index b1e8df3..989c2a8 100644 (file)
@@ -1114,6 +1114,8 @@ void BRepOffset_Offset::Init(const TopoDS_Edge&     Path,
   // Calcul du tuyau
   GeomFill_Pipe Pipe(HCP, HEdge1, HEdge2, Abs(Offset));
   Pipe.Perform(Tol, Polynomial, Conti);
+  if (!Pipe.IsDone())
+    Standard_ConstructionError::Raise ("GeomFill_Pipe : Cannot make a surface");
   Standard_Real ErrorPipe = Pipe.ErrorOnSurf();
 
   Handle(Geom_Surface) S = Pipe.Surface();
@@ -1581,6 +1583,8 @@ void BRepOffset_Offset::Init(const TopoDS_Edge&  Edge,
 
   GeomFill_Pipe Pipe(CP,myOffset);
   Pipe.Perform();
+  if (!Pipe.IsDone())
+    Standard_ConstructionError::Raise ("GeomFill_Pipe : Cannot make a surface");
 
   BRepLib_MakeFace MF(Pipe.Surface(), Precision::Confusion());
   myFace = MF.Face();
index 1c225ca..eb869ee 100644 (file)
@@ -200,6 +200,11 @@ static Standard_Integer geompipe(Draw_Interpretor& ,
     rotate = (Draw::Atoi(a[k++])==1);
   GeomFill_Pipe aPipe(ProfileCurve,aAdaptCurve,cStart,ByACR,rotate);
   aPipe.Perform(Standard_True);
+  if (!aPipe.IsDone())
+  {
+    cout << "GeomFill_Pipe cannot make a surface" << endl;
+    return 1;
+  }
   Handle(Geom_Surface) Sur=aPipe.Surface();
   TopoDS_Face F;
   if(!Sur.IsNull())
index 2ff4e72..6c122e1 100644 (file)
@@ -206,7 +206,7 @@ static Standard_Boolean CheckSense(const TColGeom_SequenceOfCurve& Seq1,
 //purpose  : constructor with no parameters. 
 //=======================================================================
 
-GeomFill_Pipe::GeomFill_Pipe() : myExchUV(Standard_False),myKPart(Standard_False)
+GeomFill_Pipe::GeomFill_Pipe() : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
 }
@@ -219,7 +219,7 @@ GeomFill_Pipe::GeomFill_Pipe() : myExchUV(Standard_False),myKPart(Standard_False
 
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path, 
                              const Standard_Real Radius) 
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path, Radius);
@@ -233,7 +233,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                              const Handle(Geom_Curve)& FirstSect,
                              const GeomFill_Trihedron Option) 
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path, FirstSect, Option);
@@ -247,7 +247,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path,
                              const Handle(Geom_Surface)& Support,
                              const Handle(Geom_Curve)& FirstSect) 
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path, Support, FirstSect);
@@ -261,7 +261,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom2d_Curve)& Path,
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                              const Handle(Geom_Curve)& FirstSect,
                              const Handle(Geom_Curve)& LastSect)
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path, FirstSect, LastSect);
@@ -275,7 +275,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
 
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                              const TColGeom_SequenceOfCurve& NSections)
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path, NSections);
@@ -289,7 +289,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
 GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                              const Handle(Geom_Curve)& Curve1,
                              const gp_Dir& Direction)
-     : myExchUV(Standard_False), myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False), myKPart(Standard_False)
 {
  Init(Path, Curve1, Direction); 
 }
@@ -302,7 +302,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                              const Handle(Geom_Curve)& Curve1,
                              const Handle(Geom_Curve)& Curve2,
                              const Standard_Real       Radius)
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Handle(GeomAdaptor_HCurve) AdpPath = 
@@ -325,7 +325,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Adaptor3d_HCurve)& Path,
                              const Handle(Adaptor3d_HCurve)& Curve1,
                              const Handle(Adaptor3d_HCurve)& Curve2,
                              const Standard_Real Radius)
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 {
   Init();
   Init(Path,Curve1,Curve2,Radius);
@@ -345,7 +345,7 @@ GeomFill_Pipe::GeomFill_Pipe(const Handle(Geom_Curve)& Path,
                             const Handle(Geom_Curve)& FirstSect,
                             const Standard_Boolean byACR,
                             const Standard_Boolean rotat)
-     : myExchUV(Standard_False),myKPart(Standard_False)
+     : myIsDone(Standard_False),myExchUV(Standard_False),myKPart(Standard_False)
 // Path : trajectoire
 // Guide : courbe guide
 // FirstSect : section
@@ -887,11 +887,11 @@ void GeomFill_Pipe::Perform(const Standard_Real Tol,
                                           App.UDegree(),
                                           App.VDegree());
        myError = App.MaxErrorOnSurf();
+       myIsDone = Standard_True;
      }
-     else {
-       Standard_ConstructionError::Raise
-        ("GeomFill_Pipe::Perform : Cannot make a surface");     
-     }
+     //else {
+     //  Standard_ConstructionError::Raise ("GeomFill_Pipe::Perform : Cannot make a surface");
+     //}
    }
  }
  else if ( (! myLoc.IsNull()) && (! mySec.IsNull()) ) {
@@ -901,11 +901,11 @@ void GeomFill_Pipe::Perform(const Standard_Real Tol,
    if (Sweep.IsDone()) {
       mySurface = Sweep.Surface();
       myError = Sweep.ErrorOnSurface();
+      myIsDone = Standard_True;
    }
-   else {
-     Standard_ConstructionError::Raise
-        ("GeomFill_Pipe::Perform : Cannot make a surface");     
-     }     
+   //else {
+   //  Standard_ConstructionError::Raise ("GeomFill_Pipe::Perform : Cannot make a surface");
+   //}
    }
  else {
    Perform(Standard_True, Polynomial);
@@ -978,6 +978,7 @@ Standard_Boolean GeomFill_Pipe::KPartT4()
                                          myAdpPath->FirstParameter(),
                                          myAdpPath->LastParameter());
      Ok = Standard_True; //C'est bien un cylindre
+     myIsDone = Standard_True;
    }
  // -----------    Cas du tore  ----------------------------------
  else if (myAdpPath->GetType()      == GeomAbs_Circle &&
@@ -1040,6 +1041,7 @@ Standard_Boolean GeomFill_Pipe::KPartT4()
       myAdpPath->FirstParameter(),myAdpPath->LastParameter(),VV1,VV2);
    myExchUV = Standard_True;
    Ok = Standard_True;
+   myIsDone = Standard_True;
  }
 
  return Ok;
@@ -1121,7 +1123,7 @@ void GeomFill_Pipe::ApproxSurf(const Standard_Boolean WithParameters) {
 #endif
     }
 #endif
-    StdFail_NotDone::Raise("Pipe : App not done");
+    //StdFail_NotDone::Raise("Pipe : App not done");
   }
   else {
     Standard_Integer UDegree, VDegree, NbUPoles, NbVPoles, NbUKnots, 
@@ -1138,5 +1140,6 @@ void GeomFill_Pipe::ApproxSurf(const Standard_Boolean WithParameters) {
                                        App.VDegree());
     Standard_Real t2d;
     App.TolReached(myError, t2d);
+    myIsDone = Standard_True;
   }
 }
index 7ff433b..6fea1bc 100644 (file)
@@ -254,6 +254,8 @@ public:
   //! is plane, cylinder ... this error can be 0.
     Standard_Real ErrorOnSurf() const;
 
+  //! Returns whether approximation was done.
+    Standard_Boolean IsDone() const;
 
 
 
@@ -278,6 +280,7 @@ private:
   Standard_EXPORT Standard_Boolean KPartT4();
 
 
+  Standard_Boolean myIsDone;
   Standard_Real myRadius;
   Standard_Real myError;
   Handle(Adaptor3d_HCurve) myAdpPath;
index 6345133..1344d09 100644 (file)
@@ -64,3 +64,12 @@ inline Standard_Real GeomFill_Pipe::ErrorOnSurf() const
   return myError;
 }
 
+//=======================================================================
+//function :  IsDone
+//purpose  : 
+//=======================================================================
+inline Standard_Boolean GeomFill_Pipe::IsDone() const
+{
+  return myIsDone;
+}
+
index cdc55d0..5b5636f 100644 (file)
@@ -78,7 +78,7 @@ Standard_IMPORT Draw_Viewer dout;
 //purpose  : 
 //=======================================================================
 
-static Standard_Integer sweep (Draw_Interpretor&,
+static Standard_Integer sweep (Draw_Interpretor& di,
                               Standard_Integer n, const char** a)
 {
   GeomFill_Trihedron Option = GeomFill_IsCorrectedFrenet;
@@ -148,6 +148,11 @@ static Standard_Integer sweep (Draw_Interpretor&,
     
   Pipe.Perform(Tol, Standard_False,  GeomAbs_C2, MaxDegree, NbSeg);
 
+  if (!Pipe.IsDone()) {
+    di << "GeomFill_Pipe cannot make a surface\n";
+    return 1;
+  }
+
   DrawTrSurf::Set(a[1], Pipe.Surface());
   return 0;
   
@@ -157,7 +162,7 @@ static Standard_Integer sweep (Draw_Interpretor&,
 //purpose  : 
 //=======================================================================
 
-static Standard_Integer tuyau (Draw_Interpretor&,
+static Standard_Integer tuyau (Draw_Interpretor& di,
                                Standard_Integer n, const char** a)
 {
   if ( n < 4) return 1;
@@ -214,6 +219,10 @@ static Standard_Integer tuyau (Draw_Interpretor&,
   }
 
   Pipe.Perform(1.e-4, Standard_False,  Cont);
+  if (!Pipe.IsDone()) {
+    di << "GeomFill_Pipe cannot make a surface\n";
+    return 1;
+  }
   DrawTrSurf::Set(a[indice_path-1], Pipe.Surface());
 
   return 0;
index ea3c6b8..e6418e8 100644 (file)
@@ -203,6 +203,8 @@ void LocOpe_SplitDrafts::Perform(const TopoDS_Face& F,
     thePipe.GenerateParticularCase(Standard_True);
     thePipe.Init(theLinePipe,i2s.Line(1));
     thePipe.Perform(Standard_True);
+    if (!thePipe.IsDone())
+      Standard_ConstructionError::Raise ("GeomFill_Pipe : Cannot make a surface");
 
     Handle(Geom_Surface) Spl = thePipe.Surface();
     AS.Load(Spl);
@@ -415,6 +417,8 @@ void LocOpe_SplitDrafts::Perform(const TopoDS_Face& F,
        thePipe.GenerateParticularCase(Standard_True);
        thePipe.Init(theLinePipe,C);
        thePipe.Perform(Standard_True);
+        if (!thePipe.IsDone())
+          Standard_ConstructionError::Raise ("GeomFill_Pipe : Cannot make a surface");
 
        Handle(Geom_Surface) thePS = thePipe.Surface();
        if (thePS->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
index 0a98499..74c8ad2 100644 (file)
@@ -402,6 +402,11 @@ static int pipe_OCC9 (Draw_Interpretor& di,
     aPipe.Perform(Standard_True/*, Standard_True*/);
   }
 
+  if (!aPipe.IsDone()) {
+    di << "GeomFill_Pipe cannot make a surface\n";
+    return 1;
+  }
+
   Handle(Geom_Surface) aSurf = aPipe.Surface();
 
   DrawTrSurf::Set(a[1], aSurf);