6e727ac2fd5b445df4d2b1f32c38e997110a4e78
[occt.git] / src / BOPDS / BOPDS_Iterator.cxx
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
6 //
7 // This file is part of Open CASCADE Technology software library.
8 //
9 // This library is free software; you can redistribute it and / or modify it
10 // under the terms of the GNU Lesser General Public 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.
14 //
15 // Alternatively, this file may be used under the terms of Open CASCADE
16 // commercial license or contractual agreement.
17
18 #include <BOPDS_Iterator.ixx>
19 //
20 #include <Bnd_Box.hxx>
21 //
22 #include <NCollection_BaseAllocator.hxx>
23 #include <NCollection_UBTreeFiller.hxx>
24 //
25 #include <TopoDS.hxx>
26 #include <TopoDS_Vertex.hxx>
27 #include <TopoDS_Shape.hxx>
28 //
29 #include <BOPCol_IndexedDataMapOfShapeBox.hxx>
30 #include <BOPCol_DataMapOfIntegerInteger.hxx>
31 #include <BOPCol_DataMapOfIntegerMapOfInteger.hxx>
32 #include <BOPCol_MapOfInteger.hxx>
33 //
34 #include <BOPDS_BoxBndTree.hxx>
35 #include <BOPDS_IndexRange.hxx>
36 #include <BOPDS_PassKeyBoolean.hxx>
37 #include <BOPDS_MapOfPassKeyBoolean.hxx>
38 #include <BOPDS_Tools.hxx>
39 #include <BOPDS_MapOfPassKeyBoolean.hxx>
40
41
42 //=======================================================================
43 //function : 
44 //purpose  : 
45 //=======================================================================
46   BOPDS_Iterator::BOPDS_Iterator()
47 :
48   myAllocator(NCollection_BaseAllocator::CommonBaseAllocator())
49 {
50   myDS=NULL; 
51   myLength=0;
52   //
53   myLists.SetStartSize(6);
54   myLists.Init();
55 }
56 //=======================================================================
57 //function : 
58 //purpose  : 
59 //=======================================================================
60   BOPDS_Iterator::BOPDS_Iterator(const Handle(NCollection_BaseAllocator)& theAllocator)
61 :
62   myAllocator(theAllocator),
63   myLists(theAllocator)
64 {
65   myDS=NULL; 
66   myLength=0;
67   //
68   myLists.SetStartSize(6);
69   myLists.Init();
70 }
71 //=======================================================================
72 //function : ~
73 //purpose  : 
74 //=======================================================================
75   BOPDS_Iterator::~BOPDS_Iterator()
76 {
77 }
78 //=======================================================================
79 // function: SetDS
80 // purpose: 
81 //=======================================================================
82   void BOPDS_Iterator::SetDS(const BOPDS_PDS& aDS)
83 {
84   myDS=aDS;
85 }
86 //=======================================================================
87 // function: DS
88 // purpose: 
89 //=======================================================================
90   const BOPDS_DS&  BOPDS_Iterator::DS()const
91 {
92   return *myDS;
93 }
94 //=======================================================================
95 // function: ExpectedLength
96 // purpose: 
97 //=======================================================================
98   Standard_Integer BOPDS_Iterator::ExpectedLength() const
99 {
100   return myLength;
101 }
102 //=======================================================================
103 // function: BlockLength
104 // purpose: 
105 //=======================================================================
106   Standard_Integer BOPDS_Iterator::BlockLength() const
107 {
108   Standard_Integer aNbIIs;
109   Standard_Real aCfPredict=.5;
110   
111   aNbIIs=ExpectedLength();
112   
113   if (aNbIIs<=1) {
114     return 1;
115   }
116   //
117   aNbIIs=(Standard_Integer) (aCfPredict*(Standard_Real)aNbIIs);
118   return aNbIIs;
119 }
120 //=======================================================================
121 // function: Initialize
122 // purpose: 
123 //=======================================================================
124   void BOPDS_Iterator::Initialize(const TopAbs_ShapeEnum aType1,
125                                   const TopAbs_ShapeEnum aType2)
126 {
127   Standard_Integer iX;
128   //
129   myLength=0;
130   iX=BOPDS_Tools::TypeToInteger(aType1, aType2);
131   if (iX>=0) {
132     myIterator.Initialize(myLists(iX));
133     myLength=myLists(iX).Extent();
134   }
135 }
136 //=======================================================================
137 // function: More
138 // purpose: 
139 //=======================================================================
140   Standard_Boolean BOPDS_Iterator::More()const
141 {
142   return myIterator.More();
143 }
144 //=======================================================================
145 // function: Next
146 // purpose: 
147 //=======================================================================
148   void BOPDS_Iterator::Next()
149 {
150   myIterator.Next();
151 }
152 //=======================================================================
153 // function: Value
154 // purpose: 
155 //=======================================================================
156   void BOPDS_Iterator::Value(Standard_Integer& theI1,
157                              Standard_Integer& theI2,
158                              Standard_Boolean& theWithSubShape) const
159 {
160   Standard_Integer iT1, iT2, n1, n2;
161   //
162   const BOPDS_PassKeyBoolean& aPKB=myIterator.Value();
163   aPKB.Ids(n1, n2);
164   //
165   iT1=(Standard_Integer)(myDS->ShapeInfo(n1).ShapeType());
166   iT2=(Standard_Integer)(myDS->ShapeInfo(n2).ShapeType());
167   //
168   theI1=n1;
169   theI2=n2;
170   if (iT1<iT2) {
171     theI1=n2;
172     theI2=n1;
173   }
174   //
175   theWithSubShape=aPKB.Flag();
176 }
177
178 //=======================================================================
179 // function: Prepare
180 // purpose: 
181 //=======================================================================
182   void BOPDS_Iterator::Prepare()
183 {
184   Standard_Integer i;
185   //
186   myLength=0;
187   for (i=0; i<6; ++i) {
188     myLists(i).Clear();
189   }
190   //
191   if (myDS==NULL){
192     return;
193   }
194   Intersect();
195 }
196 //=======================================================================
197 // function: Intersect
198 // purpose: 
199 //=======================================================================
200   void BOPDS_Iterator::Intersect()
201 {
202   Standard_Boolean bFlag;
203   Standard_Integer aNb, i, aNbB, aNbR, iTi, iTj;
204   Standard_Integer i1, i2, aNbSD, iX, j, iDS, jB, iR;
205   TopAbs_ShapeEnum aTi, aTj;
206   Handle(NCollection_IncAllocator) aAllocator;
207   //
208   BOPCol_ListIteratorOfListOfInteger aIt;
209   //
210   //-----------------------------------------------------scope_1 f
211   aAllocator=new NCollection_IncAllocator();
212   //
213   BOPCol_DataMapOfShapeInteger aMSI(100, aAllocator);
214   BOPCol_DataMapOfIntegerInteger aMII(100, aAllocator);
215   BOPDS_MapOfPassKeyBoolean aMPKXB(100, aAllocator);
216   BOPCol_IndexedDataMapOfShapeBox aMSB(100, aAllocator);
217   BOPDS_PassKeyBoolean aPKXB; 
218   //
219   BOPDS_BoxBndTreeSelector aSelector;
220   BOPDS_BoxBndTree aBBTree;
221   NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
222   //
223   aNb=myDS->NbSourceShapes();
224   for (i=0; i<aNb; ++i) {
225     const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
226     if (aSI.HasBRep()) {
227       const TopoDS_Shape& aS=aSI.Shape();
228       const Bnd_Box& aBoxEx=aSI.Box();
229       aMSI.Bind(aS, i);
230       aMSB.Add(aS, aBoxEx);
231     }
232   }
233   //
234   aNbB=aMSB.Extent();
235   for (i=1; i<=aNbB; ++i) {
236     const TopoDS_Shape& aS=aMSB.FindKey(i);
237     const Bnd_Box& aBoxEx=aMSB(i);
238     //
239     aTreeFiller.Add(i, aBoxEx);
240     //
241     iDS=aMSI.Find(aS);
242     aMII.Bind(i, iDS);
243   }
244   //
245   aTreeFiller.Fill();
246   //
247   aNbR=myDS->NbRanges()-1;
248   for (iR=0; iR<aNbR; ++iR) {
249     const BOPDS_IndexRange& aR=myDS->Range(iR);
250     i1=aR.First();
251     i2=aR.Last();
252     for (i=i1; i<=i2; ++i) {
253       const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
254       //
255       if (!aSI.HasBRep()){
256         continue;
257       }
258       //
259       aTi=aSI.ShapeType();
260       const TopoDS_Shape& aSi=aSI.Shape();
261       const Bnd_Box& aBoxEx=aMSB.FindFromKey(aSi);
262       aSelector.Clear();
263       aSelector.SetBox(aBoxEx);
264       //
265       aNbSD=aBBTree.Select(aSelector);
266       if (!aNbSD){
267         continue;
268       }
269       //
270       const Bnd_Box& aBoxi=myDS->ShapeInfo(i).Box();
271       //
272       const BOPCol_ListOfInteger& aLI=aSelector.Indices();
273       aIt.Initialize(aLI);
274       for (; aIt.More(); aIt.Next()) {
275         jB=aIt.Value();  // box index in MII
276         j=aMII.Find(jB); // DS index
277         if (j>=i1 && j<=i2) {
278           continue;// same range
279         }
280         //
281         const BOPDS_ShapeInfo& aSIj=myDS->ShapeInfo(j);
282         aTj=aSIj.ShapeType();
283         iTi=BOPDS_Tools::TypeToInteger(aTi);
284         iTj=BOPDS_Tools::TypeToInteger(aTj);
285         bFlag=Standard_False;
286         if (iTi<iTj) {
287           bFlag=aSI.HasSubShape(j);
288         } 
289         else if (iTj<iTi) {
290            bFlag=aSIj.HasSubShape(i);
291         }
292         if (bFlag) {
293           continue; 
294         }
295         //
296         aPKXB.SetIds(i, j);
297         if (aMPKXB.Add(aPKXB)) {
298           bFlag=Standard_False;// Bounding boxes are intersected
299           const Bnd_Box& aBoxj=myDS->ShapeInfo(j).Box();
300           if (aBoxi.IsOut(aBoxj)) {
301             bFlag=!bFlag; //Bounding boxes of Sub-shapes are intersected
302           }
303           //
304           iX=BOPDS_Tools::TypeToInteger(aTi, aTj);
305           aPKXB.SetFlag(bFlag);
306           myLists(iX).Append(aPKXB);
307         }// if (aMPKXB.Add(aPKXB)) {
308       }// for (; aIt.More(); aIt.Next()) {
309     }//for (i=i1; i<=i2; ++i) {
310   }//for (iR=1; iR<aNbR; ++iR) {
311   //
312   aMSI.Clear();
313   aMII.Clear();
314   aMPKXB.Clear();
315   aMSB.Clear();
316   //
317   aAllocator.Nullify();
318   //-----------------------------------------------------scope_1 t
319 }