Интерактивное обновление цвета в Mayavi, Python

Это мой первый пост на StackOverflow. Я пишу программу Mayavi Python. Может ли кто-нибудь сказать мне, как обновить/изменить цвет точки в интерактивном режиме? Например, в points3d() изменение цвета точки в реальном времени при интерактивном изменении ее положения. Пробовал что-то делать под @on_trait_change, но не получается. Цвет не может быть изменен. Ниже приведен мой код:

import mayavi
import mayavi.mlab
from numpy import arange, pi, cos, sin

from traits.api import HasTraits, Range, Instance, \
        on_trait_change
from traitsui.api import View, Item, HGroup

from mayavi.core.api import PipelineBase
from mayavi.core.ui.api import MayaviScene, SceneEditor, \
                MlabSceneModel

def luc_func(x, y, z):
    return x + y + z;

class Visualization(HasTraits):
    x1 = Range(1, 30, 5)
    z1 = Range(1, 30, 5)
    scene      = Instance(MlabSceneModel, ())
    def __init__(self):
        # Do not forget to call the parent's __init__
        HasTraits.__init__(self)
        z = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
        y = [1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5]
        x = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]
        self.plot = self.scene.mlab.points3d(x, y, z, luc_func, scale_mode = 'none')
        #self.plot2 = self.scene.mlab.points3d(z, x, y, color = (0, 0, 1))

    @on_trait_change('x1,z1')
    def update_plot(self):
        x = [1,2,3,4,self.x1,1,2,3,4,self.x1,1,2,3,4,self.x1,1,2,3,4,self.x1,1,2,3,4,self.x1]
        z = [1,1,1,1,self.z1,1,1,1,1,self.z1,1,1,1,1,self.z1,1,1,1,1,self.z1,1,1,1,1,self.z1]
        luc_func = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,self.z1]
        self.plot.mlab_source.reset(x = x, z = z, luc_func = luc_func)
        #self.plot2.mlab_source.set(y = y, z = z)


    # the layout of the dialog created
    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                    height=250, width=300, show_label=False),
                HGroup(
                        '_', 'x1', "z1",
                    ),
                )
visualization = Visualization()
visualization.configure_traits()

Спасибо за вашу помощь!


person Xinyan Wang    schedule 29.06.2015    source источник
comment
Привет, добро пожаловать в СО! Что значит, но не работает? Вы получаете сообщения об ошибках? Пожалуйста, опишите его более подробно.   -  person bish    schedule 29.06.2015
comment
Привет, Биш, спасибо за уведомление, я отредактирую свое описание позже! Ну, проблема может работать, но цвет не может быть изменен. то есть только позиции могут быть изменены   -  person Xinyan Wang    schedule 29.06.2015


Ответы (1)


Я заметил ошибку в интерактивности points3d, очень похожую на то, что вы здесь описываете. Я точно не знаю, каково происхождение этой ошибки, но я регулярно использую следующий обходной путь. Основная идея состоит в том, чтобы избегать mlab.points3d и вместо этого вызывать mlab.pipeline.glyph напрямую, например:

def virtual_points3d(coords, figure=None, scale_factor=None, color=None, 
    name=None):

    c = np.array(coords)
    source = mlab.pipeline.scalar_scatter( c[:,0], c[:,1], c[:,2],
        figure=figure)

    return mlab.pipeline.glyph( source, scale_mode='none', 
        scale_factor=scale_factor,
        mode='sphere', figure=figure, color=color, name=name)

Позже вы можете изменить цвета, обратившись напрямую к объекту vtk, а не к трейту mayavi, который не подключен должным образом:

glyph = virtual_points3d(coords)
glyph.mlab_source.dataset.point_data.scalars = new_values
person aestrivex    schedule 29.06.2015
comment
Привет aestrivex, спасибо за вашу помощь! Я изучу ваш код и попробую позже! - person Xinyan Wang; 29.06.2015