Salome HOME
Increment version: 8.5.0
[modules/smesh.git] / src / SMDS / SMDS_VtkCellIterator.hxx
1 // Copyright (C) 2010-2016  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef _SMDS_VTKCELLITERATOR_HXX_
21 #define _SMDS_VTKCELLITERATOR_HXX_
22
23 #include "SMDS_ElemIterator.hxx"
24 #include "SMDS_Mesh.hxx"
25 #include "SMDSAbs_ElementType.hxx"
26
27 #include <vtkCell.h>
28 #include <vtkIdList.h>
29
30 //--------------------------------------------------------------------------------
31 /*!
32  * \brief Retrieve nodes of a cell
33  */
34 struct _GetVtkNodes
35 {
36   _GetVtkNodes( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
37 };
38 struct _GetVtkNodesToUNV
39 {
40   _GetVtkNodesToUNV( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
41 };
42 struct _GetVtkNodesPolyh
43 {
44   _GetVtkNodesPolyh( vtkIdList* nodeIds, SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type);
45 };
46
47 //--------------------------------------------------------------------------------
48 /*!
49  * \brief Iterator on nodes of a cell
50  */
51 template< class SMDS_ITERATOR = SMDS_ElemIterator, class GET_VTK_NODES = _GetVtkNodes >
52 class SMDS_VtkCellIterator: public SMDS_ITERATOR
53 {
54 public:
55   typedef typename SMDS_ITERATOR::value_type result_type;
56
57   SMDS_VtkCellIterator(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType aType)
58     : _mesh(mesh), _index(0), _vtkIdList( vtkIdList::New() )
59   {
60     GET_VTK_NODES getNodes( _vtkIdList, mesh, vtkCellId, aType );
61   }
62   virtual ~SMDS_VtkCellIterator() { _vtkIdList->Delete(); }
63   virtual bool        more()      {  return ( _index < _vtkIdList->GetNumberOfIds() ); }
64   virtual result_type next()      {
65     vtkIdType id = _vtkIdList->GetId( _index++ );
66     return static_cast<result_type>( _mesh->FindNodeVtk( id ));
67   }
68 protected:
69   SMDS_Mesh* _mesh;
70   int        _index;
71   vtkIdList* _vtkIdList;
72 };
73
74 //--------------------------------------------------------------------------------
75 template< class SMDS_ITERATOR = SMDS_ElemIterator >
76 class SMDS_VtkCellIteratorToUNV: public SMDS_VtkCellIterator< SMDS_ITERATOR, _GetVtkNodesToUNV >
77 {
78   typedef SMDS_VtkCellIterator< SMDS_ITERATOR, _GetVtkNodesToUNV > parent_t;
79 public:
80   SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type):
81     parent_t( mesh, vtkCellId, type ) {}
82 };
83
84 //--------------------------------------------------------------------------------
85 template< class SMDS_ITERATOR = SMDS_ElemIterator >
86 class SMDS_VtkCellIteratorPolyH: public SMDS_VtkCellIterator< SMDS_ITERATOR, _GetVtkNodesPolyh >
87 {
88   typedef SMDS_VtkCellIterator< SMDS_ITERATOR, _GetVtkNodesPolyh > parent_t;
89 public:
90   SMDS_VtkCellIteratorPolyH(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType type):
91     parent_t( mesh, vtkCellId, type ) {}
92 };
93
94 #endif