X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_Filter.cxx;h=1aba21f879a5b1803ec7f8e24e7b5defd2613273;hp=52f36378b4bc3837f9e8f4f118fe6412de315238;hb=refs%2Ftags%2FV9_7_0a1;hpb=fe4f5ef4abc979a05b356800b95cc66053634b24 diff --git a/src/SMESHGUI/SMESHGUI_Filter.cxx b/src/SMESHGUI/SMESHGUI_Filter.cxx old mode 100755 new mode 100644 index 52f36378b..1aba21f87 --- a/src/SMESHGUI/SMESHGUI_Filter.cxx +++ b/src/SMESHGUI/SMESHGUI_Filter.cxx @@ -1,60 +1,45 @@ -// SMESHGUI_PredicateFilter : Filters for VTK viewer +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// 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. +// 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. +// 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 +// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// -// -// File : SMESHGUI_Filter.cxx -// Author : Sergey LITONIN -// Module : SMESH +// SMESHGUI_Filter : Filters for VTK viewer +// File : SMESHGUI_Filter.cxx +// Author : Sergey LITONIN, Open CASCADE S.A.S. +// SMESH includes +// #include "SMESHGUI_Filter.h" -#include "SMESHGUI_Utils.h" -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDSAbs_ElementType.hxx" -#include +#include "SMESHGUI_Utils.h" -#include -#include -#include "SMESH_Actor.h" -#include "SMESHGUI.h" +#include +#include +#include -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_PredicateFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_TriangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_FacesFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter) IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumesFilter, SMESHGUI_Filter) +IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumeShapeFilter, SMESHGUI_Filter) /* Class : SMESHGUI_PredicateFilter @@ -78,7 +63,7 @@ SMESHGUI_PredicateFilter::~SMESHGUI_PredicateFilter() // name : SMESHGUI_PredicateFilter::IsValid // Purpose : Verify whether entry id satisfies to criterion of the filter //======================================================================= -bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const +bool SMESHGUI_PredicateFilter::IsValid( const vtkIdType theCellId ) const { if ( myActor == 0 || myPred->_is_nil() ) return false; @@ -86,18 +71,19 @@ bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const SMESH_Actor* anActor = dynamic_cast( myActor ); if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - int aMeshId = anElemType == SMESH::NODE ? anActor->GetNodeObjId( theCellId ) - : anActor->GetElemObjId( theCellId ); + SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)myPred->GetElementType(); + int aMeshId = anElemType == SMDSAbs_Node ? anActor->GetNodeObjId( theCellId ) + : anActor->GetElemObjId( theCellId ); // if type of element != type of predicate return true because // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( aMeshId ) - : aMesh->FindElement( aMeshId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; + const SMDS_MeshElement* anElem = anElemType == SMDSAbs_Node ? aMesh->FindNode( aMeshId ) + : aMesh->FindElement( aMeshId ); + // here we guess that predicate element type can not be All in case of node selection + if ( !anElem || (anElemType != SMDSAbs_All && anElem->GetType() != anElemType) ) + return false; return myPred->IsSatisfy( aMeshId ); } @@ -111,19 +97,20 @@ bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const if ( myActor == 0 || myPred->_is_nil() ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - + SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)myPred->GetElementType(); + // if type of element != type of predicate return true because // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( theObjId ) - : aMesh->FindElement( theObjId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; + const SMDS_MeshElement* anElem = anElemType == SMDSAbs_Node ? aMesh->FindNode( theObjId ) + : aMesh->FindElement( theObjId ); + // here we guess that predicate element type can not be All in case of node selection + if ( !anElem || (anElemType != SMDSAbs_All && anElem->GetType() != anElemType) ) + return false; return myPred->IsSatisfy( theObjId ); } @@ -134,7 +121,7 @@ bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const //======================================================================= bool SMESHGUI_PredicateFilter::IsNodeFilter() const { - return GetId() == SMESHGUI_NodeFilter; + return GetId() == SMESH::NodeFilter; } //======================================================================= @@ -158,7 +145,10 @@ void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor ) if ( myActor != 0 && !myPred->_is_nil() ) { - Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); + SALOME_Actor* sActor = dynamic_cast( myActor ); + Handle(SALOME_InteractiveObject) anIO; + if( sActor ) + anIO = sActor->getIO(); if ( !anIO.IsNull() ) { SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(anIO); @@ -175,18 +165,18 @@ void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor ) //======================================================================= int SMESHGUI_PredicateFilter::GetId() const { - if ( myPred->GetElementType() == SMESH::NODE ) return SMESHGUI_NodeFilter; - else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESHGUI_EdgeFilter; - else if ( myPred->GetElementType() == SMESH::FACE ) return SMESHGUI_FaceFilter; - else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESHGUI_VolumeFilter; - else if ( myPred->GetElementType() == SMESH::ALL ) return SMESHGUI_AllElementsFilter; - else return SMESHGUI_UnknownFilter; + if ( myPred->GetElementType() == SMESH::NODE ) return SMESH::NodeFilter; + else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESH::EdgeFilter; + else if ( myPred->GetElementType() == SMESH::FACE ) return SMESH::FaceFilter; + else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESH::VolumeFilter; + else if ( myPred->GetElementType() == SMESH::ALL ) return SMESH::AllElementsFilter; + else return SMESH::UnknownFilter; } /* Class : SMESHGUI_QuadrangleFilter - Description : Verify whether selected cell is quadranle + Description : Verify whether selected cell is quadrangle */ //======================================================================= @@ -204,40 +194,42 @@ SMESHGUI_QuadrangleFilter::~SMESHGUI_QuadrangleFilter() //======================================================================= // name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle +// Purpose : Verify whether selected cell is quadrangle //======================================================================= -bool SMESHGUI_QuadrangleFilter::IsValid( const int theCellId ) const +bool SMESHGUI_QuadrangleFilter::IsValid( const vtkIdType theCellId ) const { if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; + + return anElem && anElem->GetType() == SMDSAbs_Face && + ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 8 : 4 )); } //======================================================================= // name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle +// Purpose : Verify whether selected cell is quadrangle //======================================================================= bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const { if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; + return anElem && anElem->GetType() == SMDSAbs_Face && + ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 8 : 4 )); } //======================================================================= @@ -247,7 +239,7 @@ bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const //======================================================================= int SMESHGUI_QuadrangleFilter::GetId() const { - return SMESHGUI_QuadFilter; + return SMESH::QuadFilter; } //======================================================================= @@ -283,19 +275,20 @@ SMESHGUI_TriangleFilter::~SMESHGUI_TriangleFilter() // name : SMESHGUI_TriangleFilter::IsValid // Purpose : Verify whether selected cell is triangle //======================================================================= -bool SMESHGUI_TriangleFilter::IsValid( const int theCellId ) const +bool SMESHGUI_TriangleFilter::IsValid( const vtkIdType theCellId ) const { if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; + return anElem && anElem->GetType() == SMDSAbs_Face && + ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 6 : 3 )); } //======================================================================= @@ -307,14 +300,15 @@ bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; + return anElem && anElem->GetType() == SMDSAbs_Face && + ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 6 : 3 )); } //======================================================================= @@ -324,7 +318,7 @@ bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const //======================================================================= int SMESHGUI_TriangleFilter::GetId() const { - return SMESHGUI_TriaFilter; + return SMESH::TriaFilter; } //======================================================================= @@ -359,15 +353,15 @@ SMESHGUI_FacesFilter::~SMESHGUI_FacesFilter() // name : SMESHGUI_FacesFilter::IsValid // Purpose : Verify whether selected cell is face //======================================================================= -bool SMESHGUI_FacesFilter::IsValid( const int theCellId ) const +bool SMESHGUI_FacesFilter::IsValid( const vtkIdType theCellId ) const { if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); @@ -383,10 +377,10 @@ bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); @@ -400,7 +394,7 @@ bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const //======================================================================= int SMESHGUI_FacesFilter::GetId() const { - return SMESHGUI_FaceFilter; + return SMESH::FaceFilter; } //======================================================================= @@ -436,15 +430,15 @@ SMESHGUI_VolumesFilter::~SMESHGUI_VolumesFilter() // name : SMESHGUI_VolumesFilter::IsValid // Purpose : Verify whether selected cell is volume //======================================================================= -bool SMESHGUI_VolumesFilter::IsValid( const int theCellId ) const +bool SMESHGUI_VolumesFilter::IsValid( const vtkIdType theCellId ) const { - if ( myActor == 0 ) + if ( myActor == 0 || theCellId < 1 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); @@ -460,10 +454,10 @@ bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const if ( myActor == 0 ) return false; - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) return false; - + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); @@ -477,7 +471,7 @@ bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const //======================================================================= int SMESHGUI_VolumesFilter::GetId() const { - return SMESHGUI_VolumeFilter; + return SMESH::VolumeFilter; } //======================================================================= @@ -490,12 +484,84 @@ bool SMESHGUI_VolumesFilter::IsNodeFilter() const } +/* + Class : SMESHGUI_VolumeShapeFilter + Description : Verify whether selected cell is a volume of a certain shape +*/ + + +//======================================================================= +// name : SMESHGUI_VolumeShapeFilter::SMESHGUI_VolumeShapeFilter +// Purpose : Constructor +//======================================================================= +SMESHGUI_VolumeShapeFilter::SMESHGUI_VolumeShapeFilter(const SMDSAbs_GeometryType shape) + : SMESHGUI_Filter(), myGeometryType( shape ) +{ +} + +//======================================================================= +// name : SMESHGUI_VolumeShapeFilter::IsValid +// Purpose : Verify whether selected cell is a volume of a certain shape +//======================================================================= +bool SMESHGUI_VolumeShapeFilter::IsValid( const vtkIdType theCellId ) const +{ + if ( myActor == 0 || theCellId < 1 ) + return false; + + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) + return false; + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); + const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); + return anElem && anElem->GetGeomType() == myGeometryType; +} +//======================================================================= +// name : SMESHGUI_VolumeShapeFilter::IsValid +// Purpose : Verify whether selected cell is volume +//======================================================================= +bool SMESHGUI_VolumeShapeFilter::IsObjValid( const int theObjId ) const +{ + if ( myActor == 0 ) + return false; + SMESH_Actor* anActor = dynamic_cast< SMESH_Actor* >( myActor ); + if ( !anActor || anActor->GetObject() == 0 ) + return false; + SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); + const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); + return anElem && anElem->GetGeomType() == myGeometryType; +} +//======================================================================= +// name : SMESHGUI_VolumeShapeFilter::GetId +// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType +// enumeration. All filters must have different ids +//======================================================================= +int SMESHGUI_VolumeShapeFilter::GetId() const +{ + return GetId( myGeometryType ); +} +//======================================================================= +//function : GetId +//purpose : Compose filter ID basing on +//======================================================================= + +int SMESHGUI_VolumeShapeFilter::GetId( SMDSAbs_GeometryType shape ) +{ + return SMESH::FirstGeometryTypeFilter + shape; +} +//======================================================================= +// name : SMESHGUI_VolumeShapeFilter::IsNodeFilter +// Purpose : Returns true if filter is intended for nodes +//======================================================================= +bool SMESHGUI_VolumeShapeFilter::IsNodeFilter() const +{ + return false; +}