pythonnumpyvtkparaview

Extracting data in Python script from Paraview 4.2


I'm trying to extract data from a slice in a Python script using Paraview 4.2. I have something like this:

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

So all I want to do is extract the VelocityField data from the clip, preferably with coordinate locations for each data point.

Here is some of my exploration:

>> 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

Any further exploration always seems to lead me back to FieldDataInformation or PointDataInformation objects - and not the actual data!

A previous method that worked for extracting point XYZ positions was this:

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

EDIT - the output for this is:

---------------------------------------------------------------------------
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'

But yeah, it doesn't seem to work anymore, and I thought with all this Numpy integration there would be something a bit neater.

EDIT2: The output for Utkarsh's question:

>> 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"]

gives:

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

Solution

  • What's the error you're getting with the previous method. It should work. Even better way is as follows:

    # 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(rawData)
    
    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"])