Read a VTP file

From KitwarePublic
Jump to navigationJump to search

As VTP is a very flexible format, there is no way to make a generic reader. You must read the data that you are interested in. A generic reader can only look for points and triangles.

<source lang="cpp">

  1. include <iostream>
  2. include <vector>
  1. include "vtkCellArray.h"
  2. include "vtkPoints.h"
  3. include "vtkXMLPolyDataReader.h"
  4. include "vtkPolyData.h"

struct Point { double x,y,z; Point(const double xin, const double yin, const double zin) : x(xin), y(yin), z(zin) {} };

int main() { //get all data from the file vtkXMLPolyDataReader* reader = vtkXMLPolyDataReader::New(); reader->SetFileName("Triangle.vtp"); reader->Update(); vtkPolyData* polydata = reader->GetOutput();

//get the number of points the file contains vtkIdType NumPoints = polydata->GetNumberOfPoints();

//if there are no points, quit if(!(NumPoints > 0) ) { exit(-1); }

//read in all of the points std::vector<Point> Points; double point[3]; for(vtkIdType i = 0; i < NumPoints; i++) { polydata->GetPoint(i, point); Points.push_back(Point(point[0], point[1], point[2])); }

//get the triangles (if there are any) std::vector<std::vector<int> > VertexLists; vtkIdType NumPolys = polydata->GetNumberOfPolys(); if(NumPolys > 0) { vtkCellArray* TriangleCells = polydata->GetPolys(); vtkIdType npts; vtkIdType *pts;

while(TriangleCells->GetNextCell(npts, pts)) { std::vector<int> List(3); List[0] = pts[0]; List[1] = pts[1]; List[2] = pts[2];

VertexLists.push_back(List); } }

std::cout << "Points: " << Points.size() << std::endl; for(unsigned int i = 0; i < Points.size(); i++) { std::cout << Points[i].x << " " << Points[i].y << " " << Points[i].z << std::endl; }

std::cout << std::endl;

std::cout << "Triangles: " << VertexLists.size() << std::endl; for(unsigned int i = 0; i < VertexLists.size(); i++) { std::cout << VertexLists[i][0] << " " << VertexLists[i][1] << " " << VertexLists[i][2] << std::endl; } return 0; } </source>