点集构造

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])