0024940: WOK: Cyclic dependency detected between: BOPInt IntTools
[occt.git] / src / BOPAlgo / BOPAlgo_PaveFiller_9.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <BOPAlgo_PaveFiller.ixx>
16 //
17 #include <Bnd_Box.hxx>
18
19 #include <TopoDS_Edge.hxx>
20 #include <TopoDS_Vertex.hxx>
21
22 #include <BOPCol_NCVector.hxx>
23 #include <BOPCol_MapOfInteger.hxx>
24 #include <BOPCol_TBB.hxx>
25
26 #include <BOPDS_ShapeInfo.hxx>
27 #include <BOPDS_PaveBlock.hxx>
28 #include <BOPDS_Iterator.hxx>
29 #include <BOPDS_ListOfPaveBlock.hxx>
30
31 #include <IntTools_ShrunkRange.hxx>
32
33 //=======================================================================
34 //class    : BOPAlgo_ShrunkRange
35 //purpose  : 
36 //=======================================================================
37 class BOPAlgo_ShrunkRange : public IntTools_ShrunkRange {
38  public:
39   BOPAlgo_ShrunkRange() 
40   : IntTools_ShrunkRange(),
41     myWarningStatus(0) {
42   }
43   //
44   virtual ~BOPAlgo_ShrunkRange() {
45   }
46   //
47   void SetPaveBlock(const Handle(BOPDS_PaveBlock)& aPB) {
48     myPB=aPB;
49   }
50   //
51   Handle(BOPDS_PaveBlock)& PaveBlock() {
52     return myPB;
53   }
54   //
55   virtual void Perform() {
56     //
57     myWarningStatus=0;
58     //
59     IntTools_ShrunkRange::Perform();
60     if (myErrorStatus) {
61       myWarningStatus=1;
62     }
63   }
64   //
65   Standard_Integer WarningStatus() const {
66     return myWarningStatus;
67   }
68   //
69  protected:
70   Standard_Integer myWarningStatus;
71   Handle(BOPDS_PaveBlock) myPB;
72 };
73 //
74 //=======================================================================
75 typedef BOPCol_NCVector
76   <BOPAlgo_ShrunkRange> BOPAlgo_VectorOfShrunkRange; 
77 //
78 typedef BOPCol_TBBContextFunctor 
79   <BOPAlgo_ShrunkRange,
80   BOPAlgo_VectorOfShrunkRange,
81   Handle(IntTools_Context), 
82   IntTools_Context> BOPAlgo_ShrunkRangeFunctor;
83 //
84 typedef BOPCol_TBBContextCnt 
85   <BOPAlgo_ShrunkRangeFunctor,
86   BOPAlgo_VectorOfShrunkRange,
87   Handle(IntTools_Context)> BOPAlgo_ShrunkRangeCnt;
88 //
89 //=======================================================================
90 // function: FillShrunkData
91 // purpose: 
92 //=======================================================================
93 void BOPAlgo_PaveFiller::FillShrunkData(const TopAbs_ShapeEnum aType1,
94                                         const TopAbs_ShapeEnum aType2)
95 {
96   Standard_Integer iSize;
97   
98   //
99   myErrorStatus=0;
100   //
101   myIterator->Initialize(aType1, aType2);
102   iSize=myIterator->ExpectedLength();
103   if (!iSize) {
104     return; 
105   }
106   //
107   Standard_Boolean bJustAdd;
108   Standard_Integer i, iEnd, nS[2], nE, nV1, nV2, aNbVSD, k, iWrn;
109   Standard_Real aT1, aT2, aTS1, aTS2;
110   BOPDS_ListIteratorOfListOfPaveBlock aItLPB;
111   BOPCol_MapOfInteger aMI; 
112   BOPAlgo_VectorOfShrunkRange aVSD;
113   //
114   iEnd=(aType2==TopAbs_EDGE) ? 2 : 1;
115   //
116   for (; myIterator->More(); myIterator->Next()) {
117     myIterator->Value(nS[0], nS[1], bJustAdd);
118     if(bJustAdd) {
119       continue;
120     }
121     //
122     for (i=0; i<iEnd; ++i) {
123       nE=nS[i];
124       if (!aMI.Add(nE)) {
125         continue;
126       }
127       //
128       const BOPDS_ShapeInfo& aSIE=myDS->ShapeInfo(nE);
129       if (aSIE.HasFlag()){
130         continue;
131       }
132       //
133       BOPDS_ListOfPaveBlock& aLPB=myDS->ChangePaveBlocks(nE);
134       aItLPB.Initialize(aLPB);
135       for (; aItLPB.More(); aItLPB.Next()) {
136         const Handle(BOPDS_PaveBlock)& aPB=aItLPB.ChangeValue();
137         if (aPB->HasShrunkData()) {
138           continue;
139         }
140         //
141         // FillShrunkData(aPB);
142         aPB->Indices(nV1, nV2);
143         aPB->Range(aT1, aT2);
144         //
145         const TopoDS_Edge& aE=(*(TopoDS_Edge *)(&aSIE.Shape()));
146         //
147         const TopoDS_Vertex& aV1=
148           (*(TopoDS_Vertex *)(&myDS->Shape(nV1))); 
149         //
150         const TopoDS_Vertex& aV2=
151           (*(TopoDS_Vertex *)(&myDS->Shape(nV2))); 
152         //
153         BOPAlgo_ShrunkRange& aSD=aVSD.Append1();
154         //
155         aSD.SetPaveBlock(aPB);
156         aSD.SetData(aE, aT1, aT2, aV1, aV2); 
157       }
158     }
159   }
160   //
161   aNbVSD=aVSD.Extent();
162   //=============================================================
163   BOPAlgo_ShrunkRangeCnt::Perform(myRunParallel, aVSD, myContext);
164   //=============================================================
165   //
166   for (k=0; k < aNbVSD; ++k) {
167     BOPAlgo_ShrunkRange& aSD=aVSD(k);
168     iWrn=aSD.WarningStatus();
169     if (iWrn==1) {
170       continue;
171     }
172     //
173     Handle(BOPDS_PaveBlock)& aPB=aSD.PaveBlock();
174     aSD.ShrunkRange(aTS1, aTS2);
175     const Bnd_Box& aBox=aSD.BndBox();
176     //
177     aPB->SetShrunkData(aTS1, aTS2, aBox);
178   }
179 }