1 // Created by: Peter KURNEV
2 // Copyright (c) 2010-2014 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 // This file is part of Open CASCADE Technology software library.
9 // This library is free software; you can redistribute it and/or modify it under
10 // the terms of the GNU Lesser General Public License version 2.1 as published
11 // by the Free Software Foundation, with special exception defined in the file
12 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
13 // distribution for complete text of the license and disclaimer of any warranty.
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
19 #include <BOPAlgo_Builder.hxx>
20 #include <BOPAlgo_BuilderFace.hxx>
21 #include <BOPAlgo_PaveFiller.hxx>
22 #include <BOPCol_DataMapOfIntegerListOfShape.hxx>
23 #include <BOPCol_DataMapOfShapeShape.hxx>
24 #include <BOPCol_ListOfInteger.hxx>
25 #include <BOPCol_ListOfShape.hxx>
26 #include <BOPCol_MapOfInteger.hxx>
27 #include <BOPCol_NCVector.hxx>
28 #include <BOPCol_Parallel.hxx>
29 #include <BOPDS_DS.hxx>
30 #include <BOPDS_FaceInfo.hxx>
31 #include <BOPDS_Interf.hxx>
32 #include <BOPDS_MapOfPaveBlock.hxx>
33 #include <BOPDS_PaveBlock.hxx>
34 #include <BOPDS_ShapeInfo.hxx>
35 #include <BOPDS_VectorOfCurve.hxx>
36 #include <BOPDS_VectorOfInterfFF.hxx>
37 #include <BOPDS_VectorOfPoint.hxx>
38 #include <BOPTools.hxx>
39 #include <BOPTools_AlgoTools.hxx>
40 #include <BOPTools_AlgoTools2D.hxx>
41 #include <BOPTools_AlgoTools3D.hxx>
42 #include <BOPTools_CoupleOfShape.hxx>
43 #include <BOPTools_DataMapOfShapeSet.hxx>
44 #include <BOPTools_ListOfCoupleOfShape.hxx>
45 #include <BOPTools_MapOfSet.hxx>
46 #include <BRep_Builder.hxx>
47 #include <BRep_Tool.hxx>
48 #include <GeomAdaptor_Surface.hxx>
49 #include <GeomLib.hxx>
50 #include <Precision.hxx>
51 #include <IntTools_Context.hxx>
52 #include <TopExp_Explorer.hxx>
53 #include <TopoDS_Compound.hxx>
54 #include <TopoDS_Edge.hxx>
55 #include <TopoDS_Face.hxx>
56 #include <TopoDS_Shape.hxx>
57 #include <TopoDS_Vertex.hxx>
68 Standard_Boolean HasPaveBlocksOnIn(const BOPDS_FaceInfo& aFI1,
69 const BOPDS_FaceInfo& aFI2);
71 void FillMap(const TopoDS_Shape& aS1,
72 const TopoDS_Shape& aS2,
73 BOPCol_IndexedDataMapOfShapeListOfShape& aDMSLS,
74 Handle(NCollection_BaseAllocator)& aAllocator);
76 void MakeBlocksCnx(const BOPCol_IndexedDataMapOfShapeListOfShape& aMILI,
77 BOPCol_DataMapOfIntegerListOfShape& aMBlocks,
78 Handle(NCollection_BaseAllocator)& aAllocator);
80 typedef BOPCol_NCVector<TopoDS_Shape> BOPAlgo_VectorOfShape;
82 typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> \
83 BOPAlgo_VectorOfVectorOfShape;
85 typedef NCollection_IndexedDataMap\
86 <BOPTools_Set, Standard_Integer, BOPTools_SetMapHasher> \
87 BOPAlgo_IndexedDataMapOfSetInteger;
89 //=======================================================================
90 //class : BOPAlgo_PairOfShapeBoolean
92 //=======================================================================
93 class BOPAlgo_PairOfShapeBoolean : public BOPAlgo_Algo {
98 BOPAlgo_PairOfShapeBoolean() :
100 myFlag(Standard_False) {
103 virtual ~BOPAlgo_PairOfShapeBoolean() {
106 TopoDS_Shape& Shape1() {
110 TopoDS_Shape& Shape2() {
114 Standard_Boolean& Flag() {
118 void SetContext(const Handle(IntTools_Context)& aContext) {
122 const Handle(IntTools_Context)& Context()const {
126 virtual void Perform() {
127 BOPAlgo_Algo::UserBreak();
129 const TopoDS_Face& aFj=*((TopoDS_Face*)&myShape1);
130 const TopoDS_Face& aFk=*((TopoDS_Face*)&myShape2);
131 myFlag=BOPTools_AlgoTools::AreFacesSameDomain(aFj, aFk, myContext);
135 Standard_Boolean myFlag;
136 TopoDS_Shape myShape1;
137 TopoDS_Shape myShape2;
138 Handle(IntTools_Context) myContext;
141 typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> \
142 BOPAlgo_VectorOfPairOfShapeBoolean;
144 typedef BOPCol_ContextFunctor
145 <BOPAlgo_PairOfShapeBoolean,
146 BOPAlgo_VectorOfPairOfShapeBoolean,
147 Handle(IntTools_Context),
148 IntTools_Context> BOPCol_BuilderSDFaceFunctor;
150 typedef BOPCol_ContextCnt
151 <BOPCol_BuilderSDFaceFunctor,
152 BOPAlgo_VectorOfPairOfShapeBoolean,
153 Handle(IntTools_Context)> BOPAlgo_BuilderSDFaceCnt;
155 //=======================================================================
158 typedef BOPCol_NCVector<BOPAlgo_BuilderFace> BOPAlgo_VectorOfBuilderFace;
160 typedef BOPCol_Functor
161 <BOPAlgo_BuilderFace,
162 BOPAlgo_VectorOfBuilderFace> BOPAlgo_BuilderFaceFunctor;
165 <BOPAlgo_BuilderFaceFunctor,
166 BOPAlgo_VectorOfBuilderFace> BOPAlgo_BuilderFaceCnt;
168 //=======================================================================
169 //class : BOPAlgo_VFI
171 //=======================================================================
172 class BOPAlgo_VFI : public BOPAlgo_Algo {
175 DEFINE_STANDARD_ALLOC
182 virtual ~BOPAlgo_VFI(){
185 void SetVertex(const TopoDS_Vertex& aV) {
189 TopoDS_Vertex& Vertex() {
193 void SetFace(const TopoDS_Face& aF) {
197 TopoDS_Face& Face() {
201 Standard_Integer Flag()const {
205 void SetContext(const Handle(IntTools_Context)& aContext) {
209 const Handle(IntTools_Context)& Context()const {
213 virtual void Perform() {
214 Standard_Real aT1, aT2, dummy;
216 BOPAlgo_Algo::UserBreak();
217 myFlag = myContext->ComputeVF(myV, myF, aT1, aT2, dummy);
221 Standard_Integer myFlag;
224 Handle(IntTools_Context) myContext;
227 typedef BOPCol_NCVector<BOPAlgo_VFI> BOPAlgo_VectorOfVFI;
229 typedef BOPCol_ContextFunctor
232 Handle(IntTools_Context),
233 IntTools_Context> BOPAlgo_VFIFunctor;
235 typedef BOPCol_ContextCnt
238 Handle(IntTools_Context)> BOPAlgo_VFICnt;
240 //=======================================================================
241 //function : FillImagesFaces
243 //=======================================================================
244 void BOPAlgo_Builder::FillImagesFaces()
249 FillSameDomainFaces();
252 //=======================================================================
253 //function : BuildSplitFaces
255 //=======================================================================
256 void BOPAlgo_Builder::BuildSplitFaces()
258 Standard_Boolean bHasFaceInfo, bIsClosed, bIsDegenerated, bToReverse;
259 Standard_Integer i, j, k, aNbS, aNbPBIn, aNbPBOn, aNbPBSc, aNbAV, nSp;
261 TopoDS_Face aFF, aFSD;
262 TopoDS_Edge aSp, aEE;
263 TopAbs_Orientation anOriF, anOriE;
264 TopExp_Explorer aExp;
265 BOPCol_ListIteratorOfListOfShape aIt;
266 BOPCol_ListOfInteger aLIAV;
267 BOPCol_MapOfShape aMFence;
268 Handle(NCollection_BaseAllocator) aAllocator;
269 BOPCol_ListOfShape aLFIm(myAllocator);
270 BOPAlgo_VectorOfBuilderFace aVBF;
274 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~scope f
276 NCollection_BaseAllocator::CommonBaseAllocator();
278 BOPCol_ListOfShape aLE(aAllocator);
279 BOPCol_MapOfShape aMDE(100, aAllocator);
281 aNbS=myDS->NbSourceShapes();
283 for (i=0; i<aNbS; ++i) {
284 const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
285 if (aSI.ShapeType()!=TopAbs_FACE) {
289 const TopoDS_Face& aF=(*(TopoDS_Face*)(&aSI.Shape()));
290 Standard_Boolean isUClosed = Standard_False,
291 isVClosed = Standard_False,
292 isChecked = Standard_False;
294 bHasFaceInfo=myDS->HasFaceInfo(i);
299 const BOPDS_FaceInfo& aFI=myDS->FaceInfo(i);
301 const BOPDS_IndexedMapOfPaveBlock& aMPBIn=aFI.PaveBlocksIn();
302 const BOPDS_IndexedMapOfPaveBlock& aMPBOn=aFI.PaveBlocksOn();
303 const BOPDS_IndexedMapOfPaveBlock& aMPBSc=aFI.PaveBlocksSc();
305 myDS->AloneVertices(i, aLIAV);
307 aNbPBIn=aMPBIn.Extent();
308 aNbPBOn=aMPBOn.Extent();
309 aNbPBSc=aMPBSc.Extent();
310 aNbAV=aLIAV.Extent();
311 if (!aNbPBIn && !aNbPBOn && !aNbPBSc && !aNbAV) { // not compete
317 anOriF=aF.Orientation();
319 aFF.Orientation(TopAbs_FORWARD);
321 // 1. Fill the egdes set for the face aFF -> LE
325 // 1.1 Bounding edges
326 aExp.Init(aFF, TopAbs_EDGE);
327 for (; aExp.More(); aExp.Next()) {
328 const TopoDS_Edge& aE=(*(TopoDS_Edge*)(&aExp.Current()));
329 anOriE=aE.Orientation();
331 if (!myImages.IsBound(aE)) {
332 if (anOriE==TopAbs_INTERNAL) {
334 aEE.Orientation(TopAbs_FORWARD);
336 aEE.Orientation(TopAbs_REVERSED);
348 const Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aF);
349 GeomLib::IsClosed(aSurf, BRep_Tool::Tolerance(aE),
350 isUClosed, isVClosed);
352 isChecked = Standard_True;
355 bIsClosed = Standard_False;
357 if((isUClosed || isVClosed) && BRep_Tool::IsClosed(aE, aF))
360 Standard_Boolean isUIso = Standard_False, isVIso = Standard_False;
361 BOPTools_AlgoTools2D::IsEdgeIsoline(aE, aF, isUIso, isVIso);
363 bIsClosed = ((isUClosed && isUIso) || (isVClosed && isVIso));
366 bIsDegenerated=BRep_Tool::Degenerated(aE);
368 const BOPCol_ListOfShape& aLIE=myImages.Find(aE);
369 aIt.Initialize(aLIE);
370 for (; aIt.More(); aIt.Next()) {
371 aSp=(*(TopoDS_Edge*)(&aIt.Value()));
372 if (bIsDegenerated) {
373 aSp.Orientation(anOriE);
378 if (anOriE==TopAbs_INTERNAL) {
379 aSp.Orientation(TopAbs_FORWARD);
381 aSp.Orientation(TopAbs_REVERSED);
387 if (aMFence.Add(aSp)) {
388 if (!BRep_Tool::IsClosed(aSp, aF)){
389 BOPTools_AlgoTools3D::DoSplitSEAMOnFace(aSp, aF);
392 aSp.Orientation(TopAbs_FORWARD);
394 aSp.Orientation(TopAbs_REVERSED);
396 }// if (aMFence.Add(aSp))
400 aSp.Orientation(anOriE);
401 bToReverse=BOPTools_AlgoTools::IsSplitToReverse(aSp, aE, myContext);
406 }// for (; aIt.More(); aIt.Next()) {
407 }// for (; aExp.More(); aExp.Next()) {
411 for (j=1; j<=aNbPBIn; ++j) {
412 const Handle(BOPDS_PaveBlock)& aPB=aMPBIn(j);
414 aSp=(*(TopoDS_Edge*)(&myDS->Shape(nSp)));
416 aSp.Orientation(TopAbs_FORWARD);
418 aSp.Orientation(TopAbs_REVERSED);
424 for (j=1; j<=aNbPBSc; ++j) {
425 const Handle(BOPDS_PaveBlock)& aPB=aMPBSc(j);
427 aSp=(*(TopoDS_Edge*)(&myDS->Shape(nSp)));
429 aSp.Orientation(TopAbs_FORWARD);
431 aSp.Orientation(TopAbs_REVERSED);
435 if (!myPaveFiller->NonDestructive()) {
436 // speed up for planar faces
437 BOPTools_AlgoTools2D::BuildPCurveForEdgesOnPlane (aLE, aFF);
439 // 3 Build split faces
440 BOPAlgo_BuilderFace& aBF=aVBF.Append1();
443 aBF.SetRunParallel(myRunParallel);
444 aBF.SetProgressIndicator(myProgressIndicator);
446 }// for (i=0; i<aNbS; ++i) {
450 //===================================================
451 BOPAlgo_BuilderFaceCnt::Perform(myRunParallel, aVBF);
452 //===================================================
454 for (k=0; k<(Standard_Integer)aNbBF; ++k) {
457 BOPAlgo_BuilderFace& aBF=aVBF(k);
458 TopoDS_Face aF=aBF.Face();
459 anOriF=aBF.Orientation();
460 aF.Orientation(anOriF);
462 const BOPCol_ListOfShape& aLFR=aBF.Areas();
463 aIt.Initialize(aLFR);
464 for (; aIt.More(); aIt.Next()) {
465 TopoDS_Shape& aFR=aIt.ChangeValue();
466 if (anOriF==TopAbs_REVERSED) {
467 aFR.Orientation(TopAbs_REVERSED);
469 //aFR.Orientation(anOriF);
473 mySplits.Bind(aF, aLFIm);
474 }// for (k=0; k<aNbBF; ++k) {
476 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~scope t
478 //=======================================================================
479 //function : FillSameDomainFaces
481 //=======================================================================
482 void BOPAlgo_Builder::FillSameDomainFaces()
484 Standard_Boolean bFlag;
485 Standard_Integer i, j, k, aNbFFs, aNbCurves, aNbPoints, nF1, nF2, aNbS;
486 Handle(NCollection_BaseAllocator) aAllocator;
487 BOPCol_ListIteratorOfListOfShape aItF;
488 BOPCol_MapOfShape aMFence;
489 BOPAlgo_IndexedDataMapOfSetInteger aIDMSS;
490 BOPAlgo_VectorOfVectorOfShape aVVS;
494 const BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
496 aNbFFs=aFFs.Extent();
501 for (i=0; i<aNbFFs; ++i) {
502 const BOPDS_InterfFF& aFF=aFFs(i);
503 aFF.Indices(nF1, nF2);
505 const BOPDS_VectorOfCurve& aCurves=aFF.Curves();
506 aNbCurves=aCurves.Extent();
509 bFlag=Standard_False;
510 for (j=0; j<aNbCurves; ++j) {
511 const BOPDS_Curve& aNC=aCurves.Value(j);
523 const BOPDS_VectorOfPoint& aPoints=aFF.Points();
524 aNbPoints=aPoints.Extent();
529 if (!myDS->HasFaceInfo(nF1) || !myDS->HasFaceInfo(nF2) ) {
533 const BOPDS_FaceInfo& aFI1=myDS->FaceInfo(nF1);
534 const BOPDS_FaceInfo& aFI2=myDS->FaceInfo(nF2);
536 const TopoDS_Shape& aF1=myDS->Shape(nF1);
537 const TopoDS_Shape& aF2=myDS->Shape(nF2);
539 bFlag=HasPaveBlocksOnIn(aFI1, aFI2);
540 bFlag=bFlag && (mySplits.IsBound(aF1) && mySplits.IsBound(aF2));
543 for (k=0; k<2; ++k) {
544 const TopoDS_Shape& aF=(!k) ? aF1 : aF2;
545 const BOPCol_ListOfShape& aLF=mySplits.Find(aF);
547 aItF.Initialize(aLF);
548 for (; aItF.More(); aItF.Next()) {
549 const TopoDS_Shape& aFx=aItF.Value();
551 if (aMFence.Add(aFx)) {
554 aSTx.Add(aFx, TopAbs_EDGE);
556 if (!aIDMSS.Contains(aSTx)) {
557 BOPAlgo_VectorOfShape& aVS=aVVS.Append1();
561 aIDMSS.Add (aSTx, j);
564 j=aIDMSS.ChangeFromKey(aSTx);
565 BOPAlgo_VectorOfShape& aVS=aVVS(j);
573 BOPTools_Set aST1, aST2;
575 aST1.Add(aF1, TopAbs_EDGE);
576 aST2.Add(aF2, TopAbs_EDGE);
578 if (aST1.IsEqual(aST2)) {
579 if (!aIDMSS.Contains(aST1)) {
580 BOPAlgo_VectorOfShape& aVS=aVVS.Append1();
581 if (aMFence.Add(aF1)) {
584 if (aMFence.Add(aF2)) {
589 aIDMSS.Add (aST1, k);
592 k=aIDMSS.ChangeFromKey(aST1);
593 BOPAlgo_VectorOfShape& aVS=aVVS(k);
594 if (aMFence.Add(aF1)) {
597 if (aMFence.Add(aF2)) {
601 }//if (aST1.IsEqual(aST2)) {
602 }// else {// if (!bFlag)
604 }// for (i=0; i<aNbFFs; ++i) {
608 Standard_Boolean bFlagSD;
609 Standard_Integer aNbVPSB, aNbVVS, aNbF, aNbF1;
610 BOPAlgo_VectorOfPairOfShapeBoolean aVPSB;
612 aNbVVS=aVVS.Extent();
613 for (i=0; i<aNbVVS; ++i) {
614 const BOPAlgo_VectorOfShape& aVS=aVVS(i);
621 for (j=0; j<aNbF1; ++j) {
622 const TopoDS_Shape& aFj=aVS(j);
623 for (k=j+1; k<aNbF; ++k) {
624 const TopoDS_Shape& aFk=aVS(k);
625 BOPAlgo_PairOfShapeBoolean& aPSB=aVPSB.Append1();
628 aPSB.SetProgressIndicator(myProgressIndicator);
632 //================================================================
633 BOPAlgo_BuilderSDFaceCnt::Perform(myRunParallel, aVPSB, myContext);
634 //================================================================
636 NCollection_BaseAllocator::CommonBaseAllocator();
637 BOPCol_IndexedDataMapOfShapeListOfShape aDMSLS(100, aAllocator);
638 BOPCol_DataMapOfIntegerListOfShape aMBlocks(100, aAllocator);
640 aNbVPSB=aVPSB.Extent();
641 for (i=0; i<aNbVPSB; ++i) {
642 BOPAlgo_PairOfShapeBoolean& aPSB=aVPSB(i);
645 const TopoDS_Shape& aFj=aPSB.Shape1();
646 const TopoDS_Shape& aFk=aPSB.Shape2();
647 FillMap(aFj, aFk, aDMSLS, aAllocator);
653 MakeBlocksCnx(aDMSLS, aMBlocks, aAllocator);
655 // 3. Fill same domain faces map -> aMSDF
656 aNbS = aMBlocks.Extent();
657 for (i=0; i<aNbS; ++i) {
658 const BOPCol_ListOfShape& aLSD=aMBlocks.Find(i);
659 if (aLSD.IsEmpty()) {
663 const TopoDS_Shape& aFSD1=aLSD.First();
664 aItF.Initialize(aLSD);
665 for (; aItF.More(); aItF.Next()) {
666 const TopoDS_Shape& aFSD=aItF.Value();
667 myShapesSD.Bind(aFSD, aFSD1);
669 // If the face has no splits but are SD face,
670 // it is considered as splitted face
671 if (!mySplits.IsBound(aFSD)) {
672 BOPCol_ListOfShape aLS;
674 mySplits.Bind(aFSD, aLS);
681 //=======================================================================
682 // function: FillImagesFaces1
684 //=======================================================================
685 void BOPAlgo_Builder::FillImagesFaces1()
687 Standard_Integer i, aNbS, iSense, nVx, aNbVFI, iFlag;
691 BOPCol_ListOfInteger aLIAV;
692 BOPCol_ListOfShape aLFIm;
693 BOPCol_ListIteratorOfListOfInteger aItV;
694 BOPCol_ListIteratorOfListOfShape aItLS, aItF;
695 BOPAlgo_VectorOfVFI aVVFI;
697 aNbS=myDS->NbSourceShapes();
698 for (i=0; i<aNbS; ++i) {
699 const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
700 if (aSI.ShapeType()!=TopAbs_FACE) {
704 const TopoDS_Face& aF=(*(TopoDS_Face*)(&aSI.Shape()));
706 if (!mySplits.IsBound(aF)) {
712 myDS->AloneVertices(i, aLIAV);
715 const BOPCol_ListOfShape& aLSp=mySplits.Find(aF);
716 aItLS.Initialize(aLSp);
717 for (; aItLS.More(); aItLS.Next()) {
718 const TopoDS_Face& aFSp=(*(TopoDS_Face*)(&aItLS.Value()));
719 if (!myShapesSD.IsBound(aFSp)) {
723 aFSD=(*(TopoDS_Face*)(&myShapesSD.Find(aFSp)));
724 iSense=BOPTools_AlgoTools::Sense(aFSp, aFSD);
732 //FillInternalVertices(aLFIm, aLIAV);
734 myImages.Bind(aF, aLFIm);
737 aItLS.Initialize(aLFIm);
738 for (; aItLS.More(); aItLS.Next()) {
739 const TopoDS_Face& aFSp=(*(TopoDS_Face*)(&aItLS.Value()));
740 myOrigins.Bind(aFSp, aF);
744 aItV.Initialize(aLIAV);
745 for (; aItV.More(); aItV.Next()) {
747 aVx=(*(TopoDS_Vertex*)(&myDS->Shape(nVx)));
748 aVx.Orientation(TopAbs_INTERNAL);
750 aItF.Initialize(aLFIm);
751 for (; aItF.More(); aItF.Next()) {
752 TopoDS_Face& aFy=(*(TopoDS_Face*)(&aItF.Value()));
754 BOPAlgo_VFI& aVFI=aVVFI.Append1();
757 aVFI.SetProgressIndicator(myProgressIndicator);
760 }// for (i=0; i<aNbS; ++i) {
763 aNbVFI=aVVFI.Extent();
764 //================================================================
765 BOPAlgo_VFICnt::Perform(myRunParallel, aVVFI, myContext);
766 //================================================================
768 for (i=0; i < aNbVFI; ++i) {
769 BOPAlgo_VFI& aVFI=aVVFI(i);
773 TopoDS_Vertex& aVertex=aVFI.Vertex();
774 TopoDS_Face& aFy=aVFI.Face();
775 aBB.Add(aFy, aVertex);
779 //=======================================================================
780 //function : MakeBlocksCnx
782 //=======================================================================
783 void MakeBlocksCnx(const BOPCol_IndexedDataMapOfShapeListOfShape& aMILI,
784 BOPCol_DataMapOfIntegerListOfShape& aMBlocks,
785 Handle(NCollection_BaseAllocator)& aAllocator)
787 Standard_Integer aNbV, aNbVS, aNbVP, aNbEC, k, i, j;
788 BOPCol_ListIteratorOfListOfShape aItLI;
790 BOPCol_MapOfShape aMVS(100, aAllocator);
791 BOPCol_IndexedMapOfShape aMEC(100, aAllocator);
792 BOPCol_IndexedMapOfShape aMVP(100, aAllocator);
793 BOPCol_IndexedMapOfShape aMVAdd(100, aAllocator);
797 for (k=0,i=1; i<=aNbV; ++i) {
803 const TopoDS_Shape& nV=aMILI.FindKey(i);
804 if (aMVS.Contains(nV)){
816 for (j=1; j<=aNbVP; ++j) {
817 const TopoDS_Shape& nVP=aMVP(j);
818 const BOPCol_ListOfShape& aLV=aMILI.FindFromKey(nVP);
819 aItLI.Initialize(aLV);
820 for (; aItLI.More(); aItLI.Next()) {
821 const TopoDS_Shape& nVx=aItLI.Value();
822 if (aMEC.Contains(nVx)) {
832 aNbVP=aMVAdd.Extent();
834 break; // from while(1)
838 for (j=1; j<=aNbVP; ++j) {
844 BOPCol_ListOfShape aLIx(aAllocator);
846 aNbEC = aMEC.Extent();
847 for (j=1; j<=aNbEC; ++j) {
848 const TopoDS_Shape& nVx=aMEC(j);
852 aMBlocks.Bind(k, aLIx);
854 }//for (k=0,i=1; i<=aNbV; ++i)
860 //=======================================================================
863 //=======================================================================
864 void FillMap(const TopoDS_Shape& aS1,
865 const TopoDS_Shape& aS2,
866 BOPCol_IndexedDataMapOfShapeListOfShape& aDMSLS,
867 Handle(NCollection_BaseAllocator)& aAllocator)
869 if (aDMSLS.Contains(aS1)) {
870 BOPCol_ListOfShape& aLS=aDMSLS.ChangeFromKey(aS1);
874 BOPCol_ListOfShape aLS(aAllocator);
876 aDMSLS.Add(aS1, aLS);
879 if (aDMSLS.Contains(aS2)) {
880 BOPCol_ListOfShape& aLS=aDMSLS.ChangeFromKey(aS2);
884 BOPCol_ListOfShape aLS(aAllocator);
886 aDMSLS.Add(aS2, aLS);
889 //=======================================================================
890 //function :HasPaveBlocksOnIn
892 //=======================================================================
893 Standard_Boolean HasPaveBlocksOnIn(const BOPDS_FaceInfo& aFI1,
894 const BOPDS_FaceInfo& aFI2)
896 Standard_Boolean bRet;
897 Standard_Integer i, aNbPB;
900 const BOPDS_IndexedMapOfPaveBlock& aMPBOn1 = aFI1.PaveBlocksOn();
901 const BOPDS_IndexedMapOfPaveBlock& aMPBIn1 = aFI1.PaveBlocksIn();
903 const BOPDS_IndexedMapOfPaveBlock& aMPBOn2 = aFI2.PaveBlocksOn();
904 aNbPB = aMPBOn2.Extent();
905 for (i = 1; i <= aNbPB; ++i) {
906 const Handle(BOPDS_PaveBlock)& aPB = aMPBOn2(i);
907 bRet = aMPBOn1.Contains(aPB) || aMPBIn1.Contains(aPB);
913 const BOPDS_IndexedMapOfPaveBlock& aMPBIn2 = aFI2.PaveBlocksIn();
914 aNbPB = aMPBIn2.Extent();
915 for (i = 1; i <= aNbPB; ++i) {
916 const Handle(BOPDS_PaveBlock)& aPB = aMPBIn2(i);
917 bRet = aMPBOn1.Contains(aPB) || aMPBIn1.Contains(aPB);
930 BOPCol_ListIteratorOfListOfShape aItx;
932 aBBx.MakeCompound(aCx);
934 aItx.Initialize(aLE);
935 for (; aItx.More(); aItx.Next()) {
936 const TopoDS_Shape& aEx=aItx.Value();