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
 |