1. 程式人生 > >科學計算三維可視化---TraitsUI與Mayavi實例

科學計算三維可視化---TraitsUI與Mayavi實例

步驟 簡單 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實例