X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHFiltersSelection%2FSMESH_TypeFilter.cxx;h=a405af18434ecfe29fbebd92d6fe27133540ffda;hp=3a14178e53c688edff7154bab06f937e2be8034f;hb=ccb5e3c25bf204e839c0094f50f543eacedba5e6;hpb=3973ceea250d2a077cdb5a798eb7c6151fa9c568 diff --git a/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx b/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx index 3a14178e5..a405af184 100644 --- a/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx +++ b/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx @@ -1,139 +1,276 @@ -using namespace std; -// File : SMESH_TypeFilter.cxx -// Created : Fri Dec 07 09:57:24 2001 -// Author : Nicolas REJNERI -// Project : SALOME -// Module : SMESH -// Copyright : Open CASCADE -// $Header$ +// 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 +// +// 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, 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 +// 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/ or email : webmaster.salome@opencascade.com +// -#include "SMESH_TypeFilter.ixx" +#include "SMESH_TypeFilter.hxx" -#include "SALOME_InteractiveObject.hxx" -#include "SALOME_TypeFilter.hxx" +#include +#include +#include +#include -#include "utilities.h" -#include "QAD_Application.h" -#include "QAD_Desktop.h" -#include "QAD_Study.h" +#include +#include CORBA_CLIENT_HEADER(SMESH_Gen) - -SMESH_TypeFilter::SMESH_TypeFilter(MeshObjectType aType) +SMESH_TypeFilter::SMESH_TypeFilter (SMESH::MeshObjectType theType) { - myKind = aType; + myType = theType; } -Standard_Boolean SMESH_TypeFilter::IsOk(const Handle(SALOME_InteractiveObject)& anObj) const +SMESH_TypeFilter::~SMESH_TypeFilter() { - Handle(SALOME_TypeFilter) meshFilter = new SALOME_TypeFilter( "MESH" ); - if ( !meshFilter->IsOk(anObj) ) - return false; +} - if ( anObj->hasEntry() ) { - QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy(); - SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument(); - SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() ); +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; - - switch ( myKind ) + SalomeApp_Application* app = dynamic_cast + (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 ) { - case HYPOTHESIS: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( objFather->Tag() == 1 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) - Ok = true; - break; - } - case ALGORITHM: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( objFather->Tag() == 2 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) - Ok = true; - break; - } - case MESH: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() >= 3 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) == 0 ) ) - Ok = true; - break; - } - case SUBMESH: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( objFather->Tag() >= 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) - Ok = true; - break; - } - case MESHorSUBMESH: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() >= 3 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) == 0 ) ) - Ok = true; - - if (( objFather->Tag() >= 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) - Ok = true; - - break; - } - case SUBMESH_VERTEX: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() == 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) - Ok = true; - break; - } - case SUBMESH_EDGE: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() == 5 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) - Ok = true; - break; - } - case SUBMESH_FACE: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() == 6 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) - Ok = true; - break; - } - case SUBMESH_SOLID: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() == 7 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) - Ok = true; - break; - } - case SUBMESH_COMPOUND: - { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( obj->Tag() == 8 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) - Ok = true; - break; - } + 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; + + const LightApp_DataOwner* owner = + dynamic_cast(theDataOwner); + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + + if (owner && appStudy) { + _PTR(Study) study = appStudy->studyDS(); + QString entry = owner->entry(); - if ( Ok ) - return true; + _PTR(SObject) obj (study->FindObjectID(entry.toLatin1().data())), aRefSO; + if( extractReference && obj && obj->ReferencedObject( aRefSO ) ) + obj = aRefSO; + if (!obj) return false; + + _PTR(SObject) objFather = obj->GetFather(); + _PTR(SComponent) objComponent = obj->GetFatherComponent(); + + if( objComponent->ComponentDataType()!="SMESH" ) + return false; + + int aLevel = obj->Depth() - objComponent->Depth(); + + // Max level under the component is 5: + // + // 0 Mesh Component + // 1 |- Hypotheses + // 2 | |- Regular 1D + // |- Algorithms + // |- Mesh 1 + // |- * Main Shape + // |- Applied Hypotheses + // |- Applied Algorithms + // |- Submeshes on Face + // 3 | |- SubmeshFace + // 4 | |- * Face 1 + // 4 | |- Applied algorithms ( selectable in Use Case Browser ) + // 5 | |- Regular 1D + // |- Group Of Nodes + // |- Group 1 + + if (aLevel <= 0) + return false; + + switch (myType) + { + case SMESH::HYPOTHESIS: + { + if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_HypothesisRoot)) + // hypo definition + Ok = true; + else if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_RefOnAppliedHypothesis)) + // applied global hypo + Ok = true; + else if (aLevel == 5 && (objFather->Tag() == SMESH::Tag_RefOnAppliedHypothesis)) + // applied local hypo + Ok = true; + break; + } + case SMESH::ALGORITHM: + { + if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_AlgorithmsRoot)) + // algo definition + Ok = true; + else if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_RefOnAppliedAlgorithms)) + // applied global algo + Ok = true; + else if (aLevel == 5 && (objFather->Tag() == SMESH::Tag_RefOnAppliedAlgorithms)) + // applied local algo + Ok = true; + break; + } + case SMESH::MESH: + { + if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot)) + Ok = true; + break; + } + case SMESH::SUBMESH: + { + // see SMESH_Gen_i.cxx for tag numbers + if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh && + objFather->Tag() <= SMESH::Tag_LastSubMesh)) + Ok = true; + break; + } + case SMESH::MESHorSUBMESH: + { + if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot)) + Ok = true; // mesh + else if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh && + objFather->Tag() <= SMESH::Tag_LastSubMesh)) + Ok = true; + break; + } + case SMESH::SUBMESH_VERTEX: // Label "SubMeshes on vertexes" + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnVertex)) + Ok = true; + break; + } + case SMESH::SUBMESH_EDGE: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnEdge)) + Ok = true; + break; + } + case SMESH::SUBMESH_FACE: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnFace)) + Ok = true; + break; + } + case SMESH::SUBMESH_SOLID: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnSolid)) + Ok = true; + break; + } + case SMESH::SUBMESH_COMPOUND: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnCompound)) + Ok = true; + break; + } + case SMESH::GROUP: + { + if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstGroup)) + Ok = true; + break; + } + case SMESH::GROUP_NODE: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_NodeGroups)) + Ok = true; + break; + } + case SMESH::GROUP_EDGE: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_EdgeGroups)) + Ok = true; + break; + } + case SMESH::GROUP_FACE: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_FaceGroups)) + Ok = true; + break; + } + case SMESH::GROUP_VOLUME: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_VolumeGroups)) + Ok = true; + break; + } + case SMESH::GROUP_0D: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_0DElementsGroups)) + Ok = true; + break; + } + case SMESH::GROUP_BALL: + { + if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_BallElementsGroups)) + Ok = true; + break; + } + 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 = isIDSourceOfType( obj, SMESH::VOLUME ); + break; + } + default:; + } } - return false; + return Ok; +} + +SMESH::MeshObjectType SMESH_TypeFilter::type() const +{ + return myType; }