ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

17. TraitsUI与Mayavi应用实例

2019-09-15 10:41:51  阅读:261  来源: 互联网

标签:__ 17 traits self Mayavi scene TraitsUI import mayavi


文章目录

建立mayavi窗口步骤

  • 建立从HasTraits继承的类
    • 建立MlabSceneModel场景实例scene
    • 建立View视图
    • 定义__init__函数,生成数据
  • 建立类的实例,调用configure_traits()方法

简单的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


class ActorViewer(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()

    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')


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')


def curve(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


class MyModel(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')
    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)

if __name__ == '__main__':
    model = MyModel()
    model.configure_traits()

这里写图片描述

标签:__,17,traits,self,Mayavi,scene,TraitsUI,import,mayavi
来源: https://blog.csdn.net/Exupery_/article/details/77528907

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有