0027067: Avoid use of virtual methods for implementation of destructors in legacy...
[occt.git] / src / TopOpeBRepBuild / TopOpeBRepBuild_Area1dBuilder.cxx
1 // Created on: 1995-12-21
2 // Created by: Jean Yves LEBEY
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Standard_DomainError.hxx>
19 #include <TopAbs.hxx>
20 #include <TopAbs_Orientation.hxx>
21 #include <TopAbs_ShapeEnum.hxx>
22 #include <TopOpeBRepBuild_Area1dBuilder.hxx>
23 #include <TopOpeBRepBuild_Loop.hxx>
24 #include <TopOpeBRepBuild_LoopClassifier.hxx>
25 #include <TopOpeBRepBuild_LoopEnum.hxx>
26 #include <TopOpeBRepBuild_LoopSet.hxx>
27 #include <TopOpeBRepBuild_Pave.hxx>
28 #include <TopOpeBRepBuild_PaveClassifier.hxx>
29 #include <TopOpeBRepBuild_PaveSet.hxx>
30
31 #ifdef OCCT_DEBUG
32 extern Standard_Boolean TopOpeBRepBuild_GettraceAREA();
33 extern Standard_Boolean TopOpeBRepDS_GettraceSTRANGE();
34 #endif
35
36 //=======================================================================
37 //function : DumpList
38 //purpose  : 
39 //=======================================================================
40
41 #ifdef OCCT_DEBUG
42 void TopOpeBRepBuild_Area1dBuilder::DumpList(const TopOpeBRepBuild_ListOfLoop& LOL)
43 {
44   Standard_Integer iLOL;
45   TopOpeBRepBuild_ListIteratorOfListOfLoop  itLOL;
46   for (iLOL = 0, itLOL.Initialize(LOL); itLOL.More(); iLOL++, itLOL.Next()) {
47     if (iLOL) cout<<"               ";
48     else     cout<<"DUMP_AREA    : ";
49     const Handle(TopOpeBRepBuild_Loop)& L = itLOL.Value();
50     L->Dump();cout<<endl;
51   }
52 #else
53 void TopOpeBRepBuild_Area1dBuilder::DumpList(const TopOpeBRepBuild_ListOfLoop&)
54 {
55 #endif
56 }
57
58 //=======================================================================
59 //function : TopOpeBRepBuild_Area1dBuilder
60 //purpose  : 
61 //=======================================================================
62
63 TopOpeBRepBuild_Area1dBuilder::TopOpeBRepBuild_Area1dBuilder()
64 {
65 }
66
67 //=======================================================================
68 //function : TopOpeBRepBuild_Area1dBuilder
69 //purpose  : 
70 //=======================================================================
71
72 TopOpeBRepBuild_Area1dBuilder::TopOpeBRepBuild_Area1dBuilder
73 (TopOpeBRepBuild_PaveSet&        LS,
74  TopOpeBRepBuild_PaveClassifier& LC,
75  const Standard_Boolean ForceClass)
76 {
77    InitAreaBuilder(LS,LC,ForceClass);
78 }
79
80 //=======================================================================
81 //function : InitAreaBuilder
82 //purpose  : 
83 //=======================================================================
84
85 void TopOpeBRepBuild_Area1dBuilder::InitAreaBuilder
86 (TopOpeBRepBuild_LoopSet&        LS,
87  TopOpeBRepBuild_LoopClassifier& LC,
88  const Standard_Boolean ForceClass)
89 {
90   TopAbs_State     state;
91   Standard_Boolean Loopinside;
92   Standard_Boolean loopoutside;
93   
94   TopOpeBRepBuild_ListIteratorOfListOfListOfLoop AreaIter;
95   TopOpeBRepBuild_ListIteratorOfListOfLoop       LoopIter;
96   // boundaryloops : list of boundary loops out of the areas.
97   TopOpeBRepBuild_ListOfLoop                     boundaryloops; 
98   
99   myArea.Clear();          // Clear the list of Area to be built
100   
101   for (LS.InitLoop(); LS.MoreLoop(); LS.NextLoop()) {
102     
103     // process a new loop : L is the new current Loop
104     const Handle(TopOpeBRepBuild_Loop)& L = LS.Loop();
105     Standard_Boolean boundaryL = L->IsShape();
106                 
107 #ifdef OCCT_DEBUG
108     if (TopOpeBRepBuild_GettraceAREA()) {
109       cout<<"++++ new loop : "; L->Dump();
110       if (boundaryL) cout<<" is bound"; else cout<<" is not bound";
111       cout<<endl;
112     }
113 #endif
114
115
116     // L = shape et ForceClass  : on traite L comme un block
117     // L = shape et !ForceClass : on traite L comme un pur shape
118     // L = !shape               : on traite L comme un block
119     Standard_Boolean traitercommeblock = !boundaryL || ForceClass;
120      if ( ! traitercommeblock ) {
121
122       // the loop L is a boundary loop : 
123       // - try to insert it in an existing area, such as L is inside all 
124       //   the block loops. Only block loops of the area are compared. 
125       // - if L could not be inserted, store it in list of boundary loops.
126
127         Loopinside = Standard_False; 
128         for (AreaIter.Initialize(myArea); AreaIter.More(); AreaIter.Next()) {
129         TopOpeBRepBuild_ListOfLoop& aArea = AreaIter.Value();
130         if ( aArea.IsEmpty() ) continue;
131         state = CompareLoopWithListOfLoop(LC,L,aArea,TopOpeBRepBuild_BLOCK);
132         if (state == TopAbs_UNKNOWN) Atomize(state,TopAbs_IN);
133         Loopinside = ( state == TopAbs_IN);
134         if ( Loopinside ) break;
135         } // end of Area scan
136
137          if ( Loopinside ) {
138            TopOpeBRepBuild_ListOfLoop& aArea = AreaIter.Value();
139             ADD_Loop_TO_LISTOFLoop(L,aArea,(void*)("IN, to current area"));
140           }
141           else if ( ! Loopinside ) {
142              ADD_Loop_TO_LISTOFLoop(L,boundaryloops,(void*)("! IN, to boundaryloops"));
143         }
144
145     } // end of boundary loop
146     
147        else { 
148       // the loop L is a block loop
149       // if L is IN theArea :
150       //   - stop area scan, insert L in theArea.
151       //   - remove from the area all the loops outside L
152       //   - make a new area with them, unless they are all boundary
153       //   - if they are all boundary put them back in boundaryLoops
154       // else :
155       //   - create a new area with L.
156       //   - insert boundary loops that are IN the new area
157       //     (and remove them from 'boundaryloops')
158       
159       Loopinside = Standard_False;
160       for (AreaIter.Initialize(myArea); AreaIter.More(); AreaIter.Next() ) {
161         TopOpeBRepBuild_ListOfLoop& aArea = AreaIter.Value();
162         if ( aArea.IsEmpty() ) continue;
163         state = CompareLoopWithListOfLoop(LC,L,aArea,TopOpeBRepBuild_ANYLOOP);
164         if (state == TopAbs_UNKNOWN) Atomize(state,TopAbs_IN);
165         Loopinside = (state == TopAbs_IN);
166         if ( Loopinside ) break;
167       } // end of Area scan
168       
169       if ( Loopinside) {
170         TopOpeBRepBuild_ListOfLoop& aArea = AreaIter.Value();
171         Standard_Boolean allShape = Standard_True;
172         TopOpeBRepBuild_ListOfLoop removedLoops;
173         LoopIter.Initialize(aArea);
174         while (LoopIter.More()) {
175           state = LC.Compare(LoopIter.Value(),L);
176           if (state == TopAbs_UNKNOWN) Atomize(state,TopAbs_IN); // not OUT
177           loopoutside = ( state == TopAbs_OUT );
178           if ( loopoutside ) {
179             const Handle(TopOpeBRepBuild_Loop)& curL = LoopIter.Value();
180             // remove the loop from the area
181             ADD_Loop_TO_LISTOFLoop
182               (curL,removedLoops,(void*)("loopoutside = 1, area = removedLoops"));
183
184             allShape = allShape && curL->IsShape();
185             REM_Loop_FROM_LISTOFLoop
186               (LoopIter,AreaIter.Value(),(void*)("loop of cur. area, cur. area"));
187           }
188           else {
189             LoopIter.Next();
190           }
191         }
192         // insert the loop in the area
193         ADD_Loop_TO_LISTOFLoop(L,aArea,(void*)("area = current"));
194         if ( ! removedLoops.IsEmpty() ) {
195           if ( allShape ) {
196             ADD_LISTOFLoop_TO_LISTOFLoop
197               (removedLoops,boundaryloops,
198                (void*)("allShape = 1"),(void*)("removedLoops"),(void*)("boundaryloops"));
199           }
200       else {
201             // make a new area with the removed loops
202             TopOpeBRepBuild_ListOfLoop thelist;
203             myArea.Append(thelist);
204             ADD_LISTOFLoop_TO_LISTOFLoop
205               (removedLoops,myArea.Last(),
206                (void*)("allShape = 0"),(void*)("removedLoops"),(void*)("new area"));
207           }
208         }
209       } // Loopinside == True
210       
211       else {
212         Standard_Integer ashapeinside,ablockinside;
213         TopOpeBRepBuild_ListOfLoop thelist1;
214         myArea.Append(thelist1);
215         TopOpeBRepBuild_ListOfLoop& newArea0 = myArea.Last();
216         ADD_Loop_TO_LISTOFLoop(L,newArea0,(void*)("new area"));
217         
218         LoopIter.Initialize(boundaryloops);
219         while ( LoopIter.More() ) {
220           ashapeinside = ablockinside = Standard_False;
221           state = LC.Compare(LoopIter.Value(),L);
222           if (state == TopAbs_UNKNOWN) Atomize(state,TopAbs_IN);
223           ashapeinside = (state == TopAbs_IN);
224           if (ashapeinside) {
225             state = LC.Compare(L,LoopIter.Value());
226             if (state == TopAbs_UNKNOWN) Atomize(state,TopAbs_IN);
227             ablockinside = (state == TopAbs_IN);
228           }
229           if ( ashapeinside && ablockinside ) {
230             const Handle(TopOpeBRepBuild_Loop)& curL = LoopIter.Value();
231             ADD_Loop_TO_LISTOFLoop
232               (curL,newArea0,(void*)("ashapeinside && ablockinside, new area"));
233
234             REM_Loop_FROM_LISTOFLoop
235               (LoopIter,boundaryloops,(void*)("loop of boundaryloops, boundaryloops"));
236           }
237           else { 
238             LoopIter.Next();
239           }
240         } // end of boundaryloops scan
241       } // Loopinside == False
242     } // end of block loop
243   } // end of LoopSet LS scan
244   
245 #ifdef OCCT_DEBUG
246   if (TopOpeBRepBuild_GettraceAREA()) {
247     if ( ! myArea.IsEmpty() ) {
248       cout<<"------- Areas -------"<<endl;
249       for (AreaIter.Initialize(myArea);AreaIter.More();AreaIter.Next())
250         DumpList(AreaIter.Value());
251       cout<<"---------------------"<<endl;
252     }
253   }
254 #endif
255   
256  InitArea();
257 }
258
259 //=======================================================================
260 //function : ADD_Loop_TO_LISTOFLoop
261 //purpose  : 
262 //=======================================================================
263
264 void TopOpeBRepBuild_Area1dBuilder::ADD_Loop_TO_LISTOFLoop
265 (const Handle(TopOpeBRepBuild_Loop)& L,
266  TopOpeBRepBuild_ListOfLoop& LOL,
267  const Standard_Address
268 #ifdef OCCT_DEBUG
269   ss
270 #endif
271   ) const
272 {
273   LOL.Append(L);
274   
275 #ifdef OCCT_DEBUG
276   if (TopOpeBRepBuild_GettraceAREA()) {
277     cout<<"--------------------- add area loop to area : ";
278     L->Dump(); cout<<endl;
279     if (ss != NULL) cout<<(char*)ss<<endl;
280     DumpList(LOL);
281     cout<<"---------------------"<<endl;
282   }
283 #endif
284  }
285
286 //=======================================================================
287 //function : REM_Loop_FROM_LISTOFLoop
288 //purpose  : 
289 //=======================================================================
290
291 void TopOpeBRepBuild_Area1dBuilder::REM_Loop_FROM_LISTOFLoop
292 (TopOpeBRepBuild_ListIteratorOfListOfLoop& ITA,
293  TopOpeBRepBuild_ListOfLoop& A,
294 #ifdef OCCT_DEBUG
295  const Standard_Address ss) const
296 {
297   char* s = (char*)ss;
298 #else
299 const Standard_Address) const
300 {
301 #endif
302
303 #ifdef OCCT_DEBUG
304   if (TopOpeBRepBuild_GettraceAREA()) {
305     if (ITA.More()) {
306       cout<<"--------------------- remove area loop from area : ";
307       ITA.Value()->Dump(); cout<<endl;
308       if (s != NULL) cout<<s<<endl;
309     }
310   }
311 #endif
312   
313   A.Remove(ITA);
314   
315 #ifdef OCCT_DEBUG
316   if (TopOpeBRepBuild_GettraceAREA()) {
317     DumpList(A);
318     cout<<"---------------------"<<endl;
319   }
320 #endif
321 }
322
323 //=======================================================================
324 //function : ADD_LISTOFLoop_TO_LISTOFLoop
325 //purpose  : 
326 //=======================================================================
327
328 void TopOpeBRepBuild_Area1dBuilder::ADD_LISTOFLoop_TO_LISTOFLoop
329 (TopOpeBRepBuild_ListOfLoop& A1,
330  TopOpeBRepBuild_ListOfLoop& A2,
331  #ifdef OCCT_DEBUG
332  const Standard_Address ss,
333  const Standard_Address ss1,
334  const Standard_Address ss2) const
335 #else
336  const Standard_Address,
337  const Standard_Address,
338  const Standard_Address) const
339 #endif
340 {
341 #ifdef OCCT_DEBUG
342   char* s  = (char*)ss;
343   char* s1 = (char*)ss1;
344   char* s2 = (char*)ss2;
345
346   if (TopOpeBRepBuild_GettraceAREA()) {
347     cout<<"--------------------- add area 1 to area 2 : ";
348     if (s != NULL) cout<<s;  cout<<endl;
349     cout<<"1 : "; if (s1 != NULL) cout<<s1; cout<<endl;
350     DumpList(A1);
351   }
352 #endif
353   
354   A2.Append(A1);
355   
356 #ifdef OCCT_DEBUG
357   if (TopOpeBRepBuild_GettraceAREA()) {
358     cout<<"2 : "; if (s2 != NULL) cout<<s2; cout<<endl;
359     DumpList(A2);
360     cout<<"---------------------"<<endl;
361   }
362 #endif
363 }
364
365
366
367
368
369
370
371
372