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)

现在将介绍四个基本模块 Outline、Axes、!OrientationAxes 和 Text。

基本模块

请参阅 [:Cookbook/MayaVi/ScriptingMayavi2/BasicModules: 基本模块] wiki 页面。

主模块

请参阅 [:Cookbook/MayaVi/ScriptingMayavi2/MainModules: 主模块] wiki 页面。

过滤器

请参阅 [:Cookbook/MayaVi/ScriptingMayavi2/Filters: 过滤器] wiki 页面。

章节作者: FredericPetit, Unknown[130], GaelVaroquaux, Unknown[6], Unknown[131]