]> OCCT Git - occt.git/commitdiff
0032330: Modeling Algorithms - Extend Offset algorithm with Progress Indicator and...
authorakaftasev <akaftasev@opencascade.com>
Thu, 18 Mar 2021 16:44:11 +0000 (19:44 +0300)
committersmoskvin <smoskvin@opencascade.com>
Wed, 15 Sep 2021 17:08:36 +0000 (20:08 +0300)
Add progress indicator to BRepOffset_MakeOffset::MakeOffsetShape().

20 files changed:
src/BRepOffset/BRepOffset_Analyse.cxx
src/BRepOffset/BRepOffset_Analyse.hxx
src/BRepOffset/BRepOffset_Error.hxx
src/BRepOffset/BRepOffset_Inter2d.cxx
src/BRepOffset/BRepOffset_Inter2d.hxx
src/BRepOffset/BRepOffset_Inter3d.cxx
src/BRepOffset/BRepOffset_Inter3d.hxx
src/BRepOffset/BRepOffset_MakeLoops.cxx
src/BRepOffset/BRepOffset_MakeLoops.hxx
src/BRepOffset/BRepOffset_MakeOffset.cxx
src/BRepOffset/BRepOffset_MakeOffset.hxx
src/BRepOffset/BRepOffset_MakeOffset_1.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx
src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.cxx
src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.hxx
src/BRepTest/BRepTest_FeatureCommands.cxx
src/BRepTest/BRepTest_OtherCommands.cxx
src/BiTgte/BiTgte_Blend.cxx
tests/bugs/modalg_7/bug32330 [new file with mode: 0644]

index 20bfba9a865d2d3cae198af419723cc48416058b..8247b362af43f7de5d74124a47495ca6707251db 100644 (file)
@@ -140,7 +140,8 @@ static void BuildAncestors (const TopoDS_Shape&                        S,
 //purpose  : 
 //=======================================================================
 void BRepOffset_Analyse::Perform (const TopoDS_Shape& S, 
-                                  const Standard_Real Angle)
+                                  const Standard_Real Angle,
+                                  const Message_ProgressRange& theRange)
 {
   myShape = S;
   myNewFaces .Clear();
@@ -155,9 +156,14 @@ void BRepOffset_Analyse::Perform (const TopoDS_Shape& S,
   BuildAncestors (S,myAncestors);
 
   TopTools_ListOfShape aLETang;
-
   TopExp_Explorer Exp(S.Oriented(TopAbs_FORWARD),TopAbs_EDGE);
-  for ( ; Exp.More(); Exp.Next()) {
+  Message_ProgressScope aPSOuter(theRange, NULL, 2);
+  Message_ProgressScope aPS(aPSOuter.Next(), "Performing edges analysis", 1, Standard_True);
+  for ( ; Exp.More(); Exp.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Edge& E = TopoDS::Edge(Exp.Current());
     if (!myMapEdgeType.IsBound(E)) {
       BRepOffset_ListOfInterval LI;
@@ -196,7 +202,11 @@ void BRepOffset_Analyse::Perform (const TopoDS_Shape& S,
     }
   }
 
-  TreatTangentFaces (aLETang);
+  TreatTangentFaces (aLETang, aPSOuter.Next());
+  if (!aPSOuter.More())
+  {
+    return;
+  }
   myDone = Standard_True;
 }
 
@@ -204,7 +214,7 @@ void BRepOffset_Analyse::Perform (const TopoDS_Shape& S,
 //function : Generated
 //purpose  : 
 //=======================================================================
-void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE)
+void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE, const Message_ProgressRange& theRange)
 {
   if (theLE.IsEmpty() || myFaceOffsetMap.IsEmpty())
   {
@@ -221,8 +231,14 @@ void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE)
   // Bind vertices of the tangent edges with connected edges
   // of the face with smaller offset value
   TopTools_DataMapOfShapeShape aDMVEMin;
-  for (TopTools_ListOfShape::Iterator it (theLE); it.More(); it.Next())
+  Message_ProgressScope aPSOuter(theRange, NULL, 3);
+  Message_ProgressScope aPS1(aPSOuter.Next(), "Binding vertices with connected edges", theLE.Size());
+  for (TopTools_ListOfShape::Iterator it (theLE); it.More(); it.Next(), aPS1.Next())
   {
+    if (!aPS1.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aE = it.Value();
     const TopTools_ListOfShape& aLA = Ancestors (aE);
 
@@ -266,8 +282,13 @@ void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE)
   // Create map of Face ancestors for the vertices on tangent edges
   TopTools_DataMapOfShapeListOfShape aDMVFAnc;
 
-  for (TopTools_ListOfShape::Iterator itE (theLE); itE.More(); itE.Next())
+  Message_ProgressScope aPS2(aPSOuter.Next(), "Creating map of Face ancestors", theLE.Size());
+  for (TopTools_ListOfShape::Iterator itE (theLE); itE.More(); itE.Next(), aPS2.Next())
   {
+    if (!aPS2.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aE = itE.Value();
     if (!anEdgeOffsetMap.IsBound (aE))
       continue;
@@ -315,8 +336,13 @@ void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE)
   BOPTools_AlgoTools::MakeConnexityBlocks (aCETangent, TopAbs_VERTEX, TopAbs_EDGE, aLCB, aMVEMap);
 
   // Analyze each block to find co-planar edges
-  for (TopTools_ListOfListOfShape::Iterator itLCB (aLCB); itLCB.More(); itLCB.Next())
+  Message_ProgressScope aPS3(aPSOuter.Next(), "Analyzing blocks to find co-planar edges", aLCB.Size());
+  for (TopTools_ListOfListOfShape::Iterator itLCB (aLCB); itLCB.More(); itLCB.Next(), aPS3.Next())
   {
+    if (!aPS3.More())
+    {
+      return;
+    }
     const TopTools_ListOfShape& aCB = itLCB.Value();
 
     TopTools_MapOfShape aMFence;
index 51e319d2514b7dca805b3ba04eedbb354c445053..3c079c6114b4a40d5367abbe7049ef5a889632b2 100644 (file)
@@ -33,6 +33,9 @@
 #include <TopTools_DataMapOfShapeShape.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_MapOfShape.hxx>
+
+#include <Message_ProgressRange.hxx>
+
 class TopoDS_Shape;
 class TopoDS_Edge;
 class TopoDS_Vertex;
@@ -59,7 +62,8 @@ public: //! @name Performing analysis
 
   //! Performs the analysis
   Standard_EXPORT void Perform (const TopoDS_Shape& theS,
-                                const Standard_Real theAngle);
+                                const Standard_Real theAngle,
+                                const Message_ProgressRange& theRange = Message_ProgressRange());
 
 public: //! @name Results
 
@@ -171,7 +175,7 @@ private: //! @name Treatment of tangential cases
 
   //! Treatment of the tangential cases.
   //! @param theEdges List of edges connecting tangent faces
-  Standard_EXPORT void TreatTangentFaces (const TopTools_ListOfShape& theEdges);
+  Standard_EXPORT void TreatTangentFaces (const TopTools_ListOfShape& theEdges, const Message_ProgressRange& theRange);
 
 private: //! @name Fields
 
index c809f4a983a0b739fa1e282d28d14bf382a69d22..e5dda91fdb8c9a17720a8f8a765b42a9ef81ca1f 100644 (file)
@@ -28,7 +28,8 @@ enum BRepOffset_Error
   BRepOffset_NotConnectedShell,
   BRepOffset_CannotTrimEdges,        //!< exception while trim edges
   BRepOffset_CannotFuseVertices,     //!< exception while fuse vertices
-  BRepOffset_CannotExtentEdge        //!< exception while extent edges
+  BRepOffset_CannotExtentEdge,       //!< exception while extent edges
+  BRepOffset_UserBreak               //!< user break
 };
 
 #endif // _BRepOffset_Error_HeaderFile
index 1af28492a82028ca0ef794c253a8ea89bea5d43a..f59ca2b58d676f2ec0c3a223d8b1044198953047 100644 (file)
@@ -1572,7 +1572,8 @@ void BRepOffset_Inter2d::Compute (const Handle(BRepAlgo_AsDes)&     AsDes,
                                   const TopTools_IndexedMapOfShape& NewEdges,
                                   const Standard_Real               Tol,
                                   const TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges,
-                                  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV)
+                                  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                  const Message_ProgressRange& theRange)
 {
 #ifdef DRAW
   NbF2d++;
@@ -1600,7 +1601,12 @@ void BRepOffset_Inter2d::Compute (const Handle(BRepAlgo_AsDes)&     AsDes,
   Standard_Integer                   j, i = 1;
   BRepAdaptor_Surface BAsurf(F);
   //
-  for ( it1LE.Initialize(LE) ; it1LE.More(); it1LE.Next()) {
+  Message_ProgressScope aPS(theRange, "Intersecting edges on faces", LE.Size());
+  for ( it1LE.Initialize(LE) ; it1LE.More(); it1LE.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Edge& E1 = TopoDS::Edge(it1LE.Value());        
     j = 1;
     it2LE.Initialize(LE);
@@ -1670,18 +1676,23 @@ Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt
   TopTools_IndexedMapOfShape&   FacesWithVerts,
   BRepAlgo_Image&               theImageVV,
   TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges,
-  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV)
+  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+  const Message_ProgressRange& theRange)
 {  
 
   TopTools_DataMapOfShapeListOfShape MVE;
   BRepOffset_Tool::MapVertexEdges(FI,MVE);
-
+  Message_ProgressScope aPS(theRange, "Intersecting edges obtained as intersection of faces", 1, Standard_True);
   //---------------------
   // Extension of edges.
   //---------------------
   TopoDS_Edge  NE;
   TopTools_DataMapIteratorOfDataMapOfShapeListOfShape it(MVE);
   for  ( ; it.More(); it.Next()) {
+    if (!aPS.More())
+    {
+      return Standard_False;
+    }
     const TopTools_ListOfShape&  L = it.Value();
     Standard_Boolean   YaBuild = 0;
     TopTools_ListIteratorOfListOfShape itL(L);
@@ -1712,9 +1723,13 @@ Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt
   if (MES.IsBound(FIO)) FIO = TopoDS::Face(MES(FIO));
   //
   BRepAdaptor_Surface BAsurf(FIO);
-  
+
   TopExp_Explorer exp(FI.Oriented(TopAbs_FORWARD),TopAbs_WIRE);
-  for (; exp.More(); exp.Next()) {
+  for (; exp.More(); exp.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return Standard_False;
+    }
     const TopoDS_Wire&     W = TopoDS::Wire(exp.Current());
     BRepTools_WireExplorer wexp;
     Standard_Boolean       end = Standard_False ;
@@ -1871,7 +1886,8 @@ void BRepOffset_Inter2d::ConnexIntByIntInVert
   const Handle(BRepAlgo_AsDes)& AsDes2d,
   const Standard_Real           Tol,
   const BRepOffset_Analyse&     Analyse,
-  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV)
+  TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+  const Message_ProgressRange& theRange)
 {
   TopoDS_Face           FIO = TopoDS::Face(OFI.Face());
   if (MES.IsBound(FIO)) FIO = TopoDS::Face(MES(FIO));
@@ -1886,8 +1902,13 @@ void BRepOffset_Inter2d::ConnexIntByIntInVert
   //
   BRepAdaptor_Surface BAsurf(FIO);
   //
+  Message_ProgressScope aPS(theRange, "Intersecting edges created from vertices", 1, Standard_True);
   TopExp_Explorer exp(FI.Oriented(TopAbs_FORWARD),TopAbs_WIRE);
-  for (; exp.More(); exp.Next()) {
+  for (; exp.More(); exp.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Wire&     W = TopoDS::Wire(exp.Current());
     //
     BRepTools_WireExplorer wexp;
index 850a674c2009e38987abb7bb180df3b5a345a61c..a2b04fb6afcaa79a8f16129a313818d21806a54b 100644 (file)
@@ -21,6 +21,7 @@
 #include <TopTools_DataMapOfShapeShape.hxx>
 #include <TopTools_DataMapOfShapeListOfShape.hxx>
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <Message_ProgressRange.hxx>
 
 class BRepAlgo_AsDes;
 class BRepAlgo_Image;
@@ -49,7 +50,8 @@ public:
                                        const TopTools_IndexedMapOfShape& NewEdges, 
                                        const Standard_Real Tol,
                                        const TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges,
-                                       TopTools_IndexedDataMapOfShapeListOfShape& theDMVV);
+                                       TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                       const Message_ProgressRange& theRange);
 
   //! Computes the intersection between the offset edges of the <FI>.
   //! All intersection vertices will be stored in AsDes2d.
@@ -68,7 +70,8 @@ public:
                                                           TopTools_IndexedMapOfShape& FacesWithVerts,
                                                           BRepAlgo_Image& theImageVV,
                                                           TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges,
-                                                          TopTools_IndexedDataMapOfShapeListOfShape& theDMVV);
+                                                          TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                                          const Message_ProgressRange& theRange);
 
   //! Computes the intersection between the offset edges generated
   //! from vertices and stored into AsDes as descendants of the <FI>.
@@ -84,7 +87,8 @@ public:
                                                     const Handle(BRepAlgo_AsDes)& AsDes2d,
                                                     const Standard_Real Tol,
                                                     const BRepOffset_Analyse& Analyse,
-                                                    TopTools_IndexedDataMapOfShapeListOfShape& theDMVV);
+                                                    TopTools_IndexedDataMapOfShapeListOfShape& theDMVV,
+                                                    const Message_ProgressRange& theRange);
 
   //! Fuses the chains of vertices in the theDMVV
   //! and updates AsDes by replacing the old vertices
index 9f1ceb951d9e70dc270f6c47c23916ec39be1299..8fc46ce06d6efe30639a18129254cef6064e82b4 100644 (file)
@@ -105,8 +105,9 @@ static void ExtentEdge(const TopoDS_Face& /*F*/,
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_Inter3d::CompletInt(const TopTools_ListOfShape& SetOfFaces,
-                                    const BRepAlgo_Image&     InitOffsetFace)
+void BRepOffset_Inter3d::CompletInt (const TopTools_ListOfShape& SetOfFaces,
+                                     const BRepAlgo_Image&     InitOffsetFace,
+                                     const Message_ProgressRange& theRange)
 {
   //---------------------------------------------------------------
   // Calculate the intersections of offset faces 
@@ -145,9 +146,13 @@ void BRepOffset_Inter3d::CompletInt(const TopTools_ListOfShape& SetOfFaces,
   // Treat the selected pairs
   const std::vector<BOPTools_BoxPairSelector::PairIDs>& aPairs = aSelector.Pairs();
   const Standard_Integer aNbPairs = static_cast<Standard_Integer> (aPairs.size());
-
-  for (Standard_Integer iPair = 0; iPair < aNbPairs; ++iPair)
+  Message_ProgressScope aPS(theRange, "Complete intersection", aNbPairs);
+  for (Standard_Integer iPair = 0; iPair < aNbPairs; ++iPair, aPS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const BOPTools_BoxPairSelector::PairIDs& aPair = aPairs[iPair];
 
     const TopoDS_Face& aF1 = TopoDS::Face (aMFaces.FindKey (Min (aPair.ID1, aPair.ID2)));
@@ -250,9 +255,10 @@ void BRepOffset_Inter3d::FaceInter(const TopoDS_Face& F1,
 //=======================================================================
 
 void BRepOffset_Inter3d::ConnexIntByArc(const TopTools_ListOfShape& /*SetOfFaces*/, 
-                                        const TopoDS_Shape&         ShapeInit, 
-                                        const BRepOffset_Analyse&   Analyse, 
-                                        const BRepAlgo_Image&       InitOffsetFace)
+                                        const TopoDS_Shape&          ShapeInit, 
+                                        const BRepOffset_Analyse&    Analyse, 
+                                        const BRepAlgo_Image&        InitOffsetFace,
+                                        const Message_ProgressRange& theRange)
 {
   ChFiDS_TypeOfConcavity    OT   = ChFiDS_Concave;
   if (mySide == TopAbs_OUT) OT   = ChFiDS_Convex;
@@ -261,12 +267,17 @@ void BRepOffset_Inter3d::ConnexIntByArc(const TopTools_ListOfShape& /*SetOfFaces
   TopoDS_Face                    F1,F2;
   TopoDS_Edge                    NullEdge;
   TopoDS_Face                    NullFace;
-
+  Message_ProgressScope aPSOuter(theRange, NULL, 2);
+  Message_ProgressScope aPSIntF(aPSOuter.Next(), "Intersecting offset faces", 1, Standard_True);
   //---------------------------------------------------------------------
   // etape 1 : Intersection of faces // corresponding to the initial faces 
   //           separated by a concave edge if offset > 0, otherwise convex.
   //---------------------------------------------------------------------  
-  for (; Exp.More(); Exp.Next()) {
+  for (; Exp.More(); Exp.Next(), aPSIntF.Next()) {
+    if (!aPSIntF.More())
+    {
+      return;
+    }
     const TopoDS_Edge&               E = TopoDS::Edge(Exp.Current());
     const BRepOffset_ListOfInterval& L = Analyse.Type(E);
     if (!L.IsEmpty() && L.First().Type() == OT) {
@@ -294,8 +305,12 @@ void BRepOffset_Inter3d::ConnexIntByArc(const TopTools_ListOfShape& /*SetOfFaces
   //---------------------------------------------------------------------
   TopoDS_Vertex                      V[2];
   TopTools_ListIteratorOfListOfShape it; 
-  
-  for (Exp.Init(ShapeInit,TopAbs_EDGE); Exp.More(); Exp.Next()) {
+  Message_ProgressScope aPSIntT(aPSOuter.Next(), "Intersecting tubes", 1, Standard_True);
+  for (Exp.Init(ShapeInit,TopAbs_EDGE); Exp.More(); Exp.Next(), aPSIntT.Next()) {
+    if (!aPSIntT.More())
+    {
+      return;
+    }
     const TopoDS_Edge& E1 = TopoDS::Edge(Exp.Current());
     if (InitOffsetFace.HasImage(E1)) {
       //---------------------------
@@ -402,6 +417,7 @@ void BRepOffset_Inter3d::ConnexIntByInt
  TopTools_DataMapOfShapeShape&          MES,
  TopTools_DataMapOfShapeShape&          Build,
  TopTools_ListOfShape&                  Failed,
+ const Message_ProgressRange&           theRange,
  const Standard_Boolean                 bIsPlanar)
 {
   TopTools_IndexedMapOfShape VEmap;
@@ -414,6 +430,7 @@ void BRepOffset_Inter3d::ConnexIntByInt
   //
   TopExp::MapShapes (SI, TopAbs_EDGE, VEmap);
   // Take the vertices for treatment
+  Message_ProgressScope aPSOuter(theRange, NULL, 10);
   if (bIsPlanar)
   {
     aNb = VEmap.Extent();
@@ -461,6 +478,10 @@ void BRepOffset_Inter3d::ConnexIntByInt
     // Analyze faces connected through vertices
     for (i = aNb + 1, aNb = VEmap.Extent(); i <= aNb; ++i)
     {
+      if (!aPSOuter.More())
+      {
+        return;
+      }
       const TopoDS_Shape& aS = VEmap(i);
       if (aS.ShapeType() != TopAbs_VERTEX)
         continue;
@@ -560,7 +581,12 @@ void BRepOffset_Inter3d::ConnexIntByInt
   }
   //
   aNb = VEmap.Extent();
-  for (i = 1; i <= aNb; ++i) {
+  Message_ProgressScope aPSInter(aPSOuter.Next(8), "Intersecting offset faces", aNb);
+  for (i = 1; i <= aNb; ++i, aPSInter.Next()) {
+    if (!aPSInter.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aS = VEmap(i);
     //
     TopoDS_Edge E;
@@ -721,7 +747,12 @@ void BRepOffset_Inter3d::ConnexIntByInt
   //
   // create unique intersection for each localized shared part
   aNb = aDMIntE.Extent();
-  for (i = 1; i <= aNb; ++i) {
+  Message_ProgressScope aPSPostTreat(aPSOuter.Next(2), "Creating unique intersection", aNb);
+  for (i = 1; i <= aNb; ++i, aPSPostTreat.Next()) {
+    if (!aPSPostTreat.More())
+    {
+      return;
+    }
     const TopTools_ListOfShape& aLS = aDMIntE(i);
     if (aLS.Extent() < 2) {
       continue;
@@ -893,6 +924,7 @@ void BRepOffset_Inter3d::ContextIntByInt
  TopTools_DataMapOfShapeShape&          MES,
  TopTools_DataMapOfShapeShape&          Build,
  TopTools_ListOfShape&                  Failed,
+ const Message_ProgressRange&           theRange,
  const Standard_Boolean                 bIsPlanar)
 {
   TopTools_MapOfShape              MV;
@@ -916,7 +948,12 @@ void BRepOffset_Inter3d::ContextIntByInt
   }
   TopAbs_State Side = TopAbs_OUT;
  
-  for (i = 1; i <= aNb; i++) {
+  Message_ProgressScope aPS(theRange, "Intersecting with deepening faces", aNb);
+  for (i = 1; i <= aNb; i++, aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& CF  = TopoDS::Face(ContextFaces(i));
     if (ExtentContext) WCF = TopoDS::Face(MES(CF));
     else               WCF = CF;
@@ -1076,13 +1113,12 @@ void BRepOffset_Inter3d::ContextIntByInt
 //function : ContextIntByArc
 //purpose  : 
 //=======================================================================
-
 void BRepOffset_Inter3d::ContextIntByArc(const TopTools_IndexedMapOfShape& ContextFaces, 
                                          const Standard_Boolean            InSide,
                                          const BRepOffset_Analyse&         Analyse, 
                                          const BRepAlgo_Image&             InitOffsetFace, 
-                                               BRepAlgo_Image&             InitOffsetEdge)
-
+                                               BRepAlgo_Image&             InitOffsetEdge,
+                                         const Message_ProgressRange&      theRange)
 { 
   TopTools_ListOfShape                      LInt1,LInt2;
   TopTools_MapOfShape                       MV;
@@ -1099,7 +1135,12 @@ void BRepOffset_Inter3d::ContextIntByArc(const TopTools_IndexedMapOfShape& Conte
     myTouched.Add(CF);
   }
 
-  for (j = 1; j <= ContextFaces.Extent(); j++) {
+  Message_ProgressScope aPS(theRange, "Intersecting with deepening faces", ContextFaces.Extent());
+  for (j = 1; j <= ContextFaces.Extent(); j++, aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& CF = TopoDS::Face(ContextFaces(j));
     for (exp.Init(CF.Oriented(TopAbs_FORWARD),TopAbs_EDGE); 
          exp.More(); exp.Next()) {
@@ -1271,21 +1312,10 @@ void BRepOffset_Inter3d::ContextIntByArc(const TopTools_IndexedMapOfShape& Conte
   }
 }
 
-//=======================================================================
-//function : AddCommonEdges
-//purpose  : 
-//=======================================================================
-
-void BRepOffset_Inter3d::AddCommonEdges(const TopTools_ListOfShape&)
-{
-}
-
-
 //=======================================================================
 //function : SetDone
 //purpose  : 
 //=======================================================================
-
 void BRepOffset_Inter3d::SetDone(const TopoDS_Face& F1, 
                                  const TopoDS_Face& F2)
 {
@@ -1301,15 +1331,12 @@ void BRepOffset_Inter3d::SetDone(const TopoDS_Face& F1,
   myDone(F2).Append(F1);
 }
 
-
 //=======================================================================
 //function : IsDone
 //purpose  : 
 //=======================================================================
-
-Standard_Boolean BRepOffset_Inter3d::IsDone(const TopoDS_Face& F1, 
-                                            const TopoDS_Face& F2) 
-const 
+Standard_Boolean BRepOffset_Inter3d::IsDone(const TopoDS_Face& F1,
+                                            const TopoDS_Face& F2) const
 {
   if (myDone.IsBound(F1)) {
     TopTools_ListIteratorOfListOfShape it (myDone(F1));
@@ -1320,46 +1347,10 @@ const
   return Standard_False;
 }
 
-
-//=======================================================================
-//function : TouchedFaces
-//purpose  : 
-//=======================================================================
-
-TopTools_IndexedMapOfShape& BRepOffset_Inter3d::TouchedFaces()
-{
-  return myTouched;
-}
-
-
-//=======================================================================
-//function : AsDes
-//purpose  : 
-//=======================================================================
-
-Handle(BRepAlgo_AsDes) BRepOffset_Inter3d::AsDes() const 
-{
-  return myAsDes;
-}
-
-
-//=======================================================================
-//function : NewEdges
-//purpose  : 
-//=======================================================================
-
-TopTools_IndexedMapOfShape& BRepOffset_Inter3d::NewEdges() 
-{
-  return myNewEdges;
-}
-
-
-
 //=======================================================================
 //function : Store
 //purpose  : 
 //=======================================================================
-
 void BRepOffset_Inter3d::Store(const TopoDS_Face& F1, 
                                const TopoDS_Face& F2, 
                                const TopTools_ListOfShape& LInt1, 
index e9607c89c5fefb47a8c05043507cb2f6817a236a..ffbddf3844f5ec7f17d7d3cc93f86c922228c464 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef _BRepOffset_Inter3d_HeaderFile
 #define _BRepOffset_Inter3d_HeaderFile
 
+#include <Message_ProgressRange.hxx>
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
@@ -36,70 +37,99 @@ class TopoDS_Shape;
 class BRepOffset_Analyse;
 
 
-//! Computes the intersection face face in a set of faces
-//! Store the result in a SD as AsDes.
-class BRepOffset_Inter3d 
+
+//! Computes the connection of the offset and not offset faces
+//! according to the connection type required.
+//! Store the result in AsDes tool.
+class BRepOffset_Inter3d
 {
 public:
-
   DEFINE_STANDARD_ALLOC
 
-  
-  Standard_EXPORT BRepOffset_Inter3d(const Handle(BRepAlgo_AsDes)& AsDes, const TopAbs_State Side, const Standard_Real Tol);
-  
-  Standard_EXPORT void CompletInt (const TopTools_ListOfShape& SetOfFaces, const BRepAlgo_Image& InitOffsetFace);
-  
-  Standard_EXPORT void FaceInter (const TopoDS_Face& F1, const TopoDS_Face& F2, const BRepAlgo_Image& InitOffsetFace);
-  
-  Standard_EXPORT void ConnexIntByArc (const TopTools_ListOfShape& SetOfFaces, const TopoDS_Shape& ShapeInit, const BRepOffset_Analyse& Analyse, const BRepAlgo_Image& InitOffsetFace);
-  
-  Standard_EXPORT void ConnexIntByInt (const TopoDS_Shape& SI, const BRepOffset_DataMapOfShapeOffset& MapSF, const BRepOffset_Analyse& A, TopTools_DataMapOfShapeShape& MES, TopTools_DataMapOfShapeShape& Build, TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar = Standard_False);
-  
-  Standard_EXPORT void ContextIntByInt (const TopTools_IndexedMapOfShape& ContextFaces, const Standard_Boolean ExtentContext, const BRepOffset_DataMapOfShapeOffset& MapSF, const BRepOffset_Analyse& A, TopTools_DataMapOfShapeShape& MES, TopTools_DataMapOfShapeShape& Build, TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar = Standard_False);
-  
-  Standard_EXPORT void ContextIntByArc (const TopTools_IndexedMapOfShape& ContextFaces, const Standard_Boolean ExtentContext, const BRepOffset_Analyse& Analyse, const BRepAlgo_Image& InitOffsetFace, BRepAlgo_Image& InitOffsetEdge);
-  
-  Standard_EXPORT void AddCommonEdges (const TopTools_ListOfShape& SetOfFaces);
-  
-  Standard_EXPORT void SetDone (const TopoDS_Face& F1, const TopoDS_Face& F2);
-  
-  Standard_EXPORT Standard_Boolean IsDone (const TopoDS_Face& F1, const TopoDS_Face& F2) const;
-  
-  Standard_EXPORT TopTools_IndexedMapOfShape& TouchedFaces();
-  
-  Standard_EXPORT Handle(BRepAlgo_AsDes) AsDes() const;
-  
-  Standard_EXPORT TopTools_IndexedMapOfShape& NewEdges();
-
-
-
+public:
 
-protected:
+  //! Constructor
+  Standard_EXPORT BRepOffset_Inter3d (const Handle (BRepAlgo_AsDes)& AsDes,
+                                      const TopAbs_State Side,
+                                      const Standard_Real Tol);
+
+  // Computes intersection of the given faces among each other
+  Standard_EXPORT void CompletInt (const TopTools_ListOfShape& SetOfFaces,
+                                   const BRepAlgo_Image& InitOffsetFace,
+                                   const Message_ProgressRange& theRange);
+
+  //! Computes intersection of pair of faces
+  Standard_EXPORT void FaceInter (const TopoDS_Face& F1,
+                                  const TopoDS_Face& F2,
+                                  const BRepAlgo_Image& InitOffsetFace);
+
+  //! Computes connections of the offset faces that have to be connected by arcs.
+  Standard_EXPORT void ConnexIntByArc (const TopTools_ListOfShape& SetOfFaces,
+                                       const TopoDS_Shape& ShapeInit,
+                                       const BRepOffset_Analyse& Analyse,
+                                       const BRepAlgo_Image& InitOffsetFace,
+                                       const Message_ProgressRange& theRange);
+
+  //! Computes intersection of the offset faces that have to be connected by
+  //! sharp edges, i.e. it computes intersection between extended offset faces.
+  Standard_EXPORT void ConnexIntByInt (const TopoDS_Shape& SI,
+                                       const BRepOffset_DataMapOfShapeOffset& MapSF,
+                                       const BRepOffset_Analyse& A,
+                                       TopTools_DataMapOfShapeShape& MES,
+                                       TopTools_DataMapOfShapeShape& Build,
+                                       TopTools_ListOfShape& Failed,
+                                       const Message_ProgressRange& theRange,
+                                       const Standard_Boolean bIsPlanar = Standard_False);
+
+  //! Computes intersection with not offset faces .
+  Standard_EXPORT void ContextIntByInt (const TopTools_IndexedMapOfShape& ContextFaces,
+                                        const Standard_Boolean ExtentContext,
+                                        const BRepOffset_DataMapOfShapeOffset& MapSF,
+                                        const BRepOffset_Analyse& A,
+                                        TopTools_DataMapOfShapeShape& MES,
+                                        TopTools_DataMapOfShapeShape& Build,
+                                        TopTools_ListOfShape& Failed,
+                                        const Message_ProgressRange& theRange,
+                                        const Standard_Boolean bIsPlanar = Standard_False);
+
+  //! Computes connections of the not offset faces that have to be connected by arcs
+  Standard_EXPORT void ContextIntByArc (const TopTools_IndexedMapOfShape& ContextFaces,
+                                        const Standard_Boolean ExtentContext,
+                                        const BRepOffset_Analyse& Analyse,
+                                        const BRepAlgo_Image& InitOffsetFace,
+                                        BRepAlgo_Image& InitOffsetEdge,
+                                        const Message_ProgressRange& theRange);
+
+  //! Marks the pair of faces as already intersected
+  Standard_EXPORT void SetDone (const TopoDS_Face& F1, const TopoDS_Face& F2);
 
+  //! Checks if the pair of faces has already been treated.
+  Standard_EXPORT Standard_Boolean IsDone (const TopoDS_Face& F1,
+                                           const TopoDS_Face& F2) const;
 
+  //! Returns touched faces
+  TopTools_IndexedMapOfShape& TouchedFaces() { return myTouched; };
 
+  //! Returns AsDes tool
+  Handle (BRepAlgo_AsDes) AsDes() const { return myAsDes; }
 
+  //! Returns new edges
+  TopTools_IndexedMapOfShape& NewEdges() { return myNewEdges; }
 
 private:
 
-  
-  Standard_EXPORT void Store (const TopoDS_Face& F1, const TopoDS_Face& F2, const TopTools_ListOfShape& LInt1, const TopTools_ListOfShape& LInt2);
+  //! Stores the intersection results into AsDes
+  Standard_EXPORT void Store (const TopoDS_Face& F1,
+                              const TopoDS_Face& F2,
+                              const TopTools_ListOfShape& LInt1,
+                              const TopTools_ListOfShape& LInt2);
 
-
-  Handle(BRepAlgo_AsDes) myAsDes;
+private:
+  Handle (BRepAlgo_AsDes) myAsDes;
   TopTools_IndexedMapOfShape myTouched;
   TopTools_DataMapOfShapeListOfShape myDone;
   TopTools_IndexedMapOfShape myNewEdges;
   TopAbs_State mySide;
   Standard_Real myTol;
-
-
 };
-
-
-
-
-
-
-
 #endif // _BRepOffset_Inter3d_HeaderFile
index de5eb39747575ab94f5f58270deaf324a8846b3f..738dba41323d59758cb8f1ef8dd36171a77c4bc4 100644 (file)
@@ -52,15 +52,21 @@ BRepOffset_MakeLoops::BRepOffset_MakeLoops()
 void BRepOffset_MakeLoops::Build(const TopTools_ListOfShape&   LF, 
                                 const Handle(BRepAlgo_AsDes)& AsDes, 
                                 BRepAlgo_Image&               Image,
-                                 BRepAlgo_Image&               theImageVV)
+                                 BRepAlgo_Image&               theImageVV,
+                                 const Message_ProgressRange&  theRange)
 {
   TopTools_ListIteratorOfListOfShape    it(LF);
   TopTools_ListIteratorOfListOfShape    itl,itLCE;
   BRepAlgo_Loop                       Loops;
   Loops.VerticesForSubstitute( myVerVerMap );
   Loops.SetImageVV (theImageVV);
-
-  for (; it.More(); it.Next()) {
+  Message_ProgressScope aPSOuter(theRange, NULL, 2);
+  Message_ProgressScope aPS1(aPSOuter.Next(), "Init loops", LF.Size());
+  for (; it.More(); it.Next(), aPS1.Next()) {
+    if (!aPS1.More())
+    {
+      return;
+    }
     const TopoDS_Face& F = TopoDS::Face(it.Value());
     //---------------------------
     // Initialization of Loops.
@@ -124,44 +130,49 @@ void BRepOffset_MakeLoops::Build(const TopTools_ListOfShape&   LF,
   if (myVerVerMap.IsEmpty())
     return;
   BRep_Builder BB;
-  for (it.Initialize( LF ); it.More(); it.Next())
+  Message_ProgressScope aPS2(aPSOuter.Next(), "Building loops", LF.Size());
+  for (it.Initialize(LF); it.More(); it.Next(), aPS2.Next())
+  {
+    if (!aPS2.More())
     {
-      TopoDS_Shape F = it.Value();
-      TopTools_ListOfShape LIF;
-      Image.LastImage( F, LIF );
-      for (itl.Initialize(LIF); itl.More(); itl.Next())
-       {
-         const TopoDS_Shape& IF = itl.Value();
-         TopExp_Explorer EdExp( IF, TopAbs_EDGE );
-         for (; EdExp.More(); EdExp.Next())
-           {
-             TopoDS_Shape E = EdExp.Current();
-             TopTools_ListOfShape VList;
-             TopoDS_Iterator VerExp( E );
-             for (; VerExp.More(); VerExp.Next())
-               VList.Append( VerExp.Value() );
-             TopTools_ListIteratorOfListOfShape itlv( VList );
-             for (; itlv.More(); itlv.Next())
-               {
-                 const TopoDS_Shape& V = itlv.Value();
-                 if (myVerVerMap.IsBound( V ))
-                   {
-                     TopoDS_Shape NewV = myVerVerMap( V );
-                     E.Free( Standard_True );
-                     NewV.Orientation( V.Orientation() );
-                     Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
-                     Handle(BRep_TVertex)& NewTV = *((Handle(BRep_TVertex)*) &NewV.TShape());
-                     if (TV->Tolerance() > NewTV->Tolerance())
-                       NewTV->Tolerance( TV->Tolerance() );
-                     NewTV->ChangePoints().Append( TV->ChangePoints() );
-                     AsDes->Replace( V, NewV );
-                     BB.Remove( E, V );
-                     BB.Add( E, NewV );
-                   }
-               }
-           }
-       }
+      return;
+    }
+    TopoDS_Shape F = it.Value();
+    TopTools_ListOfShape LIF;
+    Image.LastImage(F, LIF);
+    for (itl.Initialize(LIF); itl.More(); itl.Next())
+    {
+      const TopoDS_Shape& IF = itl.Value();
+      TopExp_Explorer EdExp(IF, TopAbs_EDGE);
+      for (; EdExp.More(); EdExp.Next())
+      {
+        TopoDS_Shape E = EdExp.Current();
+        TopTools_ListOfShape VList;
+        TopoDS_Iterator VerExp(E);
+        for (; VerExp.More(); VerExp.Next())
+          VList.Append(VerExp.Value());
+        TopTools_ListIteratorOfListOfShape itlv(VList);
+        for (; itlv.More(); itlv.Next())
+        {
+          const TopoDS_Shape& V = itlv.Value();
+          if (myVerVerMap.IsBound(V))
+          {
+            TopoDS_Shape NewV = myVerVerMap(V);
+            E.Free(Standard_True);
+            NewV.Orientation(V.Orientation());
+            Handle(BRep_TVertex)& TV = *((Handle(BRep_TVertex)*) &V.TShape());
+            Handle(BRep_TVertex)& NewTV = *((Handle(BRep_TVertex)*) &NewV.TShape());
+            if (TV->Tolerance() > NewTV->Tolerance())
+              NewTV->Tolerance(TV->Tolerance());
+            NewTV->ChangePoints().Append(TV->ChangePoints());
+            AsDes->Replace(V, NewV);
+            BB.Remove(E, V);
+            BB.Add(E, NewV);
+          }
+        }
+      }
     }
+  }
 }
 
 //=======================================================================
@@ -196,10 +207,11 @@ static Standard_Boolean IsBetweenCorks(const TopoDS_Shape& E,
 //=======================================================================
 
 void BRepOffset_MakeLoops::BuildOnContext(const TopTools_ListOfShape&   LContext,  
-                                         const BRepOffset_Analyse&     Analyse, 
-                                         const Handle(BRepAlgo_AsDes)& AsDes, 
-                                         BRepAlgo_Image&               Image,
-                                         const Standard_Boolean        InSide)
+                                          const BRepOffset_Analyse&     Analyse, 
+                                          const Handle(BRepAlgo_AsDes)& AsDes, 
+                                          BRepAlgo_Image&               Image,
+                                          const Standard_Boolean        InSide,
+                                          const Message_ProgressRange&  theRange)
 {
   //-----------------------------------------
   // unwinding of caps.
@@ -211,7 +223,12 @@ void BRepOffset_MakeLoops::BuildOnContext(const TopTools_ListOfShape&   LContext
   TopExp_Explorer                     exp; 
   TopTools_MapOfShape                 MapExtent;
 
-  for (; it.More(); it.Next()) {
+  Message_ProgressScope aPS(theRange, "Building deepening faces", LContext.Extent());
+  for (; it.More(); it.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& F = TopoDS::Face(it.Value());
     TopTools_MapOfShape                 MBound;
     //-----------------------------------------------
@@ -383,7 +400,8 @@ void BRepOffset_MakeLoops::BuildOnContext(const TopTools_ListOfShape&   LContext
   
 void BRepOffset_MakeLoops::BuildFaces(const TopTools_ListOfShape&   LF, 
                                      const Handle(BRepAlgo_AsDes)& AsDes, 
-                                     BRepAlgo_Image&               Image)
+                                     BRepAlgo_Image&               Image,
+                                      const Message_ProgressRange&  theRange)
 {
   TopTools_ListIteratorOfListOfShape itr,itl,itLCE;
   Standard_Boolean                   ToRebuild;
@@ -394,7 +412,12 @@ void BRepOffset_MakeLoops::BuildFaces(const TopTools_ListOfShape&   LF,
   //----------------------------------
   // Loop on all faces //.
   //----------------------------------
-  for (itr.Initialize(LF); itr.More(); itr.Next()) {
+  Message_ProgressScope aPS(theRange, "Building faces", LF.Size());
+  for (itr.Initialize(LF); itr.More(); itr.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      return;
+    }
     TopoDS_Face F = TopoDS::Face(itr.Value());
     Loops.Init(F);
     ToRebuild = Standard_False;
index 7caf1b3fe657e23a9114608804852e5e90d51820..e309f50e4fb05052d71d1f1ac4849400293cdbde 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef _BRepOffset_MakeLoops_HeaderFile
 #define _BRepOffset_MakeLoops_HeaderFile
 
+#include <Message_ProgressRange.hxx>
+
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
@@ -42,17 +44,20 @@ public:
   Standard_EXPORT void Build (const TopTools_ListOfShape& LF,
                               const Handle(BRepAlgo_AsDes)& AsDes,
                               BRepAlgo_Image& Image,
-                              BRepAlgo_Image& theImageVV);
+                              BRepAlgo_Image& theImageVV,
+                              const Message_ProgressRange& theRange);
   
   Standard_EXPORT void BuildOnContext (const TopTools_ListOfShape& LContext,
                                        const BRepOffset_Analyse& Analyse,
                                        const Handle(BRepAlgo_AsDes)& AsDes,
                                        BRepAlgo_Image& Image,
-                                       const Standard_Boolean InSide);
+                                       const Standard_Boolean InSide,
+                                       const Message_ProgressRange& theRange);
   
   Standard_EXPORT void BuildFaces (const TopTools_ListOfShape& LF,
                                    const Handle(BRepAlgo_AsDes)& AsDes,
-                                   BRepAlgo_Image& Image);
+                                   BRepAlgo_Image& Image,
+                                   const Message_ProgressRange& theRange);
 
 
 
index 2c5fe795f3f622145fa4562ce71ad4881c7b6c8e..e18919550ca7b391cd6da7c9d3c28eea507d2c26 100644 (file)
@@ -241,6 +241,46 @@ static void DEBVerticesControl (const TopTools_IndexedMapOfShape& NewEdges,
 }  
 #endif
 
+namespace
+{
+  //=======================================================================
+  //function : BRepOffset_PIOperation
+  //purpose  : List of operations to be supported by the Progress Indicator
+  //=======================================================================
+  enum BRepOffset_PIOperation
+  {
+    PIOperation_CheckInputData = 0,
+    PIOperation_Analyse,
+    PIOperation_BuildOffsetBy,
+    PIOperation_Intersection,
+    PIOperation_MakeMissingWalls,
+    PIOperation_MakeShells,
+    PIOperation_MakeSolid,
+    PIOperation_Sewing,
+    PIOperation_Last
+  };
+
+  //=======================================================================
+  //function : normalizeSteps
+  //purpose  : Normalization of progress steps
+  //=======================================================================
+  static void normalizeSteps(const Standard_Real theWhole,
+                             TColStd_Array1OfReal& theSteps)
+  {
+    Standard_Real aSum = 0.;
+    for (Standard_Integer i = theSteps.Lower(); i <= theSteps.Upper(); ++i)
+    {
+      aSum += theSteps(i);
+    }
+
+    // Normalize steps
+    for (Standard_Integer i = theSteps.Lower(); i <= theSteps.Upper(); ++i)
+    {
+      theSteps(i) = theWhole * theSteps(i) / aSum;
+    }
+  }
+
+}
 
 //=======================================================================
 // static methods
@@ -256,7 +296,8 @@ static
 static
   Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF,
                                             BRepAlgo_Image& theImage,
-                                            TopoDS_Shape& theShells);
+                                            TopoDS_Shape& theShells,
+                                            const Message_ProgressRange& theRange);
 
 static
   Standard_Boolean GetSubShapes(const TopoDS_Shape& theShape,
@@ -581,13 +622,14 @@ BRepOffset_MakeOffset::BRepOffset_MakeOffset()
 
 BRepOffset_MakeOffset::BRepOffset_MakeOffset(const TopoDS_Shape&    S, 
                                              const Standard_Real    Offset, 
-                                             const Standard_Real    Tol, 
+                                             const Standard_Real    Tol,
                                              const BRepOffset_Mode  Mode, 
                                              const Standard_Boolean Inter, 
                                              const Standard_Boolean SelfInter, 
                                              const GeomAbs_JoinType Join,
                                              const Standard_Boolean Thickening,
-                                             const Standard_Boolean RemoveIntEdges)
+                                             const Standard_Boolean RemoveIntEdges,
+                                             const Message_ProgressRange& theRange)
 : 
 myOffset     (Offset),
 myTol        (Tol),
@@ -604,7 +646,7 @@ myDone     (Standard_False)
   myAsDes = new BRepAlgo_AsDes();
   myIsLinearizationAllowed = Standard_True;
   
-  MakeOffsetShape();
+  MakeOffsetShape(theRange);
 }
 
 
@@ -835,7 +877,7 @@ void BRepOffset_MakeOffset::SetFacesWithOffset()
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeOffsetShape()
+void BRepOffset_MakeOffset::MakeOffsetShape(const Message_ProgressRange& theRange)
 {  
   myDone = Standard_False;
   //
@@ -857,7 +899,12 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
     RemoveCorks (myFaceComp, myFaces);
   }
 
-  if (!CheckInputData())
+  Message_ProgressScope aPS(theRange, "Making offset shape", 100);
+
+  TColStd_Array1OfReal aSteps(0, PIOperation_Last - 1);
+  analyzeProgress(100., aSteps);
+
+  if (!CheckInputData(aPS.Next(aSteps(PIOperation_CheckInputData))) || myError != BRepOffset_NoError)
   {
     // There is error in input data.
     // Check Error() method.
@@ -879,7 +926,12 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
     myAnalyse.SetOffsetValue (myOffset);
     myAnalyse.SetFaceOffsetMap (myFaceOffset);
   }
-  myAnalyse.Perform(myFaceComp,TolAngle);
+  myAnalyse.Perform(myFaceComp,TolAngle, aPS.Next(aSteps(PIOperation_Analyse)));
+  if (!aPS.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
+  }
   //---------------------------------------------------
   // Construction of Offset from preanalysis.
   //---------------------------------------------------  
@@ -889,9 +941,9 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
   UpdateFaceOffset();
 
   if (myJoin == GeomAbs_Arc)          
-    BuildOffsetByArc();
+    BuildOffsetByArc(aPS.Next(aSteps(PIOperation_BuildOffsetBy)));
   else if (myJoin == GeomAbs_Intersection) 
-    BuildOffsetByInter();
+    BuildOffsetByInter(aPS.Next(aSteps(PIOperation_BuildOffsetBy)));
   if (myError != BRepOffset_NoError)
   {
     return;
@@ -903,32 +955,71 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
   //-----------------
   // Intersection 3d .
   //-----------------
+  Message_ProgressScope aPSInter(aPS.Next(aSteps(PIOperation_Intersection)), NULL, 100);
+  aPSInter.SetName((myJoin == GeomAbs_Arc) ? "Connect offset faces by arc" :
+                                             "Connect offset faces by intersection");
+
   BRepOffset_Inter3d Inter(myAsDes,Side,myTol);
-  Intersection3D (Inter);
+  Intersection3D (Inter, aPSInter.Next(90));
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //-----------------
   // Intersection2D
   //-----------------
   TopTools_IndexedMapOfShape& Modif    = Inter.TouchedFaces(); 
   TopTools_IndexedMapOfShape& NewEdges = Inter.NewEdges();
 
-  if (!Modif.IsEmpty()) Intersection2D (Modif,NewEdges);
+  if (!Modif.IsEmpty())
+  {
+    Intersection2D(Modif, NewEdges, aPSInter.Next(4));
+    if (myError != BRepOffset_NoError)
+    {
+      return;
+    }
+  }
+
   //-------------------------------------------------------
   // Unwinding 2D and reconstruction of modified faces
   //----------------------------------------------------
-  MakeLoops (Modif);
+  MakeLoops (Modif, aPSInter.Next(4));
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //-----------------------------------------------------
   // Reconstruction of non modified faces sharing 
   // reconstructed edges
   //------------------------------------------------------
-  if (!Modif.IsEmpty()) MakeFaces (Modif);
+  if (!Modif.IsEmpty())
+  {
+    MakeFaces(Modif, aPSInter.Next(2));
+    if (myError != BRepOffset_NoError)
+    {
+      return;
+    }
+  }
+
+  aPSInter.Close();
 
   if (myThickening)
-    MakeMissingWalls();
+  {
+    MakeMissingWalls(aPS.Next(aSteps(PIOperation_MakeMissingWalls)));
+    if (myError != BRepOffset_NoError)
+    {
+      return;
+    }
+  }
 
   //-------------------------
   // Construction of shells.
   //-------------------------
-  MakeShells ();
+  MakeShells (aPS.Next(aSteps(PIOperation_MakeShells)));
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   if (myOffsetShape.IsNull()) {
     // not done
     myDone = Standard_False;
@@ -955,8 +1046,11 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
   //----------------------
   // Creation of solids.
   //----------------------
-  MakeSolid ();
-
+  MakeSolid (aPS.Next(aSteps(PIOperation_MakeSolid)));
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //-----------------------------
   // MAJ Tolerance edge and Vertex
   // ----------------------------
@@ -973,13 +1067,22 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
   {
     BRepBuilderAPI_Sewing aSew(myTol);
     aSew.Add(myOffsetShape);
-    aSew.Perform();
+    aSew.Perform(aPS.Next(aSteps(PIOperation_Sewing) / 2.));
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     myOffsetShape = aSew.SewedShape();
 
     // Rebuild solid.
     // Offset shape expected to be really closed after sewing.
     myOffsetShape.Closed(Standard_True);
-    MakeSolid();
+    MakeSolid(aPS.Next(aSteps(PIOperation_Sewing) / 2.));
+    if (myError != BRepOffset_NoError)
+    {
+      return;
+    }
   }
 
   myDone = Standard_True;
@@ -992,12 +1095,12 @@ void BRepOffset_MakeOffset::MakeOffsetShape()
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeThickSolid(
+void BRepOffset_MakeOffset::MakeThickSolid(const Message_ProgressRange& theRange)
 {
   //--------------------------------------------------------------
   // Construction of shell parallel to shell (initial without cap).
   //--------------------------------------------------------------
-  MakeOffsetShape ();
+  MakeOffsetShape (theRange);
 
   if (!myDone)
   {
@@ -1115,7 +1218,7 @@ const TopoDS_Shape&  BRepOffset_MakeOffset::Shape() const
 //function : MakeOffsetFaces
 //purpose  : 
 //=======================================================================
-void BRepOffset_MakeOffset::MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& theMapSF)
+void BRepOffset_MakeOffset::MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& theMapSF, const Message_ProgressRange& theRange)
 {
   Standard_Real aCurOffset;
   TopTools_ListOfShape aLF;
@@ -1126,8 +1229,14 @@ void BRepOffset_MakeOffset::MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& the
   //
   BRepLib::SortFaces(myFaceComp, aLF);
   //
+  Message_ProgressScope aPS(theRange, "Making offset faces", aLF.Size());
   aItLF.Initialize(aLF);
-  for (; aItLF.More(); aItLF.Next()) {
+  for (; aItLF.More(); aItLF.Next(), aPS.Next()) {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Face& aF = TopoDS::Face(aItLF.Value());
     aCurOffset = myFaceOffset.IsBound(aF) ? myFaceOffset(aF) : myOffset;
     BRepOffset_Offset OF(aF, aCurOffset, ShapeTgt, OffsetOutside, myJoin);
@@ -1175,7 +1284,7 @@ void BRepOffset_MakeOffset::MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& the
 //function : BuildOffsetByInter
 //purpose  : 
 //=======================================================================
-void BRepOffset_MakeOffset::BuildOffsetByInter()
+void BRepOffset_MakeOffset::BuildOffsetByInter(const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
   if ( ChronBuild) {
@@ -1185,14 +1294,57 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   }
 #endif
 
+  Message_ProgressScope aPSOuter(theRange, "Connect offset faces by intersection", 100);
+  // just for better management and visualization of the progress steps
+  // define a nested enum listing all the steps of the current method.
+  enum BuildOffsetByInter_PISteps
+  {
+    BuildOffsetByInter_MakeOffsetFaces = 0,
+    BuildOffsetByInter_ConnexIntByInt,
+    BuildOffsetByInter_ContextIntByInt,
+    BuildOffsetByInter_IntersectEdges,
+    BuildOffsetByInter_CompleteEdgesIntersection,
+    BuildOffsetByInter_BuildFaces,
+    BuildOffsetByInter_FillHistoryForOffsets,
+    BuildOffsetByInter_FillHistoryForDeepenings,
+    BuildOffsetByInter_Last
+  };
+
+  Standard_Real aNbFaces = myFaceComp.NbChildren() + myAnalyse.NewFaces().Extent() + myFaces.Extent();
+  Standard_Real anOffsetsPart = (myFaceComp.NbChildren() + myAnalyse.NewFaces().Extent()) / aNbFaces;
+  Standard_Real aDeepeningsPart = myFaces.Extent() / aNbFaces;
+
+  TColStd_Array1OfReal aSteps(0, BuildOffsetByInter_Last - 1);
+  {
+    aSteps.Init(0);
+
+    Standard_Boolean isInter = myJoin == GeomAbs_Intersection;
+    Standard_Real aFaceInter = isInter ? 25. : 50.;
+    Standard_Real aBuildFaces = isInter ? 50. : 25.;
+    aSteps(BuildOffsetByInter_MakeOffsetFaces) = 5.;
+    aSteps(BuildOffsetByInter_ConnexIntByInt)  = aFaceInter * anOffsetsPart;
+    aSteps(BuildOffsetByInter_ContextIntByInt) = aFaceInter * aDeepeningsPart;
+    aSteps(BuildOffsetByInter_IntersectEdges) = 10.;
+    aSteps(BuildOffsetByInter_CompleteEdgesIntersection) = 5.;
+    aSteps(BuildOffsetByInter_BuildFaces) = aBuildFaces;
+    aSteps(BuildOffsetByInter_FillHistoryForOffsets) = 5. * anOffsetsPart;
+    aSteps(BuildOffsetByInter_FillHistoryForDeepenings) = 5. * aDeepeningsPart;
+    normalizeSteps(100., aSteps);
+  }
+
   TopExp_Explorer Exp, Exp2, ExpC;
   TopTools_ListIteratorOfListOfShape itLF;
-  
+
   //--------------------------------------------------------
   // Construction of faces parallel to initial faces
   //--------------------------------------------------------
   BRepOffset_DataMapOfShapeOffset MapSF;
-  MakeOffsetFaces(MapSF);
+  MakeOffsetFaces(MapSF, aPSOuter.Next(aSteps(BuildOffsetByInter_MakeOffsetFaces)));
+  if (!aPSOuter.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
+  }
   //--------------------------------------------------------------------
   // MES   : Map of OffsetShape -> Extended Shapes.
   // Build : Map of Initial SS  -> OffsetShape build by Inter.
@@ -1212,9 +1364,21 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
 
   BRepOffset_Inter3d Inter3 (AsDes,Side,myTol);
   // Intersection between parallel faces
-  Inter3.ConnexIntByInt(myFaceComp,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar);
+  Inter3.ConnexIntByInt(myFaceComp, MapSF, myAnalyse, MES, Build, Failed,
+                        aPSOuter.Next(aSteps(BuildOffsetByInter_ConnexIntByInt)), myIsPlanar);
+  if (!aPSOuter.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
+  }
   // Intersection with caps.
-  Inter3.ContextIntByInt(myFaces,ExtentContext,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar);
+  Inter3.ContextIntByInt(myFaces, ExtentContext, MapSF, myAnalyse, MES, Build, Failed,
+                         aPSOuter.Next(aSteps(BuildOffsetByInter_ContextIntByInt)), myIsPlanar);
+  if (!aPSOuter.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
+  }
 
   TopTools_ListOfShape aLFaces;
   for (Exp.Init(myFaceComp,TopAbs_FACE) ; Exp.More(); Exp.Next())
@@ -1225,7 +1389,8 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   // 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);
+  IntersectEdges(aLFaces, MapSF, MES, Build, AsDes, AsDes2d,
+                 aPSOuter.Next(aSteps(BuildOffsetByInter_IntersectEdges)));
   if (myError != BRepOffset_NoError)
   {
     return;
@@ -1240,7 +1405,8 @@ 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. 
-  if (!TrimEdges(myFaceComp, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins))
+  if (!TrimEdges(myFaceComp, myOffset, myAnalyse, MapSF, MES, Build,
+                 AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins))
   {
     myError = BRepOffset_CannotTrimEdges;
     return;
@@ -1256,21 +1422,34 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   GetEnlargedFaces(aLFaces, MapSF, MES, aFacesOrigins, IMOE, LFE);
   //
   TopTools_ListIteratorOfListOfShape itLFE(LFE);
+  Message_ProgressScope aPS2d(aPSOuter.Next(aSteps(BuildOffsetByInter_CompleteEdgesIntersection)), NULL, 2);
+  Message_ProgressScope aPS2dOffsets(aPS2d.Next(2. * anOffsetsPart), NULL, LFE.Size());
   for (; itLFE.More(); itLFE.Next())
   {
+    if (!aPS2dOffsets.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Face& NEF = TopoDS::Face(itLFE.Value());
     Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(NEF);
-    BRepOffset_Inter2d::Compute(AsDes, NEF, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV);
+    BRepOffset_Inter2d::Compute(AsDes, NEF, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV, aPS2dOffsets.Next());
   }
   //----------------------------------------------
   // Intersections 2d on caps.
   //----------------------------------------------
   Standard_Integer i;
+  Message_ProgressScope aPS2dCaps(aPS2d.Next(2. * aDeepeningsPart), NULL, myFaces.Extent());
   for (i = 1; i <= myFaces.Extent(); i++)
   {
+    if (!aPS2dCaps.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Face& Cork = TopoDS::Face(myFaces(i));
     Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(Cork);
-    BRepOffset_Inter2d::Compute(AsDes, Cork, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV);
+    BRepOffset_Inter2d::Compute(AsDes, Cork, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV, aPS2dCaps.Next());
   }
   //
   BRepOffset_Inter2d::FuseVertices(aDMVV, AsDes, myImageVV);
@@ -1281,7 +1460,12 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   TopTools_MapOfShape aMFDone;
   //
   if ((myJoin == GeomAbs_Intersection) && myInter && myIsPlanar) {
-    BuildSplitsOfExtendedFaces(LFE, myAnalyse, AsDes, anEdgesOrigins, aFacesOrigins, aETrimEInf, IMOE);
+    BuildSplitsOfExtendedFaces(LFE, myAnalyse, AsDes, anEdgesOrigins, aFacesOrigins, aETrimEInf,
+                               IMOE, aPSOuter.Next(aSteps(BuildOffsetByInter_BuildFaces)));
+    if (myError != BRepOffset_NoError)
+    {
+      return;
+    }
     //
     TopTools_ListIteratorOfListOfShape aItLF(LFE);
     for (; aItLF.More(); aItLF.Next()) {
@@ -1290,7 +1474,12 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
     }
   }
   else {
-    myMakeLoops.Build(LFE, AsDes, IMOE, myImageVV);
+    myMakeLoops.Build(LFE, AsDes, IMOE, myImageVV, aPSOuter.Next(aSteps(BuildOffsetByInter_BuildFaces)));
+    if (!aPSOuter.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
   }
   //
 #ifdef OCCT_DEBUG
@@ -1299,8 +1488,15 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   //---------------------------
   // MAJ SD. for faces //
   //---------------------------
-  for (TopTools_ListOfShape::Iterator it (aLFaces); it.More(); it.Next())
+  Message_ProgressScope aPSHist(aPSOuter.Next(aSteps(BuildOffsetByInter_FillHistoryForOffsets)),
+                                "Fill history for offset faces", aLFaces.Size());
+  for (TopTools_ListOfShape::Iterator it (aLFaces); it.More(); it.Next(), aPSHist.Next())
   {
+    if (!aPSHist.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Shape& FI   = it.Value();
     myInitOffsetFace.SetRoot(FI);
     TopoDS_Face  OF  = MapSF(FI).Face();
@@ -1420,7 +1616,7 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
             TopoDS_Vertex CV1,CV2;
             TopExp::Vertices(COE,CV1,CV2);
             if (!CV1.IsNull()) myAsDes->Add(COE,CV1.Oriented(TopAbs_FORWARD));
-            if (!CV2.IsNull()) myAsDes->Add(COE,CV2.Oriented(TopAbs_REVERSED));        
+            if (!CV2.IsNull()) myAsDes->Add(COE,CV2.Oriented(TopAbs_REVERSED));
           }
         }
       } 
@@ -1491,7 +1687,14 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
   // MAJ SD. for caps
   //---------------------------
   //TopTools_MapOfShape View; 
-  for (i = 1; i <= myFaces.Extent(); i++) {
+  Message_ProgressScope aPSHist2(aPSOuter.Next(aSteps(BuildOffsetByInter_FillHistoryForDeepenings)),
+                                 "Fill history for deepening faces", myFaces.Extent());
+  for (i = 1; i <= myFaces.Extent(); i++, aPSHist2.Next()) {
+    if (!aPSHist2.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Shape& Cork = myFaces(i);
     const TopTools_ListOfShape& LE = AsDes->Descendant(Cork);
     for (itLF.Initialize(LE) ; itLF.More(); itLF.Next()) {
@@ -1514,7 +1717,7 @@ void BRepOffset_MakeOffset::BuildOffsetByInter()
             TopoDS_Vertex CV1,CV2;
             TopExp::Vertices(COE,CV1,CV2);
             if (!CV1.IsNull()) myAsDes->Add(COE,CV1.Oriented(TopAbs_FORWARD));
-            if (!CV2.IsNull()) myAsDes->Add(COE,CV2.Oriented(TopAbs_REVERSED));          
+            if (!CV2.IsNull()) myAsDes->Add(COE,CV2.Oriented(TopAbs_REVERSED));
           }
         }
       }
@@ -1604,7 +1807,7 @@ void BRepOffset_MakeOffset::BuildFaceComp()
 //function : BuildOffsetByArc
 //purpose  : 
 //=======================================================================
-void BRepOffset_MakeOffset::BuildOffsetByArc()
+void BRepOffset_MakeOffset::BuildOffsetByArc(const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
   if ( ChronBuild) {
@@ -1617,19 +1820,29 @@ void BRepOffset_MakeOffset::BuildOffsetByArc()
   TopExp_Explorer Exp;
   TopTools_ListIteratorOfListOfShape itLF;
   TopTools_MapOfShape Done;
-  
+  Message_ProgressScope aPSOuter(theRange, NULL, 10);
   //--------------------------------------------------------
   // Construction of faces parallel to initial faces
   //--------------------------------------------------------
   BRepOffset_DataMapOfShapeOffset MapSF;
-  MakeOffsetFaces(MapSF);
+  MakeOffsetFaces(MapSF, aPSOuter.Next());
+  if (myError != BRepOffset_NoError)
+  {
+    return;
+  }
   //--------------------------------------------------------
   // Construction of tubes on edge.
   //--------------------------------------------------------
   ChFiDS_TypeOfConcavity OT = ChFiDS_Convex;
   if (myOffset < 0.) OT = ChFiDS_Concave; 
-   
-  for (Exp.Init(myFaceComp,TopAbs_EDGE); Exp.More(); Exp.Next()) {
+
+  Message_ProgressScope aPS1(aPSOuter.Next(4), "Constructing tubes on edges", 1, Standard_True);
+  for (Exp.Init(myFaceComp,TopAbs_EDGE); Exp.More(); Exp.Next(), aPS1.Next()) {
+    if (!aPS1.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Edge& E = TopoDS::Edge(Exp.Current());
     if (Done.Add(E)) {
       const TopTools_ListOfShape& Anc = myAnalyse.Ancestors(E);
@@ -1697,8 +1910,13 @@ void BRepOffset_MakeOffset::BuildOffsetByArc()
   //--------------------------------------------------------
   Done.Clear();
   TopTools_ListIteratorOfListOfShape it;
-
-  for (Exp.Init(myFaceComp,TopAbs_VERTEX); Exp.More(); Exp.Next()) {
+  Message_ProgressScope aPS2(aPSOuter.Next(4), "Constructing spheres on vertices", 1, Standard_True);
+  for (Exp.Init(myFaceComp,TopAbs_VERTEX); Exp.More(); Exp.Next(), aPS2.Next()) {
+    if (!aPS2.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Vertex& V = TopoDS::Vertex (Exp.Current());
     if (Done.Add(V)) {
       const TopTools_ListOfShape& LA = myAnalyse.Ancestors(V);
@@ -1758,7 +1976,13 @@ void BRepOffset_MakeOffset::BuildOffsetByArc()
   ChFiDS_TypeOfConcavity RT = ChFiDS_Concave;
   if (myOffset < 0.) RT = ChFiDS_Convex;
   BRepOffset_DataMapIteratorOfDataMapOfShapeOffset It(MapSF);
-  for ( ; It.More(); It.Next()) {
+  Message_ProgressScope aPS3(aPSOuter.Next(), NULL, MapSF.Size());
+  for ( ; It.More(); It.Next(), aPS3.Next()) {
+    if (!aPS3.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Shape& SI = It.Key(); 
     const BRepOffset_Offset& SF = It.Value();
     if (SF.Status() == BRepOffset_Reversed ||
@@ -2449,7 +2673,7 @@ void BRepOffset_MakeOffset::CorrectConicalFaces()
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter)
+void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter, const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
   if (ChronBuild) {
@@ -2458,6 +2682,7 @@ void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter)
     Clock.Start();  
   }
 #endif
+  Message_ProgressScope aPS(theRange, NULL, (myFaces.Extent() && myJoin == GeomAbs_Arc) ? 2 : 1);
 
   // In the Complete Intersection mode, implemented currently for planar
   // solids only, there is no need to intersect the faces here.
@@ -2480,13 +2705,18 @@ void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter)
     // between the cap and the part.
 
     if (myJoin == GeomAbs_Arc) 
-      Inter.ContextIntByArc (myFaces,InSide,myAnalyse,myInitOffsetFace,myInitOffsetEdge);
+      Inter.ContextIntByArc (myFaces,InSide,myAnalyse,myInitOffsetFace,myInitOffsetEdge, aPS.Next());
   }
   if (myInter) {
     //-------------
     //Complete.
     //-------------
-    Inter.CompletInt (OffsetFaces,myInitOffsetFace);
+    Inter.CompletInt (OffsetFaces,myInitOffsetFace, aPS.Next());
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     TopTools_IndexedMapOfShape& NewEdges = Inter.NewEdges();
     if (myJoin == GeomAbs_Intersection) {
       BRepOffset_Tool::CorrectOrientation (myFaceComp,NewEdges,myAsDes,myInitOffsetFace,myOffset);
@@ -2496,7 +2726,12 @@ void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter)
     //--------------------------------
     // Only between neighbor faces.
     //--------------------------------
-    Inter.ConnexIntByArc(OffsetFaces,myFaceComp,myAnalyse,myInitOffsetFace);
+    Inter.ConnexIntByArc(OffsetFaces,myFaceComp,myAnalyse,myInitOffsetFace, aPS.Next());
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
   }
 #ifdef OCCT_DEBUG
   if ( ChronBuild) Clock.Show();
@@ -2508,8 +2743,9 @@ void BRepOffset_MakeOffset::Intersection3D(BRepOffset_Inter3d& Inter)
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::Intersection2D(const TopTools_IndexedMapOfShape& Modif,
-                                           const TopTools_IndexedMapOfShape& NewEdges)
+void BRepOffset_MakeOffset::Intersection2D (const TopTools_IndexedMapOfShape& Modif,
+                                            const TopTools_IndexedMapOfShape& NewEdges,
+                                            const Message_ProgressRange&      theRange)
 {
 #ifdef OCCT_DEBUG
   if (ChronBuild) {
@@ -2528,9 +2764,15 @@ void BRepOffset_MakeOffset::Intersection2D(const TopTools_IndexedMapOfShape& Mod
   //-----------------------------------------------
   TopTools_IndexedDataMapOfShapeListOfShape aDMVV;
   Standard_Integer i;
+  Message_ProgressScope aPS(theRange, "Intersection 2D", Modif.Extent());
   for (i = 1; i <= Modif.Extent(); i++) {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     const TopoDS_Face& F  = TopoDS::Face(Modif(i));
-    BRepOffset_Inter2d::Compute(myAsDes, F, NewEdges, myTol, myEdgeIntEdges, aDMVV);
+    BRepOffset_Inter2d::Compute(myAsDes, F, NewEdges, myTol, myEdgeIntEdges, aDMVV, aPS.Next());
   }
   //
   BRepOffset_Inter2d::FuseVertices(aDMVV, myAsDes, myImageVV);
@@ -2549,7 +2791,7 @@ void BRepOffset_MakeOffset::Intersection2D(const TopTools_IndexedMapOfShape& Mod
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeLoops(TopTools_IndexedMapOfShape& Modif)
+void BRepOffset_MakeOffset::MakeLoops(TopTools_IndexedMapOfShape& Modif, const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
   if (ChronBuild) {
@@ -2569,11 +2811,17 @@ void BRepOffset_MakeOffset::MakeLoops(TopTools_IndexedMapOfShape& Modif)
       LF.Append(Modif(i));
   }
   //
+  Message_ProgressScope aPS(theRange, NULL, LF.Extent() + myFaces.Extent());
   if ((myJoin == GeomAbs_Intersection) && myInter && myIsPlanar) {
-    BuildSplitsOfTrimmedFaces(LF, myAsDes, myImageOffset);
+    BuildSplitsOfTrimmedFaces(LF, myAsDes, myImageOffset, aPS.Next(LF.Extent()));
   }
   else {
-    myMakeLoops.Build(LF,myAsDes,myImageOffset,myImageVV);
+    myMakeLoops.Build(LF,myAsDes,myImageOffset,myImageVV, aPS.Next(LF.Extent()));
+  }
+  if (!aPS.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
   }
 
   //-----------------------------------------
@@ -2584,7 +2832,7 @@ void BRepOffset_MakeOffset::MakeLoops(TopTools_IndexedMapOfShape& Modif)
 
   Standard_Boolean   InSide = 1;
   if (myOffset > 0 ) InSide = 0;
-  myMakeLoops.BuildOnContext(LC,myAnalyse,myAsDes,myImageOffset,InSide);
+  myMakeLoops.BuildOnContext(LC,myAnalyse,myAsDes,myImageOffset,InSide, aPS.Next(LC.Extent()));
 
 #ifdef OCCT_DEBUG
   if ( ChronBuild) Clock.Show();
@@ -2597,10 +2845,11 @@ void BRepOffset_MakeOffset::MakeLoops(TopTools_IndexedMapOfShape& Modif)
 //           share edges that were reconstructed.
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeFaces(TopTools_IndexedMapOfShape& /*Modif*/)
+void BRepOffset_MakeOffset::MakeFaces (TopTools_IndexedMapOfShape& /*Modif*/,
+                                       const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
-  if (ChronBuild) {  
+  if (ChronBuild) {
     std::cout << " RECONSTRUCTION OF FACES:" << std::endl;
     Clock.Reset();
     Clock.Start();
@@ -2619,13 +2868,18 @@ void BRepOffset_MakeOffset::MakeFaces(TopTools_IndexedMapOfShape& /*Modif*/)
     }
   }
   //
+  Message_ProgressScope aPS(theRange, NULL, 1);
   if ((myJoin == GeomAbs_Intersection) && myInter && myIsPlanar) {
-    BuildSplitsOfTrimmedFaces(LOF, myAsDes, myImageOffset);
+    BuildSplitsOfTrimmedFaces(LOF, myAsDes, myImageOffset, aPS.Next());
   }
   else {
-    myMakeLoops.BuildFaces(LOF,myAsDes,myImageOffset);
+    myMakeLoops.BuildFaces(LOF, myAsDes, myImageOffset, aPS.Next());
+  }
+  if (!aPS.More())
+  {
+    myError = BRepOffset_UserBreak;
+    return;
   }
-  
 #ifdef OCCT_DEBUG
   if ( ChronBuild) Clock.Show();
 #endif
@@ -2672,7 +2926,7 @@ static void UpdateInitOffset (BRepAlgo_Image&         myInitOffset,
 //function : MakeMissingWalls
 //purpose  : 
 //=======================================================================
-void BRepOffset_MakeOffset::MakeMissingWalls ()
+void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRange)
 {
   TopTools_IndexedDataMapOfShapeListOfShape Contours; //Start vertex + list of connected edges (free boundary)
   TopTools_DataMapOfShapeShape MapEF; //Edges of contours: edge + face
@@ -2680,8 +2934,14 @@ void BRepOffset_MakeOffset::MakeMissingWalls ()
 
   FillContours(myFaceComp, myAnalyse, Contours, MapEF);
 
-  for (Standard_Integer ic = 1; ic <= Contours.Extent(); ic++)
+  Message_ProgressScope aPS(theRange, "Making missing walls", Contours.Extent());
+  for (Standard_Integer ic = 1; ic <= Contours.Extent(); ic++, aPS.Next())
   {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     TopoDS_Vertex StartVertex = TopoDS::Vertex(Contours.FindKey(ic));
     TopoDS_Edge StartEdge;
     const TopTools_ListOfShape& aContour = Contours(ic);
@@ -3105,7 +3365,7 @@ void BRepOffset_MakeOffset::MakeMissingWalls ()
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeShells ()
+void BRepOffset_MakeOffset::MakeShells (const Message_ProgressRange& theRange)
 {
 #ifdef OCCT_DEBUG
   if (ChronBuild) {  
@@ -3115,12 +3375,18 @@ void BRepOffset_MakeOffset::MakeShells ()
   }
 #endif
   //
+  Message_ProgressScope aPS(theRange, "Making shells", 1);
   // Prepare list of splits of the offset faces to make the shells
   TopTools_ListOfShape aLSF;
   const TopTools_ListOfShape& R = myImageOffset.Roots();
   TopTools_ListIteratorOfListOfShape it(R);
   //
   for (; it.More(); it.Next()) {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     TopoDS_Shape aF = it.Value();
     if (myThickening) //offsetted faces must change their orientations
       aF.Reverse();
@@ -3158,7 +3424,7 @@ void BRepOffset_MakeOffset::MakeShells ()
       IsSolid(myShape) && myIsPlanar) {
     //
     TopoDS_Shape aShells;
-    bDone = BuildShellsCompleteInter(aLSF, myImageOffset, aShells);
+    bDone = BuildShellsCompleteInter(aLSF, myImageOffset, aShells, aPS.Next());
     if (bDone) {
       myOffsetShape = aShells;
     }
@@ -3193,7 +3459,7 @@ void BRepOffset_MakeOffset::MakeShells ()
 //purpose  : 
 //=======================================================================
 
-void BRepOffset_MakeOffset::MakeSolid ()
+void BRepOffset_MakeOffset::MakeSolid (const Message_ProgressRange& theRange)
 {
  if (myOffsetShape.IsNull()) return;
 
@@ -3209,11 +3475,18 @@ void BRepOffset_MakeOffset::MakeSolid ()
   TopoDS_Shape                S1;
   B.MakeCompound (NC);
 
+  Message_ProgressScope aPS(theRange, "Making solid", 1);
+  
   TopoDS_Solid Sol;
   B.MakeSolid(Sol);
   Sol.Closed(Standard_True);
   Standard_Boolean aMakeSolid = (myShape.ShapeType() == TopAbs_SOLID) || myThickening;
   for (exp.Init(myOffsetShape,TopAbs_SHELL); exp.More(); exp.Next()) {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
     TopoDS_Shell Sh = TopoDS::Shell(exp.Current());
     if (myThickening && myOffset > 0.)
       Sh.Reverse();
@@ -3714,13 +3987,13 @@ void CorrectSolid(TopoDS_Solid& theSol, TopTools_ListOfShape& theSolList)
 //function : CheckInputData
 //purpose  : Check input data for possibility of offset perform.
 //=======================================================================
-Standard_Boolean BRepOffset_MakeOffset::CheckInputData()
+Standard_Boolean BRepOffset_MakeOffset::CheckInputData(const Message_ProgressRange& theRange)
 {
   // Set initial error state.
   myError = BRepOffset_NoError;
   TopoDS_Shape aTmpShape;
   myBadShape = aTmpShape;
-
+  Message_ProgressScope aPS(theRange, NULL, 1);
   // Non-null offset.
   if (Abs(myOffset) <= myTol)
   {
@@ -3759,6 +4032,11 @@ Standard_Boolean BRepOffset_MakeOffset::CheckInputData()
   gp_Pnt2d aPnt2d;
   for( ; anExpSF.More(); anExpSF.Next())
   {
+    if (!aPS.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return Standard_False;
+    }
     const TopoDS_Face& aF = TopoDS::Face(anExpSF.Current());
 
     if (aPresenceMap.Contains(aF.TShape()))
@@ -3992,30 +4270,44 @@ void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces,
                                            TopTools_DataMapOfShapeShape& theMES,
                                            TopTools_DataMapOfShapeShape& theBuild,
                                            Handle(BRepAlgo_AsDes)& theAsDes,
-                                           Handle(BRepAlgo_AsDes)& theAsDes2d)
+                                           Handle(BRepAlgo_AsDes)& theAsDes2d,
+                                           const Message_ProgressRange& theRange)
 {
   Standard_Real aTolF;
   TopTools_IndexedDataMapOfShapeListOfShape aDMVV;
   // intersect edges created from edges
   TopTools_IndexedMapOfShape aMFV;
+  Message_ProgressScope aPSOuter(theRange, NULL , 2);
+  Message_ProgressScope aPS1(aPSOuter.Next(), NULL, theFaces.Size());
   for (TopTools_ListOfShape::Iterator it (theFaces); it.More(); it.Next())
   {
     const TopoDS_Face& aF  = TopoDS::Face (it.Value());
     aTolF = BRep_Tool::Tolerance (aF);
     if (!BRepOffset_Inter2d::ConnexIntByInt(aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d,
-                                            myOffset, aTolF, myAnalyse, aMFV, myImageVV, myEdgeIntEdges, aDMVV))
+                                            myOffset, aTolF, myAnalyse, aMFV, myImageVV, myEdgeIntEdges, aDMVV, aPS1.Next()))
     {
       myError = BRepOffset_CannotExtentEdge;
       return;
     }
+    if (!aPS1.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
   }
   // intersect edges created from vertices
   Standard_Integer i, aNbF = aMFV.Extent();
+  Message_ProgressScope aPS2(aPSOuter.Next(), "Intersecting edges created from vertices", aNbF);
   for (i = 1; i <= aNbF; ++i) {
     const TopoDS_Face& aF = TopoDS::Face(aMFV(i));
     aTolF = BRep_Tool::Tolerance(aF);
     BRepOffset_Inter2d::ConnexIntByIntInVert
-      (aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d, aTolF, myAnalyse, aDMVV);
+      (aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d, aTolF, myAnalyse, aDMVV, aPS2.Next());
+    if (!aPS2.More())
+    {
+      myError = BRepOffset_UserBreak;
+      return;
+    }
   }
   //
   // fuse vertices on edges
@@ -4294,15 +4586,17 @@ void GetEnlargedFaces(const TopTools_ListOfShape& theFaces,
 //=======================================================================
 Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF,
                                           BRepAlgo_Image& theImage,
-                                          TopoDS_Shape& theShells)
+                                          TopoDS_Shape& theShells,
+                                          const Message_ProgressRange& theRange)
 {
+  Message_ProgressScope aPS(theRange, NULL, 5);
   // make solids
   BOPAlgo_MakerVolume aMV1;
   aMV1.SetArguments(theLF);
   // we need to intersect the faces to process the tangential faces
   aMV1.SetIntersect(Standard_True);
   aMV1.SetAvoidInternalShapes(Standard_True);
-  aMV1.Perform();
+  aMV1.Perform(aPS.Next(3));
   //
   Standard_Boolean bDone = ! aMV1.HasErrors();
   if (!bDone) {
@@ -4382,7 +4676,7 @@ Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF,
   // no need to intersect this time
   aMV2.SetIntersect(Standard_False);
   aMV2.SetAvoidInternalShapes(Standard_True);
-  aMV2.Perform();
+  aMV2.Perform(aPS.Next());
   bDone = ! aMV2.HasErrors();
   if (!bDone) {
     return bDone;
@@ -4433,7 +4727,7 @@ Standard_Boolean BuildShellsCompleteInter(const TopTools_ListOfShape& theLF,
   aMV3.SetArguments(aLF);
   aMV3.SetIntersect(Standard_False);
   aMV3.SetAvoidInternalShapes(Standard_True);
-  aMV3.Perform();
+  aMV3.Perform(aPS.Next());
   bDone = ! aMV3.HasErrors();
   if (!bDone) {
     return bDone;
@@ -4613,6 +4907,43 @@ Standard_Boolean GetSubShapes(const TopoDS_Shape& theShape,
   return Standard_True;
 }
 
+//=======================================================================
+//function : analyzeProgress
+//purpose  : 
+//=======================================================================
+void BRepOffset_MakeOffset::analyzeProgress (const Standard_Real theWhole,
+                                             TColStd_Array1OfReal& theSteps) const
+{
+  theSteps.Init(0.0);
+
+  // Set, approximately, the proportions for each operation.
+  // It is not a problem that the sum of the set values will not
+  // be equal to 100%, as the values will be normalized.
+  // The main point is to make the proportions valid relatively each other.
+
+  // Proportions will be different for different connection types
+  Standard_Boolean isArc = (myJoin == GeomAbs_Arc);
+  Standard_Boolean isPlanarIntCase = myInter && !isArc && myIsPlanar && !myThickening &&
+                                     myFaces.IsEmpty() && IsSolid(myShape);
+
+  theSteps(PIOperation_CheckInputData) = 1.;
+  theSteps(PIOperation_Analyse) = 2.;
+  theSteps(PIOperation_BuildOffsetBy) = isPlanarIntCase ? 70. : (isArc ? 20. : 50.);
+  theSteps(PIOperation_Intersection) = isPlanarIntCase ? 0. : (isArc ? 50. : 20.);
+  if (myThickening)
+  {
+    theSteps(PIOperation_MakeMissingWalls) = 5.;
+  }
+  theSteps(PIOperation_MakeShells) = isPlanarIntCase ? 25. : 5.;
+  theSteps(PIOperation_MakeSolid) = 5.;
+  if (myIsPerformSewing && myThickening)
+  {
+    theSteps(PIOperation_Sewing) = 10.;
+  }
+
+  normalizeSteps(theWhole, theSteps);
+}
+
 //=======================================================================
 //function : IsPlanar
 //purpose  : Checks if all the faces of the shape are planes
index ea99f9c92bbd6c7017b528148fc9636451f4bd4a..db5b95a4b4f9a1b09ef5d385488f4edbff8ca5fb 100644 (file)
@@ -36,6 +36,9 @@
 #include <BRepOffset_MakeLoops.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <BRepOffset_DataMapOfShapeOffset.hxx>
+#include <TColStd_Array1OfReal.hxx>
+
+#include <Message_ProgressRange.hxx>
 class BRepAlgo_AsDes;
 class TopoDS_Shape;
 class TopoDS_Face;
@@ -44,7 +47,6 @@ class BRepAlgo_Image;
 class BRepOffset_Inter3d;
 
 
-
 class BRepOffset_MakeOffset 
 {
 public:
@@ -61,7 +63,8 @@ public:
                                         const Standard_Boolean SelfInter = Standard_False,
                                         const GeomAbs_JoinType Join = GeomAbs_Arc,
                                         const Standard_Boolean Thickening = Standard_False,
-                                        const Standard_Boolean RemoveIntEdges = Standard_False);
+                                        const Standard_Boolean RemoveIntEdges = Standard_False,
+                                        const Message_ProgressRange& theRange = Message_ProgressRange());
   
   Standard_EXPORT void Initialize (const TopoDS_Shape& S,
                                    const Standard_Real Offset,
@@ -85,9 +88,9 @@ public:
   //! set the offset <Off> on the Face <F>
   Standard_EXPORT void SetOffsetOnFace (const TopoDS_Face& F, const Standard_Real Off);
   
-  Standard_EXPORT void MakeOffsetShape();
+  Standard_EXPORT void MakeOffsetShape(const Message_ProgressRange& theRange = Message_ProgressRange());
   
-  Standard_EXPORT void MakeThickSolid();
+  Standard_EXPORT void MakeThickSolid(const Message_ProgressRange& theRange = Message_ProgressRange());
   
   Standard_EXPORT const BRepOffset_Analyse& GetAnalyse() const;
   
@@ -124,7 +127,7 @@ public:
   //! 3) Check continuity of input surfaces.
   //! 4) Check for normals existence on grid.
   //! @return True if possible make computations and false otherwise.
-  Standard_EXPORT Standard_Boolean CheckInputData();
+  Standard_EXPORT Standard_Boolean CheckInputData(const Message_ProgressRange& theRange);
 
   //! Return bad shape, which obtained in CheckInputData.
   Standard_EXPORT const TopoDS_Shape& GetBadShape() const;
@@ -142,7 +145,11 @@ public: //! @name History methods
 
 
 protected:
-
+  //! Analyze progress steps of the whole operation.
+  //! @param theWhole - sum of progress of all operations.
+  //! @oaram theSteps - steps of the operations supported by PI
+  Standard_EXPORT void analyzeProgress (const Standard_Real theWhole,
+                                        TColStd_Array1OfReal& theSteps) const;
 
 private:
 
@@ -159,26 +166,28 @@ private:
   
   Standard_EXPORT void BuildFaceComp();
   
-  Standard_EXPORT void BuildOffsetByArc();
+  Standard_EXPORT void BuildOffsetByArc(const Message_ProgressRange& theRange);
   
-  Standard_EXPORT void BuildOffsetByInter();
+  Standard_EXPORT void BuildOffsetByInter(const Message_ProgressRange& theRange);
 
   //! Make Offset faces
-  Standard_EXPORT void MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& theMapSF);
+  Standard_EXPORT void MakeOffsetFaces(BRepOffset_DataMapOfShapeOffset& theMapSF, const Message_ProgressRange& theRange);
 
   Standard_EXPORT void SelfInter (TopTools_MapOfShape& Modif);
   
-  Standard_EXPORT void Intersection3D (BRepOffset_Inter3d& Inter);
+  Standard_EXPORT void Intersection3D (BRepOffset_Inter3d& Inter, const Message_ProgressRange& theRange);
   
-  Standard_EXPORT void Intersection2D (const TopTools_IndexedMapOfShape& Modif, const TopTools_IndexedMapOfShape& NewEdges);
+  Standard_EXPORT void Intersection2D (const TopTools_IndexedMapOfShape& Modif, 
+                                       const TopTools_IndexedMapOfShape& NewEdges, 
+                                       const Message_ProgressRange& theRange);
   
-  Standard_EXPORT void MakeLoops (TopTools_IndexedMapOfShape& Modif);
+  Standard_EXPORT void MakeLoops (TopTools_IndexedMapOfShape& Modif, const Message_ProgressRange& theRange);
   
   Standard_EXPORT void MakeLoopsOnContext (TopTools_MapOfShape& Modif);
   
-  Standard_EXPORT void MakeFaces (TopTools_IndexedMapOfShape& Modif);
+  Standard_EXPORT void MakeFaces (TopTools_IndexedMapOfShape& Modif, const Message_ProgressRange& theRange);
   
-  Standard_EXPORT void MakeShells();
+  Standard_EXPORT void MakeShells(const Message_ProgressRange& theRange);
   
   Standard_EXPORT void SelectShells();
   
@@ -187,7 +196,7 @@ private:
   //! Replace roots in history maps
   Standard_EXPORT void ReplaceRoots();
 
-  Standard_EXPORT void MakeSolid();
+  Standard_EXPORT void MakeSolid(const Message_ProgressRange& theRange);
   
   Standard_EXPORT void ToContext (BRepOffset_DataMapOfShapeOffset& MapSF);
   
@@ -198,7 +207,7 @@ private:
   Standard_EXPORT void CorrectConicalFaces();
   
   //! Private method used to build walls for thickening the shell
-  Standard_EXPORT void MakeMissingWalls();
+  Standard_EXPORT void MakeMissingWalls(const Message_ProgressRange& theRange);
 
   //! Removes INTERNAL edges from the result
   Standard_EXPORT void RemoveInternalEdges();
@@ -209,7 +218,8 @@ private:
                                        TopTools_DataMapOfShapeShape& theMES,
                                        TopTools_DataMapOfShapeShape& theBuild,
                                        Handle(BRepAlgo_AsDes)& theAsDes,
-                                       Handle(BRepAlgo_AsDes)& theAsDes2d);
+                                       Handle(BRepAlgo_AsDes)& theAsDes2d,
+                                       const Message_ProgressRange& theRange);
 
   //! Building of the splits of the offset faces for mode Complete
   //! and joint type Intersection. This method is an advanced alternative
@@ -221,13 +231,15 @@ private:
                                                   TopTools_DataMapOfShapeListOfShape& theEdgesOrigins,
                                                   TopTools_DataMapOfShapeShape& theFacesOrigins,
                                                   TopTools_DataMapOfShapeShape& theETrimEInf,
-                                                  BRepAlgo_Image& theImage);
+                                                  BRepAlgo_Image& theImage,
+                                                  const Message_ProgressRange& theRange);
 
   //! Building of the splits of the already trimmed offset faces for mode Complete
   //! and joint type Intersection.
   Standard_EXPORT void BuildSplitsOfTrimmedFaces(const TopTools_ListOfShape& theLF,
                                                  const Handle(BRepAlgo_AsDes)& theAsDes,
-                                                 BRepAlgo_Image& theImage);
+                                                 BRepAlgo_Image& theImage,
+                                                 const Message_ProgressRange& theRange);
 
   Standard_Real myOffset;
   Standard_Real myTol;
index 3adba98fcd45e40899b81630f1d39e1adad4d181..170eed611f84120820a181f2589ff78c839ba320 100644 (file)
@@ -119,7 +119,7 @@ namespace {
                                         ContainerType& theContainer,
                                         FenceMapType* theMFence)
   {
-    const TopTools_ListOfShape *pLSIm = theImages.Seek (theS);
+    const TopTools_ListOfShapepLSIm = theImages.Seek (theS);
     if (pLSIm)
     {
       TopTools_ListIteratorOfListOfShape itLSIm (*pLSIm);
@@ -181,7 +181,7 @@ namespace {
   //purpose  : Checking if the edge is micro edge
   //=======================================================================
   static Standard_Boolean ProcessMicroEdge (const TopoDS_Edge& theEdge,
-                                            const Handle (IntTools_Context)& theCtx)
+                                            const Handle(IntTools_Context)& theCtx)
   {
     TopoDS_Vertex aV1, aV2;
     TopExp::Vertices (theEdge, aV1, aV2);
@@ -220,7 +220,7 @@ namespace {
       }
 
       TopTools_ListOfShape aLSEmpt;
-      TopTools_ListOfShape *pLS = theOrigins.ChangeSeek (aS);
+      TopTools_ListOfShapepLS = theOrigins.ChangeSeek (aS);
       if (!pLS)
       {
         pLS = &aLSEmpt;
@@ -230,7 +230,7 @@ namespace {
       for (TopTools_ListOfShape::Iterator aIt (aLSIm); aIt.More(); aIt.Next())
       {
         const TopoDS_Shape& aSIm = aIt.Value();
-        if (TopTools_ListOfShape *pLSOr = theOrigins.ChangeSeek (aSIm))
+        if (TopTools_ListOfShapepLSOr = theOrigins.ChangeSeek (aSIm))
         {
           // merge two lists
           for (TopTools_ListOfShape::Iterator aIt1 (*pLS); aIt1.More(); aIt1.Next())
@@ -371,7 +371,7 @@ namespace {
 
     if (!bFound && theAnalyse)
     {
-      const TopTools_ListOfShape *pLD = theAnalyse->Descendants (theSWhere);
+      const TopTools_ListOfShapepLD = theAnalyse->Descendants (theSWhere);
       if (pLD)
       {
         for (TopTools_ListOfShape::Iterator it (*pLD); it.More(); it.Next())
@@ -396,14 +396,15 @@ namespace {
   //=======================================================================
   static void BuildSplitsOfTrimmedFace (const TopoDS_Face& theFace,
                                         const TopoDS_Shape& theEdges,
-                                        TopTools_ListOfShape& theLFImages)
+                                        TopTools_ListOfShape& theLFImages,
+                                        const Message_ProgressRange& theRange)
   {
     BOPAlgo_Splitter aSplitter;
     //
     aSplitter.AddArgument (theFace);
     aSplitter.AddArgument (theEdges);
     aSplitter.SetToFillHistory (Standard_False);
-    aSplitter.Perform();
+    aSplitter.Perform (theRange);
     if (aSplitter.HasErrors())
     {
       return;
@@ -451,6 +452,10 @@ namespace {
     aBF.SetFace (aFF);
     aBF.SetShapes (aLE);
     aBF.Perform();
+    if (aBF.HasErrors())
+    {
+      return;
+    }
     //
     const TopTools_ListOfShape& aLFSp = aBF.Areas();
     TopTools_ListIteratorOfListOfShape aItLF (aLFSp);
@@ -478,7 +483,7 @@ namespace {
       const TopoDS_Edge& aE = *(TopoDS_Edge*)&aExp.Current();
       //
       Standard_Real aT1, aT2;
-      const Handle (Geom_Curve)& aC = BRep_Tool::Curve (aE, aT1, aT2);
+      const Handle(Geom_Curve)& aC = BRep_Tool::Curve (aE, aT1, aT2);
       //
       gp_Pnt aP;
       gp_Vec aV, aVSum;
@@ -528,7 +533,7 @@ public: //! @name Setting data
   void SetFaces (const TopTools_ListOfShape& theFaces) { myFaces = &theFaces; }
 
   //! Sets ascendants/descendants information
-  void SetAsDesInfo (const Handle (BRepAlgo_AsDes)& theAsDes) { myAsDes = theAsDes; }
+  void SetAsDesInfo (const Handle(BRepAlgo_AsDes)& theAsDes) { myAsDes = theAsDes; }
 
   //! Sets the analysis info of the input shape
   void SetAnalysis (const BRepOffset_Analyse& theAnalyse) { myAnalyzer = &theAnalyse; }
@@ -545,18 +550,18 @@ public: //! @name Setting data
 public: //! @name Public methods to build the splits
 
   //! Build splits of already trimmed faces
-  void BuildSplitsOfTrimmedFaces();
+  void BuildSplitsOfTrimmedFaces (const Message_ProgressRange& theRange);
 
   //! Building splits of not-trimmed offset faces.
   //! For the cases in which invalidities will be found, these invalidities will be rebuilt.
-  void BuildSplitsOfExtendedFaces();
+  void BuildSplitsOfExtendedFaces (const Message_ProgressRange& theRange);
 
 private: //! @name private methods performing the job
 
 private: //! @name Intersection and post-treatment of edges
 
   //! Intersection of the trimmed edges among themselves
-  void IntersectTrimmedEdges();
+  void IntersectTrimmedEdges (const Message_ProgressRange& theRange);
 
   //! Saving connection from trimmed edges to not trimmed ones
   void UpdateIntersectedEdges (const TopTools_ListOfShape& theLA,
@@ -577,7 +582,8 @@ private: //! @name Intersection and post-treatment of edges
                          BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE,
                          TopTools_DataMapOfShapeListOfShape& theDMEOrLEIm,
                          TopTools_MapOfShape& theEdgesInvalidByVertex,
-                         TopTools_MapOfShape& theEdgesValidByVertex);
+                         TopTools_MapOfShape& theEdgesValidByVertex,
+                         const Message_ProgressRange& theRange);
 
   //! Additional method to look for invalid edges
   void FindInvalidEdges (const TopTools_ListOfShape& theLFOffset,
@@ -616,7 +622,7 @@ private: //! @name Intersection and post-treatment of edges
 private: //! @name Checking faces
 
   //! Build splits of faces
-  void BuildSplitsOfFaces();
+  void BuildSplitsOfFaces (const Message_ProgressRange& theRange);
 
   //! Looking for the invalid faces by analyzing their invalid edges
   void FindInvalidFaces (TopTools_ListOfShape& theLFImages,
@@ -647,7 +653,8 @@ private: //! @name Checking faces
                           const TopTools_IndexedMapOfShape& theMFInvInHole,
                           const TopoDS_Shape& theFHoles,
                           TopTools_IndexedMapOfShape& theMERemoved,
-                          TopTools_IndexedMapOfShape& theMEInside);
+                          TopTools_IndexedMapOfShape& theMEInside,
+                          const Message_ProgressRange& theRange);
 
   //! Looking for the connections between faces not to miss some necessary intersection
   void ShapesConnections (const TopTools_DataMapOfShapeShape& theDMFOr,
@@ -686,7 +693,8 @@ private: //! @name Checking faces
   void FindFacesToRebuild();
 
   //! Intersection of the faces that should be rebuild to resolve all invalidities
-  void IntersectFaces (TopTools_MapOfShape& theVertsToAvoid);
+  void IntersectFaces (TopTools_MapOfShape& theVertsToAvoid,
+                       const Message_ProgressRange& theRange);
 
   //! Preparation of the maps for analyzing intersections of the faces
   void PrepareFacesForIntersection (const Standard_Boolean theLookVertToAvoid,
@@ -775,7 +783,8 @@ private: //! @name Checking faces
                          TopTools_MapOfShape& theMECheckExt,
                          TopTools_MapOfShape& theVertsToAvoid,
                          TopTools_DataMapOfShapeListOfShape& theEImages,
-                         TopTools_DataMapOfShapeListOfShape& theEETrim);
+                         TopTools_DataMapOfShapeListOfShape& theEETrim,
+                         const Message_ProgressRange& theRange);
 
   //! Trims intersection edges
   void TrimNewIntersectionEdges (const TopTools_ListOfShape& theLE,
@@ -842,7 +851,7 @@ private: //! @name Checking faces
 private:
 
   //! Fill possible gaps (holes) in the splits of the offset faces
-  void FillGaps();
+  void FillGaps (const Message_ProgressRange& theRange);
 
   //! Saving obtained results in history tools
   void FillHistory();
@@ -850,7 +859,7 @@ private:
 private:
   // Input data
   const TopTools_ListOfShape* myFaces;  //!< Input faces which have to be split
-  Handle (BRepAlgo_AsDes) myAsDes;      //!< Ascendants/descendants of the edges faces
+  Handle(BRepAlgo_AsDes) myAsDes;       //!< Ascendants/descendants of the edges faces
   const BRepOffset_Analyse* myAnalyzer; //!< Analyzer of the input parameters
 
   TopTools_DataMapOfShapeListOfShape* myEdgesOrigins; //!< Origins of the offset edges (binding between offset edge and original edge)
@@ -888,7 +897,7 @@ private:
   TopoDS_Shape mySolids; //!< Solids built from the splits of faces
 
   // Auxiliary tools
-  Handle (IntTools_Context) myContext;
+  Handle(IntTools_Context) myContext;
 
   // Output
   BRepAlgo_Image* myImage;  //!< History of modifications
@@ -898,7 +907,7 @@ private:
 //function : BuildSplitsOfTrimmedFaces
 //purpose  : 
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::BuildSplitsOfTrimmedFaces()
+void BRepOffset_BuildOffsetFaces::BuildSplitsOfTrimmedFaces (const Message_ProgressRange& theRange)
 {
   if (!hasData (myFaces))
   {
@@ -911,11 +920,18 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfTrimmedFaces()
     myEdgesOrigins = &anEdgesOrigins;
   }
 
+  Message_ProgressScope aPS (theRange, "Building splits of trimmed faces", 5);
+
   // Fuse all edges
-  IntersectTrimmedEdges();
+  IntersectTrimmedEdges (aPS.Next (1));
 
+  Message_ProgressScope aPSLoop (aPS.Next (4), NULL, myFaces->Extent());
   for (TopTools_ListOfShape::Iterator aItLF (*myFaces); aItLF.More(); aItLF.Next())
   {
+    if (!aPSLoop.More())
+    {
+      return;
+    }
     const TopoDS_Face& aF = *(TopoDS_Face*)&aItLF.Value();
 
     TopoDS_Shape aCE;
@@ -932,7 +948,7 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfTrimmedFaces()
     }
 
     TopTools_ListOfShape aLFImages;
-    BuildSplitsOfTrimmedFace (aF, aCE, aLFImages);
+    BuildSplitsOfTrimmedFace (aF, aCE, aLFImages, aPSLoop.Next());
 
     myOFImages.Add (aF, aLFImages);
   }
@@ -944,7 +960,7 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfTrimmedFaces()
 //function : BuildSplitsOfExtendedFaces
 //purpose  : 
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::BuildSplitsOfExtendedFaces()
+void BRepOffset_BuildOffsetFaces::BuildSplitsOfExtendedFaces (const Message_ProgressRange& theRange)
 {
   // Check input data
   if (!hasData (myFaces) || !hasData (myEdgesOrigins) || !hasData (myFacesOrigins) || !hasData (myETrimEInf))
@@ -952,17 +968,36 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfExtendedFaces()
     return;
   }
 
-  // Fusing all trimmed offset edges to avoid self-intersections in the splits
-  IntersectTrimmedEdges();
+  Message_ProgressScope aPS (theRange, "Building splits of extended faces", 100.);
+  // Scope has to be added into a loop of undefined size.
+  // In general there are about 2 to 5 loops performed, each time
+  // decreasing complexity. So reserve for each next loop smaller time.
+  // Reserve also 4% on filling gaps after the faces are built.
+  Standard_Real aWhole = 100. - 4.;
 
+  // Fusing all trimmed offset edges to avoid self-intersections in the splits
+  IntersectTrimmedEdges (aPS.Next());
+  if (!aPS.More())
+  {
+    return;
+  }
   // vertices to avoid
   TopTools_MapOfShape aVertsToAvoid;
 
   // Limit total number of attempts by 10. This should be extra, as each invalid face can be
   // rebuilt only three times. So, in general, there are about 2-5 loops done.
   const Standard_Integer aNbMaxAttempts = 10;
-  for (Standard_Integer iCount = 0; iCount < aNbMaxAttempts; ++iCount)
+  // First progress portion is the half of the whole. Each next step is half of the previous:
+  // 48%, 24%, 12%, 6% and so on. This way in three loops it will already be 84%,
+  // and in four - 90%. So even if the loop will stop earlier, the not advanced scope
+  // will be acceptable.
+  Standard_Real aPart = aWhole / 2.;
+  for (Standard_Integer iCount = 1; iCount <= aNbMaxAttempts; ++iCount, aPart /= 2.)
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     // Clear the data before further faces construction
     myInvalidFaces.Clear();
     myArtInvalidFaces.Clear();
@@ -974,8 +1009,13 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfExtendedFaces()
     myFacesToRebuild.Clear();
     myFSelfRebAvoid.Clear();
 
+    // Split progress range on 
+    // * building faces basing on currently available edges and
+    // * rebuilding faces basing on edges classification
+    Message_ProgressScope aPSLoop (aPS.Next (aPart), NULL, 10.);
+
     // Build splits of the faces having new intersection edges
-    BuildSplitsOfFaces();
+    BuildSplitsOfFaces (aPSLoop.Next (7.));
     if (myInvalidFaces.IsEmpty())
     {
       break;
@@ -990,12 +1030,12 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfExtendedFaces()
 
     // Perform new intersections
     myModifiedEdges.Clear();
-    IntersectFaces (aVertsToAvoid);
+    IntersectFaces (aVertsToAvoid, aPSLoop.Next (3.));
   }
 
   // Fill possible gaps in the splits of offset faces to increase possibility of
   // creating closed volume from these splits
-  FillGaps();
+  FillGaps (aPS.Next (4.));
 
   // Fill history for faces and edges
   FillHistory();
@@ -1038,14 +1078,19 @@ void BRepOffset_BuildOffsetFaces::UpdateIntersectedEdges (const TopTools_ListOfS
 //function : IntersectTrimmedEdges
 //purpose  :
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::IntersectTrimmedEdges()
+void BRepOffset_BuildOffsetFaces::IntersectTrimmedEdges (const Message_ProgressRange& theRange)
 {
   // get edges to intersect from descendants of the offset faces
   TopTools_ListOfShape aLS;
   //
+  Message_ProgressScope aPS (theRange, NULL, 2);
   TopTools_ListIteratorOfListOfShape aItLF (*myFaces);
   for (; aItLF.More(); aItLF.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& aF = *(TopoDS_Face*)&aItLF.Value();
     //
     const TopTools_ListOfShape& aLE = myAsDes->Descendant (aF);
@@ -1075,7 +1120,7 @@ void BRepOffset_BuildOffsetFaces::IntersectTrimmedEdges()
   // perform intersection of the edges
   BOPAlgo_Builder aGFE;
   aGFE.SetArguments (aLS);
-  aGFE.Perform();
+  aGFE.Perform (aPS.Next());
   if (aGFE.HasErrors())
   {
     return;
@@ -1083,8 +1128,13 @@ void BRepOffset_BuildOffsetFaces::IntersectTrimmedEdges()
   //
   TopTools_ListOfShape aLA;
   // fill map with edges images
-  for (TopTools_ListOfShape::Iterator aIt (aLS); aIt.More(); aIt.Next())
+  Message_ProgressScope aPSLoop (aPS.Next(), NULL, aLS.Size());
+  for (TopTools_ListOfShape::Iterator aIt (aLS); aIt.More(); aIt.Next(), aPSLoop.Next())
   {
+    if (!aPSLoop.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aE = aIt.Value();
     const TopTools_ListOfShape& aLEIm = aGFE.Modified (aE);
     if (aLEIm.IsEmpty())
@@ -1120,7 +1170,7 @@ void BRepOffset_BuildOffsetFaces::IntersectTrimmedEdges()
 //purpose  : Building the splits of offset faces and
 //           looking for the invalid splits
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces()
+void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces (const Message_ProgressRange& theRange)
 {
   BRep_Builder aBB;
   Standard_Integer i, aNb;
@@ -1144,10 +1194,17 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces()
   // connection map from old edges to new ones
   TopTools_DataMapOfShapeListOfShape aDMEOrLEIm;
   //
+  // Outer range
+  Message_ProgressScope aPSOuter (theRange, NULL, 10.);
   // build splits of faces
+  Message_ProgressScope aPSBF (aPSOuter.Next (3.), "Building faces", 2 * myFaces->Extent());
   TopTools_ListOfShape::Iterator aItLF (*myFaces);
-  for (; aItLF.More(); aItLF.Next())
+  for (; aItLF.More(); aItLF.Next(), aPSBF.Next())
   {
+    if (!aPSBF.More())
+    {
+      return;
+    }
     const TopoDS_Face& aF = *(TopoDS_Face*)&aItLF.Value();
     //
     TopTools_ListOfShape* pLFIm = myOFImages.ChangeSeek (aF);
@@ -1276,7 +1333,7 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces()
 
     // find invalid edges
     FindInvalidEdges (aF, aLFImages, aDMFMVE, aDMFMNE, aDMFMIE, aDMFMVIE,
-                      aDMEOrLEIm, aMEdgeInvalidByVertex, aMEdgeValidByVertex);
+                      aDMEOrLEIm, aMEdgeInvalidByVertex, aMEdgeValidByVertex, aPSBF.Next());
 
     // save the new splits
     if (!pLFIm)
@@ -1365,11 +1422,17 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces()
   aBB.MakeCompound (aFHoles);
   // Find the faces containing only the inverted edges and the invalid ones
   TopTools_ListOfShape anInvertedFaces;
+
+  Message_ProgressScope aPSIF (aPSOuter.Next (2.), "Checking validity of faces", aLFDone.Extent());
   // find invalid faces
   // considering faces containing only invalid edges as invalid
   aItLF.Initialize (aLFDone);
-  for (; aItLF.More(); aItLF.Next())
+  for (; aItLF.More(); aItLF.Next(), aPSIF.Next())
   {
+    if (!aPSIF.More())
+    {
+      return;
+    }
     const TopoDS_Face& aF = TopoDS::Face (aItLF.Value());
     TopTools_ListOfShape& aLFImages = myOFImages.ChangeFromKey (aF);
     //
@@ -1458,7 +1521,8 @@ void BRepOffset_BuildOffsetFaces::BuildSplitsOfFaces()
   //
   // remove inside faces
   TopTools_IndexedMapOfShape aMEInside;
-  RemoveInsideFaces (anInvertedFaces, aMFToCheckInt, aMFInvInHole, aFHoles, aMERemoved, aMEInside);
+  RemoveInsideFaces (anInvertedFaces, aMFToCheckInt, aMFInvInHole, aFHoles,
+                     aMERemoved, aMEInside, aPSOuter.Next (5.));
   //
   // make compound of valid splits
   TopoDS_Compound aCFIm;
@@ -1779,7 +1843,8 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopoDS_Face& theF,
                                                     BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE,
                                                     TopTools_DataMapOfShapeListOfShape& theDMEOrLEIm,
                                                     TopTools_MapOfShape& theEdgesInvalidByVertex,
-                                                    TopTools_MapOfShape& theEdgesValidByVertex)
+                                                    TopTools_MapOfShape& theEdgesValidByVertex,
+                                                    const Message_ProgressRange& theRange)
 {
   // Edge is considered as invalid in the following cases:
   // 1. Its orientation on the face has changed comparing to the originals edge and face;
@@ -1804,9 +1869,14 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopoDS_Face& theF,
   // back map from the original shapes to their offset images
   TopTools_DataMapOfShapeListOfShape anImages;
   //
+  Message_ProgressScope aPS (theRange, "Checking validity of edges", 2 * theLFImages.Extent());
   TopTools_ListIteratorOfListOfShape aItLF (theLFImages);
-  for (; aItLF.More(); aItLF.Next())
+  for (; aItLF.More(); aItLF.Next(), aPS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value();
     //
     TopExp_Explorer aExp (aFIm, TopAbs_EDGE);
@@ -1861,8 +1931,12 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopoDS_Face& theF,
   TopTools_IndexedDataMapOfShapeListOfShape aDMVEFOr;
   //
   aItLF.Initialize (theLFImages);
-  for (; aItLF.More(); aItLF.Next())
+  for (; aItLF.More(); aItLF.Next(), aPS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value();
     //
     // valid edges for this split
@@ -1928,7 +2002,7 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopoDS_Face& theF,
             TopExp::MapShapesAndAncestors (aFOr, TopAbs_VERTEX, TopAbs_EDGE, aDMVEFOr);
           }
           //
-          TopTools_ListOfShape *pLEFOr = aDMVEFOr.ChangeSeek (aSOr);
+          TopTools_ListOfShapepLEFOr = aDMVEFOr.ChangeSeek (aSOr);
           if (pLEFOr)
           {
             TopoDS_Compound aCEOr;
@@ -1955,7 +2029,7 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopoDS_Face& theF,
         {
           FindShape (aSOr, aFOr, myAnalyzer, aEOrF);
           //
-          TopTools_ListOfShape *pLEIm = theDMEOrLEIm.ChangeSeek (aSOr);
+          TopTools_ListOfShapepLEIm = theDMEOrLEIm.ChangeSeek (aSOr);
           if (!pLEIm)
           {
             pLEIm = theDMEOrLEIm.Bound (aSOr, TopTools_ListOfShape());
@@ -2266,7 +2340,7 @@ void BRepOffset_BuildOffsetFaces::FindInvalidEdges (const TopTools_ListOfShape&
             (!pMEValid || !pMEValid->Contains (aE)))
           {
             // but not in the current one
-            TopTools_MapOfShape *pMap = aMEUnclassified.ChangeSeek (aE);
+            TopTools_MapOfShapepMap = aMEUnclassified.ChangeSeek (aE);
             if (!pMap)
               pMap = &aMEUnclassified (aMEUnclassified.Add (aE, TopTools_MapOfShape()));
             pMap->Add (aFIm);
@@ -2696,7 +2770,7 @@ void BRepOffset_BuildOffsetFaces::FindFacesInsideHoleWires (const TopoDS_Face& t
     return;
   }
   //
-  TopTools_ListOfShape *pLFNewHoles = myFNewHoles.ChangeSeek (theFOrigin);
+  TopTools_ListOfShapepLFNewHoles = myFNewHoles.ChangeSeek (theFOrigin);
   //
   if (!pLFNewHoles)
   {
@@ -2727,7 +2801,7 @@ void BRepOffset_BuildOffsetFaces::FindFacesInsideHoleWires (const TopoDS_Face& t
       for (; aItE.More(); aItE.Next())
       {
         const TopoDS_Shape& aEOr = aItE.Value();
-        const TopTools_ListOfShape *pLEIm = theDMEOrLEIm.Seek (aEOr);
+        const TopTools_ListOfShapepLEIm = theDMEOrLEIm.Seek (aEOr);
         if (!pLEIm || pLEIm->IsEmpty())
         {
           continue;
@@ -3162,7 +3236,7 @@ Standard_Boolean BRepOffset_BuildOffsetFaces::CheckInvertedBlock (const TopoDS_S
     for (; aItE.More(); aItE.Next())
     {
       const TopoDS_Shape& aE = aItE.Value();
-      const TopTools_ListOfShape *pLEOr = myOEOrigins.Seek (aE);
+      const TopTools_ListOfShapepLEOr = myOEOrigins.Seek (aE);
       if (!pLEOr)
       {
         aMEOrigins.Add (aE);
@@ -3275,7 +3349,7 @@ void BRepOffset_BuildOffsetFaces::RemoveInvalidSplitsByInvertedEdges (TopTools_I
       {
         const TopoDS_Shape& aE = aExp.Current();
         //
-        TopTools_ListOfShape *pLF = aDMEF.ChangeSeek (aE);
+        TopTools_ListOfShapepLF = aDMEF.ChangeSeek (aE);
         if (!pLF)
         {
           pLF = aDMEF.Bound (aE, TopTools_ListOfShape());
@@ -3294,7 +3368,7 @@ void BRepOffset_BuildOffsetFaces::RemoveInvalidSplitsByInvertedEdges (TopTools_I
       {
         const TopoDS_Shape& aV = aExp.Current();
         //
-        TopTools_ListOfShape *pLF = aDMVF.ChangeSeek (aV);
+        TopTools_ListOfShapepLF = aDMVF.ChangeSeek (aV);
         if (!pLF)
         {
           pLF = aDMVF.Bound (aV, TopTools_ListOfShape());
@@ -3340,7 +3414,7 @@ void BRepOffset_BuildOffsetFaces::RemoveInvalidSplitsByInvertedEdges (TopTools_I
       for (; aIt.More(); aIt.Next())
       {
         const TopoDS_Shape& aV = aIt.Value();
-        const TopTools_ListOfShape *pLF = aDMVF.Seek (aV);
+        const TopTools_ListOfShapepLF = aDMVF.Seek (aV);
         if (pLF && (pLF->Extent() > 3))
         {
           aMERem.Add (aE);
@@ -3787,7 +3861,8 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
                                                      const TopTools_IndexedMapOfShape& theMFInvInHole,
                                                      const TopoDS_Shape& theFHoles,
                                                      TopTools_IndexedMapOfShape& theMERemoved,
-                                                     TopTools_IndexedMapOfShape& theMEInside)
+                                                     TopTools_IndexedMapOfShape& theMEInside,
+                                                     const Message_ProgressRange& theRange)
 {
   TopTools_ListOfShape aLS;
   TopTools_MapOfShape aMFence;
@@ -3795,9 +3870,14 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
   TopTools_ListIteratorOfListOfShape aItLF;
   TopTools_DataMapOfShapeShape aDMFImF;
   //
+  Message_ProgressScope aPS (theRange, "Looking for inside faces", 10);
   Standard_Integer i, aNb = myOFImages.Extent();
   for (i = 1; i <= aNb; ++i)
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aF = myOFImages.FindKey (i);
     // to avoid intersection of the splits of the same
     // offset faces among themselves make compound of the
@@ -3847,7 +3927,7 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
   BOPAlgo_MakerVolume aMV;
   aMV.SetArguments (aLS);
   aMV.SetIntersect (Standard_True);
-  aMV.Perform();
+  aMV.Perform (aPS.Next (9));
   if (aMV.HasErrors())
     return;
 
@@ -3888,6 +3968,10 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
     aNb = myOFImages.Extent();
     for (i = 1; i <= aNb; ++i)
     {
+      if (!aPS.More())
+      {
+        return;
+      }
       const TopTools_ListOfShape& aLFIm = myOFImages (i);
       if (aLFIm.IsEmpty())
       {
@@ -3969,6 +4053,10 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
   Standard_Integer aNbFH = theMFInvInHole.Extent();
   for (i = 1; i <= aNbFH; ++i)
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aFInv = theMFInvInHole (i);
     TopTools_ListOfShape aLFInvIm = aMV.Modified (aFInv);
     if (aLFInvIm.IsEmpty())
@@ -3976,7 +4064,7 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
       aLFInvIm.Append (aFInv);
     }
     //
-    const TopoDS_Shape *pFOffset = aDMFImF.Seek (aFInv);
+    const TopoDS_ShapepFOffset = aDMFImF.Seek (aFInv);
     if (!pFOffset)
     {
       continue;
@@ -4014,6 +4102,10 @@ void BRepOffset_BuildOffsetFaces::RemoveInsideFaces (const TopTools_ListOfShape&
   TopExp_Explorer aExpS (aSols, TopAbs_SOLID);
   for (; aExpS.More(); aExpS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aSol = aExpS.Current();
     //
     Standard_Boolean bAllInv (Standard_True), bAllRemoved (Standard_True);
@@ -4176,7 +4268,7 @@ void BRepOffset_BuildOffsetFaces::ShapesConnections (const TopTools_DataMapOfSha
       BOPDS_ListIteratorOfListOfPaveBlock aItLPB (aLPB);
       for (; aItLPB.More(); aItLPB.Next())
       {
-        const Handle (BOPDS_PaveBlock)& aPB = aItLPB.Value();
+        const Handle(BOPDS_PaveBlock)& aPB = aItLPB.Value();
         Standard_Integer nEInt;
         if (aPB->HasEdge (nEInt))
         {
@@ -4257,7 +4349,7 @@ void BRepOffset_BuildOffsetFaces::ShapesConnections (const TopTools_DataMapOfSha
           for (; aItLE.More(); aItLE.Next())
           {
             const TopoDS_Shape& aEOr = aItLE.Value();
-            TopTools_ListOfShape *pLFE = mySSInterfs.ChangeSeek (aEOr);
+            TopTools_ListOfShapepLFE = mySSInterfs.ChangeSeek (aEOr);
             if (!pLFE)
             {
               pLFE = mySSInterfs.Bound (aEOr, TopTools_ListOfShape());
@@ -4269,7 +4361,7 @@ void BRepOffset_BuildOffsetFaces::ShapesConnections (const TopTools_DataMapOfSha
       if (bFound)
       {
         // save connection between offset faces
-        TopTools_ListOfShape *pLF = mySSInterfs.ChangeSeek (aF);
+        TopTools_ListOfShapepLF = mySSInterfs.ChangeSeek (aF);
         if (!pLF)
         {
           pLF = mySSInterfs.Bound (aF, TopTools_ListOfShape());
@@ -4394,7 +4486,7 @@ void BRepOffset_BuildOffsetFaces::RemoveHangingParts (const BOPAlgo_MakerVolume&
         for (; anExpE.More() && !bIsConnected; anExpE.Next())
         {
           const TopoDS_Shape& aE = anExpE.Current();
-          const TopTools_ListOfShape *pLF = aDMEF.Seek (aE);
+          const TopTools_ListOfShapepLF = aDMEF.Seek (aE);
           if (pLF)
           {
             TopTools_ListIteratorOfListOfShape aItLF (*pLF);
@@ -4409,7 +4501,7 @@ void BRepOffset_BuildOffsetFaces::RemoveHangingParts (const BOPAlgo_MakerVolume&
           for (; anExpV.More() && !bIsConnected; anExpV.Next())
           {
             const TopoDS_Shape& aV = anExpV.Current();
-            const TopTools_ListOfShape *pLE = aDMVE.Seek (aV);
+            const TopTools_ListOfShapepLE = aDMVE.Seek (aV);
             if (pLE)
             {
               TopTools_ListIteratorOfListOfShape aItLE (*pLE);
@@ -5119,13 +5211,16 @@ void BRepOffset_BuildOffsetFaces::FindFacesToRebuild()
 //function : IntersectFaces
 //purpose  : Intersection of the faces that should be rebuild to resolve all invalidities
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsToAvoid)
+void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsToAvoid,
+                                                  const Message_ProgressRange& theRange)
 {
   Standard_Integer aNbFR = myFacesToRebuild.Extent();
   if (!aNbFR)
   {
     return;
   }
+
+  Message_ProgressScope aPSOuter (theRange, "Rebuilding invalid faces", 10);
   //
   Standard_Integer i, j, k, aNbInv;
   TopTools_ListIteratorOfListOfShape aItLF, aItLE;
@@ -5167,6 +5262,12 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
   TopTools_MapOfShape aMVRInv = theVertsToAvoid;
   FindVerticesToAvoid (aDMEFInv, aDMVEFull, aMVRInv);
   //
+  aPSOuter.Next();
+  if (!aPSOuter.More())
+  {
+    return;
+  }
+
   // The faces should be intersected selectively -
   // intersect only faces neighboring to the same invalid face
   // and connected to its invalid edges;
@@ -5198,9 +5299,14 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
   // alone edges
   TopTools_MapOfShape aMEAlone, aMEInvOnArt;
   //
+  Message_ProgressScope aPSArt (aPSOuter.Next(), NULL, aLCBArt.Extent());
   TopTools_ListIteratorOfListOfShape aItLCBArt (aLCBArt);
-  for (; aItLCBArt.More(); aItLCBArt.Next())
+  for (; aItLCBArt.More(); aItLCBArt.Next(), aPSArt.Next())
   {
+    if (!aPSArt.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aCB = aItLCBArt.Value();
     //
     // check if aCB contains splits of only one offset face
@@ -5235,7 +5341,7 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
         //
         if (bAlone)
         {
-          const TopTools_ListOfShape *pLEOr = myOEOrigins.Seek (aE);
+          const TopTools_ListOfShapepLEOr = myOEOrigins.Seek (aE);
           if (pLEOr)
           {
             TopTools_ListIteratorOfListOfShape aItLEOr (*pLEOr);
@@ -5307,7 +5413,7 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
       }
       //
       // the edge is useless - look for other images
-      const TopTools_ListOfShape *pLEOr = myOEOrigins.Seek (aE);
+      const TopTools_ListOfShapepLEOr = myOEOrigins.Seek (aE);
       if (!pLEOr)
       {
         continue;
@@ -5374,8 +5480,13 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
   TopTools_IndexedDataMapOfShapeListOfShape aDMOENEdges;
 
   aNbInv = myInvalidFaces.Extent();
+  Message_ProgressScope aPSInter (aPSOuter.Next (5), NULL, aNbInv);
   for (k = 1; k <= aNbInv; ++k)
   {
+    if (!aPSInter.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aFInv = myInvalidFaces.FindKey (k);
     Standard_Boolean bSelfRebAvoid = myFSelfRebAvoid.Contains (aFInv);
     const TopTools_ListOfShape& aLFInv = myInvalidFaces (k);
@@ -5402,10 +5513,15 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
       aLCB = aLFInv;
     }
     //
+    Message_ProgressScope aPSCB (aPSInter.Next(), NULL, aLCB.Extent());
     Standard_Boolean bArtificial = myArtInvalidFaces.IsBound (aFInv);
     TopTools_ListIteratorOfListOfShape aItLCB (aLCB);
     for (; aItLCB.More(); aItLCB.Next())
     {
+      if (!aPSCB.More())
+      {
+        return;
+      }
       const TopoDS_Shape& aCBInv = aItLCB.Value();
       //
       TopTools_MapOfShape aMEFence;
@@ -5430,9 +5546,14 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
       TopTools_ListOfShape aLCBE;
       BOPTools_AlgoTools::MakeConnexityBlocks (aCBE, TopAbs_VERTEX, TopAbs_EDGE, aLCBE);
       //
+      Message_ProgressScope aPSCBE (aPSCB.Next(), NULL, aLCBE.Extent());
       TopTools_ListIteratorOfListOfShape aItLCBE (aLCBE);
       for (; aItLCBE.More(); aItLCBE.Next())
       {
+        if (!aPSCBE.More())
+        {
+          return;
+        }
         const TopoDS_Shape& aCBELoc = aItLCBE.Value();
         //
         // map of edges and vertices of processing invalidity
@@ -5458,6 +5579,7 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
         if (aMFInt.Extent() < 3)
         {
           // nothing to intersect
+          aPSCBE.Next();
           continue;
         }
         //
@@ -5466,8 +5588,13 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
         // among each other (except for the artificially invalid faces)
         TopTools_IndexedMapOfShape aMEToInt;
         Standard_Integer aNb = aMFInt.Extent();
-        for (i = 1; i <= aNb; ++i)
+        Message_ProgressScope aPSIntPair (aPSCBE.Next(), NULL, aNb);
+        for (i = 1; i <= aNb; ++i, aPSIntPair.Next())
         {
+          if (!aPSIntPair.More())
+          {
+            return;
+          }
           const TopoDS_Face& aFi = TopoDS::Face (aMFInt (i));
           if (bSelfRebAvoid && aFi.IsSame (aFInv))
           {
@@ -5573,7 +5700,8 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
   }
   //
   // filter the obtained edges
-  UpdateValidEdges (aFLE, aDMOENEdges, aMVBounds, aMEInvOnArt, aMECheckExt, theVertsToAvoid, aEImages, aDMEETrim);
+  UpdateValidEdges (aFLE, aDMOENEdges, aMVBounds, aMEInvOnArt, aMECheckExt,
+                    theVertsToAvoid, aEImages, aDMEETrim, aPSOuter.Next (3));
 }
 
 //=======================================================================
@@ -5607,7 +5735,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
       {
         const TopoDS_Shape& aE = aExp.Current();
         // save connection to untrimmed face
-        TopTools_ListOfShape *pLF = theDMSF.ChangeSeek (aE);
+        TopTools_ListOfShapepLF = theDMSF.ChangeSeek (aE);
         if (!pLF)
         {
           pLF = theDMSF.Bound (aE, TopTools_ListOfShape());
@@ -5616,7 +5744,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
         //
         // save connection to untrimmed edge
         const TopoDS_Shape& aEInf = myETrimEInf->Find (aE);
-        TopTools_ListOfShape *pLETrim = theMEInfETrim.ChangeSeek (aEInf);
+        TopTools_ListOfShapepLETrim = theMEInfETrim.ChangeSeek (aEInf);
         if (!pLETrim)
         {
           pLETrim = theMEInfETrim.Bound (aEInf, TopTools_ListOfShape());
@@ -5628,7 +5756,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
         {
           const TopoDS_Shape& aV = aExpV.Current();
           // save connection to face
-          TopTools_ListOfShape *pLFV = theDMSF.ChangeSeek (aV);
+          TopTools_ListOfShapepLFV = theDMSF.ChangeSeek (aV);
           if (!pLFV)
           {
             pLFV = theDMSF.Bound (aV, TopTools_ListOfShape());
@@ -5638,7 +5766,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
           if (theLookVertToAvoid)
           {
             // save connection to edges
-            TopTools_ListOfShape *pLEV = theDMVEFull.ChangeSeek (aV);
+            TopTools_ListOfShapepLEV = theDMVEFull.ChangeSeek (aV);
             if (!pLEV)
             {
               pLEV = theDMVEFull.Bound (aV, TopTools_ListOfShape());
@@ -5652,7 +5780,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
     if (theLookVertToAvoid)
     {
       // get edges of invalid faces (from invalid splits only)
-      const TopTools_ListOfShape *pLFInv = myInvalidFaces.Seek (aF);
+      const TopTools_ListOfShapepLFInv = myInvalidFaces.Seek (aF);
       if (!pLFInv || myArtInvalidFaces.IsBound (aF))
       {
         continue;
@@ -5666,7 +5794,7 @@ void BRepOffset_BuildOffsetFaces::PrepareFacesForIntersection (const Standard_Bo
         for (; aExp.More(); aExp.Next())
         {
           const TopoDS_Shape& aE = aExp.Current();
-          TopTools_ListOfShape *pLF = theDMEFInv.ChangeSeek (aE);
+          TopTools_ListOfShapepLF = theDMEFInv.ChangeSeek (aE);
           if (!pLF)
           {
             pLF = &theDMEFInv (theDMEFInv.Add (aE, TopTools_ListOfShape()));
@@ -5707,7 +5835,7 @@ void BRepOffset_BuildOffsetFaces::FindVerticesToAvoid (const TopTools_IndexedDat
 
     TopTools_IndexedDataMapOfShapeListOfShape aMVEEdges;
     // Do not check the splitting vertices, but check only the ending ones
-    const TopTools_ListOfShape *pLEOr = myOEOrigins.Seek (aE);
+    const TopTools_ListOfShapepLEOr = myOEOrigins.Seek (aE);
     if (pLEOr)
     {
       TopTools_ListIteratorOfListOfShape aItLEOr (*pLEOr);
@@ -5736,7 +5864,7 @@ void BRepOffset_BuildOffsetFaces::FindVerticesToAvoid (const TopTools_IndexedDat
       const TopoDS_Shape& aV = aMVEEdges.FindKey (j);
       if (!aMFence.Add (aV))
         continue;
-      const TopTools_ListOfShape *pLE = theDMVEFull.Seek (aV);
+      const TopTools_ListOfShapepLE = theDMVEFull.Seek (aV);
       if (!pLE)
       {
         // isolated vertex
@@ -6350,7 +6478,7 @@ void BRepOffset_BuildOffsetFaces::IntersectAndTrimEdges (const TopTools_IndexedM
       continue;
     }
     //
-    TopTools_ListOfShape *pLVE = aDMVE.ChangeSeek (aV);
+    TopTools_ListOfShapepLVE = aDMVE.ChangeSeek (aV);
     if (!pLVE)
     {
       continue;
@@ -6639,8 +6767,10 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
                                                     TopTools_MapOfShape& theMECheckExt,
                                                     TopTools_MapOfShape& theVertsToAvoid,
                                                     TopTools_DataMapOfShapeListOfShape& theEImages,
-                                                    TopTools_DataMapOfShapeListOfShape& theEETrim)
+                                                    TopTools_DataMapOfShapeListOfShape& theEETrim,
+                                                    const Message_ProgressRange& theRange)
 {
+  Message_ProgressScope aPSOuter (theRange, "Updating edges", 10);
   // update images and origins of edges, plus update AsDes
   //
   // new edges
@@ -6702,6 +6832,12 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
     return;
   }
 
+  aPSOuter.Next();
+  if (!aPSOuter.More())
+  {
+    return;
+  }
+
   BRep_Builder aBB;
 
   // Make connexity blocks of the invalid edges
@@ -6724,9 +6860,14 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
   // Intersected splits
   TopTools_IndexedDataMapOfShapeListOfShape aMBlocksSp;
 
+  Message_ProgressScope aPSB (aPSOuter.Next(), NULL, aLBlocks.Extent());
   TopTools_ListIteratorOfListOfShape aItLB (aLBlocks);
-  for (; aItLB.More(); aItLB.Next())
+  for (; aItLB.More(); aItLB.Next(), aPSB.Next())
   {
+    if (!aPSB.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aBlock = aItLB.Value();
 
     // Get the list of new edges for the block
@@ -6795,8 +6936,13 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
   TopTools_ListOfShape aLValBlocks;
 
   Standard_Integer aNbB = aMBlocksSp.Extent();
-  for (i = 1; i <= aNbB; ++i)
+  Message_ProgressScope aPSBSp (aPSOuter.Next(), NULL, aNbB);
+  for (i = 1; i <= aNbB; ++i, aPSBSp.Next())
   {
+    if (!aPSBSp.More())
+    {
+      return;
+    }
     const TopoDS_Shape& aCE = aMBlocksSp.FindKey (i);
     const TopTools_ListOfShape& aBlockLENew = aMBlocksSp (i);
 
@@ -6805,7 +6951,7 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
     TopTools_ListIteratorOfListOfShape aItLE (aBlockLENew);
     for (; aItLE.More(); aItLE.Next())
     {
-      const TopTools_ListOfShape *pLF = aMELF.Seek (aItLE.Value());
+      const TopTools_ListOfShapepLF = aMELF.Seek (aItLE.Value());
       if (!pLF)
         continue;
       TopTools_ListIteratorOfListOfShape aItLF (*pLF);
@@ -6855,6 +7001,12 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
     return;
   }
 
+  aPSOuter.Next();
+  if (!aPSOuter.More())
+  {
+    return;
+  }
+
   // SECOND STAGE - Filter the remaining splits together
 
   // Add for intersection already removed new edges using them
@@ -6878,6 +7030,12 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
   else
     aSplits1 = aLValBlocks.First();
 
+  aPSOuter.Next();
+  if (!aPSOuter.More())
+  {
+    return;
+  }
+
   // Get all faces to get the bounds from their splits
   TopTools_ListOfShape aLFaces;
   for (i = 1; i <= myOFImages.Extent(); ++i)
@@ -6897,6 +7055,12 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
   TopoDS_Shape aSplits;
   FilterSplits (aLE, aMEInv, Standard_True, theEImages, aSplits);
 
+  aPSOuter.Next();
+  if (!aPSOuter.More())
+  {
+    return;
+  }
+
   // get bounds to update
   // we need to update the edges of all the affected faces
   TopTools_ListOfShape aLF;
@@ -6952,7 +7116,7 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
   BOPAlgo_Builder aGF;
   aGF.AddArgument (aBounds);
   aGF.AddArgument (aSplits);
-  aGF.Perform();
+  aGF.Perform (aPSOuter.Next (3));
   //
   // update splits
   UpdateImages (aLE, theEImages, aGF, myModifiedEdges);
@@ -6996,8 +7160,8 @@ void BRepOffset_BuildOffsetFaces::UpdateValidEdges (const TopTools_IndexedDataMa
       const BOPDS_ListOfPaveBlock& aLPB = pDS->PaveBlocks (pDS->Index (aE));
       if (aLPB.Extent() == 1)
       {
-        const Handle (BOPDS_PaveBlock)& aPB = aLPB.First();
-        const Handle (BOPDS_CommonBlock)& aCB = pDS->CommonBlock (aPB);
+        const Handle(BOPDS_PaveBlock)& aPB = aLPB.First();
+        const Handle(BOPDS_CommonBlock)& aCB = pDS->CommonBlock (aPB);
         if (!aCB.IsNull())
         {
           const BOPDS_ListOfPaveBlock& aLPBCB = aCB->PaveBlocks();
@@ -7393,7 +7557,7 @@ void BRepOffset_BuildOffsetFaces::GetBoundsToUpdate (const TopTools_ListOfShape&
     for (; aItLFDes.More(); aItLFDes.Next())
     {
       const TopoDS_Shape& aED = aItLFDes.Value();
-      const TopTools_ListOfShape *pLEDIm = myOEImages.Seek (aED);
+      const TopTools_ListOfShapepLEDIm = myOEImages.Seek (aED);
       if (!pLEDIm)
       {
         aMDE.Add (aED);
@@ -7419,7 +7583,7 @@ void BRepOffset_BuildOffsetFaces::GetBoundsToUpdate (const TopTools_ListOfShape&
         theLABounds.Append (aEIm);
       }
       //
-      const TopTools_ListOfShape *pLO = myOEOrigins.Seek (aEIm);
+      const TopTools_ListOfShapepLO = myOEOrigins.Seek (aEIm);
       if (pLO)
       {
         TopTools_ListIteratorOfListOfShape aItLO (*pLO);
@@ -7521,7 +7685,7 @@ void BRepOffset_BuildOffsetFaces::GetInvalidEdgesByBounds (const TopoDS_Shape& t
     {
       const TopoDS_Shape& aEOr = aItLEOr.Value();
       //
-      const TopTools_ListOfShape *pLEIm = theEImages.Seek (aEOr);
+      const TopTools_ListOfShapepLEIm = theEImages.Seek (aEOr);
       if (!pLEIm)
         continue;
       TopTools_ListIteratorOfListOfShape aItLEIm (*pLEIm);
@@ -7590,8 +7754,8 @@ void BRepOffset_BuildOffsetFaces::GetInvalidEdgesByBounds (const TopoDS_Shape& t
           // add this edge for checking by making new vertex in the middle of the edge
           TopoDS_Vertex aV;
           Standard_Real f, l;
-          const Handle (Geom_Curve)& aC = BRep_Tool::Curve (TopoDS::Edge (aEIm), f, l);
-          BRep_Builder().MakeVertex (aV, aC->Value ((f + l)*0.5), Precision::Confusion());
+          const Handle(Geom_Curve)& aC = BRep_Tool::Curve (TopoDS::Edge (aEIm), f, l);
+          BRep_Builder().MakeVertex (aV, aC->Value ((f + l) * 0.5), Precision::Confusion());
           // and adding this vertex for checking
           aDMVE.ChangeFromIndex (aDMVE.Add (aV, TopTools_ListOfShape())).Append (aE);
           aMVInv.Add (aV);
@@ -7612,8 +7776,8 @@ void BRepOffset_BuildOffsetFaces::GetInvalidEdgesByBounds (const TopoDS_Shape& t
     // make new vertex in the middle of the edge
     TopoDS_Vertex aV;
     Standard_Real f, l;
-    const Handle (Geom_Curve)& aC = BRep_Tool::Curve (TopoDS::Edge (aE), f, l);
-    BRep_Builder().MakeVertex (aV, aC->Value ((f + l)*0.5), Precision::Confusion());
+    const Handle(Geom_Curve)& aC = BRep_Tool::Curve (TopoDS::Edge (aE), f, l);
+    BRep_Builder().MakeVertex (aV, aC->Value ((f + l) * 0.5), Precision::Confusion());
     // add this vertex for checking
     aDMVE.ChangeFromIndex (aDMVE.Add (aV, TopTools_ListOfShape())).Append (aE);
     aMVInv.Add (aV);
@@ -7777,7 +7941,7 @@ void BRepOffset_BuildOffsetFaces::FilterSplits (const TopTools_ListOfShape& theL
   for (; aItLE.More(); aItLE.Next())
   {
     const TopoDS_Shape& aE = aItLE.Value();
-    TopTools_ListOfShape *pLEIm = theEImages.ChangeSeek (aE);
+    TopTools_ListOfShapepLEIm = theEImages.ChangeSeek (aE);
     if (!pLEIm)
       continue;
 
@@ -8051,19 +8215,26 @@ void BRepOffset_BuildOffsetFaces::UpdateNewIntersectionEdges (const TopTools_Lis
 //function : FillGaps
 //purpose  : Fill possible gaps (holes) in the splits of the offset faces
 //=======================================================================
-void BRepOffset_BuildOffsetFaces::FillGaps()
+void BRepOffset_BuildOffsetFaces::FillGaps (const Message_ProgressRange& theRange)
 {
   Standard_Integer aNbF = myOFImages.Extent();
   if (!aNbF)
     return;
 
+  Message_ProgressScope aPS (theRange, "Filling gaps", 2 * aNbF);
+
   // Check the splits of offset faces on the free edges and fill the gaps (holes)
   // in created splits, otherwise the closed volume will not be possible to create.
 
   // Map the splits of faces to find free edges
   TopTools_IndexedDataMapOfShapeListOfShape anEFMap;
-  for (Standard_Integer i = 1; i <= aNbF; ++i)
+  for (Standard_Integer i = 1; i <= aNbF; ++i, aPS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
+
     TopTools_ListIteratorOfListOfShape itLF (myOFImages (i));
     for (; itLF.More(); itLF.Next())
       TopExp::MapShapesAndAncestors (itLF.Value(), TopAbs_EDGE, TopAbs_FACE, anEFMap);
@@ -8071,8 +8242,13 @@ void BRepOffset_BuildOffsetFaces::FillGaps()
 
   // Analyze images of each offset face on the presence of free edges
   // and try to fill the holes
-  for (Standard_Integer i = 1; i <= aNbF; ++i)
+  for (Standard_Integer i = 1; i <= aNbF; ++i, aPS.Next())
   {
+    if (!aPS.More())
+    {
+      return;
+    }
+
     TopTools_ListOfShape& aLFImages = myOFImages (i);
     if (aLFImages.IsEmpty())
       continue;
@@ -8224,13 +8400,14 @@ void BRepOffset_BuildOffsetFaces::FillHistory()
 //purpose  : Building splits of already trimmed faces
 //=======================================================================
 void BRepOffset_MakeOffset::BuildSplitsOfTrimmedFaces (const TopTools_ListOfShape& theLF,
-                                                       const Handle (BRepAlgo_AsDes)& theAsDes,
-                                                       BRepAlgo_Image& theImage)
+                                                       const Handle(BRepAlgo_AsDes)& theAsDes,
+                                                       BRepAlgo_Image& theImage,
+                                                       const Message_ProgressRange& theRange)
 {
   BRepOffset_BuildOffsetFaces aBFTool (theImage);
   aBFTool.SetFaces (theLF);
   aBFTool.SetAsDesInfo (theAsDes);
-  aBFTool.BuildSplitsOfTrimmedFaces();
+  aBFTool.BuildSplitsOfTrimmedFaces (theRange);
 }
 
 //=======================================================================
@@ -8241,11 +8418,12 @@ void BRepOffset_MakeOffset::BuildSplitsOfTrimmedFaces (const TopTools_ListOfShap
 //=======================================================================
 void BRepOffset_MakeOffset::BuildSplitsOfExtendedFaces (const TopTools_ListOfShape& theLF,
                                                         const BRepOffset_Analyse& theAnalyse,
-                                                        const Handle (BRepAlgo_AsDes)& theAsDes,
+                                                        const Handle(BRepAlgo_AsDes)& theAsDes,
                                                         TopTools_DataMapOfShapeListOfShape& theEdgesOrigins,
                                                         TopTools_DataMapOfShapeShape& theFacesOrigins,
                                                         TopTools_DataMapOfShapeShape& theETrimEInf,
-                                                        BRepAlgo_Image& theImage)
+                                                        BRepAlgo_Image& theImage,
+                                                        const Message_ProgressRange& theRange)
 {
   BRepOffset_BuildOffsetFaces aBFTool (theImage);
   aBFTool.SetFaces (theLF);
@@ -8254,5 +8432,5 @@ void BRepOffset_MakeOffset::BuildSplitsOfExtendedFaces (const TopTools_ListOfSha
   aBFTool.SetEdgesOrigins (theEdgesOrigins);
   aBFTool.SetFacesOrigins (theFacesOrigins);
   aBFTool.SetInfEdges (theETrimEInf);
-  aBFTool.BuildSplitsOfExtendedFaces();
+  aBFTool.BuildSplitsOfExtendedFaces (theRange);
 }
index d00d7d16106a6a55577cd4ff12eb520c1ec2ea5f..f6a5ff0a13fed2257db6b54688f9adb291269bbb 100644 (file)
@@ -41,14 +41,15 @@ void BRepOffsetAPI_MakeOffsetShape::PerformByJoin
  const Standard_Boolean Intersection,
  const Standard_Boolean SelfInter,
  const GeomAbs_JoinType Join,
- const Standard_Boolean RemoveIntEdges)
+ const Standard_Boolean RemoveIntEdges,
+ const Message_ProgressRange& theRange)
 {
   NotDone();
   myLastUsedAlgo = OffsetAlgo_JOIN;
 
   myOffsetShape.Initialize (S,Offset,Tol,Mode,Intersection,SelfInter,
                             Join, Standard_False, RemoveIntEdges);
-  myOffsetShape.MakeOffsetShape();
+  myOffsetShape.MakeOffsetShape(theRange);
 
   if (!myOffsetShape.IsDone())
     return;
index 1a863c1091c69912075b5da9323324bf2258251d..4457cb1a4e2c0e3ceb3d79b07df873782f7dc1e3 100644 (file)
@@ -114,7 +114,8 @@ public:
                                      const Standard_Boolean Intersection = Standard_False,
                                      const Standard_Boolean SelfInter = Standard_False,
                                      const GeomAbs_JoinType Join = GeomAbs_Arc,
-                                     const Standard_Boolean RemoveIntEdges = Standard_False);
+                                     const Standard_Boolean RemoveIntEdges = Standard_False,
+                                     const Message_ProgressRange& theRange = Message_ProgressRange());
 
   //! Returns instance of the unrelying intersection / arc algorithm.
   Standard_EXPORT virtual const BRepOffset_MakeOffset& MakeOffset() const;
index 5024a3dfada5898214b6b7bd8bac021519074150..5238dd920dbcceb311928dc7e5b0e841a44c3ef2 100644 (file)
@@ -41,12 +41,13 @@ void BRepOffsetAPI_MakeThickSolid::MakeThickSolidByJoin
 (const TopoDS_Shape&         S,
  const TopTools_ListOfShape& ClosingFaces,
  const Standard_Real         Offset, 
- const Standard_Real         Tol, 
+ const Standard_Real         Tol,
  const BRepOffset_Mode       Mode,
  const Standard_Boolean      Intersection,
  const Standard_Boolean      SelfInter,
  const GeomAbs_JoinType      Join,
- const Standard_Boolean      RemoveIntEdges)
+ const Standard_Boolean      RemoveIntEdges,
+ const Message_ProgressRange& theRange)
 {
   NotDone();
   myLastUsedAlgo = OffsetAlgo_JOIN;
@@ -57,7 +58,7 @@ void BRepOffsetAPI_MakeThickSolid::MakeThickSolidByJoin
   for (; it.More(); it.Next())
     myOffsetShape.AddFace(TopoDS::Face(it.Value()));
 
-  myOffsetShape.MakeThickSolid();
+  myOffsetShape.MakeThickSolid(theRange);
   if (!myOffsetShape.IsDone())
     return;
 
index b15eb150f5dae7a3ffe93d846b77b9c9c53c4e87..245f7bdf7e506a7f5cad271e5f59ec76b55a4757 100644 (file)
@@ -110,7 +110,8 @@ public:
                                             const Standard_Boolean Intersection = Standard_False,
                                             const Standard_Boolean SelfInter = Standard_False,
                                             const GeomAbs_JoinType Join = GeomAbs_Arc,
-                                            const Standard_Boolean RemoveIntEdges = Standard_False);
+                                            const Standard_Boolean RemoveIntEdges = Standard_False,
+                                            const Message_ProgressRange& theRange = Message_ProgressRange());
 
   // Does nothing.
   Standard_EXPORT virtual void Build(const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE;
index a56e27068f003b856474294a7130f60f66c6106c..ccccc457f615092dff5a52fa81481abc5679b2c9 100644 (file)
@@ -17,6 +17,7 @@
 #include <Draw_Interpretor.hxx>
 #include <Draw_Appli.hxx>
 #include <DrawTrSurf.hxx>
+#include <Draw_ProgressIndicator.hxx>
 
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
@@ -976,10 +977,12 @@ Standard_Integer thickshell(Draw_Interpretor& theCommands,
   if (n > 5)
     Tol = Draw::Atof(a[5]);
 
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(theCommands, 1);
+
   BRepOffset_MakeOffset B;
   B.Initialize(S, Of, Tol, BRepOffset_Skin, Inter, 0, JT, Standard_True);
 
-  B.MakeOffsetShape();
+  B.MakeOffsetShape(aProgress->Start());
 
   const BRepOffset_Error aRetCode = B.Error();
   reportOffsetState(theCommands, aRetCode);
@@ -1037,8 +1040,9 @@ Standard_Integer offsetshape(Draw_Interpretor& theCommands,
     }
   }
 
-  if (!YaBouchon)  B.MakeOffsetShape();
-  else             B.MakeThickSolid();
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(theCommands, 1);
+  if (!YaBouchon)  B.MakeOffsetShape(aProgress->Start());
+  else             B.MakeThickSolid(aProgress->Start());
 
   const BRepOffset_Error aRetCode = B.Error();
   reportOffsetState(theCommands, aRetCode);
@@ -1169,10 +1173,11 @@ Standard_Integer offsetperform(Draw_Interpretor& theCommands,
 {
   if (theNArg < 2) return 1;
 
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(theCommands, 1);
   if (theYaBouchon)
-    TheOffset.MakeThickSolid();
+    TheOffset.MakeThickSolid(aProgress->Start());
   else
-    TheOffset.MakeOffsetShape();
+    TheOffset.MakeOffsetShape(aProgress->Start());
 
   if (TheOffset.IsDone())
   {
index 682d7243ea354c3afdbf4d516760b1161b7c2510..17d5d26ffd072d137b6fcc231e4c6f1dc50a4e37 100644 (file)
@@ -20,6 +20,7 @@
 #include <Draw_Interpretor.hxx>
 #include <DBRep.hxx>
 #include <DrawTrSurf.hxx>
+#include <Draw_ProgressIndicator.hxx>
 
 #include <string.h>
 #include <stdio.h>
@@ -392,7 +393,7 @@ Standard_Integer MakeBoss(Draw_Interpretor& , Standard_Integer , const char** a)
 //function : MakeShell
 //purpose  : 
 //=======================================================================
-Standard_Integer MakeShell(Draw_Interpretor& , Standard_Integer , const char** a)
+Standard_Integer MakeShell(Draw_Interpretor& theDI, Standard_Integer , const char** a)
 {
 
   TopoDS_Shape aShape = DBRep::Get( a[1] ); 
@@ -404,12 +405,14 @@ Standard_Integer MakeShell(Draw_Interpretor& , Standard_Integer , const char** a
   
   Standard_Real Off = -Draw::Atof( a[3] );
 
+  Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(theDI, 1);
+
   BRepOffset_MakeOffset Offset;
 
   Offset.Initialize( aShape, Off,  1.0e-3, BRepOffset_Skin, 
                               Standard_True , Standard_False , GeomAbs_Arc );
   Offset.AddFace( F );
-  Offset.MakeThickSolid();
+  Offset.MakeThickSolid(aProgress->Start());
 
   if( Offset.IsDone() ) {
   //    SaveShape::Save(Offset.Shape(), "ss");
index dae680ea9e9171338dacb59b1eba53ee24eb9134..5304099da2b05dec8da08166767b7dad60edb3e1 100644 (file)
@@ -1781,12 +1781,8 @@ void BiTgte_Blend::ComputeCenters()
        }
       }
       TopTools_DataMapOfShapeListOfShape anEmptyMap;
-      BRepOffset_Inter2d::Compute(myAsDes,
-                                 CurOF,
-                                 myEdges,
-                                 myTol,
-                                  anEmptyMap,
-                                 aDMVV);
+      BRepOffset_Inter2d::Compute(myAsDes, CurOF, myEdges, myTol,
+                                  anEmptyMap, aDMVV, Message_ProgressRange());
     }
   }
 
@@ -1816,12 +1812,8 @@ void BiTgte_Blend::ComputeCenters()
     }
 
     TopTools_DataMapOfShapeListOfShape anEmptyMap;
-    BRepOffset_Inter2d::Compute(myAsDes,
-                               CurOF,
-                               myEdges,
-                               myTol,
-                                anEmptyMap,
-                               aDMVV);
+    BRepOffset_Inter2d::Compute(myAsDes, CurOF, myEdges, myTol,
+                                anEmptyMap, aDMVV, Message_ProgressRange());
   }
   //
   // fuse vertices on edges stored in AsDes
@@ -1831,7 +1823,7 @@ void BiTgte_Blend::ComputeCenters()
   // unwinding 
   // ------------
   BRepOffset_MakeLoops MakeLoops;
-  MakeLoops.Build (LOF, myAsDes, myImageOffset, anEmptyImage);
+  MakeLoops.Build (LOF, myAsDes, myImageOffset, anEmptyImage, Message_ProgressRange());
 
   // ------------------------------------------------------------
   // It is possible to unwind edges at least one ancestor which of 
diff --git a/tests/bugs/modalg_7/bug32330 b/tests/bugs/modalg_7/bug32330
new file mode 100644 (file)
index 0000000..c0f01b7
--- /dev/null
@@ -0,0 +1,47 @@
+puts "============================================"
+puts "0032330: Modeling Algorithms - Extend Offset algorithm with Progress Indicator and User Break"
+puts "============================================"
+puts ""
+proc isTracked { theOutput } {
+  if {![regexp "Progress" $theOutput]} {
+    puts "Error: progress is not tracked"
+  }
+}
+XProgress +t
+    
+# check that progress is tracked for offsetshape operation
+
+box s1 100 100 100
+explode s1 f
+set log [offsetshape result1 s1 -5 s1_1]
+isTracked $log
+
+# check that progress is tracked for offsetperform operation
+
+restore [locate_data_file bug27908.brep] s2
+offsetparameter 1e-7 p i
+offsetload s2 10
+set log [offsetperform result2]
+isTracked $log
+
+
+polyline p 0 0 0 5 0 0 7 0 3 3 0 3 4 0 1 1 0 1 2 0 3 -2 0 3 0 0 0
+mkplane f p
+prism s3 f 0 5 0
+offsetparameter 1e-7 c i
+offsetload s3 1
+set log [offsetperform result3]
+isTracked $log
+
+box s4 10 10 10
+offsetparameter 1e-7 c a
+offsetload s4 5
+set log [offsetperform result4]
+isTracked $log
+
+offsetparameter 1e-7 p a
+offsetload s4 5
+set log [offsetperform result5]
+isTracked $log