0025718: Unstable work of tests in bug5805 series
authormsv <msv@opencascade.com>
Thu, 19 Mar 2015 13:08:06 +0000 (16:08 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 19 Mar 2015 14:08:21 +0000 (17:08 +0300)
Force stable work of the algorithm BRepAlgo_Loop by replacing DataMap collections with List and/or IndexedDataMap in order to provide iterations independent on the memory addresses.

Avoid uninitialized fields in default constructor of Extrema_POnSurf.

Mark bad tests as known bad.

src/BRepAlgo/BRepAlgo_Loop.cdl
src/BRepAlgo/BRepAlgo_Loop.cxx
src/Extrema/Extrema_POnSurf.lxx
tests/offset/faces_type_a/A3
tests/offset/faces_type_a/A4
tests/offset/faces_type_a/A9

index 254a8fb..1ebe1c3 100644 (file)
@@ -94,10 +94,11 @@ fields
 
     myFace       : Face                      from TopoDS;
     myConstEdges : ListOfShape               from TopTools;
+    myEdges      : ListOfShape               from TopTools;
     myVerOnEdges : DataMapOfShapeListOfShape from TopTools;
     myNewWires   : ListOfShape               from TopTools;
     myNewFaces   : ListOfShape               from TopTools;
-    myNewEdges   : DataMapOfShapeListOfShape from TopTools; 
+    myCutEdges   : DataMapOfShapeListOfShape from TopTools;
      
     myVerticesForSubstitute  : DataMapOfShapeShape from TopTools;
     
index e8cc8c6..521758b 100644 (file)
@@ -28,6 +28,7 @@
 #include <TopTools_SequenceOfShape.hxx>
 #include <TopTools_MapOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
 
 #include <TopoDS.hxx>
@@ -44,6 +45,7 @@
 
 #ifdef DRAW
 #include <DBRep.hxx>
+#pragma comment(lib,"TKDraw")
 #endif
 #ifdef OCCT_DEBUG_ALGO
 Standard_Boolean AffichLoop  = Standard_False;
@@ -70,10 +72,11 @@ BRepAlgo_Loop::BRepAlgo_Loop()
 void BRepAlgo_Loop::Init(const TopoDS_Face& F)
 {
   myConstEdges.Clear(); 
+  myEdges     .Clear();
   myVerOnEdges.Clear();
   myNewWires  .Clear();
   myNewFaces  .Clear();
-  myNewEdges  .Clear();
+  myCutEdges  .Clear();
   myFace = F;
 }
 
@@ -121,6 +124,7 @@ static void Bubble(const TopoDS_Edge&        E,
 void BRepAlgo_Loop::AddEdge (TopoDS_Edge&                E, 
                             const TopTools_ListOfShape& LV)
 {
+  myEdges.Append(E);
   myVerOnEdges.Bind(E,LV);
 }
 
@@ -200,19 +204,41 @@ static TopoDS_Vertex  UpdateClosedEdge(const TopoDS_Edge&         E,
   return VRes;
 }
 
+//=======================================================================
+//function : RemoveFromMVE
+//purpose  : 
+//=======================================================================
 
+static void RemoveFromMVE(TopTools_IndexedDataMapOfShapeListOfShape& MVE,
+                          const TopoDS_Shape& theVertex)
+{
+  // remove from the indexed data map by substituting last item instead of removed
+  Standard_Integer iV = MVE.FindIndex(theVertex);
+  if (iV > 0)
+  {
+    Standard_Integer iLast = MVE.Extent();
+    if (iV == iLast)
+      MVE.RemoveLast();
+    else
+    {
+      TopoDS_Shape aVertex = MVE.FindKey(iLast);
+      TopTools_ListOfShape anEdges = MVE(iLast);
+      MVE.RemoveLast();
+      MVE.Substitute(iV, aVertex, anEdges);
+    }
+  }
+}
 
 //=======================================================================
 //function : RemovePendingEdges
 //purpose  : 
 //=======================================================================
 
-static void RemovePendingEdges(TopTools_DataMapOfShapeListOfShape& MVE)
+static void RemovePendingEdges(TopTools_IndexedDataMapOfShapeListOfShape& MVE)
 {
   //--------------------------------
   // Remove hanging edges.
   //--------------------------------
-  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit;
   TopTools_ListOfShape                     ToRemove;
   TopTools_ListIteratorOfListOfShape       itl;
   Standard_Boolean                         YaSupress = Standard_True;
@@ -223,17 +249,18 @@ static void RemovePendingEdges(TopTools_DataMapOfShapeListOfShape& MVE)
     TopTools_ListOfShape VToRemove;
     TopTools_MapOfShape  EToRemove;
 
-    for (Mapit.Initialize(MVE); Mapit.More(); Mapit.Next()) {
-
-      if (Mapit.Value().IsEmpty()) {
-       VToRemove.Append(Mapit.Key());
+    for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++) {
+      const TopoDS_Shape& aVertex = MVE.FindKey(iV);
+      const TopTools_ListOfShape& anEdges = MVE(iV);
+      if (anEdges.IsEmpty()) {
+       VToRemove.Append(aVertex);
       }
-      if (Mapit.Value().Extent() == 1) {
-       const TopoDS_Edge& E = TopoDS::Edge(Mapit.Value().First());
+      if (anEdges.Extent() == 1) {
+       const TopoDS_Edge& E = TopoDS::Edge(anEdges.First());
        TopExp::Vertices(E,V1,V2) ;
        if (!V1.IsSame(V2)) {
-         VToRemove.Append(Mapit.Key());
-         EToRemove.Add(Mapit.Value().First());
+         VToRemove.Append(aVertex);
+         EToRemove.Add(anEdges.First());
        }
       }
     }
@@ -241,11 +268,11 @@ static void RemovePendingEdges(TopTools_DataMapOfShapeListOfShape& MVE)
     if (!VToRemove.IsEmpty()) {
       YaSupress = Standard_True;
       for (itl.Initialize(VToRemove); itl.More(); itl.Next()) {
-       MVE.UnBind(itl.Value());
+        RemoveFromMVE(MVE, itl.Value());
       }
       if (!EToRemove.IsEmpty()) {
-       for (Mapit.Initialize(MVE); Mapit.More(); Mapit.Next()) {
-         TopTools_ListOfShape& LE = MVE.ChangeFind(Mapit.Key());
+       for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++) {
+          TopTools_ListOfShape& LE = MVE.ChangeFromIndex(iV);
          itl.Initialize(LE);
          while (itl.More()) {
            if (EToRemove.Contains(itl.Value())) {
@@ -375,7 +402,7 @@ static Standard_Boolean  SelectEdge(const TopoDS_Face&    F,
   return Standard_True;
 }
 //=======================================================================
-//function : Store
+//function : PurgeNewEdges
 //purpose  : 
 //=======================================================================
 
@@ -400,13 +427,13 @@ static void  PurgeNewEdges(TopTools_DataMapOfShapeListOfShape& NewEdges,
 }
 
 //=======================================================================
-//function : Store
+//function : StoreInMVE
 //purpose  : 
 //=======================================================================
 
 static void StoreInMVE (const TopoDS_Face&                  F,
                        TopoDS_Edge&                  E,
-                       TopTools_DataMapOfShapeListOfShape& MVE,
+                       TopTools_IndexedDataMapOfShapeListOfShape& MVE,
                        Standard_Boolean&                   YaCouture,
                        TopTools_DataMapOfShapeShape& VerticesForSubstitute )
 {      
@@ -416,11 +443,10 @@ static void StoreInMVE (const TopoDS_Face&                  F,
   Standard_Real Tol = 0.001; //5.e-05; //5.e-07;
 //  gp_Pnt P1, P2, P;
   gp_Pnt P1, P;
-  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit;
   BRep_Builder BB;
-  for (Mapit.Initialize( MVE ); Mapit.More(); Mapit.Next())
+  for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++)
     {
-      V = TopoDS::Vertex( Mapit.Key() );
+      V = TopoDS::Vertex(MVE.FindKey(iV));
       P = BRep_Tool::Pnt( V );
       TopTools_ListOfShape VList;
       TopoDS_Iterator VerExp( E );
@@ -469,22 +495,22 @@ static void StoreInMVE (const TopoDS_Face&                  F,
 
   TopExp::Vertices(E,V1,V2);
   if( V1.IsNull() && V2.IsNull() ){ YaCouture = Standard_False; return; }
-  if (!MVE.IsBound(V1)) {
-    MVE.Bind(V1,Empty);
+  if (!MVE.Contains(V1)) {
+    MVE.Add(V1,Empty);
   }
-  MVE(V1).Append(E);
+  MVE.ChangeFromKey(V1).Append(E);
   if (!V1.IsSame(V2)) {
-     if (!MVE.IsBound(V2)) {
-      MVE.Bind(V2,Empty);
-    }
-    MVE(V2).Append(E);
+     if (!MVE.Contains(V2)) {
+       MVE.Add(V2,Empty);
+     }
+     MVE.ChangeFromKey(V2).Append(E);
   }
   TopLoc_Location L ;
   Handle(Geom_Surface) S = BRep_Tool::Surface(F,L);
   if (BRep_Tool::IsClosed(E,S,L)) {
-    MVE(V2).Append(E.Reversed());
+    MVE.ChangeFromKey(V2).Append(E.Reversed());
     if (!V1.IsSame(V2)) {
-      MVE(V1).Append(E.Reversed());
+      MVE.ChangeFromKey(V1).Append(E.Reversed());
     }
     YaCouture = Standard_True;
   }
@@ -497,8 +523,7 @@ static void StoreInMVE (const TopoDS_Face&                  F,
 
 void BRepAlgo_Loop::Perform()
 {
-  TopTools_DataMapIteratorOfDataMapOfShapeListOfShape Mapit;  
-  TopTools_ListIteratorOfListOfShape                  itl;
+  TopTools_ListIteratorOfListOfShape                  itl, itl1;
   TopoDS_Vertex                                       V1,V2;
   Standard_Boolean                                    YaCouture = Standard_False;
 
@@ -511,8 +536,8 @@ void BRepAlgo_Loop::Perform()
     DBRep::Set(name,myFace);
     Standard_Integer NbEdges = 1;
 #endif
-    for (Mapit.Initialize(myVerOnEdges); Mapit.More(); Mapit.Next()) { 
-      const TopoDS_Edge& E = TopoDS::Edge(Mapit.Key());
+    for (itl.Initialize(myEdges); itl.More(); itl.Next()) { 
+      const TopoDS_Edge& E = TopoDS::Edge(itl.Value());
 #ifdef DRAW
       sprintf(name,"EEE_%d_%d",NbLoops,NbEdges++);
       DBRep::Set(name,E);
@@ -530,23 +555,34 @@ void BRepAlgo_Loop::Perform()
   //------------------------------------------------
   // Cut edges
   //------------------------------------------------
-  for (Mapit.Initialize(myVerOnEdges); Mapit.More(); Mapit.Next()) {
+  for (itl.Initialize(myEdges); itl.More(); itl.Next())
+  {
+    const TopoDS_Edge& anEdge = TopoDS::Edge(itl.Value());
     TopTools_ListOfShape LCE;
-
-    CutEdge (TopoDS::Edge(Mapit.Key()),Mapit.Value(), LCE);
-
-    myNewEdges.Bind(Mapit.Key(),LCE);
+    const TopTools_ListOfShape* pVertices = 
+      static_cast<TopTools_ListOfShape*>(myVerOnEdges.Find1(anEdge));
+    if (pVertices)
+    {
+      CutEdge (anEdge, *pVertices, LCE);
+      myCutEdges.Bind(anEdge, LCE);
+    }
   }
   //-----------------------------------
   // Construction map vertex => edges
   //-----------------------------------
-  TopTools_DataMapOfShapeListOfShape MVE;
+  TopTools_IndexedDataMapOfShapeListOfShape MVE;
 
   // add cut edges.
-  for (Mapit.Initialize(myNewEdges); Mapit.More(); Mapit.Next()) {
-    for (itl.Initialize(myNewEdges(Mapit.Key())); itl.More(); itl.Next()) {
-      TopoDS_Edge& E = TopoDS::Edge(itl.Value());
-      StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute);
+  for (itl.Initialize(myEdges); itl.More(); itl.Next())
+  {
+    const TopTools_ListOfShape* pLCE = 
+      static_cast<TopTools_ListOfShape*>(myCutEdges.Find1(itl.Value()));
+    if (pLCE)
+    {
+      for (itl1.Initialize(*pLCE); itl1.More(); itl1.Next()) {
+        TopoDS_Edge& E = TopoDS::Edge(itl1.Value());
+        StoreInMVE(myFace,E,MVE,YaCouture,myVerticesForSubstitute);
+      }
     }
   }
   
@@ -565,8 +601,8 @@ void BRepAlgo_Loop::Perform()
     cout <<"NewLoop"<<endl;
     Standard_Integer NbEdges = 1;
     TopTools_MapOfShape Done;
-    for (Mapit.Initialize(MVE); Mapit.More();Mapit.Next()) {
-      for (itl.Initialize(Mapit.Value()); itl.More(); itl.Next()) {
+    for (Standard_Integer iV = 1; iV <= MVE.Extent(); iV++) {
+      for (itl.Initialize(MVE(iV)); itl.More(); itl.Next()) {
         TopoDS_Edge& E = TopoDS::Edge(itl.Value());
         if (Done.Add(E)) {
           sprintf(name,"EEC_%d_%d",NbLoops,NbEdges++);
@@ -588,29 +624,29 @@ void BRepAlgo_Loop::Perform()
 
   TopTools_MapOfShape UsedEdges;
 
-  while (!MVE.IsEmpty()) {
+  while (MVE.Extent() > 0) {
     B.MakeWire(NW);
     //--------------------------------
     // Removal of hanging edges.
     //--------------------------------
     RemovePendingEdges(MVE);
 
-    if (MVE.IsEmpty()) break; 
+    if (MVE.Extent() == 0) break; 
     //--------------------------------
     // Start edge.
     //--------------------------------
-    Mapit.Initialize(MVE);
-    EF = CE = TopoDS::Edge(Mapit.Value().First());
+    EF = CE = TopoDS::Edge(MVE(1).First());
     TopExp::Vertices(CE,V1,V2);
     //--------------------------------
     // VF vertex start of new wire
     //--------------------------------
     if (CE.Orientation() == TopAbs_FORWARD) { CV = VF = V1;}
     else                                    { CV = VF = V2;}
-    if (!MVE.IsBound(CV)) continue;
-    for ( itl.Initialize(MVE(CV)); itl.More(); itl.Next()) {
+    if (!MVE.Contains(CV)) continue;
+    TopTools_ListOfShape& aListEdges = MVE.ChangeFromKey(CV);
+    for ( itl.Initialize(aListEdges); itl.More(); itl.Next()) {
       if (itl.Value().IsEqual(CE)) {
-       MVE(CV).Remove(itl);
+       aListEdges.Remove(itl);
        break;
       }
     }
@@ -626,14 +662,15 @@ void BRepAlgo_Loop::Perform()
       B.Add (NW,CE);
       UsedEdges.Add(CE);
 
-      if (!MVE.IsBound(CV) || MVE(CV).IsEmpty()) {
+      if (!MVE.Contains(CV) || MVE.FindFromKey(CV).IsEmpty()) {
         End = Standard_True;
       }
       else {
-        End = !SelectEdge(myFace,CE,CV,NE,MVE(CV));
+        End = !SelectEdge(myFace,CE,CV,NE,MVE.ChangeFromKey(CV));
         if (!End) {
           CE = NE;
-          if (MVE(CV).IsEmpty()) MVE.UnBind(CV);
+          if (MVE.FindFromKey(CV).IsEmpty())
+            RemoveFromMVE(MVE, CV);
         }
       }
     }
@@ -677,7 +714,7 @@ void BRepAlgo_Loop::Perform()
 #endif
   }
   
-  PurgeNewEdges(myNewEdges,UsedEdges);
+  PurgeNewEdges(myCutEdges,UsedEdges);
 }
 
 //=======================================================================
@@ -891,7 +928,7 @@ void  BRepAlgo_Loop::WiresToFaces()
 
 const TopTools_ListOfShape&  BRepAlgo_Loop::NewEdges(const TopoDS_Edge& E) const 
 {
-  return myNewEdges(E);
+  return myCutEdges(E);
 }
 
 //=======================================================================
index 17c6e63..30bb2b7 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-inline Extrema_POnSurf::Extrema_POnSurf () {}
+#include <Precision.hxx>
+
+inline Extrema_POnSurf::Extrema_POnSurf ()
+: myU (Precision::Infinite()),
+  myV (Precision::Infinite()),
+  myP (gp_Pnt(Precision::Infinite(),Precision::Infinite(),Precision::Infinite()))
+{
+}
 
 inline Extrema_POnSurf::Extrema_POnSurf (const Standard_Real U,
                                          const Standard_Real V,
index f633084..210e597 100644 (file)
@@ -1,4 +1,6 @@
 #old file ofcb19
+puts "TODO CR25925 ALL: ERROR. offsetperform operation not done."
+puts "TODO CR25925 ALL: TEST INCOMPLETE"
 
 restore [locate_data_file CHE_bb17.rle] s
 OFFSETSHAPE -0.04 {s_4 s_9 s_3 s_5 s_2 s_7 s_11} $calcul $type
index 6b30813..fa94080 100644 (file)
@@ -1,4 +1,6 @@
 #old file ofcb23
+puts "TODO CR25925 ALL: ERROR. offsetperform operation not done."
+puts "TODO CR25925 ALL: TEST INCOMPLETE"
 
 restore [locate_data_file CHE_cc3.rle] s
 OFFSETSHAPE -0.01 {s_6} $calcul $type
index a3e59a9..906605f 100644 (file)
@@ -1,4 +1,6 @@
 #old file ofsb20
+puts "TODO CR25925 ALL: ERROR. offsetperform operation not done."
+puts "TODO CR25925 ALL: TEST INCOMPLETE"
 
 restore [locate_data_file CHE_bb20.rle] s
 OFFSETSHAPE -0.1 {s_4 s_7} $calcul $type