在Mayavi2中,我试图动态地修改三维线图的管半径。例如
from traits.api import HasTraits, Float, 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
import numpy
def curve():
n_mer, n_long = 6, 11
pi = numpy.pi
dphi = pi / 1000.0
phi = numpy.arange(0.0, 2 * pi + 0.5 * dphi, dphi)
mu = phi * n_mer
x = numpy.cos(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5)
y = numpy.sin(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5)
z = numpy.sin(n_long * mu / n_mer) * 0.5
t = numpy.sin(mu)
return x, y, z, t
class MyModel(HasTraits):
radius = Float(0.025)
scene = Instance(MlabSceneModel, ())
plot = Instance(PipelineBase)
@on_trait_change('radius,scene.activated')
def update_plot(self):
x, y, z, t = curve()
if self.plot is None:
self.plot = self.scene.mlab.plot3d(x, y, z, t,
tube_radius=self.radius, colormap='Spectral')
else:
print self.radius
self.plot.mlab_source.set(tube_radius=self.radius)
self.scene.mlab.draw()
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=250, width=300, show_label=False),
Group(
'radius',
),
resizable=True,
)
my_model = MyModel()
my_model.configure_traits()这意味着:

然而,当我改变半径时,视觉线条图不会发生任何变化。
发布于 2014-09-22 14:43:46
不要使用trait.set或trait.reset设置mayavi或vtk属性。实际上,您正在使用的MLineSource没有这样的属性,但是即使它使用了,它也可能无法工作。
手动找到控制此特性的mayavi属性以查看它分配给哪个mayavi对象通常是很有用的。在这种情况下,通过mayavi管道GUI显示它在管道过滤器上。
mlab.plot3d是一个帮助函数,它试图为您完成一切,而不维护对所使用的过滤器的引用。但是一般来说,如果您自己构建管道,那么保持对mayavi管道中每个步骤的引用是很好的做法。这样,您就可以轻松地访问控制此操作的mayavi对象。
如果您不自己构造管道,则可以通过手动导航父对象和子对象树来实现管道中的管道。在这种情况下,您可以像这样访问它:
@on_trait_change('radius,scene.activated')
def update_plot(self):
x, y, z, t = curve()
if self.plot is None:
self.plot = self.scene.mlab.plot3d(x, y, z, t,
tube_radius=self.radius, colormap='Spectral')
else:
self.plot.parent.parent.filter.radius = self.radiushttps://stackoverflow.com/questions/25863556
复制相似问题