from numpy import sqrt, sin, mgrid
from traits.api import HasTraits, Instance
from traitsui.api import View, Item
from tvtk.pyface.scene_editor import SceneEditor
from mayavi.tools.mlab_scene_model import MlabSceneModel
from mayavi.core.ui.mayavi_scene import MayaviScene
classActorViewer(HasTraits):# 场景模型
scene = Instance(MlabSceneModel,())# 建立场景实例# 建立视图
view = View(Item(name='scene',# 提供Mayavi视图窗口
editor=SceneEditor(scene_class=MayaviScene),
show_label=False,
resizable=True,
height=500,
width=500),
resizable=True)def__init__(self,**traits):
HasTraits.__init__(self,**traits)
self.generate_data()defgenerate_data(self):# 建立数据
X, Y = mgrid[-2:2:100j,-2:2:100j]
R =10* sqrt(X **2+ Y **2)
Z = sin(R)/ R
# 绘制数据
self.scene.mlab.surf(X, Y, Z, colormap='cool')if __name__ =='__main__':
a = ActorViewer()
a.configure_traits()
基于交互控制的Mayavi窗口
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
from numpy import arange, pi, cos, sin
dphi = pi /300.
phi = arange(0.0,2* pi +0.5* dphi, dphi,'d')defcurve(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
classMyModel(HasTraits):
n_meridional = Range(0,30,6)
n_longitudinal = Range(0,30,11)# 场景模型实例
scene = Instance(MlabSceneModel,())# 管线实例
plot = Instance(PipelineBase)# 当场景被激活,或者参数发生改变,更新图形
@on_trait_change('n_meridional,n_longitudinal,scene.activated')defupdate_plot(self):
x, y, z, t = curve(self.n_meridional, self.n_longitudinal)if self.plot isNone:# 如果plot未绘制则生成plot3d
self.plot = self.scene.mlab.plot3d(x, y, z, t,
tube_radius=0.025, colormap='Spectral')else:# 如果数据有变化,将数据更新即重新赋值
self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)# 建立视图布局
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=250, width=300, show_label=False),
Group('_','n_meridional','n_longitudinal'),
resizable=True)if __name__ =='__main__':
model = MyModel()
model.configure_traits()