Salome HOME
Update copyright information
[modules/smesh.git] / src / SMESH / SMESH_HypoFilter.hxx
1 // Copyright (C) 2007-2012  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.hxx
25 //  Module : SMESH
26 //
27 #ifndef SMESH_HypoFilter_HeaderFile
28 #define SMESH_HypoFilter_HeaderFile
29
30 #include "SMESH_SMESH.hxx"
31
32 // ===========================
33 // Filter of SMESH_Hypothesis
34 // ===========================
35
36 #include <list>
37 #include <string>
38 #include <TopoDS_Shape.hxx>
39
40 class SMESH_HypoFilter;
41 class SMESH_Hypothesis;
42
43 class SMESH_EXPORT SMESH_HypoPredicate {
44  public:
45   virtual bool IsOk(const SMESH_Hypothesis* aHyp,
46                     const TopoDS_Shape&     aShape) const = 0;
47   // check aHyp or/and aShape it is assigned to
48   virtual ~SMESH_HypoPredicate() {}
49  private:
50   int _logical_op;
51   friend class SMESH_HypoFilter;
52 };
53
54 class SMESH_EXPORT SMESH_HypoFilter: public SMESH_HypoPredicate
55 {
56  public:
57   // Create and add predicates.
58   // Added predicates will be destroyed by filter when it dies
59   SMESH_HypoFilter();
60   SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate = true );
61   // notNagate==false means !aPredicate->IsOk()
62   SMESH_HypoFilter & Init  ( SMESH_HypoPredicate* aPredicate, bool notNagate = true );
63   SMESH_HypoFilter & And   ( SMESH_HypoPredicate* aPredicate );
64   SMESH_HypoFilter & AndNot( SMESH_HypoPredicate* aPredicate );
65   SMESH_HypoFilter & Or    ( SMESH_HypoPredicate* aPredicate );
66   SMESH_HypoFilter & OrNot ( SMESH_HypoPredicate* aPredicate );
67
68   // Create predicates
69   static SMESH_HypoPredicate* IsAlgo();
70   static SMESH_HypoPredicate* IsAuxiliary();
71   static SMESH_HypoPredicate* IsApplicableTo(const TopoDS_Shape& theShape);
72   static SMESH_HypoPredicate* IsAssignedTo(const TopoDS_Shape& theShape);
73   static SMESH_HypoPredicate* Is(const SMESH_Hypothesis* theHypo);
74   static SMESH_HypoPredicate* IsGlobal(const TopoDS_Shape& theMainShape);
75   static SMESH_HypoPredicate* IsMoreLocalThan(const TopoDS_Shape& theShape,
76                                               const TopoDS_Shape& theShapeToMesh);
77   static SMESH_HypoPredicate* HasName(const std::string & theName);
78   static SMESH_HypoPredicate* HasDim(const int theDim);
79   static SMESH_HypoPredicate* HasType(const int theHypType);
80
81   bool IsEmpty() const { return myPredicates.empty(); }
82
83   /*!
84    * \brief check aHyp or/and aShape it is assigned to
85    */
86   bool IsOk (const SMESH_Hypothesis* aHyp,
87              const TopoDS_Shape&     aShape) const;
88   /*!
89    * \brief return true if contains no predicates
90    */
91   bool IsAny() const { return myPredicates.empty(); }
92
93   ~SMESH_HypoFilter();
94
95
96  protected:
97   // fields
98
99   std::list<SMESH_HypoPredicate*> myPredicates;
100
101   // private methods
102
103   enum Logical { AND, AND_NOT, OR, OR_NOT };
104   enum Comparison { EQUAL, NOT_EQUAL, MORE, LESS };
105
106   SMESH_HypoFilter(const SMESH_HypoFilter& other){}
107
108   void add( Logical bool_op, SMESH_HypoPredicate* pred )
109   {
110     if ( pred ) {
111       pred->_logical_op = bool_op;
112       myPredicates.push_back( pred );
113     }
114   }
115
116   // predicates implementation
117
118   template <typename TValue>
119     struct templPredicate: public SMESH_HypoPredicate {
120       Comparison _comp;
121       TValue     _val;
122       virtual TValue Value(const SMESH_Hypothesis* aHyp) const = 0;
123       virtual bool IsOk(const SMESH_Hypothesis* aHyp, const TopoDS_Shape& ) const
124       {
125         if      ( _comp == EQUAL )     return _val == Value( aHyp );
126         else if ( _comp == NOT_EQUAL ) return _val != Value( aHyp );
127         else if ( _comp == MORE )      return _val < Value( aHyp );
128         else                           return _val > Value( aHyp );
129       }
130     };
131
132   struct NamePredicate : public SMESH_HypoPredicate {
133     std::string _name;
134     NamePredicate( std::string name ): _name(name){}
135     bool IsOk(const SMESH_Hypothesis* aHyp,
136               const TopoDS_Shape&     aShape) const;
137   };
138   
139   struct TypePredicate : public templPredicate< int > {
140     TypePredicate( Comparison comp, int hypType )
141     { _comp = comp; _val = hypType; }
142     int Value( const SMESH_Hypothesis* aHyp ) const;
143   };
144   
145   struct DimPredicate : public templPredicate< int > {
146     DimPredicate( Comparison comp, int dim )
147     { _comp = comp; _val = dim; }
148     int Value( const SMESH_Hypothesis* aHyp ) const;
149   };
150   
151   struct ApplicablePredicate : public SMESH_HypoPredicate {
152     int _shapeType;
153     ApplicablePredicate( const TopoDS_Shape& theShape );
154     bool IsOk(const SMESH_Hypothesis* aHyp,
155               const TopoDS_Shape&     aShape) const;
156   };
157         
158   struct InstancePredicate : public SMESH_HypoPredicate {
159     const SMESH_Hypothesis* _hypo;
160     InstancePredicate( const SMESH_Hypothesis* hypo ):_hypo(hypo){}
161     bool IsOk(const SMESH_Hypothesis* aHyp,
162               const TopoDS_Shape&     aShape) const;
163   };
164         
165   struct IsAssignedToPredicate : public SMESH_HypoPredicate {
166     TopoDS_Shape _mainShape;
167     IsAssignedToPredicate( const TopoDS_Shape& mainShape ):_mainShape(mainShape){}
168     bool IsOk(const SMESH_Hypothesis* aHyp,
169               const TopoDS_Shape&     aShape) const;
170   };
171         
172   struct IsMoreLocalThanPredicate : public SMESH_HypoPredicate {
173     TopoDS_Shape _shape, _shapeToMesh;
174     IsMoreLocalThanPredicate( const TopoDS_Shape& shape,
175                               const TopoDS_Shape& shapeToMesh )
176       :_shape(shape),_shapeToMesh(shapeToMesh){}
177     bool IsOk(const SMESH_Hypothesis* aHyp,
178               const TopoDS_Shape&     aShape) const;
179   };
180         
181   struct IsAuxiliaryPredicate : public SMESH_HypoPredicate {
182     bool IsOk(const SMESH_Hypothesis* aHyp,
183               const TopoDS_Shape&     aShape) const;
184   };
185         
186 };
187
188
189 #endif