0026555: Modeling Algorithms - Exception-safe status reporting in BRepOffset_MakeOffset
authorakaftasev <akaftasev@opencascade.com>
Tue, 12 May 2020 09:21:59 +0000 (12:21 +0300)
committerbugmaster <bugmaster@opencascade.com>
Sat, 11 Jul 2020 08:26:29 +0000 (11:26 +0300)
Set safe exit status for:
Standard_NullObject exception,
Standard_NullObject: BRep_Tool:: TopoDS_Vertex hasn't gp_Pnt,
BRep_Tool: no parameter on edge,
BRepOffset_MakeOffset::TrimEdge no projection

src/BRep/BRep_Tool.cxx
src/BRep/BRep_Tool.hxx
src/BRepOffset/BRepOffset_Error.hxx
src/BRepOffset/BRepOffset_Inter2d.cxx
src/BRepOffset/BRepOffset_Inter2d.hxx
src/BRepOffset/BRepOffset_MakeOffset.cxx
src/BRepTest/BRepTest_FeatureCommands.cxx
tests/offset/with_intersect_80/J9

index 8fb6ef8..eaf6f59 100644 (file)
@@ -1264,84 +1264,95 @@ Standard_Real  BRep_Tool::Tolerance(const TopoDS_Vertex& V)
 //purpose  : Returns the parameter of <V> on <E>.
 //=======================================================================
 
-Standard_Real  BRep_Tool::Parameter(const TopoDS_Vertex& V, 
-                                    const TopoDS_Edge& E)
+Standard_Boolean BRep_Tool::Parameter (const TopoDS_Vertex& theV,
+                                            const TopoDS_Edge& theE,
+                                            Standard_Real& theParam)
 {
-  
   // Search the vertex in the edge
 
   Standard_Boolean rev = Standard_False;
   TopoDS_Shape VF;
   TopAbs_Orientation orient = TopAbs_INTERNAL;
 
-  TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD));
+  TopoDS_Iterator itv(theE.Oriented(TopAbs_FORWARD));
 
   // if the edge has no vertices
   // and is degenerated use the vertex orientation
   // RLE, june 94
 
-  if (!itv.More() && Degenerated(E)) {
-    orient = V.Orientation();
+  if (!itv.More() && BRep_Tool::Degenerated(theE)) {
+    orient = theV.Orientation();
   }
 
   while (itv.More()) {
     const TopoDS_Shape& Vcur = itv.Value();
-    if (V.IsSame(Vcur)) {
+    if (theV.IsSame(Vcur)) {
       if (VF.IsNull()) {
         VF = Vcur;
       }
       else {
-        rev = E.Orientation() == TopAbs_REVERSED;
-        if (Vcur.Orientation() == V.Orientation()) {
+        rev = theE.Orientation() == TopAbs_REVERSED;
+        if (Vcur.Orientation() == theV.Orientation()) {
           VF = Vcur;
         }
       }
     }
     itv.Next();
   }
-  
+
   if (!VF.IsNull()) orient = VF.Orientation();
-  Standard_Real f,l;
 
-  if (orient ==  TopAbs_FORWARD) {
-    BRep_Tool::Range(E,f,l);
-    return (rev) ? l : f;
+  Standard_Real f, l;
+
+  if (orient == TopAbs_FORWARD) {
+    BRep_Tool::Range(theE, f, l);
+    theParam = (rev) ? l : f;
+    return Standard_True;
+  }
+
+  else if (orient == TopAbs_REVERSED) {
+    BRep_Tool::Range(theE, f, l);
+    theParam = (rev) ? f : l;
+    return Standard_True;
   }
-  else if (orient ==  TopAbs_REVERSED) {
-    BRep_Tool::Range(E,f,l);
-    return (rev) ? f : l;
-   }
 
   else {
     TopLoc_Location L;
-    const Handle(Geom_Curve)& C = BRep_Tool::Curve(E,L,f,l);
-    L = L.Predivided(V.Location());
-    if (!C.IsNull() || Degenerated(E)) {
-      const BRep_TVertex* TV = static_cast<const BRep_TVertex*>(V.TShape().get());
+    const Handle(Geom_Curve)& C = BRep_Tool::Curve(theE, L, f, l);
+    L = L.Predivided(theV.Location());
+    if (!C.IsNull() || BRep_Tool::Degenerated(theE)) {
+      const BRep_TVertex* TV = static_cast<const BRep_TVertex*>(theV.TShape().get());
       BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points());
 
       while (itpr.More()) {
         const Handle(BRep_PointRepresentation)& pr = itpr.Value();
-        if (pr->IsPointOnCurve(C,L)) {
+        if (pr->IsPointOnCurve(C, L)) {
           Standard_Real p = pr->Parameter();
           Standard_Real res = p;// SVV 4 nov 99 - to avoid warnings on Linux
           if (!C.IsNull()) {
             // Closed curves RLE 16 june 94
-            if (Precision::IsNegativeInfinite(f)) return pr->Parameter();//p;
-            if (Precision::IsPositiveInfinite(l)) return pr->Parameter();//p;
+            if (Precision::IsNegativeInfinite(f))
+            {
+              theParam = pr->Parameter();//p;
+              return Standard_True;
+            };
+            if (Precision::IsPositiveInfinite(l))
+            {
+              theParam = pr->Parameter();//p;
+              return Standard_True;
+            }
             gp_Pnt Pf = C->Value(f).Transformed(L.Transformation());
             gp_Pnt Pl = C->Value(l).Transformed(L.Transformation());
-            Standard_Real tol = BRep_Tool::Tolerance(V);
+            Standard_Real tol = BRep_Tool::Tolerance(theV);
             if (Pf.Distance(Pl) < tol) {
-              if (Pf.Distance(BRep_Tool::Pnt(V)) < tol) {
-                if (V.Orientation() == TopAbs_FORWARD) res = f;//p = f;
+              if (Pf.Distance(BRep_Tool::Pnt(theV)) < tol) {
+                if (theV.Orientation() == TopAbs_FORWARD) res = f;//p = f;
                 else                                   res = l;//p = l;
               }
             }
           }
-          return res;//p;
+          theParam = res;//p;
+          return Standard_True;
         }
         itpr.Next();
       }
@@ -1351,30 +1362,44 @@ Standard_Real  BRep_Tool::Parameter(const TopoDS_Vertex& V,
       // let us try with the first pcurve
       Handle(Geom2d_Curve) PC;
       Handle(Geom_Surface) S;
-      BRep_Tool::CurveOnSurface(E,PC,S,L,f,l);
-      L = L.Predivided(V.Location());
-      const BRep_TVertex* TV = static_cast<const BRep_TVertex*>(V.TShape().get());
+      BRep_Tool::CurveOnSurface(theE, PC, S, L, f, l);
+      L = L.Predivided(theV.Location());
+      const BRep_TVertex* TV = static_cast<const BRep_TVertex*>(theV.TShape().get());
       BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points());
 
       while (itpr.More()) {
         const Handle(BRep_PointRepresentation)& pr = itpr.Value();
-        if (pr->IsPointOnCurveOnSurface(PC,S,L)) {
+        if (pr->IsPointOnCurveOnSurface(PC, S, L)) {
           Standard_Real p = pr->Parameter();
           // Closed curves RLE 16 june 94
           if (PC->IsClosed()) {
-            if ((p == PC->FirstParameter()) || 
-                (p == PC->LastParameter())) {
-              if (V.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter();
-              else                                   p = PC->LastParameter();
+            if ((p == PC->FirstParameter()) ||
+              (p == PC->LastParameter())) {
+              if (theV.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter();
+              else                                      p = PC->LastParameter();
             }
           }
-          return p;
+          theParam = p;
+          return Standard_True;
         }
         itpr.Next();
       }
     }
   }
-  
+
+  return Standard_False;
+}
+
+//=======================================================================
+//function : Parameter
+//purpose  : Returns the parameter of <V> on <E>.
+//=======================================================================
+
+Standard_Real  BRep_Tool::Parameter(const TopoDS_Vertex& V, 
+                                    const TopoDS_Edge& E)
+{
+  Standard_Real p;
+  if (Parameter(V, E, p)) return p;
   throw Standard_NoSuchObject("BRep_Tool:: no parameter on edge");
 }
 
index e81ecea..4d3b4de 100644 (file)
@@ -255,7 +255,17 @@ public:
   //! Returns the tolerance.
   Standard_EXPORT static Standard_Real Tolerance (const TopoDS_Vertex& V);
   
+  //! Finds the parameter of <theV> on <theE>.
+  //! @param theV [in] input vertex
+  //! @param theE [in] input edge
+  //! @param theParam  [out] calculated parameter on the curve
+  //! @return TRUE if done
+  Standard_EXPORT static Standard_Boolean Parameter (const TopoDS_Vertex& theV,
+                                                          const TopoDS_Edge& theE,
+                                                          Standard_Real &theParam);
+
   //! Returns the parameter of <V> on <E>.
+  //! Throws Standard_NoSuchObject if no parameter on edge
   Standard_EXPORT static Standard_Real Parameter (const TopoDS_Vertex& V, const TopoDS_Edge& E);
   
   //! Returns the  parameters  of   the  vertex   on the
index 447eec8..c809f4a 100644 (file)
 
 enum BRepOffset_Error
 {
-BRepOffset_NoError,
-BRepOffset_UnknownError,
-BRepOffset_BadNormalsOnGeometry,
-BRepOffset_C0Geometry,
-BRepOffset_NullOffset,
-BRepOffset_NotConnectedShell
+  BRepOffset_NoError,
+  BRepOffset_UnknownError,
+  BRepOffset_BadNormalsOnGeometry,
+  BRepOffset_C0Geometry,
+  BRepOffset_NullOffset,
+  BRepOffset_NotConnectedShell,
+  BRepOffset_CannotTrimEdges,        //!< exception while trim edges
+  BRepOffset_CannotFuseVertices,     //!< exception while fuse vertices
+  BRepOffset_CannotExtentEdge        //!< exception while extent edges
 };
 
 #endif // _BRepOffset_Error_HeaderFile
index 69d2348..b19f2b2 100644 (file)
@@ -923,7 +923,7 @@ static Standard_Boolean ExtendPCurve(const Handle(Geom2d_Curve)& aPCurve,
 
 //  Modified by skv - Fri Dec 26 17:00:55 2003 OCC4455 Begin
 //static void ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE) 
-void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset)
+Standard_Boolean BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset)
 {
   //BRepLib::BuildCurve3d(E);
 
@@ -1261,13 +1261,19 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
                                   }
                               }
                           }
-
-                        Handle(Geom2d_Curve) ProjPCurve =
-                          GeomProjLib::Curve2d( C3d, FirstParOnPC, LastParOnPC, theSurf );
-                        if (ProjPCurve.IsNull())
-                          ProjectionSuccess = Standard_False;
+                        if (!C3d.IsNull() && FirstParOnPC < LastParOnPC)
+                        {
+                          Handle(Geom2d_Curve) ProjPCurve =
+                            GeomProjLib::Curve2d(C3d, FirstParOnPC, LastParOnPC, theSurf);
+                          if (ProjPCurve.IsNull())
+                            ProjectionSuccess = Standard_False;
+                          else
+                            CurveRep->PCurve(ProjPCurve);
+                        }
                         else
-                          CurveRep->PCurve( ProjPCurve );
+                        {
+                          return Standard_False;
+                        }
                       }
                   }
               }
@@ -1311,7 +1317,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
             aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
             
             if (!aCompCurve.Add(aSegment, aTol))
-              return;
+              return Standard_True;
           }
           
           if (LastPar < anEl + a2Offset) {
@@ -1321,7 +1327,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
             aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta);
             
             if (!aCompCurve.Add(aSegment, aTol))
-              return;
+              return Standard_True;
           }
           
           C3d = aCompCurve.BSplineCurve();
@@ -1341,6 +1347,7 @@ void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const
       
       BB.Range( NE, FirstPar, LastPar );
     }
+  return Standard_True;
 }
 //  Modified by skv - Fri Dec 26 17:00:57 2003 OCC4455 End
 
@@ -1455,7 +1462,7 @@ void BRepOffset_Inter2d::Compute (const Handle(BRepAlgo_AsDes)&     AsDes,
 //function : ConnexIntByInt
 //purpose  : 
 //=======================================================================
-void BRepOffset_Inter2d::ConnexIntByInt
+Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt
  (const TopoDS_Face&            FI,
   BRepOffset_Offset&            OFI,
   TopTools_DataMapOfShapeShape& MES,
@@ -1493,7 +1500,10 @@ void BRepOffset_Inter2d::ConnexIntByInt
         TopoDS_Shape aLocalShape = OFI.Generated(EI);
         const TopoDS_Edge& OE = TopoDS::Edge(aLocalShape);
         if (!MES.IsBound(OE) && !Build.IsBound(EI)) {
-          ExtentEdge(OE,NE, Offset);
+          if (!ExtentEdge(OE, NE, Offset))
+          {
+            return Standard_False;
+          }
           MES.Bind  (OE,NE);
         }
       }
@@ -1615,6 +1625,7 @@ void BRepOffset_Inter2d::ConnexIntByInt
       ToReverse1 = ToReverse2;
     }
   }
+  return Standard_True;
 }
 
 //=======================================================================
@@ -1783,8 +1794,8 @@ static void MakeChain(const TopoDS_Shape& theV,
 //function : FuseVertices
 //purpose  : 
 //=======================================================================
-void BRepOffset_Inter2d::FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
-                                      const Handle(BRepAlgo_AsDes)& theAsDes)
+Standard_Boolean BRepOffset_Inter2d::FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                                   const Handle(BRepAlgo_AsDes)& theAsDes)
 {
   BRep_Builder aBB;
   TopTools_MapOfShape aMVDone;
@@ -1817,11 +1828,16 @@ void BRepOffset_Inter2d::FuseVertices(const TopTools_IndexedDataMapOfShapeListOf
       for (; aItLE.More(); aItLE.Next()) {
         const TopoDS_Edge& aE = TopoDS::Edge(aItLE.Value());
         Standard_Real aTolE = BRep_Tool::Tolerance(aE);
-        Standard_Real aT = BRep_Tool::Parameter(aVOldInt, aE);
+        Standard_Real aT; 
+        if (!BRep_Tool::Parameter(aVOldInt, aE, aT))
+        {
+          return Standard_False;
+        }
         aBB.UpdateVertex(aVNewInt, aT, aE, aTolE);
       }
       // and replace the vertex
       theAsDes->Replace(aVOld, aVNew);
     }
   }
-}
+  return Standard_True;
+}
\ No newline at end of file
index cb70ec8..cf0f53b 100644 (file)
@@ -57,7 +57,7 @@ public:
   //! When all faces of the shape are treated the intersection vertices
   //! have to be fused using the FuseVertices method.
   //! theDMVV contains the vertices that should be fused.
-  Standard_EXPORT static void ConnexIntByInt (const TopoDS_Face& FI,
+  Standard_EXPORT static Standard_Boolean ConnexIntByInt (const TopoDS_Face& FI,
                                               BRepOffset_Offset& OFI,
                                               TopTools_DataMapOfShapeShape& MES,
                                               const TopTools_DataMapOfShapeShape& Build,
@@ -87,12 +87,12 @@ public:
   //! Fuses the chains of vertices in the theDMVV
   //! and updates AsDes by replacing the old vertices
   //! with the new ones.
-  Standard_EXPORT static void FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
-                                           const Handle(BRepAlgo_AsDes)& theAsDes);
+  Standard_EXPORT static Standard_Boolean FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                                        const Handle(BRepAlgo_AsDes)& theAsDes);
   //! extents the edge
-  Standard_EXPORT static void ExtentEdge(const TopoDS_Edge& E,
-                                         TopoDS_Edge& NE,
-                                         const Standard_Real theOffset);
+  Standard_EXPORT static Standard_Boolean ExtentEdge (const TopoDS_Edge& E,
+                                                      TopoDS_Edge& NE,
+                                                      const Standard_Real theOffset);
 
 protected:
 
index 89ad5c0..2c3077f 100644 (file)
@@ -284,23 +284,23 @@ static
   Standard_Boolean IsPlanar(const TopoDS_Shape& theS);
 
 static
-  void TrimEdge(TopoDS_Edge&                  NE,
-                const Handle(BRepAlgo_AsDes)& AsDes2d,
-                Handle(BRepAlgo_AsDes)& AsDes,
-                TopTools_DataMapOfShapeShape& theETrimEInf);
+  Standard_Boolean TrimEdge(TopoDS_Edge& NE,
+                            const Handle(BRepAlgo_AsDes)& AsDes2d,
+                            Handle(BRepAlgo_AsDes)& AsDes,
+                            TopTools_DataMapOfShapeShape& theETrimEInf);
 
 static 
-  void TrimEdges(const TopoDS_Shape& theShape,
-                 const Standard_Real theOffset,
-                 const BRepOffset_Analyse& Analyse,
-                 BRepOffset_DataMapOfShapeOffset& theMapSF,
-                 TopTools_DataMapOfShapeShape& theMES,
-                 TopTools_DataMapOfShapeShape& theBuild,
-                 Handle(BRepAlgo_AsDes)& theAsDes,
-                 Handle(BRepAlgo_AsDes)& theAsDes2d,
-                 TopTools_IndexedMapOfShape& theNewEdges,
-                 TopTools_DataMapOfShapeShape& theETrimEInf,
-                 TopTools_DataMapOfShapeListOfShape& theEdgesOrigins);
+  Standard_Boolean TrimEdges(const TopoDS_Shape& theShape,
+                             const Standard_Real theOffset,
+                             const BRepOffset_Analyse& Analyse,
+                             BRepOffset_DataMapOfShapeOffset& theMapSF,
+                             TopTools_DataMapOfShapeShape& theMES,
+                             TopTools_DataMapOfShapeShape& theBuild,
+                             Handle(BRepAlgo_AsDes)& theAsDes,
+                             Handle(BRepAlgo_AsDes)& theAsDes2d,
+                             TopTools_IndexedMapOfShape& theNewEdges,
+                             TopTools_DataMapOfShapeShape& theETrimEInf,
+                             TopTools_DataMapOfShapeListOfShape& theEdgesOrigins);
 
 static
   void AppendToList(TopTools_ListOfShape& theL,
@@ -797,7 +797,7 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
     // Check Error() method.
     return;
   }
-
+  myError = BRepOffset_NoError;
   TopAbs_State       Side = TopAbs_IN;
   if (myOffset < 0.) Side = TopAbs_OUT;
 
@@ -826,6 +826,10 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
     BuildOffsetByArc();
   else if (myJoin == GeomAbs_Intersection) 
     BuildOffsetByInter();
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //-----------------
   // Auto unwinding.
   //-----------------
@@ -1149,15 +1153,17 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   TopTools_ListOfShape aLFaces;
   for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next())
     aLFaces.Append (Exp.Current());
-
   for (TopTools_ListOfShape::Iterator it (myAnalyse.NewFaces()); it.More(); it.Next())
     aLFaces.Append (it.Value());
-
   //---------------------------------------------------------------------------------
   // Extension of neighbor edges of new edges and intersection between neighbors.
   //--------------------------------------------------------------------------------
   Handle(BRepAlgo_AsDes) AsDes2d = new BRepAlgo_AsDes();
   IntersectEdges(aLFaces, MapSF, MES, Build, AsDes, AsDes2d);
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //-----------------------------------------------------------
   // Great restriction of new edges and update of AsDes.
   //------------------------------------------ ----------------
@@ -1168,7 +1174,11 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   //Map of edges obtained after FACE-FACE (offsetted) intersection.
   //Key1 is edge trimmed by intersection points with other edges;
   //Item is not-trimmed edge. 
-  TrimEdges(myShape, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins);
+  if (!TrimEdges(myShape, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins))
+  {
+    myError = BRepOffset_CannotTrimEdges;
+    return;
+  }
   //
   //--------------------------------- 
   // Intersection 2D on //
@@ -3904,8 +3914,12 @@ void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces,
   {
     const TopoDS_Face& aF  = TopoDS::Face (it.Value());
     aTolF = BRep_Tool::Tolerance (aF);
-    BRepOffset_Inter2d::ConnexIntByInt
-      (aF, theMapSF (aF), theMES, theBuild, theAsDes2d, myOffset, aTolF, myAnalyse, aMFV, aDMVV);
+    if (!BRepOffset_Inter2d::ConnexIntByInt(aF, theMapSF(aF), theMES, theBuild, theAsDes2d,
+                                            myOffset, aTolF, myAnalyse, aMFV, aDMVV))
+    {
+      myError = BRepOffset_CannotExtentEdge;
+      return;
+    }
   }
   // intersect edges created from vertices
   Standard_Integer i, aNbF = aMFV.Extent();
@@ -3917,24 +3931,28 @@ void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces,
   }
   //
   // fuse vertices on edges
-  BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d);
+  if (!BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d))
+  {
+    myError = BRepOffset_CannotFuseVertices;
+    return;
+  }
 }
 
 //=======================================================================
 //function : TrimEdges
 //purpose  : 
 //=======================================================================
-void TrimEdges(const TopoDS_Shape& theShape,
-               const Standard_Real theOffset,
-               const BRepOffset_Analyse& Analyse,
-               BRepOffset_DataMapOfShapeOffset& theMapSF,
-               TopTools_DataMapOfShapeShape& theMES,
-               TopTools_DataMapOfShapeShape& theBuild,
-               Handle(BRepAlgo_AsDes)& theAsDes,
-               Handle(BRepAlgo_AsDes)& theAsDes2d,
-               TopTools_IndexedMapOfShape& theNewEdges,
-               TopTools_DataMapOfShapeShape& theETrimEInf,
-               TopTools_DataMapOfShapeListOfShape& theEdgesOrigins)
+Standard_Boolean TrimEdges(const TopoDS_Shape& theShape,
+                 const Standard_Real theOffset,
+                 const BRepOffset_Analyse& Analyse,
+                 BRepOffset_DataMapOfShapeOffset& theMapSF,
+                 TopTools_DataMapOfShapeShape& theMES,
+                 TopTools_DataMapOfShapeShape& theBuild,
+                 Handle(BRepAlgo_AsDes)& theAsDes,
+                 Handle(BRepAlgo_AsDes)& theAsDes2d,
+                 TopTools_IndexedMapOfShape& theNewEdges,
+                 TopTools_DataMapOfShapeShape& theETrimEInf,
+                 TopTools_DataMapOfShapeListOfShape& theEdgesOrigins)
 {
   TopExp_Explorer Exp,Exp2,ExpC;
   TopoDS_Shape    NE;
@@ -3992,7 +4010,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
         // trim edges
         if (NE.ShapeType() == TopAbs_EDGE) {
           if (theNewEdges.Add(NE)) {
-            TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf);
+            if (!TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf))
+              return Standard_False;
           }
         }
         else {
@@ -4005,7 +4024,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
             TopoDS_Edge NEC = TopoDS::Edge(ExpC.Current());
             if (theNewEdges.Add(NEC)) {
               if (!theAsDes2d->Descendant(NEC).IsEmpty()) {
-                TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf);
+                if(!TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf))
+                  return Standard_False;
               }
               else {
                 if (theAsDes->HasAscendant(NEC)) {
@@ -4037,7 +4057,8 @@ void TrimEdges(const TopoDS_Shape& theShape,
           NE = theMES(NE);
           NE.Orientation(aS.Orientation());
           if (theNewEdges.Add(NE)) {
-            TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf);
+            if (!TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf))
+              return Standard_False;
           } 
         }
         else {
@@ -4053,6 +4074,7 @@ void TrimEdges(const TopoDS_Shape& theShape,
       } 
     }
   }
+  return Standard_True;
 }
 
 //=======================================================================
@@ -4060,7 +4082,7 @@ void TrimEdges(const TopoDS_Shape& theShape,
 //purpose  : Trim the edge of the largest of descendants in AsDes2d.
 //           Order in AsDes two vertices that have trimmed the edge.
 //=======================================================================
-void TrimEdge(TopoDS_Edge&                  NE,
+Standard_Boolean TrimEdge(TopoDS_Edge&                  NE,
               const Handle(BRepAlgo_AsDes)& AsDes2d,
               Handle(BRepAlgo_AsDes)& AsDes,
               TopTools_DataMapOfShapeShape& theETrimEInf)
@@ -4098,7 +4120,9 @@ void TrimEdge(TopoDS_Edge&                  NE,
         gp_Pnt thePoint = BRep_Tool::Pnt(V);
         GeomAPI_ProjectPointOnCurve Projector(thePoint, theCurve);
         if (Projector.NbPoints() == 0)
-          return;
+        {
+          return Standard_False;
+        }
         U = Projector.LowerDistanceParameter();
       }
       if (U < UMin) {
@@ -4110,7 +4134,7 @@ void TrimEdge(TopoDS_Edge&                  NE,
     }
     //
     if (V1.IsNull() || V2.IsNull()) {
-      throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge");
+      return Standard_False;
     }
     if (!V1.IsSame(V2)) {
       NE.Free( Standard_True );
@@ -4147,6 +4171,7 @@ void TrimEdge(TopoDS_Edge&                  NE,
       theETrimEInf.Bind(NE, aSourceEdge);
     }
   }
+  return Standard_True;
 }
 
 //=======================================================================
index 1cf6dbc..d673ed7 100644 (file)
@@ -380,6 +380,21 @@ static void reportOffsetState(Draw_Interpretor& theCommands,
     theCommands << "ERROR. Incorrect set of faces to remove, the remaining shell is not connected.";
     break;
   }
+  case BRepOffset_CannotTrimEdges:
+  {
+    theCommands << "ERROR. Can not trim edges.";
+    break;
+  }
+  case BRepOffset_CannotFuseVertices:
+  {
+    theCommands << "ERROR. Can not fuse vertices.";
+    break;
+  }
+  case BRepOffset_CannotExtentEdge:
+  {
+    theCommands << "ERROR. Can not extent edge.";
+    break;
+  }
   default:
   {
     theCommands << "ERROR. offsetperform operation not done.";
index 55246c9..a58dd4a 100644 (file)
@@ -1,5 +1,6 @@
-puts "TODO OCC26577 All: Error :  is WRONG because number of EDGE entities in shape"
-puts "TODO OCC26577 All: Error :  is WRONG because number of SHELL entities in shape"
+puts "TODO OCC26528 All:ERROR. Can not trim edges."
+puts "TODO OCC26528 All:Error : command \\\"nbshapes result\\\" gives an empty result"
+puts "TODO OCC26528 All:TEST INCOMPLETE"
 restore [locate_data_file bug26663_test_offset_J9.brep] s
 OFFSETSHAPE ${off_param} {} ${calcul} ${type}
 checknbshapes result -ref [lrange [nbshapes s] 8 19]