diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx index 2ed55c8b34..528e8a4a1e 100644 --- a/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx +++ b/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx @@ -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); - // - if (!aMVTol.IsBound(nV)) { - aTolNew = BRep_Tool::Tolerance(aV); - if (aTolNew > aTol) { - aMVTol.Bind(nV, aTol); - } + 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; + } + // + 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); } diff --git a/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx b/src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx index 124490bb21..7bad8897ec 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, 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); diff --git a/src/BOPDS/BOPDS_PaveBlock.cdl b/src/BOPDS/BOPDS_PaveBlock.cdl index 385c936583..48aba298e1 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: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 + --- - the Index of the found pave -- -- shrunk data diff --git a/src/BOPDS/BOPDS_PaveBlock.cxx b/src/BOPDS/BOPDS_PaveBlock.cxx index f75bac17ec..d3c09e3209 100644 --- a/src/BOPDS/BOPDS_PaveBlock.cxx +++ b/src/BOPDS/BOPDS_PaveBlock.cxx @@ -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