]> OCCT Git - occt-copy.git/commitdiff
0026701: BOPAlgo_Builder::Perform crash.
authorisn <isn@opencascade.com>
Tue, 22 Sep 2015 19:10:56 +0000 (22:10 +0300)
committerabv <abv@opencascade.com>
Wed, 23 Sep 2015 04:42:16 +0000 (07:42 +0300)
Data race eliminated (PCurves are stored in edges after paralleled calculation)

Add comments and make minor cosmetic changes.

src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx
src/BOPTools/BOPTools_AlgoTools2D.cdl
src/BOPTools/BOPTools_AlgoTools2D.cxx

index 6a98461550f155a4ec3546bfd99d5fc4cb6bd954..29364f468042cd9c69c76bf190b19f52d25a888b 100644 (file)
@@ -304,13 +304,28 @@ class BOPAlgo_BPC {
     myE=aE;
   }
   //
+  const TopoDS_Edge& GetEdge() const {
+    return myE;
+  }
+  const TopoDS_Face& GetFace() const {
+    return myF;
+  }
+  const Handle_Geom2d_Curve& GetCurve2d() const {
+    return myCurve;
+  }
+  Standard_Boolean IsToUpdate() const {
+    return myToUpdate;
+  }
+  //
   void Perform() {
-    BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane (myE, myF);
+    BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane (myE, myF, myCurve, myToUpdate);
   };
   //
  protected:
   TopoDS_Edge myE;
   TopoDS_Face myF;
+  Handle_Geom2d_Curve myCurve;
+  Standard_Boolean myToUpdate;
 };
 //=======================================================================
 typedef BOPCol_NCVector
@@ -748,6 +763,7 @@ void BOPAlgo_PaveFiller::Prepare()
     return;
   }
   //
+  // Build pcurves of edges on planes; first collect pairs edge-face.
   BOPAlgo_VectorOfBPC aVBPC;
   //
   for (i = 1; i <= aNbF; ++i) {
@@ -764,6 +780,17 @@ void BOPAlgo_PaveFiller::Prepare()
   //======================================================
   BOPAlgo_BPCCnt::Perform(myRunParallel, aVBPC);
   //======================================================
+
+  // pcurves are built, and now update edges
+  BRep_Builder aBB;
+  TopoDS_Edge E;
+  for (i = 0; i < aVBPC.Extent(); i++) {
+    const BOPAlgo_BPC& aBPC=aVBPC(i);
+    if (aBPC.IsToUpdate()) {
+      Standard_Real aTolE = BRep_Tool::Tolerance(aBPC.GetEdge());
+      aBB.UpdateEdge(aBPC.GetEdge(), aBPC.GetCurve2d(), aBPC.GetFace(), aTolE);
+    }
+  }
 }
 //=======================================================================
 //function : IsBasedOnPlane
index b7b3c46c330aba5e3942678e28d5036a3af2b999..3b5c4a4fcdf7ac9cb09f530226eef688c00ba61b 100644 (file)
@@ -158,6 +158,12 @@ is
               theE : Edge from TopoDS; 
               theF : Face from TopoDS); 
              
+    BuildPCurveForEdgeOnPlane(myclass; 
+              theE : Edge from TopoDS; 
+              theF : Face from TopoDS; 
+              theC2D: out Curve from Geom2d;
+              bToUpdate: out Boolean);
+
     BuildPCurveForEdgesOnPlane(myclass; 
               theLE : ListOfShape from BOPCol; 
               theF : Face from TopoDS);
index 6b607820261caabd83b9a6537f01ecb09555dd6e..9e3502f81aadae5ef9c44a988079ca273b8feda8 100644 (file)
@@ -505,6 +505,21 @@ void BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane
     aBB.UpdateEdge(aE, aC2D, aF, aTolE);
   }
 }
+
+//=======================================================================
+//function : BuildPCurveForEdgeOnPlane
+//purpose  : 
+//=======================================================================
+void BOPTools_AlgoTools2D::BuildPCurveForEdgeOnPlane 
+  (const TopoDS_Edge& aE,
+   const TopoDS_Face& aF,
+   Handle(Geom2d_Curve)& aC2D,
+   Standard_Boolean& bToUpdate)
+{
+  Standard_Real aT1, aT2;
+  aC2D=BRep_Tool_CurveOnSurface(aE, aF, aT1, aT2, bToUpdate);
+}
+
 //=======================================================================
 // function: BuildPCurveForEdgesOnPlane
 // purpose: