如何在基于paraview的python脚本中显示vtkUnstructuredGrid?

如何在基于paraview的python脚本中显示vtkUnstructuredGrid?,python,paraview,pvpython,Python,Paraview,Pvpython,我在我的Ubuntu18.04系统上安装了paraview 5.6,我想编写一个python脚本来显示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

我在我的Ubuntu18.04系统上安装了paraview 5.6,我想编写一个python脚本来显示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([[3, 1, 2, 0], [3, 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()
我在网上找不到任何用python脚本做这类事情的例子。所以我需要你的帮助,非常感谢

更新:

我尝试编写一个源类,如下所示:

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(name="MeshSource", label="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!")
        output = vtk.vtkUnstructuredGrid.GetData(outInfo)
        optput.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') 
display = Show(source, view)
Interact()
但我有一些错误:

Traceback (most recent call last):
  File "test_triangle.py", line 55, in <module>
    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.
回溯(最近一次呼叫最后一次):
文件“test_triangle.py”,第55行,在
dispaly=Show(源、视图)
文件“/home/why/local/lib/python3.6/site packages/paraview/simple.py”,第482行,在Show中
rep=controller.Show(代理、代理、端口、视图)
文件“/home/why/local/lib/python3.6/site packages/paraview/servermanager.py”,第158行,在
retVal=func(*newArgs)
TypeError:显示参数1:方法需要vtkSMSourceProxy,但提供了vtkPythonAlgorithm。

我一定错过了什么

需要理解的关键是,ParaView中提供了两种级别的Python脚本。较低级别是使用VTK创建或过滤数据的地方。较高级别允许您控制ParaView的操作,例如,显示数据、设置显示属性等。您缺少的是脚本中两个级别之间的桥梁

在最初的示例中,您正在VTK中创建一个非结构化网格。要将其放置到ParaView可以使用的位置,请添加以下内容:

# how to put uGrid into the following codes
view = GetActiveViewOrCreate('RenderView')

# create a trivial producer to bridge between the VTK object and ParaView
tp = TrivialProducer()
tp.GetClientSideObject().SetOutput(uGrid)

dispaly = Show(tp)
这将创建一个ParaView代理(
VTK
),它是名为
VTKTrivalProducer
的简单VTK数据源的代理。它所做的只是获取一个数据集并将其传递给任何请求它的下游过滤器。(注意:由于
GetClientSideObject()
,这非常常见,因此只有在内置服务器模式下运行时才有效)

如何定义单元格也存在问题。单元定义中的第一个条目需要是定义单元的点数。所以把那行改成

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

非常感谢,科里。我认为这个知识展示应该放在Paraview的教程中。这是一个笨拙的方法,所以它不应该被添加到教程中。最好的方法是通过一个可编程源代码或扩展
VTKPythonAlgorithmBase
(您很快就会做到这一点,您只需要将类与脚本分离,保存在一个单独的文件中,然后将其作为插件加载)。这两种方法都记录在ParaView指南()的第12章中,感谢您的详细解释。我会再次尝试。@CoryQuammen您好,请您详细说明一下(注意:由于GetClientSideObject()的原因,这只在内置服务器模式下运行时有效),这是非常常见的)。这是否意味着它不能与通过Connect(“localhost”)连接的外部python会话一起工作。i、 仅通过本地paraview会话的python shell返回吗?
GetClientSideObject()
返回客户端上的VTK数据对象。调用
Connect
时,您正在连接到另一个服务器进程,因此
GetClientSideObject()
不会返回任何有用的内容。您可以使用
paraview.servermanager.Fetch(GetActiveSource())
将管道浏览器中当前选定对象的VTK对象传输到客户端。返回的对象是完整的VTK数据对象。