From 9926d83075fd27aaf198b4c8c721f6e4cb5940e2 Mon Sep 17 00:00:00 2001 From: emv Date: Wed, 29 Jul 2015 15:24:03 +0300 Subject: [PATCH] 0026444: Boolean operation "bcut" gives invalid result between solid and halfspace solid. 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. Test boolean/volumemaker/G1 is stable now (deleted TODOs), test offset/faces_type_i/C9 is bad (offset is done with wrong result). --- src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx | 69 ++++++++++++++++++++-------- src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx | 4 +- src/BOPDS/BOPDS_PaveBlock.cdl | 4 +- src/BOPDS/BOPDS_PaveBlock.cxx | 16 +++---- tests/boolean/volumemaker/G1 | 3 -- tests/bugs/modalg_6/bug26444 | 17 +++++++ tests/offset/faces_type_i/C9 | 4 +- 7 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 tests/bugs/modalg_6/bug26444 diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx index 850f5828b2..b51988c1ed 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx @@ -1740,41 +1740,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); } } @@ -2194,7 +2223,7 @@ void BOPAlgo_PaveFiller::UpdatePaveBlocks } // 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); } diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx index 8d784a6e4f..82b8e33f8f 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx @@ -244,7 +244,7 @@ static const Handle(BOPDS_PaveBlock)& aPBD) { Standard_Boolean bXDir, bIsDone; - 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; @@ -329,7 +329,7 @@ static continue; } // - if (aPBD->ContainsParameter(aX, aDT)) { + if (aPBD->ContainsParameter(aX, aDT, anInd)) { continue; } aPave.SetParameter(aX); diff --git a/src/BOPDS/BOPDS_PaveBlock.cdl b/src/BOPDS/BOPDS_PaveBlock.cdl index b018bc5724..a54e2c686b 100644 --- a/src/BOPDS/BOPDS_PaveBlock.cdl +++ b/src/BOPDS/BOPDS_PaveBlock.cdl @@ -186,13 +186,15 @@ is ContainsParameter(me; thePrm:Real from Standard; - theTol:Real from Standard) + theTol:Real from Standard; + theInd: in 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 --- - the value of the tolerance to compare + --- - index of the found pave -- -- shrunk data diff --git a/src/BOPDS/BOPDS_PaveBlock.cxx b/src/BOPDS/BOPDS_PaveBlock.cxx index 14ff6a27c4..0d756b8e74 100755 --- a/src/BOPDS/BOPDS_PaveBlock.cxx +++ b/src/BOPDS/BOPDS_PaveBlock.cxx @@ -234,21 +234,19 @@ //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