0022924: We need more stable work of ShapeAnalysis_FreeBounds::ConnectEdgesToWires()
authorGKA <>
Fri, 17 Feb 2012 12:13:40 +0000 (12:13 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:32:50 +0000 (19:32 +0400)
src/SWDRAW/SWDRAW_ShapeFix.cxx
src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.cxx
src/ShapeAnalysis/ShapeAnalysis_BoxBndTree.hxx

index 6c8ea3e..33fdd8d 100755 (executable)
 #include <TopAbs_State.hxx>
 
 #include <Draw_ProgressIndicator.hxx>
+#include <ShapeAnalysis_FreeBounds.hxx>
+#include <TopTools_HSequenceOfShape.hxx>
+#include <BRep_Builder.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
 
 #ifdef AIX
 #include <strings.h>
@@ -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 - "<<i<<" : "<<"\n";
+    
+    TopExp_Explorer aExp1(aW, TopAbs_EDGE);
+    for( ; aExp1.More(); aExp1.Next())
+    {
+      if(shared)
+      {
+        Standard_Integer ind = aMapEdges.FindIndex(aExp1.Current());
+        di<<ind<<" ";
+      }
+       else
+      {
+        TopoDS_Vertex aV1, aV2;
+        TopExp::Vertices(TopoDS::Edge(aExp1.Current()), aV1,aV2);
+        gp_Pnt aP = BRep_Tool::Pnt(aV1);
+        di<<aP.X()<<" "<<aP.Y()<<" "<<aP.Z()<<"\n";
+      }
+    }
+   
+    di<<"\n";
+    aB.Add( aComp,aSeqWires->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);
+  
 }
 
index 1a8f4cf..a88ff8e 100755 (executable)
@@ -14,6 +14,7 @@
 #include <gp_Pnt.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <BRep_Tool.hxx>
+#include <Precision.hxx>
 
 //=======================================================================
 //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)
-      myStop = Standard_True;
+    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;
     
   }  
index ebbcebc..d2f3241 100755 (executable)
@@ -16,6 +16,7 @@
 #include <ShapeExtend_Status.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <TColStd_MapOfInteger.hxx>
+#include <TColStd_Array1OfInteger.hxx>
 
 typedef NCollection_UBTree <Standard_Integer , Bnd_Box> 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