2017-06-28 75 views
0

我試圖建立它利用MLAB iso_surface模塊的簡單編寫Mayavi腳本的應用程序。如何使用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() 

回答

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的。

+0

Thx爲快速響應Prabhu,您修改後的代碼適用於我。 我實際上是基於http://docs.enthought.com/mayavi/mayavi/building_applications.html提供的示例嘗試了我的代碼嘗試,但我現在看到下面的警告使用上面建議的方法。 – dreme