From 93537d5862c768a6338c0034856b4f95213e9e11 Mon Sep 17 00:00:00 2001 From: asuraven Date: Wed, 18 Aug 2021 15:05:58 +0300 Subject: [PATCH] 0031942: Modeling Algorithms - add possibility to abort the BRepExtrema_DistShapeShape algorithm - Now available to interrupt the DRAW 'distmini' command by Ctrl/C - Message_ProgressRange/Message_ProgressScope used in BRepExtrema_DistShapeShape::Perform() to provide user break --- .../BRepExtrema_DistShapeShape.cxx | 233 ++++++++++-------- .../BRepExtrema_DistShapeShape.hxx | 29 ++- src/BRepTest/BRepTest_ExtremaCommands.cxx | 5 +- 3 files changed, 160 insertions(+), 107 deletions(-) diff --git a/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx b/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx index 13efe953dc..b31ea7a783 100644 --- a/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx +++ b/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx @@ -112,13 +112,24 @@ namespace void BRepExtrema_DistShapeShape::DistanceMapMap (const TopTools_IndexedMapOfShape& theMap1, const TopTools_IndexedMapOfShape& theMap2, const Bnd_SeqOfBox& theLBox1, - const Bnd_SeqOfBox& theLBox2) + const Bnd_SeqOfBox& theLBox2, + const Message_ProgressRange& theRange) { NCollection_Vector aPairList; const Standard_Integer aCount1 = theMap1.Extent(); const Standard_Integer aCount2 = theMap2.Extent(); + + Message_ProgressScope aTwinScope(theRange, NULL, 2); + Message_ProgressRange aBoxRange(aTwinScope.Next()); + Message_ProgressScope aBoxScope(aBoxRange, NULL, aCount1); + for (Standard_Integer anIdx1 = 1; anIdx1 <= aCount1; ++anIdx1) { + aBoxScope.Next(); + if (!aBoxScope.More()) + { + throw StdFail_NotDone(); + } for (Standard_Integer anIdx2 = 1; anIdx2 <= aCount2; ++anIdx2) { const Bnd_Box& aBox1 = theLBox1.Value (anIdx1); @@ -138,10 +149,16 @@ void BRepExtrema_DistShapeShape::DistanceMapMap (const TopTools_IndexedMapOfShap } std::stable_sort(aPairList.begin(), aPairList.end(), BRepExtrema_CheckPair_Comparator); - + Message_ProgressRange aDistRange(aTwinScope.Next()); + Message_ProgressScope aDistScope(aDistRange, NULL, aPairList.Size()); for (NCollection_Vector::Iterator aPairIter (aPairList); aPairIter.More(); aPairIter.Next()) { + aDistScope.Next(); + if (!aDistScope.More()) + { + throw StdFail_NotDone(); + } const BRepExtrema_CheckPair& aPair = aPairIter.Value(); if (aPair.Distance > myDistRef + myEps) { @@ -212,7 +229,8 @@ BRepExtrema_DistShapeShape::BRepExtrema_DistShapeShape() BRepExtrema_DistShapeShape::BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape1, const TopoDS_Shape& Shape2, const Extrema_ExtFlag F, - const Extrema_ExtAlgo A) + const Extrema_ExtAlgo A, + const Message_ProgressRange& theRange) : myDistRef (0.0), myIsDone (Standard_False), myInnerSol (Standard_False), @@ -224,7 +242,7 @@ BRepExtrema_DistShapeShape::BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape { LoadS1(Shape1); LoadS2(Shape2); - Perform(); + Perform(theRange); } //======================================================================= @@ -236,7 +254,8 @@ BRepExtrema_DistShapeShape::BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape const TopoDS_Shape& Shape2, const Standard_Real theDeflection, const Extrema_ExtFlag F, - const Extrema_ExtAlgo A) + const Extrema_ExtAlgo A, + const Message_ProgressRange& theRange) : myDistRef (0.0), myIsDone (Standard_False), myInnerSol (Standard_False), @@ -248,7 +267,7 @@ BRepExtrema_DistShapeShape::BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape { LoadS1(Shape1); LoadS2(Shape2); - Perform(); + Perform(theRange); } //======================================================================= @@ -275,12 +294,46 @@ void BRepExtrema_DistShapeShape::LoadS2 (const TopoDS_Shape& Shape2) Decomposition (Shape2, myMapV2, myMapE2, myMapF2); } +//======================================================================= +//function : SolidTreatment +//purpose : +//======================================================================= +void BRepExtrema_DistShapeShape::SolidTreatment(const TopoDS_Shape& theShape, + const TopTools_IndexedMapOfShape& theMap, + const Message_ProgressRange& theRange) +{ + BRepClass3d_SolidClassifier aClassifier(theShape); + const Standard_Real aTolerance = 0.001; + Message_ProgressScope aScope(theRange, NULL, theMap.Extent()); + for (Standard_Integer i = 1; i < theMap.Extent(); ++i) + { + aScope.Next(); + if (!aScope.More()) + { + throw StdFail_NotDone(); + } + const TopoDS_Vertex& aVertex = TopoDS::Vertex(theMap(i)); + const gp_Pnt& aPnt = BRep_Tool::Pnt(aVertex); + aClassifier.Perform(aPnt, aTolerance); + if (aClassifier.State() == TopAbs_IN) + { + myInnerSol = Standard_True; + myDistRef = 0.; + myIsDone = Standard_True; + BRepExtrema_SolutionElem Sol(0, aPnt, BRepExtrema_IsVertex, aVertex); + mySolutionsShape1.Append(Sol); + mySolutionsShape2.Append(Sol); + break; + } + } +} + //======================================================================= //function : Perform //purpose : //======================================================================= -Standard_Boolean BRepExtrema_DistShapeShape::Perform() +Standard_Boolean BRepExtrema_DistShapeShape::Perform(const Message_ProgressRange& theRange) { myIsDone=Standard_False; myInnerSol=Standard_False; @@ -290,119 +343,95 @@ Standard_Boolean BRepExtrema_DistShapeShape::Perform() if ( myShape1.IsNull() || myShape2.IsNull() ) return Standard_False; - TopoDS_Vertex V; - const Standard_Real tol = 0.001; - // Treatment of solids - const TopAbs_ShapeEnum Type1 = myShape1.ShapeType(); - if ((Type1==TopAbs_SOLID) || (Type1 == TopAbs_COMPSOLID)) + Standard_Boolean anIsSolid1 = (myShape1.ShapeType() == TopAbs_SOLID) || + (myShape1.ShapeType() == TopAbs_COMPSOLID); + Standard_Boolean anIsSolid2 = (myShape2.ShapeType() == TopAbs_SOLID) || + (myShape2.ShapeType() == TopAbs_COMPSOLID); + Standard_Integer aRootStepsNum = 9; // By num of DistanceMapMap calls + aRootStepsNum = anIsSolid1 ? aRootStepsNum+1 : aRootStepsNum; + aRootStepsNum = anIsSolid2 ? aRootStepsNum+1 : aRootStepsNum; + Message_ProgressScope aRootScope(theRange, "SolidTreatment", aRootStepsNum); + try { - BRepClass3d_SolidClassifier Classi(myShape1); - const Standard_Integer nbv2 = myMapV2.Extent(); - Standard_Integer nbv1 = 0; - while ( (nbv1 myEps) - { - DistanceMapMap (myMapF1, myMapF2, myBF1, myBF2); - } - - // Modified by Sergey KHROMOV - Tue Mar 6 11:55:03 2001 Begin - Standard_Integer i = 1; - for (; i <= mySolutionsShape1.Length(); i++) - if (mySolutionsShape1.Value(i).Dist() > myDistRef + myEps) + if (myMapV1.Extent() && myMapV2.Extent()) + { + TopoDS_Vertex V1 = TopoDS::Vertex(myMapV1(1)); + TopoDS_Vertex V2 = TopoDS::Vertex(myMapV2(1)); + myDistRef = DistanceInitiale(V1, V2); + } + else + myDistRef= 1.e30; //szv:!!! + + DistanceMapMap (myMapV1, myMapV2, myBV1, myBV2, aRootScope.Next()); + DistanceMapMap (myMapV1, myMapE2, myBV1, myBE2, aRootScope.Next()); + DistanceMapMap (myMapE1, myMapV2, myBE1, myBV2, aRootScope.Next()); + DistanceMapMap (myMapV1, myMapF2, myBV1, myBF2, aRootScope.Next()); + DistanceMapMap (myMapF1, myMapV2, myBF1, myBV2, aRootScope.Next()); + DistanceMapMap (myMapE1, myMapE2, myBE1, myBE2, aRootScope.Next()); + DistanceMapMap (myMapE1, myMapF2, myBE1, myBF2, aRootScope.Next()); + DistanceMapMap (myMapF1, myMapE2, myBF1, myBE2, aRootScope.Next()); + + if (fabs (myDistRef) > myEps) { - mySolutionsShape1.Remove(i); - mySolutionsShape2.Remove(i); + DistanceMapMap (myMapF1, myMapF2, myBF1, myBF2, aRootScope.Next()); } - // Modified by Sergey KHROMOV - Tue Mar 6 11:55:04 2001 End - myIsDone = ( mySolutionsShape1.Length() > 0 ); + + // Modified by Sergey KHROMOV - Tue Mar 6 11:55:03 2001 Begin + Standard_Integer i = 1; + for (; i <= mySolutionsShape1.Length(); i++) + if (mySolutionsShape1.Value(i).Dist() > myDistRef + myEps) + { + mySolutionsShape1.Remove(i); + mySolutionsShape2.Remove(i); + } + // Modified by Sergey KHROMOV - Tue Mar 6 11:55:04 2001 End + myIsDone = ( mySolutionsShape1.Length() > 0 ); + } + } + catch (StdFail_NotDone) + { + return Standard_False; } + return myIsDone; } diff --git a/src/BRepExtrema/BRepExtrema_DistShapeShape.hxx b/src/BRepExtrema/BRepExtrema_DistShapeShape.hxx index 3812de0f4d..182ea6adfb 100644 --- a/src/BRepExtrema/BRepExtrema_DistShapeShape.hxx +++ b/src/BRepExtrema/BRepExtrema_DistShapeShape.hxx @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -39,9 +40,18 @@ class BRepExtrema_DistShapeShape Standard_EXPORT BRepExtrema_DistShapeShape(); //! computation of the minimum distance (value and pair of points) using default deflection
//! Default value is Precision::Confusion().
- Standard_EXPORT BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape1,const TopoDS_Shape& Shape2,const Extrema_ExtFlag F = Extrema_ExtFlag_MINMAX,const Extrema_ExtAlgo A = Extrema_ExtAlgo_Grad); + Standard_EXPORT BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape1, + const TopoDS_Shape& Shape2, + const Extrema_ExtFlag F = Extrema_ExtFlag_MINMAX, + const Extrema_ExtAlgo A = Extrema_ExtAlgo_Grad, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! create tool and load both shapes into it
- Standard_EXPORT BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape1,const TopoDS_Shape& Shape2,const Standard_Real theDeflection,const Extrema_ExtFlag F = Extrema_ExtFlag_MINMAX,const Extrema_ExtAlgo A = Extrema_ExtAlgo_Grad); + Standard_EXPORT BRepExtrema_DistShapeShape(const TopoDS_Shape& Shape1, + const TopoDS_Shape& Shape2, + const Standard_Real theDeflection, + const Extrema_ExtFlag F = Extrema_ExtFlag_MINMAX, + const Extrema_ExtAlgo A = Extrema_ExtAlgo_Grad, + const Message_ProgressRange& theRange = Message_ProgressRange()); void SetDeflection(const Standard_Real theDeflection) { @@ -56,7 +66,8 @@ class BRepExtrema_DistShapeShape //! to specify a maximum deviation of extreme distances
//! from the minimum one.
//! Returns IsDone status.
- Standard_EXPORT Standard_Boolean Perform(); + //! theProgress - progress indicator of algorithm + Standard_EXPORT Standard_Boolean Perform(const Message_ProgressRange& theRange = Message_ProgressRange()); //! True if the minimum distance is found.
Standard_Boolean IsDone() const { @@ -137,7 +148,17 @@ class BRepExtrema_DistShapeShape private: //! computes the minimum distance between two maps of shapes (Face,Edge,Vertex)
- Standard_EXPORT void DistanceMapMap(const TopTools_IndexedMapOfShape& Map1,const TopTools_IndexedMapOfShape& Map2,const Bnd_SeqOfBox& LBox1,const Bnd_SeqOfBox& LBox2); + Standard_EXPORT void DistanceMapMap(const TopTools_IndexedMapOfShape& Map1, + const TopTools_IndexedMapOfShape& Map2, + const Bnd_SeqOfBox& LBox1, + const Bnd_SeqOfBox& LBox2, + const Message_ProgressRange& theRange); + + void SolidTreatment(const TopoDS_Shape& theShape, + const TopTools_IndexedMapOfShape& theMap, + const Message_ProgressRange& theRange); + +private: Standard_Real myDistRef; Standard_Boolean myIsDone; diff --git a/src/BRepTest/BRepTest_ExtremaCommands.cxx b/src/BRepTest/BRepTest_ExtremaCommands.cxx index 0ca2fa983b..0fa44321d1 100644 --- a/src/BRepTest/BRepTest_ExtremaCommands.cxx +++ b/src/BRepTest/BRepTest_ExtremaCommands.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,9 @@ static Standard_Integer distmini(Draw_Interpretor& di, Standard_Integer n, const if (n == 5) aDeflection = Draw::Atof(a[4]); - BRepExtrema_DistShapeShape dst(S1 ,S2, aDeflection); + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1); + BRepExtrema_DistShapeShape dst(S1 ,S2, aDeflection, Extrema_ExtFlag_MINMAX, + Extrema_ExtAlgo_Grad, aProgress->Start()); if (dst.IsDone()) { -- 2.39.5