文章目录

  • 一. 课程来源
  • 二. 软件安装
  • 三. Tvtk库使用
  • 1. 创建长方体数据源
  • 2. Tvtk库中的其他数据源
  • 3. Tvtk库中显示三维对象
  • 4. Tvtk中的管线技术
  • 1. 可视化管线
  • 2. 图形管线
  • 4. 使用ivtk观察管线
  • 5. Tvtk数据集
  • 1. Imagedata
  • 2. RectilinearGrid
  • 3. StructuredGrid
  • 4. Polydata
  • 6. Tvtk数据加载
  • 1. stl数据读取
  • 2. MultiBlock数据读取


一. 课程来源

Python科学计算三维可视化

二. 软件安装

需要安装以下package,在这里 pythonlibs 下载然后直接 pip install 就可以安装了

python plt 长方体 python画长方体_数据源

三. Tvtk库使用

1. 创建长方体数据源

from tvtk.api import tvtk

# 创建一个长方体数据源,并且同时设置其长宽高
s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0)
print(s)

-----Result-----
vtkCubeSource (000001F855423E30)
  Debug: Off
  Modified Time: 98
  Reference Count: 2
  Registered Events: 
    Registered Observers:
      vtkObserver (000001F856F22870)
        Event: 33
        EventName: ModifiedEvent
        Command: 000001F85723CCA0
        Priority: 0
        Tag: 1
  Executive: 000001F855B8F980
  ErrorCode: No error
  Information: 000001F85718A410
  AbortExecute: Off
  Progress: 0
  Progress Text: (None)
  X Length: 1
  Y Length: 2
  Z Length: 3
  Center: (0, 0, 0)
  Output Points Precision: 0

2. Tvtk库中的其他数据源

python plt 长方体 python画长方体_数据源_02


新建圆锥数据源

from tvtk.api import tvtk

s = tvtk.ConeSource(height=3.0, radius=1.0, resolution=36)
print(s)

3. Tvtk库中显示三维对象

from tvtk.api import tvtk

# 创建一个长方体数据源,并且同时设置其长宽高
s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0)
# 使用PolyDataMapper将数据转换为图形数据 数据源的输出作为Mapper的输入
m = tvtk.PolyDataMapper(input_connection=s.output_port)
# 创建一个Actor
a = tvtk.Actor(mapper=m)
# 创建一个Renderer,将Actor添加进去
r = tvtk.Renderer(background=(0, 0, 0))
r.add_actor(a)
# 创建一个RenderWindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size=(300, 300))
w.add_renderer(r)
# 创建一个RenderWindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window=w)
# 开启交互
i.initialize()
i.start()

显示结果:

python plt 长方体 python画长方体_python plt 长方体_03


实现显示的流程:

python plt 长方体 python画长方体_数据源_04

4. Tvtk中的管线技术

1. 可视化管线

python plt 长方体 python画长方体_数据源_05


python plt 长方体 python画长方体_数据源_06

2. 图形管线

python plt 长方体 python画长方体_数据读取_07


python plt 长方体 python画长方体_3d_08

4. 使用ivtk观察管线

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)

# 修正错误
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()

python plt 长方体 python画长方体_数据源_09

5. Tvtk数据集

Tvtk库中提供了5种数据集

python plt 长方体 python画长方体_数据读取_10

1. Imagedata

python plt 长方体 python画长方体_python plt 长方体_11


参数:

python plt 长方体 python画长方体_3d_12

from tvtk.api import tvtk
img = tvtk.ImageData(spacing=(1, 1, 1), origin=(1, 2, 3), dimensions=(3, 4, 5))
print(img.get_point(0)) # 网格中第一个点的坐标值

for n in range(6): # 输出前6个点的坐标值
    print("%.1f, %.1f, %.1f" % img.get_point(n))

-----Result-----
(1.0, 2.0, 3.0)
1.0, 2.0, 3.0
2.0, 2.0, 3.0
3.0, 2.0, 3.0
1.0, 3.0, 3.0
2.0, 3.0, 3.0
3.0, 3.0, 3.0
2. RectilinearGrid

python plt 长方体 python画长方体_数据读取_13

from tvtk.api import tvtk
import numpy as np

x = np.array([0, 3, 9, 15])  # x轴4个点长度
y = np.array([0, 1, 5])      # y轴3个点长度
z = np.array([0, 2, 3])      # z轴3个点长度
r = tvtk.RectilinearGrid()   # 完成构建
r.x_coordinates = x          # 分别设置给各个点坐标
r.y_coordinates = y
r.z_coordinates = z
r.dimensions = len(x), len(y), len(z)
for n in range(6):
    print(r.get_point(n))

-----Result-----
(0.0, 0.0, 0.0)
(3.0, 0.0, 0.0)
(9.0, 0.0, 0.0)
(15.0, 0.0, 0.0)
(0.0, 1.0, 0.0)
(3.0, 1.0, 0.0)
3. StructuredGrid

python plt 长方体 python画长方体_数据读取_14

4. Polydata

python plt 长方体 python画长方体_数据读取_15

6. 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().widget()
    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()
1. stl数据读取
from tvtk.api import tvtk
from Tvtkfunc import ivtk_scene,event_loop
 
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()
2. MultiBlock数据读取
from tvtk.api import tvtk
 
def read_data():    #导入数据
    plot3d = tvtk.MultiBlockPLOT3DReader(
        xyz_file_name="comxyz.bin", #网格文件
        q_file_name="combq.bin", #开启动力学结果文件
        scalar_function_number = , #设置标量数据数量
        vector_function_number=, #设置矢量数据数量
    )
    plot3d.update() #从文件读取数据
    return plot3d
 
plot3d = read_data()
grid = plot3d.output.get_block()   #查看数据细节,获取网格数据集
 
print(type(plot3d.output))
print(type(plot3d.output.get_block()))

python plt 长方体 python画长方体_数据源_16