1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
|
"""The Mayavi UI plugin
"""
# Author: Prabhu Ramachandran <prabhu [at] aero . iitb . ac . in>
# Copyright (c) 2008, Enthought, Inc.
# License: BSD Style.
# Standard library imports.
import logging
# Enthought library imports.
from traits.api import List, on_trait_change
from envisage.api import Plugin
from pyface.workbench.api import Perspective, PerspectiveItem
from traits.etsconfig.api import ETSConfig
logger = logging.getLogger()
# View IDs.
ENGINE_VIEW = 'mayavi.core.ui.engine_view.EngineView'
CURRENT_SELECTION_VIEW = 'mayavi.core.engine.Engine.current_selection'
SHELL_VIEW = 'envisage.plugins.python_shell_view'
LOGGER_VIEW = 'apptools.logger.plugin.view.logger_view.LoggerView'
###############################################################################
# `MayaviPerspective` class.
###############################################################################
class MayaviPerspective(Perspective):
""" A default perspective for Mayavi. """
# The perspective's name.
name = 'Mayavi'
# Should this perspective be enabled or not?
enabled = True
# Should the editor area be shown in this perspective?
show_editor_area = True
# The contents of the perspective.
contents = List()
def _contents_default(self):
contents = [
PerspectiveItem(id=ENGINE_VIEW, position='left'),
PerspectiveItem(id=CURRENT_SELECTION_VIEW, position='bottom',
relative_to=ENGINE_VIEW),
PerspectiveItem(id=SHELL_VIEW, position='bottom'),
]
show_logger = True
if ETSConfig.toolkit == 'wx':
# XXX: Bugware: avoid a crash in Wx with the logger
import wx
if wx.__version__.split('.')[:2] == ['2', '6']:
show_logger = False
if show_logger:
contents.append(PerspectiveItem(id=LOGGER_VIEW, position='with',
relative_to=SHELL_VIEW))
return contents
###############################################################################
# `MayaviUIPlugin` class.
###############################################################################
class MayaviUIPlugin(Plugin):
# Extension point Ids.
VIEWS = 'envisage.ui.workbench.views'
PERSPECTIVES = 'envisage.ui.workbench.perspectives'
PREFERENCES_PAGES = 'envisage.ui.workbench.preferences_pages'
ACTION_SETS = 'envisage.ui.workbench.action_sets'
BANNER = 'envisage.plugins.ipython_shell.banner'
# The plugins name.
name = 'Mayavi UI plugin'
# Our ID.
id = 'mayavi_ui'
###### Contributions to extension points made by this plugin ######
# Views.
views = List(contributes_to=VIEWS)
# Perspectives.
perspectives = List(contributes_to=PERSPECTIVES)
# Preferences pages.
preferences_pages = List(contributes_to=PREFERENCES_PAGES)
# Our action sets.
action_sets = List(contributes_to=ACTION_SETS)
# IPython banner
banner = List(contributes_to=BANNER)
def _views_default(self):
""" Trait initializer. """
return [self._engine_view_factory,
self._current_selection_view_factory]
def _perspectives_default(self):
""" Trait initializer. """
return [MayaviPerspective]
def _preferences_pages_default(self):
""" Trait initializer. """
from mayavi.preferences.mayavi_preferences_page import (
MayaviRootPreferencesPage, MayaviMlabPreferencesPage)
return [MayaviRootPreferencesPage, MayaviMlabPreferencesPage]
def _action_sets_default(self):
""" Trait initializer. """
from mayavi.plugins.mayavi_ui_action_set import (
MayaviUIActionSet
)
return [MayaviUIActionSet]
def _banner_default(self):
"""Trait initializer """
return ["""Welcome to Mayavi, this is the interactive IPython shell.
If this is your first time using Mayavi, take a quick look at the tutorial examples section of the user guide, accessible via the help menu.
To use Mayavi, you need to load your data in "data sources" and apply "visualization modules" to it.
"""]
######################################################################
# Private methods.
def _engine_view_factory(self, window, **traits):
""" Factory method for engine views. """
from pyface.workbench.traits_ui_view import \
TraitsUIView
from mayavi.core.ui.engine_view import \
EngineView
engine_view = EngineView(engine=self._get_engine(window))
tui_engine_view = TraitsUIView(obj=engine_view,
id=ENGINE_VIEW,
name='Mayavi',
window=window,
position='left',
**traits
)
return tui_engine_view
def _current_selection_view_factory(self, window, **traits):
""" Factory method for the current selection of the engine. """
from pyface.workbench.traits_ui_view import \
TraitsUIView
engine = self._get_engine(window)
tui_engine_view = TraitsUIView(obj=engine,
view='current_selection_view',
id=CURRENT_SELECTION_VIEW,
name='Mayavi object editor',
window=window,
position='bottom',
relative_to=ENGINE_VIEW,
**traits
)
return tui_engine_view
def _get_engine(self, window):
"""Return the Mayavi engine of the particular window."""
from mayavi.core.engine import Engine
return window.get_service(Engine)
def _get_script(self, window):
"""Return the `mayavi.plugins.script.Script` instance
of the window."""
from mayavi.plugins.script import Script
return window.get_service(Script)
######################################################################
# Trait handlers.
@on_trait_change('application.gui:started')
def _on_application_gui_started(self, obj, trait_name, old, new):
"""This is called when the application's GUI is started. The
method binds the `Script` and `Engine` instance on the
interpreter.
"""
# This is called when the application trait is set but we don't
# want to do anything at that point.
if trait_name != 'started' or not new:
return
# Get the script service.
app = self.application
window = app.workbench.active_window
script = self._get_script(window)
# Get a hold of the Python shell view.
id = SHELL_VIEW
py = window.get_view_by_id(id)
if py is None:
logger.warn('*'*80)
logger.warn("Can't find the Python shell view to bind variables")
return
# Bind the script and engine instances to names on the
# interpreter.
try:
py.bind('mayavi', script)
py.bind('engine', script.engine)
try:
# The following will fail under Qt, as it needs the Pyface
# Tree that has not been ported from Wx yet.
from apptools.naming.ui.api import explore
py.bind('explore', explore)
except ImportError:
pass
except AttributeError as msg:
# This can happen when the shell is not visible.
# FIXME: fix this when the shell plugin is improved.
logger.warn(msg)
logger.warn("Can't find the Python shell to bind variables")
|