Probing/sampling/interpolating VTK data using python TVTK or MayaVi

前端 未结 1 1775
长发绾君心
长发绾君心 2021-02-06 08:19

I would like to visualise a VTK data file (OpenFOAM output) using python. The plot I would like to make is a 1-d line plot of a quantity between two endpoints. To do so, the uns

1条回答
  •  萌比男神i
    2021-02-06 08:46

    Eventually, I found the answer to my own question. Just in case anyone visits this topic ans has the same problems, I will post my solution. I've used the vtkProbeFilter to interpolate my VTK-data. After the interpolation I've transformed the VTK-line to a numpy array for plotting convenience.

    #!/usr/bin/env python
    import numpy as np
    from vtk.util import numpy_support as VN
    from matplotlib import pyplot as plt
    import vtk
    
    def readVTK(filename):
        #read the vtk file with an unstructured grid
        reader = vtk.vtkUnstructuredGridReader()
        reader.SetFileName(filename)
        reader.ReadAllVectorsOn()
        reader.ReadAllScalarsOn()
        reader.Update()
        return reader
    
    def createLine(p1,p2,numPoints):
        # Create the line along which you want to sample
        line = vtk.vtkLineSource()
        line.SetResolution(numPoints)
        line.SetPoint1(p1)
        line.SetPoint2(p2)
        line.Update()
        return line
    
    def probeOverLine(line,reader):
        #Interpolate the data from the VTK-file on the created line.
        data = reader.GetOutput()
        # vtkProbeFilter, the probe line is the input, and the underlying dataset is the source.
        probe = vtk.vtkProbeFilter()
        probe.SetInputConnection(line.GetOutputPort())
        probe.SetSource(data)
        probe.Update()
        #get the data from the VTK-object (probe) to an numpy array
        q=VN.vtk_to_numpy(probe.GetOutput().GetPointData().GetArray('U'))
        numPoints = probe.GetOutput().GetNumberOfPoints() # get the number of points on the line
        #intialise the points on the line    
        x = np.zeros(numPoints)
        y = np.zeros(numPoints)
        z = np.zeros(numPoints)
        points = np.zeros((numPoints , 3))
        #get the coordinates of the points on the line
        for i in range(numPoints):
            x[i],y[i],z[i] = probe.GetOutput().GetPoint(i)
            points[i,0]=x[i]
            points[i,1]=y[i]
            points[i,2]=z[i]
        return points,q
    
    def setZeroToNaN(array):
        # In case zero-values in the data, these are set to NaN.
        array[array==0]=np.nan
        return array
    
    #Define the filename of VTK file
    filename='a-VTK-file.vtk'
    
    #Set the points between which the line is constructed.
    p1=[0.0,-0.1,0.0]
    p2=[0.0,-0.1,1.0]
    
    #Define the numer of interpolation points
    numPoints=100
    
    reader = readVTK(filename) # read the VTKfile
    line=createLine(p1,p2,numPoints) # Create the line
    points,U =  probeOverLine(line,reader) # interpolate the data over the line
    
    U = setZeroToNaN(U) # Set the zero's to NaN's
    plt.plot(points[:,2],U[:,0]) #plot the data
    plt.show()
    

    0 讨论(0)
提交回复
热议问题