Mlab対話型ダイアログの例

対話型ダイアログで表示されるデータを変更する方法の例.

ダイアログは TraitsUI を介してオブジェクト(MyModel)から作成されます.オブジェクトの一部のアトリビュートがダイアログに表示されます.まず,可視化をホストするMayaviシーンと,プロットされたデータを制御する2つのパラメータです.

関連するmlabを使用して,埋め込まれたシーンにカーブがプロットされます.points3d関数.作成されたビジュアライゼーションオブジェクトは,メインのMyModelオブジェクト上に属性として保存され,後でインプレイスで修正されます.

ダイアログのスライドバーなどを使用して n_meridional および n_longitudinal 属性を変更すると,曲線が再計算され,保存されているプロットオブジェクトの場所を変更することで可視化が更新されます( データのアニメート 参照).

この例は 特性ダイアログへのMayaviシーンの埋め込み の章で詳細に論じられます.

../_images/example_mlab_interactive_dialog.jpg

Pythonソースコード: mlab_interactive_dialog.py

# Author: Gael Varoquaux <gael.varoquaux@normalesup.org>
# Copyright (c) 2008, Enthought, Inc.
# License: BSD Style.


from numpy import arange, pi, cos, sin

from traits.api import HasTraits, Range, Instance, \
        on_trait_change
from traitsui.api import View, Item, Group

from mayavi.core.api import PipelineBase
from mayavi.core.ui.api import MayaviScene, SceneEditor, \
                MlabSceneModel


dphi = pi/1000.
phi = arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')

def curve(n_mer, n_long):
    mu = phi*n_mer
    x = cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
    y = sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
    z = 0.5 * sin(n_long*mu/n_mer)
    t = sin(mu)
    return x, y, z, t


class MyModel(HasTraits):
    n_meridional    = Range(0, 30, 6, )#mode='spinner')
    n_longitudinal  = Range(0, 30, 11, )#mode='spinner')

    scene = Instance(MlabSceneModel, ())

    plot = Instance(PipelineBase)


    # When the scene is activated, or when the parameters are changed, we
    # update the plot.
    @on_trait_change('n_meridional,n_longitudinal,scene.activated')
    def update_plot(self):
        x, y, z, t = curve(self.n_meridional, self.n_longitudinal)
        if self.plot is None:
            self.plot = self.scene.mlab.plot3d(x, y, z, t,
                                tube_radius=0.025, colormap='Spectral')
        else:
            self.plot.mlab_source.trait_set(x=x, y=y, z=z, scalars=t)


    # The layout of the dialog created
    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                     height=250, width=300, show_label=False),
                Group(
                        '_', 'n_meridional', 'n_longitudinal',
                     ),
                resizable=True,
                )

my_model = MyModel()
my_model.configure_traits()