Python/tvtk/test
前言
就中国慕课mooc/科学计算三维可视化课中对遇到的题目进行记录,是鄙人自己所使用的代码。记录本人的学习日志,若有纰漏之处,希望各位看官加以斧正。
4.28题目:
1.请用tvtk绘制一个圆锥,圆锥的数据源对象为ConeSource(),圆锥高度为6.0,圆锥半径为2.0。
给出代码:
from tvtk.api import tvtk
#最先开始使用tvtk.ConeSource()创建一个圆锥数据
#再利用tvtk.PolyDataMapper()将圆锥数据转化为图形数据
#然后用tvtk.Actor()生成实体
cs = tvtk.ConeSource(height=6.0,radius=2.0,resolution=64)
m=tvtk.PolyDataMapper(input_connection=cs.output_port)
a=tvtk.Actor(mapper=m)
#用tvtk.Renderer()生成渲染器,background后缀跟背景颜色显示数值
#创建windous绘制窗口,并且添加经Renderer处理信息
ren=tvtk.Renderer(background=(1,1,1))
ren.add_actor(a)
rw=tvtk.RenderWindow(size=(300,300))
rw.add_renderer(ren)
#为w创建窗口交互工具RenderWindowInteractor
rwi=tvtk.RenderWindowInteractor(render_window=rw)
rwi.initialize()
rwi.start()
2.请自行从网络上下载一个.stl模型文件,使用tvtk读取该文件并显示出来。
给出代码:
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()
from tvtk.api import tvtk
s = tvtk.STLReader(file_name = "文件路径.stl")
m = tvtk.PolyDataMapper(input_connection = s.output_port)
a = tvtk.Actor(mapper = m)
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()
3.改写课程中标量等值面绘制的实例,通过get_value()和set_value()设定第1个等值面的值为原来的2倍。
给出代码:
from tvtk.api import tvtk
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()
#开始页面循环,即维持页面更新
plot3d = tvtk.MultiBlockPLOT3DReader(
xyz_file_name="文件1路径.bin",
q_file_name="文件2路径.bin",
scalar_function_number=100, vector_function_number=200
)#读入Plot3D数据
plot3d.update()#让plot3D计算其输出数据
grid = plot3d.output.get_block(0)#获取读入的数据集对象
con = tvtk.ContourFilter()#创建等值面对象
con.set_input_data(grid)
con.generate_values(10, grid.point_data.scalars.range)#指定轮廓数和数据范围,10为总共10个等势面,即为等势面赋值
#这步操作就是针对题目的要求,用set_value(int-等势面序号),float-等势面代替数值);用get_value(int-等势面序号)获取等势面数值
con.set_value(0,2*con.get_value(0))
#设定映射器的变量范围属性
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#设定透明度为0.5
#窗口绘制
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()