管线技术也称流水线技术(Pipeline)每个对象只实现相对简单的任务,
整个管线进行复杂的可视化处理
在tvtk中分为可视化管线和图形管线
可视化管线(Visualization Pipeline):将原始数据加工成图形数据的过程
图形管线(Graphics Pipeline):图形数据加工为所看到的图像
数据可视化分为五个模块:
数据模块,数据预处理模块,数据映射模块,绘制模块和显示模块。
前两部分为可视化管线
与可视化管线相关的两个对象:
tvtk.CubeSource数据对象和tvtk.PolyDataMapper图形对象
后三部分为图形管线
与图形管线相关的四个tvtk对象:
Actor实体对象,
Renderer渲染场景对象
RenderWindow渲染用的图形窗口对象
RenderWindowInteractor用户交互对象
from tvtk.api import tvtk from tvtk.tools import ivtk from pyface.api import GUI s=tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0) m=tvtk.PolyDataMapper(input_connection=s.output_port) a=tvtk.Actor(mapper=m) #创建一个带Crust(Python Shell)的窗口 gui=GUI() win=ivtk.IVTKWithCrustAndBrowser() win.open() win.scene.add_actor(a) """ 运行之后左侧窗口出现空白,这个是一个小小的bug,后续将会修复它 这个bug如何产生的呢? 在vtk中引入了GUI模块。 在GUI开启的时候它的子窗口Dialogue其实是个子窗口空间,应存在于主窗口之中 因为这个bug的存在,使它脱离了这个窗口 """ #修正错误 dialog=win.control.centralWidget().widget(0).widget(0) from pyface.qt import QtCore dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000)) dialog.show() #开始界面消息循环 gui.start_event_loop()
为方便操作tvtk的管线并方便修改各个tvtk对象属性
使用ivtk库方便操作导入from tvtk.api import ivtk
以下是运行效果,支持鼠标拖拽改变角度和大小
修正之后
为使代码变得简洁,在此进行简单的封装
from tvtk.api import tvtk '''可以把以下两个函数分别写到一个文件中 在开头from tvtkfunc import ivtk_scene,event_loop 使代码变得简洁 ''' def ivtk_scene(actors): from tvtk.tools import ivtk #创建一个带Crust(Python Shell)的窗口 win=ivtk.IVTKWithCrustAndBrowser() win.open() win.scene.add_actor(actors) #修正错误 dialog=win.control.centralWidget().widget(0).widget(0) from pyface.qt import QtCore dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000)) dialog.show() return win def event_loop(): #开始界面消息循环 from pyface.api import GUI gui=GUI() gui.start_event_loop() s=tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0) m=tvtk.PolyDataMapper(input_connection=s.output_port) a=tvtk.Actor(mapper=m) win=ivtk_scene(a) win.scene.isometric_view() event_loop(数据集(Dataset)
数据集
点(point)
连接vs非连接
多个相关的点组成单元(Cell)
连接:显示vs隐式
数据(Data)
标量(Scalar)vs矢量(Vector)
可以属于点(Point)也可以属于单元(Cell)
TVTK库中提供的五种数据集
ImageData:表示二维或三维图像数据结构(可以理解成二维三维数组)
spacing参数:三维网络数据在X,Y,Z轴上的间距
origin参数:三维网络数据的起点坐标
dimensions参数:在X,Y,Z轴上的网格数
RectilinearGrid:间距不均匀的网格,所有点都在正交的网格上
StructuredGrid:
创建任意形状的网格,需要指定点的坐标和属性point,demensions等
点和单元的关系由点在网格中的位置所决定
PolyData:由一系列的点、点之间的联系以及由点构成的多边形组成
UnstructuredGrid
#构建ImageData数据集 from tvtk.api import tvtk img=tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5)) #img.get_point(0)获得网格中第一个点的坐标值 print("ImageData数据集:") for n in range(6):#输出image对象的所有点 print("%.1f,%.1f,%.1f" % img.get_point(n)) #RectilinearGrid使用 #(因为不均匀,所以网格对象上的所有点表示对象交点) import numpy as np x=np.array([0,3,9,15])#实现网格的构建 y=np.array([0,1,5]) z=np.array([0,2,3]) r=tvtk.RectilinearGrid()#因为不会根据属性调整数组长度,所以需要设置 r.x_coordinates = x r.y_coordinates = y r.z_coordinates = z r.dimensions = len(x),len(y),len(z) print("RectilinearGrid数据集:") for n in range(6): print(r.get_point(n))
运行效果:
tvtk提供了object,PLY和STL的文件读取类,分别是vtkOBJReader,
stl文件是在计算机图形应用系统中用于表示三角形网格的一种文件格式
这种格式应用简单广泛
TVTK模型(从外部)读取
s=tvtk.STLReader(file_name="stl文件名")
from tvtk.api import tvtk from tvtkfunc import ivtk_scene,event_loop #之前已经把函数ivtk_scene,event_loop封装到tvtkfunc.py中 s=tvtk.STLReader(file_name="python.stl") m=tvtk.PolyDataMapper(input_connection = s.output_port) a=tvtk.Actor(mapper=m) win=ivtk_scene(a) win.scene.isometric_view() event_loop()
运行效果:可以实现鼠标改变角度的Python单词
'''tvtk读取Plot3D文件 使用MultiBlock数据读取 Plot3D文件分为: 网格文件(XYZ文件) 空气动力学文件(Q文件) 通用结果文件 ''' from tvtk.api import tvtk def read_data():#读入数据 #MultiBolck调用形式 plot3d=tvtk.MultiBolckPLOT3DReader( xyz_file_name="combxyz.bin",#网格文件 q_file_name="combq.bin",#空气动力学结果文件 scalar_function_number=100,#设置标量数据数量 vector_function_number=200#设置矢量数据数量 ) plot3d.update() return plot3d plot3d = read_data() grid = plot3d.output.get_block(0)#为查看细节获取网格数据集
运行结果如下: