科學計算三維可視化---TraitsUI與Mayavi實例
阿新 • • 發佈:2018-07-14
步驟 簡單 cos ret src lse 函數 item lar
TraitsUI與Mayavi實例
一:創建一個簡單的TraitsUI與Mayavi實例
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 #1創建HasTraits繼承類class ActorViewer(HasTraits): #1.1創建場景實例 scene = Instance(MlabSceneModel,()) #建立視圖 view = View( Item("scene", 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() def generate_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") a = ActorViewer() a.configure_traits()
二:基於交互控制的Mayavi窗口
(一)框架步驟
(二)程序框架
(三)代碼實現
(1)定義窗口變量
(2)建立視圖的布局
(3)更新視圖繪制
(4)定義Curve生成數據
(四)全部代碼
from numpy import cos,sin,pi,arange from traits.api import HasTraits,Instance,Range,on_trait_change from traitsui.api import View,Item,Group from mayavi.core.ui.api import MayaviScene,SceneEditor,MlabSceneModel from mayavi.core.api import PipelineBase dphin = pi/300. phi = arange(0.0,2*pi+0.5*dphin,dphin,‘d‘) #建立數據 def curve(n_mer,n_long): mu = phi*n_mer x = cos(mu)*(1+cos(n_long/n_mer)*0.5) y = sin(mu)*(1+cos(n_long/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) n_longitudinal = Range(0,30,11) #場景模型實例 scene = Instance(MlabSceneModel,()) #後面加上()是將他實例化了 #管線實例 plot = Instance(PipelineBase) def __init__(self,**traits): HasTraits.__init__(self,**traits) x, y, z, t = curve(self.n_meridional, self.n_longitudinal) if self.plot is None: # 如果plot未繪制則輸出plot3d self.plot = self.scene.mlab.plot3d(x, y, z, t, tube_radius=0.025, colormap="Spectral") #當場景被激活,或者參數發生改變,更新圖像 @on_trait_change([‘n_meridional‘,‘n_longitudinal‘]) #似乎監聽scene.activated也可以實現在生成scene時計進入下面函數方法 def update_plot(self): x, y, z, t = curve(self.n_meridional, self.n_longitudinal) if self.plot is None: # 如果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 ) model = MyModel() model.configure_traits()
科學計算三維可視化---TraitsUI與Mayavi實例