Salome HOME
SMH: Preparation version 3.0.0 - merge (HEAD+POLYWORK)
[modules/smesh.git] / src / SMESHFiltersSelection / SMESH_TypeFilter.cxx
1 #include "SMESH_TypeFilter.hxx"
2
3 #include <SUIT_Session.h>
4
5 #include <SalomeApp_Study.h>
6 #include <SalomeApp_DataOwner.h>
7
8 SMESH_TypeFilter::SMESH_TypeFilter (MeshObjectType theType) 
9 {
10   myType = theType;
11 }
12
13 SMESH_TypeFilter::~SMESH_TypeFilter() 
14 {
15 }
16
17 bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
18 {
19   bool Ok = false;
20
21   const SalomeApp_DataOwner* owner =
22     dynamic_cast<const SalomeApp_DataOwner*>(theDataOwner);
23   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
24     (SUIT_Session::session()->activeApplication()->activeStudy());
25
26   if (owner && appStudy) {
27     _PTR(Study) study = appStudy->studyDS();
28     QString entry = owner->entry();
29
30     _PTR(SObject) obj (study->FindObjectID(entry.latin1()));
31     if (!obj) return false;
32
33     _PTR(SObject) objFather = obj->GetFather();
34     _PTR(SComponent) objComponent = obj->GetFatherComponent();
35
36     int aLevel = obj->Depth() - objComponent->Depth();
37
38     // Max level under the component is 4:
39     //
40     // 0    Mesh Component
41     // 1    |- Hypotheses
42     // 2    |  |- Regular 1D
43     //      |- Algorithms
44     //      |- Mesh 1
45     //         |- Applied Hypotheses
46     //         |- Applied Algorithms
47     //         |- Submeshes on Face
48     // 3       |  |- SubmeshFace
49     // 4       |     |- Applied algorithms ( selectable in Use Case Browser )
50     //         |- Group Of Nodes
51
52     if (aLevel <= 0)
53       return false;
54
55     switch (myType)
56       {
57       case HYPOTHESIS:
58         {
59           if ( aLevel == 2 && ( objFather->Tag() == 1 ))
60             Ok = true;
61           break;
62         }
63       case ALGORITHM:
64         {
65           if ( aLevel == 2 && ( objFather->Tag() == 2 ))
66             Ok = true;
67           break;
68         }
69       case MESH:
70         {
71           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
72             Ok = true;
73           break;
74         }
75       case SUBMESH:
76         {
77           // see SMESH_Gen_i.cxx for tag numbers
78           if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
79             Ok = true;
80           break;
81         }
82       case MESHorSUBMESH:
83         {
84           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
85             Ok = true; // mesh
86           else if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
87             Ok = true;
88           break;
89         }
90       case SUBMESH_VERTEX:  // Label "SubMeshes on vertexes"
91         {
92           if ( aLevel == 3 && ( objFather->Tag() == 4 ))
93             Ok = true;
94           break;
95         }
96       case SUBMESH_EDGE:
97         {
98           if ( aLevel == 3 && ( objFather->Tag() == 5 ))
99             Ok = true;
100           break;
101         }
102       case SUBMESH_FACE:
103         {
104           if ( aLevel == 3 && ( objFather->Tag() == 7 ))
105             Ok = true;
106           break;
107         }
108       case SUBMESH_SOLID:
109         {
110           if ( aLevel == 3 && ( objFather->Tag() == 9 ))
111             Ok = true;
112           break;
113         }
114       case SUBMESH_COMPOUND:
115         {
116           if ( aLevel == 3 && ( objFather->Tag() == 10 ))
117             Ok = true;
118           break;
119         }
120       case GROUP:
121         {
122           if ( aLevel == 3 && ( objFather->Tag() > 10 ))
123             Ok = true;
124           break;
125         }
126       }
127   }
128   return Ok;
129 }
130
131 MeshObjectType SMESH_TypeFilter::type() const 
132 {
133   return myType;
134 }