def left_click_picker_callback(obj, ev): ''' Get the value of the clicked voxel and show it in the panel.''' event_pos = iren.GetEventPosition() obj.picker.Pick(event_pos[0], event_pos[1], 0, renderer) i, j, k = obj.picker.GetPointIJK() res = HORIMEM.slicer_vol[i, j, k] # generate figure cc_vox = data[i, j, k] print(cc_vox) plt.plot([cc_vox]) plt.savefig('test.png') icon_fnames = [('square', 'test.png'), ('square1', 'test.png')] # connect to button button = ui.Button2D(icon_fnames, size=(20, 30)) panel.add_element(button, coords=(0., 0.)) # make button visible try: message = '%.3f' % res except TypeError: message = '%.3f %.3f %.3f' % (res[0], res[1], res[2]) picker_label.message = '({}, {}, {})'.format(str(i), str(j), str(k)) \ + ' ' + message
def main(): # reads the tractography data in trk format # extracts streamlines and the file header. Streamlines should be in the same coordinate system as the FA map (used later). # input example: '/home/Example_data/tracts.trk' tractography_file = input( "Please, specify the file with tracts that you would like to analyse. File should be in the trk format. " ) streams, hdr = load_trk(tractography_file) # for old DIPY version # sft = load_trk(tractography_file, tractography_file) # streams = sft.streamlines streams_array = np.asarray(streams) print('imported tractography data:' + tractography_file) # load T1fs_conform image that operates in the same coordinates as simnibs except for the fact the center of mesh # is located at the image center # T1fs_conform image should be generated in advance during the head meshing procedure # input example: fname_T1='/home/Example_data/T1fs_conform.nii.gz' fname_T1 = input( "Please, specify the T1fs_conform image that has been generated during head meshing procedure. " ) data_T1, affine_T1 = load_nifti(fname_T1) # load FA image in the same coordinates as tracts # input example:fname_FA='/home/Example_data/DTI_FA.nii' fname_FA = input("Please, specify the FA image. ") data_FA, affine_FA = load_nifti(fname_FA) print('loaded T1fs_conform.nii and FA images') # specify the head mesh file that is used later in simnibs to simulate induced electric field # input example:'/home/Example_data/SUBJECT_MESH.msh' global mesh_path mesh_path = input("Please, specify the head mesh file. ") last_slach = max([i for i, ltr in enumerate(mesh_path) if ltr == '/']) + 1 global subject_name subject_name = mesh_path[last_slach:-4] # specify the directory where you would like to save your simulation results # input example:'/home/Example_data/Output' global out_dir out_dir = input( "Please, specify the directory where you would like to save your simulation results. " ) out_dir = out_dir + '/simulation_at_pos_' # Co-registration of T1fs_conform and FA images. Performed in 4 steps. # Step 1. Calculation of the center of mass transform. Used later as starting transform. c_of_mass = transform_centers_of_mass(data_T1, affine_T1, data_FA, affine_FA) print('calculated c_of_mass transformation') # Step 2. Calculation of a 3D translation transform. Used in the next step as starting transform. nbins = 32 sampling_prop = None metric = MutualInformationMetric(nbins, sampling_prop) level_iters = [10000, 1000, 100] sigmas = [3.0, 1.0, 0.0] factors = [4, 2, 1] affreg = AffineRegistration(metric=metric, level_iters=level_iters, sigmas=sigmas, factors=factors) transform = TranslationTransform3D() params0 = None starting_affine = c_of_mass.affine translation = affreg.optimize(data_T1, data_FA, transform, params0, affine_T1, affine_FA, starting_affine=starting_affine) print('calculated 3D translation transform') # Step 3. Calculation of a Rigid 3D transform. Used in the next step as starting transform transform = RigidTransform3D() params0 = None starting_affine = translation.affine rigid = affreg.optimize(data_T1, data_FA, transform, params0, affine_T1, affine_FA, starting_affine=starting_affine) print('calculated Rigid 3D transform') # Step 4. Calculation of an affine transform. Used for co-registration of T1 and FA images. transform = AffineTransform3D() params0 = None starting_affine = rigid.affine affine = affreg.optimize(data_T1, data_FA, transform, params0, affine_T1, affine_FA, starting_affine=starting_affine) print('calculated Affine 3D transform') identity = np.eye(4) inv_affine_FA = np.linalg.inv(affine_FA) inv_affine_T1 = np.linalg.inv(affine_T1) inv_affine = np.linalg.inv(affine.affine) # transforming streamlines to FA space new_streams_FA = streamline.transform_streamlines(streams, inv_affine_FA) new_streams_FA_array = np.asarray(new_streams_FA) T1_to_FA = np.dot(inv_affine_FA, np.dot(affine.affine, affine_T1)) FA_to_T1 = np.linalg.inv(T1_to_FA) # transforming streamlines from FA to T1 space new_streams_T1 = streamline.transform_streamlines(new_streams_FA, FA_to_T1) global new_streams_T1_array new_streams_T1_array = np.asarray(new_streams_T1) # calculating amline derivatives along the streamlines to get the local orientation of the streamlines global streams_array_derivative streams_array_derivative = copy.deepcopy(new_streams_T1_array) print('calculating amline derivatives') for stream in range(len(new_streams_T1_array)): my_steam = new_streams_T1_array[stream] for t in range(len(my_steam[:, 0])): streams_array_derivative[stream][t, 0] = my_deriv(t, my_steam[:, 0]) streams_array_derivative[stream][t, 1] = my_deriv(t, my_steam[:, 1]) streams_array_derivative[stream][t, 2] = my_deriv(t, my_steam[:, 2]) deriv_norm = np.linalg.norm(streams_array_derivative[stream][t, :]) streams_array_derivative[stream][ t, :] = streams_array_derivative[stream][t, :] / deriv_norm # to create a torus representing a coil in an interactive window torus = vtk.vtkParametricTorus() torus.SetRingRadius(5) torus.SetCrossSectionRadius(2) torusSource = vtk.vtkParametricFunctionSource() torusSource.SetParametricFunction(torus) torusSource.SetScalarModeToPhase() torusMapper = vtk.vtkPolyDataMapper() torusMapper.SetInputConnection(torusSource.GetOutputPort()) torusMapper.SetScalarRange(0, 360) torusActor = vtk.vtkActor() torusActor.SetMapper(torusMapper) torus_pos_x = 100 torus_pos_y = 129 torus_pos_z = 211 torusActor.SetPosition(torus_pos_x, torus_pos_y, torus_pos_z) list_streams_T1 = list(new_streams_T1) # adding one fictive bundle of length 1 with coordinates [0,0,0] to avoid some bugs with actor.line during visualization list_streams_T1.append(np.array([0, 0, 0])) global bundle_native bundle_native = list_streams_T1 # generating a list of colors to visualize later the stimualtion effects effect_max = 0.100 effect_min = -0.100 global colors colors = [ np.random.rand(*current_streamline.shape) for current_streamline in bundle_native ] for my_streamline in range(len(bundle_native) - 1): my_stream = copy.deepcopy(bundle_native[my_streamline]) for point in range(len(my_stream)): colors[my_streamline][point] = vtkplotter.colors.colorMap( (effect_min + effect_max) / 2, name='jet', vmin=effect_min, vmax=effect_max) colors[my_streamline + 1] = vtkplotter.colors.colorMap(effect_min, name='jet', vmin=effect_min, vmax=effect_max) # Vizualization of fibers over T1 # i_coord = 0 # j_coord = 0 # k_coord = 0 # global number_of_stimulations number_of_stimulations = 0 actor_line_list = [] scene = window.Scene() scene.clear() scene.background((0.5, 0.5, 0.5)) world_coords = False shape = data_T1.shape lut = actor.colormap_lookup_table(scale_range=(effect_min, effect_max), hue_range=(0.4, 1.), saturation_range=(1, 1.)) # # the lines below is for a non-interactive demonstration run only. # # they should remain commented unless you set "interactive" to False # lut, colors = change_TMS_effects(torus_pos_x, torus_pos_y, torus_pos_z) # bar = actor.scalar_bar(lut) # bar.SetTitle("TMS effect") # bar.SetHeight(0.3) # bar.SetWidth(0.10) # bar.SetPosition(0.85, 0.3) # scene.add(bar) actor_line_list.append( actor.line(bundle_native, colors, linewidth=5, fake_tube=True, lookup_colormap=lut)) if not world_coords: image_actor_z = actor.slicer(data_T1, identity) else: image_actor_z = actor.slicer(data_T1, identity) slicer_opacity = 0.6 image_actor_z.opacity(slicer_opacity) image_actor_x = image_actor_z.copy() x_midpoint = int(np.round(shape[0] / 2)) image_actor_x.display_extent(x_midpoint, x_midpoint, 0, shape[1] - 1, 0, shape[2] - 1) image_actor_y = image_actor_z.copy() y_midpoint = int(np.round(shape[1] / 2)) image_actor_y.display_extent(0, shape[0] - 1, y_midpoint, y_midpoint, 0, shape[2] - 1) """ Connect the actors with the scene. """ scene.add(actor_line_list[0]) scene.add(image_actor_z) scene.add(image_actor_x) scene.add(image_actor_y) show_m = window.ShowManager(scene, size=(1200, 900)) show_m.initialize() """ Create sliders to move the slices and change their opacity. """ line_slider_z = ui.LineSlider2D(min_value=0, max_value=shape[2] - 1, initial_value=shape[2] / 2, text_template="{value:.0f}", length=140) line_slider_x = ui.LineSlider2D(min_value=0, max_value=shape[0] - 1, initial_value=shape[0] / 2, text_template="{value:.0f}", length=140) line_slider_y = ui.LineSlider2D(min_value=0, max_value=shape[1] - 1, initial_value=shape[1] / 2, text_template="{value:.0f}", length=140) opacity_slider = ui.LineSlider2D(min_value=0.0, max_value=1.0, initial_value=slicer_opacity, length=140) """ Сallbacks for the sliders. """ def change_slice_z(slider): z = int(np.round(slider.value)) image_actor_z.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) def change_slice_x(slider): x = int(np.round(slider.value)) image_actor_x.display_extent(x, x, 0, shape[1] - 1, 0, shape[2] - 1) def change_slice_y(slider): y = int(np.round(slider.value)) image_actor_y.display_extent(0, shape[0] - 1, y, y, 0, shape[2] - 1) def change_opacity(slider): slicer_opacity = slider.value image_actor_z.opacity(slicer_opacity) image_actor_x.opacity(slicer_opacity) image_actor_y.opacity(slicer_opacity) line_slider_z.on_change = change_slice_z line_slider_x.on_change = change_slice_x line_slider_y.on_change = change_slice_y opacity_slider.on_change = change_opacity """ Сreate text labels to identify the sliders. """ def build_label(text): label = ui.TextBlock2D() label.message = text label.font_size = 18 label.font_family = 'Arial' label.justification = 'left' label.bold = False label.italic = False label.shadow = False label.background = (0, 0, 0) label.color = (1, 1, 1) return label line_slider_label_z = build_label(text="Z Slice") line_slider_label_x = build_label(text="X Slice") line_slider_label_y = build_label(text="Y Slice") opacity_slider_label = build_label(text="Opacity") """ Create a ``panel`` to contain the sliders and labels. """ panel = ui.Panel2D(size=(300, 200), color=(1, 1, 1), opacity=0.1, align="right") panel.center = (1030, 120) panel.add_element(line_slider_label_x, (0.1, 0.75)) panel.add_element(line_slider_x, (0.38, 0.75)) panel.add_element(line_slider_label_y, (0.1, 0.55)) panel.add_element(line_slider_y, (0.38, 0.55)) panel.add_element(line_slider_label_z, (0.1, 0.35)) panel.add_element(line_slider_z, (0.38, 0.35)) panel.add_element(opacity_slider_label, (0.1, 0.15)) panel.add_element(opacity_slider, (0.38, 0.15)) scene.add(panel) """ Create a ``panel`` to show the value of a picked voxel. """ label_position = ui.TextBlock2D(text='Position:') label_value = ui.TextBlock2D(text='Value:') result_position = ui.TextBlock2D(text='') result_value = ui.TextBlock2D(text='') text2 = ui.TextBlock2D(text='Calculate') panel_picking = ui.Panel2D(size=(250, 125), color=(1, 1, 1), opacity=0.1, align="left") panel_picking.center = (200, 120) panel_picking.add_element(label_position, (0.1, 0.75)) panel_picking.add_element(label_value, (0.1, 0.45)) panel_picking.add_element(result_position, (0.45, 0.75)) panel_picking.add_element(result_value, (0.45, 0.45)) panel_picking.add_element(text2, (0.1, 0.15)) icon_files = [] icon_files.append(('left', read_viz_icons(fname='circle-left.png'))) button_example = ui.Button2D(icon_fnames=icon_files, size=(100, 30)) panel_picking.add_element(button_example, (0.5, 0.1)) def change_text_callback(i_ren, obj, button): text2.message = str(i_coord) + ' ' + str(j_coord) + ' ' + str(k_coord) torusActor.SetPosition(i_coord, j_coord, k_coord) print(i_coord, j_coord, k_coord) lut, colors = change_TMS_effects(i_coord, j_coord, k_coord) scene.rm(actor_line_list[0]) actor_line_list.append( actor.line(bundle_native, colors, linewidth=5, fake_tube=True, lookup_colormap=lut)) scene.add(actor_line_list[1]) nonlocal number_of_stimulations global bar if number_of_stimulations > 0: scene.rm(bar) else: number_of_stimulations = number_of_stimulations + 1 bar = actor.scalar_bar(lut) bar.SetTitle("TMS effect") bar.SetHeight(0.3) bar.SetWidth(0.10) # the width is set first bar.SetPosition(0.85, 0.3) scene.add(bar) actor_line_list.pop(0) i_ren.force_render() button_example.on_left_mouse_button_clicked = change_text_callback scene.add(panel_picking) scene.add(torusActor) def left_click_callback(obj, ev): """Get the value of the clicked voxel and show it in the panel.""" event_pos = show_m.iren.GetEventPosition() obj.picker.Pick(event_pos[0], event_pos[1], 0, scene) global i_coord, j_coord, k_coord i_coord, j_coord, k_coord = obj.picker.GetPointIJK() print(i_coord, j_coord, k_coord) result_position.message = '({}, {}, {})'.format( str(i_coord), str(j_coord), str(k_coord)) result_value.message = '%.8f' % data_T1[i_coord, j_coord, k_coord] torusActor.SetPosition(i_coord, j_coord, k_coord) image_actor_z.AddObserver('LeftButtonPressEvent', left_click_callback, 1.0) global size size = scene.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): size_old = size size = obj.GetSize() size_change = [size[0] - size_old[0], 0] panel.re_align(size_change) show_m.initialize() """ Set the following variable to ``True`` to interact with the datasets in 3D. """ interactive = True scene.zoom(2.0) scene.reset_clipping_range() scene.set_camera(position=(-642.07, 495.40, 148.49), focal_point=(127.50, 127.50, 127.50), view_up=(0.02, -0.01, 1.00)) if interactive: show_m.add_window_callback(win_callback) show_m.render() show_m.start() else: window.record(scene, out_path=out_dir + '/bundles_and_effects.png', size=(1200, 900), reset_camera=True)
def test_ui_button_panel(recording=False): filename = "test_ui_button_panel" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".pkl") # Rectangle rectangle_test = ui.Rectangle2D(size=(10, 10)) another_rectangle_test = ui.Rectangle2D(size=(1, 1)) # Button fetch_viz_icons() icon_files = [] icon_files.append(('stop', read_viz_icons(fname='stop2.png'))) icon_files.append(('play', read_viz_icons(fname='play3.png'))) button_test = ui.Button2D(icon_fnames=icon_files) button_test.center = (20, 20) def make_invisible(i_ren, obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.set_visibility(False) i_ren.force_render() i_ren.event.abort() def modify_button_callback(i_ren, obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.next_icon() i_ren.force_render() button_test.on_right_mouse_button_pressed = make_invisible button_test.on_left_mouse_button_pressed = modify_button_callback button_test.scale((2, 2)) button_color = button_test.color button_test.color = button_color # TextBlock text_block_test = ui.TextBlock2D() text_block_test.message = 'TextBlock' text_block_test.color = (0, 0, 0) # Panel panel = ui.Panel2D(size=(300, 150), position=(290, 15), color=(1, 1, 1), align="right") panel.add_element(rectangle_test, (290, 135)) panel.add_element(button_test, (0.1, 0.1)) panel.add_element(text_block_test, (0.7, 0.7)) npt.assert_raises(ValueError, panel.add_element, another_rectangle_test, (10., 0.5)) npt.assert_raises(ValueError, panel.add_element, another_rectangle_test, (-0.5, 0.5)) # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(button_test) event_counter.monitor(panel.background) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="DIPY Button") show_manager.ren.add(panel) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)
""" fetch_viz_icons() """ Add the icon filenames to a dict. """ icon_files = [('stop', read_viz_icons(fname='stop2.png')), ('play', read_viz_icons(fname='play3.png')), ('plus', read_viz_icons(fname='plus.png')), ('cross', read_viz_icons(fname='cross.png'))] """ Create a button through our API. """ button_example = ui.Button2D(icon_fnames=icon_files) """ We now add some click listeners. """ def left_mouse_button_click(i_ren, obj, button): print("Left Button Clicked") def left_mouse_button_drag(i_ren, obj, button): print("Left Button Dragged") button_example.on_left_mouse_button_drag = left_mouse_button_drag button_example.on_left_mouse_button_pressed = left_mouse_button_click
def slicer_panel(renderer, iren, data=None, affine=None, world_coords=False, pam=None, mask=None): """ Slicer panel with slicer included Parameters ---------- renderer : Renderer iren : Interactor data : 3d ndarray affine : 4x4 ndarray world_coords : bool If True then the affine is applied. peaks : PeaksAndMetrics Default None Returns ------- panel : Panel """ orig_shape = data.shape print('Original shape', orig_shape) ndim = data.ndim tmp = data if ndim == 4: if orig_shape[-1] > 3: tmp = data[..., 0] orig_shape = orig_shape[:3] value_range = np.percentile(data[..., 0], q=[2, 98]) if orig_shape[-1] == 3: value_range = (0, 1.) HORIMEM.slicer_rgb = True if ndim == 3: value_range = np.percentile(tmp, q=[2, 98]) if not world_coords: affine = np.eye(4) image_actor_z = actor.slicer(tmp, affine=affine, value_range=value_range, interpolation='nearest', picking_tol=0.025) tmp_new = image_actor_z.resliced_array() if len(data.shape) == 4: if data.shape[-1] == 3: print('Resized to RAS shape ', tmp_new.shape) else: print('Resized to RAS shape ', tmp_new.shape + (data.shape[-1], )) else: print('Resized to RAS shape ', tmp_new.shape) shape = tmp_new.shape if pam is not None: peaks_actor_z = actor.peak_slicer(pam.peak_dirs, None, mask=mask, affine=affine, colors=None) slicer_opacity = 1. image_actor_z.opacity(slicer_opacity) image_actor_x = image_actor_z.copy() x_midpoint = int(np.round(shape[0] / 2)) image_actor_x.display_extent(x_midpoint, x_midpoint, 0, shape[1] - 1, 0, shape[2] - 1) image_actor_y = image_actor_z.copy() y_midpoint = int(np.round(shape[1] / 2)) image_actor_y.display_extent(0, shape[0] - 1, y_midpoint, y_midpoint, 0, shape[2] - 1) renderer.add(image_actor_z) renderer.add(image_actor_x) renderer.add(image_actor_y) if pam is not None: renderer.add(peaks_actor_z) line_slider_z = ui.LineSlider2D(min_value=0, max_value=shape[2] - 1, initial_value=shape[2] / 2, text_template="{value:.0f}", length=140) _color_slider(line_slider_z) button = ui.Button2D(icon_fnames, size=(20, 30)) def change_slice_z(slider): z = int(np.round(slider.value)) HORIMEM.slicer_curr_actor_z.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) if pam is not None: HORIMEM.slicer_peaks_actor_z.display_extent( 0, shape[0] - 1, 0, shape[1] - 1, z, z) HORIMEM.slicer_curr_z = z line_slider_x = ui.LineSlider2D(min_value=0, max_value=shape[0] - 1, initial_value=shape[0] / 2, text_template="{value:.0f}", length=140) _color_slider(line_slider_x) def change_slice_x(slider): x = int(np.round(slider.value)) HORIMEM.slicer_curr_actor_x.display_extent(x, x, 0, shape[1] - 1, 0, shape[2] - 1) HORIMEM.slicer_curr_x = x HORIMEM.window_timer_cnt += 100 line_slider_y = ui.LineSlider2D(min_value=0, max_value=shape[1] - 1, initial_value=shape[1] / 2, text_template="{value:.0f}", length=140) _color_slider(line_slider_y) def change_slice_y(slider): y = int(np.round(slider.value)) HORIMEM.slicer_curr_actor_y.display_extent(0, shape[0] - 1, y, y, 0, shape[2] - 1) HORIMEM.slicer_curr_y = y double_slider = ui.LineDoubleSlider2D(length=140, initial_values=value_range, min_value=tmp.min(), max_value=tmp.max(), shape='square') _color_dslider(double_slider) def apply_colormap(r1, r2): if HORIMEM.slicer_rgb: return if HORIMEM.slicer_colormap == 'disting': # use distinguishable colors rgb = colormap.distinguishable_colormap(nb_colors=256) rgb = np.asarray(rgb) else: # use matplotlib colormaps rgb = colormap.create_colormap(np.linspace(r1, r2, 256), name=HORIMEM.slicer_colormap, auto=True) N = rgb.shape[0] lut = colormap.vtk.vtkLookupTable() lut.SetNumberOfTableValues(N) lut.SetRange(r1, r2) for i in range(N): r, g, b = rgb[i] lut.SetTableValue(i, r, g, b) lut.SetRampToLinear() lut.Build() HORIMEM.slicer_curr_actor_z.output.SetLookupTable(lut) HORIMEM.slicer_curr_actor_z.output.Update() def on_change_ds(slider): values = slider._values r1, r2 = values apply_colormap(r1, r2) double_slider.on_change = on_change_ds opacity_slider = ui.LineSlider2D(min_value=0.0, max_value=1.0, initial_value=slicer_opacity, length=140, text_template="{ratio:.0%}") _color_slider(opacity_slider) def change_opacity(slider): slicer_opacity = slider.value HORIMEM.slicer_curr_actor_x.opacity(slicer_opacity) HORIMEM.slicer_curr_actor_y.opacity(slicer_opacity) HORIMEM.slicer_curr_actor_z.opacity(slicer_opacity) volume_slider = ui.LineSlider2D(min_value=0, max_value=data.shape[-1] - 1, initial_value=0, length=140, text_template="{value:.0f}", shape='square') _color_slider(volume_slider) def change_volume(istyle, obj, slider): vol_idx = int(np.round(slider.value)) HORIMEM.slicer_vol_idx = vol_idx renderer.rm(HORIMEM.slicer_curr_actor_x) renderer.rm(HORIMEM.slicer_curr_actor_y) renderer.rm(HORIMEM.slicer_curr_actor_z) tmp = data[..., vol_idx] image_actor_z = actor.slicer(tmp, affine=affine, value_range=value_range, interpolation='nearest', picking_tol=0.025) tmp_new = image_actor_z.resliced_array() HORIMEM.slicer_vol = tmp_new z = HORIMEM.slicer_curr_z image_actor_z.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) HORIMEM.slicer_curr_actor_z = image_actor_z HORIMEM.slicer_curr_actor_x = image_actor_z.copy() if pam is not None: HORIMEM.slicer_peaks_actor_z = peaks_actor_z x = HORIMEM.slicer_curr_x HORIMEM.slicer_curr_actor_x.display_extent(x, x, 0, shape[1] - 1, 0, shape[2] - 1) HORIMEM.slicer_curr_actor_y = image_actor_z.copy() y = HORIMEM.slicer_curr_y HORIMEM.slicer_curr_actor_y.display_extent(0, shape[0] - 1, y, y, 0, shape[2] - 1) HORIMEM.slicer_curr_actor_z.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) HORIMEM.slicer_curr_actor_x.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) HORIMEM.slicer_curr_actor_y.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) renderer.add(HORIMEM.slicer_curr_actor_z) renderer.add(HORIMEM.slicer_curr_actor_x) renderer.add(HORIMEM.slicer_curr_actor_y) if pam is not None: renderer.add(HORIMEM.slicer_peaks_actor_z) r1, r2 = double_slider._values apply_colormap(r1, r2) istyle.force_render() def left_click_picker_callback(obj, ev): ''' Get the value of the clicked voxel and show it in the panel.''' event_pos = iren.GetEventPosition() obj.picker.Pick(event_pos[0], event_pos[1], 0, renderer) i, j, k = obj.picker.GetPointIJK() res = HORIMEM.slicer_vol[i, j, k] # generate figure cc_vox = data[i, j, k] print(cc_vox) plt.plot([cc_vox]) plt.savefig('test.png') icon_fnames = [('square', 'test.png'), ('square1', 'test.png')] # connect to button button = ui.Button2D(icon_fnames, size=(20, 30)) panel.add_element(button, coords=(0., 0.)) # make button visible try: message = '%.3f' % res except TypeError: message = '%.3f %.3f %.3f' % (res[0], res[1], res[2]) picker_label.message = '({}, {}, {})'.format(str(i), str(j), str(k)) \ + ' ' + message HORIMEM.slicer_vol_idx = 0 HORIMEM.slicer_vol = tmp_new HORIMEM.slicer_curr_actor_x = image_actor_x HORIMEM.slicer_curr_actor_y = image_actor_y HORIMEM.slicer_curr_actor_z = image_actor_z if pam is not None: # change_volume.peaks_actor_z = peaks_actor_z HORIMEM.slicer_peaks_actor_z = peaks_actor_z HORIMEM.slicer_curr_actor_x.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) HORIMEM.slicer_curr_actor_y.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) HORIMEM.slicer_curr_actor_z.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) if pam is not None: HORIMEM.slicer_peaks_actor_z.AddObserver('LeftButtonPressEvent', left_click_picker_callback, 1.0) HORIMEM.slicer_curr_x = int(np.round(shape[0] / 2)) HORIMEM.slicer_curr_y = int(np.round(shape[1] / 2)) HORIMEM.slicer_curr_z = int(np.round(shape[2] / 2)) line_slider_x.on_change = change_slice_x line_slider_y.on_change = change_slice_y line_slider_z.on_change = change_slice_z double_slider.on_change = on_change_ds opacity_slider.on_change = change_opacity volume_slider.handle_events(volume_slider.handle.actor) volume_slider.on_left_mouse_button_released = change_volume # volume_slider.on_right_mouse_button_released = change_volume2 line_slider_label_x = build_label(text="X Slice") line_slider_label_x.visibility = True x_counter = itertools.count() def label_callback_x(obj, event): line_slider_label_x.visibility = not line_slider_label_x.visibility line_slider_x.set_visibility(line_slider_label_x.visibility) cnt = next(x_counter) if line_slider_label_x.visibility and cnt > 0: renderer.add(HORIMEM.slicer_curr_actor_x) else: renderer.rm(HORIMEM.slicer_curr_actor_x) iren.Render() line_slider_label_x.actor.AddObserver('LeftButtonPressEvent', label_callback_x, 1.0) line_slider_label_y = build_label(text="Y Slice") line_slider_label_y.visibility = True y_counter = itertools.count() def label_callback_y(obj, event): line_slider_label_y.visibility = not line_slider_label_y.visibility line_slider_y.set_visibility(line_slider_label_y.visibility) cnt = next(y_counter) if line_slider_label_y.visibility and cnt > 0: renderer.add(HORIMEM.slicer_curr_actor_y) else: renderer.rm(HORIMEM.slicer_curr_actor_y) iren.Render() line_slider_label_y.actor.AddObserver('LeftButtonPressEvent', label_callback_y, 1.0) line_slider_label_z = build_label(text="Z Slice") line_slider_label_z.visibility = True z_counter = itertools.count() def label_callback_z(obj, event): line_slider_label_z.visibility = not line_slider_label_z.visibility line_slider_z.set_visibility(line_slider_label_z.visibility) cnt = next(z_counter) if line_slider_label_z.visibility and cnt > 0: renderer.add(HORIMEM.slicer_curr_actor_z) else: renderer.rm(HORIMEM.slicer_curr_actor_z) iren.Render() line_slider_label_z.actor.AddObserver('LeftButtonPressEvent', label_callback_z, 1.0) opacity_slider_label = build_label(text="Opacity") volume_slider_label = build_label(text="Volume") picker_label = build_label(text='') double_slider_label = build_label(text='Colormap') def label_colormap_callback(obj, event): if HORIMEM.slicer_colormap_cnt == len(HORIMEM.slicer_colormaps) - 1: HORIMEM.slicer_colormap_cnt = 0 else: HORIMEM.slicer_colormap_cnt += 1 cnt = HORIMEM.slicer_colormap_cnt HORIMEM.slicer_colormap = HORIMEM.slicer_colormaps[cnt] double_slider_label.message = HORIMEM.slicer_colormap values = double_slider._values r1, r2 = values apply_colormap(r1, r2) iren.Render() double_slider_label.actor.AddObserver('LeftButtonPressEvent', label_colormap_callback, 1.0) if data.ndim == 4: panel_size = (400, 400 + 100) if data.ndim == 3: panel_size = (400, 300 + 100) panel = ui.Panel2D(size=panel_size, position=(850, 110), color=(1, 1, 1), opacity=0.1, align="right") ys = np.linspace(0, 1, 10) panel.add_element(line_slider_z, coords=(0.4, ys[1])) panel.add_element(line_slider_y, coords=(0.4, ys[2])) panel.add_element(line_slider_x, coords=(0.4, ys[3])) panel.add_element(opacity_slider, coords=(0.4, ys[4])) panel.add_element(double_slider, coords=(0.4, (ys[7] + ys[8]) / 2.)) if data.ndim == 4: if data.shape[-1] > 3: panel.add_element(volume_slider, coords=(0.4, ys[6])) panel.add_element(line_slider_label_z, coords=(0.1, ys[1])) panel.add_element(line_slider_label_y, coords=(0.1, ys[2])) panel.add_element(line_slider_label_x, coords=(0.1, ys[3])) panel.add_element(opacity_slider_label, coords=(0.1, ys[4])) panel.add_element(double_slider_label, coords=(0.1, (ys[7] + ys[8]) / 2.)) if data.ndim == 4: if data.shape[-1] > 3: panel.add_element(volume_slider_label, coords=(0.1, ys[6])) panel.add_element(picker_label, coords=(0.2, ys[5])) renderer.add(panel) # initialize colormap r1, r2 = value_range apply_colormap(r1, r2) return panel
Then we'll make two text labels and place them on the panel. Note that we specifiy the position with integer numbers of pixels. """ text = ui.TextBlock2D(text='Click me') text2 = ui.TextBlock2D(text='Me too') panel.add_element(text, (50, 100)) panel.add_element(text2, (180, 100)) """ Then we'll create two buttons and add them to the panel. Note that here we specify the positions with floats. In this case, these are percentages of the panel size. """ button_example = ui.Button2D(icon_fnames=[('square', read_viz_icons(fname='stop2.png'))]) icon_files = [] icon_files.append(('down', read_viz_icons(fname='circle-down.png'))) icon_files.append(('left', read_viz_icons(fname='circle-left.png'))) icon_files.append(('up', read_viz_icons(fname='circle-up.png'))) icon_files.append(('right', read_viz_icons(fname='circle-right.png'))) second_button_example = ui.Button2D(icon_fnames=icon_files) panel.add_element(button_example, (0.25, 0.33)) panel.add_element(second_button_example, (0.66, 0.33)) """ We can add a callback to each button to perform some action. """
def test_ui_button_panel(recording=False): filename = "test_ui_button_panel" recording_filename = pjoin(DATA_DIR, filename + ".log.gz") expected_events_counts_filename = pjoin(DATA_DIR, filename + ".pkl") # Rectangle rectangle_test = ui.Rectangle2D(size=(10, 10)) rectangle_test.get_actors() another_rectangle_test = ui.Rectangle2D(size=(1, 1)) # /Rectangle # Button fetch_viz_icons() icon_files = dict() icon_files['stop'] = read_viz_icons(fname='stop2.png') icon_files['play'] = read_viz_icons(fname='play3.png') button_test = ui.Button2D(icon_fnames=icon_files) button_test.set_center((20, 20)) def make_invisible(i_ren, obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.set_visibility(False) i_ren.force_render() i_ren.event.abort() def modify_button_callback(i_ren, obj, button): # i_ren: CustomInteractorStyle # obj: vtkActor picked # button: Button2D button.next_icon() i_ren.force_render() button_test.on_right_mouse_button_pressed = make_invisible button_test.on_left_mouse_button_pressed = modify_button_callback button_test.scale((2, 2)) button_color = button_test.color button_test.color = button_color # /Button # Panel panel = ui.Panel2D(center=(440, 90), size=(300, 150), color=(1, 1, 1), align="right") panel.add_element(rectangle_test, 'absolute', (580, 150)) panel.add_element(button_test, 'relative', (0.2, 0.2)) npt.assert_raises(ValueError, panel.add_element, another_rectangle_test, 'error_string', (1, 2)) # /Panel # Assign the counter callback to every possible event. event_counter = EventCounter() event_counter.monitor(button_test) event_counter.monitor(panel) current_size = (600, 600) show_manager = window.ShowManager(size=current_size, title="DIPY Button") show_manager.ren.add(panel) if recording: show_manager.record_events_to_file(recording_filename) print(list(event_counter.events_counts.items())) event_counter.save(expected_events_counts_filename) else: show_manager.play_events_from_file(recording_filename) expected = EventCounter.load(expected_events_counts_filename) event_counter.check_counts(expected)