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<BRepExtrema_CheckPair> 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);
}
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<BRepExtrema_CheckPair>::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)
{
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),
{
LoadS1(Shape1);
LoadS2(Shape2);
- Perform();
+ Perform(theRange);
}
//=======================================================================
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),
{
LoadS1(Shape1);
LoadS2(Shape2);
- Perform();
+ Perform(theRange);
}
//=======================================================================
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;
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<nbv2) && (!myInnerSol) )
+ if (anIsSolid1)
{
- nbv1++;
- V = TopoDS::Vertex(myMapV2(nbv1));
- const gp_Pnt &P = BRep_Tool::Pnt(V);
- Classi.Perform(P,tol);
- if (Classi.State()==TopAbs_IN)
- {
- myInnerSol = Standard_True;
- myDistRef = 0.;
- myIsDone = Standard_True;
- BRepExtrema_SolutionElem Sol(0,P,BRepExtrema_IsVertex,V);
- mySolutionsShape1.Append(Sol);
- mySolutionsShape2.Append(Sol);
- }
+ SolidTreatment(myShape1, myMapV2, aRootScope.Next());
}
- }
- const TopAbs_ShapeEnum Type2 = myShape2.ShapeType();
- if (((Type2==TopAbs_SOLID) || (Type2==TopAbs_COMPSOLID)) && (!myInnerSol))
- {
- BRepClass3d_SolidClassifier Classi(myShape2);
- const Standard_Integer nbv1 = myMapV1.Extent();
- Standard_Integer nbv2 = 0;
- while ( (nbv2<nbv1) && (!myInnerSol) )
+ if (anIsSolid2 && (!myInnerSol))
{
- nbv2++;
- V = TopoDS::Vertex(myMapV1(nbv2));
- const gp_Pnt &P = BRep_Tool::Pnt(V);
- Classi.Perform(P,tol);
- if (Classi.State()==TopAbs_IN) {
- myInnerSol = Standard_True;
- myDistRef = 0;
- myIsDone = Standard_True;
- BRepExtrema_SolutionElem Sol (0,P,BRepExtrema_IsVertex,V);
- mySolutionsShape1.Append(Sol);
- mySolutionsShape2.Append(Sol);
- }
+ SolidTreatment(myShape2, myMapV1, aRootScope.Next());
}
- }
- if (!myInnerSol)
- {
- if (!myIsInitS1) // rebuild cached data for 1st shape
+ if (!myInnerSol)
{
- myBV1.Clear();
- myBE1.Clear();
- myBF1.Clear();
+ if (!myIsInitS1) // rebuild cached data for 1st shape
+ {
+ myBV1.Clear();
+ myBE1.Clear();
+ myBF1.Clear();
- BoxCalculation (myMapV1, myBV1);
- BoxCalculation (myMapE1, myBE1);
- BoxCalculation (myMapF1, myBF1);
+ BoxCalculation (myMapV1, myBV1);
+ BoxCalculation (myMapE1, myBE1);
+ BoxCalculation (myMapF1, myBF1);
- myIsInitS1 = Standard_True;
- }
+ myIsInitS1 = Standard_True;
+ }
- if (!myIsInitS2) // rebuild cached data for 2nd shape
- {
- myBV2.Clear();
- myBE2.Clear();
- myBF2.Clear();
+ if (!myIsInitS2) // rebuild cached data for 2nd shape
+ {
+ myBV2.Clear();
+ myBE2.Clear();
+ myBF2.Clear();
- BoxCalculation (myMapV2, myBV2);
- BoxCalculation (myMapE2, myBE2);
- BoxCalculation (myMapF2, myBF2);
+ BoxCalculation (myMapV2, myBV2);
+ BoxCalculation (myMapE2, myBE2);
+ BoxCalculation (myMapF2, myBF2);
- myIsInitS2 = Standard_True;
- }
+ myIsInitS2 = Standard_True;
+ }
- 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);
- DistanceMapMap (myMapV1, myMapE2, myBV1, myBE2);
- DistanceMapMap (myMapE1, myMapV2, myBE1, myBV2);
- DistanceMapMap (myMapV1, myMapF2, myBV1, myBF2);
- DistanceMapMap (myMapF1, myMapV2, myBF1, myBV2);
- DistanceMapMap (myMapE1, myMapE2, myBE1, myBE2);
- DistanceMapMap (myMapE1, myMapF2, myBE1, myBF2);
- DistanceMapMap (myMapF1, myMapE2, myBF1, myBE2);
-
- if (fabs (myDistRef) > 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;
}
#include <Extrema_ExtAlgo.hxx>
#include <Extrema_ExtFlag.hxx>
#include <gp_Pnt.hxx>
+#include <Message_ProgressRange.hxx>
#include <TopoDS_Shape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <Standard_OStream.hxx>
Standard_EXPORT BRepExtrema_DistShapeShape();
//! computation of the minimum distance (value and pair of points) using default deflection <br>
//! Default value is Precision::Confusion(). <br>
- 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 <br>
- 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)
{
//! to specify a maximum deviation of extreme distances <br>
//! from the minimum one. <br>
//! Returns IsDone status. <br>
- 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. <br>
Standard_Boolean IsDone() const
{
private:
//! computes the minimum distance between two maps of shapes (Face,Edge,Vertex) <br>
- 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;