Search code examples
c++vtk

How to access vertex and index array of a mesh obtained from STLreader in VTK?


I have the following code to read a mesh data from a stl file and show it in a window. The code works fine; but I need to access the vertex and index arrays in order to make some data processing; change the mesh and then render it. I was wondering how is it possible to get access to those arrays that have the coordinates of the vertices of the mesh and the index numbers of them in forming the triangles of the mesh. It seems to be a very basic step but I couldn't find any answer in VTK's wiki.

int main ( int argc, char *argv[] )
{

  std::string inputFilename = "Scapula.stl";

  vtkSmartPointer<vtkSTLReader> reader =
    vtkSmartPointer<vtkSTLReader>::New();
  reader->SetFileName(inputFilename.c_str());
  reader->Update();

  // Visualize
  vtkSmartPointer<vtkPolyDataMapper> mapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputConnection(reader->GetOutputPort());

  vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);

  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  renderer->AddActor(actor);
  renderer->SetBackground(.3, .6, .3); // Background color green

  renderWindow->Render();
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

Solution

  • All this information is stored within vtkPolyData which can be extracted from the vtkSTLreader. Here is the way I could get the vertices and indices of a mesh stored in a stl file:

    //Data source
    
    std::string inputFilename = "reamer.stl";
    
    vtkSmartPointer<vtkSTLReader> reader =
        vtkSmartPointer<vtkSTLReader>::New();
    
    reader->SetFileName(inputFilename.c_str());
    
    reader->Update();
    
    vtkSmartPointer<vtkPolyData> mesh = reader->GetOutput();
    
    vtkSmartPointer<vtkPoints> points = mesh->GetPoints();
    
    vtkSmartPointer<vtkDataArray> dataArray = points->GetData();
    
    vtkIdType numberOfFaces = mesh->GetNumberOfCells();
    
        mesh->GetCellPoints(i, faceIndex);
    
        vertexIndex = faceIndex->GetId(0);
    
        vertexArray[0] = dataArray->GetComponent(vertexIndex, 0);
    
        vertexArray[1] = dataArray->GetComponent(vertexIndex, 1);
    
        vertexArray[2] = dataArray->GetComponent(vertexIndex, 2);
    
        vertexIndex = faceIndex->GetId(1);
    
        vertexArray[3] = dataArray->GetComponent(vertexIndex, 0);
    
        vertexArray[4] = dataArray->GetComponent(vertexIndex, 1);
    
        vertexArray[5] = dataArray->GetComponent(vertexIndex, 2);
    
        vertexIndex = faceIndex->GetId(2);
    
        vertexArray[6] = dataArray->GetComponent(vertexIndex, 0);
    
        vertexArray[7] = dataArray->GetComponent(vertexIndex, 1);
    
        vertexArray[8] = dataArray->GetComponent(vertexIndex, 2);
    

    Where the vertexArray is the array that has coordinates of the first indexed triangle of the mesh for i=0. You can loop over i to get coordinates of the rest of triangles.