Mayavi 2 脚本¶
日期 | 2008-08-06(最后修改),2006-06-19(创建) |
---|
||\<#80FF80> 本页介绍使用高级面向对象 API 对 Mayavi2 进行脚本编写。Mayavi2 最近获得了一个易于使用的脚本模块:mlab,尽管它可能不如强大的。欢迎参考 部分 的 Mayavi2 用户指南。阅读本页将帮助您更深入地了解 Mayavi2 的工作原理,并补充用户指南。 ||
简介¶
要对 !MayaVi2 进行脚本编写,您需要(至少)
* 您最喜欢的文本编辑器;
\ * 已安装 python ;-)
\ * 已安装 !MayaVi2 ;-)
对 !MayaVi2 进行脚本编写非常简单,因为 !MayaVi2 是用 python 编写的,并且基于 TVTK,这简化了所有 VTK 对象的使用。
在以下内容中,您将学习如何编写脚本并使用 !MayaVi2 模块和过滤器。
模块可以分为两部分
* 不与 VTK 数据交互的模块,很少修改/处理(轮廓、轴、!OrientationAxes 和文本)。 这些被称为“基本”模块。 虽然颜色条严格来说不是模块,但它将在本文中介绍。 还将介绍设置一些参数以渲染场景。
* 与 VTK 数据交互的模块,以及您想要使用的模块(即所有剩余的模块 ;-)。
在开始之前,让我们看看用 python 编写的 !MayaVi2 脚本的“主模板”。
主模板:创建你的 MayaVi2 类¶
一个 !MayaVi2 脚本至少应该包含以下几行
#! /usr/bin/env python
from enthought.mayavi.app import Mayavi
class MyClass(Mayavi):
def run(self):
script = self.script
# `self.script` is the MayaVi Script interface (an instance of
# enthought.mayavi.script.Script) that is created by the
# base `Mayavi` class. Here we save a local reference for
# convenience.
## import any Mayavi modules and filters you want (they must be done here!)
.../...
script.new_scene() # to create the rendering scene
## your stuff (modules, filters, etc) here
.../...
if __name__ == '__main__':
mc = MyClass()
mc.main()
添加模块或过滤器非常简单:你需要导入它,然后将其添加到你的 !MayaVi2 类中。
要添加模块,请键入
from enthought.mayavi.modules.foo_module import FooModule
.../...
mymodule = FooModule()
script.add_module(mymodule)
要添加过滤器,请键入
from enthought.mayavi.filters.bar_filter import BarFilter
.../...
myfilter = BarFilter()
script.add_filter(myfilter)
注意使用的语法:例如,对于模块,foo_module 是 mayavi/ 目录(小写,下划线)的子目录 module/ 中的 foo_module python 文件(不带扩展名 .py);该文件包含类 FooModule(无下划线,首字母大写)。
但首先,在你使用你想要使用的模块和过滤器渲染场景之前,你当然需要加载一些数据。
加载数据¶
你可以选择
* 创建一个 3D 数据数组,用于标量数据(对于向量数据,你需要使用 4D 标量数据,即每个分量一个 3D 标量数据)并使用 !ArraySource 方法加载它;
* 使用 !FileReader 方法加载数据文件。
使用 ArraySource 方法从数组加载数据¶
例如,我们将创建一个 50*50*50 的 3D(标量)数组,它包含余弦和正弦函数的乘积。
为此,我们需要加载相应的模块
import scipy
from scipy import ogrid, sin, cos, sqrt, pi
from enthought.mayavi.sources.array_source import ArraySource
Nx = 50
Ny = 50
Nz = 50
Lx = 1
Ly = 1
Lz = 1
x, y, z = ogrid[0:Lx:(Nx+1)*1j,0:Ly:(Ny+1)*1j,0:Lz:(Nz+1)*1j]
# Strictly speaking, H is the magnetic field of the "transverse electric" eigenmode m=n=p=1
# of a rectangular resonator cavity, with dimensions Lx, Ly, Lz
Hx = sin(x*pi/Lx)*cos(y*pi/Ly)*cos(z*pi/Lz)
Hy = cos(x*pi/Lx)*sin(y*pi/Ly)*cos(z*pi/Lz)
Hz = cos(x*pi/Lx)*cos(y*pi/Ly)*sin(z*pi/Lz)
Hv_scal = sqrt(Hx**2 + Hy**2 + Hz**2)
# We want to load a scalars data (Hv_scal) as magnitude of a given 3D vector (Hv = {Hx, Hy, Hz})
# Hv_scal is a 3D scalars data, Hv is a 4D scalars data
src = ArraySource()
src.scalar_data = Hv_scal # load scalars data
# To load vectors data
# src.vector_data = Hv
使用 FileReader 方法从文件加载数据¶
要加载 VTK 数据文件,例如 mayavi/examples/data/ 目录中的 heart.vtk 文件,只需键入
from enthought.mayavi.sources.vtk_file_reader import VTKFileReader
src = VTKFileReader()
src.initialize("heart.vtk")
注意:扩展名为 .vtk 的文件被称为“传统 VTK”文件。!MayaVi2 可以读取许多其他文件格式(XML、Ensight、Plot3D 等文件)。例如,你可以使用 VTKXML!FileReader 方法加载 XML 文件(扩展名为 .vti、.vtp、.vtr、.vts、.vtu 等)。
将源添加到你的 MayaVi2 类¶
然后,一旦你使用上述两种方法之一加载了数据,就在类 !MyClass 的主体中(在 script.new_scene 之后)使用 add_source() 方法添加源
script.add_source(src)
章节作者: FredericPetit, Unknown[130], GaelVaroquaux, Unknown[6], Unknown[131]