Salome HOME
SMH: Preparation version 3.0.0 - merge (HEAD+POLYWORK)
[modules/smesh.git] / src / SMESHFiltersSelection / SMESH_NumberFilter.cxx
index 8a7c43a588a4d6cd3542e86d8f85778495b7dfd5..3f0cd8834bfbc16666048532837aa1941f8c356b 100644 (file)
@@ -1,84 +1,65 @@
-//  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. 
-// 
-//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.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 "SUIT_Application.h"
+#include "SUIT_Session.h"
+
+#include "SalomeApp_Study.h"
+#include "SalomeApp_DataOwner.h"
 
-/*
-  Class       : SMESH_NumberFilter
-  Description : Filter for geom objects.
-                Filter geom objects by number of subshapes of the given type
-*/
+#include "SALOME_InteractiveObject.hxx"
+#include "SALOMEDSClient_SObject.hxx"
+#include "SALOMEDS_SObject.hxx"
+
+#include <TopTools_MapOfShape.hxx>
+#include <TopExp_Explorer.hxx>
 
-IMPLEMENT_STANDARD_HANDLE( SMESH_NumberFilter, SALOME_TypeFilter )
-IMPLEMENT_STANDARD_RTTIEXT( SMESH_NumberFilter, SALOME_TypeFilter )
+/*!
+ *  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_NumberFilterconst 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_NumberFilterconst 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 +70,53 @@ 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() )
+  if (!GEOMBase::GetShape(aGeomObj, aShape) ||
+      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() )
-  {
+  if (!myMainObj->_is_nil()) {
     TopoDS_Shape aMainShape;
-    if ( !GEOMBase::GetShape( myMainObj, aMainShape ) )
+    if (!GEOMBase::GetShape(myMainObj, aMainShape))
       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 +125,76 @@ 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
 {
-  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 SalomeApp_DataOwner* owner =
+    dynamic_cast<const SalomeApp_DataOwner*>(theDataOwner);
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
+    (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()));
+  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);
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-