2

早上好,我想使用 pvpython 在 VTK 文件中制作一个 3D 体积的切片,然后我想保存此图像(可能使用以白色为中心的对称调色板)。

具体来说,我想用 python 制作以下用 Paraview 拍摄的图像:

我是 pvpython 或 python 的新手,所以我报告了我的第一个脚本,但它不起作用:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
from scipy.interpolate import griddata
from paraview import simple as pvs
import numpy as np
import vtk
import matplotlib
from vtk.util.numpy_support import vtk_to_numpy

reader = vtk.vtkDataSetReader()
reader.SetFileName("../deltau-deltau.vtk")
reader.ReadAllScalarsOn()
reader.Update()

plane = vtk.vtkPlane()
plane.SetOrigin(16, 0, 0)
plane.SetNormal(1, 0, 0)

cutter = vtk.vtkCutter()
cutter.SetCutFunction(plane)
cutter.SetInputConnection(reader.GetOutputPort())
cutter.Update()

data = cutter.GetOutput()

# Coordinates of nodes in the mesh
nodes_vtk_array= reader.GetOutput().GetPoints().GetData()

#Get the coordinates of the nodes and their variables
nodes_nummpy_array = vtk_to_numpy(nodes_vtk_array)
x=nodes_nummpy_array[:,0]
y=nodes_nummpy_array[:,1]
z=nodes_nummpy_array[:,2]

variable_numpy_array = vtk_to_numpy(data)
var = variable_numpy_array

# Figure bounds
npts = 100
xmin, xmax = min(x), max(x)
ymin, ymax = min(y), max(y)
zmin, zmax = min(z), max(z)

# Grid
xi = np.linspace(xmin, xmax, npts)
yi = np.linspace(ymin, ymax, npts)
zi = np.linspace(zmin, zmax, npts)

# The mesh is unstructured, so
var_plot = griddata((z, y), var, (zi[None,:], yi[:,None]), method='cubic') 

plt.plot(zi, yi, var_plot)
#plt.colorbar()
plt.savefig("figure.png")
4

1 回答 1

0

首先,请注意 ParaView 脚本和 VTK 脚本之间存在差异。您提供的脚本似乎是纯 VTK 脚本。ParaView 脚本比 VTK 更高级,更适合 Python。

如果你可以在 ParaView 中实现你的处理,我建议你只使用 ParaView 脚本工具而不是 VTK 脚本(即不要import vtk,不要创建任何vtkXXX()对象)

在 ParaView 中,您可以跟踪您的操作以生成 python 脚本,如此所述。这对于理解特定操作的 python 对应项很有用。如果你想编写一个完整的分析脚本,你也可以保存一个python state

本文档还提供了从 GUI 和 python 处理和分析的示例。

如果您仍然喜欢 VTK 脚本,请改写您的帖子并解释“不工作”的含义。

于 2021-09-06T09:22:41.107 回答