0023024: Update headers of OCCT files
[occt.git] / src / BRepClass3d / BRepClass3d_SolidClassifier.cxx
1 // Created on: 1994-03-30
2 // Created by: Laurent BUCHARD
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23
24 #define MARCHEPASSIUNESEULEFACE 0
25
26
27 #ifdef DEB
28 #define LBRCOMPT 0
29 #else 
30 #define LBRCOMPT 0
31 #endif
32
33 #if LBRCOMPT
34 #include <stdio.h>
35
36 class StatistiquesBRepClass3d { 
37 public:
38   long unsigned NbConstrVide;
39   long unsigned NbLoad;
40   long unsigned NbConstrShape;
41   long unsigned NbConstrShapePnt;
42   long unsigned NbPerform;
43   long unsigned NbPerformRejection;
44   long unsigned NbPerformInfinitePoint;
45   long unsigned NbDestroy;
46 public:
47   StatistiquesBRepClass3d() { 
48     NbConstrVide=NbLoad=NbConstrShape=NbConstrShapePnt=NbPerform=NbPerformInfinitePoint=NbDestroy=0;
49   }
50   ~StatistiquesBRepClass3d() { 
51     printf("\n--- Statistiques BRepClass3d:\n");
52
53     printf("\nConstructeurVide    : %10lu",NbConstrVide);
54     printf("\nConstructeur(Shape) : %10lu",NbConstrShape);
55     printf("\nLoad(Shape)         : %10lu",NbLoad);
56     printf("\nPerform(pnt3d)      : %10lu",NbPerform);
57     printf("\nPerform(pnt3d) REJ  : %10lu",NbPerformRejection);
58     printf("\nPerformInfinitePoint: %10lu",NbPerformInfinitePoint);
59     printf("\nDestroy             : %10lu",NbDestroy             );
60   }
61 };
62
63 static StatistiquesBRepClass3d STAT;
64 #endif
65
66
67
68 #include <BRepClass3d_SolidClassifier.ixx>
69
70 #include <TopoDS_Shape.hxx>
71
72 BRepClass3d_SolidClassifier::BRepClass3d_SolidClassifier()
73 {
74   aSolidLoaded=isaholeinspace=Standard_False;
75 #if LBRCOMPT
76   STAT.NbConstrVide++;
77 #endif
78 }
79
80
81 void BRepClass3d_SolidClassifier::Load(const TopoDS_Shape& S) {
82
83 #if LBRCOMPT
84   STAT.NbLoad++;
85 #endif
86
87   if(aSolidLoaded) { 
88     explorer.Destroy();
89   }
90   explorer.InitShape(S);
91   aSolidLoaded = Standard_True;
92
93
94 #if MARCHEPASSIUNESEULEFACE
95   PerformInfinitePoint(1e-7);
96   if(State()==TopAbs_OUT) { 
97     isaholeinspace=Standard_False;
98   }
99   else { 
100     isaholeinspace=Standard_True;
101   }
102 #endif  
103 }
104
105 BRepClass3d_SolidClassifier::BRepClass3d_SolidClassifier(const TopoDS_Shape& S)
106 :  aSolidLoaded(Standard_True),explorer(S) 
107
108 #if LBRCOMPT
109   STAT.NbConstrShape++;
110 #endif
111 #if MARCHEPASSIUNESEULEFACE
112   PerformInfinitePoint(1e-7);
113   if(State()==TopAbs_OUT) { 
114     isaholeinspace=Standard_False;
115   }
116   else { 
117     isaholeinspace=Standard_True;
118   }
119 #endif  
120 }
121
122 BRepClass3d_SolidClassifier::BRepClass3d_SolidClassifier(const TopoDS_Shape& S,
123                                                          const gp_Pnt&       P,
124                                                          const Standard_Real Tol) 
125 : explorer(S) { 
126 #if LBRCOMPT
127   STAT.NbConstrShapePnt++;
128 #endif
129   aSolidLoaded = Standard_True;
130 #if MARCHEPASSIUNESEULEFACE  
131   PerformInfinitePoint(1e-7);
132   if(State()==TopAbs_OUT) { 
133     isaholeinspace=Standard_False;
134   }
135   else { 
136     isaholeinspace=Standard_True;
137   }
138   
139   if(isaholeinspace==Standard_False) { 
140     if(explorer.Box().IsOut(P)) { 
141       ForceOut(); 
142     }
143     else {
144       Perform(P,Tol); 
145     }
146   }
147   else { 
148     if(explorer.Box().IsOut(P)) { 
149       ForceIn(); 
150     }
151     else {
152       Perform(P,Tol); 
153     }
154   }
155 #else 
156   Perform(P,Tol); 
157 #endif
158 }
159
160
161 void BRepClass3d_SolidClassifier::Perform(const gp_Pnt& P,const Standard_Real Tol) { 
162 #if LBRCOMPT
163   STAT.NbPerform++;
164 #endif
165 #if MARCHEPASSIUNESEULEFACE 
166   if(aSolidLoaded) { 
167     if(isaholeinspace==Standard_False) { 
168       if(explorer.Box().IsOut(P)) { 
169         ForceOut(); 
170 #if LBRCOMPT
171         STAT.NbPerformRejection++;
172 #endif
173         
174       }
175       else {
176         BRepClass3d_SClassifier::Perform(explorer,P,Tol);
177       }
178     }
179     else { 
180       if(explorer.Box().IsOut(P)) { 
181         ForceIn(); 
182 #if LBRCOMPT
183         STAT.NbPerformRejection++;
184 #endif
185         
186       }
187       else {
188         BRepClass3d_SClassifier::Perform(explorer,P,Tol);
189       }
190     }
191   }
192 #else 
193   BRepClass3d_SClassifier::Perform(explorer,P,Tol);
194 #endif
195 }
196
197 void BRepClass3d_SolidClassifier::PerformInfinitePoint(const Standard_Real Tol) { 
198 #if LBRCOMPT
199   STAT.NbPerformInfinitePoint++;
200 #endif
201
202   if(aSolidLoaded) { 
203     BRepClass3d_SClassifier::PerformInfinitePoint(explorer,Tol);
204     if(State()==TopAbs_OUT) 
205       isaholeinspace=Standard_False;
206     else 
207       isaholeinspace=Standard_True;
208   }
209 }
210
211
212
213 void BRepClass3d_SolidClassifier::Destroy() { 
214 #if LBRCOMPT
215   STAT.NbDestroy++;
216 #endif
217
218   if(aSolidLoaded) { 
219     explorer.Destroy();
220     aSolidLoaded = Standard_False;
221   }
222 }
223
224
225