def show_results(streamlines, vol, affine, world_coords=True, opacity=0.6): from dipy.viz import actor, window, widget import numpy as np shape = vol.shape if not world_coords: from dipy.tracking.streamline import transform_streamlines streamlines = transform_streamlines(streamlines, np.linalg.inv(affine)) ren = window.Renderer() if streamlines is not None: stream_actor = actor.line(streamlines) if not world_coords: image_actor = actor.slicer(vol, affine=np.eye(4)) else: image_actor = actor.slicer(vol, affine) slicer_opacity = opacity #.6 image_actor.opacity(slicer_opacity) if streamlines is not None: ren.add(stream_actor) ren.add(image_actor) show_m = window.ShowManager(ren, size=(1200, 900)) show_m.initialize() def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=shape[2] - 1, value=shape[2] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) global size size = ren.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): slider.place(ren) size = obj.GetSize() show_m.initialize() show_m.add_window_callback(win_callback) show_m.render() show_m.start() # ren.zoom(1.5) # ren.reset_clipping_range() # window.record(ren, out_path='bundles_and_a_slice.png', size=(1200, 900), # reset_camera=False) del show_m
button_minus_callback, button_png_minus, (.98, .9), (50, 50)) def move_lines(obj, event): stream_actor.SetPosition((obj.get_value(), 0, 0)) """ Then we create the slider. """ slider = widget.slider(show_manager.iren, show_manager.ren, callback=move_lines, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.7), size=(120, 0), label_format="%0.2lf", color=(0.4, 0.4, 0.4), selected_color=(0.2, 0.2, 0.2)) """ And we add a simple clickable text overlay at the bottom left corner. """ def text_clicked(obj, event): print("Awesome!") text = widget.text(show_manager.iren, show_manager.ren, message="Powered by DIPY",
def show_results(data, streamlines, vol, affine, world_coords=True, opacity=0.6): from dipy.viz import actor, window, widget shape = data.shape if not world_coords: from dipy.tracking.streamline import transform_streamlines streamlines = transform_streamlines(streamlines, np.linalg.inv(affine)) ren = window.Renderer() if streamlines is not None: stream_actor = actor.line(streamlines) if not world_coords: image_actor = actor.slicer(vol, affine=np.eye(4)) else: image_actor = actor.slicer(vol, affine) slicer_opacity = opacity #.6 image_actor.opacity(slicer_opacity) if streamlines is not None: ren.add(stream_actor) ren.add(image_actor) show_m = window.ShowManager(ren, size=(1200, 900)) show_m.initialize() def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=shape[2] - 1, value=shape[2] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) global size size = ren.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): slider.place(ren) size = obj.GetSize() show_m.initialize() show_m.add_window_callback(win_callback) show_m.render() show_m.start() # ren.zoom(1.5) # ren.reset_clipping_range() # window.record(ren, out_path='bundles_and_a_slice.png', size=(1200, 900), # reset_camera=False) del show_m
""" After we have initialized the ``ShowManager`` we can go ahead and create a callback which will be given to the ``slider`` function. """ def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=shape[2] - 1, value=shape[2] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) """ Then, we can render all the widgets and everything else in the screen and start the interaction using ``show_m.start()``. However, if you change the window size, the slider will not update its position properly. The solution to this issue is to update the position of the slider using its ``place`` method every time the window size changes. """
def test_button_and_slider_widgets(): recording = False filename = "test_button_and_slider_widgets.log.gz" recording_filename = pjoin(DATA_DIR, filename) renderer = window.Renderer() # create some minimalistic streamlines lines = [ np.array([[-1, 0, 0.], [1, 0, 0.]]), np.array([[-1, 1, 0.], [1, 1, 0.]]) ] colors = np.array([[1., 0., 0.], [0.3, 0.7, 0.]]) stream_actor = actor.streamtube(lines, colors) states = { 'camera_button_count': 0, 'plus_button_count': 0, 'minus_button_count': 0, 'slider_moved_count': 0, } renderer.add(stream_actor) # the show manager allows to break the rendering process # in steps so that the widgets can be added properly show_manager = window.ShowManager(renderer, size=(800, 800)) if recording: show_manager.initialize() show_manager.render() def button_callback(obj, event): print('Camera pressed') states['camera_button_count'] += 1 def button_plus_callback(obj, event): print('+ pressed') states['plus_button_count'] += 1 def button_minus_callback(obj, event): print('- pressed') states['minus_button_count'] += 1 fetch_viz_icons() button_png = read_viz_icons(fname='camera.png') button = widget.button(show_manager.iren, show_manager.ren, button_callback, button_png, (.98, 1.), (80, 50)) button_png_plus = read_viz_icons(fname='plus.png') button_plus = widget.button(show_manager.iren, show_manager.ren, button_plus_callback, button_png_plus, (.98, .9), (120, 50)) button_png_minus = read_viz_icons(fname='minus.png') button_minus = widget.button(show_manager.iren, show_manager.ren, button_minus_callback, button_png_minus, (.98, .9), (50, 50)) def print_status(obj, event): rep = obj.GetRepresentation() stream_actor.SetPosition((rep.GetValue(), 0, 0)) states['slider_moved_count'] += 1 slider = widget.slider(show_manager.iren, show_manager.ren, callback=print_status, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.2lf") # This callback is used to update the buttons/sliders' position # so they can stay on the right side of the window when the window # is being resized. global size size = renderer.GetSize() if recording: show_manager.record_events_to_file(recording_filename) print(states) else: show_manager.play_events_from_file(recording_filename) npt.assert_equal(states["camera_button_count"], 7) npt.assert_equal(states["plus_button_count"], 3) npt.assert_equal(states["minus_button_count"], 4) npt.assert_equal(states["slider_moved_count"], 116) if not recording: button.Off() slider.Off() # Uncomment below to test the slider and button with analyze # button.place(renderer) # slider.place(renderer) arr = window.snapshot(renderer, size=(800, 800)) report = window.analyze_snapshot(arr) # import pylab as plt # plt.imshow(report.labels, origin='lower') # plt.show() npt.assert_equal(report.objects, 4) report = window.analyze_renderer(renderer) npt.assert_equal(report.actors, 1)
def horizon(tractograms, data, affine, cluster=False, cluster_thr=15., random_colors=False, length_lt=0, length_gt=np.inf, clusters_lt=0, clusters_gt=np.inf): rng = np.random.RandomState(42) slicer_opacity = .8 ren = window.Renderer() global centroid_actors centroid_actors = [] for streamlines in tractograms: print(' Number of streamlines loaded {} \n'.format(len(streamlines))) if not random_colors: ren.add(actor.line(streamlines, opacity=1., lod_points=10 ** 5)) else: colors = rng.rand(3) ren.add(actor.line(streamlines, colors, opacity=1., lod_points=10 ** 5)) class SimpleTrackBallNoBB(window.vtk.vtkInteractorStyleTrackballCamera): def HighlightProp(self, p): pass style = SimpleTrackBallNoBB() # very hackish way style.SetPickColor(0, 0, 0) # style.HighlightProp(None) show_m = window.ShowManager(ren, size=(1200, 900), interactor_style=style) show_m.initialize() if data is not None: #from dipy.core.geometry import rodrigues_axis_rotation #affine[:3, :3] = np.dot(affine[:3, :3], rodrigues_axis_rotation((0, 0, 1), 45)) image_actor = actor.slicer(data, affine) image_actor.opacity(slicer_opacity) image_actor.SetInterpolate(False) ren.add(image_actor) ren.add(fvtk.axes((10, 10, 10))) last_value = [10] def change_slice(obj, event): new_value = int(np.round(obj.get_value())) if new_value == image_actor.shape[1] - 1 or new_value == 0: new_value = last_value[0] + np.sign(new_value - last_value[0]) image_actor.display(None, new_value, None) obj.set_value(new_value) last_value[0] = new_value slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=image_actor.shape[1] - 1, value=image_actor.shape[1] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) slider.SetAnimationModeToJump() global size size = ren.GetSize() # ren.background((1, 0.5, 0)) ren.background((0, 0, 0)) global picked_actors picked_actors = {} def pick_callback(obj, event): global centroid_actors global picked_actors prop = obj.GetProp3D() ac = np.array(centroid_actors) index = np.where(ac == prop)[0] if len(index) > 0: try: bundle = picked_actors[prop] ren.rm(bundle) del picked_actors[prop] except: bundle = actor.line(clusters[visible_cluster_id[index]], lod=False) picked_actors[prop] = bundle ren.add(bundle) if prop in picked_actors.values(): ren.rm(prop) def win_callback(obj, event): global size if size != obj.GetSize(): if data is not None: slider.place(ren) size = obj.GetSize() global centroid_visibility centroid_visibility = True def key_press(obj, event): global centroid_visibility key = obj.GetKeySym() if key == 'h' or key == 'H': if cluster: if centroid_visibility is True: for ca in centroid_actors: ca.VisibilityOff() centroid_visibility = False else: for ca in centroid_actors: ca.VisibilityOn() centroid_visibility = True show_m.render() show_m.initialize() show_m.iren.AddObserver('KeyPressEvent', key_press) show_m.add_window_callback(win_callback) #show_m.add_picker_callback(pick_callback) show_m.render() show_m.start()
def test_button_and_slider_widgets(): interactive = False renderer = window.Renderer() # create some minimalistic streamlines lines = [ np.array([[-1, 0, 0.], [1, 0, 0.]]), np.array([[-1, 1, 0.], [1, 1, 0.]]) ] colors = np.array([[1., 0., 0.], [0.3, 0.7, 0.]]) stream_actor = actor.streamtube(lines, colors) renderer.add(stream_actor) # the show manager allows to break the rendering process # in steps so that the widgets can be added properly show_manager = window.ShowManager(renderer, size=(800, 800)) if interactive: show_manager.initialize() show_manager.render() def button_callback(obj, event): print('Camera pressed') def button_plus_callback(obj, event): print('+ pressed') def button_minus_callback(obj, event): print('- pressed') fetch_viz_icons() button_png = read_viz_icons(fname='camera.png') button = widget.button(show_manager.iren, show_manager.ren, button_callback, button_png, (.98, 1.), (80, 50)) button_png_plus = read_viz_icons(fname='plus.png') button_plus = widget.button(show_manager.iren, show_manager.ren, button_plus_callback, button_png_plus, (.98, .9), (120, 50)) button_png_minus = read_viz_icons(fname='minus.png') button_minus = widget.button(show_manager.iren, show_manager.ren, button_minus_callback, button_png_minus, (.98, .9), (50, 50)) def print_status(obj, event): rep = obj.GetRepresentation() stream_actor.SetPosition((rep.GetValue(), 0, 0)) slider = widget.slider(show_manager.iren, show_manager.ren, callback=print_status, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.2lf") # This callback is used to update the buttons/sliders' position # so they can stay on the right side of the window when the window # is being resized. global size size = renderer.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): button.place(renderer) button_plus.place(renderer) button_minus.place(renderer) slider.place(renderer) size = obj.GetSize() if interactive: # show_manager.add_window_callback(win_callback) # you can also register any callback in a vtk way like this # show_manager.window.AddObserver(vtk.vtkCommand.ModifiedEvent, # win_callback) show_manager.render() show_manager.start() if not interactive: button.Off() slider.Off() # Uncomment below to test the slider and button with analyze # button.place(renderer) # slider.place(renderer) arr = window.snapshot(renderer, size=(800, 800)) report = window.analyze_snapshot(arr) npt.assert_equal(report.objects, 2) # imshow(report.labels, origin='lower') report = window.analyze_renderer(renderer) npt.assert_equal(report.actors, 1)
def horizon(tractograms, data, affine): rng = np.random.RandomState(42) slicer_opacity = .8 ren = window.Renderer() global centroid_actors centroid_actors = [] for streamlines in tractograms: print(' Number of streamlines loaded {} \n'.format(len(streamlines))) colors = rng.rand(3) ren.add(actor.line(streamlines, colors, opacity=1., lod_points=10**5)) class SimpleTrackBallNoBB(window.vtk.vtkInteractorStyleTrackballCamera): def HighlightProp(self, p): pass style = SimpleTrackBallNoBB() # very hackish way style.SetPickColor(0, 0, 0) # style.HighlightProp(None) show_m = window.ShowManager(ren, size=(1200, 900), interactor_style=style) show_m.initialize() if data is not None: #from dipy.core.geometry import rodrigues_axis_rotation #affine[:3, :3] = np.dot(affine[:3, :3], rodrigues_axis_rotation((0, 0, 1), 45)) image_actor = actor.slicer(data, affine) image_actor.opacity(slicer_opacity) image_actor.SetInterpolate(False) ren.add(image_actor) ren.add(fvtk.axes((10, 10, 10))) last_value = [10] def change_slice(obj, event): new_value = int(np.round(obj.get_value())) if new_value == image_actor.shape[1] - 1 or new_value == 0: new_value = last_value[0] + np.sign(new_value - last_value[0]) image_actor.display(None, new_value, None) obj.set_value(new_value) last_value[0] = new_value slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=image_actor.shape[1] - 1, value=image_actor.shape[1] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) slider.SetAnimationModeToJump() global size size = ren.GetSize() # ren.background((1, 0.5, 0)) ren.background((0, 0, 0)) global picked_actors picked_actors = {} def win_callback(obj, event): global size if size != obj.GetSize(): if data is not None: slider.place(ren) size = obj.GetSize() global centroid_visibility centroid_visibility = True show_m.initialize() show_m.add_window_callback(win_callback) show_m.render() show_m.start()
def test_button_and_slider_widgets(): interactive = False renderer = window.Renderer() # create some minimalistic streamlines lines = [np.array([[-1, 0, 0.], [1, 0, 0.]]), np.array([[-1, 1, 0.], [1, 1, 0.]])] colors = np.array([[1., 0., 0.], [0.3, 0.7, 0.]]) stream_actor = actor.streamtube(lines, colors) renderer.add(stream_actor) # the show manager allows to break the rendering process # in steps so that the widgets can be added properly show_manager = window.ShowManager(renderer, size=(800, 800)) if interactive: show_manager.initialize() show_manager.render() def button_callback(obj, event): print('Camera pressed') def button_plus_callback(obj, event): print('+ pressed') def button_minus_callback(obj, event): print('- pressed') fetch_viz_icons() button_png = read_viz_icons(fname='camera.png') button = widget.button(show_manager.iren, show_manager.ren, button_callback, button_png, (.98, 1.), (80, 50)) button_png_plus = read_viz_icons(fname='plus.png') button_plus = widget.button(show_manager.iren, show_manager.ren, button_plus_callback, button_png_plus, (.98, .9), (120, 50)) button_png_minus = read_viz_icons(fname='minus.png') button_minus = widget.button(show_manager.iren, show_manager.ren, button_minus_callback, button_png_minus, (.98, .9), (50, 50)) def print_status(obj, event): rep = obj.GetRepresentation() stream_actor.SetPosition((rep.GetValue(), 0, 0)) slider = widget.slider(show_manager.iren, show_manager.ren, callback=print_status, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.2lf") # This callback is used to update the buttons/sliders' position # so they can stay on the right side of the window when the window # is being resized. global size size = renderer.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): button.place(renderer) button_plus.place(renderer) button_minus.place(renderer) slider.place(renderer) size = obj.GetSize() if interactive: # show_manager.add_window_callback(win_callback) # you can also register any callback in a vtk way like this # show_manager.window.AddObserver(vtk.vtkCommand.ModifiedEvent, # win_callback) show_manager.render() show_manager.start() if not interactive: button.Off() slider.Off() # Uncomment below to test the slider and button with analyze # button.place(renderer) # slider.place(renderer) arr = window.snapshot(renderer, size=(800, 800)) report = window.analyze_snapshot(arr) npt.assert_equal(report.objects, 2) # imshow(report.labels, origin='lower') report = window.analyze_renderer(renderer) npt.assert_equal(report.actors, 1)
def fiber_simple_3d_show(img, streamlines, world_coords=True, slicer_opacity=0.6): if not world_coords: from dipy.tracking.streamline import transform_streamlines streamlines = transform_streamlines(streamlines, np.linalg.inv(img.affine)) # Renderer ren = window.Renderer() stream_actor = actor.line(streamlines) if not world_coords: image_actor = actor.slicer(img.get_data(), affine=np.eye(4)) else: image_actor = actor.slicer(img.get_data(), img.affine) # opacity image_actor.opacity(slicer_opacity) # add some slice image_actor2 = image_actor.copy() image_actor2.opacity(slicer_opacity) # image_actor2.display() image_actor2.display(None, image_actor2.shape[1] / 2, None) image_actor3 = image_actor.copy() image_actor3.opacity(slicer_opacity) # image_actor3.display() image_actor3.display(image_actor3.shape[0] / 2, None, None) # connect the actors with the Render ren.add(stream_actor) ren.add(image_actor) ren.add(image_actor2) ren.add(image_actor3) # initial showmanager show_m = window.ShowManager(ren, size=(1200, 900)) show_m.initialize() # change the position of the image_actor using a slider def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, img.shape[0] - 1, 0, img.shape[1] - 1, z, z) slicer = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=img.shape[2] - 1, value=img.shape[2] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.1f", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) # change the position of the image_actor using a slider def change_slice2(obj, event): y = int(np.round(obj.get_value())) image_actor2.display_extent(0, img.shape[0] - 1, y, y, 0, img.shape[2] - 1) slicer2 = widget.slider(show_m.iren, show_m.ren, callback=change_slice2, min_value=0, max_value=img.shape[1] - 1, value=img.shape[1] / 2, label="Coronal slice", right_normalized_pos=(.98, 0.3), size=(120, 0), label_format="%0.1f", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) # change the position of the image_actor using a slider def change_slice3(obj, event): x = int(np.round(obj.get_value())) image_actor3.display_extent(x, x, 0, img.shape[1] - 1, 0, img.shape[2] - 1) slicer3 = widget.slider(show_m.iren, show_m.ren, callback=change_slice3, min_value=0, max_value=img.shape[0] - 1, value=img.shape[0] / 2, label="Sagittal slice", right_normalized_pos=(.98, 0.9), size=(120, 0), label_format="%0.1f", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) # change window size, the slider will change global size size = ren.GetSize() def win_callback(obj, event): global size if size != obj.GetSize(): slicer.place(ren) slicer2.place(ren) slicer3.place(ren) size = obj.GetSize() show_m.initialize() # interact with the available 3D and 2D objects show_m.add_window_callback(win_callback) show_m.render() show_m.start() ren.zoom(1.5) ren.reset_clipping_range() window.record(ren, out_path='/home/brain/workingdir/pyfat/pyfat/example/test_results/cc_clusters_test.png', size=(1200, 900), reset_camera=False) del show_m
# connect the actors with the Render ren.add(stream_actor) ren.add(image_actor) ren.add(image_actor2) ren.add(image_actor3) # initial showmanager show_m = window.ShowManager(ren, size=(1200, 900)) show_m.initialize() # change the position of the image_actor using a slider def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, shape[0]-1, 0, shape[1]-1, z, z) slicer = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=shape[2]-1, value=shape[2]/2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.1f", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) # change the position of the image_actor using a slider def change_slice2(obj, event): y = int(np.round(obj.get_value())) image_actor2.display_extent(0, shape[0]-1, y, y, 0, shape[2]-1) slicer2 = widget.slider(show_m.iren, show_m.ren, callback=change_slice2, min_value=0, max_value=shape[1]-1, value=shape[1]/2, label="Coronal slice", right_normalized_pos=(.98, 0.3), size=(120, 0), label_format="%0.1f", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) # change the position of the image_actor using a slider def change_slice3(obj, event): x = int(np.round(obj.get_value())) image_actor3.display_extent(x, x, 0, shape[1]-1, 0, shape[2]-1) slicer3 = widget.slider(show_m.iren, show_m.ren, callback=change_slice3, min_value=0, max_value=shape[0]-1, value=shape[0]/2, label="Sagittal slice",
def move_lines(obj, event): stream_actor.SetPosition((obj.get_value(), 0, 0)) """ Then we create the slider. """ slider = widget.slider(show_manager.iren, show_manager.ren, callback=move_lines, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.7), size=(120, 0), label_format="%0.2lf", color=(0.4, 0.4, 0.4), selected_color=(0.2, 0.2, 0.2)) """ And we add a simple clickable text overlay at the bottom left corner. """ def text_clicked(obj, event): print("Awesome!") text = widget.text(show_manager.iren,
After we have initialized the ``ShowManager`` we can go ahead and create a callback which will be given to the ``slider`` function. """ def change_slice(obj, event): z = int(np.round(obj.get_value())) image_actor.display_extent(0, shape[0] - 1, 0, shape[1] - 1, z, z) slider = widget.slider(show_m.iren, show_m.ren, callback=change_slice, min_value=0, max_value=shape[2] - 1, value=shape[2] / 2, label="Move slice", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.lf", color=(1., 1., 1.), selected_color=(0.86, 0.33, 1.)) """ Then, we can render all the widgets and everything else in the screen and start the interaction using ``show_m.start()``. However, if you change the window size, the slider will not update its position properly. The solution to this issue is to update the position of the slider using its ``place`` method every time the window size changes. """
def test_button_and_slider_widgets(): recording = False filename = "test_button_and_slider_widgets.log.gz" recording_filename = pjoin(DATA_DIR, filename) renderer = window.Renderer() # create some minimalistic streamlines lines = [np.array([[-1, 0, 0.], [1, 0, 0.]]), np.array([[-1, 1, 0.], [1, 1, 0.]])] colors = np.array([[1., 0., 0.], [0.3, 0.7, 0.]]) stream_actor = actor.streamtube(lines, colors) states = {'camera_button_count': 0, 'plus_button_count': 0, 'minus_button_count': 0, 'slider_moved_count': 0, } renderer.add(stream_actor) # the show manager allows to break the rendering process # in steps so that the widgets can be added properly show_manager = window.ShowManager(renderer, size=(800, 800)) if recording: show_manager.initialize() show_manager.render() def button_callback(obj, event): print('Camera pressed') states['camera_button_count'] += 1 def button_plus_callback(obj, event): print('+ pressed') states['plus_button_count'] += 1 def button_minus_callback(obj, event): print('- pressed') states['minus_button_count'] += 1 fetch_viz_icons() button_png = read_viz_icons(fname='camera.png') button = widget.button(show_manager.iren, show_manager.ren, button_callback, button_png, (.98, 1.), (80, 50)) button_png_plus = read_viz_icons(fname='plus.png') button_plus = widget.button(show_manager.iren, show_manager.ren, button_plus_callback, button_png_plus, (.98, .9), (120, 50)) button_png_minus = read_viz_icons(fname='minus.png') button_minus = widget.button(show_manager.iren, show_manager.ren, button_minus_callback, button_png_minus, (.98, .9), (50, 50)) def print_status(obj, event): rep = obj.GetRepresentation() stream_actor.SetPosition((rep.GetValue(), 0, 0)) states['slider_moved_count'] += 1 slider = widget.slider(show_manager.iren, show_manager.ren, callback=print_status, min_value=-1, max_value=1, value=0., label="X", right_normalized_pos=(.98, 0.6), size=(120, 0), label_format="%0.2lf") # This callback is used to update the buttons/sliders' position # so they can stay on the right side of the window when the window # is being resized. global size size = renderer.GetSize() if recording: show_manager.record_events_to_file(recording_filename) print(states) else: show_manager.play_events_from_file(recording_filename) npt.assert_equal(states["camera_button_count"], 7) npt.assert_equal(states["plus_button_count"], 3) npt.assert_equal(states["minus_button_count"], 4) npt.assert_equal(states["slider_moved_count"], 116) if not recording: button.Off() slider.Off() # Uncomment below to test the slider and button with analyze # button.place(renderer) # slider.place(renderer) arr = window.snapshot(renderer, size=(800, 800)) report = window.analyze_snapshot(arr) # import pylab as plt # plt.imshow(report.labels, origin='lower') # plt.show() npt.assert_equal(report.objects, 4) report = window.analyze_renderer(renderer) npt.assert_equal(report.actors, 1)