6310364eee9daa659083afc74075e6a6ef9f834d
[occt.git] / src / BOPDS / BOPDS_IteratorSI.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19
20 #include <BOPDS_IteratorSI.ixx>
21
22 #include <TopAbs_ShapeEnum.hxx>
23 #include <gp_Pnt.hxx>
24 #include <Bnd_Box.hxx>
25 //
26 #include <TopoDS_Shape.hxx>
27 #include <TopoDS_Vertex.hxx>
28 #include <TopoDS.hxx>
29 #include <BRep_Tool.hxx>
30
31 #include <NCollection_UBTreeFiller.hxx>
32 #include <BOPDS_BoxBndTree.hxx>
33 #include <BOPDS_IndexRange.hxx>
34 #include <BOPDS_PassKeyBoolean.hxx>
35 #include <BOPDS_MapOfPassKeyBoolean.hxx>
36 #include <BOPDS_DS.hxx>
37
38 #include <BOPCol_IndexedDataMapOfShapeBox.hxx>
39 #include <BOPDS_Tools.hxx>
40 #include <BOPCol_DataMapOfShapeInteger.hxx>
41 #include <BOPCol_DataMapOfIntegerInteger.hxx>
42 #include <BOPCol_DataMapOfIntegerListOfInteger.hxx>
43 #include <BOPCol_IndexedMapOfInteger.hxx>
44 #include <BOPDS_ShapeInfo.hxx>
45 #include <BOPCol_ListOfInteger.hxx>
46 #include <BOPCol_IndexedMapOfInteger.hxx>
47
48 //=======================================================================
49 //function : 
50 //purpose  : 
51 //=======================================================================
52   BOPDS_IteratorSI::BOPDS_IteratorSI()
53 :
54   BOPDS_Iterator()
55 {
56 }
57 //=======================================================================
58 //function : 
59 //purpose  : 
60 //=======================================================================
61   BOPDS_IteratorSI::BOPDS_IteratorSI(const Handle(NCollection_BaseAllocator)& theAllocator)
62 :
63   BOPDS_Iterator(theAllocator)
64 {
65 }
66 //=======================================================================
67 //function : ~
68 //purpose  : 
69 //=======================================================================
70   BOPDS_IteratorSI::~BOPDS_IteratorSI()
71 {
72 }
73 //=======================================================================
74 // function: Intersect
75 // purpose: 
76 //=======================================================================
77   void BOPDS_IteratorSI::Intersect()
78 {
79   Standard_Boolean bFlag;
80   Standard_Integer aNbS, i, aNbB;//, iFlag, aNbLV, aNbA
81   Standard_Integer aNbSD, iX, j, iDS, jB, k;;
82   TopAbs_ShapeEnum aTi, aTj;
83   Handle(NCollection_IncAllocator) aAllocator;
84   BOPCol_ListIteratorOfListOfInteger aIt;
85   BOPCol_DataMapIteratorOfDataMapOfIntegerListOfInteger aItVSD;
86   //
87   //-----------------------------------------------------scope_1 f
88   aAllocator=new NCollection_IncAllocator();
89   //
90   BOPCol_DataMapOfShapeInteger aMSI(100, aAllocator);
91   BOPCol_DataMapOfIntegerInteger aMII(100, aAllocator);
92   BOPDS_MapOfPassKeyBoolean aMPA(100, aAllocator);
93   BOPDS_MapOfPassKeyBoolean aMPKXB(100, aAllocator);
94   BOPCol_IndexedDataMapOfShapeBox aMSB(100, aAllocator);
95   BOPDS_PassKeyBoolean aPKXB; 
96   //
97   BOPDS_BoxBndTreeSelector aSelector;
98   BOPDS_BoxBndTree aBBTree;
99   NCollection_UBTreeFiller <Standard_Integer, Bnd_Box> aTreeFiller(aBBTree);
100   //
101   // myPairsAvoid, aMSI, aMSB
102   aNbS=myDS->NbSourceShapes();
103   for (i=0; i<aNbS; ++i) {
104     const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
105     //
106     if (aSI.HasBRep()) {
107       const TopoDS_Shape& aSi=aSI.Shape();
108       aTi=aSI.ShapeType();
109       if (aTi!=TopAbs_VERTEX) {
110         const BOPCol_ListOfInteger& aLA=aSI.SubShapes();
111         aIt.Initialize(aLA);
112         for (; aIt.More(); aIt.Next()) {
113           iX=aIt.Value();
114           aPKXB.Clear();
115           aPKXB.SetIds(i, iX);
116           aMPA.Add(aPKXB);
117         }
118       }
119       //
120       aPKXB.Clear();
121       aPKXB.SetIds(i, i);
122       aMPA.Add(aPKXB);
123       //
124       const Bnd_Box& aBoxEx=aSI.Box();
125       //
126       aMSI.Bind(aSi, i);
127       aMSB.Add(aSi, aBoxEx);
128     }
129   } // for (i=0; i<aNbS; ++i) {
130   // 
131   // aMII
132   aNbB=aMSB.Extent();
133   for (i=1; i<=aNbB; ++i) {
134     const TopoDS_Shape& aS=aMSB.FindKey(i);
135     const Bnd_Box& aBoxEx=aMSB(i);
136     //
137     aTreeFiller.Add(i, aBoxEx);
138     //
139     iDS=aMSI.Find(aS);
140     aMII.Bind(i, iDS);
141   }
142   //
143   aTreeFiller.Fill();
144   //
145   for (i=0; i<aNbS; ++i) {
146     const BOPDS_ShapeInfo& aSI=myDS->ShapeInfo(i);
147     aTi=aSI.ShapeType();
148     if (!aSI.HasBRep()){
149       continue;
150     }
151     //
152     const TopoDS_Shape& aSi=myDS->Shape(i);
153     aTi=aSi.ShapeType();
154     const Bnd_Box& aBoxEx=aMSB.FindFromKey(aSi);
155     aSelector.Clear();
156     aSelector.SetBox(aBoxEx);
157     //
158     aNbSD=aBBTree.Select(aSelector);
159     if (!aNbSD){
160       continue;
161     }
162     //
163     const BOPCol_ListOfInteger& aLI=aSelector.Indices();
164     //
165     k=0;
166     //
167     aIt.Initialize(aLI);
168     for (; aIt.More(); aIt.Next()) {
169       jB=aIt.Value();  // box index in MII
170       j=aMII.Find(jB); // DS index
171       //
172       aPKXB.SetIds(i, j);
173       if (aMPA.Contains(aPKXB)) {
174         continue;
175       }
176       //
177       if (aMPKXB.Add(aPKXB)) {
178         bFlag=Standard_False;// Bounding boxes are intersected
179         const Bnd_Box& aBoxi=myDS->ShapeInfo(i).Box();
180         const Bnd_Box& aBoxj=myDS->ShapeInfo(j).Box();
181         if (aBoxi.IsOut(aBoxj)) {
182           bFlag=!bFlag; //Bounding boxes of Sub-shapes are intersected
183         }
184         aTj=myDS->ShapeInfo(j).ShapeType();//
185         iX=BOPDS_Tools::TypeToInteger(aTi, aTj);
186         aPKXB.SetFlag(bFlag);
187         myLists(iX).Append(aPKXB);
188       }// if (aMPKXB.Add(aPKXB)) {
189     }// for (; aIt.More(); aIt.Next()) {
190   }//for (i=1; i<=aNbS; ++i) {
191   //
192   aMSI.Clear();
193   aMII.Clear();
194   aMPA.Clear();
195   aMPKXB.Clear();
196   aMSB.Clear();
197   //
198   aAllocator.Nullify();
199   //-----------------------------------------------------scope_1 t
200 }
201
202 //=======================================================================
203 // function: UpdateByLevelOfCheck
204 // purpose: 
205 //=======================================================================
206   void BOPDS_IteratorSI::UpdateByLevelOfCheck(const Standard_Integer theLevel)
207 {
208   Standard_Integer i;
209   //
210   for (i=theLevel+1; i<6; ++i) {
211     myLists(i).Clear();
212   }
213 }