99 lines
3.2 KiB
Python
99 lines
3.2 KiB
Python
# Authors: The MNE-Python contributors.
|
|
# License: BSD-3-Clause
|
|
# Copyright the MNE-Python contributors.
|
|
|
|
import numpy as np
|
|
|
|
from ...utils import warn
|
|
from ..ui_events import link
|
|
|
|
|
|
class _LinkViewer:
|
|
"""Class to link multiple Brain objects."""
|
|
|
|
def __init__(self, brains, time=True, camera=False, colorbar=True, picking=False):
|
|
self.brains = brains
|
|
self.leader = self.brains[0] # select a brain as leader
|
|
|
|
# check time infos
|
|
times = [brain._times for brain in brains]
|
|
if time and not all(np.allclose(x, times[0]) for x in times):
|
|
warn("stc.times do not match, not linking time")
|
|
time = False
|
|
|
|
if camera:
|
|
self.link_cameras()
|
|
|
|
events_to_link = []
|
|
if time:
|
|
events_to_link.append("time_change")
|
|
if colorbar:
|
|
events_to_link.append("colormap_range")
|
|
|
|
for brain in brains[1:]:
|
|
link(self.leader, brain, include_events=events_to_link)
|
|
|
|
if picking:
|
|
|
|
def _func_add(*args, **kwargs):
|
|
for brain in self.brains:
|
|
brain._add_vertex_glyph2(*args, **kwargs)
|
|
brain.plotter.update()
|
|
|
|
def _func_remove(*args, **kwargs):
|
|
for brain in self.brains:
|
|
brain._remove_vertex_glyph2(*args, **kwargs)
|
|
|
|
# save initial picked points
|
|
initial_points = dict()
|
|
for hemi in ("lh", "rh"):
|
|
initial_points[hemi] = set()
|
|
for brain in self.brains:
|
|
initial_points[hemi] |= set(brain.picked_points[hemi])
|
|
|
|
# link the viewers
|
|
for brain in self.brains:
|
|
brain.clear_glyphs()
|
|
brain._add_vertex_glyph2 = brain._add_vertex_glyph
|
|
brain._add_vertex_glyph = _func_add
|
|
brain._remove_vertex_glyph2 = brain._remove_vertex_glyph
|
|
brain._remove_vertex_glyph = _func_remove
|
|
|
|
# link the initial points
|
|
for hemi in initial_points.keys():
|
|
if hemi in brain._layered_meshes:
|
|
mesh = brain._layered_meshes[hemi]._polydata
|
|
for vertex_id in initial_points[hemi]:
|
|
self.leader._add_vertex_glyph(hemi, mesh, vertex_id)
|
|
|
|
def set_fmin(self, value):
|
|
self.leader.update_lut(fmin=value)
|
|
|
|
def set_fmid(self, value):
|
|
self.leader.update_lut(fmid=value)
|
|
|
|
def set_fmax(self, value):
|
|
self.leader.update_lut(fmax=value)
|
|
|
|
def set_time_point(self, value):
|
|
self.leader.set_time_point(value)
|
|
|
|
def set_playback_speed(self, value):
|
|
self.leader.set_playback_speed(value)
|
|
|
|
def toggle_playback(self):
|
|
self.leader.toggle_playback()
|
|
|
|
def link_cameras(self):
|
|
from ..backends._pyvista import _add_camera_callback
|
|
|
|
def _update_camera(vtk_picker, event):
|
|
for brain in self.brains:
|
|
brain.plotter.update()
|
|
|
|
camera = self.leader.plotter.camera
|
|
_add_camera_callback(camera, _update_camera)
|
|
for brain in self.brains:
|
|
for renderer in brain.plotter.renderers:
|
|
renderer.camera = camera
|