-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVTPFileReader.cpp
More file actions
82 lines (64 loc) · 2.29 KB
/
Copy pathVTPFileReader.cpp
File metadata and controls
82 lines (64 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright (C) 2014-2015 Benjamin Kehlet
//
// This file is part of mshr.
//
// mshr is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// mshr is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with mshr. If not, see <http://www.gnu.org/licenses/>.
#include <mshr/VTPFileReader.h>
#include <dolfin/log/log.h>
#ifdef MSHR_HAS_VTK
#include <vtkXMLPolyDataReader.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#endif
namespace mshr
{
void VTPFileReader::read(const std::string filename,
std::vector<std::array<double, 3> >& vertices,
std::vector<std::array<std::size_t, 3> >& facets)
{
#ifdef MSHR_HAS_VTK
//get all data from the file
vtkXMLPolyDataReader* reader = vtkXMLPolyDataReader::New();
reader->SetFileName(filename.c_str());
reader->Update();
vtkPolyData* polydata = reader->GetOutput();
//get the number of points the file contains
const vtkIdType num_points = polydata->GetNumberOfPoints();
vertices.resize(num_points);
//read in all of the points
for(vtkIdType i = 0; i < num_points; i++)
polydata->GetPoint(i, vertices[i].data());
log(dolfin::TRACE, "Read %d vertices from vtp file", num_points);
const vtkIdType num_polys = polydata->GetNumberOfPolys();
facets.resize(num_polys);
vtkCellArray* TriangleCells = polydata->GetPolys();
vtkIdType npts;
vtkIdType *pts;
vtkIdType facet_counter = 0;
while(TriangleCells->GetNextCell(npts, pts))
{
dolfin_assert(npts == 3);
for (int i = 0; i < 3; i++)
(facets[facet_counter])[i] = pts[i];
facet_counter++;
}
log(dolfin::TRACE, "Read %d triangular facets from vtp file", facet_counter);
dolfin_assert(facet_counter == num_polys);
#else
dolfin::dolfin_error("VTPFileReader.cpp",
"reading VTP file",
"mshr is not built with VTK support");
#endif
}
}