diff --git a/src/SWDRAW/SWDRAW_ShapeFix.cxx b/src/SWDRAW/SWDRAW_ShapeFix.cxx index 6c8ea3e11d..33fdd8d06d 100755 --- a/src/SWDRAW/SWDRAW_ShapeFix.cxx +++ b/src/SWDRAW/SWDRAW_ShapeFix.cxx @@ -48,6 +48,11 @@ #include #include +#include +#include +#include +#include +#include #ifdef AIX #include @@ -672,6 +677,69 @@ static Standard_Integer checkfclass2d(Draw_Interpretor& di, Standard_Integer n, return 0; } +static Standard_Integer connectedges(Draw_Interpretor& di, Standard_Integer n, const char** a) +{ + if( n < 3) { + di<<"Invalid number of arguments. Should be : result shape [toler shared]"<<"\n"; + return 1; + } + TopoDS_Shape aSh1 = DBRep::Get(a[2]); + if(aSh1.IsNull()) { + di<<"Shape is null"<<"\n"; + return 1; + } + Standard_Real aTol = Precision::Confusion(); + if( n > 3) + aTol = atof(a[3]); + + Standard_Boolean shared = Standard_True; + if( n > 4) + shared = (atoi(a[4]) == 1); + TopExp_Explorer aExpE(aSh1,TopAbs_EDGE); + Handle(TopTools_HSequenceOfShape) aSeqEdges = new TopTools_HSequenceOfShape; + Handle(TopTools_HSequenceOfShape) aSeqWires = new TopTools_HSequenceOfShape; + TopTools_IndexedMapOfShape aMapEdges; + for( ; aExpE.More(); aExpE.Next()) + { + aSeqEdges->Append(aExpE.Current()); + aMapEdges.Add(aExpE.Current()); + } + + ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,aTol,shared,aSeqWires ); + TopoDS_Compound aComp; + BRep_Builder aB; + aB.MakeCompound(aComp); + Standard_Integer i = 1; + for( ; i <= aSeqWires->Length() ; i++) + { + TopoDS_Shape aW = aSeqWires->Value(i); + di<<"Wire - "<Value(i)); + } + DBRep::Set(a[1],aComp); + return 0; + +} + //======================================================================= //function : InitCommands //purpose : @@ -706,5 +774,8 @@ static Standard_Integer checkfclass2d(Draw_Interpretor& di, Standard_Integer n, __FILE__,checkoverlapedges,g); theCommands.Add ("checkfclass2d","face ucoord vcoord", __FILE__,checkfclass2d,g); + theCommands.Add ("connectedges","res shape [toler shared]", + __FILE__,connectedges,g); + } diff --git a/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.cxx b/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.cxx index 1a8f4cf752..a88ff8e6ab 100755 --- a/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.cxx +++ b/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.cxx @@ -14,6 +14,7 @@ #include #include #include +#include //======================================================================= //function : Reject @@ -43,7 +44,11 @@ Standard_Boolean ShapeAnalysis_BoxBndTreeSelector:: Standard_Boolean IsAccept = Standard_False; if (myList.Contains(theObj)) return Standard_False; - + enum + { + First = 1, + Last = 2 + }; TopoDS_Wire W = TopoDS::Wire (mySeq->Value (theObj)); TopoDS_Vertex V1,V2; @@ -52,21 +57,25 @@ Standard_Boolean ShapeAnalysis_BoxBndTreeSelector:: if (myLVertex.IsSame(V1)){ myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE1); IsAccept = Standard_True; + myArrIndices(Last) = theObj; } else { if (myLVertex.IsSame(V2)){ myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE2); IsAccept = Standard_True; + myArrIndices(Last) = theObj; } else { if (myFVertex.IsSame(V2)){ myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE3); IsAccept = Standard_True; + myArrIndices(First) = theObj; } else { if (myFVertex.IsSame(V1)){ myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE4); IsAccept = Standard_True; + myArrIndices(First) = theObj; } else myStatus = ShapeExtend::EncodeStatus (ShapeExtend_FAIL2); @@ -77,7 +86,8 @@ Standard_Boolean ShapeAnalysis_BoxBndTreeSelector:: if (IsAccept){ SetNb(theObj); - myStop = Standard_True; + if(myArrIndices(Last)) + myStop = Standard_True; return Standard_True; } else myStop = Standard_False; @@ -102,32 +112,39 @@ Standard_Boolean ShapeAnalysis_BoxBndTreeSelector:: if (min3d > myMin3d) return Standard_False; + Standard_Integer minInd = (dm1 > dm2 ? First : Last ); + Standard_Integer maxInd = (dm1 > dm2 ? Last : First); + myArrIndices(minInd) = theObj; + if((min3d - myMin3d) > RealSmall()) + myArrIndices(maxInd) = 0; + myMin3d = min3d; if (min3d > myTol) { myStatus = ShapeExtend::EncodeStatus (ShapeExtend_FAIL2); return Standard_False; } - - SetNb(theObj); - if (min3d == 0) + Standard_Integer anObj = (myArrIndices(Last) ? myArrIndices(Last) : myArrIndices(First)); + SetNb(anObj); + + if (min3d == 0 && minInd == Last) myStop = Standard_True; - + if (dm1 > dm2) { dm1 = dm2; result = res2 + 2; } - - - switch (result) { + if(anObj == theObj) + { + switch (result) { case 0: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE1); break; case 1: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE2); break; case 2: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE3); break; case 3: myStatus = ShapeExtend::EncodeStatus (ShapeExtend_DONE4); break; } - + } return Standard_True; } diff --git a/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.hxx b/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.hxx index ebbcebc89f..d2f324149c 100755 --- a/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.hxx +++ b/src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.hxx @@ -16,6 +16,7 @@ #include #include #include +#include typedef NCollection_UBTree ShapeAnalysis_BoxBndTree; @@ -26,12 +27,18 @@ class ShapeAnalysis_BoxBndTreeSelector ShapeAnalysis_BoxBndTreeSelector (Handle (TopTools_HArray1OfShape) theSeq, Standard_Boolean theShared) - : mySeq(theSeq), myShared(theShared), myNb(0), myTol(1e-7), myMin3d(1e-7), - myStatus(ShapeExtend::EncodeStatus (ShapeExtend_OK)){} + : mySeq(theSeq), myShared(theShared), myNb(0), myTol(1e-7), myMin3d(1e-7),myArrIndices(1,2), + myStatus(ShapeExtend::EncodeStatus (ShapeExtend_OK)) + { + myArrIndices.Init(0); + } void DefineBoxes (const Bnd_Box& theFBox, const Bnd_Box& theLBox) { myFBox = theFBox; - myLBox = theLBox; } + myLBox = theLBox; + myArrIndices.Init(0); + + } void DefineVertexes (TopoDS_Vertex theVf, TopoDS_Vertex theVl) { myFVertex = theVf; @@ -87,6 +94,7 @@ class ShapeAnalysis_BoxBndTreeSelector TColStd_MapOfInteger myList; Standard_Real myTol; Standard_Real myMin3d; + TColStd_Array1OfInteger myArrIndices; }; #endif