diff --git a/src/BRepOffset/BRepOffset_Analyse.cxx b/src/BRepOffset/BRepOffset_Analyse.cxx index 20bfba9a86..8247b362af 100644 --- a/src/BRepOffset/BRepOffset_Analyse.cxx +++ b/src/BRepOffset/BRepOffset_Analyse.cxx @@ -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; diff --git a/src/BRepOffset/BRepOffset_Analyse.hxx b/src/BRepOffset/BRepOffset_Analyse.hxx index 51e319d251..3c079c6114 100644 --- a/src/BRepOffset/BRepOffset_Analyse.hxx +++ b/src/BRepOffset/BRepOffset_Analyse.hxx @@ -33,6 +33,9 @@ #include #include #include + +#include + 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 diff --git a/src/BRepOffset/BRepOffset_Error.hxx b/src/BRepOffset/BRepOffset_Error.hxx index c809f4a983..e5dda91fdb 100644 --- a/src/BRepOffset/BRepOffset_Error.hxx +++ b/src/BRepOffset/BRepOffset_Error.hxx @@ -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 diff --git a/src/BRepOffset/BRepOffset_Inter2d.cxx b/src/BRepOffset/BRepOffset_Inter2d.cxx index 1af28492a8..f59ca2b58d 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.cxx +++ b/src/BRepOffset/BRepOffset_Inter2d.cxx @@ -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; diff --git a/src/BRepOffset/BRepOffset_Inter2d.hxx b/src/BRepOffset/BRepOffset_Inter2d.hxx index 850a674c20..a2b04fb6af 100644 --- a/src/BRepOffset/BRepOffset_Inter2d.hxx +++ b/src/BRepOffset/BRepOffset_Inter2d.hxx @@ -21,6 +21,7 @@ #include #include #include +#include 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 . //! 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 . @@ -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 diff --git a/src/BRepOffset/BRepOffset_Inter3d.cxx b/src/BRepOffset/BRepOffset_Inter3d.cxx index 9f1ceb951d..8fc46ce06d 100644 --- a/src/BRepOffset/BRepOffset_Inter3d.cxx +++ b/src/BRepOffset/BRepOffset_Inter3d.cxx @@ -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& aPairs = aSelector.Pairs(); const Standard_Integer aNbPairs = static_cast (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, diff --git a/src/BRepOffset/BRepOffset_Inter3d.hxx b/src/BRepOffset/BRepOffset_Inter3d.hxx index e9607c89c5..ffbddf3844 100644 --- a/src/BRepOffset/BRepOffset_Inter3d.hxx +++ b/src/BRepOffset/BRepOffset_Inter3d.hxx @@ -17,6 +17,7 @@ #ifndef _BRepOffset_Inter3d_HeaderFile #define _BRepOffset_Inter3d_HeaderFile +#include #include #include #include @@ -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); - +public: + + //! 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); - - 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(); - - - - -protected: + //! 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 diff --git a/src/BRepOffset/BRepOffset_MakeLoops.cxx b/src/BRepOffset/BRepOffset_MakeLoops.cxx index de5eb39747..738dba4132 100644 --- a/src/BRepOffset/BRepOffset_MakeLoops.cxx +++ b/src/BRepOffset/BRepOffset_MakeLoops.cxx @@ -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; diff --git a/src/BRepOffset/BRepOffset_MakeLoops.hxx b/src/BRepOffset/BRepOffset_MakeLoops.hxx index 7caf1b3fe6..e309f50e4f 100644 --- a/src/BRepOffset/BRepOffset_MakeLoops.hxx +++ b/src/BRepOffset/BRepOffset_MakeLoops.hxx @@ -17,6 +17,8 @@ #ifndef _BRepOffset_MakeLoops_HeaderFile #define _BRepOffset_MakeLoops_HeaderFile +#include + #include #include #include @@ -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); diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index 2c5fe795f3..e18919550c 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -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 diff --git a/src/BRepOffset/BRepOffset_MakeOffset.hxx b/src/BRepOffset/BRepOffset_MakeOffset.hxx index ea99f9c92b..db5b95a4b4 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.hxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.hxx @@ -36,6 +36,9 @@ #include #include #include +#include + +#include 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 on the Face 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; diff --git a/src/BRepOffset/BRepOffset_MakeOffset_1.cxx b/src/BRepOffset/BRepOffset_MakeOffset_1.cxx index 3adba98fcd..170eed611f 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset_1.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset_1.cxx @@ -119,7 +119,7 @@ namespace { ContainerType& theContainer, FenceMapType* theMFence) { - const TopTools_ListOfShape *pLSIm = theImages.Seek (theS); + const TopTools_ListOfShape* pLSIm = 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_ListOfShape* pLS = 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_ListOfShape* pLSOr = 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_ListOfShape* pLD = 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; } - // Fuse all edges - IntersectTrimmedEdges(); + Message_ProgressScope aPS (theRange, "Building splits of trimmed faces", 5); + // Fuse all edges + 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_ListOfShape* pLEFOr = 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_ListOfShape* pLEIm = 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_MapOfShape* pMap = 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_ListOfShape* pLFNewHoles = 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_ListOfShape* pLEIm = 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_ListOfShape* pLEOr = 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_ListOfShape* pLF = 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_ListOfShape* pLF = 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_ListOfShape* pLF = 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_Shape* pFOffset = 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_ListOfShape* pLFE = 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_ListOfShape* pLF = 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_ListOfShape* pLF = 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_ListOfShape* pLE = 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_ListOfShape* pLEOr = 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_ListOfShape* pLEOr = 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_ListOfShape* pLF = 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_ListOfShape* pLETrim = 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_ListOfShape* pLFV = 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_ListOfShape* pLEV = 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_ListOfShape* pLFInv = 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_ListOfShape* pLF = 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_ListOfShape* pLEOr = 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_ListOfShape* pLE = 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_ListOfShape* pLVE = 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_ListOfShape* pLF = 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_ListOfShape* pLEDIm = 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_ListOfShape* pLO = 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_ListOfShape* pLEIm = 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_ListOfShape* pLEIm = 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); } diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx index d00d7d1610..f6a5ff0a13 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx @@ -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; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx index 1a863c1091..4457cb1a4e 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx @@ -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; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.cxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.cxx index 5024a3dfad..5238dd920d 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.cxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.cxx @@ -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; diff --git a/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.hxx b/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.hxx index b15eb150f5..245f7bdf7e 100644 --- a/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.hxx +++ b/src/BRepOffsetAPI/BRepOffsetAPI_MakeThickSolid.hxx @@ -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; diff --git a/src/BRepTest/BRepTest_FeatureCommands.cxx b/src/BRepTest/BRepTest_FeatureCommands.cxx index a56e27068f..ccccc457f6 100644 --- a/src/BRepTest/BRepTest_FeatureCommands.cxx +++ b/src/BRepTest/BRepTest_FeatureCommands.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -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()) { diff --git a/src/BRepTest/BRepTest_OtherCommands.cxx b/src/BRepTest/BRepTest_OtherCommands.cxx index 682d7243ea..17d5d26ffd 100644 --- a/src/BRepTest/BRepTest_OtherCommands.cxx +++ b/src/BRepTest/BRepTest_OtherCommands.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -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"); diff --git a/src/BiTgte/BiTgte_Blend.cxx b/src/BiTgte/BiTgte_Blend.cxx index dae680ea9e..5304099da2 100644 --- a/src/BiTgte/BiTgte_Blend.cxx +++ b/src/BiTgte/BiTgte_Blend.cxx @@ -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 index 0000000000..c0f01b7764 --- /dev/null +++ b/tests/bugs/modalg_7/bug32330 @@ -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