1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // SMESHGUI_Filter : Filters for VTK viewer
23 // File : SMESHGUI_Filter.cxx
24 // Author : Sergey LITONIN, Open CASCADE S.A.S.
27 #include "SMESHGUI_Filter.h"
29 #include "SMESHGUI_Utils.h"
31 #include <SMESH_Actor.h>
32 #include <SMDS_Mesh.hxx>
33 #include <SMDSAbs_ElementType.hxx>
35 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter)
36 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter)
38 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter)
39 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_PredicateFilter, SMESHGUI_Filter)
41 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter)
42 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter)
44 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter)
45 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_TriangleFilter, SMESHGUI_Filter)
47 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter)
48 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_FacesFilter, SMESHGUI_Filter)
50 IMPLEMENT_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter)
51 IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumesFilter, SMESHGUI_Filter)
54 Class : SMESHGUI_PredicateFilter
55 Description : Selection filter for VTK viewer. This class aggregate object
56 of SMESH_Predicate class and uses it for verification of criterion
59 //=======================================================================
60 // name : SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter
61 // Purpose : Constructor
62 //=======================================================================
63 SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter()
67 SMESHGUI_PredicateFilter::~SMESHGUI_PredicateFilter()
71 //=======================================================================
72 // name : SMESHGUI_PredicateFilter::IsValid
73 // Purpose : Verify whether entry id satisfies to criterion of the filter
74 //=======================================================================
75 bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const
77 if ( myActor == 0 || myPred->_is_nil() )
80 SMESH_Actor* anActor = dynamic_cast<SMESH_Actor*>( myActor );
81 if ( !anActor || anActor->GetObject() == 0 )
84 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
85 SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)myPred->GetElementType();
86 int aMeshId = anElemType == SMDSAbs_Node ? anActor->GetNodeObjId( theCellId )
87 : anActor->GetElemObjId( theCellId );
89 // if type of element != type of predicate return true because
90 // this predicate is not intended for filtering sush elements
91 const SMDS_MeshElement* anElem = anElemType == SMDSAbs_Node ? aMesh->FindNode( aMeshId )
92 : aMesh->FindElement( aMeshId );
93 // here we guess that predicate element type can not be All in case of node selection
94 if ( !anElem || (anElemType != SMDSAbs_All && anElem->GetType() != anElemType) )
97 return myPred->IsSatisfy( aMeshId );
100 //=======================================================================
101 // name : SMESHGUI_PredicateFilter::IsValid
102 // Purpose : Verify whether entry id satisfies to criterion of the filter
103 //=======================================================================
104 bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const
106 if ( myActor == 0 || myPred->_is_nil() )
109 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
110 if ( anActor->GetObject() == 0 )
113 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
114 SMDSAbs_ElementType anElemType = (SMDSAbs_ElementType)myPred->GetElementType();
116 // if type of element != type of predicate return true because
117 // this predicate is not intended for filtering sush elements
118 const SMDS_MeshElement* anElem = anElemType == SMDSAbs_Node ? aMesh->FindNode( theObjId )
119 : aMesh->FindElement( theObjId );
120 // here we guess that predicate element type can not be All in case of node selection
121 if ( !anElem || (anElemType != SMDSAbs_All && anElem->GetType() != anElemType) )
124 return myPred->IsSatisfy( theObjId );
127 //=======================================================================
128 // name : SMESHGUI_PredicateFilter::IsNodeFilter
129 // Purpose : Returns true if filter is intended for nodes
130 //=======================================================================
131 bool SMESHGUI_PredicateFilter::IsNodeFilter() const
133 return GetId() == SMESH::NodeFilter;
136 //=======================================================================
137 // name : SMESHGUI_PredicateFilter::SetPredicate
138 // Purpose : Set new pridicate to the filter
139 //=======================================================================
140 void SMESHGUI_PredicateFilter::SetPredicate( SMESH::Predicate_ptr thePred )
142 myPred = SMESH::Predicate::_duplicate( thePred );
145 //=======================================================================
146 // name : SMESHGUI_PredicateFilter::SetActor
147 // Purpose : Set new actor
148 //=======================================================================
149 void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor )
151 if ( myActor == theActor )
153 SMESHGUI_Filter::SetActor( theActor );
155 if ( myActor != 0 && !myPred->_is_nil() )
157 SALOME_Actor* sActor = dynamic_cast<SALOME_Actor*>( myActor );
158 Handle(SALOME_InteractiveObject) anIO;
160 anIO = sActor->getIO();
161 if ( !anIO.IsNull() )
163 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
164 if(!aMesh->_is_nil())
165 myPred->SetMesh(aMesh);
170 //=======================================================================
171 // name : SMESHGUI_PredicateFilter::SetActor
172 // Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
173 // enumeration. All filters must have different ids
174 //=======================================================================
175 int SMESHGUI_PredicateFilter::GetId() const
177 if ( myPred->GetElementType() == SMESH::NODE ) return SMESH::NodeFilter;
178 else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESH::EdgeFilter;
179 else if ( myPred->GetElementType() == SMESH::FACE ) return SMESH::FaceFilter;
180 else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESH::VolumeFilter;
181 else if ( myPred->GetElementType() == SMESH::ALL ) return SMESH::AllElementsFilter;
182 else return SMESH::UnknownFilter;
187 Class : SMESHGUI_QuadrangleFilter
188 Description : Verify whether selected cell is quadranle
191 //=======================================================================
192 // name : SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter
193 // Purpose : Constructor
194 //=======================================================================
195 SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter()
200 SMESHGUI_QuadrangleFilter::~SMESHGUI_QuadrangleFilter()
204 //=======================================================================
205 // name : SMESHGUI_QuadrangleFilter::IsValid
206 // Purpose : Verify whether selected cell is quadranle
207 //=======================================================================
208 bool SMESHGUI_QuadrangleFilter::IsValid( const int theCellId ) const
213 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
214 if ( anActor->GetObject() == 0 )
217 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
218 const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
220 return anElem && anElem->GetType() == SMDSAbs_Face &&
221 ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 8 : 4 ));
224 //=======================================================================
225 // name : SMESHGUI_QuadrangleFilter::IsValid
226 // Purpose : Verify whether selected cell is quadranle
227 //=======================================================================
228 bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const
233 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
234 if ( anActor->GetObject() == 0 )
237 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
238 const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
240 return anElem && anElem->GetType() == SMDSAbs_Face &&
241 ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 8 : 4 ));
244 //=======================================================================
245 // name : SMESHGUI_QuadrangleFilter::SetActor
246 // Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
247 // enumeration. All filters must have different ids
248 //=======================================================================
249 int SMESHGUI_QuadrangleFilter::GetId() const
251 return SMESH::QuadFilter;
254 //=======================================================================
255 // name : SMESHGUI_QuadrangleFilter::IsNodeFilter
256 // Purpose : Returns true if filter is intended for nodes
257 //=======================================================================
258 bool SMESHGUI_QuadrangleFilter::IsNodeFilter() const
265 Class : SMESHGUI_TriangleFilter
266 Description : Verify whether selected cell is triangle
270 //=======================================================================
271 // name : SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter
272 // Purpose : Constructor
273 //=======================================================================
274 SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter()
279 SMESHGUI_TriangleFilter::~SMESHGUI_TriangleFilter()
283 //=======================================================================
284 // name : SMESHGUI_TriangleFilter::IsValid
285 // Purpose : Verify whether selected cell is triangle
286 //=======================================================================
287 bool SMESHGUI_TriangleFilter::IsValid( const int theCellId ) const
292 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
293 if ( anActor->GetObject() == 0 )
296 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
297 const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
299 return anElem && anElem->GetType() == SMDSAbs_Face &&
300 ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 6 : 3 ));
303 //=======================================================================
304 // name : SMESHGUI_TriangleFilter::IsValid
305 // Purpose : Verify whether selected cell is triangle
306 //=======================================================================
307 bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const
312 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
313 if ( anActor->GetObject() == 0 )
316 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
317 const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
319 return anElem && anElem->GetType() == SMDSAbs_Face &&
320 ( anElem->NbNodes() == ( anElem->IsQuadratic() ? 6 : 3 ));
323 //=======================================================================
324 // name : SMESHGUI_TriangleFilter::SetActor
325 // Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
326 // enumeration. All filters must have different ids
327 //=======================================================================
328 int SMESHGUI_TriangleFilter::GetId() const
330 return SMESH::TriaFilter;
333 //=======================================================================
334 // name : SMESHGUI_TriangleFilter::IsNodeFilter
335 // Purpose : Returns true if filter is intended for nodes
336 //=======================================================================
337 bool SMESHGUI_TriangleFilter::IsNodeFilter() const
343 Class : SMESHGUI_FacesFilter
344 Description : Verify whether selected cell is any face
348 //=======================================================================
349 // name : SMESHGUI_FacesFilter::SMESHGUI_FacesFilter
350 // Purpose : Constructor
351 //=======================================================================
352 SMESHGUI_FacesFilter::SMESHGUI_FacesFilter()
357 SMESHGUI_FacesFilter::~SMESHGUI_FacesFilter()
361 //=======================================================================
362 // name : SMESHGUI_FacesFilter::IsValid
363 // Purpose : Verify whether selected cell is face
364 //=======================================================================
365 bool SMESHGUI_FacesFilter::IsValid( const int theCellId ) const
370 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
371 if ( anActor->GetObject() == 0 )
374 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
375 const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
377 return anElem && anElem->GetType() == SMDSAbs_Face;
380 //=======================================================================
381 // name : SMESHGUI_FacesFilter::IsValid
382 // Purpose : Verify whether selected cell is face
383 //=======================================================================
384 bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const
389 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
390 if ( anActor->GetObject() == 0 )
393 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
394 const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
396 return anElem && anElem->GetType() == SMDSAbs_Face;
399 //=======================================================================
400 // name : SMESHGUI_FacesFilter::GetId
401 // Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
402 // enumeration. All filters must have different ids
403 //=======================================================================
404 int SMESHGUI_FacesFilter::GetId() const
406 return SMESH::FaceFilter;
409 //=======================================================================
410 // name : SMESHGUI_FacesFilter::IsNodeFilter
411 // Purpose : Returns true if filter is intended for nodes
412 //=======================================================================
413 bool SMESHGUI_FacesFilter::IsNodeFilter() const
420 Class : SMESHGUI_VolumesFilter
421 Description : Verify whether selected cell is any volume
425 //=======================================================================
426 // name : SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter
427 // Purpose : Constructor
428 //=======================================================================
429 SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter()
434 SMESHGUI_VolumesFilter::~SMESHGUI_VolumesFilter()
438 //=======================================================================
439 // name : SMESHGUI_VolumesFilter::IsValid
440 // Purpose : Verify whether selected cell is volume
441 //=======================================================================
442 bool SMESHGUI_VolumesFilter::IsValid( const int theCellId ) const
447 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
448 if ( anActor->GetObject() == 0 )
451 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
452 const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
454 return anElem && anElem->GetType() == SMDSAbs_Volume;
457 //=======================================================================
458 // name : SMESHGUI_VolumesFilter::IsValid
459 // Purpose : Verify whether selected cell is volume
460 //=======================================================================
461 bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const
466 SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
467 if ( anActor->GetObject() == 0 )
470 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
471 const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
473 return anElem && anElem->GetType() == SMDSAbs_Volume;
476 //=======================================================================
477 // name : SMESHGUI_VolumesFilter::GetId
478 // Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
479 // enumeration. All filters must have different ids
480 //=======================================================================
481 int SMESHGUI_VolumesFilter::GetId() const
483 return SMESH::VolumeFilter;
486 //=======================================================================
487 // name : SMESHGUI_VolumesFilter::IsNodeFilter
488 // Purpose : Returns true if filter is intended for nodes
489 //=======================================================================
490 bool SMESHGUI_VolumesFilter::IsNodeFilter() const