В настоящее время я пытаюсь работать с фильтрами Python VisIt (которые работают с наборами данных vtk), но данные, извлеченные с помощью функции GetArray (), сохраняют NoneType
Вот пример сценария из visitusers.org:
from math import sin, pi
class MyExpression(SimplePythonExpression):
def __init__(self):
SimplePythonExpression.__init__(self)
self.name = "MyExpression"
self.description = "Perturb input scalar by simple wave pattern."
self.output_is_point_var = False
self.output_dimension = 1
def modify_contract(self,contract):
pass
def derive_variable(self,ds_in,domain_id):
# ds_in is a vtk dataset, we want
# to create and return a new vtkDataArray
# that contains a simple sine wave pattern
ds_bounds = ds_in.GetBounds()
x_ext = ds_bounds[1] - ds_bounds[0]
y_ext = ds_bounds[3] - ds_bounds[2]
z_ext = ds_bounds[5] - ds_bounds[4]
cell_vals = ds_in.GetCellData().GetArray(self.input_var_names[0])
ncells = ds_in.GetNumberOfCells()
res = vtk.vtkFloatArray()
res.SetNumberOfComponents(1)
res.SetNumberOfTuples(ncells)
for i in xrange(ncells):
cell = ds_in.GetCell(i)
bounds = cell.GetBounds()
xv = bounds[0] + bounds[1] / 2.0
yv = bounds[2] + bounds[3] / 2.0
zv = bounds[4] + bounds[5] / 2.0
val = .05*sin(xv*3*pi/x_ext) + .05*sin(yv * 3*pi / y_ext)
if z_ext != 0:
val+= .05*sin(zv * 3*pi / z_ext)
val += cell_vals.GetTuple1(i)
res.SetTuple1(i,val)
return res
py_filter = MyExpression
И сообщение об ошибке от Visit, когда я пытаюсь его использовать:
ERREUR:Pseudocolor: ()
viewer: The 'WaveTest' expression failed because avtPythonExpression::Execute Error - Python Expression 'execute' method failed
Python Environment Error:
<type 'exceptions.AttributeError'>'NoneType' object has no attribute 'GetTuple1'
Traceback (most recent call last):
File "/home/jfavre/VisIt/2.13/2.13.1/linux-x86_64/lib/site-packages/pyavt/filters.py", line 101, in execute
res = self.derive_variable(data_sets[i],domain_ids[i])
File "<string>", line 33, in derive_variable
AttributeError: 'NoneType' object has no attribute 'GetTuple1'
Веб-страница довольно старая, поэтому я предполагаю, что строка
cell_vals = ds_in.GetCellData().GetArray(self.input_var_names[0])
устарел и не функционирует так, как это было на момент написания примера. Чем заменить эту строку?
Спасибо за помощь