Salome HOME
52457: Addition of hypotheses is 8 time longer than meshing.
[modules/smesh.git] / src / SMESH / SMESH_HypoFilter.cxx
1 // Copyright (C) 2007-2014  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, or (at your option) any later version.
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 /*!
126  * \brief Finds shapes preferable over _shape due to sub-mesh order
127  */
128 //================================================================================
129
130 void SMESH_HypoFilter::IsMoreLocalThanPredicate::findPreferable()
131 {
132   const int shapeID = _mesh.GetMeshDS()->ShapeToIndex( _shape );
133   const TListOfListOfInt& listOfShapeIDList = _mesh.GetMeshOrder();
134   TListOfListOfInt::const_iterator listsIt = listOfShapeIDList.begin();
135   for ( ; listsIt != listOfShapeIDList.end(); ++listsIt )
136   {
137     const TListOfInt& idList  = *listsIt;
138     TListOfInt::const_iterator idIt =
139       std::find( idList.begin(), idList.end(), shapeID );
140     if ( idIt != idList.end() && *idIt != idList.front() )
141     {
142       for ( ; idIt != idList.end(); --idIt )
143       {
144         const TopoDS_Shape& shape = _mesh.GetMeshDS()->IndexToShape( *idIt );
145         if ( !shape.IsNull())
146           _preferableShapes.Add( shape );
147       }
148     }
149   }
150 }
151
152 //=======================================================================
153 //function : IsMoreLocalThanPredicate::IsOk
154 //purpose  : 
155 //=======================================================================
156
157 bool SMESH_HypoFilter::IsMoreLocalThanPredicate::IsOk(const SMESH_Hypothesis* aHyp,
158                                                       const TopoDS_Shape&     aShape) const
159 {
160   if ( aShape.IsSame( _mesh.GetShapeToMesh() ))
161     return false; // aHyp is global
162
163   if ( SMESH_MesherHelper::IsSubShape( aShape, /*mainShape=*/_shape ))
164     return true;
165
166   if ( aShape.ShapeType() == TopAbs_COMPOUND && 
167        !SMESH_MesherHelper::IsSubShape( _shape, /*mainShape=*/aShape)) // issue 0020963
168   {
169     for ( int type = TopAbs_SOLID; type < TopAbs_SHAPE; ++type )
170       if ( aHyp->GetDim() == SMESH_Gen::GetShapeDim( TopAbs_ShapeEnum( type )))
171         for ( TopExp_Explorer exp( aShape, TopAbs_ShapeEnum( type )); exp.More(); exp.Next())
172           if ( SMESH_MesherHelper::IsSubShape( exp.Current(), /*mainShape=*/_shape ))
173             return true;
174   }
175
176   if ( _preferableShapes.Contains( aShape ))
177     return true; // issue 21559, Mesh_6
178
179   return false;
180 }
181
182 //=======================================================================
183 //function : SMESH_HypoFilter
184 //purpose  : 
185 //=======================================================================
186
187 SMESH_HypoFilter::SMESH_HypoFilter()
188   : myNbPredicates(0)
189 {
190 }
191
192 //=======================================================================
193 //function : SMESH_HypoFilter
194 //purpose  : 
195 //=======================================================================
196
197 SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNegate )
198   : myNbPredicates(0)
199 {
200   add( notNegate ? AND : AND_NOT, aPredicate );
201 }
202
203 //=======================================================================
204 //function : And
205 //purpose  : 
206 //=======================================================================
207
208 SMESH_HypoFilter & SMESH_HypoFilter::And( SMESH_HypoPredicate* aPredicate )
209 {
210   add( AND, aPredicate );
211   return *this;
212 }
213
214 //=======================================================================
215 //function : AndNot
216 //purpose  : 
217 //=======================================================================
218
219 SMESH_HypoFilter & SMESH_HypoFilter::AndNot( SMESH_HypoPredicate* aPredicate )
220 {
221   add( AND_NOT, aPredicate );
222   return *this;
223 }
224
225 //=======================================================================
226 //function : Or
227 //purpose  : 
228 //=======================================================================
229
230 SMESH_HypoFilter & SMESH_HypoFilter::Or( SMESH_HypoPredicate* aPredicate )
231 {
232   add( OR, aPredicate );
233   return *this;
234 }
235
236 //=======================================================================
237 //function : OrNot
238 //purpose  : Return predicates
239 //=======================================================================
240
241 SMESH_HypoFilter & SMESH_HypoFilter::OrNot( SMESH_HypoPredicate* aPredicate )
242 {
243   add( OR_NOT, aPredicate );
244   return *this;
245 }
246
247 //=======================================================================
248 //function : Is
249 //purpose  : 
250 //=======================================================================
251
252 SMESH_HypoPredicate* SMESH_HypoFilter::Is(const SMESH_Hypothesis* theHypo)
253 {
254   return new InstancePredicate( theHypo );
255 }
256
257 //=======================================================================
258 //function : IsAlgo
259 //purpose  : 
260 //=======================================================================
261
262 SMESH_HypoPredicate* SMESH_HypoFilter::IsAlgo()
263 {
264   return new TypePredicate( MORE, SMESHDS_Hypothesis::PARAM_ALGO );
265 }
266
267 //=======================================================================
268 //function : IsAuxiliary
269 //purpose  : 
270 //=======================================================================
271
272 SMESH_HypoPredicate* SMESH_HypoFilter::IsAuxiliary()
273 {
274   return new IsAuxiliaryPredicate();
275 }
276
277
278 //=======================================================================
279 //function : IsGlobal
280 //purpose  : 
281 //=======================================================================
282
283  SMESH_HypoPredicate* SMESH_HypoFilter::IsGlobal(const TopoDS_Shape& theMainShape)
284 {
285   return new IsAssignedToPredicate( theMainShape );
286 }
287
288 //=======================================================================
289 //function : IsAssignedTo
290 //purpose  : 
291 //=======================================================================
292
293  SMESH_HypoPredicate* SMESH_HypoFilter::IsAssignedTo(const TopoDS_Shape& theShape)
294 {
295   return new IsAssignedToPredicate( theShape );
296 }
297
298 //=======================================================================
299 //function : HasName
300 //purpose  : 
301 //=======================================================================
302
303 SMESH_HypoPredicate* SMESH_HypoFilter::HasName(const string & theName)
304 {
305   return new NamePredicate( theName );
306 }
307
308 //=======================================================================
309 //function : HasDim
310 //purpose  : 
311 //=======================================================================
312
313 SMESH_HypoPredicate* SMESH_HypoFilter::HasDim(const int theDim)
314 {
315   return new DimPredicate( EQUAL, theDim );
316 }
317
318 //=======================================================================
319 //function : IsApplicableTo
320 //purpose  : 
321 //=======================================================================
322
323 SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theShape)
324 {
325   return new ApplicablePredicate( theShape );
326 }
327
328 //=======================================================================
329 //function : IsMoreLocalThan
330 //purpose  : 
331 //=======================================================================
332
333 SMESH_HypoPredicate* SMESH_HypoFilter::IsMoreLocalThan(const TopoDS_Shape& theShape,
334                                                        const SMESH_Mesh&   theMesh)
335 {
336   return new IsMoreLocalThanPredicate( theShape, theMesh );
337 }
338
339 //=======================================================================
340 //function : HasType
341 //purpose  : 
342 //=======================================================================
343
344 SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType)
345 {
346   return new TypePredicate( EQUAL, theHypType );
347 }
348
349 //=======================================================================
350 //function : IsOk
351 //purpose  : 
352 //=======================================================================
353
354 bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp,
355                              const TopoDS_Shape&     aShape) const
356 {
357   if ( IsEmpty() )
358     return true;
359
360   bool ok = ( myPredicates[0]->_logical_op <= AND_NOT );
361   for ( int i = 0; i < myNbPredicates; ++i )
362   {
363     bool ok2 = myPredicates[i]->IsOk( aHyp, aShape );
364     switch ( myPredicates[i]->_logical_op ) {
365     case AND:     ok = ok && ok2; break;
366     case AND_NOT: ok = ok && !ok2; break;
367     case OR:      ok = ok || ok2; break;
368     case OR_NOT:  ok = ok || !ok2; break;
369     default:;
370     }
371   }
372   return ok;
373 }
374
375 //=======================================================================
376 //function : Init
377 //purpose  : 
378 //=======================================================================
379
380 SMESH_HypoFilter & SMESH_HypoFilter::Init  ( SMESH_HypoPredicate* aPredicate, bool notNegate )
381 {
382   SMESH_HypoPredicate** pred = &myPredicates[0];
383   SMESH_HypoPredicate** end  = &myPredicates[myNbPredicates];
384   for ( ; pred != end; ++pred )
385     delete *pred;
386   myNbPredicates = 0;
387
388   add( notNegate ? AND : AND_NOT, aPredicate );
389   return *this;
390 }
391
392
393 //=======================================================================
394 //function : IsOk
395 //purpose  : 
396 //=======================================================================
397
398 SMESH_HypoFilter::~SMESH_HypoFilter()
399 {
400   SMESH_HypoPredicate** pred = &myPredicates[0];
401   SMESH_HypoPredicate** end  = &myPredicates[myNbPredicates];
402   for ( ; pred != end; ++pred )
403     delete *pred;
404   myNbPredicates = 0;
405 }
406
407
408