Salome HOME
23418: [OCC] Mesh: Minimization of memory usage of SMESH
[modules/smesh.git] / src / SMDS / SMDS_VtkCellIterator.cxx
index a0f0d378425d14c48c1fda1433c6f832f1bcdb5a..0f474492576f364de0d49ef933eba26ec49e4e2f 100644 (file)
 #include "SMDS_VtkCellIterator.hxx"
 #include "utilities.h"
 
-SMDS_VtkCellIterator::SMDS_VtkCellIterator(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType aType) :
-  _mesh(mesh), _cellId(vtkCellId), _index(0), _type(aType)
+#include <vtkCell.h>
+#include <vtkIdList.h>
+
+_GetVtkNodes::_GetVtkNodes( vtkIdList*         _vtkIdList,
+                            SMDS_Mesh*         mesh,
+                            int                vtkCellId,
+                            SMDSAbs_EntityType aType )
 {
-  vtkUnstructuredGrid* grid = _mesh->getGrid();
-  _vtkIdList = vtkIdList::New();
+  vtkUnstructuredGrid* grid = mesh->GetGrid();
   const std::vector<int>& interlace = SMDS_MeshCell::fromVtkOrder( aType );
   if ( interlace.empty() )
   {
-    grid->GetCellPoints(_cellId, _vtkIdList);
-    _nbNodes = _vtkIdList->GetNumberOfIds();
+    grid->GetCellPoints( vtkCellId, _vtkIdList );
   }
   else
   {
     vtkIdType npts, *pts;
-    grid->GetCellPoints( _cellId, npts, pts );
-    _vtkIdList->SetNumberOfIds( _nbNodes = npts );
-    for (int i = 0; i < _nbNodes; i++)
+    grid->GetCellPoints( vtkCellId, npts, pts );
+    _vtkIdList->SetNumberOfIds( npts );
+    for (int i = 0; i < npts; i++)
       _vtkIdList->SetId(i, pts[interlace[i]]);
   }
 }
 
-SMDS_VtkCellIterator::~SMDS_VtkCellIterator()
-{
-  _vtkIdList->Delete();
-}
-
-bool SMDS_VtkCellIterator::more()
-{
-  return (_index < _nbNodes);
-}
-
-const SMDS_MeshElement* SMDS_VtkCellIterator::next()
+_GetVtkNodesToUNV::_GetVtkNodesToUNV( vtkIdList*         _vtkIdList,
+                                      SMDS_Mesh*         mesh,
+                                      int                vtkCellId,
+                                      SMDSAbs_EntityType aType )
 {
-  vtkIdType id = _vtkIdList->GetId(_index++);
-  return _mesh->FindNodeVtk(id);
-}
-
-SMDS_VtkCellIteratorToUNV::SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType aType) :
-  SMDS_VtkCellIterator()
-{
-  _mesh = mesh;
-  _cellId = vtkCellId;
-  _index = 0;
-  _type = aType;
-  //MESSAGE("SMDS_VtkCellInterlacedIterator (UNV)" << _type);
-
-  _vtkIdList = vtkIdList::New();
-  vtkIdType* pts;
-  vtkUnstructuredGrid* grid = _mesh->getGrid();
-  grid->GetCellPoints((vtkIdType)_cellId, (vtkIdType&)_nbNodes, pts);
-  _vtkIdList->SetNumberOfIds(_nbNodes);
+  vtkIdType * pts, npts;
+  vtkUnstructuredGrid* grid = mesh->GetGrid();
+  grid->GetCellPoints( (vtkIdType)vtkCellId, npts, pts );
   const int *ids = 0;
-  switch (_type)
+  switch (aType)
   {
   case SMDSEntity_Quad_Edge:
   {
@@ -85,7 +66,7 @@ SMDS_VtkCellIteratorToUNV::SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCel
   {
     static int id[] = { 0, 3, 1, 4, 2, 5 };
     ids = id;
-    _nbNodes = 6;
+    npts = 6;
     break;
   }
   case SMDSEntity_Quad_Quadrangle:
@@ -93,7 +74,7 @@ SMDS_VtkCellIteratorToUNV::SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCel
   {
     static int id[] = { 0, 4, 1, 5, 2, 6, 3, 7 };
     ids = id;
-    _nbNodes = 8;
+    npts = 8;
     break;
   }
   case SMDSEntity_Quad_Tetra:
@@ -126,7 +107,7 @@ SMDS_VtkCellIteratorToUNV::SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCel
   {
     static int id[] = { 0, 8, 1, 9, 2, 10, 3, 11, 16, 17, 18, 19, 4, 12, 5, 13, 6, 14, 7, 15 };
     ids = id;
-    _nbNodes = 20;
+    npts = 20;
     break;
   }
   case SMDSEntity_Polygon:
@@ -134,62 +115,42 @@ SMDS_VtkCellIteratorToUNV::SMDS_VtkCellIteratorToUNV(SMDS_Mesh* mesh, int vtkCel
   case SMDSEntity_Polyhedra:
   case SMDSEntity_Quad_Polyhedra:
   default:
-    const std::vector<int>& i = SMDS_MeshCell::interlacedSmdsOrder(aType, _nbNodes);
+    const std::vector<int>& i = SMDS_MeshCell::interlacedSmdsOrder( aType, npts );
     if ( !i.empty() )
       ids = & i[0];
   }
 
+  _vtkIdList->SetNumberOfIds( npts );
+
   if ( ids )
-    for (int i = 0; i < _nbNodes; i++)
+    for (int i = 0; i < npts; i++)
       _vtkIdList->SetId(i, pts[ids[i]]);
   else
-    for (int i = 0; i < _nbNodes; i++)
+    for (int i = 0; i < npts; i++)
       _vtkIdList->SetId(i, pts[i]);
 }
 
-bool SMDS_VtkCellIteratorToUNV::more()
+_GetVtkNodesPolyh::_GetVtkNodesPolyh( vtkIdList*         _vtkIdList,
+                                      SMDS_Mesh*         mesh,
+                                      int                vtkCellId,
+                                      SMDSAbs_EntityType aType )
 {
-  return SMDS_VtkCellIterator::more();
-}
-
-const SMDS_MeshNode* SMDS_VtkCellIteratorToUNV::next()
-{
-  return static_cast< const SMDS_MeshNode* >( SMDS_VtkCellIterator::next() );
-}
-
-SMDS_VtkCellIteratorToUNV::~SMDS_VtkCellIteratorToUNV()
-{
-}
-
-SMDS_VtkCellIteratorPolyH::SMDS_VtkCellIteratorPolyH(SMDS_Mesh* mesh, int vtkCellId, SMDSAbs_EntityType aType) :
-  SMDS_VtkCellIterator()
-{
-  _mesh = mesh;
-  _cellId = vtkCellId;
-  _index = 0;
-  _type = aType;
-  //MESSAGE("SMDS_VtkCellIteratorPolyH " << _type);
-  _vtkIdList = vtkIdList::New();
-  vtkUnstructuredGrid* grid = _mesh->getGrid();
-  grid->GetCellPoints(_cellId, _vtkIdList);
-  _nbNodes = _vtkIdList->GetNumberOfIds();
-  switch (_type)
+  vtkUnstructuredGrid* grid = mesh->GetGrid();
+  switch (aType)
   {
   case SMDSEntity_Polyhedra:
   {
-    //MESSAGE("SMDS_VtkCellIterator Polyhedra");
     vtkIdType nFaces = 0;
     vtkIdType* ptIds = 0;
-    grid->GetFaceStream(_cellId, nFaces, ptIds);
-    int id = 0;
-    _nbNodesInFaces = 0;
+    grid->GetFaceStream( vtkCellId, nFaces, ptIds );
+    int id = 0, nbNodesInFaces = 0;
     for (int i = 0; i < nFaces; i++)
     {
       int nodesInFace = ptIds[id]; // nodeIds in ptIds[id+1 .. id+nodesInFace]
-      _nbNodesInFaces += nodesInFace;
+      nbNodesInFaces += nodesInFace;
       id += (nodesInFace + 1);
     }
-    _vtkIdList->SetNumberOfIds(_nbNodesInFaces);
+    _vtkIdList->SetNumberOfIds( nbNodesInFaces );
     id = 0;
     int n = 0;
     for (int i = 0; i < nFaces; i++)
@@ -205,12 +166,3 @@ SMDS_VtkCellIteratorPolyH::SMDS_VtkCellIteratorPolyH(SMDS_Mesh* mesh, int vtkCel
     assert(0);
   }
 }
-
-SMDS_VtkCellIteratorPolyH::~SMDS_VtkCellIteratorPolyH()
-{
-}
-
-bool SMDS_VtkCellIteratorPolyH::more()
-{
-  return (_index < _nbNodesInFaces);
-}