X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHFiltersSelection%2FSMESH_NumberFilter.cxx;h=176cd3fb6bc52eb5b186f81c999834bb0ac4cec5;hp=8a7c43a588a4d6cd3542e86d8f85778495b7dfd5;hb=e07015e9cc33a528a8ab0ad4733ee86aef2d5d3e;hpb=e4737e85f0da6d3f90fd08f6be1c2825195fe16f diff --git a/src/SMESHFiltersSelection/SMESH_NumberFilter.cxx b/src/SMESHFiltersSelection/SMESH_NumberFilter.cxx index 8a7c43a58..176cd3fb6 100644 --- a/src/SMESHFiltersSelection/SMESH_NumberFilter.cxx +++ b/src/SMESHFiltersSelection/SMESH_NumberFilter.cxx @@ -1,84 +1,85 @@ -// SALOME SALOMEGUI : implementation of desktop and GUI kernel -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is distributed in the hope that it will be useful +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ // -// // File : SMESH_NumberFilter.cxx -// Author : Sergey LITONIN // Module : SMESH #include "SMESH_NumberFilter.hxx" -#include "GEOMBase.h" -#include "TopTools_MapOfShape.hxx" -#include "TopExp_Explorer.hxx" -#include "SALOME_InteractiveObject.hxx" -#include "QAD_Application.h" -#include "QAD_Desktop.h" +#include "GEOM_Client.hxx" +#include "GeometryGUI.h" + +#include "SUIT_Application.h" +#include "SUIT_Session.h" -/* - Class : SMESH_NumberFilter - Description : Filter for geom objects. - Filter geom objects by number of subshapes of the given type -*/ +#include "SalomeApp_Study.h" +#include "LightApp_DataOwner.h" -IMPLEMENT_STANDARD_HANDLE( SMESH_NumberFilter, SALOME_TypeFilter ) -IMPLEMENT_STANDARD_RTTIEXT( SMESH_NumberFilter, SALOME_TypeFilter ) +#include "SALOME_InteractiveObject.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDS_SObject.hxx" + +#include +#include + +/*! + * Class : SMESH_NumberFilter + * Description : Filter for geom objects. + * Filter geom objects by number of subshapes of the given type + */ //======================================================================= // name : SMESH_NumberFilter::SMESH_NumberFilter // Purpose : Constructor //======================================================================= -SMESH_NumberFilter::SMESH_NumberFilter( const char* theKind, +SMESH_NumberFilter::SMESH_NumberFilter (const char* theKind, const TopAbs_ShapeEnum theSubShapeType, const int theNumber, const TopAbs_ShapeEnum theShapeType, GEOM::GEOM_Object_ptr theMainObj, - const bool theIsClosedOnly ) -: SALOME_TypeFilter( (char*)theKind ) + const bool theIsClosedOnly) { + myKind = (char*)theKind; mySubShapeType = theSubShapeType; myNumber = theNumber; myIsClosedOnly = theIsClosedOnly; - myShapeTypes.Add( theShapeType ); - myMainObj = GEOM::GEOM_Object::_duplicate( theMainObj ); + myShapeTypes.Add(theShapeType); + myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj); } //======================================================================= // name : SMESH_NumberFilter::SMESH_NumberFilter // Purpose : Constructor //======================================================================= -SMESH_NumberFilter::SMESH_NumberFilter( const char* theKind, +SMESH_NumberFilter::SMESH_NumberFilter (const char* theKind, const TopAbs_ShapeEnum theSubShapeType, const int theNumber, const TColStd_MapOfInteger& theShapeTypes, GEOM::GEOM_Object_ptr theMainObj, const bool theIsClosedOnly ) -: SALOME_TypeFilter( (char*)theKind ) { + myKind = (char*)theKind; mySubShapeType = theSubShapeType; myNumber = theNumber; myIsClosedOnly = theIsClosedOnly; myShapeTypes = theShapeTypes; - myMainObj = GEOM::GEOM_Object::_duplicate( theMainObj ); + myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj); } SMESH_NumberFilter::~SMESH_NumberFilter() @@ -89,52 +90,55 @@ SMESH_NumberFilter::~SMESH_NumberFilter() // name : SMESH_NumberFilter::SMESH_NumberFilter // Purpose : Verify validity of entry object //======================================================================= -Standard_Boolean SMESH_NumberFilter::IsOk( const Handle(SALOME_InteractiveObject)& theObj ) const +bool SMESH_NumberFilter::isOk (const SUIT_DataOwner* theDataOwner) const { - if ( theObj.IsNull() || !SALOME_TypeFilter::IsOk( theObj ) ) + if (!theDataOwner) return false; // Get geom object from IO - GEOM::GEOM_Object_var aGeomObj = getGeom( theObj ); - if ( aGeomObj->_is_nil() ) + GEOM::GEOM_Object_var aGeomObj = getGeom(theDataOwner); + if (aGeomObj->_is_nil()) return false; // Get shape from geom object and verify its parameters - TopoDS_Shape aShape; - if ( !GEOMBase::GetShape( aGeomObj, aShape ) || - aShape.IsNull() || - !myShapeTypes.Contains( aShape.ShapeType() ) || - myIsClosedOnly && aShape.ShapeType() == TopAbs_SHELL && !aShape.Closed() ) + GEOM_Client aGeomClient; + if ( CORBA::is_nil( GeometryGUI::GetGeomGen() ) && !GeometryGUI::InitGeomGen() ) + return false; + TopoDS_Shape aShape = aGeomClient.GetShape(GeometryGUI::GetGeomGen(), aGeomObj); + if (aShape.IsNull() || + !myShapeTypes.Contains(aShape.ShapeType())) + return false; + + if (myIsClosedOnly && aShape.ShapeType() == TopAbs_SHELL && !aShape.Closed()) return false; - + // Verify whether shape of entry object is sub-shape of myMainObj - if ( !myMainObj->_is_nil() ) - { - TopoDS_Shape aMainShape; - if ( !GEOMBase::GetShape( myMainObj, aMainShape ) ) + if (!myMainObj->_is_nil()) { + TopoDS_Shape aMainShape = aGeomClient.GetShape(GeometryGUI::GetGeomGen(), myMainObj); + if (aMainShape.IsNull()) return false; bool isFound = false; TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); - TopExp_Explorer anExp( aMainShape, aShapeType ); - for ( ; anExp.More(); anExp.Next() ) - if ( anExp.Current() == aShape ) - { + TopExp_Explorer anExp (aMainShape, aShapeType); + for (; anExp.More(); anExp.Next()) { + if (anExp.Current() == aShape) { isFound = true; break; } - if ( !isFound ) + } + if (!isFound) return false; } + // Verify number of sub-shapes - if ( mySubShapeType == TopAbs_SHAPE ); + if (mySubShapeType == TopAbs_SHAPE); return true; - int nbShapes = 0; - TopExp_Explorer anExp2( aShape, mySubShapeType ); + TopExp_Explorer anExp2 (aShape, mySubShapeType); TopTools_MapOfShape aMap; - for ( ; anExp2.More(); anExp2.Next() ) - aMap.Add( anExp2.Current() ); + for (; anExp2.More(); anExp2.Next()) + aMap.Add(anExp2.Current()); return myNumber == aMap.Extent(); } @@ -143,83 +147,79 @@ Standard_Boolean SMESH_NumberFilter::IsOk( const Handle(SALOME_InteractiveObject // name : SMESH_NumberFilter::getGeom // Purpose : Retrieve geom object from SALOME_InteractiveObject //======================================================================= -GEOM::GEOM_Object_ptr SMESH_NumberFilter::getGeom( - const Handle(SALOME_InteractiveObject)& theObj ) const +GEOM::GEOM_Object_ptr SMESH_NumberFilter::getGeom + (const SUIT_DataOwner* theDataOwner, const bool extractReference ) const { - if ( theObj->isComponentType( "GEOM" ) ) - { - Standard_Boolean aRes = Standard_False; - GEOM::GEOM_Object_var aGeomObj = GEOMBase::ConvertIOinGEOMObject( theObj, aRes ); - return aRes ? aGeomObj._retn() : GEOM::GEOM_Object::_nil(); - } - else - { - // Get geom object corresponding to the mesh - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::SObject_var aSO = aStudy->FindObjectID( theObj->getEntry() ); - if ( aSO->_is_nil() ) - return GEOM::GEOM_Object::_nil(); - - SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( aSO ); - for( ; anIter->More(); anIter->Next() ) - { - SALOMEDS::SObject_var aSO = anIter->Value(); - SALOMEDS::SObject_var aRefSO; - - GEOM::GEOM_Object_var aMeshShape = GEOM::GEOM_Object::_narrow( - aSO->ReferencedObject( aRefSO )? aRefSO->GetObject() : aSO->GetObject() ); - - if ( !aMeshShape->_is_nil() ) - return aMeshShape._retn(); - } + const LightApp_DataOwner* owner = + dynamic_cast(theDataOwner); + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + GEOM::GEOM_Object_var anObj; + + if (!owner || !appStudy) + return GEOM::GEOM_Object::_nil(); + + _PTR(Study) study = appStudy->studyDS(); + QString entry = owner->entry(); + + _PTR(SObject) aSO( study->FindObjectID( entry.latin1() ) ), aRefSO; + if( extractReference && aSO && aSO->ReferencedObject( aRefSO ) ) + aSO = aRefSO; + + if (!aSO) return GEOM::GEOM_Object::_nil(); + + CORBA::Object_var anObject = _CAST(SObject,aSO)->GetObject(); + anObj = GEOM::GEOM_Object::_narrow(anObject); + if (!CORBA::is_nil(anObj)) + return anObj._retn(); + + // Get geom object corresponding to the mesh + _PTR(ChildIterator) anIter = study->NewChildIterator(aSO); + for (; anIter->More(); anIter->Next()) { + _PTR(SObject) aSO = anIter->Value(); + if (!aSO) + continue; + _PTR(SObject) aRefSO; + _PTR(SObject) anObj; + if (aSO->ReferencedObject(aRefSO)) + anObj = aRefSO; + + if (!anObj) + anObj = aSO; + + anObject = _CAST(SObject,anObj)->GetObject(); + GEOM::GEOM_Object_var aMeshShape = GEOM::GEOM_Object::_narrow(anObject); + + if (!aMeshShape->_is_nil()) + return aMeshShape._retn(); } -} + return GEOM::GEOM_Object::_nil(); +} -void SMESH_NumberFilter::SetSubShapeType( const TopAbs_ShapeEnum theSubShapeType ) +void SMESH_NumberFilter::SetSubShapeType (const TopAbs_ShapeEnum theSubShapeType) { mySubShapeType = theSubShapeType; } -void SMESH_NumberFilter::SetNumber( const int theNumber ) +void SMESH_NumberFilter::SetNumber (const int theNumber) { myNumber = theNumber; } -void SMESH_NumberFilter::SetClosedOnly( const bool theIsClosedOnly ) +void SMESH_NumberFilter::SetClosedOnly (const bool theIsClosedOnly) { myIsClosedOnly = theIsClosedOnly; } -void SMESH_NumberFilter::SetShapeType( const TopAbs_ShapeEnum theShapeType ) +void SMESH_NumberFilter::SetShapeType (const TopAbs_ShapeEnum theShapeType) { myShapeTypes.Add( theShapeType ); } -void SMESH_NumberFilter::SetMainShape( GEOM::GEOM_Object_ptr theMainObj ) +void SMESH_NumberFilter::SetMainShape (GEOM::GEOM_Object_ptr theMainObj) { - myMainObj = GEOM::GEOM_Object::_duplicate( theMainObj ); + myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj); } - - - - - - - - - - - - - - - - - - - - -