1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2012 OPEN CASCADE SAS
3 // Copyright (c) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
4 // Copyright (c) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT,
5 // EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
7 // The content of this file is subject to the Open CASCADE Technology Public
8 // License Version 6.5 (the "License"). You may not use the content of this file
9 // except in compliance with the License. Please obtain a copy of the License
10 // at http://www.opencascade.org and read it completely before using this file.
12 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
13 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
15 // The Original Code and all software distributed under the License is
16 // distributed on an "AS IS" basis, without warranty of any kind, and the
17 // Initial Developer hereby disclaims all such warranties, including without
18 // limitation, any warranties of merchantability, fitness for a particular
19 // purpose or non-infringement. Please see the License for the specific terms
20 // and conditions governing the rights and limitations under the License.
23 #include <BOPAlgo_PaveFiller.ixx>
25 #include <Precision.hxx>
26 #include <NCollection_IncAllocator.hxx>
27 #include <Bnd_Box.hxx>
29 #include <Geom_Curve.hxx>
30 #include <Geom2d_Curve.hxx>
32 #include <GeomAPI_ProjectPointOnCurve.hxx>
33 #include <GeomAPI_ProjectPointOnSurf.hxx>
35 #include <TopoDS_Edge.hxx>
36 #include <TopoDS_Face.hxx>
37 #include <TopoDS_Vertex.hxx>
38 #include <TopoDS_Compound.hxx>
40 #include <TopExp_Explorer.hxx>
42 #include <BRep_Builder.hxx>
43 #include <BRep_Tool.hxx>
45 #include <BRepBndLib.hxx>
46 #include <BRepTools.hxx>
48 #include <BRepAdaptor_Curve.hxx>
49 #include <BRepAdaptor_Surface.hxx>
51 #include <IntTools_FaceFace.hxx>
52 #include <IntTools_SequenceOfCurves.hxx>
53 #include <IntTools_SequenceOfPntOn2Faces.hxx>
54 #include <IntTools_Curve.hxx>
55 #include <IntTools_PntOn2Faces.hxx>
56 #include <IntTools_Tools.hxx>
58 #include <IntSurf_ListOfPntOn2S.hxx>
59 #include <IntSurf_PntOn2S.hxx>
61 #include <BOPTools_AlgoTools.hxx>
62 #include <BOPTools_AlgoTools3D.hxx>
64 #include <BOPCol_MapOfInteger.hxx>
65 #include <BOPCol_ListOfShape.hxx>
66 #include <BOPCol_DataMapOfShapeInteger.hxx>
67 #include <BOPCol_ListOfInteger.hxx>
68 #include <BOPCol_IndexedMapOfInteger.hxx>
70 #include <BOPInt_Context.hxx>
71 #include <BOPInt_Tools.hxx>
73 #include <BOPDS_Interf.hxx>
74 #include <BOPDS_Iterator.hxx>
75 #include <BOPDS_Curve.hxx>
76 #include <BOPDS_Point.hxx>
77 #include <BOPDS_FaceInfo.hxx>
78 #include <BOPDS_Curve.hxx>
79 #include <BOPDS_MapOfPaveBlock.hxx>
80 #include <BOPDS_PaveBlock.hxx>
81 #include <BOPDS_VectorOfCurve.hxx>
82 #include <BOPDS_VectorOfPoint.hxx>
83 #include <BOPDS_ShapeInfo.hxx>
84 #include <BOPDS_PaveBlock.hxx>
85 #include <BOPDS_ListOfPave.hxx>
86 #include <BOPDS_ListOfPaveBlock.hxx>
87 #include <BOPDS_CoupleOfPaveBlocks.hxx>
88 #include <BOPDS_FaceInfo.hxx>
89 #include <BOPDS_CommonBlock.hxx>
91 #include <BOPAlgo_Tools.hxx>
92 #include <BRepBuilderAPI_MakeVertex.hxx>
94 #include <BOPInt_ShrunkRange.hxx>
95 #include <BOPDS_DataMapOfPaveBlockListOfPaveBlock.hxx>
97 static void ToleranceFF(const TopoDS_Face& aF1,
98 const TopoDS_Face& aF2,
99 Standard_Real& aTolFF);
101 //=======================================================================
102 //function : PerformFF
104 //=======================================================================
105 void BOPAlgo_PaveFiller::PerformFF()
107 Standard_Integer iSize;
108 Standard_Boolean bValid;
112 myIterator->Initialize(TopAbs_FACE, TopAbs_FACE);
113 iSize=myIterator->ExpectedLength();
118 Standard_Boolean bJustAdd, bApp, bCompC2D1, bCompC2D2, bIsDone;
119 Standard_Boolean bToSplit, bTangentFaces;
120 Standard_Integer nF1, nF2, aNbCurves, aNbPoints, iX, i, iP, iC, aNbLP;
121 Standard_Real aApproxTol, aTolR3D, aTolR2D, aTolFF;
123 BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
124 aFFs.SetStartSize(iSize);
125 aFFs.SetIncrement(iSize);
128 bApp=mySectionAttribute.Approximation();
129 bCompC2D1=mySectionAttribute.PCurveOnS1();
130 bCompC2D2=mySectionAttribute.PCurveOnS2();
132 bToSplit = Standard_False;
134 for (; myIterator->More(); myIterator->Next()) {
135 myIterator->Value(nF1, nF2, bJustAdd);
140 const TopoDS_Face& aF1=(*(TopoDS_Face *)(&myDS->Shape(nF1)));
141 const TopoDS_Face& aF2=(*(TopoDS_Face *)(&myDS->Shape(nF2)));
143 IntTools_FaceFace aFaceFace;
145 IntSurf_ListOfPntOn2S aListOfPnts;
146 GetEFPnts(nF1, nF2, aListOfPnts);
147 aNbLP = aListOfPnts.Extent();
149 aFaceFace.SetList(aListOfPnts);
152 aFaceFace.SetParameters(bApp, bCompC2D1, bCompC2D2, aApproxTol);
154 aFaceFace.Perform(aF1, aF2);
156 bIsDone=aFaceFace.IsDone();
158 aTolR3D=aFaceFace.TolReached3d();
159 aTolR2D=aFaceFace.TolReached2d();
160 bTangentFaces=aFaceFace.TangentFaces();
162 ToleranceFF(aF1, aF2, aTolFF);
164 if (aTolR3D < aTolFF){
167 if (aTolR2D < 1.e-7){
171 aFaceFace.PrepareLines3D(bToSplit);
173 const IntTools_SequenceOfCurves& aCvsX=aFaceFace.Lines();
174 const IntTools_SequenceOfPntOn2Faces& aPntsX=aFaceFace.Points();
176 aNbCurves=aCvsX.Length();
177 aNbPoints=aPntsX.Length();
179 myDS->AddInterf(nF1, nF2);
182 BOPDS_InterfFF& aFF=aFFs(iX);
183 aFF.SetIndices(nF1, nF2);
185 aFF.SetTolR3D(aTolR3D);
186 aFF.SetTolR2D(aTolR2D);
187 aFF.SetTangentFaces(bTangentFaces);
190 aFF.Init(aNbCurves, aNbPoints);
193 BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves();
194 for (i=1; i<=aNbCurves; ++i) {
197 const IntTools_Curve& aIC=aCvsX(i);
198 const Handle(Geom_Curve)& aC3D= aIC.Curve();
199 bValid=BOPInt_Tools::CheckCurve(aC3D, aTolR3D, aBox);
202 BOPDS_Curve& aNC=aVNC(iC);
209 BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints();
210 for (i=1; i<=aNbPoints; ++i) {
211 const IntTools_PntOn2Faces& aPi=aPntsX(i);
212 const gp_Pnt& aP=aPi.P1().Pnt();
215 BOPDS_Point& aNP=aVNP(iP);
218 //}// if (aNbCs || aNbPs)
222 BOPDS_InterfFF& aFF=aFFs(iX);
223 aFF.SetIndices(nF1, nF2);
226 aFF.Init(aNbCurves, aNbPoints);
228 }// for (; myIterator->More(); myIterator->Next()) {
230 //=======================================================================
231 //function : MakeBlocks
233 //=======================================================================
235 void BOPAlgo_PaveFiller::MakeBlocks()
237 Standard_Integer aNbFF;
241 BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
247 Standard_Boolean bExist, bValid2D;
248 Standard_Integer i, nF1, nF2, aNbC, aNbP, j;
249 Standard_Integer nV1, nV2;
250 Standard_Real aTolR3D, aTolR2D, aT1, aT2;
251 Handle(NCollection_IncAllocator) aAllocator;
252 BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
254 Handle(BOPDS_PaveBlock) aPBOut;
256 //-----------------------------------------------------scope f
257 aAllocator=new NCollection_IncAllocator();
259 BOPCol_ListOfInteger aLSE(aAllocator);
260 BOPCol_MapOfInteger aMVOnIn(100, aAllocator), aMF(100, aAllocator),
261 aMVStick(100,aAllocator), aMVEF(100, aAllocator),
262 aMVB(100, aAllocator);
263 BOPDS_MapOfPaveBlock aMPBOnIn(100, aAllocator),
264 aMPBAdd(100, aAllocator);
265 BOPDS_ListOfPaveBlock aLPB(aAllocator);
266 BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks aMSCPB(100, aAllocator);
267 BOPCol_DataMapOfShapeInteger aMVI(100, aAllocator);
268 BOPDS_DataMapOfPaveBlockListOfPaveBlock aDMExEdges;
270 for (i=0; i<aNbFF; ++i) {
271 BOPDS_InterfFF& aFF=aFFs(i);
272 aFF.Indices(nF1, nF2);
274 BOPDS_VectorOfPoint& aVP=aFF.ChangePoints();
276 BOPDS_VectorOfCurve& aVC=aFF.ChangeCurves();
278 if (!aNbP && !aNbC) {
282 const TopoDS_Face& aF1=(*(TopoDS_Face *)(&myDS->Shape(nF1)));
283 const TopoDS_Face& aF2=(*(TopoDS_Face *)(&myDS->Shape(nF2)));
285 aTolR3D=aFF.TolR3D();
286 aTolR2D=aFF.TolR2D();
290 myDS->UpdateFaceInfoOn(nF1);
293 myDS->UpdateFaceInfoOn(nF2);
296 BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1);
297 BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2);
303 myDS->VerticesOnIn(nF1, nF2, aMVOnIn, aMPBOnIn);
304 myDS->SharedEdges(nF1, nF2, aLSE, aAllocator);
307 for (j=0; j<aNbP; ++j) {
309 BOPDS_CoupleOfPaveBlocks aCPB;
311 BOPDS_Point& aNP=aVP.ChangeValue(j);
312 const gp_Pnt& aP=aNP.Pnt();
314 bExist=IsExistingVertex(aP, aTolR3D, aMVOnIn);
316 BOPTools_AlgoTools::MakeNewVertex(aP, aTolR3D, aV);
318 aCPB.SetIndexInterf(i);
320 aMSCPB.Add(aV, aCPB);
327 GetStickVertices(nF1, nF2, aMVStick, aMVEF);
329 for (j=0; j<aNbC; ++j) {
330 BOPDS_Curve& aNC=aVC.ChangeValue(j);
331 const IntTools_Curve& aIC=aNC.Curve();
333 aNC.InitPaveBlock1();
335 PutPaveOnCurve(aMVOnIn, aTolR3D, aNC, nF1, nF2, aMVEF);
337 PutStickPavesOnCurve(nF1, nF2, aNC, aMVStick);
340 PutEFPavesOnCurve(nF1, nF2, aNC, aMVEF);
343 if (aIC.HasBounds()) {
344 PutBoundPaveOnCurve(aF1, aF2, aTolR3D, aNC, aMVOnIn, aMVB);
346 }//for (j=0; j<aNbC; ++j) {
348 // Put closing pave if needed
349 for (j=0; j<aNbC; ++j) {
350 BOPDS_Curve& aNC=aVC.ChangeValue(j);
351 PutClosingPaveOnCurve (aNC);
354 // 3. Make section edges
355 for (j=0; j<aNbC; ++j) {
356 BOPDS_Curve& aNC=aVC.ChangeValue(j);
357 const IntTools_Curve& aIC=aNC.Curve();
359 BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks();
360 Handle(BOPDS_PaveBlock)& aPB1=aNC.ChangePaveBlock1();
363 aPB1->Update(aLPB, Standard_False);
365 aItLPB.Initialize(aLPB);
366 for (; aItLPB.More(); aItLPB.Next()) {
367 Handle(BOPDS_PaveBlock)& aPB=aItLPB.ChangeValue();
368 aPB->Indices(nV1, nV2);
369 aPB->Range (aT1, aT2);
371 if (fabs(aT1 - aT2) < Precision::PConfusion()) {
375 bValid2D=myContext->IsValidBlockForFaces(aT1, aT2, aIC, aF1, aF2, aTolR3D);
380 bExist=IsExistingPaveBlock(aPB, aNC, aTolR3D, aLSE);
385 bExist=IsExistingPaveBlock(aPB, aNC, aTolR3D, aMPBOnIn, aPBOut);
387 if (aMPBAdd.Add(aPBOut)) {
388 Standard_Boolean bInBothFaces = Standard_True;
389 if (!myDS->IsCommonBlock(aPBOut)) {
394 const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(nE);
395 aTolE = BRep_Tool::Tolerance(aE);
396 if (aTolR3D > aTolE) {
397 myDS->UpdateEdgeTolerance(nE, aTolR3D);
399 bInBothFaces = Standard_False;
401 bInBothFaces = (aFI1.PaveBlocksOn().Contains(aPBOut) ||
402 aFI1.PaveBlocksIn().Contains(aPBOut))&&
403 (aFI2.PaveBlocksOn().Contains(aPBOut) ||
404 aFI2.PaveBlocksIn().Contains(aPBOut));
407 PreparePostTreatFF(i, aPBOut, aMSCPB, aMVI, aVC);
414 const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1)));
415 const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2)));
417 BOPTools_AlgoTools::MakeEdge (aIC, aV1, aT1, aV2, aT2, aTolR3D, aES);
418 BOPTools_AlgoTools::MakePCurve(aES, aF1, aF2, aIC,
419 mySectionAttribute.PCurveOnS1(),
420 mySectionAttribute.PCurveOnS2());
422 if (BOPTools_AlgoTools::IsMicroEdge(aES, myContext)) {
426 // Append the Pave Block to the Curve j
429 // Keep info for post treatment
430 BOPDS_CoupleOfPaveBlocks aCPB;
431 aCPB.SetIndexInterf(i);
433 aCPB.SetPaveBlock1(aPB);
435 aMSCPB.Add(aES, aCPB);
441 }//for (j=0; j<aNbC; ++j) {
442 ProcessExistingPaveBlocks(i, aMPBOnIn, aMSCPB, aMVI, aMVB, aMPBAdd);
443 }//for (i=0; i<aNbFF; ++i) {
446 myErrorStatus=PostTreatFF(aMSCPB, aMVI, aDMExEdges, aAllocator);
452 UpdateFaceInfo(aDMExEdges);
453 //-----------------------------------------------------scope t
459 aAllocator.Nullify();
462 //=======================================================================
463 //function : PostTreatFF
465 //=======================================================================
466 Standard_Integer BOPAlgo_PaveFiller::PostTreatFF
467 (BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB,
468 BOPCol_DataMapOfShapeInteger& aMVI,
469 BOPDS_DataMapOfPaveBlockListOfPaveBlock& aDMExEdges,
470 Handle(NCollection_BaseAllocator)& theAllocator)
472 Standard_Integer iRet, aNbS;
475 aNbS=theMSCPB.Extent();
480 Standard_Boolean bHasPaveBlocks, bOld;
481 Standard_Integer iErr, nSx, nVSD, iX, iP, iC, j, nV, iV = 0, iE, k;
484 Standard_Integer aNbLPBx;
485 TopAbs_ShapeEnum aType;
487 BOPCol_ListIteratorOfListOfShape aItLS;
488 BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
490 Handle(BOPDS_PaveBlock) aPB1;
491 BOPDS_Pave aPave[2], aPave1[2];
494 BOPCol_ListOfShape aLS(theAllocator);
495 BOPAlgo_PaveFiller aPF(theAllocator);
497 BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
503 const TopoDS_Shape& aS=theMSCPB.FindKey(1);
504 const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromIndex(1);
507 aType=aS.ShapeType();
508 if (aType==TopAbs_VERTEX) {
509 aSI.SetShapeType(aType);
511 iV=myDS->Append(aSI);
513 iX=aCPB.IndexInterf();
515 BOPDS_InterfFF& aFF=aFFs(iX);
516 BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints();
517 BOPDS_Point& aNP=aVNP(iP);
520 else if (aType==TopAbs_EDGE) {
521 aPB1=aCPB.PaveBlock1();
523 if (aPB1->HasEdge()) {
524 BOPDS_ListOfPaveBlock aLPBx;
526 aDMExEdges.Bind(aPB1, aLPBx);
528 aSI.SetShapeType(aType);
530 iE=myDS->Append(aSI);
538 // 1 prepare arguments
539 for (k=1; k<=aNbS; ++k) {
540 const TopoDS_Shape& aS=theMSCPB.FindKey(k);
545 aPF.SetArguments(aLS);
547 iErr=aPF.ErrorStatus();
554 aItLS.Initialize(aLS);
555 for (; aItLS.More(); aItLS.Next()) {
556 const TopoDS_Shape& aSx=aItLS.Value();
557 nSx=aPDS->Index(aSx);
558 const BOPDS_ShapeInfo& aSIx=aPDS->ShapeInfo(nSx);
560 aType=aSIx.ShapeType();
562 if (aType==TopAbs_VERTEX) {
563 if (aPDS->HasShapeSD(nSx, nVSD)) {
564 aV=aPDS->Shape(nVSD);
569 // index of new vertex in theDS -> iV
570 if (!aMVI.IsBound(aV)) {
571 aSI.SetShapeType(aType);
573 iV=myDS->Append(aSI);
580 // update FF interference
581 const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx);
582 iX=aCPB.IndexInterf();
584 BOPDS_InterfFF& aFF=aFFs(iX);
585 BOPDS_VectorOfPoint& aVNP=aFF.ChangePoints();
586 BOPDS_Point& aNP=aVNP(iP);
588 }//if (aType==TopAbs_VERTEX) {
590 else if (aType==TopAbs_EDGE) {
591 bHasPaveBlocks=aPDS->HasPaveBlocks(nSx);
592 const BOPDS_CoupleOfPaveBlocks &aCPB=theMSCPB.FindFromKey(aSx);
593 iX=aCPB.IndexInterf();
595 aPB1=aCPB.PaveBlock1();
597 bOld = aPB1->HasEdge();
599 BOPDS_ListOfPaveBlock aLPBx;
600 aDMExEdges.Bind(aPB1, aLPBx);
603 if (!bHasPaveBlocks) {
605 aDMExEdges.ChangeFind(aPB1).Append(aPB1);
607 aSI.SetShapeType(aType);
609 iE=myDS->Append(aSI);
615 BOPDS_InterfFF& aFF=aFFs(iX);
616 BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves();
617 BOPDS_Curve& aNC=aVNC(iC);
618 BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks();
620 const BOPDS_ListOfPaveBlock& aLPBx=aPDS->PaveBlocks(nSx);
621 aNbLPBx=aLPBx.Extent();
623 if (bOld && !aNbLPBx) {
624 aDMExEdges.ChangeFind(aPB1).Append(aPB1);
629 aItLPB.Initialize(aLPBC);
630 for (; aItLPB.More(); aItLPB.Next()) {
631 const Handle(BOPDS_PaveBlock)& aPBC=aItLPB.Value();
633 aLPBC.Remove(aItLPB);
642 if (!aMVI.IsBound(aE)) {
643 aSI.SetShapeType(aType);
645 iE=myDS->Append(aSI);
651 // append new PaveBlock to aLPBC
652 Handle(BOPDS_PaveBlock) aPBC=new BOPDS_PaveBlock();
659 aItLPB.Initialize(aLPBx);
661 aPave1[0] = aPB1->Pave1();
662 aPave1[1] = aPB1->Pave2();
664 for (; aItLPB.More(); aItLPB.Next()) {
665 const Handle(BOPDS_PaveBlock)& aPBx=aItLPB.Value();
666 const Handle(BOPDS_PaveBlock) aPBRx=aPDS->RealPaveBlock(aPBx);
668 // update vertices of paves
669 aPave[0]=aPBx->Pave1();
670 aPave[1]=aPBx->Pave2();
671 for (j=0; j<2; ++j) {
674 aT = aPave[j].Parameter();
675 if (aT == aPave1[0].Parameter()) {
677 } else if (aT == aPave1[1].Parameter()) {
682 iV = aPave1[jx-1].Index();
689 if (!aMVI.IsBound(aV)) {// index of new vertex in theDS -> iV
690 aSI.SetShapeType(TopAbs_VERTEX);
692 iV=myDS->Append(aSI);
699 aPave[j].SetIndex(iV);
703 aE=aPDS->Shape(aPBRx->Edge());
705 if (!aMVI.IsBound(aE)) {
706 aSI.SetShapeType(aType);
708 iE=myDS->Append(aSI);
714 // append new PaveBlock to aLPBC
715 Handle(BOPDS_PaveBlock) aPBC=new BOPDS_PaveBlock();
717 aPBC->SetPave1(aPave[0]);
718 aPBC->SetPave2(aPave[1]);
721 aPBC->SetOriginalEdge(aPB1->OriginalEdge());
722 aDMExEdges.ChangeFind(aPB1).Append(aPBC);
730 }//else if (aType==TopAbs_EDGE)
731 }//for (; aItLS.More(); aItLS.Next()) {
735 //=======================================================================
736 //function : UpdateFaceInfo
738 //=======================================================================
739 void BOPAlgo_PaveFiller::UpdateFaceInfo(
740 BOPDS_DataMapOfPaveBlockListOfPaveBlock& theDME)
742 Standard_Integer i, j, nV1, nF1, nF2,
743 aNbFF, aNbC, aNbP, aNbS, aNbPBIn;
744 BOPDS_IndexedMapOfPaveBlock aMPBCopy;
745 BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
747 BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
750 //1. Sections (curves, points);
751 for (i=0; i<aNbFF; ++i) {
752 BOPDS_InterfFF& aFF=aFFs(i);
753 aFF.Indices(nF1, nF2);
755 BOPDS_FaceInfo& aFI1=myDS->ChangeFaceInfo(nF1);
756 BOPDS_FaceInfo& aFI2=myDS->ChangeFaceInfo(nF2);
758 BOPDS_VectorOfCurve& aVNC=aFF.ChangeCurves();
760 for (j=0; j<aNbC; ++j) {
761 BOPDS_Curve& aNC=aVNC(j);
762 BOPDS_ListOfPaveBlock& aLPBC=aNC.ChangePaveBlocks();
763 aItLPB.Initialize(aLPBC);
765 if (aItLPB.More() && theDME.IsBound(aLPBC.First())) {
766 const Handle(BOPDS_PaveBlock)& aPB=aLPBC.First();
767 BOPDS_ListOfPaveBlock& aLPB = theDME.ChangeFind(aPB);
768 UpdateExistingPaveBlocks(aPB, aLPB, nF1, nF2);
773 for(; aItLPB.More(); aItLPB.Next()) {
774 const Handle(BOPDS_PaveBlock)& aPB=aItLPB.Value();
775 aFI1.ChangePaveBlocksSc().Add(aPB);
776 aFI2.ChangePaveBlocksSc().Add(aPB);
780 const BOPDS_VectorOfPoint& aVNP=aFF.Points();
782 for (j=0; j<aNbP; ++j) {
783 const BOPDS_Point& aNP=aVNP(j);
785 aFI1.ChangeVerticesSc().Add(nV1);
786 aFI2.ChangeVerticesSc().Add(nV1);
791 if (theDME.IsEmpty()) {
795 aNbS=myDS->NbSourceShapes();
796 for (i=0; i<aNbS; ++i) {
797 const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
798 if (aSI.ShapeType()!=TopAbs_FACE) {
801 if(!myDS->HasFaceInfo(i)) {
804 BOPDS_FaceInfo& aFI=myDS->ChangeFaceInfo(i);
806 BOPDS_IndexedMapOfPaveBlock& aMPBIn=aFI.ChangePaveBlocksIn();
807 aMPBCopy.Assign(aMPBIn);
810 aNbPBIn=aMPBCopy.Extent();
811 for (j=1; j<=aNbPBIn; ++j) {
812 const Handle(BOPDS_PaveBlock)& aPB = aMPBCopy(j);
813 if (theDME.IsBound(aPB)) {
814 const BOPDS_ListOfPaveBlock& aLPB = theDME.Find(aPB);
815 aItLPB.Initialize(aLPB);
816 for (; aItLPB.More(); aItLPB.Next()) {
817 const Handle(BOPDS_PaveBlock)& aPB1 = aItLPB.Value();
823 }//for (j=1; j<=aNbPBIn; ++j) {
824 }//for (i=0; i<aNbS; ++i) {
827 //=======================================================================
828 //function : IsExistingVertex
830 //=======================================================================
831 Standard_Boolean BOPAlgo_PaveFiller::IsExistingVertex
833 const Standard_Real theTolR3D,
834 const BOPCol_MapOfInteger& aMVOnIn)const
836 Standard_Boolean bRet;
837 Standard_Integer nV, iFlag;
841 BOPCol_MapIteratorOfMapOfInteger aIt;
846 aBoxP.Enlarge(theTolR3D);
848 aIt.Initialize(aMVOnIn);
849 for (; aIt.More(); aIt.Next()) {
853 const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&myDS->Shape(nV)));
854 aPV=BRep_Tool::Pnt(aV);
855 aTolV=BRep_Tool::Tolerance(aV);
857 aBoxV.Enlarge(aTolV);
859 if (!aBoxP.IsOut(aBoxV)) {
860 iFlag=BOPTools_AlgoTools::ComputeVV(aV, aP, theTolR3D);
868 //=======================================================================
869 //function : IsExistingPaveBlock
871 //=======================================================================
872 Standard_Boolean BOPAlgo_PaveFiller::IsExistingPaveBlock
873 (const Handle(BOPDS_PaveBlock)& thePB,
874 const BOPDS_Curve& theNC,
875 const Standard_Real theTolR3D,
876 const BOPCol_ListOfInteger& theLSE)
878 Standard_Boolean bRet=Standard_True;
880 if (theLSE.IsEmpty()) {
884 Standard_Real aT1, aT2, aTm, aTx, aTol;
885 Standard_Integer nE, iFlag;
888 BOPCol_ListIteratorOfListOfInteger aItLI;
890 thePB->Range(aT1, aT2);
891 aTm=IntTools_Tools::IntermediatePoint (aT1, aT2);
892 theNC.Curve().D0(aTm, aPm);
894 aBoxPm.Enlarge(theTolR3D);
896 aItLI.Initialize(theLSE);
897 for (; aItLI.More(); aItLI.Next()) {
899 const BOPDS_ShapeInfo& aSIE=myDS->ChangeShapeInfo(nE);
900 const Bnd_Box& aBoxE=aSIE.Box();
901 if (!aBoxE.IsOut(aBoxPm)) {
902 const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&aSIE.Shape()));
903 aTol = BRep_Tool::Tolerance(aE);
904 aTol = aTol > theTolR3D ? aTol : theTolR3D;
905 iFlag=myContext->ComputePE(aPm, aTol, aE, aTx);
914 //=======================================================================
915 //function : IsExistingPaveBlock
917 //=======================================================================
918 Standard_Boolean BOPAlgo_PaveFiller::IsExistingPaveBlock
919 (const Handle(BOPDS_PaveBlock)& thePB,
920 const BOPDS_Curve& theNC,
921 const Standard_Real theTolR3D,
922 const BOPDS_MapOfPaveBlock& theMPBOnIn,
923 Handle(BOPDS_PaveBlock&) aPBOut)
925 Standard_Boolean bRet;
926 Standard_Real aT1, aT2, aTm, aTx;
927 Standard_Integer nSp, iFlag, nV11, nV12, nV21, nV22;
928 gp_Pnt aP1, aPm, aP2;
929 Bnd_Box aBoxP1, aBoxPm, aBoxP2;
930 BOPDS_MapIteratorOfMapOfPaveBlock aIt;
933 const IntTools_Curve& aIC=theNC.Curve();
935 thePB->Range(aT1, aT2);
936 thePB->Indices(nV11, nV12);
940 aBoxP1.Enlarge(theTolR3D);
942 aTm=IntTools_Tools::IntermediatePoint (aT1, aT2);
945 aBoxPm.Enlarge(theTolR3D);
949 aBoxP2.Enlarge(theTolR3D);
951 aIt.Initialize(theMPBOnIn);
952 for (; aIt.More(); aIt.Next()) {
953 const Handle(BOPDS_PaveBlock)& aPB=aIt.Value();
954 aPB->Indices(nV21, nV22);
956 const BOPDS_ShapeInfo& aSISp=myDS->ChangeShapeInfo(nSp);
957 const Bnd_Box& aBoxSp=aSISp.Box();
958 if (!aBoxSp.IsOut(aBoxP1) && !aBoxSp.IsOut(aBoxPm) && !aBoxSp.IsOut(aBoxP2)) {
959 const TopoDS_Edge& aSp=(*(TopoDS_Edge *)(&aSISp.Shape()));
960 iFlag=(nV11 == nV21 || nV11 == nV22) ? 0 :
961 myContext->ComputePE(aP1, theTolR3D, aSp, aTx);
963 iFlag=(nV12 == nV21 || nV12 == nV22) ? 0 :
964 myContext->ComputePE(aP2, theTolR3D, aSp, aTx);
966 iFlag=myContext->ComputePE(aPm, theTolR3D, aSp, aTx);
978 //=======================================================================
979 //function : PutBoundPaveOnCurve
981 //=======================================================================
982 void BOPAlgo_PaveFiller::PutBoundPaveOnCurve(const TopoDS_Face& aF1,
983 const TopoDS_Face& aF2,
984 const Standard_Real aTolR3D,
986 BOPCol_MapOfInteger& aMVOnIn,
987 BOPCol_MapOfInteger& aMVB)
989 Standard_Boolean bVF;
990 Standard_Integer nV, iFlag, nVn, j, aNbEP;
991 Standard_Real aT[2], aTmin, aTmax, aTV, aTol, aTolVnew;
994 BOPDS_ListIteratorOfListOfPave aItLP;
995 BOPDS_Pave aPn, aPMM[2];
997 aTolVnew = Precision::Confusion();
999 const IntTools_Curve& aIC=aNC.Curve();
1000 aIC.Bounds(aT[0], aT[1], aP[0], aP[1]);
1002 Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
1003 const BOPDS_ListOfPave& aLP=aPB->ExtPaves();
1010 aItLP.Initialize(aLP);
1011 for (; aItLP.More(); aItLP.Next()) {
1012 const BOPDS_Pave& aPv=aItLP.Value();
1013 aPv.Contents(nV, aTV);
1025 for (j=0; j<2; ++j) {
1026 //if curve is closed, process only one bound
1027 if (j && aP[1].IsEqual(aP[0], aTolVnew)) {
1037 aTol = aTolR3D+Precision::Confusion();
1038 aBoxP.Enlarge(aTol);
1039 const BOPDS_Pave& aPV=aPMM[j];
1041 const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV);
1042 const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&aSIV.Shape()));
1043 const Bnd_Box& aBoxV=aSIV.Box();
1044 if (!aBoxP.IsOut(aBoxV)){
1045 iFlag=BOPTools_AlgoTools::ComputeVV(aV, aP[j], aTol);
1050 bVF=myContext->IsValidPointForFaces (aP[j], aF1, aF2, aTolR3D);
1055 BOPDS_ShapeInfo aSIVn;
1057 BOPTools_AlgoTools::MakeNewVertex(aP[j], aTolR3D, aVn);
1058 aSIVn.SetShapeType(TopAbs_VERTEX);
1059 aSIVn.SetShape(aVn);
1061 nVn=myDS->Append(aSIVn);
1064 aPn.SetParameter(aT[j]);
1065 aPB->AppendExtPave(aPn);
1067 aVn=(*(TopoDS_Vertex *)(&myDS->Shape(nVn)));
1068 BOPTools_AlgoTools::UpdateVertex (aIC, aT[j], aVn);
1070 aTolVnew = BRep_Tool::Tolerance(aVn);
1072 BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nVn);
1073 Bnd_Box& aBoxDS=aSIDS.ChangeBox();
1074 BRepBndLib::Add(aVn, aBoxDS);
1081 //=======================================================================
1082 //function : PutPaveOnCurve
1084 //=======================================================================
1085 void BOPAlgo_PaveFiller::PutPaveOnCurve(const BOPCol_MapOfInteger& aMVOnIn,
1086 const Standard_Real aTolR3D,
1088 const Standard_Integer nF1,
1089 const Standard_Integer nF2,
1090 const BOPCol_MapOfInteger& aMVEF)
1092 Standard_Boolean bIsVertexOnLine, bInBothFaces;
1093 Standard_Integer nV;
1097 BOPCol_MapIteratorOfMapOfInteger aIt;
1099 Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
1100 const IntTools_Curve& aIC=aNC.Curve();
1101 const Bnd_Box& aBoxC=aNC.Box();
1103 aIt.Initialize(aMVOnIn);
1104 for (; aIt.More(); aIt.Next()) {
1106 const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV);
1107 const TopoDS_Vertex& aV=(*(TopoDS_Vertex *)(&aSIV.Shape()));
1109 if (!aMVEF.Contains(nV)) {
1110 const Bnd_Box& aBoxV=aSIV.Box();
1112 if (aBoxC.IsOut(aBoxV)){
1115 if (!myDS->IsNewShape(nV)) {
1116 const BOPDS_FaceInfo& aFI1 = myDS->FaceInfo(nF1);
1117 const BOPDS_FaceInfo& aFI2 = myDS->FaceInfo(nF2);
1119 bInBothFaces = (aFI1.VerticesOn().Contains(nV) ||
1120 aFI1.VerticesIn().Contains(nV))&&
1121 (aFI2.VerticesOn().Contains(nV) ||
1122 aFI2.VerticesIn().Contains(nV));
1123 if (!bInBothFaces) {
1129 bIsVertexOnLine=myContext->IsVertexOnLine(aV, aIC, aTolR3D, aT);
1130 if (!bIsVertexOnLine) {
1131 Standard_Real aTolVExt;
1132 BOPCol_MapOfInteger aMI;
1134 aTolVExt = BRep_Tool::Tolerance(aV);
1136 GetFullFaceMap(nF1, aMI);
1137 GetFullFaceMap(nF2, aMI);
1139 ExtendedTolerance(nV, aMI, aTolVExt);
1140 bIsVertexOnLine=myContext->IsVertexOnLine(aV, aTolVExt, aIC, aTolR3D, aT);
1143 if (bIsVertexOnLine) {
1145 aPave.SetParameter(aT);
1147 aPB->AppendExtPave(aPave);
1149 BOPTools_AlgoTools::UpdateVertex (aIC, aT, aV);
1151 BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
1152 Bnd_Box& aBoxDS=aSIDS.ChangeBox();
1153 BRepBndLib::Add(aV, aBoxDS);
1158 //=======================================================================
1159 //function : ExtendedTolerance
1161 //=======================================================================
1162 Standard_Boolean BOPAlgo_PaveFiller::ExtendedTolerance(const Standard_Integer nV,
1163 const BOPCol_MapOfInteger& aMI,
1164 Standard_Real& aTolVExt)
1166 Standard_Boolean bFound = Standard_False;
1167 if (!(myDS->IsNewShape(nV))) {
1171 Standard_Integer i, k, aNbLines;
1172 Standard_Real aT11, aT12, aD1, aD2, aD;
1174 gp_Pnt aPV, aP11, aP12;
1176 aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
1177 aPV=BRep_Tool::Pnt(aV);
1179 BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
1180 BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
1182 for (k=0; k<2; ++k) {
1183 aNbLines = !k ? aEEs.Extent() : aEFs.Extent();
1184 for (i = 0; i < aNbLines; ++i) {
1185 BOPDS_Interf *aInt = !k ? (BOPDS_Interf*) (&aEEs(i)) :
1186 (BOPDS_Interf*) (&aEFs(i));
1187 if (aInt->IndexNew() == nV) {
1188 if (aMI.Contains(aInt->Index1()) && aMI.Contains(aInt->Index2())) {
1189 const IntTools_CommonPrt& aComPrt = !k ? aEEs(i).CommonPart() :
1190 aEFs(i).CommonPart();
1192 const TopoDS_Edge& aE1=aComPrt.Edge1();
1193 aComPrt.Range1(aT11, aT12);
1194 BOPTools_AlgoTools::PointOnEdge(aE1, aT11, aP11);
1195 BOPTools_AlgoTools::PointOnEdge(aE1, aT12, aP12);
1196 aD1=aPV.Distance(aP11);
1197 aD2=aPV.Distance(aP12);
1198 aD=(aD1>aD2)? aD1 : aD2;
1203 }//if (aMI.Contains(aEF.Index1()) && aMI.Contains(aEF.Index2())) {
1204 }//if (aInt->IndexNew() == nV) {
1205 }//for (i = 0; i < aNbLines; ++i) {
1206 }//for (k=0; k<2; ++k) {
1211 //=======================================================================
1212 //function : GetEFPnts
1214 //=======================================================================
1215 void BOPAlgo_PaveFiller::GetEFPnts(const Standard_Integer nF1,
1216 const Standard_Integer nF2,
1217 IntSurf_ListOfPntOn2S& aListOfPnts)
1219 Standard_Integer nE, nF, nFOpposite, aNbEFs, i;
1220 Standard_Real U1, U2, V1, V2, f, l;
1221 BOPCol_MapOfInteger aMIF1, aMIF2;
1223 //collect indexes of all shapes from nF1 and nF2.
1224 GetFullFaceMap(nF1, aMIF1);
1225 GetFullFaceMap(nF2, aMIF2);
1227 BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
1228 aNbEFs = aEFs.Extent();
1230 for(i = 0; i < aNbEFs; ++i) {
1231 const BOPDS_InterfEF& aEF = aEFs(i);
1233 nFOpposite = aEF.Index2();
1234 if(aMIF1.Contains(nE) && aMIF2.Contains(nFOpposite) ||
1235 aMIF1.Contains(nFOpposite) && aMIF2.Contains(nE)) {
1237 IntTools_CommonPrt aCP = aEF.CommonPart();
1238 if(aCP.Type() == TopAbs_VERTEX) {
1239 Standard_Real aPar = aCP.VertexParameter1();
1240 const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&myDS->Shape(nE)));
1241 const TopoDS_Face& aFOpposite = (*(TopoDS_Face*)(&myDS->Shape(nFOpposite)));
1243 const Handle(Geom_Curve)& aCurve = BRep_Tool::Curve(aE, f, l);
1245 nF = (nFOpposite == nF1) ? nF2 : nF1;
1246 const TopoDS_Face& aF = (*(TopoDS_Face*)(&myDS->Shape(nF)));
1247 Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(aE, aF, f, l);
1249 GeomAPI_ProjectPointOnSurf& aProj = myContext->ProjPS(aFOpposite);
1252 aCurve->D0(aPar, aPoint);
1253 IntSurf_PntOn2S aPnt;
1254 if(!aPCurve.IsNull()) {
1255 gp_Pnt2d aP2d = aPCurve->Value(aPar);
1256 aProj.Perform(aPoint);
1257 if(aProj.IsDone()) {
1258 aProj.LowerDistanceParameters(U1,V1);
1260 aPnt.SetValue(aP2d.X(),aP2d.Y(),U1,V1);
1262 aPnt.SetValue(U1,V1,aP2d.X(),aP2d.Y());
1264 aListOfPnts.Append(aPnt);
1268 GeomAPI_ProjectPointOnSurf& aProj1 = myContext->ProjPS(aF);
1269 aProj1.Perform(aPoint);
1270 aProj.Perform(aPoint);
1271 if(aProj1.IsDone() && aProj.IsDone()){
1272 aProj1.LowerDistanceParameters(U1,V1);
1273 aProj.LowerDistanceParameters(U2,V2);
1275 aPnt.SetValue(U1,V1,U2,V2);
1277 aPnt.SetValue(U2,V2,U1,V1);
1279 aListOfPnts.Append(aPnt);
1287 //=======================================================================
1288 //function : ProcessUnUsedVertices
1290 //=======================================================================
1291 void BOPAlgo_PaveFiller::PutEFPavesOnCurve(const Standard_Integer /*nF1*/,
1292 const Standard_Integer /*nF2*/,
1294 const BOPCol_MapOfInteger& aMVEF)
1296 if (!aMVEF.Extent()) {
1300 const IntTools_Curve& aIC=aNC.Curve();
1301 GeomAbs_CurveType aTypeC;
1303 if (!(aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve)) {
1307 Standard_Integer nV;
1308 BOPCol_MapOfInteger aMV;
1311 RemoveUsedVertices(aNC, aMV);
1312 if (!aMV.Extent()) {
1316 Standard_Real aDist;
1319 const Handle(Geom_Curve)& aC3D=aIC.Curve();
1320 Handle(BOPDS_PaveBlock)& aPB = aNC.ChangePaveBlock1();
1322 GeomAPI_ProjectPointOnCurve& aProjPT = myContext->ProjPT(aC3D);
1324 BOPCol_MapIteratorOfMapOfInteger aItMI;
1325 aItMI.Initialize(aMV);
1326 for (; aItMI.More(); aItMI.Next()) {
1328 const TopoDS_Vertex& aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
1329 gp_Pnt aPV = BRep_Tool::Pnt(aV);
1330 aProjPT.Perform(aPV);
1331 Standard_Integer aNbPoints = aProjPT.NbPoints();
1333 aDist = aProjPT.LowerDistance();
1334 PutPaveOnCurve(nV, aDist, aNC, aPB);
1339 //=======================================================================
1340 //function : ProcessUnUsedVertices
1342 //=======================================================================
1343 void BOPAlgo_PaveFiller::PutStickPavesOnCurve(const Standard_Integer nF1,
1344 const Standard_Integer nF2,
1346 const BOPCol_MapOfInteger& aMVStick)
1348 BOPCol_MapOfInteger aMV;
1349 aMV.Assign(aMVStick);
1350 RemoveUsedVertices(aNC, aMV);
1352 if (!aMV.Extent()) {
1356 GeomAbs_SurfaceType aType1, aType2;
1357 const TopoDS_Face& aF1 = (*(TopoDS_Face*)(&myDS->Shape(nF1)));
1358 const TopoDS_Face& aF2 = (*(TopoDS_Face*)(&myDS->Shape(nF2)));
1359 Handle(Geom_Surface) aS1=BRep_Tool::Surface(aF1);
1360 Handle(Geom_Surface) aS2=BRep_Tool::Surface(aF2);
1361 GeomAdaptor_Surface aGAS1(aS1);
1362 GeomAdaptor_Surface aGAS2(aS2);
1365 aType1=aGAS1.GetType();
1366 aType2=aGAS2.GetType();
1368 if(aType1==GeomAbs_Torus || aType2==GeomAbs_Torus) {
1369 Standard_Integer nV, m, n;
1370 Standard_Real aTC[2], aD, aD2, u, v, aDT2, aScPr, aDScPr;
1371 GeomAbs_CurveType aTypeC;
1376 Handle(Geom2d_Curve) aC2D[2];
1378 aDT2=2e-7; // the rich criteria
1379 aDScPr=5.e-9; // the creasing criteria
1381 const IntTools_Curve& aIC=aNC.Curve();
1382 //Handle(Geom_Curve) aC3D=aIC.Curve(); //DEB
1384 if (aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve) {
1386 aIC.Bounds(aTC[0], aTC[1], aPC[0], aPC[1]);
1387 aC2D[0]=aIC.FirstCurve2d();
1388 aC2D[1]=aIC.SecondCurve2d();
1389 if (!aC2D[0].IsNull() && !aC2D[1].IsNull()) {
1390 BOPCol_MapIteratorOfMapOfInteger aItMI, aItMI1;
1391 aItMI.Initialize(aMV);
1392 for (; aItMI.More(); aItMI.Next()) {
1394 const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&myDS->Shape(nV));
1395 aPV=BRep_Tool::Pnt(aV);
1397 for (m=0; m<2; ++m) {
1398 aD2=aPC[m].SquareDistance(aPV);
1399 if (aD2>aDT2) {// no rich
1403 for (n=0; n<2; ++n) {
1404 Handle(Geom_Surface)& aS=(!n)? aS1 : aS2;
1405 aC2D[n]->D0(aTC[m], aP2D);
1407 BOPTools_AlgoTools3D::GetNormalToSurface(aS, u, v, aDN[n]);
1410 aScPr=aDN[0]*aDN[1];
1420 // The intersection curve aIC is vanishing curve (the crease)
1423 Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
1424 PutPaveOnCurve(nV, aD, aNC, aPB);
1426 }//for (jVU=1; jVU=aNbVU; ++jVU) {
1428 }//if (aTypeC==GeomAbs_BezierCurve || aTypeC==GeomAbs_BSplineCurve) {
1429 }//if(aType1==GeomAbs_Torus || aType2==GeomAbs_Torus) {
1432 //=======================================================================
1433 //function : GetStickVertices
1435 //=======================================================================
1436 void BOPAlgo_PaveFiller::GetStickVertices(const Standard_Integer nF1,
1437 const Standard_Integer nF2,
1438 BOPCol_MapOfInteger& aMVStick,
1439 BOPCol_MapOfInteger& aMVEF)
1441 BOPCol_MapOfInteger aMIF1, aMIF2;
1442 Standard_Integer nV1, nV2, nE1, nE2, nV, nE, nF, nVNew, i;
1444 BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
1445 BOPDS_VectorOfInterfVE& aVEs=myDS->InterfVE();
1446 BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
1447 BOPDS_VectorOfInterfVF& aVFs=myDS->InterfVF();
1448 BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
1450 Standard_Integer aNbVVs, aNbVEs, aNbEEs, aNbVFs, aNbEFs;
1451 aNbVVs = aVVs.Extent();
1452 aNbVEs = aVEs.Extent();
1453 aNbEEs = aEEs.Extent();
1454 aNbVFs = aVFs.Extent();
1455 aNbEFs = aEFs.Extent();
1457 //collect indexes of all shapes from nF1 and nF2.
1458 GetFullFaceMap(nF1, aMIF1);
1459 GetFullFaceMap(nF2, aMIF2);
1460 //collect VV interferences
1461 for(i = 0; i < aNbVVs; ++i) {
1462 const BOPDS_InterfVV& aVV = aVVs(i);
1465 if(aMIF1.Contains(nV1) && aMIF2.Contains(nV2) ||
1466 aMIF1.Contains(nV2) && aMIF2.Contains(nV1)) {
1467 if (aVV.HasIndexNew()) {
1468 nVNew = aVV.IndexNew();
1469 aMVStick.Add(nVNew);
1473 //collect VE interferences
1474 for(i = 0; i < aNbVEs; ++i) {
1475 const BOPDS_InterfVE& aVE = aVEs(i);
1478 if(aMIF1.Contains(nV) && aMIF2.Contains(nE) ||
1479 aMIF1.Contains(nE) && aMIF2.Contains(nV)) {
1483 //collect EE interferences
1484 for(i = 0; i < aNbEEs; ++i) {
1485 const BOPDS_InterfEE& aEE = aEEs(i);
1488 if(aMIF1.Contains(nE1) && aMIF2.Contains(nE2) ||
1489 aMIF1.Contains(nE2) && aMIF2.Contains(nE1)) {
1490 IntTools_CommonPrt aCP = aEE.CommonPart();
1491 if(aCP.Type() == TopAbs_VERTEX) {
1492 nVNew = aEE.IndexNew();
1493 aMVStick.Add(nVNew);
1497 //collect VF interferences
1498 for(i = 0; i < aNbVFs; ++i) {
1499 const BOPDS_InterfVF& aVF = aVFs(i);
1502 if(aMIF1.Contains(nV) && aMIF2.Contains(nF) ||
1503 aMIF1.Contains(nF) && aMIF2.Contains(nV)) {
1507 //collect EF interferences
1508 for(i = 0; i < aNbEFs; ++i) {
1509 const BOPDS_InterfEF& aEF = aEFs(i);
1512 if(aMIF1.Contains(nE) && aMIF2.Contains(nF) ||
1513 aMIF1.Contains(nF) && aMIF2.Contains(nE)) {
1514 IntTools_CommonPrt aCP = aEF.CommonPart();
1515 if(aCP.Type() == TopAbs_VERTEX) {
1516 nVNew = aEF.IndexNew();
1517 aMVStick.Add(nVNew);
1524 //=======================================================================
1525 // function: GetFullFaceMap
1527 //=======================================================================
1528 void BOPAlgo_PaveFiller::GetFullFaceMap(const Standard_Integer nF,
1529 BOPCol_MapOfInteger& aMI)
1531 Standard_Integer nV, nE;
1537 const TopoDS_Face& aF = (*(TopoDS_Face*)(&myDS->Shape(nF)));
1538 TopExp_Explorer anExp(aF, TopAbs_EDGE);
1539 for (; anExp.More(); anExp.Next()) {
1540 aE = (*(TopoDS_Edge *)(&anExp.Current()));
1541 nE = myDS->Index(aE);
1545 TopExp_Explorer anExpV(aF, TopAbs_VERTEX);
1546 for (; anExpV.More(); anExpV.Next()) {
1547 aV = (*(TopoDS_Vertex *)(&anExpV.Current()));
1548 nV = myDS->Index(aV);
1553 //=======================================================================
1554 // function: RemoveUsedVertices
1556 //=======================================================================
1557 void BOPAlgo_PaveFiller::RemoveUsedVertices(BOPDS_Curve& aNC,
1558 BOPCol_MapOfInteger& aMV)
1560 if (!aMV.Extent()) {
1563 Standard_Integer nV;
1565 BOPDS_ListIteratorOfListOfPave aItLP;
1567 Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
1568 const BOPDS_ListOfPave& aLP = aPB->ExtPaves();
1569 aItLP.Initialize(aLP);
1570 for (;aItLP.More();aItLP.Next()) {
1571 aPave = aItLP.Value();
1577 //=======================================================================
1578 //function : PutPaveOnCurve
1580 //=======================================================================
1581 void BOPAlgo_PaveFiller::PutPaveOnCurve(const Standard_Integer nV,
1582 const Standard_Real aTolR3D,
1583 const BOPDS_Curve& aNC,
1584 Handle(BOPDS_PaveBlock)& aPB)
1586 Standard_Boolean bIsVertexOnLine;
1590 const TopoDS_Vertex aV = (*(TopoDS_Vertex *)(&myDS->Shape(nV)));
1591 const IntTools_Curve& aIC = aNC.Curve();
1593 bIsVertexOnLine=myContext->IsVertexOnLine(aV, aIC, aTolR3D, aT);
1594 if (bIsVertexOnLine) {
1596 aPave.SetParameter(aT);
1598 aPB->AppendExtPave(aPave);
1600 BOPTools_AlgoTools::UpdateVertex (aIC, aT, aV);
1602 BOPDS_ShapeInfo& aSIDS=myDS->ChangeShapeInfo(nV);
1603 Bnd_Box& aBoxDS=aSIDS.ChangeBox();
1604 BRepBndLib::Add(aV, aBoxDS);
1608 //=======================================================================
1609 //function : ProcessOldPaveBlocks
1611 //=======================================================================
1612 void BOPAlgo_PaveFiller::ProcessExistingPaveBlocks
1613 (const Standard_Integer theInt,
1614 const BOPDS_MapOfPaveBlock& aMPBOnIn,
1615 BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB,
1616 BOPCol_DataMapOfShapeInteger& aMVI,
1617 const BOPCol_MapOfInteger& aMVB,
1618 BOPDS_MapOfPaveBlock& aMPB)
1620 Standard_Integer nV, nE, iFlag;
1622 BOPCol_MapIteratorOfMapOfInteger aItB;
1623 BOPDS_MapIteratorOfMapOfPaveBlock aItPB;
1625 BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
1626 BOPDS_InterfFF& aFF = aFFs(theInt);
1627 BOPDS_VectorOfCurve& aVC=aFF.ChangeCurves();
1629 aItB.Initialize(aMVB);
1630 for (; aItB.More(); aItB.Next()) {
1632 const BOPDS_ShapeInfo& aSIV=myDS->ShapeInfo(nV);
1633 const Bnd_Box& aBoxV=aSIV.Box();
1634 const TopoDS_Vertex& aV = *(TopoDS_Vertex*)&aSIV.Shape();
1635 if (!aMVI.IsBound(aV)) {
1639 aItPB.Initialize(aMPBOnIn);
1640 for (; aItPB.More(); aItPB.Next()) {
1641 const Handle(BOPDS_PaveBlock)& aPB = aItPB.Value();
1642 if (aPB->Pave1().Index() == nV || aPB->Pave2().Index() == nV) {
1646 if (aMPB.Contains(aPB)) {
1650 const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE);
1651 const Bnd_Box& aBoxE=aSIE.Box();
1653 if (!aBoxV.IsOut(aBoxE)) {
1654 const TopoDS_Edge& aE = *(TopoDS_Edge*)&aSIE.Shape();
1656 iFlag=myContext->ComputeVE (aV, aE, aT);
1660 PreparePostTreatFF(theInt, aPB, aMSCPB, aMVI, aVC);
1667 //=======================================================================
1668 //function : UpdateExistingPaveBlocks
1670 //=======================================================================
1671 void BOPAlgo_PaveFiller::UpdateExistingPaveBlocks
1672 (const Handle(BOPDS_PaveBlock)& aPBf,
1673 BOPDS_ListOfPaveBlock& aLPB,
1674 const Standard_Integer nF1,
1675 const Standard_Integer nF2)
1677 Standard_Integer nE;
1678 Standard_Boolean bCB;
1679 Handle(BOPDS_PaveBlock) aPB, aPB1, aPB2, aPB2n;
1680 Handle(BOPDS_CommonBlock) aCB;
1681 BOPDS_ListIteratorOfListOfPaveBlock aIt, aIt1, aIt2;
1682 BOPDS_IndexedMapOfPaveBlock aMPB;
1684 //remove micro edges from aLPB
1685 aIt.Initialize(aLPB);
1686 for (; aIt.More();) {
1688 const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge());
1689 if (BOPTools_AlgoTools::IsMicroEdge(aE, myContext)) {
1696 if (!aLPB.Extent()) {
1700 myDS->UpdateFaceInfoOn(nF1);
1702 myDS->UpdateFaceInfoOn(nF2);
1704 BOPDS_FaceInfo& aFI1 = myDS->ChangeFaceInfo(nF1);
1705 BOPDS_FaceInfo& aFI2 = myDS->ChangeFaceInfo(nF2);
1707 BOPDS_IndexedMapOfPaveBlock& aMPBOn1 = aFI1.ChangePaveBlocksOn();
1708 BOPDS_IndexedMapOfPaveBlock& aMPBIn1 = aFI1.ChangePaveBlocksIn();
1709 BOPDS_IndexedMapOfPaveBlock& aMPBOn2 = aFI2.ChangePaveBlocksOn();
1710 BOPDS_IndexedMapOfPaveBlock& aMPBIn2 = aFI2.ChangePaveBlocksIn();
1712 // remove old pave blocks
1713 const Handle(BOPDS_CommonBlock)& aCB1 = myDS->CommonBlock(aPBf);
1714 bCB = !aCB1.IsNull();
1715 BOPDS_ListOfPaveBlock aLPB1;
1718 aLPB1.Assign(aCB1->PaveBlocks());
1722 aIt1.Initialize(aLPB1);
1723 for (; aIt1.More(); aIt1.Next()) {
1724 aPB1 = aIt1.Value();
1725 nE = aPB1->OriginalEdge();
1727 BOPDS_ListOfPaveBlock& aLPB2 = myDS->ChangePaveBlocks(nE);
1728 aIt2.Initialize(aLPB2);
1729 for (; aIt2.More(); aIt2.Next()) {
1730 aPB2 = aIt2.Value();
1739 //create new pave blocks
1740 const BOPCol_ListOfInteger& aFaces = aCB1->Faces();
1741 aIt.Initialize(aLPB);
1742 for (; aIt.More(); aIt.Next()) {
1743 Handle(BOPDS_PaveBlock)& aPB = aIt.ChangeValue();
1745 aCB = new BOPDS_CommonBlock;
1746 aIt1.Initialize(aLPB1);
1747 for (; aIt1.More(); aIt1.Next()) {
1748 aPB2 = aIt1.Value();
1749 nE = aPB2->OriginalEdge();
1751 aPB2n = new BOPDS_PaveBlock;
1752 aPB2n->SetPave1(aPB->Pave1());
1753 aPB2n->SetPave2(aPB->Pave2());
1754 aPB2n->SetEdge(aPB->Edge());
1755 aPB2n->SetOriginalEdge(nE);
1756 aCB->AddPaveBlock(aPB2n);
1757 myDS->SetCommonBlock(aPB2n, aCB);
1758 myDS->ChangePaveBlocks(nE).Append(aPB2n);
1760 aCB->AddFaces(aFaces);
1761 myDS->SortPaveBlocks(aCB);
1763 aPB=aCB->PaveBlocks().First();
1767 aIt.Initialize(aLPB);
1768 for (; aIt.More(); aIt.Next()) {
1769 Handle(BOPDS_PaveBlock)& aPB = aIt.ChangeValue();
1770 nE = aPB->OriginalEdge();
1772 Standard_Integer nF = (aMPBOn1.Contains(aPBf) ||
1773 aMPBIn1.Contains(aPBf)) ? nF2 : nF1;
1774 const TopoDS_Face& aF = *(TopoDS_Face*)&myDS->Shape(nF);
1775 IntTools_Range aShrR(aPB->Pave1().Parameter(), aPB->Pave2().Parameter());
1776 const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge());
1778 Standard_Boolean bCom = BOPTools_AlgoTools::IsBlockInOnFace(aShrR, aF, aE, myContext);
1781 aCB = myDS->CommonBlock(aPB);
1784 aCB = new BOPDS_CommonBlock;
1785 aCB->AddPaveBlock(aPB);
1789 myDS->SetCommonBlock(aPB, aCB);
1794 myDS->ChangePaveBlocks(nE).Append(aPB);
1798 Standard_Integer i, aNbPB;
1799 Standard_Boolean bIn1, bIn2;
1801 bIn1 = aMPBOn1.Contains(aPBf) || aMPBIn1.Contains(aPBf);
1802 bIn2 = aMPBOn2.Contains(aPBf) || aMPBIn2.Contains(aPBf);
1804 aNbPB=aMPB.Extent();
1805 for (i=1; i<=aNbPB; ++i) {
1817 //=======================================================================
1818 // function: PutClosingPaveOnCurve
1820 //=======================================================================
1821 void BOPAlgo_PaveFiller::PutClosingPaveOnCurve(BOPDS_Curve& aNC)
1823 Standard_Boolean bIsClosed, bHasBounds, bAdded;
1824 Standard_Integer nVC, j;
1825 Standard_Real aT[2], aTC, dT, aTx;
1828 BOPDS_ListIteratorOfListOfPave aItLP;
1830 const IntTools_Curve& aIC=aNC.Curve();
1831 const Handle(Geom_Curve)& aC3D=aIC.Curve();
1836 bIsClosed=IntTools_Tools::IsClosed(aC3D);
1841 bHasBounds=aIC.HasBounds ();
1846 bAdded=Standard_False;
1847 dT=Precision::PConfusion();
1848 aIC.Bounds (aT[0], aT[1], aP[0], aP[1]);
1850 Handle(BOPDS_PaveBlock)& aPB=aNC.ChangePaveBlock1();
1851 BOPDS_ListOfPave& aLP=aPB->ChangeExtPaves();
1853 aItLP.Initialize(aLP);
1854 for (; aItLP.More() && !bAdded; aItLP.Next()) {
1855 const BOPDS_Pave& aPC=aItLP.Value();
1857 aTC=aPC.Parameter();
1859 for (j=0; j<2; ++j) {
1860 if (fabs(aTC-aT[j]) < dT) {
1861 aTx=(!j) ? aT[1] : aT[0];
1863 aPVx.SetParameter(aTx);
1866 bAdded=Standard_True;
1873 //=======================================================================
1874 //function : PreparePostTreatFF
1876 //=======================================================================
1877 void BOPAlgo_PaveFiller::PreparePostTreatFF
1878 (const Standard_Integer aInt,
1879 const Handle(BOPDS_PaveBlock)& aPB,
1880 BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB,
1881 BOPCol_DataMapOfShapeInteger& aMVI,
1882 BOPDS_VectorOfCurve& aVC)
1884 Standard_Integer nV1, nV2;
1886 Standard_Integer iC=aVC.Append()-1;
1887 BOPDS_ListOfPaveBlock& aLPBC = aVC(iC).ChangePaveBlocks();
1890 aPB->Indices(nV1, nV2);
1891 const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1)));
1892 const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2)));
1893 const TopoDS_Edge& aE = *(TopoDS_Edge*)&myDS->Shape(aPB->Edge());
1894 // Keep info for post treatment
1895 BOPDS_CoupleOfPaveBlocks aCPB;
1896 aCPB.SetIndexInterf(aInt);
1898 aCPB.SetPaveBlock1(aPB);
1900 aMSCPB.Add(aE, aCPB);
1901 aMVI.Bind(aV1, nV1);
1902 aMVI.Bind(aV2, nV2);
1905 //=======================================================================
1906 //function : ToleranceFF
1907 //purpose : Computes the TolFF according to the tolerance value and
1908 // types of the faces.
1909 //=======================================================================
1910 void ToleranceFF(const TopoDS_Face& aF1,
1911 const TopoDS_Face& aF2,
1912 Standard_Real& aTolFF)
1914 Standard_Real aTol1, aTol2;
1915 Standard_Boolean isAna1, isAna2;
1917 aTol1 = BRep_Tool::Tolerance(aF1);
1918 aTol2 = BRep_Tool::Tolerance(aF2);
1919 aTolFF = Max(aTol1, aTol2);
1921 BRepAdaptor_Surface BAS1(aF1);
1922 BRepAdaptor_Surface BAS2(aF2);
1924 isAna1 = (BAS1.GetType() == GeomAbs_Plane ||
1925 BAS1.GetType() == GeomAbs_Cylinder ||
1926 BAS1.GetType() == GeomAbs_Cone ||
1927 BAS1.GetType() == GeomAbs_Sphere ||
1928 BAS1.GetType() == GeomAbs_Torus);
1930 isAna2 = (BAS2.GetType() == GeomAbs_Plane ||
1931 BAS2.GetType() == GeomAbs_Cylinder ||
1932 BAS2.GetType() == GeomAbs_Cone ||
1933 BAS2.GetType() == GeomAbs_Sphere ||
1934 BAS2.GetType() == GeomAbs_Torus);
1936 aTolFF = (isAna1 && isAna2) ? aTolFF : Max(aTolFF, 5.e-6);
1943 BOPDS_DataMapIteratorOfDataMapOfShapeCoupleOfPaveBlocks aItx;
1944 TopoDS_Compound aCx;
1947 aBBx.MakeCompound(aCx);
1949 aItx.Initialize(theMSCPB);
1950 for (; aItx.More(); aItx.Next()) {
1951 const TopoDS_Shape& aSx=aItx.Key();
1955 BRepTools::Write(aCx, "cx");