Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/smesh.git] / src / SMESHFiltersSelection / SMESH_TypeFilter.cxx
1 //  File      : SMESH_TypeFilter.cxx
2 //  Created   : Fri Dec 07 09:57:24 2001
3 //  Author    : Nicolas REJNERI
4 //  Project   : SALOME
5 //  Module    : SMESH
6 //  Copyright : Open CASCADE
7 //  $Header$
8
9 #include "SMESH_TypeFilter.ixx"
10
11 #include "SALOME_InteractiveObject.hxx"
12 #include "SALOME_TypeFilter.hxx"
13
14 #include "utilities.h"
15 #include "QAD_Application.h"
16 #include "QAD_Desktop.h"
17 #include "QAD_Study.h"
18
19 using namespace std;
20
21 SMESH_TypeFilter::SMESH_TypeFilter(MeshObjectType aType) 
22 {
23   myKind = aType;
24 }
25
26 Standard_Boolean SMESH_TypeFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const 
27 {
28   Handle(SALOME_TypeFilter) meshFilter = new SALOME_TypeFilter( "SMESH" );
29   if ( !meshFilter->IsOk(anObj) ) 
30     return false;
31
32   bool Ok = false;
33
34   if ( anObj->hasEntry() ) {
35     QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
36     SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument();
37     SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() );
38
39     SALOMEDS::SObject_var objFather = obj->GetFather();
40     SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent();
41     
42     int aLevel = obj->Depth() - objComponent->Depth();
43
44     // Max level under the component is 4:
45     //
46     // 0    Mesh Component
47     // 1    |- Hypotheses
48     // 2    |  |- Regular 1D
49     //      |- Algorithms
50     //      |- Mesh 1
51     //         |- Applied Hypotheses
52     //         |- Applied Algorithms
53     //         |- Submeshes on Face
54     // 3       |  |- SubmeshFace
55     // 4       |     |- Applied algorithms ( selectable in Use Case Browser )
56     //         |- Group Of Nodes
57
58     if ( aLevel <= 0 )
59       return false;
60
61     switch ( myKind )
62       {
63       case HYPOTHESIS:
64         {
65           if ( aLevel == 2 && ( objFather->Tag() == 1 ))
66             Ok = true;
67           break;
68         }
69       case ALGORITHM:
70         {
71           if ( aLevel == 2 && ( objFather->Tag() == 2 ))
72             Ok = true;
73           break;
74         }
75       case MESH:
76         {
77           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
78             Ok = true;
79           break;
80         }
81       case SUBMESH:
82         {
83           // see SMESH_Gen_i.cxx for tag numbers
84           if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
85             Ok = true;
86           break;
87         }
88       case MESHorSUBMESH:
89         {
90           if ( aLevel == 1 && ( obj->Tag() >= 3 ))
91             Ok = true; // mesh
92           else if ( aLevel == 3 && ( objFather->Tag() >= 4 && objFather->Tag() <= 10 ))
93             Ok = true;
94           break;
95         }
96       case SUBMESH_VERTEX:  // Label "SubMeshes on vertexes"
97         {
98           if ( aLevel == 3 && ( objFather->Tag() == 4 ))
99             Ok = true;
100           break;
101         }
102       case SUBMESH_EDGE:
103         {
104           if ( aLevel == 3 && ( objFather->Tag() == 5 ))
105             Ok = true;
106           break;
107         }
108       case SUBMESH_FACE:
109         {
110           if ( aLevel == 3 && ( objFather->Tag() == 7 ))
111             Ok = true;
112           break;
113         }
114       case SUBMESH_SOLID:
115         {
116           if ( aLevel == 3 && ( objFather->Tag() == 9 ))
117             Ok = true;
118           break;
119         }
120       case SUBMESH_COMPOUND:
121         {
122           if ( aLevel == 3 && ( objFather->Tag() == 10 ))
123             Ok = true;
124           break;
125         }
126       case GROUP:
127         {
128           if ( aLevel == 3 && ( objFather->Tag() > 10 ))
129             Ok = true;
130           break;
131         }
132       }
133   }
134   return Ok;
135 }