]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOMFiltersSelection/GEOM_FaceFilter.cxx
Salome HOME
aefda178f40f3a5231d753ea062243bd5d5bb985
[modules/geom.git] / src / GEOMFiltersSelection / GEOM_FaceFilter.cxx
1 using namespace std;
2 //  File      : GEOM_FaceFilter.cxx
3 //  Created   : Fri Dec 07 09:57:24 2001
4 //  Author    : Nicolas REJNERI
5 //  Project   : SALOME
6 //  Module    : GEOM
7 //  Copyright : Open CASCADE
8 //  $Header$
9
10 #include "GEOM_FaceFilter.ixx"
11 #include "GEOM_Client.hxx"
12
13 #include "SALOME_InteractiveObject.hxx"
14 #include "GEOM_InteractiveObject.hxx"
15 #include "GEOM_ShapeTypeFilter.hxx"
16 #include "SALOME_TypeFilter.hxx"
17
18 #include "utilities.h"
19 #include "QAD_Application.h"
20 #include "QAD_Desktop.h"
21 #include "QAD_Study.h"
22
23 // Open CASCADE Includes
24 #include <BRepAdaptor_Surface.hxx>
25 #include <TopoDS_Face.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <TopoDS.hxx>
28 #include <TopAbs.hxx>
29
30
31 static GEOM_Client  ShapeReader;
32
33 /*!
34   enumeration TypeOfFace is AnyFace,Plane,Cylinder,Sphere,Torus,Revol,Cone;
35 */
36 GEOM_FaceFilter::GEOM_FaceFilter(const StdSelect_TypeOfFace Face,
37                                  GEOM::GEOM_Gen_ptr geom) 
38 {
39   myKind = Face;
40   myComponentGeom = GEOM::GEOM_Gen::_narrow(geom);
41 }
42
43 Standard_Boolean GEOM_FaceFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const 
44 {
45   Handle(SALOME_TypeFilter) GeomFilter = new SALOME_TypeFilter( "GEOM" );
46   if ( !GeomFilter->IsOk(anObj) ) 
47     return false;
48
49   Handle(GEOM_ShapeTypeFilter) GeomShapeTypeFilter = new GEOM_ShapeTypeFilter( TopAbs_FACE, myComponentGeom );
50   if ( !GeomShapeTypeFilter->IsOk(anObj) ) 
51     return false;
52
53   if ( anObj->hasEntry() ) {
54     QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
55     SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument();
56     SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() );
57     SALOMEDS::GenericAttribute_var anAttr;
58     SALOMEDS::AttributeIOR_var     anIOR;
59     if ( !obj->_is_nil() ) {
60        if (obj->FindAttribute(anAttr, "AttributeIOR")) {
61          anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
62          GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( anIOR->Value() );  
63          if ( aShape->_is_nil() )
64            return false;
65      
66          TopoDS_Shape    Shape = ShapeReader.GetShape( myComponentGeom, aShape );
67          if ( Shape.IsNull() )
68            return false;
69          
70          switch (myKind) {
71          case StdSelect_AnyFace:
72            return Standard_True;
73          case StdSelect_Plane:
74            {
75              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
76              return (surf.GetType() == GeomAbs_Plane);
77            }
78          case StdSelect_Cylinder:
79            {
80              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
81              return (surf.GetType() == GeomAbs_Cylinder);
82            }
83          case StdSelect_Sphere: 
84            {
85              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
86              return (surf.GetType() == GeomAbs_Sphere);      
87            }
88          case StdSelect_Torus: 
89            {
90              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
91              return ( surf.GetType() == GeomAbs_Torus);      
92            }
93          case StdSelect_Revol: 
94            {
95              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
96              return ( surf.GetType() == GeomAbs_Cylinder || 
97                       surf.GetType() == GeomAbs_Cone     ||
98                       surf.GetType() == GeomAbs_Torus    ||
99                       surf.GetType() == GeomAbs_Sphere    || 
100                       surf.GetType() == GeomAbs_SurfaceOfRevolution ); 
101            }
102          case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
103            {
104              BRepAdaptor_Surface surf(TopoDS::Face(Shape));
105              return (surf.GetType() == GeomAbs_Cone);      
106            }     
107          }
108        }
109     }
110   }
111     
112   if ( anObj->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject)) ) {
113     Handle(GEOM_InteractiveObject) GObject =
114       Handle(GEOM_InteractiveObject)::DownCast(anObj);
115     
116     GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( GObject->getIOR() );  
117     if ( aShape->_is_nil() )
118       return false;
119     
120     TopoDS_Shape    Shape = ShapeReader.GetShape( myComponentGeom, aShape );
121     if ( Shape.IsNull() )
122       return false;
123     
124     switch (myKind) {
125     case StdSelect_AnyFace:
126       return Standard_True;
127     case StdSelect_Plane:
128       {
129         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
130         return (surf.GetType() == GeomAbs_Plane);
131       }
132     case StdSelect_Cylinder:
133       {
134         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
135         return (surf.GetType() == GeomAbs_Cylinder);
136       }
137     case StdSelect_Sphere: 
138       {
139         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
140         return (surf.GetType() == GeomAbs_Sphere);      
141       }
142     case StdSelect_Torus: 
143       {
144         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
145         return ( surf.GetType() == GeomAbs_Torus);      
146       }
147     case StdSelect_Revol: 
148       {
149         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
150         return ( surf.GetType() == GeomAbs_Cylinder || 
151                  surf.GetType() == GeomAbs_Cone     ||
152                  surf.GetType() == GeomAbs_Torus    ||
153                  surf.GetType() == GeomAbs_Sphere         || 
154                  surf.GetType() == GeomAbs_SurfaceOfRevolution ); 
155       }
156     case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
157       {
158         BRepAdaptor_Surface surf(TopoDS::Face(Shape));
159         return (surf.GetType() == GeomAbs_Cone);      
160       }  
161     }
162   }
163   return false;
164 }