Skip to content

Commit

Permalink
Update _Renderer [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeFavelier committed Dec 16, 2020
1 parent 4d9b63a commit dcaff44
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 153 deletions.
10 changes: 5 additions & 5 deletions mne/viz/_brain/_brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,10 @@ def setup_time_viewer(self, time_viewer=True, show_traces=True):

# show everything at the end
self.toggle_interface()
with self.ensure_minimum_sizes():
if self.window is not None:
with self.ensure_minimum_sizes():
self.show()
else:
self.show()

@safe_event
Expand Down Expand Up @@ -2266,10 +2269,7 @@ def close(self):
def show(self):
"""Display the window."""
if self.notebook:
from IPython import display
self.disp = self._renderer.plotter.show(use_ipyvtk=True,
return_viewer=True)
display.display(self.disp)
self.disp = self._renderer.plotter.show(use_ipyvtk=True)
else:
# Request rendering of the window
try:
Expand Down
149 changes: 1 addition & 148 deletions mne/viz/backends/_notebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
#
# License: Simplified BSD

import matplotlib.pyplot as plt
from contextlib import contextmanager
from ...fixes import nullcontext
from ._pyvista import _Renderer as _PyVistaRenderer
from ._pyvista import \
Expand All @@ -12,157 +10,12 @@

class _Renderer(_PyVistaRenderer):
def __init__(self, *args, **kwargs):
from IPython import get_ipython
ipython = get_ipython()
ipython.magic('matplotlib widget')
kwargs["notebook"] = True
super().__init__(*args, **kwargs)

def show(self):
self.disp = self.plotter.show(use_ipyvtk=True, return_viewer=True)
self.disp = self.plotter.show(use_ipyvtk=True)
return self.scene()


class _NotebookInteractor(object):
def __init__(self, renderer):
from IPython import display
from ipywidgets import HBox, VBox
self.dpi = 90
self.sliders = dict()
self.controllers = dict()
self.renderer = renderer
self.plotter = self.renderer.plotter
with self.disabled_interactivity():
self.fig, self.dh = self.screenshot()
self.configure_controllers()
controllers = VBox(list(self.controllers.values()))
layout = HBox([self.fig.canvas, controllers])
display.display(layout)

@contextmanager
def disabled_interactivity(self):
state = plt.isinteractive()
plt.ioff()
try:
yield
finally:
if state:
plt.ion()
else:
plt.ioff()

def screenshot(self):
width, height = self.renderer.figure.store['window_size']

fig = plt.figure()
fig.figsize = (width / self.dpi, height / self.dpi)
fig.dpi = self.dpi
fig.canvas.toolbar_visible = False
fig.canvas.header_visible = False
fig.canvas.resizable = False
fig.canvas.callbacks.callbacks.clear()
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

dh = ax.imshow(self.plotter.screenshot())
return fig, dh

def update(self):
self.plotter.render()
self.dh.set_data(self.plotter.screenshot())
self.fig.canvas.draw()

def configure_controllers(self):
from ipywidgets import (interactive, Label, VBox, FloatSlider,
IntSlider, Checkbox)
# continuous update
self.continuous_update_button = Checkbox(
value=False,
description='Continuous update',
disabled=False,
indent=False,
)
self.controllers["continuous_update"] = interactive(
self.set_continuous_update,
value=self.continuous_update_button
)
# subplot
number_of_plots = len(self.plotter.renderers)
if number_of_plots > 1:
self.sliders["subplot"] = IntSlider(
value=number_of_plots - 1,
min=0,
max=number_of_plots - 1,
step=1,
continuous_update=False
)
self.controllers["subplot"] = VBox([
Label(value='Select the subplot'),
interactive(
self.set_subplot,
index=self.sliders["subplot"],
)
])
# azimuth
default_azimuth = self.plotter.renderer._azimuth
self.sliders["azimuth"] = FloatSlider(
value=default_azimuth,
min=-180.,
max=180.,
step=10.,
continuous_update=False
)
# elevation
default_elevation = self.plotter.renderer._elevation
self.sliders["elevation"] = FloatSlider(
value=default_elevation,
min=-180.,
max=180.,
step=10.,
continuous_update=False
)
# distance
eps = 1e-5
default_distance = self.plotter.renderer._distance
self.sliders["distance"] = FloatSlider(
value=default_distance,
min=eps,
max=2. * default_distance - eps,
step=default_distance / 10.,
continuous_update=False
)
# camera
self.controllers["camera"] = VBox([
Label(value='Camera settings'),
interactive(
self.set_camera,
azimuth=self.sliders["azimuth"],
elevation=self.sliders["elevation"],
distance=self.sliders["distance"],
)
])

def set_camera(self, azimuth, elevation, distance):
focalpoint = self.plotter.camera.GetFocalPoint()
self.renderer.set_camera(azimuth, elevation,
distance, focalpoint)
self.update()

def set_subplot(self, index):
row, col = self.plotter.index_to_loc(index)
self.renderer.subplot(row, col)
figure = self.renderer.figure
default_azimuth = figure.plotter.renderer._azimuth
default_elevation = figure.plotter.renderer._elevation
default_distance = figure.plotter.renderer._distance
self.sliders["azimuth"].value = default_azimuth
self.sliders["elevation"].value = default_elevation
self.sliders["distance"].value = default_distance

def set_continuous_update(self, value):
for slider in self.sliders.values():
slider.continuous_update = value


_testing_context = nullcontext

0 comments on commit dcaff44

Please sign in to comment.