码迷,mamicode.com
首页 > 其他好文 > 详细

科学计算三维可视化---TraitsUI与Mayavi实例

时间:2018-07-14 21:33:07      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:maya   range   ast   editor   代码实现   ctr   nal   模型   .com   

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实例

标签:maya   range   ast   editor   代码实现   ctr   nal   模型   .com   

原文地址:https://www.cnblogs.com/ssyfj/p/9310931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!