Salome HOME
5142a6db80d2ad094e75a5efed3dde2c2ca1e79b
[modules/geom.git] / src / GEOMFiltersSelection / GEOM_EdgeFilter.cxx
1 using namespace std;
2 //  File      : GEOM_EdgeFilter.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_EdgeFilter.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_Curve.hxx>
25 #include <TopoDS_Edge.hxx>
26 #include <TopoDS.hxx>
27 #include <TopAbs.hxx>
28
29
30 static GEOM_Client  ShapeReader;
31
32
33 /*!
34   enumeration TypeOfEdge is AnyEdge,Line,Circle;
35 */
36 GEOM_EdgeFilter::GEOM_EdgeFilter(const StdSelect_TypeOfEdge Edge,
37                                  GEOM::GEOM_Gen_ptr geom) 
38 {
39   myKind = Edge;
40   myComponentGeom = GEOM::GEOM_Gen::_narrow(geom);
41 }
42
43 Standard_Boolean GEOM_EdgeFilter::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_EDGE, 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_AnyEdge:
72            return Standard_True;
73          case StdSelect_Line:
74            {
75              BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
76              return (curv.GetType() == GeomAbs_Line);
77            }
78            break;
79          case StdSelect_Circle:
80            BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
81            return (curv.GetType() == GeomAbs_Circle);
82          }
83        }
84     }
85   }
86     
87   if ( anObj->IsInstance(STANDARD_TYPE(GEOM_InteractiveObject)) ) {
88     Handle(GEOM_InteractiveObject) GObject =
89       Handle(GEOM_InteractiveObject)::DownCast(anObj);
90     
91     GEOM::GEOM_Shape_var aShape = myComponentGeom->GetIORFromString( GObject->getIOR() );  
92     if ( aShape->_is_nil() )
93       return false;
94     
95     TopoDS_Shape    Shape = ShapeReader.GetShape( myComponentGeom, aShape );
96     if ( Shape.IsNull() )
97       return false;
98     
99     switch (myKind) {
100     case StdSelect_AnyEdge:
101       return Standard_True;
102     case StdSelect_Line:
103       {
104         BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
105         return (curv.GetType() == GeomAbs_Line);
106       }
107       break;
108     case StdSelect_Circle:
109       BRepAdaptor_Curve curv(TopoDS::Edge(Shape));
110       return (curv.GetType() == GeomAbs_Circle);
111     }
112   }
113   return false;
114 }