Mayavi adalah sebuah library Python yang digunakan untuk menghasilkan visualisasi 3D. Dalam beberapa kasus, Anda mungkin ingin membuat dialog interaktif yang memungkinkan pengguna untuk mengubah tampilan visualization secara langsung. Salah satu cara untuk mencapai tujuan ini adalah dengan menggunakan Traits, sebuah library Python lainnya.

Membuat Dialog Sederhana

Dalam contoh berikut, kita akan membuat dialog sederhana yang menampilkan scene 3D Mayavi dan memungkinkan pengguna untuk mengubah tampilan secara langsung.

from traits.api import HasTraits, Instance
from traitsui.api import View, Item, HGroup
from mayavi.core.ui.api import SceneEditor, MlabSceneModel

def curve(n_turns):
 "The function creating the x, y, z coordinates needed to plot"
 phi = np.linspace(0, 2*np.pi, 2000)
 return [np.cos(phi) * (1 + 0.5*np.cos(n_turns*phi)),
 np.sin(phi) * (1 + 0.5*np.cos(n_turns*phi)),
 0.5*np.sin(n_turns*phi)]

class Visualization(HasTraits):
 "The class that contains the dialog"
 scene = Instance(MlabSceneModel, ())

 def __init__(self):
 HasTraits.__init__(self)
 x, y, z = curve(n_turns=2)
 # Populating our plot
 self.plot = self.scene.mlab.plot3d(x, y, z)

 # Describe the dialog
 view = View(Item('scene', height=300, show_label=False,
 editor=SceneEditor()),
 HGroup('n_turns'), resizable=True)

# Fire up the dialog
Visualization().configure_traits()

Dalam contoh di atas, kita membuat sebuah class Visualization yang mengextend dari HasTraits. Kita juga membuat sebuah atribut scene yang berupa instance dari MlabSceneModel, serta sebuah metode __init__ yang digunakan untuk mempopulasi plot 3D.

Membuat Dialog Interaktif

Untuk membuat dialog interaktif, kita perlu menambahkan beberapa fitur. Salah satu contoh adalah dengan menggunakan atribut n_turns yang dapat diubah oleh pengguna.

from traits.api import Range, on_trait_change

class Visualization(HasTraits):
 n_turns = Range(0, 30, 11)
 scene = Instance(MlabSceneModel, ())

 def __init__(self):
 HasTraits.__init__(self)
 x, y, z = curve(self.n_turns)
 self.plot = self.scene.mlab.plot3d(x, y, z)

 @on_trait_change('n_turns')
 def update_plot(self):
 x, y, z = curve(self.n_turns)
 self.plot.mlab_source.set(x=x, y=y, z=z)

 view = View(Item('scene', height=300, show_label=False,
 editor=SceneEditor()),
 HGroup('n_turns'), resizable=True)

# Fire up the dialog
Visualization().configure_traits()

Dalam contoh di atas, kita menambahkan atribut n_turns yang dapat diubah oleh pengguna. Kita juga membuat sebuah metode update_plot yang dipanggil ketika nilai atribut n_turns berubah. Dalam metode ini, kita mempopulasi plot 3D dengan nilai baru.

Menggabungkan Semua

Akhirnya, kita dapat menggabungkan semua fitur di atas untuk membuat sebuah dialog interaktif yang memungkinkan pengguna untuk mengubah tampilan visualization secara langsung.

# Fire up the dialog
Visualization().configure_traits()

Dengan demikian, kita telah berhasil membuat sebuah dialog interaktif dengan Mayavi dan Traits. Dialog ini memungkinkan pengguna untuk mengubah tampilan visualization secara langsung dan mempopulasi plot 3D berdasarkan nilai atribut n_turns.