Back to index

salome-geom  6.5.0
GEOM_SelectionFilter.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 #include "GEOM_SelectionFilter.h"
00024 
00025 #include "GEOM_Client.hxx"
00026 
00027 #include <LightApp_DataOwner.h>
00028 #include <SalomeApp_Study.h>
00029 #include <SalomeApp_Application.h>
00030 
00031 #include <SALOME_LifeCycleCORBA.hxx>
00032 
00033 #include <SUIT_Session.h>
00034 
00035 //=======================================================================
00036 // function : GEOM_SelectionFilter
00037 // purpose  :
00038 //=======================================================================
00039 GEOM_SelectionFilter::GEOM_SelectionFilter( SalomeApp_Study* study, const bool theAll )
00040   : SalomeApp_Filter(study)
00041 {
00042   myAll = theAll;
00043 }
00044 
00045 //=======================================================================
00046 // function : ~GEOM_SelectionFilter
00047 // purpose  :
00048 //=======================================================================
00049 GEOM_SelectionFilter::~GEOM_SelectionFilter()
00050 {
00051 }
00052 
00053 //=======================================================================
00054 // function : isOk
00055 // purpose  :
00056 //=======================================================================
00057 bool GEOM_SelectionFilter::isOk( const SUIT_DataOwner* sOwner ) const
00058 {
00059   GEOM::GEOM_Object_var obj = getObject( sOwner );
00060   if ( !CORBA::is_nil( obj ) && obj->IsShape() )
00061   {
00062     if ( isAll() )
00063       return true;
00064 
00065     TopoDS_Shape shape;
00066     if ( getShape( obj, shape ) )
00067       return contains( shape.ShapeType() ) && isShapeOk( shape );
00068   }
00069 
00070   // IMP 0020435: fine local selection
00071   {
00072     const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>(sOwner);
00073     if (owner) {
00074       QString entry = owner->entry();
00075       int index = entry.lastIndexOf("_");
00076       if (index > 0) {
00077         return true;
00078       }
00079     }
00080   }
00081 
00082   return false;
00083 }
00084 
00085 //=======================================================================
00086 // function : getObject
00087 // purpose  :
00088 //=======================================================================
00089 GEOM::GEOM_Object_ptr GEOM_SelectionFilter::getObject (const SUIT_DataOwner* sOwner,
00090                                                        const bool extractReference) const
00091 {
00092   GEOM::GEOM_Object_var anObj;
00093 
00094   const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>(sOwner);
00095   SalomeApp_Study* appStudy = getStudy();
00096   if (owner && appStudy)
00097   {
00098     _PTR(Study) study = appStudy->studyDS();
00099     QString entry = owner->entry();
00100 
00101     _PTR(SObject) aSO (study->FindObjectID(entry.toStdString())), aRefSO;
00102     if( extractReference && aSO && aSO->ReferencedObject( aRefSO ) )
00103       aSO = aRefSO;
00104 
00105     if (aSO) {
00106       std::string aValue = aSO->GetIOR();
00107       if (strcmp(aValue.c_str(), "") != 0) {
00108         CORBA::ORB_ptr anORB = SalomeApp_Application::orb();
00109         CORBA::Object_var aCorbaObj = anORB->string_to_object(aValue.c_str());
00110         anObj = GEOM::GEOM_Object::_narrow(aCorbaObj);
00111       }
00112     }
00113   }
00114 
00115   if (!CORBA::is_nil(anObj))
00116     return anObj._retn();
00117 
00118   return GEOM::GEOM_Object::_nil();
00119 }
00120 
00121 //=======================================================================
00122 // function : getShape
00123 // purpose  :
00124 //=======================================================================
00125 bool GEOM_SelectionFilter::getShape (const GEOM::GEOM_Object_ptr& theObject,
00126                                      TopoDS_Shape&                theShape) const
00127 {
00128   if ( !CORBA::is_nil( theObject ) )
00129   {
00130     SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
00131       ( SUIT_Session::session()->activeApplication() );
00132     if ( app )
00133     {
00134       SALOME_LifeCycleCORBA* ls = new SALOME_LifeCycleCORBA( app->namingService() );
00135       static GEOM::GEOM_Gen_var geomGen;
00136       if(CORBA::is_nil( geomGen )) {
00137         Engines::EngineComponent_var comp = ls->FindOrLoad_Component( "FactoryServer", "GEOM" );
00138         geomGen = GEOM::GEOM_Gen::_narrow( comp );
00139       }
00140       if ( !CORBA::is_nil( geomGen ) )
00141       {
00142         TopoDS_Shape aTopoDSShape = GEOM_Client::get_client().GetShape( geomGen, theObject );
00143 
00144         if ( !aTopoDSShape.IsNull() )
00145         {
00146           theShape = aTopoDSShape;
00147           return true;
00148         }
00149       }
00150     }
00151   }
00152   return false;
00153 }
00154 
00155 //=======================================================================
00156 // function : contains
00157 // purpose  :
00158 //=======================================================================
00159 bool GEOM_SelectionFilter::contains( const int type ) const
00160 {
00161   return myTypes.contains( type );
00162 }
00163 
00164 //=======================================================================
00165 // function : add
00166 // purpose  :
00167 //=======================================================================
00168 void GEOM_SelectionFilter::add( const int type )
00169 {
00170   if ( !contains( type ) )
00171     myTypes.append( type );
00172 }
00173 
00174 //=======================================================================
00175 // function : remove
00176 // purpose  :
00177 //=======================================================================
00178 void GEOM_SelectionFilter::remove( const int type )
00179 {
00180   if ( contains( type ) )
00181     myTypes.removeAll( type );
00182 }
00183 
00184 //=======================================================================
00185 // function : setAll
00186 // purpose  :
00187 //=======================================================================
00188 void GEOM_SelectionFilter::setAll( const bool all )
00189 {
00190   myAll = all;
00191 }
00192 
00193 //=======================================================================
00194 // function : isAll
00195 // purpose  :
00196 //=======================================================================
00197 bool GEOM_SelectionFilter::isAll() const
00198 {
00199   return myAll;
00200 }
00201 
00202 //=======================================================================
00203 // function : isShapeOk
00204 // purpose  :
00205 //=======================================================================
00206 bool GEOM_SelectionFilter::isShapeOk( const TopoDS_Shape& ) const
00207 {
00208   return true;
00209 }