Salome HOME
acf7cb815df2119aba9ee34ffbe9c2a594285b18
[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     if( objComponent->ComponentDataType()!="SMESH" )
37       return false;
38
39     int aLevel = obj->Depth() - objComponent->Depth();
40
41     // Max level under the component is 5:
42     //
43     // 0    Mesh Component
44     // 1    |- Hypotheses
45     // 2    |  |- Regular 1D
46     //      |- Algorithms
47     //      |- Mesh 1
48     //         |- * Main Shape
49     //         |- Applied Hypotheses
50     //         |- Applied Algorithms
51     //         |- Submeshes on Face
52     // 3       |  |- SubmeshFace
53     // 4       |     |- * Face 1
54     // 4       |     |- Applied algorithms ( selectable in Use Case Browser )
55     // 5       |          |- Regular 1D
56     //         |- Group Of Nodes
57
58     if (aLevel <= 0)
59       return false;
60
61     switch (myType)
62       {
63       case HYPOTHESIS:
64         {
65           if ( aLevel == 2 && ( objFather->Tag() == 1 )) // hypo definition
66             Ok = true;
67           else if ( aLevel == 3 && ( objFather->Tag() == 2 )) // applied global hypo
68             Ok = true;
69           else if ( aLevel == 5 && ( objFather->Tag() == 2 )) // applied local hypo
70             Ok = true;
71           break;
72         }
73       case ALGORITHM:
74         {
75           if ( aLevel == 2 && ( objFather->Tag() == 2 )) // algo definition
76             Ok = true;
77           else if ( aLevel == 3 && ( objFather->Tag() == 3 )) // applied global algo
78             Ok = true;
79           else if ( aLevel == 5 && ( objFather->Tag() == 3 )) // applied local algo
80             Ok = true;
81           break;
82         }
83       case MESH:
84         {
85           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
86             Ok = true;
87           break;
88         }
89       case SUBMESH:
90         {
91           // see SMESH_Gen_i.cxx for tag numbers
92           if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
93             Ok = true;
94           break;
95         }
96       case MESHorSUBMESH:
97         {
98           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
99             Ok = true; // mesh
100           else if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
101             Ok = true;
102           break;
103         }
104       case SUBMESH_VERTEX:  // Label "SubMeshes on vertexes"
105         {
106           if ( aLevel == 3 && ( objFather->Tag() == 4 ))
107             Ok = true;
108           break;
109         }
110       case SUBMESH_EDGE:
111         {
112           if ( aLevel == 3 && ( objFather->Tag() == 5 ))
113             Ok = true;
114           break;
115         }
116       case SUBMESH_FACE:
117         {
118           if ( aLevel == 3 && ( objFather->Tag() == 7 ))
119             Ok = true;
120           break;
121         }
122       case SUBMESH_SOLID:
123         {
124           if ( aLevel == 3 && ( objFather->Tag() == 9 ))
125             Ok = true;
126           break;
127         }
128       case SUBMESH_COMPOUND:
129         {
130           if ( aLevel == 3 && ( objFather->Tag() == 10 ))
131             Ok = true;
132           break;
133         }
134       case GROUP:
135         {
136           if ( aLevel == 3 && ( objFather->Tag() > 10 ))
137             Ok = true;
138           break;
139         }
140       }
141   }
142   return Ok;
143 }
144
145 MeshObjectType SMESH_TypeFilter::type() const 
146 {
147   return myType;
148 }