]> OCCT Git - occt-copy.git/commitdiff
0026444: Boolean operation "bcut" gives invalid result between solid and halfspace... CR26444-670
authoremv <emv@opencascade.com>
Thu, 23 Jul 2015 09:48:36 +0000 (12:48 +0300)
committermsv <msv@opencascade.com>
Mon, 27 Jul 2015 12:30:43 +0000 (15:30 +0300)
Patch for version 670 of OCCT (Git branch CR0_670_FixS).

class BOPAlgo_PaveFiller
method void BOPAlgo_PaveFiller::PutPaveOnCurve
    (const Standard_Integer nV,
     const Standard_Real aTolR3D,
     BOPDS_Curve& aNC,
     const BOPCol_MapOfInteger& aMI,
     BOPCol_DataMapOfIntegerReal& aMVTol,
     const Standard_Integer iCheckExtend)

Do not put the pave on the curve in case if there is already one with the same parameter.
Update tolerance of the existing vertex to reach the new one.

Added test case bugs/modalg_6/bug26444.

src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx
src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx
src/BOPDS/BOPDS_PaveBlock.cdl
src/BOPDS/BOPDS_PaveBlock.cxx
tests/bugs/modalg_6/bug26444 [new file with mode: 0644]

index 2ed55c8b34e0fe54797e3eac73e51bac2df5c528..528e8a4a1eec1043851930289dcb3ec67b011476 100644 (file)
@@ -1573,41 +1573,70 @@ void BOPAlgo_PaveFiller::RemoveUsedVertices(BOPDS_Curve& aNC,
                                           const Standard_Integer iCheckExtend)
 {
   Standard_Boolean bIsVertexOnLine;
-  Standard_Real aT, aTol, aTolNew;
-  BOPDS_Pave aPave;
+  Standard_Real aT, aTolV;
   //
-  const TopoDS_Vertex aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
+  const TopoDS_Vertex& aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
   Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
   const IntTools_Curve& aIC = aNC.Curve();
   //
   bIsVertexOnLine=myContext->IsVertexOnLine(aV, aIC, aTolR3D, aT);
   if (!bIsVertexOnLine && iCheckExtend) {
-    aTol = BRep_Tool::Tolerance(aV);
+    aTolV = BRep_Tool::Tolerance(aV);
     //
-    ExtendedTolerance(nV, aMI, aTol, iCheckExtend);
-    bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTol, aIC, aTolR3D, aT);
+    ExtendedTolerance(nV, aMI, aTolV, iCheckExtend);
+    bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTolV, aIC, aTolR3D, aT);
   }
   //
   if (bIsVertexOnLine) {
-    aPave.SetIndex(nV);
-    aPave.SetParameter(aT);
+    // check if aPB contains the parameter aT
+    Standard_Boolean bExist;
+    Standard_Integer nVToUpdate;
+    Standard_Real aPTol, aDist, aTolVNew, aTolV2, aDTol;
+    TopoDS_Vertex aVToUpdate;
+    gp_Pnt aP1, aP2;
     //
-    aPB->AppendExtPave(aPave);
+    aTolV2 = 0.;
+    aDTol = 1.e-12;
     //
-    aTol = BRep_Tool::Tolerance(aV);
+    GeomAdaptor_Curve aGAC(aIC.Curve());
+    aPTol = aGAC.Resolution(aTolR3D);
     //
-    BOPTools_AlgoTools::UpdateVertex (aIC, aT, aV);
+    bExist = aPB->ContainsParameter(aT, aPTol, nVToUpdate);
+    if (bExist) {
+      // use existing pave
+      aP1 = BRep_Tool::Pnt(aV);
+      aTolV2 = BRep_Tool::Tolerance(aV);
+      aVToUpdate = (*(TopoDS_Vertex *)(&myDS->Shape(nVToUpdate)));
+    }
+    else {
+      // add new pave
+      BOPDS_Pave aPave;
+      aPave.SetIndex(nV);
+      aPave.SetParameter(aT);
+      aPB->AppendExtPave(aPave);
+      //
+      aP1 = aGAC.Value(aT);
+      nVToUpdate = nV;
+      aVToUpdate = aV;
+    }
     //
-    if (!aMVTol.IsBound(nV)) {
-      aTolNew = BRep_Tool::Tolerance(aV);
-      if (aTolNew > aTol) {
-        aMVTol.Bind(nV, aTol);
+    aTolV = BRep_Tool::Tolerance(aVToUpdate);
+    aP2 = BRep_Tool::Pnt(aVToUpdate);
+    aDist = aP1.Distance(aP2);
+    aTolVNew = aDist - aTolV2;
+    //
+    if (aTolVNew > aTolV) {
+      BRep_Builder aBB;
+      aBB.UpdateVertex(aVToUpdate, aTolVNew+aDTol);
+      //
+      if (!aMVTol.IsBound(nVToUpdate)) {
+        aMVTol.Bind(nVToUpdate, aTolV);
       }
+      // 
+      BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nVToUpdate);
+      Bnd_Box& aBoxDS=aSIDS.ChangeBox();
+      BRepBndLib::Add(aVToUpdate, aBoxDS);
     }
-    // 
-    BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
-    Bnd_Box& aBoxDS=aSIDS.ChangeBox();
-    BRepBndLib::Add(aV, aBoxDS);
   }
 }
 
@@ -2001,7 +2030,7 @@ void BOPAlgo_PaveFiller::UpdatePaveBlocks(const BOPCol_DataMapOfIntegerInteger&
         }
         //
         if (bRebuild) {
-          nSp = SplitEdge(aPB->Edge(), nV[0], aT[0], nV[1], aT[1]);
+          nSp = SplitEdge(aPB->OriginalEdge(), nV[0], aT[0], nV[1], aT[1]);
           if (bCB) {
             aCB->SetEdge(nSp);
           }
index 124490bb2131350b60956720b4b224ab7df569fa..7bad8897ec18822303f636997bc5d033d25eac5b 100644 (file)
@@ -244,7 +244,7 @@ static
                                      const Handle(BOPDS_PaveBlock)& aPBD)
 {
   Standard_Boolean bXDir, bIsDone, bReject;
-  Standard_Integer nE, aNbPoints, j;
+  Standard_Integer nE, aNbPoints, j, anInd;
   Standard_Real aTD1, aTD2, aT1, aT2, aTolInter, aX, aDT;
   Standard_Real aTolCmp;
   gp_Pnt2d aP2d1, aP2d2, aP2D;
@@ -330,7 +330,7 @@ static
       }
       //
       bReject=Standard_False;
-      if (aPBD->ContainsParameter(aX, aDT)) {
+      if (aPBD->ContainsParameter(aX, aDT, anInd)) {
         continue;
       }
       aPave.SetParameter(aX);
index 385c93658366e9ab9dc6744fe1d1bc40f7acbdb6..48aba298e10861186419d19ffe42b146e9249954 100644 (file)
@@ -186,13 +186,15 @@ is
         
     ContainsParameter(me; 
         thePrm:Real from Standard; 
-        theTol:Real from Standard) 
+        theTol:Real from Standard;
+        theInd:out Integer from Standard) 
     returns Boolean from Standard; 
     ---Purpose: 
     --- Query 
     --- Returns true if the extra paves contain the pave 
     --- with given value of the parameter <thePrm> 
     ---  <theTol>  - the value of the tolerance to compare 
+    ---  <theInd>  - the Index of the found pave
  
     -- 
     -- shrunk data   
index f75bac17ec798e82a39542819dcb9b119020e441..d3c09e3209525ffe9603aaf7cbd1292ca9b859b5 100644 (file)
@@ -234,21 +234,19 @@ static
 //purpose  : 
 //=======================================================================
   Standard_Boolean BOPDS_PaveBlock::ContainsParameter(const Standard_Real theT,
-                                                      const Standard_Real theTol)const
+                                                      const Standard_Real theTol,
+                                                      Standard_Integer& theInd) const
 {
   Standard_Boolean bRet;
-  Standard_Real dT;
   BOPDS_ListIteratorOfListOfPave aIt;
   //
-  bRet=Standard_False;
+  bRet = Standard_False;
   aIt.Initialize(myExtPaves);
   for (; aIt.More(); aIt.Next()) {
-    dT=aIt.Value().Parameter()-theT;
-    if (dT<0.) {
-      dT=-dT;
-    }
-    if (dT<theTol) {
-      bRet=!bRet;
+    const BOPDS_Pave& aPave = aIt.Value();
+    bRet = (Abs(aPave.Parameter() - theT) < theTol);
+    if (bRet) {
+      theInd = aPave.Index();
       break;
     }
   }
diff --git a/tests/bugs/modalg_6/bug26444 b/tests/bugs/modalg_6/bug26444
new file mode 100644 (file)
index 0000000..c873f15
--- /dev/null
@@ -0,0 +1,17 @@
+puts "========"
+puts "OCC26444"
+puts "========"
+puts ""
+####################################################################################
+# Boolean operation "bcut" gives invalid result between solid and halfspace solid.
+####################################################################################
+
+restore [locate_data_file bug26444_cutting_shape.brep] a
+restore [locate_data_file bug26444_shape_to_cut.brep] b
+restore [locate_data_file bug26444_ref_out.brep] p2
+dump p2
+halfspace s1 a -0.541421905726473 0.200000002980232 0.00899999961256981
+bcut result b s1
+
+set square 0.106547
+set 2dviewer 1