I am working on a visualization of different vector fields.
我正在研究不同矢量场的可视化。
For this purpose I am using the Mayavi Library in Python 2.7 (I think), to create a Image Plane Widget (IPW) and a slider to change the data of the vector field while the visualization is open, but my IPW won't change.
为此,我使用Python 2.7中的Mayavi库(我认为),创建一个图像平面小部件(IPW)和一个滑块,在可视化打开时更改矢量场的数据,但我的IPW不会改变。
It works if I render the IPW new each time the slider is changed, but that's not what I want.
如果我每次更改滑块时渲染IPW都会有效,但这不是我想要的。
Is there a way to change the data of an IPW while the program is running without rendering a new Plane each time?
有没有办法在程序运行时更改IPW的数据,而不是每次都渲染新的平面?
I have written following code:
我写了以下代码:
import numpy as np
from mayavi import mlab
from matplotlib.scale import scale_factory
from traits.api import HasTraits, Range, Instance, Array, \
on_trait_change
from traitsui.api import View, Item, Group
from mayavi.core.pipeline_base import PipelineBase
from mayavi.core.ui.api import MayaviScene, SceneEditor, \
MlabSceneModel
class Modell(HasTraits):
p = Array
n = Range(0, 9, 5)
#p is a 4 dimensional Array p[10][20][20][20]
scene = Instance(MlabSceneModel, ())
plot = Instance(PipelineBase)
@on_trait_change('n,scene.activated')
def update_plot(self):
self.src = mlab.pipeline.scalar_field(self.p[self.n])
if self.plot is None:
self.plot = self.scene.mlab.pipeline.image_plane_widget(self.src,
plane_orientation='z_axes',
slice_index=10,
vmin=0, vmax=120)
else:
'''here should be the update function, i tried using mlab_source.set(self.src=self.src)
and all variations of expressions in the brackets but nothing worked.
I also searched for functions in IPW itself but didn't find something that could help me.'''
#The layout of the dialog created
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=400, width=400, show_label=False),
Group('_', 'n'),
resizable=True,
)
my_model = Modell(p=p)
my_model.configure_traits()
I tried updating the pipeline and updating the data with self.plot.update_pipeline() and self.plot.update_data() but this doesn't work either.
我尝试使用self.plot.update_pipeline()和self.plot.update_data()更新管道并更新数据,但这也不起作用。
1 个解决方案
#1
Ok I found the solution for my problem, the trick is to change the data directly through the pipeline. So in my code I just have to set the following command into the else segment:
好的,我找到了我的问题的解决方案,诀窍是直接通过管道更改数据。所以在我的代码中我只需要将以下命令设置到else段:
self.plot.parent.parent.scalar_data = self.p[self.n]
#1
Ok I found the solution for my problem, the trick is to change the data directly through the pipeline. So in my code I just have to set the following command into the else segment:
好的,我找到了我的问题的解决方案,诀窍是直接通过管道更改数据。所以在我的代码中我只需要将以下命令设置到else段:
self.plot.parent.parent.scalar_data = self.p[self.n]