Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 51 additions & 19 deletions mne/viz/_brain/_brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,12 @@ def __init__(self, subject_id, hemi, surf, title=None,
bgcolor=background,
shape=shape,
fig=figure)

if _get_3d_backend() == "pyvista":
self.plotter = self._renderer.plotter
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that Brain is public we should probably make as many attributes as possible private, so _plotter is better here

self.window = self.plotter.app_window
self.window.signal_close.connect(self._clean)

for h in self._hemis:
# Initialize a Surface object as the geometry
geo = Surface(subject_id, h, surf, subjects_dir, offset,
Expand Down Expand Up @@ -308,7 +314,7 @@ def __init__(self, subject_id, hemi, surf, title=None,
self._hemi_meshes[h],
**kwargs,
)
del kwargs
del kwargs, mesh_data, actor, mesh
self._renderer.set_camera(**views_dicts[h][v])

self.interaction = interaction
Expand Down Expand Up @@ -375,13 +381,10 @@ def setup_time_viewer(self, time_viewer=True, show_traces=True):
self.slider_tube_color = (0.69803922, 0.70196078, 0.70980392)

# Direct access parameters:
self.plotter = self._renderer.plotter
self.main_menu = self.plotter.main_menu
self.window = self.plotter.app_window
self.tool_bar = self.window.addToolBar("toolbar")
self.status_bar = self.window.statusBar()
self.interactor = self.plotter.interactor
self.window.signal_close.connect(self._clean)

# Derived parameters:
self.playback_speed = self.default_playback_speed_value
Expand Down Expand Up @@ -424,24 +427,53 @@ def setup_time_viewer(self, time_viewer=True, show_traces=True):
@safe_event
def _clean(self):
# resolve the reference cycle
self.clear_points()
self._clear_callbacks()
self.actions.clear()
self.sliders.clear()
self.reps = None
self.geo.clear()
self._hemi_meshes.clear()
for h in self._hemis:
actor = self._hemi_actors[h]
if actor is not None:
mapper = actor.GetMapper()
mapper.SetInputData(None)
mapper.SetLookupTable(None)
actor.SetMapper(None)
self._hemi_actors.clear()
self._data.clear()

if self.time_viewer:
self.clear_points()
self._clear_callbacks()
self.actions.clear()
self.sliders.clear()
self.reps = None
if self.mpl_canvas is not None:
self.mpl_canvas.clear()
self.mpl_canvas = None
self.tool_bar = None
self.status_bar = None
self.interactor = None
self.time_actor = None
self.picked_renderer = None
for key in list(self.act_data_smooth.keys()):
self.act_data_smooth[key] = None

# vtkLightKit
for renderer in self.plotter.renderers:
renderer.RemoveAllLights()
self.plotter.lighting = None
# vtkXOpenGLRenderWindow
self.plotter._RenderWindow = None
# vtkGenericRenderWindowInteractor

class FakeIren():
def LeaveEvent(self):
pass

def SetEventInformation(self, *args, **kwargs):
pass
self.plotter._Iren = FakeIren()
self.plotter = None
self.main_menu = None
self.window = None
self.tool_bar = None
self.status_bar = None
self.interactor = None
if self.mpl_canvas is not None:
self.mpl_canvas.clear()
self.mpl_canvas = None
self.time_actor = None
self.picked_renderer = None
for key in list(self.act_data_smooth.keys()):
self.act_data_smooth[key] = None

@contextlib.contextmanager
def ensure_minimum_sizes(self):
Expand Down