1+1=10

记记笔记,放松一下...

PySide6下PyVista小记

接前面Qt与Python的绑定历史回顾PySide6下Matplotlib小记以及PySide6下VTK小记,继续梳理一点点...

PyVista

PyVista 是基于 VTK 的高级封装库,简化了 VTK 的使用。

  • 高效简洁:PyVista 封装了 VTK 的常用操作,只需少量代码即可完成复杂的任务。
  • 易用性:PyVista 提供了更直观的 API,降低了 VTK 的学习曲线。
  • 与 Python 生态的集成:PyVista 更加 Pythonic,可以直接与 NumPy、Matplotlib 等库结合使用。

例子

画个圆锥出来(是比前面直接用vtk要简洁很多):

1
2
3
4
5
6
7
8
9
import pyvista as pv

cone = pv.Cone(resolution=50)

plotter = pv.Plotter(window_size=(800, 600))
plotter.background_color = (0.1, 0.2, 0.4)
plotter.add_mesh(cone, color="tan", show_edges=True)

plotter.show()

主要用到了Plotter类

Plotter类

一些基本用法

创建 Plotter 对象:创建 Plotter 实例并配置窗口属性:

1
2
3
4
import pyvista as pv

plotter = pv.Plotter(window_size=(800, 600))
plotter.background_color = 'white'

添加网格:通过 add_mesh 添加几何体或数据:

1
2
sphere = pv.Sphere(radius=1.0)
plotter.add_mesh(sphere, color='blue', show_edges=True)

显示场景:通过 show 方法渲染并显示场景:

1
plotter.show()

设置相机视角:控制相机的视角、焦点和位置:

1
2
3
plotter.camera_position = 'xy'  # 设置相机视角为 XY 平面
plotter.add_mesh(sphere, color='blue')
plotter.show()

导出渲染:将渲染结果保存为文件:

1
2
# 导出为 HTML 交互式文件
plotter.export_html('interactive_scene.html')

多视图布局:创建多子图并分别渲染不同数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
plotter = pv.Plotter(shape=(1, 2))  # 1 行 2 列布局

# 在第一个子图中添加几何体
plotter.subplot(0, 0)
plotter.add_mesh(pv.Sphere(), color='red')

# 在第二个子图中添加几何体
plotter.subplot(0, 1)
plotter.add_mesh(pv.Cube(), color='blue')

plotter.show()

网格类型

In PyVista, a mesh is any spatially referenced information and usually consists of geometrical representations of a surface or volume in 3D space.

data model

所有 PyVista 网格类型都继承自 DataSet 类,表示不同几何类型和数据集类型。以下是 PyVista 的主要网格类型:

类名 描述 适用场景 基类
PointSet 表示一组点的数据集,使用显式的“点”数组定义几何。 仅包含点的几何数据集。 vtk.vtkPointSet
PolyData 表示 1D 和 2D 几何(例如线、多边形、三角形),主要用于表面数据。 创建表面网格或点云。 vtk.vtkPolyData
UnstructuredGrid 支持任意 1D、2D 和 3D 单元的非结构化网格,可包含体单元。 体数据、复杂几何,或处理生成的子集数据。 vtk.vtkUnstructuredGrid
StructuredGrid 规则排列的点网格,点按坐标轴对齐,单元为 2D 四边形或 3D 六面体。 使用 numpy.meshgrid 生成有序网格。 vtk.vtkStructuredGrid
RectilinearGrid 矩形网格,点沿轴对齐但间距不均匀,具有隐式几何。 轴对齐的规则但间距不均的网格数据。 vtk.vtkRectilinearGrid
ImageData 均匀网格(影像数据),点间距均匀,基于原点和单元大小生成几何。 影像数据(如 CT/MRI 扫描)。 vtk.vtkImageData
MultiBlock 多块数据集的容器,可存储多个网格或数据集。 管理多个数据集作为单一对象。 vtk.vtkMultiBlockDataSet
PartitionedDataSet 用于分区管理的复合数据集,封装多个分区。 处理分区化的数据集。 vtk.vtkPartitionedDataSet

pyvistaqt

pyvistaqt 专门为Qt的Python绑定提供支持(通过模块pyvistaqt),这样一来,比直接用vtk简单不少:

  • QtInteractor:PyVista 提供的 QtInteractor 用作 Qt 控件,替换了 VTK 的 QVTKRenderWindowInteractor。
  • 简化 API:PyVista 的 add_mesh 方法直接处理颜色和网格显示设置,而无需手动设置映射器和演员。
  • 背景设置:使用 PyVista 的 set_background 设置背景颜色,提升代码可读性。

例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys

from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QMainWindow

from pyvistaqt import QtInteractor
import pyvista as pv

class PyVistaWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyVista in PySide6")
        self.setGeometry(100, 100, 800, 600)

        # 创建 PyVista 对应的 QWidget 控件
        self.plotter = QtInteractor(self)
        self.setCentralWidget(self.plotter)

        # 创建锥体并添加到渲染器
        cone = pv.Cone(resolution=8)
        self.plotter.add_mesh(cone, color="red", show_edges=True)

        # 设置背景颜色
        self.plotter.set_background("midnightblue")

        # 显示窗口
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PyVistaWindow()
    sys.exit(app.exec())

Qt绑定?

pyvistaqt 借助于pyqt来支持不同的Qt绑定。如果只安装了一种,直接使用,如果装了多个,则需要手动指定。

通过环境变量来选择所期望的绑定:

1
2
import os
os.environ["QT_API"] = "pyside6"

可用选项(默认pyqt5):

  • pyqt5
  • pyside2
  • pyqt6
  • pyside6

参考

  • https://docs.pyvista.org/examples/
  • https://docs.pyvista.org/user-guide/what-is-a-mesh
  • https://qtdocs.pyvista.org/
  • https://qtdocs.pyvista.org/usage.html