2015-05-29 1 views
0

Я пытаюсь построить два виджета плоскости изображения в двух разных сценах в майави сразу. Но оба плана показаны в первой сцене. Кто-нибудь знает, как это исправить?Построение графика в двух разных сценах

Вот пример моего кода:

import numpy as np 
from mayavi import mlab 
from mayavi.mlab import axes, outline 
from traitsui.api import View, Item, Group, HGroup 
from mayavi.core.pipeline_base import PipelineBase 
from mayavi.core.ui.api import MayaviScene, SceneEditor, MlabSceneModel 

class myclass(): 
    p='somedata[20][20][20]' #I can't give you the data here because it's too big 
    scene = Instance(MlabSceneModel,())   
    sx = Instance(MlabSceneModel,()) 
    plot = Instance(PipelineBase) 

    def function(self): 
    self.src = mlab.pipeline.scalar_field(self.p) 
    self.plot2 = self.scene.mlab.pipeline.image_plane_widget(self.src,   
          plane_orientation='x_axes',    
          slice_index=0, 
          #vmin=0, vmax=140, 
          colormap='hot') 

    self.sx.scene.parallel_projection = True 
    side_src = self.plot.ipw._get_reslice_output() #gets the data for the 2d planes 
    self.ipw = self.sx.mlab.pipeline.image_plane_widget( #creates the 2d views 
          side_src, 
          plane_orientation='z_axes', 
          #vmin=self.data.min(), 
          #vmax=self.data.max(), 
          #figure=self.sx.mayavi_scene, 
          name='Cut view X', 
          colormap='hot', 
          ) 

    mlab.colorbar(title='Wert', orientation='vertical', nb_labels=5, label_fmt='%.3f')   #adds a colorbar at the left side of the screen 
    mlab.view(azimuth=50,elevation=50,distance=80,focalpoint=(10,15,10))  #defines the starting view of the camera 
    mlab.roll(110) 
    self.scene.scene_editor.background = (0, 0, 0) 
    view = View(HGroup(Item('scene', editor=SceneEditor(scene_class=MayaviScene), 
            height=400, width=500, show_label=False), 
         Item('sx',editor=SceneEditor(scene_class=MayaviScene), 
            height=400, width=500, show_label=False),), 
       resizable=True, 
       ) 

myclass() 

я не мог найти решение в Интернете, есть примеры с несколькими сценами, но я не могу понять, почему она работает там, а не в мой код. Любая помощь будет приятной.

При попытке использования figure kwarg в image_plane_widget, как этот

self.plot = mlab.pipeline.image_plane_widget(self.src,   
          plane_orientation='x_axes',    
          slice_index=0, 
          #vmin=0, vmax=140, 
          figure=self.sx, 
          colormap='hot') 

он возвращает следующее сообщение об ошибке:

TraitError: The 'figure' trait of an ImagePlaneWidgetFactory instance must be a Scene or None, but a value of was specified.

ответ

0

Чтобы указать сцену, направленную в вызовы трубопроводов включают figure kwarg и аналогичные, например mlab.pipeline.image_plane_widget(*args, figure=self.scene). В противном случае, если figure не указан, вызовы конвейера идут до mlab.gcf(), который обычно является последним созданным рисунком.

+0

Как вы, возможно, видели, у меня есть цифра kwarg в моем коде, но я отметил ее как комментарий, потому что она не работает с фигурой. – Singularity

+0

Это потому, что 'self.sx' не инициализируется. На самом деле ваш фрагмент кода вообще не имеет объектной модели (т. Е. 'Self' никогда не определяется). Я не внимательно смотрел на ваш код, но предположил, что вы это поняли. – aestrivex

+0

О, да, код normaly написан в функции с объявлением self – Singularity