00ea647db0eb0b41afc8aec1678c131c2ce0fea5
[occt.git] / src / BOPAlgo / BOPAlgo_CheckerSI.cxx
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
6 //
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.
11 //
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.
14 //
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.
21 //
22 #include <BOPAlgo_CheckerSI.ixx>
23
24 #include <BOPDS_DS.hxx>
25 #include <BOPDS_IteratorSI.hxx>
26 #include <BOPDS_PIteratorSI.hxx>
27 #include <BOPInt_Context.hxx>
28
29 #include <BOPDS_Interf.hxx>
30 #include <BOPDS_MapOfPassKey.hxx>
31 #include <BOPDS_PassKey.hxx>
32 #include <BOPDS_VectorOfInterfVV.hxx>
33 #include <BOPDS_VectorOfInterfVE.hxx>
34 #include <BOPDS_VectorOfInterfVE.hxx>
35 #include <BOPDS_VectorOfInterfVF.hxx>
36 #include <BOPDS_VectorOfInterfEF.hxx>
37 #include <BOPDS_VectorOfInterfFF.hxx>
38 #include <BOPDS_VectorOfPoint.hxx>
39 #include <BOPTools_AlgoTools.hxx>
40
41 //=======================================================================
42 //function : 
43 //purpose  : 
44 //=======================================================================
45 BOPAlgo_CheckerSI::BOPAlgo_CheckerSI()
46 :
47   BOPAlgo_PaveFiller(),
48   myLevelOfCheck(5)
49 {
50 }
51 //=======================================================================
52 //function : ~
53 //purpose  : 
54 //=======================================================================
55 BOPAlgo_CheckerSI::~BOPAlgo_CheckerSI()
56 {
57 }
58 //=======================================================================
59 //function : SetLevelOfCheck
60 //purpose  : 
61 //=======================================================================
62 void BOPAlgo_CheckerSI::SetLevelOfCheck(const Standard_Integer theLevel)
63 {
64   if (theLevel >= 0 && theLevel <= 5) {
65     myLevelOfCheck = theLevel;
66   }
67 }
68 //=======================================================================
69 //function : Init
70 //purpose  : 
71 //=======================================================================
72 void BOPAlgo_CheckerSI::Init()
73 {
74   myErrorStatus = 0;
75   //
76   if (!myArguments.Extent()) {
77     myErrorStatus=10;
78     return;
79   }
80   //
81   Clear();
82   //
83   // 1. myDS
84   myDS=new BOPDS_DS(myAllocator);
85   myDS->SetArguments(myArguments);
86   myDS->Init();
87   //
88   // 2.myIterator 
89   BOPDS_PIteratorSI theIterSI=new BOPDS_IteratorSI(myAllocator);
90   theIterSI->SetDS(myDS);
91   theIterSI->Prepare();
92   theIterSI->UpdateByLevelOfCheck(myLevelOfCheck);
93   //
94   myIterator=theIterSI;
95   //
96   // 3 myContext
97   myContext=new BOPInt_Context;
98   //
99   myErrorStatus=0;
100 }
101 //=======================================================================
102 //function : Perform
103 //purpose  : 
104 //=======================================================================
105 void BOPAlgo_CheckerSI::Perform()
106 {
107   BOPAlgo_PaveFiller::Perform();
108   if (myErrorStatus) {
109    return; 
110   }
111   //  
112   PostTreat();  
113 }
114 //=======================================================================
115 //function : PostTreat
116 //purpose  : 
117 //=======================================================================
118 void BOPAlgo_CheckerSI::PostTreat()
119 {
120   Standard_Integer i, aNb, n1, n2; 
121   BOPDS_PassKey aPK;
122   //
123   BOPDS_MapOfPassKey& aMPK=*((BOPDS_MapOfPassKey*)&myDS->Interferences());
124   aMPK.Clear();
125   //
126   // 0
127   BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
128   aNb=aVVs.Extent();
129   for (i=0; i!=aNb; ++i) {
130     const BOPDS_InterfVV& aVV=aVVs(i);
131     aVV.Indices(n1, n2);
132     aPK.SetIds(n1, n2);
133     aMPK.Add(aPK);
134   }
135   //
136   // 1
137   BOPDS_VectorOfInterfVE& aVEs=myDS->InterfVE();
138   aNb=aVEs.Extent();
139   for (i=0; i!=aNb; ++i) {
140     const BOPDS_InterfVE& aVE=aVEs(i);
141     aVE.Indices(n1, n2);
142     aPK.SetIds(n1, n2);
143     aMPK.Add(aPK);
144   }
145   //
146   // 2
147   BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
148   aNb=aEEs.Extent();
149   for (i=0; i!=aNb; ++i) {
150     const BOPDS_InterfEE& aEE=aEEs(i);
151     aEE.Indices(n1, n2);
152     aPK.SetIds(n1, n2);
153     aMPK.Add(aPK);
154   }
155   //
156   // 3
157   BOPDS_VectorOfInterfVF& aVFs=myDS->InterfVF();
158   aNb=aVFs.Extent();
159   for (i=0; i!=aNb; ++i) {
160     const BOPDS_InterfVF& aVF=aVFs(i);
161     aVF.Indices(n1, n2);
162     aPK.SetIds(n1, n2);
163     aMPK.Add(aPK);
164   }
165   //
166   // 4
167   BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
168   aNb=aEFs.Extent();
169   for (i=0; i!=aNb; ++i) {
170     const BOPDS_InterfEF& aEF=aEFs(i);
171     if (aEF.CommonPart().Type()==TopAbs_SHAPE) {
172       continue;
173     }
174     aEF.Indices(n1, n2);
175     aPK.SetIds(n1, n2);
176     aMPK.Add(aPK);
177   }
178   //
179   // 5
180   BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
181   aNb=aFFs.Extent();
182   for (i=0; i!=aNb; ++i) {
183     Standard_Boolean bTangentFaces, bFlag;
184     Standard_Integer aNbC, aNbP, j, iFound;
185     //
186     const BOPDS_InterfFF& aFF=aFFs(i);
187     aFF.Indices(n1, n2);
188     //
189     bTangentFaces=aFF.TangentFaces();
190     aNbP=aFF.Points().Extent();
191     const BOPDS_VectorOfCurve& aVC=aFF.Curves();
192     aNbC=aVC.Extent();
193     if (!aNbP && !aNbC && !bTangentFaces) {
194       continue;
195     }
196     //
197     iFound=0;
198     if (bTangentFaces) {
199       const TopoDS_Face& aF1 = *((TopoDS_Face*)&myDS->Shape(n1));
200       const TopoDS_Face& aF2 = *((TopoDS_Face*)&myDS->Shape(n2));
201       bFlag=BOPTools_AlgoTools::AreFacesSameDomain(aF1, aF2, myContext);
202       if (bFlag) {
203         ++iFound;
204       }
205     }
206     else {
207       for (j=0; j!=aNbC; ++j) {
208         const BOPDS_Curve& aNC=aVC(j);
209         const BOPDS_ListOfPaveBlock& aLPBC=aNC.PaveBlocks();
210         if (aLPBC.Extent()) {
211           ++iFound;
212           break;
213         }
214       }
215     }
216     //
217     if (!iFound) {
218       continue;
219     }
220     //
221     aPK.SetIds(n1, n2);
222     aMPK.Add(aPK);
223   }
224 }