整理于 https://www.icourse163.org/course/BIT-1001871001(Python科学计算三维可视化)
TVTK可视化实例
标量可视化、矢量可视化、轮廓可视化
利用ContourFilter()等值面过滤器
1.标量可视化
tvtk.ContourFilter()
方法及说明
generate_values() 设定n条等值线,一般用于重新绘制等值线
set_value() 设定一条等值线的值,一般用于覆盖某条等值线或增加一条等值线
from tvtk.api import tvtk
def ivtk_scene(actors):
from tvtk.tools import ivtk
win = ivtk.IVTKWithCrustAndBrowser() #创建crust窗口
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()
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name = 'combxyz.bin',#网格文件
q_file_name = 'combq.bin',#空气动力学结果文件
scalar_function_number = 100,#设置标量数据数量
vector_function_number = 200
)#读入Plot3D数据
plot3d.update()#让plot.D计算其输出数据
grid = plot3d.output.get_block(0) #获取读入的数据集对象
con = tvtk.ContourFilter() #创建等值面对象
con.set_input_data(grid) #绑定网格
con.generate_values(10,grid.point_data.scalars.range)
#创建10个等值面,等值面的取值范围由scalars.range决定,等值面的颜色也是由scalars数组来决定
#此处未设置颜色映射表,选用默认映射表,最小值映射红色,最大值为蓝色
#下面还需要给标量范围属性进行赋值
m = tvtk.PolyDataMapper(scalar_range = grid.point_data.scalars.range,
input_connection = con.output_port)
a = tvtk.Actor(mapper = m)
a.property.opacity = 0.5 #透明度
#窗口绘制
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()
除了用generate_values()之外还可以用set_value(),指定每一个等值面,第一个参数指定第几个等值面,第二个参数指定等值面的值
2.矢量可视化
矢量数据既有大小又有方向,用箭头表示较好
tvtk.Glyph3D()
符号化技术
一般来说,矢量数据过于密集,为了绘制得更快,采用
tvtk.MaskPoints()
代码如下
from tvtk.api import tvtk
# from tvtkfunc import ivtk_scene,event_loop
def ivtk_scene(actors):
from tvtk.tools import ivtk
win = ivtk.IVTKWithCrustAndBrowser() #创建crust窗口
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()
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name = 'combxyz.bin',
q_file_name = 'combq.bin',
scalar_function_number = 100,
vector_function_number = 200
) #读入plot3d数据
plot3d.update() #让plot3d计算输出数据
grid = plot3d.output.get_block(0) #获取读入的数据集对象
mask = tvtk.MaskPoints(random_mode = True,on_ratio = 50) #随机取样开关,取样频率
mask.set_input_data(grid)
glyph_source = tvtk.ArrowSource() #创建表示箭头的数据集
# glyph_source = tvtk.ConeSource() #修改向量箭头表示为圆锥表示
glyph = tvtk.Glyph3D(
input_connection = mask.output_port,
scale_factor = 2 #放缩系数 ConeSource() 降低为2,ArrowSource()为4
)
glyph.set_source_connection(glyph_source.output_port)
m = tvtk.PolyDataMapper(
scalar_range = grid.point_data.scalars.range,
input_connection = glyph.output_port
)
a = tvtk.Actor(mapper = m)
#窗口绘制
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()
3.外轮廓
tvtk.StructuredGridOutlineFilter()
举例:
#计算PolyData对象的外边框
from tvtk.common import configure_input
def ivtk_scene(actors):
from tvtk.tools import ivtk
win = ivtk.IVTKWithCrustAndBrowser() #创建crust窗口
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()
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name = 'combxyz.bin',
q_file_name = 'combq.bin',
scalar_function_number = 100,
vector_function_number = 200
) #读入plot3d数据
plot3d.update() #让plot3d计算输出数据
grid = plot3d.output.get_block(0) #获取读入的数据集对象
outline = tvtk.StructuredGridOutlineFilter() #计算表示外边框的PolyData对象
configure_input(outline,grid) #调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(
input_connection = outline.output_port
)
a = tvtk.Actor(mapper = m)
# a.property.opacity = 0.5 #透明度
a.property.color = 0.3,0.3,0.3
#窗口绘制
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()