0024492: The command bopargcheck produces wrong results for cases.
[occt.git] / src / BOPAlgo / BOPAlgo_CheckerSI.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 //
19 #include <BOPAlgo_CheckerSI.ixx>
20
21 #include <Standard_ErrorHandler.hxx>
22 #include <Standard_Failure.hxx>
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 {
49   myLevelOfCheck=BOPDS_DS::NbInterfTypes()-1;
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   Standard_Integer aNbLists;
65   //
66   aNbLists=BOPDS_DS::NbInterfTypes();
67   if (theLevel >= 0 && theLevel < aNbLists) {
68     myLevelOfCheck = theLevel;
69   }
70 }
71 //=======================================================================
72 //function : Init
73 //purpose  : 
74 //=======================================================================
75 void BOPAlgo_CheckerSI::Init()
76 {
77   myErrorStatus = 0;
78   //
79   if (!myArguments.Extent()) {
80     myErrorStatus=10;
81     return;
82   }
83   //
84   Clear();
85   //
86   // 1. myDS
87   myDS=new BOPDS_DS(myAllocator);
88   myDS->SetArguments(myArguments);
89   myDS->Init();
90   //
91   // 2.myIterator 
92   BOPDS_PIteratorSI theIterSI=new BOPDS_IteratorSI(myAllocator);
93   theIterSI->SetDS(myDS);
94   theIterSI->Prepare();
95   theIterSI->UpdateByLevelOfCheck(myLevelOfCheck);
96   //
97   myIterator=theIterSI;
98   //
99   // 3 myContext
100   myContext=new BOPInt_Context;
101   //
102   myErrorStatus=0;
103 }
104 //=======================================================================
105 //function : Perform
106 //purpose  : 
107 //=======================================================================
108 void BOPAlgo_CheckerSI::Perform()
109 {
110   
111   try {
112     OCC_CATCH_SIGNALS
113     //
114     BOPAlgo_PaveFiller::Perform();
115     if (myErrorStatus) {
116       return; 
117     }
118     //
119     PerformVZ();
120     if (myErrorStatus) {
121       return; 
122     }
123     //
124     PerformEZ();
125     if (myErrorStatus) {
126       return; 
127     } 
128     //
129     PerformFZ();
130     if (myErrorStatus) {
131       return; 
132     }
133     //
134     PerformZZ();
135     if (myErrorStatus) {
136       return; 
137     }
138     //
139     PostTreat();
140   }
141   catch (Standard_Failure) {
142   }  
143   
144 }
145 //=======================================================================
146 //function : PostTreat
147 //purpose  : 
148 //=======================================================================
149 void BOPAlgo_CheckerSI::PostTreat()
150 {
151   Standard_Integer i, aNb, n1, n2; 
152   BOPDS_PassKey aPK;
153   //
154   BOPDS_MapOfPassKey& aMPK=*((BOPDS_MapOfPassKey*)&myDS->Interferences());
155   aMPK.Clear();
156   //
157   // 0
158   BOPDS_VectorOfInterfVV& aVVs=myDS->InterfVV();
159   aNb=aVVs.Extent();
160   for (i=0; i!=aNb; ++i) {
161     const BOPDS_InterfVV& aVV=aVVs(i);
162     aVV.Indices(n1, n2);
163     aPK.SetIds(n1, n2);
164     aMPK.Add(aPK);
165   }
166   //
167   // 1
168   BOPDS_VectorOfInterfVE& aVEs=myDS->InterfVE();
169   aNb=aVEs.Extent();
170   for (i=0; i!=aNb; ++i) {
171     const BOPDS_InterfVE& aVE=aVEs(i);
172     aVE.Indices(n1, n2);
173     aPK.SetIds(n1, n2);
174     aMPK.Add(aPK);
175   }
176   //
177   // 2
178   BOPDS_VectorOfInterfEE& aEEs=myDS->InterfEE();
179   aNb=aEEs.Extent();
180   for (i=0; i!=aNb; ++i) {
181     const BOPDS_InterfEE& aEE=aEEs(i);
182     aEE.Indices(n1, n2);
183     aPK.SetIds(n1, n2);
184     aMPK.Add(aPK);
185   }
186   //
187   // 3
188   BOPDS_VectorOfInterfVF& aVFs=myDS->InterfVF();
189   aNb=aVFs.Extent();
190   for (i=0; i!=aNb; ++i) {
191     const BOPDS_InterfVF& aVF=aVFs(i);
192     aVF.Indices(n1, n2);
193     aPK.SetIds(n1, n2);
194     aMPK.Add(aPK);
195   }
196   //
197   // 4
198   BOPDS_VectorOfInterfEF& aEFs=myDS->InterfEF();
199   aNb=aEFs.Extent();
200   for (i=0; i!=aNb; ++i) {
201     const BOPDS_InterfEF& aEF=aEFs(i);
202     if (aEF.CommonPart().Type()==TopAbs_SHAPE) {
203       continue;
204     }
205     aEF.Indices(n1, n2);
206     aPK.SetIds(n1, n2);
207     aMPK.Add(aPK);
208   }
209   //
210   // 5
211   BOPDS_VectorOfInterfFF& aFFs=myDS->InterfFF();
212   aNb=aFFs.Extent();
213   for (i=0; i!=aNb; ++i) {
214     Standard_Boolean bTangentFaces, bFlag;
215     Standard_Integer aNbC, aNbP, j, iFound;
216     //
217     const BOPDS_InterfFF& aFF=aFFs(i);
218     aFF.Indices(n1, n2);
219     //
220     bTangentFaces=aFF.TangentFaces();
221     aNbP=aFF.Points().Extent();
222     const BOPDS_VectorOfCurve& aVC=aFF.Curves();
223     aNbC=aVC.Extent();
224     if (!aNbP && !aNbC && !bTangentFaces) {
225       continue;
226     }
227     //
228     iFound=0;
229     if (bTangentFaces) {
230       const TopoDS_Face& aF1 = *((TopoDS_Face*)&myDS->Shape(n1));
231       const TopoDS_Face& aF2 = *((TopoDS_Face*)&myDS->Shape(n2));
232       bFlag=BOPTools_AlgoTools::AreFacesSameDomain(aF1, aF2, myContext);
233       if (bFlag) {
234         ++iFound;
235       }
236     }
237     else {
238       for (j=0; j!=aNbC; ++j) {
239         const BOPDS_Curve& aNC=aVC(j);
240         const BOPDS_ListOfPaveBlock& aLPBC=aNC.PaveBlocks();
241         if (aLPBC.Extent()) {
242           ++iFound;
243           break;
244         }
245       }
246     }
247     //
248     if (!iFound) {
249       continue;
250     }
251     //
252     aPK.SetIds(n1, n2);
253     aMPK.Add(aPK);
254   }
255   //
256   //
257   // 6
258   BOPDS_VectorOfInterfVZ& aVZs=myDS->InterfVZ();
259   aNb=aVZs.Extent();
260   for (i=0; i!=aNb; ++i) {
261     //
262     const BOPDS_InterfVZ& aVZ=aVZs(i);
263     aVZ.Indices(n1, n2);
264     aPK.SetIds(n1, n2);
265     aMPK.Add(aPK);
266   }
267   //
268   // 7
269   BOPDS_VectorOfInterfEZ& aEZs=myDS->InterfEZ();
270   aNb=aEZs.Extent();
271   for (i=0; i!=aNb; ++i) {
272     //
273     const BOPDS_InterfEZ& aEZ=aEZs(i);
274     aEZ.Indices(n1, n2);
275     aPK.SetIds(n1, n2);
276     aMPK.Add(aPK);
277   }
278   //
279   // 8
280   BOPDS_VectorOfInterfFZ& aFZs=myDS->InterfFZ();
281   aNb=aFZs.Extent();
282   for (i=0; i!=aNb; ++i) {
283     //
284     const BOPDS_InterfFZ& aFZ=aFZs(i);
285     aFZ.Indices(n1, n2);
286     aPK.SetIds(n1, n2);
287     aMPK.Add(aPK);
288   }
289   //
290   // 9
291   BOPDS_VectorOfInterfZZ& aZZs=myDS->InterfZZ();
292   aNb=aZZs.Extent();
293   for (i=0; i!=aNb; ++i) {
294     //
295     const BOPDS_InterfZZ& aZZ=aZZs(i);
296     aZZ.Indices(n1, n2);
297     aPK.SetIds(n1, n2);
298     aMPK.Add(aPK);
299   }
300 }