forked from pyvista/pyvista
-
Notifications
You must be signed in to change notification settings - Fork 0
/
readers.py
229 lines (201 loc) · 7.87 KB
/
readers.py
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
"""
Contains a dictionary that maps file extensions to VTK readers
"""
import os
import vtk
import pyvista
READERS = {
# Standard dataset readers:
'.vtk': vtk.vtkDataSetReader,
'.pvtk': vtk.vtkPDataSetReader,
'.vti': vtk.vtkXMLImageDataReader,
'.pvti': vtk.vtkXMLPImageDataReader,
'.vtr': vtk.vtkXMLRectilinearGridReader,
'.pvtr': vtk.vtkXMLPRectilinearGridReader,
'.vtu': vtk.vtkXMLUnstructuredGridReader,
'.pvtu': vtk.vtkXMLPUnstructuredGridReader,
'.ply': vtk.vtkPLYReader,
'.obj': vtk.vtkOBJReader,
'.stl': vtk.vtkSTLReader,
'.vtp': vtk.vtkXMLPolyDataReader,
'.vts': vtk.vtkXMLStructuredGridReader,
'.vtm': vtk.vtkXMLMultiBlockDataReader,
'.vtmb': vtk.vtkXMLMultiBlockDataReader,
# Image formats:
'.bmp': vtk.vtkBMPReader,
'.dem': vtk.vtkDEMReader,
'.dcm': vtk.vtkDICOMImageReader,
'.img': vtk.vtkDICOMImageReader,
'.jpeg': vtk.vtkJPEGReader,
'.jpg': vtk.vtkJPEGReader,
'.mhd': vtk.vtkMetaImageReader,
'.png': vtk.vtkPNGReader,
'.pnm': vtk.vtkPNMReader, # TODO: not tested
'.slc': vtk.vtkSLCReader,
'.tiff': vtk.vtkTIFFReader,
'.tif': vtk.vtkTIFFReader,
# Other formats:
'.byu': vtk.vtkBYUReader, # TODO: not tested with this extension
'.g': vtk.vtkBYUReader,
# '.chemml': vtk.vtkCMLMoleculeReader, # TODO: not tested
# '.cml': vtk.vtkCMLMoleculeReader, # vtkMolecule is not supported by pyvista
# TODO: '.csv': vtk.vtkCSVReader, # vtkTables are currently not supported
'.facet': vtk.vtkFacetReader,
'.cas': vtk.vtkFLUENTReader, # TODO: not tested
# '.dat': vtk.vtkFLUENTReader, # TODO: not working
# '.cube': vtk.vtkGaussianCubeReader, # Contains `atom_types` which are note supported?
'.res': vtk.vtkMFIXReader, # TODO: not tested
'.foam': vtk.vtkOpenFOAMReader,
# '.pdb': vtk.vtkPDBReader, # Contains `atom_types` which are note supported?
'.p3d': vtk.vtkPlot3DMetaReader,
'.pts': vtk.vtkPTSReader,
# '.particles': vtk.vtkParticleReader, # TODO: not tested
#TODO: '.pht': vtk.vtkPhasta??????,
#TODO: '.vpc': vtk.vtkVPIC?????,
# '.bin': vtk.vtkMultiBlockPLOT3DReader,# TODO: non-default routine
# '.tri': vtk.vtkMCubesReader, # TODO: Breaks pyvista wrapping on point arrays
}
if (vtk.vtkVersion().GetVTKMajorVersion() >= 8 and
vtk.vtkVersion().GetVTKMinorVersion() >= 2):
try:
READERS['.sgy'] = vtk.vtkSegYReader
READERS['.segy'] = vtk.vtkSegYReader
except AttributeError:
pass
def get_ext(filename):
"""Extract the extension of the filename"""
ext = os.path.splitext(filename)[1].lower()
return ext
def get_reader(filename):
"""Gets the corresponding reader based on file extension and instantiates it
"""
ext = get_ext(filename)
return READERS[ext]() # Get and instantiate the reader
def standard_reader_routine(reader, filename, attrs=None):
"""Use a given reader from the ``READERS`` mapping in the common VTK reading
pipeline routine.
Parameters
----------
reader : vtkReader
Any instantiated VTK reader class
filename : str
The string filename to the data file to read.
attrs : dict, optional
A dictionary of attributes to call on the reader. Keys of dictionary are
the attribute/method names and values are the arguments passed to those
calls. If you do not have any attributes to call, pass ``None`` as the
value.
"""
if attrs is None:
attrs = {}
if not isinstance(attrs, dict):
raise TypeError('Attributes must be a dictionary of name and arguments.')
reader.SetFileName(filename)
# Apply any attributes listed
for name, args in attrs.items():
attr = getattr(reader, name)
if args is not None:
if not isinstance(args, (list, tuple)):
args = [args]
attr(*args)
else:
attr()
# Perform the read
reader.Update()
return pyvista.wrap(reader.GetOutputDataObject(0))
def read_legacy(filename):
"""Use VTK's legacy reader to read a file"""
reader = vtk.vtkDataSetReader()
reader.SetFileName(filename)
# Ensure all data is fetched with poorly formated legacy files
reader.ReadAllScalarsOn()
reader.ReadAllColorScalarsOn()
reader.ReadAllNormalsOn()
reader.ReadAllTCoordsOn()
reader.ReadAllVectorsOn()
# Perform the read
reader.Update()
output = reader.GetOutputDataObject(0)
if output is None:
raise AssertionError('No output when using VTKs legacy reader')
return pyvista.wrap(output)
def read(filename, attrs=None):
"""This will read any VTK file! It will figure out what reader to use
then wrap the VTK object for use in PyVista.
Parameters
----------
attrs : dict, optional
A dictionary of attributes to call on the reader. Keys of dictionary are
the attribute/method names and values are the arguments passed to those
calls. If you do not have any attributes to call, pass ``None`` as the
value.
"""
filename = os.path.abspath(os.path.expanduser(filename))
if not os.path.isfile(filename):
raise IOError('File ({}) not found'.format(filename))
ext = get_ext(filename)
# From the extension, decide which reader to use
if attrs is not None:
reader = get_reader(filename)
return standard_reader_routine(reader, filename, attrs=attrs)
elif ext in '.vti': # ImageData
return pyvista.UniformGrid(filename)
elif ext in '.vtr': # RectilinearGrid
return pyvista.RectilinearGrid(filename)
elif ext in '.vtu': # UnstructuredGrid
return pyvista.UnstructuredGrid(filename)
elif ext in ['.ply', '.obj', '.stl']: # PolyData
return pyvista.PolyData(filename)
elif ext in '.vts': # StructuredGrid
return pyvista.StructuredGrid(filename)
elif ext in ['.vtm', '.vtmb']:
return pyvista.MultiBlock(filename)
elif ext in ['.e', '.exo']:
return read_exodus(filename)
elif ext in ['.vtk']:
# Attempt to use the legacy reader...
return read_legacy(filename)
else:
# Attempt find a reader in the readers mapping
try:
reader = get_reader(filename)
return standard_reader_routine(reader, filename)
except KeyError:
pass
raise IOError("This file was not able to be automatically read by pyvista.")
def read_texture(filename, attrs=None):
"""Loads a ``vtkTexture`` from an image file."""
filename = os.path.abspath(os.path.expanduser(filename))
try:
# intitialize the reader using the extnesion to find it
reader = get_reader(filename)
image = standard_reader_routine(reader, filename, attrs=attrs)
return pyvista.image_to_texture(image)
except KeyError:
# Otherwise, use the imageio reader
pass
return pyvista.numpy_to_texture(imageio.imread(filename))
def read_exodus(filename,
animate_mode_shapes=True,
apply_displacements=True,
displacement_magnitude=1.0,
enabled_sidesets=None):
"""Read an ExodusII file (``'.e'`` or ``'.exo'``)"""
reader = vtk.vtkExodusIIReader()
reader.SetFileName(filename)
reader.UpdateInformation()
reader.SetAnimateModeShapes(animate_mode_shapes)
reader.SetApplyDisplacements(apply_displacements)
reader.SetDisplacementMagnitude(displacement_magnitude)
if enabled_sidesets is None:
enabled_sidesets = list(range(reader.GetNumberOfSideSetArrays()))
for sideset in enabled_sidesets:
if isinstance(sideset, int):
name = reader.GetSideSetArrayName(sideset)
elif isinstance(sideset, str):
name = sideset
else:
raise ValueError('Could not parse sideset ID/name: {}'.format(sideset))
reader.SetSideSetArrayStatus(name, 1)
reader.Update()
return pyvista.wrap(reader.GetOutput())