From 92434a36ef0125183f01daae00ff8570ec18a35c Mon Sep 17 00:00:00 2001 From: AMA <> Date: Thu, 3 Nov 2011 09:52:18 +0000 Subject: [PATCH] 0022747: Progress indicator in sewing algorithm --- src/BRepBuilderAPI/BRepBuilderAPI.cdl | 3 +- src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cdl | 33 +++-- src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx | 127 ++++++++++++++----- src/BRepTest/BRepTest_SurfaceCommands.cxx | 9 +- 4 files changed, 120 insertions(+), 52 deletions(-) diff --git a/src/BRepBuilderAPI/BRepBuilderAPI.cdl b/src/BRepBuilderAPI/BRepBuilderAPI.cdl index 4e0d7882e8..6b361386d0 100755 --- a/src/BRepBuilderAPI/BRepBuilderAPI.cdl +++ b/src/BRepBuilderAPI/BRepBuilderAPI.cdl @@ -86,7 +86,8 @@ uses BRepLib, BRepTools, TColStd, - TColgp + TColgp, + Message is diff --git a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cdl b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cdl index f5be5dcd7f..43ec9b7817 100755 --- a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cdl +++ b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cdl @@ -81,7 +81,8 @@ uses ReShape from BRepTools, SequenceOfInteger from TColStd, SequenceOfReal from TColStd, - SequenceOfPnt from TColgp + SequenceOfPnt from TColgp, + ProgressIndicator from Message raises @@ -117,8 +118,10 @@ is Add(me : mutable; shape : Shape from TopoDS); ---Purpose: Defines the shapes to be sewed or controlled - Perform(me : mutable); ---is virtual; + Perform(me : mutable; + thePI : ProgressIndicator from Message = 0); ---Purpose: Computing + -- thePI - progress indicator of algorithm SewedShape(me) returns Shape from TopoDS; ---C++: return const & @@ -285,10 +288,13 @@ is --- INTERNAL FUCTIONS --- ------------------------- - Cutting(me : mutable) is protected; + Cutting(me : mutable; + thePI : ProgressIndicator from Message = 0) is protected; ---Purpose: Performs cutting of sections + -- thePI - progress indicator of processing - Merging(me : mutable; passage : Boolean) is protected; + Merging(me : mutable; passage : Boolean; + thePI : ProgressIndicator from Message = 0) is protected; IsMergedClosed(me; Edge1 : Edge from TopoDS; @@ -318,7 +324,8 @@ is returns Boolean is protected; ---Purpose: Merged nearest edges. - EdgeProcessing(me : mutable) is protected; + EdgeProcessing(me : mutable; + thePI : ProgressIndicator from Message = 0) is protected; CreateOutputInformations(me : mutable) is protected; @@ -336,17 +343,21 @@ is returns Boolean is virtual protected; ---Purpose:Defines if surface is V closed. - FaceAnalysis(me : mutable) is virtual protected; - ---Purpose: - -- This method is called from Perform only + FaceAnalysis(me : mutable; + thePI : ProgressIndicator from Message = 0) is virtual protected; + ---Purpose: + -- This method is called from Perform only + -- thePI - progress indicator of processing FindFreeBoundaries(me : mutable) is virtual protected; ---Purpose: -- This method is called from Perform only - VerticesAssembling(me : mutable) is virtual protected; - ---Purpose: - -- This method is called from Perform only + VerticesAssembling(me : mutable; + thePI : ProgressIndicator from Message = 0) is virtual protected; + ---Purpose: + -- This method is called from Perform only + -- thePI - progress indicator of processing CreateSewedShape(me : mutable) is virtual protected; ---Purpose: diff --git a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx index d2484e9805..9afa812718 100755 --- a/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx +++ b/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx @@ -107,6 +107,7 @@ #include #include #include +#include static void SortBox (const Handle(Bnd_HArray1OfBox) hSetBoxes, const Bnd_Box& aBox, @@ -984,7 +985,6 @@ void BRepBuilderAPI_Sewing::EvaluateAngulars(TopTools_SequenceOfShape& sequenceS // Evaluate distance beetween edges with indice indRef and the following edges in the list // Remarks (lengSec - indRef) must be >= 1 //======================================================================= - void BRepBuilderAPI_Sewing::EvaluateDistances(TopTools_SequenceOfShape& sequenceSec, TColStd_Array1OfBoolean& secForward, TColStd_Array1OfReal& tabDst, @@ -1746,8 +1746,10 @@ void BRepBuilderAPI_Sewing::Add(const TopoDS_Shape& aShape) #include #endif -void BRepBuilderAPI_Sewing::Perform() +void BRepBuilderAPI_Sewing::Perform(const Handle(Message_ProgressIndicator)& thePI) { + const Standard_Integer aNumberOfStages = myAnalysis + myCutting + mySewing + 2; + Message_ProgressSentry aPS (thePI, "Sewing", 0, aNumberOfStages, 1); #ifdef DEB Standard_Real t_total = 0., t_analysis = 0., t_assembling = 0., t_cutting = 0., t_merging = 0.; OSD_Chronometer chr_total, chr_local; @@ -1756,13 +1758,17 @@ void BRepBuilderAPI_Sewing::Perform() #endif // face analysis - if (myAnalysis) { + if (myAnalysis) + { #if DEB cout << "Begin face analysis..." << endl; chr_local.Reset(); chr_local.Start(); #endif - FaceAnalysis(); + FaceAnalysis (thePI); + if (!aPS.More()) + return; + aPS.Next(); #if DEB chr_local.Stop(); chr_local.Show(t_analysis); @@ -1770,34 +1776,43 @@ void BRepBuilderAPI_Sewing::Perform() #endif } - if (myNbShapes || !myShape.IsNull()) { + if (myNbShapes || !myShape.IsNull()) + { FindFreeBoundaries(); - if (myBoundFaces.Extent()) { + if (myBoundFaces.Extent()) + { #if DEB cout << "Begin vertices assembling..." << endl; chr_local.Reset(); chr_local.Start(); #endif - VerticesAssembling(); + VerticesAssembling (thePI); + if (!aPS.More()) + return; + aPS.Next(); #if DEB chr_local.Stop(); chr_local.Show(t_assembling); cout << "Vertices assembling finished after " << t_assembling << " s" << endl; #endif - if (myCutting) { + if (myCutting) + { #if DEB - cout << "Begin cutting..." << endl; - chr_local.Reset(); - chr_local.Start(); + cout << "Begin cutting..." << endl; + chr_local.Reset(); + chr_local.Start(); #endif - Cutting(); + Cutting (thePI); + if (!aPS.More()) + return; + aPS.Next(); #if DEB - chr_local.Stop(); - chr_local.Show(t_cutting); - cout << "Cutting finished after " << t_cutting << " s" << endl; + chr_local.Stop(); + chr_local.Show(t_cutting); + cout << "Cutting finished after " << t_cutting << " s" << endl; #endif } #if DEB @@ -1805,30 +1820,61 @@ void BRepBuilderAPI_Sewing::Perform() chr_local.Reset(); chr_local.Start(); #endif - Merging(Standard_True); + Merging (Standard_True, thePI); + if (!aPS.More()) + return; + aPS.Next(); #if DEB chr_local.Stop(); chr_local.Show(t_merging); cout << "Merging finished after " << t_merging << " s" << endl; #endif } + else + { + aPS.Next( 1, Handle(TCollection_HAsciiString)()); + if (myCutting) + aPS.Next( 1, Handle(TCollection_HAsciiString)()); + aPS.Next( 1, Handle(TCollection_HAsciiString)()); + if (!aPS.More()) + return; + } - if (mySewing) { + if (mySewing) + { #if DEB cout << "Creating sewed shape..." << endl; #endif // examine the multiple edges if any and process sameparameter for edges if necessary - EdgeProcessing(); + EdgeProcessing (thePI); + if (!aPS.More()) + return; CreateSewedShape(); - if (mySameParameterMode && myFaceMode) SameParameterShape(); + if (!aPS.More()) + { + mySewedShape.Nullify(); + return; + } + if (mySameParameterMode && myFaceMode) + SameParameterShape(); + if (!aPS.More()) + { + mySewedShape.Nullify(); + return; + } #if DEB cout << "Sewed shape created" << endl; #endif } - + // create edge informations for output CreateOutputInformations(); + if (!aPS.More()) + { + mySewedShape.Nullify(); + return; + } } #if DEB chr_total.Stop(); @@ -2120,7 +2166,7 @@ void BRepBuilderAPI_Sewing::Dump() const // myDegenerated //======================================================================= -void BRepBuilderAPI_Sewing::FaceAnalysis() +void BRepBuilderAPI_Sewing::FaceAnalysis(const Handle(Message_ProgressIndicator)& thePI) { if (!myShape.IsNull() && myOldShapes.IsEmpty()) { Add(myShape); @@ -2131,7 +2177,8 @@ void BRepBuilderAPI_Sewing::FaceAnalysis() TopTools_MapOfShape SmallEdges; TopTools_DataMapOfShapeListOfShape GluedVertices; Standard_Integer i = 1; - for (i = 1; i <= myOldShapes.Extent(); i++) { + Message_ProgressSentry aPS (thePI, "Shape analysis", 0, myOldShapes.Extent(), 1); + for (i = 1; i <= myOldShapes.Extent() && aPS.More(); i++, aPS.Next()) { for (TopExp_Explorer fexp(myOldShapes(i),TopAbs_FACE); fexp.More(); fexp.Next()) { // Retrieve current face @@ -2659,9 +2706,10 @@ static Standard_Integer IsMergedVertices(const TopoDS_Shape& face1, } static Standard_Boolean GlueVertices(TopTools_IndexedDataMapOfShapeShape& aVertexNode, - TopTools_DataMapOfShapeListOfShape& aNodeEdges, - const TopTools_IndexedDataMapOfShapeListOfShape& aBoundFaces, - const Standard_Real Tolerance) + TopTools_DataMapOfShapeListOfShape& aNodeEdges, + const TopTools_IndexedDataMapOfShapeListOfShape& aBoundFaces, + const Standard_Real Tolerance, + const Handle(Message_ProgressIndicator)& theProgress) { Standard_Integer i, nbVertices = aVertexNode.Extent(); // Create map of node -> vertices @@ -2694,7 +2742,8 @@ static Standard_Boolean GlueVertices(TopTools_IndexedDataMapOfShapeShape& aVerte } // Merge nearest nodes TopTools_IndexedDataMapOfShapeShape NodeNearestNode; - for (i = 1; i <= nbNodes; i++) { + Message_ProgressSentry aPS (theProgress, "Glueing nodes", 0, nbNodes, 1, Standard_True); + for (i = 1; i <= nbNodes && aPS.More(); i++, aPS.Next()) { TopoDS_Vertex node1 = TopoDS::Vertex(NodeVertices.FindKey(i)); // Find near nodes TColStd_ListOfInteger listIndex; @@ -2823,10 +2872,11 @@ static Standard_Boolean GlueVertices(TopTools_IndexedDataMapOfShapeShape& aVerte return CreateNewNodes(NodeNearestNode,NodeVertices,aVertexNode,aNodeEdges); } -void BRepBuilderAPI_Sewing::VerticesAssembling() +void BRepBuilderAPI_Sewing::VerticesAssembling(const Handle(Message_ProgressIndicator)& thePI) { Standard_Integer nbVert = myVertexNode.Extent(); Standard_Integer nbVertFree = myVertexNodeFree.Extent(); + Message_ProgressSentry aPS (thePI, "Vertices assembling", 0, 2, 1); if (nbVert || nbVertFree) { // Fill map node -> sections Standard_Integer i; @@ -2848,13 +2898,16 @@ void BRepBuilderAPI_Sewing::VerticesAssembling() #ifdef DEB cout << "Assemble " << nbVert << " vertices on faces..." << endl; #endif - while (GlueVertices(myVertexNode,myNodeSections,myBoundFaces,myTolerance)); + while (GlueVertices(myVertexNode,myNodeSections,myBoundFaces,myTolerance, thePI)); } + if (!aPS.More()) + return; + aPS.Next(); if (nbVertFree) { #ifdef DEB cout << "Assemble " << nbVertFree << " vertices on floating edges..." << endl; #endif - while (GlueVertices(myVertexNodeFree,myNodeSections,myBoundFaces,myTolerance)); + while (GlueVertices(myVertexNodeFree,myNodeSections,myBoundFaces,myTolerance, thePI)); } } } @@ -3013,11 +3066,13 @@ static void ReplaceEdge(const TopoDS_Shape& oldEdge, // //======================================================================= -void BRepBuilderAPI_Sewing::Merging(const Standard_Boolean /* firstTime */) +void BRepBuilderAPI_Sewing::Merging(const Standard_Boolean /* firstTime */, + const Handle(Message_ProgressIndicator)& thePI) { BRep_Builder B; // TopTools_MapOfShape MergedEdges; - for (Standard_Integer i = 1; i <= myBoundFaces.Extent(); i++) { + Message_ProgressSentry aPS (thePI, "Merging bounds", 0, myBoundFaces.Extent(), 1); + for (Standard_Integer i = 1; i <= myBoundFaces.Extent() && aPS.More(); i++, aPS.Next()) { TopoDS_Shape bound = myBoundFaces.FindKey(i); @@ -3510,7 +3565,7 @@ Standard_Boolean BRepBuilderAPI_Sewing::MergedNearestEdges(const TopoDS_Shape& e // myCuttingNode //======================================================================= -void BRepBuilderAPI_Sewing::Cutting() +void BRepBuilderAPI_Sewing::Cutting(const Handle(Message_ProgressIndicator)& thePI) { Standard_Integer i, nbVertices = myVertexNode.Extent(); if (!nbVertices) return; @@ -3529,7 +3584,8 @@ void BRepBuilderAPI_Sewing::Cutting() Standard_Real first, last; // Iterate on all boundaries Standard_Integer nbBounds = myBoundFaces.Extent(); - for (i = 1; i <= nbBounds; i++) { + Message_ProgressSentry aPS (thePI, "Cutting bounds", 0, nbBounds, 1); + for (i = 1; i <= nbBounds && aPS.More(); i++, aPS.Next()) { const TopoDS_Edge& bound = TopoDS::Edge(myBoundFaces.FindKey(i)); // Do not cut floating edges if (!myBoundFaces(i).Extent()) continue; @@ -3865,12 +3921,13 @@ static TopoDS_Edge DegeneratedSection(const TopoDS_Shape& section, const TopoDS_ // - make the contigous edges sameparameter //======================================================================= -void BRepBuilderAPI_Sewing::EdgeProcessing() +void BRepBuilderAPI_Sewing::EdgeProcessing(const Handle(Message_ProgressIndicator)& thePI) { // constructs sectionEdge TopTools_MapOfShape MapFreeEdges; TopTools_DataMapOfShapeShape EdgeFace; - for (Standard_Integer i = 1; i <= myBoundFaces.Extent(); i++) { + Message_ProgressSentry aPS (thePI, "Edge processing", 0, myBoundFaces.Extent(), 1); + for (Standard_Integer i = 1; i <= myBoundFaces.Extent() && aPS.More(); i++, aPS.Next()) { const TopoDS_Shape& bound = myBoundFaces.FindKey(i); const TopTools_ListOfShape& listFaces = myBoundFaces(i); if (listFaces.Extent() == 1) { diff --git a/src/BRepTest/BRepTest_SurfaceCommands.cxx b/src/BRepTest/BRepTest_SurfaceCommands.cxx index 04868d3c48..17420de70a 100755 --- a/src/BRepTest/BRepTest_SurfaceCommands.cxx +++ b/src/BRepTest/BRepTest_SurfaceCommands.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef WNT //#define strcasecmp strcmp Already defined @@ -261,7 +262,7 @@ static Standard_Integer pcurve(Draw_Interpretor& , Standard_Integer n, const cha // sewing //======================================================================= -static Standard_Integer sewing (Draw_Interpretor& , +static Standard_Integer sewing (Draw_Interpretor& theDi, Standard_Integer n, const char** a) { if (n < 3) return (1); @@ -289,7 +290,6 @@ static Standard_Integer sewing (Draw_Interpretor& , NonManifoldMode = Standard_True; ntmp--; } - aSewing.Init(tol, Standard_True,Standard_True,Standard_True,NonManifoldMode); while (i < ntmp) { @@ -297,10 +297,9 @@ static Standard_Integer sewing (Draw_Interpretor& , aSewing.Add(sh); i++; } - - aSewing.Perform(); + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDi, 1); + aSewing.Perform (aProgress); aSewing.Dump(); - const TopoDS_Shape& sh2 = aSewing.SewedShape(); if (!sh2.IsNull()) { DBRep::Set(a[1], sh2);