2014-10-23 3 views
2

Я пытаюсь извлечь данные из среза в скрипте Python с помощью Paraview 4.2. У меня есть что-то вроде этого:Извлечение данных из скрипта Python из Paraview 4.2

from paraview.numpy_support import vtk_to_numpy 
from paraview.simple import * 
import os 

os.environ["DISPLAY"] = ":0" 
paraview.simple._DisableFirstRenderCameraReset() 

# create a new 'XDMF Reader' 
xDMFtemporalFieldsxmf = XDMFReader(FileNames=['<pathtodata>/XDMF.temporalFields.xmf']) 

# Properties modified on xDMFtemporalFieldsxmf 
xDMFtemporalFieldsxmf.PointArrayStatus = ['DensityProperty-mesh', 'VelocityField'] 
xDMFtemporalFieldsxmf.CellArrayStatus = [] 

# create a new 'Slice' 
slice1 = Slice(Input=xDMFtemporalFieldsxmf) 

# create a new 'Clip' 
clip1 = Clip(Input=slice1) 
clip1.ClipType = 'Scalar' 
clip1.Value = 1200.0 

Так все, что я хочу сделать, это извлечь данные VelocityField из клипа, предпочтительно с координатами местоположения для каждой точки данных.

Вот некоторые из моих разведки:

>> print clip1 
<paraview.servermanager.Clip object at 0x7f1a14e356d0> 

>> print clip1.PointData.keys() 
[] 

>> print clip1.FieldData.keys() 
[] 

>> proxy = servermanager.Proxy(proxy=clip1.SMProxy) 
>> for property in proxy: 
>>  print property 
<paraview.servermanager.Scalar object at 0x7f1a4e346850> 
<paraview.servermanager.Slice object at 0x7f1a14e35190> 
None 
0 
0 
[None, ''] 
0 
1200.0 

>> print paraview.numpy_support.vtk_to_numpy(clip1.SMProxy) 
AttributeError       Traceback (most recent call last) 
<ipython-input-21-d5fe9e4e150c> in <module>() 
----> 1 print paraview.numpy_support.vtk_to_numpy(clip1.SMProxy) 

/home/luke/Programs/paraview4.2/lib/site-packages/paraview/numpy_support.pyc in vtk_to_numpy(vtk_array) 
    202 
    203  """ 
--> 204  typ = vtk_array.GetDataType() 
    205  assert typ in get_vtk_to_numpy_typemap().keys(), \ 
    206   "Unsupported array type %s"%typ 

AttributeError: GetDataType 

>> data = servermanager.Fetch(clip1) 
>> print data 
vtkUnstructuredGrid (0x6276dc0) 
    Debug: Off 
    Modified Time: 37918079 
    Reference Count: 1 
    Registered Events: (none) 
    Information: 0x65f2f40 
    Data Released: False 
    Global Release Data: Off 
    UpdateTime: 0 
    Field Data: 
    Debug: Off 
    Modified Time: 37918063 
    Reference Count: 1 
    Registered Events: (none) 
    Number Of Arrays: 0 
    Number Of Components: 0 
    Number Of Tuples: 0 
    Number Of Points: 0 
    Number Of Cells: 0 
    Cell Data: 
    Debug: Off 
    Modified Time: 37918077 
    Reference Count: 1 
    Registered Events: (none) 
    Number Of Arrays: 0 
    Number Of Components: 0 
    Number Of Tuples: 0 
    Copy Tuple Flags: (1 1 1 1 1 0 1 1) 
    Interpolate Flags: (1 1 1 1 1 0 0 1) 
    Pass Through Flags: (1 1 1 1 1 1 1 1) 
    Scalars: (none) 
    Vectors: (none) 
    Normals: (none) 
    TCoords: (none) 
    Tensors: (none) 
    GlobalIds: (none) 
    PedigreeIds: (none) 
    EdgeFlag: (none) 
    Point Data: 
    Debug: Off 
    Modified Time: 37918079 
    Reference Count: 1 
    Registered Events: (none) 
    Number Of Arrays: 0 
    Number Of Components: 0 
    Number Of Tuples: 0 
    Copy Tuple Flags: (1 1 1 1 1 0 1 1) 
    Interpolate Flags: (1 1 1 1 1 0 0 1) 
    Pass Through Flags: (1 1 1 1 1 1 1 1) 
    Scalars: (none) 
    Vectors: (none) 
    Normals: (none) 
    TCoords: (none) 
    Tensors: (none) 
    GlobalIds: (none) 
    PedigreeIds: (none) 
    EdgeFlag: (none) 
    Bounds: 
    Xmin,Xmax: (1, -1) 
    Ymin,Ymax: (1, -1) 
    Zmin,Zmax: (1, -1) 
    Compute Time: 0 
    Number Of Points: 0 
    Point Coordinates: 0 
    Locator: 0 
    Number Of Pieces: 1 
    Piece: -1 
    Ghost Level: 0 

Любое дальнейшее изучение всегда, кажется, ведет меня к FieldDataInformation или PointDataInformation объектов - а не фактические данные!

Предыдущий метод, который работал для извлечения точки XYZ позиции был такой:

data = servermanager.Fetch(clip1) 
d2 = data.GetPoints() 
xyz = zeros((d2.GetNumberOfPoints(), 3)) 
for i in range(d2.GetNumberOfPoints()): 
    xyz[i,:] = data.GetPoint(i) 

EDIT - выход для этого:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-11-e34f36729df1> in <module>() 
     1 data = servermanager.Fetch(clip1) 
     2 d2 = data.GetPoints() 
----> 3 xyz = zeros((d2.GetNumberOfPoints(), 3)) 
     4 for i in range(d2.GetNumberOfPoints()): 
     5  xyz[i,:] = data.GetPoint(i) 

AttributeError: 'NoneType' object has no attribute 'GetNumberOfPoints' 

Но да, это не похоже на работу больше , и я подумал со всей этой интеграцией Numpy, было бы немного более аккуратно.

EDIT2: Выход на вопрос Utkarsh в:

>> clip1.UpdatePipeline() 
>> rawData = servermanager.Fetch(clip1) 
>> import vtk.numpy_interface.dataset_adapter as dsa 
>> # Wrap the raw data object to access NumPy friendly API 
>> data = dsa.WrapDataObject(rawData) # Note I changed this from Utkarsh's "data" to "rawData" 
>> print data.Points 
>> print data.PointData["VelocityField"] 

дает:

None 
<vtk.numpy_interface.dataset_adapter.VTKNoneArray object at 0x7f57c4a75390> 
+0

FYI, VTKNoneArray возвращается с массивом с таким именем, которое присутствует в наборе данных. – Utkarsh

ответ

4

Что ошибка вы получаете с предыдущим методом . Он должен работать. Еще лучший способ заключается в следующем:

# ensure that the clip1 filter is updated. 
clip1.UpdatePipeline() 

rawData = servermanager.Fetch(clip1) 

import vtk.numpy_interface.dataset_adapter as dsa 

# Wrap the raw data object to access NumPy friendly API 
data = dsa.WrapDataObject(data) 

print data.Points 
VTKArray([[ -5.  , -5.  , -9.15493107], 
    [ -3.  , -5.  , -9.75046444], 
    [ -2.  , -5.  , -9.50859547], 
    ..., 
    [ 3.04815888, 3.  , 10.  ], 
    [ 4.24629259, 3.  , 10.  ], 
    [ 4.  , 3.25505328, 10.  ]], dtype=float32) 


# To access the point data array named VelocityField 
print data.PointData["VelocityField"] 
+0

Это правильно - и я думаю, что это лучший способ доступа к данным. У меня были проблемы, потому что мой первоначальный код не был достаточно явным. Это было исправлено, если у всех клипов и фрагментов было достаточно информации для правильной обработки. – OlympusMonds

Смежные вопросы