Salome HOME
Update copyright
[modules/smesh.git] / src / SMESH / SMESH_HypoFilter.cxx
1 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  SMESH SMESH : implementaion of SMESH idl descriptions
24 //  File   : SMESH_HypoFilter.cxx
25 //  Module : SMESH
26 //
27 #include "SMESH_HypoFilter.hxx"
28
29 #include "SMESH_Gen.hxx"
30 #include "SMESH_Hypothesis.hxx"
31 #include "SMESH_MesherHelper.hxx"
32 #include "SMESH_subMesh.hxx"
33
34 #include <TopExp_Explorer.hxx>
35
36 using namespace std;
37
38
39 //=======================================================================
40 //function : NamePredicate::Value
41 //purpose  : 
42 //=======================================================================
43
44 bool SMESH_HypoFilter::NamePredicate::IsOk (const SMESH_Hypothesis* aHyp,
45                                             const TopoDS_Shape&     /*aShape*/ ) const
46 {
47   return ( _name == aHyp->GetName() );
48 }
49
50 //=======================================================================
51 //function : TypePredicate::Value
52 //purpose  : 
53 //=======================================================================
54
55 int SMESH_HypoFilter::TypePredicate::Value( const SMESH_Hypothesis* aHyp ) const
56 {
57   return aHyp->GetType();
58 };
59
60 //=======================================================================
61 //function : DimPredicate::Value
62 //purpose  : 
63 //=======================================================================
64
65 int SMESH_HypoFilter::DimPredicate::Value( const SMESH_Hypothesis* aHyp ) const
66 {
67   return aHyp->GetDim();
68 }
69
70 //=======================================================================
71 //function : ApplicablePredicate::IsOk
72 //purpose  : 
73 //=======================================================================
74
75 bool SMESH_HypoFilter::ApplicablePredicate::IsOk(const SMESH_Hypothesis* aHyp,
76                                                  const TopoDS_Shape&     /*aShape*/) const
77 {
78   return SMESH_subMesh::IsApplicableHypotesis( aHyp, (TopAbs_ShapeEnum)_shapeType );
79 };
80
81 //=======================================================================
82 //function : IsAuxiliaryPredicate::IsOk
83 //purpose  : 
84 //=======================================================================
85
86 bool SMESH_HypoFilter::IsAuxiliaryPredicate::IsOk(const SMESH_Hypothesis* aHyp,
87                                                   const TopoDS_Shape&     /*aShape*/) const
88 {
89   return aHyp->IsAuxiliary();
90 };
91
92 //=======================================================================
93 //function : ApplicablePredicate::ApplicablePredicate
94 //purpose  : 
95 //=======================================================================
96
97 SMESH_HypoFilter::ApplicablePredicate::ApplicablePredicate( const TopoDS_Shape& theShape )
98 {
99   _shapeType = ( theShape.IsNull() ? TopAbs_SHAPE : theShape.ShapeType());
100 }
101
102 //=======================================================================
103 //function : InstancePredicate::IsOk
104 //purpose  : 
105 //=======================================================================
106
107 bool SMESH_HypoFilter::InstancePredicate::IsOk(const SMESH_Hypothesis* aHyp,
108                                                const TopoDS_Shape&     /*aShape*/) const
109 {
110   return _hypo == aHyp;
111 }
112
113 //=======================================================================
114 //function : IsAssignedToPredicate::IsOk
115 //purpose  : 
116 //=======================================================================
117
118 bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp,
119                                                    const TopoDS_Shape&     aShape) const
120 {
121   return ( !_mainShape.IsNull() && !aShape.IsNull() && _mainShape.IsSame( aShape ));
122 }
123
124 //=======================================================================
125 //function : IsMoreLocalThanPredicate::IsOk
126 //purpose  : 
127 //=======================================================================
128
129 bool SMESH_HypoFilter::IsMoreLocalThanPredicate::IsOk(const SMESH_Hypothesis* aHyp,
130                                                       const TopoDS_Shape&     aShape) const
131 {
132   if ( SMESH_MesherHelper::IsSubShape( aShape, /*mainShape=*/_shape ))
133     return true;
134
135   if ( aShape.ShapeType() == TopAbs_COMPOUND && 
136        !SMESH_MesherHelper::IsSubShape( _shape, /*mainShape=*/aShape)) // issue 0020963
137   {
138     for ( int type = TopAbs_SOLID; type < TopAbs_SHAPE; ++type )
139       if ( aHyp->GetDim() == SMESH_Gen::GetShapeDim( TopAbs_ShapeEnum( type )))
140         for ( TopExp_Explorer exp( aShape, TopAbs_ShapeEnum( type )); exp.More(); exp.Next())
141           if ( SMESH_MesherHelper::IsSubShape( exp.Current(), /*mainShape=*/_shape ))
142             return true;
143   }
144   return false;
145 }
146
147 //=======================================================================
148 //function : SMESH_HypoFilter
149 //purpose  : 
150 //=======================================================================
151
152 SMESH_HypoFilter::SMESH_HypoFilter()
153 {
154 }
155
156 //=======================================================================
157 //function : SMESH_HypoFilter
158 //purpose  : 
159 //=======================================================================
160
161 SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate )
162 {
163   add( notNagate ? AND : AND_NOT, aPredicate );
164 }
165
166 //=======================================================================
167 //function : And
168 //purpose  : 
169 //=======================================================================
170
171 SMESH_HypoFilter & SMESH_HypoFilter::And( SMESH_HypoPredicate* aPredicate )
172 {
173   add( AND, aPredicate );
174   return *this;
175 }
176
177 //=======================================================================
178 //function : AndNot
179 //purpose  : 
180 //=======================================================================
181
182 SMESH_HypoFilter & SMESH_HypoFilter::AndNot( SMESH_HypoPredicate* aPredicate )
183 {
184   add( AND_NOT, aPredicate );
185   return *this;
186 }
187
188 //=======================================================================
189 //function : Or
190 //purpose  : 
191 //=======================================================================
192
193 SMESH_HypoFilter & SMESH_HypoFilter::Or( SMESH_HypoPredicate* aPredicate )
194 {
195   add( OR, aPredicate );
196   return *this;
197 }
198
199 //=======================================================================
200 //function : OrNot
201 //purpose  : Return predicates
202 //=======================================================================
203
204 SMESH_HypoFilter & SMESH_HypoFilter::OrNot( SMESH_HypoPredicate* aPredicate )
205 {
206   add( OR_NOT, aPredicate );
207   return *this;
208 }
209
210 //=======================================================================
211 //function : Is
212 //purpose  : 
213 //=======================================================================
214
215 SMESH_HypoPredicate* SMESH_HypoFilter::Is(const SMESH_Hypothesis* theHypo)
216 {
217   return new InstancePredicate( theHypo );
218 }
219
220 //=======================================================================
221 //function : IsAlgo
222 //purpose  : 
223 //=======================================================================
224
225 SMESH_HypoPredicate* SMESH_HypoFilter::IsAlgo()
226 {
227   return new TypePredicate( MORE, SMESHDS_Hypothesis::PARAM_ALGO );
228 }
229
230 //=======================================================================
231 //function : IsAuxiliary
232 //purpose  : 
233 //=======================================================================
234
235 SMESH_HypoPredicate* SMESH_HypoFilter::IsAuxiliary()
236 {
237   return new IsAuxiliaryPredicate();
238 }
239
240
241 //=======================================================================
242 //function : IsGlobal
243 //purpose  : 
244 //=======================================================================
245
246  SMESH_HypoPredicate* SMESH_HypoFilter::IsGlobal(const TopoDS_Shape& theMainShape)
247 {
248   return new IsAssignedToPredicate( theMainShape );
249 }
250
251 //=======================================================================
252 //function : IsAssignedTo
253 //purpose  : 
254 //=======================================================================
255
256  SMESH_HypoPredicate* SMESH_HypoFilter::IsAssignedTo(const TopoDS_Shape& theShape)
257 {
258   return new IsAssignedToPredicate( theShape );
259 }
260
261 //=======================================================================
262 //function : HasName
263 //purpose  : 
264 //=======================================================================
265
266 SMESH_HypoPredicate* SMESH_HypoFilter::HasName(const string & theName)
267 {
268   return new NamePredicate( theName );
269 }
270
271 //=======================================================================
272 //function : HasDim
273 //purpose  : 
274 //=======================================================================
275
276 SMESH_HypoPredicate* SMESH_HypoFilter::HasDim(const int theDim)
277 {
278   return new DimPredicate( EQUAL, theDim );
279 }
280
281 //=======================================================================
282 //function : IsApplicableTo
283 //purpose  : 
284 //=======================================================================
285
286 SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theShape)
287 {
288   return new ApplicablePredicate( theShape );
289 }
290
291 //=======================================================================
292 //function : IsMoreLocalThan
293 //purpose  : 
294 //=======================================================================
295
296 SMESH_HypoPredicate* SMESH_HypoFilter::IsMoreLocalThan(const TopoDS_Shape& theShape)
297 {
298   return new IsMoreLocalThanPredicate( theShape );
299 }
300
301 //=======================================================================
302 //function : HasType
303 //purpose  : 
304 //=======================================================================
305
306 SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType)
307 {
308   return new TypePredicate( EQUAL, theHypType );
309 }
310
311 //=======================================================================
312 //function : IsOk
313 //purpose  : 
314 //=======================================================================
315
316 bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp,
317                              const TopoDS_Shape&     aShape) const
318 {
319   if ( myPredicates.empty() )
320     return true;
321
322   bool ok = ( myPredicates.front()->_logical_op <= AND_NOT );
323   list<SMESH_HypoPredicate*>::const_iterator pred = myPredicates.begin();
324   for ( ; pred != myPredicates.end(); ++pred )
325   {
326     bool ok2 = (*pred)->IsOk( aHyp, aShape );
327     switch ( (*pred)->_logical_op ) {
328     case AND:     ok = ok && ok2; break;
329     case AND_NOT: ok = ok && !ok2; break;
330     case OR:      ok = ok || ok2; break;
331     case OR_NOT:  ok = ok || !ok2; break;
332     default:;
333     }
334   }
335   return ok;
336 }
337
338 //=======================================================================
339 //function : Init
340 //purpose  : 
341 //=======================================================================
342
343 SMESH_HypoFilter & SMESH_HypoFilter::Init  ( SMESH_HypoPredicate* aPredicate, bool notNagate )
344 {
345   list<SMESH_HypoPredicate*>::const_iterator pred = myPredicates.begin();
346   for ( ; pred != myPredicates.end(); ++pred )
347     delete *pred;
348   myPredicates.clear();
349
350   add( notNagate ? AND : AND_NOT, aPredicate );
351   return *this;
352 }
353
354
355 //=======================================================================
356 //function : IsOk
357 //purpose  : 
358 //=======================================================================
359
360 SMESH_HypoFilter::~SMESH_HypoFilter()
361 {
362   Init(0);
363 }
364
365
366