Salome HOME
23514: EDF 16031 - SMESH freezes
[modules/smesh.git] / src / SMESHFiltersSelection / SMESH_TypeFilter.cxx
index e9b83166c25add1125c1dc2b2298a27f95208d5d..a405af18434ecfe29fbebd92d6fe27133540ffda 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // 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.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 #include "SMESH_TypeFilter.hxx"
 
+#include <LightApp_DataOwner.h>
 #include <SUIT_Session.h>
-
+#include <SalomeApp_Application.h>
 #include <SalomeApp_Study.h>
-#include <LightApp_DataOwner.h>
 
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SMESH_Gen)
 
-SMESH_TypeFilter::SMESH_TypeFilter (MeshObjectType theType)
+SMESH_TypeFilter::SMESH_TypeFilter (SMESH::MeshObjectType theType)
 {
   myType = theType;
 }
@@ -39,6 +39,40 @@ SMESH_TypeFilter::~SMESH_TypeFilter()
 {
 }
 
+namespace
+{
+  //================================================================================
+  /*!
+   * \brief Returns true if \a obj is SMESH_IDSource including elements of a given \a type 
+   */
+  //================================================================================
+
+  bool isIDSourceOfType( _PTR(SObject) obj, SMESH::ElementType type )
+  {
+    bool Ok = false;
+    SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+      (SUIT_Session::session()->activeApplication());
+    _PTR(GenericAttribute) anAttr;
+    if ( obj->FindAttribute(anAttr, "AttributeIOR"))
+    {
+      _PTR(AttributeIOR) anIOR = anAttr;
+      std::string aVal = anIOR->Value();
+      if ( aVal.size() > 0 )
+      {
+        CORBA::Object_var corbaObj = app->orb()->string_to_object( aVal.c_str() );
+        SMESH::SMESH_IDSource_var ids = SMESH::SMESH_IDSource::_narrow( corbaObj );
+        if ( ! ids->_is_nil() )
+        {
+          SMESH::array_of_ElementType_var types = ids->GetTypes();
+          for ( int i = 0, nb = types->length(); i < nb && !Ok; ++i )
+            Ok = ( types[i] == type );
+        }
+      }
+    }
+    return Ok;
+  }
+}
+
 bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
 {
   bool Ok = false, extractReference = true;
@@ -88,7 +122,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
 
     switch (myType)
     {
-      case HYPOTHESIS:
+      case SMESH::HYPOTHESIS:
         {
           if      (aLevel == 2 && (objFather->Tag() == SMESH::Tag_HypothesisRoot))
             // hypo definition
@@ -101,7 +135,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case ALGORITHM:
+      case SMESH::ALGORITHM:
         {
           if      (aLevel == 2 && (objFather->Tag() == SMESH::Tag_AlgorithmsRoot))
             // algo definition
@@ -114,13 +148,13 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case MESH:
+      case SMESH::MESH:
         {
           if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
             Ok = true;
           break;
         }
-      case SUBMESH:
+      case SMESH::SUBMESH:
         {
           // see SMESH_Gen_i.cxx for tag numbers
           if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh &&
@@ -128,7 +162,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case MESHorSUBMESH:
+      case SMESH::MESHorSUBMESH:
         {
           if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
             Ok = true; // mesh
@@ -137,90 +171,106 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case SUBMESH_VERTEX: // Label "SubMeshes on vertexes"
+      case SMESH::SUBMESH_VERTEX: // Label "SubMeshes on vertexes"
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnVertex))
             Ok = true;
           break;
         }
-      case SUBMESH_EDGE:
+      case SMESH::SUBMESH_EDGE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnEdge))
             Ok = true;
           break;
         }
-      case SUBMESH_FACE:
+      case SMESH::SUBMESH_FACE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnFace))
             Ok = true;
           break;
         }
-      case SUBMESH_SOLID:
+      case SMESH::SUBMESH_SOLID:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnSolid))
             Ok = true;
           break;
         }
-      case SUBMESH_COMPOUND:
+      case SMESH::SUBMESH_COMPOUND:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnCompound))
             Ok = true;
           break;
         }
-      case GROUP:
+      case SMESH::GROUP:
         {
           if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstGroup))
             Ok = true;
           break;
         }
-      case GROUP_NODE:
+      case SMESH::GROUP_NODE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_NodeGroups))
             Ok = true;
           break;
         }
-      case GROUP_EDGE:
+      case SMESH::GROUP_EDGE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_EdgeGroups))
             Ok = true;
           break;
         }
-      case GROUP_FACE:
+      case SMESH::GROUP_FACE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_FaceGroups))
             Ok = true;
           break;
         }
-      case GROUP_VOLUME:
+      case SMESH::GROUP_VOLUME:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_VolumeGroups))
             Ok = true;
           break;
         }
-      case GROUP_0D:
+      case SMESH::GROUP_0D:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_0DElementsGroups))
             Ok = true;
           break;
         }
-      case GROUP_BALL:
+      case SMESH::GROUP_BALL:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_BallElementsGroups))
             Ok = true;
           break;
         }
-      case IDSOURCE:
+      case SMESH::IDSOURCE:
+        {
+          Ok = ( SMESH_TypeFilter(SMESH::MESHorSUBMESH).isOk( theDataOwner ) ||
+                 SMESH_TypeFilter(SMESH::GROUP)        .isOk( theDataOwner ));
+          break;
+        }
+      case SMESH::IDSOURCE_EDGE:
+        {
+          Ok = isIDSourceOfType( obj, SMESH::EDGE );
+          break;
+        }
+      case SMESH::IDSOURCE_FACE:
+        {
+          Ok = isIDSourceOfType( obj, SMESH::FACE );
+          break;
+        }
+      case SMESH::IDSOURCE_VOLUME:
         {
-          Ok = ( SMESH_TypeFilter(MESHorSUBMESH).isOk( theDataOwner ) ||
-                 SMESH_TypeFilter(GROUP)        .isOk( theDataOwner ));
+          Ok = isIDSourceOfType( obj, SMESH::VOLUME );
           break;
         }
+    default:;
     }
   }
   return Ok;
 }
 
-MeshObjectType SMESH_TypeFilter::type() const
+SMESH::MeshObjectType SMESH_TypeFilter::type() const
 {
   return myType;
 }