我正在尝试构建一个使用mlab iso_surface
模块的简单Mayavi脚本应用程序。
然而,当我运行我的应用程序时,它会抛出两个窗口,一个显示我的mayavi iso_surface图,另一个显示空白的“编辑属性”窗口。似乎mayavi场景未在“编辑属性”窗口的指定视图布局中显示。
所以我的问题是:为什么mayavi iso_surface场景没有出现在视图布局中,我如何在那里得到它?
下面粘贴了一个显示此行为的简单测试脚本。我在Windows 10系统上使用Canopy版本:2.1.1.3504(64位),python 3.5.2。
[注意:我修改了原来的问题以包含其他问题。如何使用Range对象(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()
答案 0 :(得分:2)
如果您使用self.scene.mlab.pipeline.scalar_field
代替mlab.pipeline.scalar_field
,则不应发生这种情况。
通常,您应该避免在初始化程序中创建任何可视化。相反,您应该在scene.activated
事件被触发时始终设置场景。为了安全地使用原始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 interactive examples。