How to show vtkUnstructuredGrid in pvpython of paraview?

python

(Huayi Wei) #1

I install paraview 5.6 on my Ubuntu 18.04 system and I want to write a python script to show a vtkUnstructuredGrid.

import numpy as np
from paraview.simple import *
import paraview.vtk as vtk
from paraview.vtk.numpy_interface import dataset_adapter as dsa
import paraview.vtk.util.numpy_support as vnp

node = np.array(
        [[0.0, 0.0, 0.0],
         [1.0, 0.0, 0.0],
         [1.0, 1.0, 0.0],
         [0.0, 1.0, 0.0]], dtype=np.float)
cell = np.array([[1, 2, 0], [3, 0, 2]], dtype=np.int)
NC = cell.shape[0]

points = vtk.vtkPoints()
points.SetData(vnp.numpy_to_vtk(node))
cells = vtk.vtkCellArray()
cells.SetCells(NC, vnp.numpy_to_vtkIdTypeArray(cell))

uGrid =vtk.vtkUnstructuredGrid() 
uGrid.SetPoints(points)
uGrid.SetCells(vtk.VTK_TRIANGLE, cells)
# how to put uGrid into the following codes
view = GetActiveViewOrCreate('RenderView') 
dispaly = Show()
render = Render()
Interact()

I can not find any example from the internet to do such thing in python script. So I need your help, thanks very much.


(Huayi Wei) #2

The following code is my first try to solve this problem.

import numpy as np
from paraview.simple import *
import vtk
import vtk.util.numpy_support as vnp
from vtkmodules.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtkmodules.numpy_interface import dataset_adapter as dsa
from paraview.util.vtkAlgorithm import smproxy, smproperty, smdomain

@smproxy.source(label=“Second order triangle mesh!”)
class MeshSource(VTKPythonAlgorithmBase):

def __init__(self):
    print("Initialize the source!")
    VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=0,
            nOutputPorts=1,
            outputType='vtkUnstructuredGrid')

    node = np.array(
            [[0.0, 0.0, 0.0],
             [1.0, 0.0, 0.0],
             [1.0, 1.0, 0.0],
             [0.0, 1.0, 0.0]], dtype=np.float)
    cell = np.array([[3, 1, 2, 0], [3, 3, 0, 2]], dtype=np.int)

    NN = node.shape[0]
    NC = cell.shape[0]
    points = vtk.vtkPoints()
    points.SetData(vnp.numpy_to_vtk(node))
    cells = vtk.vtkCellArray()
    cells.SetCells(NC, vnp.numpy_to_vtkIdTypeArray(cell))

    self.mesh = vtk.vtkUnstructuredGrid() 
    self.mesh.SetPoints(points)
    self.mesh.SetCells(vtk.VTK_TRIANGLE, cells)
    rho = vnp.numpy_to_vtk(np.zeros(NN))
    rho.SetName('rho_A')
    self.mesh.GetPointData().AddArray(rho)
    self.Port = 0

def RequestData(self, request, inInfo, outInfo):
    print("Request the data!")
    opt = vtk.vtkUnstructuredGrid.GetData(outInfo)
    opt.ShallowCopy(self.mesh)
    return 1

def UpdatePointData(self, rho):
    print("Update the point data!")
    rho = vnp.numpy_to_vtk(rho)
    rho.SetName('rho_A')
    self.mesh.GetPointData().AddArray(rho)
    self.Modified()

source = MeshSource()
view = GetActiveViewOrCreate(‘RenderView’)
dispaly = Show(source, view)
Interact()

But I got some error :

Traceback (most recent call last):
File “test_triangle.py”, line 55, in
dispaly = Show(source, view)
File “/home/why/local/lib/python3.6/site-packages/paraview/simple.py”, line 482, in Show
rep = controller.Show(proxy, proxy.Port, view)
File “/home/why/local/lib/python3.6/site-packages/paraview/servermanager.py”, line 158, in __ConvertArgumentsAndCall
retVal = func(*newArgs)
TypeError: Show argument 1: method requires a vtkSMSourceProxy, a vtkPythonAlgorithm was provided.

So I must miss something. Thanks your help!


(Cory Quammen (Kitware)) #3

Hi, please see my response on Stackoverflow: https://stackoverflow.com/questions/54603267/how-to-show-vtkunstructuredgrid-in-python-script-based-on-paraview/54633793#54633793