Skip to content

Commit 0bd9649

Browse files
committed
Created TVTKBaseInterface. Should fix #1218
1 parent f9c98ba commit 0bd9649

File tree

1 file changed

+49
-55
lines changed

1 file changed

+49
-55
lines changed

nipype/algorithms/mesh.py

Lines changed: 49 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,40 @@
2222
from ..interfaces.base import (BaseInterface, traits, TraitedSpec, File,
2323
BaseInterfaceInputSpec)
2424
from warnings import warn
25+
26+
27+
have_tvtk = False
28+
29+
try:
30+
from tvtk.api import tvtk
31+
have_tvtk = True
32+
except ImportError:
33+
raise ImportError('Interface requires tvtk')
34+
35+
try:
36+
from enthought.etsconfig.api import ETSConfig
37+
ETSConfig.toolkit = 'null'
38+
except ImportError:
39+
iflogger.warn(('ETS toolkit could not be imported'))
40+
except ValueError:
41+
iflogger.warn(('ETS toolkit could not be set to null'))
42+
43+
if have_tvtk:
44+
tvtk.tvtk_classes.vtk_version import vtk_build_version
45+
vtk_major = int(vtk_build_version[0])
46+
2547
iflogger = logging.getLogger('interface')
2648

2749

50+
class TVTKBaseInterface(BaseInterface):
51+
_redirect_x = True
52+
53+
def __init__(self, **inputs):
54+
if not have_tvtk:
55+
raise RuntimeError('Interface requires tvtk')
56+
super(TVTKBaseInterface, self).__init__(**inputs)
57+
58+
2859
class WarpPointsInputSpec(BaseInterfaceInputSpec):
2960
points = File(exists=True, mandatory=True,
3061
desc=('file containing the point set'))
@@ -41,7 +72,7 @@ class WarpPointsOutputSpec(TraitedSpec):
4172
out_points = File(desc='the warped point set')
4273

4374

44-
class WarpPoints(BaseInterface):
75+
class WarpPoints(TVTKBaseInterface):
4576

4677
"""
4778
Applies a displacement field to a point set given in vtk format.
@@ -61,7 +92,6 @@ class WarpPoints(BaseInterface):
6192
"""
6293
input_spec = WarpPointsInputSpec
6394
output_spec = WarpPointsOutputSpec
64-
_redirect_x = True
6595

6696
def _gen_fname(self, in_file, suffix='generated', ext=None):
6797
import os.path as op
@@ -80,26 +110,6 @@ def _gen_fname(self, in_file, suffix='generated', ext=None):
80110
return op.abspath('%s_%s.%s' % (fname, suffix, ext))
81111

82112
def _run_interface(self, runtime):
83-
vtk_major = 6
84-
try:
85-
import vtk
86-
vtk_major = vtk.VTK_MAJOR_VERSION
87-
except ImportError:
88-
iflogger.warn(('python-vtk could not be imported'))
89-
90-
try:
91-
from tvtk.api import tvtk
92-
except ImportError:
93-
raise ImportError('Interface requires tvtk')
94-
95-
try:
96-
from enthought.etsconfig.api import ETSConfig
97-
ETSConfig.toolkit = 'null'
98-
except ImportError:
99-
iflogger.warn(('ETS toolkit could not be imported'))
100-
except ValueError:
101-
iflogger.warn(('ETS toolkit could not be set to null'))
102-
103113
import nibabel as nb
104114
import numpy as np
105115
from scipy import ndimage
@@ -182,7 +192,7 @@ class ComputeMeshWarpOutputSpec(TraitedSpec):
182192
desc='numpy file keeping computed distances and weights')
183193

184194

185-
class ComputeMeshWarp(BaseInterface):
195+
class ComputeMeshWarp(TVTKBaseInterface):
186196

187197
"""
188198
Calculates a the vertex-wise warping to get surface2 from surface1.
@@ -207,7 +217,6 @@ class ComputeMeshWarp(BaseInterface):
207217

208218
input_spec = ComputeMeshWarpInputSpec
209219
output_spec = ComputeMeshWarpOutputSpec
210-
_redirect_x = True
211220

212221
def _triangle_area(self, A, B, C):
213222
A = np.array(A)
@@ -220,19 +229,6 @@ def _triangle_area(self, A, B, C):
220229
return area
221230

222231
def _run_interface(self, runtime):
223-
try:
224-
from tvtk.api import tvtk
225-
except ImportError:
226-
raise ImportError('Interface ComputeMeshWarp requires tvtk')
227-
228-
try:
229-
from enthought.etsconfig.api import ETSConfig
230-
ETSConfig.toolkit = 'null'
231-
except ImportError:
232-
iflogger.warn(('ETS toolkit could not be imported'))
233-
except ValueError:
234-
iflogger.warn(('ETS toolkit is already set'))
235-
236232
r1 = tvtk.PolyDataReader(file_name=self.inputs.surface1)
237233
r2 = tvtk.PolyDataReader(file_name=self.inputs.surface2)
238234
vtk1 = r1.output
@@ -280,7 +276,12 @@ def _run_interface(self, runtime):
280276
out_mesh.point_data.vectors.name = 'warpings'
281277
writer = tvtk.PolyDataWriter(
282278
file_name=op.abspath(self.inputs.out_warp))
283-
writer.set_input_data(out_mesh)
279+
280+
if vtk_major <= 5:
281+
writer.input = mesh
282+
else:
283+
writer.set_input_data_object(mesh)
284+
284285
writer.write()
285286

286287
self._distance = np.average(errvector, weights=weights)
@@ -322,7 +323,7 @@ class MeshWarpMathsOutputSpec(TraitedSpec):
322323
desc='vtk with surface warped')
323324

324325

325-
class MeshWarpMaths(BaseInterface):
326+
class MeshWarpMaths(TVTKBaseInterface):
326327

327328
"""
328329
Performs the most basic mathematical operations on the warping field
@@ -348,22 +349,8 @@ class MeshWarpMaths(BaseInterface):
348349

349350
input_spec = MeshWarpMathsInputSpec
350351
output_spec = MeshWarpMathsOutputSpec
351-
_redirect_x = True
352352

353353
def _run_interface(self, runtime):
354-
try:
355-
from tvtk.api import tvtk
356-
except ImportError:
357-
raise ImportError('Interface ComputeMeshWarp requires tvtk')
358-
359-
try:
360-
from enthought.etsconfig.api import ETSConfig
361-
ETSConfig.toolkit = 'null'
362-
except ImportError:
363-
iflogger.warn(('ETS toolkit could not be imported'))
364-
except ValueError:
365-
iflogger.warn(('ETS toolkit is already set'))
366-
367354
r1 = tvtk.PolyDataReader(file_name=self.inputs.in_surf)
368355
vtk1 = r1.output
369356
r1.update()
@@ -412,14 +399,21 @@ def _run_interface(self, runtime):
412399
vtk1.point_data.vectors = warping
413400
writer = tvtk.PolyDataWriter(
414401
file_name=op.abspath(self.inputs.out_warp))
415-
writer.set_input_data(vtk1)
402+
if vtk_major <= 5:
403+
writer.input = vtk1
404+
else:
405+
writer.set_input_data_object(vtk1)
416406
writer.write()
417407

418408
vtk1.point_data.vectors = None
419409
vtk1.points = points1 + warping
420410
writer = tvtk.PolyDataWriter(
421411
file_name=op.abspath(self.inputs.out_file))
422-
writer.set_input_data(vtk1)
412+
413+
if vtk_major <= 5:
414+
writer.input = vtk1
415+
else:
416+
writer.set_input_data_object(vtk1)
423417
writer.write()
424418

425419
return runtime

0 commit comments

Comments
 (0)