如何在Mayavi应用中使用MLAB ISO_SURFACE模块



我正在尝试构建一个使用MLAB iso_surface模块的简单Mayavi脚本应用程序。

但是,当我运行我的应用程序时,它会抛出两个窗口,一个显示我的mayavi iso_surface绘图,另一个显示空白的"编辑属性"窗口。看来Mayavi场景没有在"编辑属性"窗口的指定视图布局中显示。

所以我的问题是:为什么Mayavi iso_surface场景不出现在视图布局中,我该如何将其获取?

一个简单的测试脚本显示此行为,在下面粘贴。我使用的是Canopy版本:2.1.1.3504(64位(,Windows 10系统上的Python 3.5.2。

[注意:我修改了我的原始问题以包括另一个问题。如何使用来自范围对象的输入(mult_s(更新" S"数据?我已经在下面做了这一点,但没有成功。它抛出: TraitError: Cannot set the undefined 's' attribute of a 'ArraySource' object.]

class Isoplot1(HasTraits):
    scene = Instance(MlabSceneModel, ())
    mult_s = Range(1, 5, 1)
    @on_trait_change('scene.activated')
    def _setup(self):
        # Create x, y, z, s data
        L = 10.
        x, y, z = np.mgrid[-L:L:101j, -L:L:101j, -L:L:101j]
        self.s0 = np.sqrt(4 * x ** 2 + 2 * y ** 2 + z ** 2)        
        # create the data pipeline
        self.src1 = mlab.pipeline.scalar_field(x, y, z, self.s0)
        # Create the plot
        self.plot1 = self.scene.mlab.pipeline.iso_surface(
            self.src1, contours=[5, ], opacity=0.5, color=(1, 1, 0)
        )
    @on_trait_change('mult_s')
    def change_s(self):
        self.src1.set(s=self.s0 * self.mult_s)
    # Set the layout
    view = View(Item('scene', 
                     editor=SceneEditor(scene_class=MayaviScene),
                     height=400, width=600, show_label=False),
                HGroup('mult_s',),
                resizable=True
                )
isoplot1 = Isoplot1()
isoplot1.configure_traits()

如果使用self.scene.mlab.pipeline.scalar_field而不是mlab.pipeline.scalar_field,则不应发生。

通常,您应该避免在初始化器中创建任何可视化。相反,当scene.activated事件发射时,您应该始终设置场景。为了安全使用RAW MLAB,您应该按以下方式重写代码。

from mayavi import mlab
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, SceneEditor, MlabSceneModel
import numpy as np
class Isoplot1(HasTraits):
    scene = Instance(MlabSceneModel, ())
    @on_trait_change('scene.activated')
    def _setup(self):
        # Create x, y, z, s data
        L = 10.
        x, y, z = np.mgrid[-L:L:101j, -L:L:101j, -L:L:101j]
        s = np.sqrt(4 * x ** 2 + 2 * y ** 2 + z ** 2)
        # create the data pipeline
        self.src1 = mlab.pipeline.scalar_field(x, y, z, s)
        # Create the plot
        self.plot1 = self.scene.mlab.pipeline.iso_surface(
            self.src1, contours=[5, ], opacity=0.5, color=(1, 1, 0)
        )
    # Set the layout
    view = View(Item('scene', 
                     editor=SceneEditor(scene_class=MayaviScene),
                     height=400, width=600, show_label=False),
                resizable=True
                )
isoplot1 = Isoplot1()
isoplot1.configure_traits()

您可能已经知道了这一点,但是以防万一您还可以查看文档中的其他一些Mayavi交互式示例。

相关内容

  • 没有找到相关文章

最新更新