PyVista 严重依赖 NumPy 来高效分配和访问 VTK 的 C 数组。例如,要在 VTK 中创建点数组,通常必须遍历列表中的所有点并将其提供给 vtkPoints 类。例如:
code.matlab
>>> import vtk
>>> vtk_array = vtk.vtkDoubleArray()
>>> vtk_array.SetNumberOfComponents(3)
>>> vtk_array.SetNumberOfValues(9)
>>> vtk_array.SetValue(0, 0)
>>> vtk_array.SetValue(1, 0)
>>> vtk_array.SetValue(2, 0)
>>> vtk_array.SetValue(3, 1)
>>> vtk_array.SetValue(4, 0)
>>> vtk_array.SetValue(5, 0)
>>> vtk_array.SetValue(6, 0.5)
>>> vtk_array.SetValue(7, 0.667)
>>> vtk_array.SetValue(8, 0)
>>> vtk_points = vtk.vtkPoints()
>>> vtk_points.SetData(vtk_array)
>>> print(vtk_points)
vtkPoints(0x55f2371e2bd0)
Debug: Off
Modified Time: 92
Reference Count: 1
Registered Events: (none)
Data: 0x55f2368ae540
Data Array Name: Points
Number Of Points: 3
Bounds:
Xmin,Xmax: (0, 1)
Ymin,Ymax: (0, 0.667)
Zmin,Zmax: (0, 0)
要在 PyVista 中执行相同操作,您只需创建一个 NumPy 数组:
code.matlab
>>> import numpy as np
>>> np_points = np.array([[0, 0, 0], [1, 0, 0], [0.5, 0.667, 0]])
注意
您可以使用 pyvista.vtk_points() 构造 vtkPoints 对象,但在几乎所有情况下这都是不必要的。
由于最终目标是构造 pyvista.DataSet,您只需将 np_points 数组传递给 pyvista.PolyData 构造函数:
code.matlab
>>> import pyvista as pv
>>> poly_data = pv.PolyData(np_points)
而在 VTK 中您必须执行:
code.matlab
>>> vtk_poly_data = vtk.vtkPolyData()
>>> vtk_poly_data.SetPoints(vtk_points)
分配面或单元连接性/拓扑也是如此。使用 VTK,您通常必须使用 InsertNextCell 和 InsertCellPoint 循环。例如,要创建单个单元(三角形)然后将其分配给 vtkPolyData:
code.matlab
>>> cell_arr = vtk.vtkCellArray()
>>> cell_arr.InsertNextCell(3)
>>> cell_arr.InsertCellPoint(0)
>>> cell_arr.InsertCellPoint(1)
>>> cell_arr.InsertCellPoint(2)
>>> vtk_poly_data.SetPolys(cell_arr)
在 PyVista 中,我们可以直接在构造函数中分配它,然后从 faces 属性访问(或更改)它。
code.matlab
>>> faces = np.array([3, 0, 1, 2])
>>> poly_data = pv.PolyData(np_points, faces)
>>> poly_data.faces
array([3, 0, 1, 2])