Commit 948769479684ef1927f2de2b72c9cb4fcda932cf
1 parent
d30339af
Exists in
master
and in
68 other branches
ENH: The option to set image tiling is working
Showing
2 changed files
with
45 additions
and
3 deletions
Show diff stats
invesalius/data/viewer_slice.py
| @@ -102,6 +102,17 @@ class Viewer(wx.Panel): | @@ -102,6 +102,17 @@ class Viewer(wx.Panel): | ||
| 102 | def SetPopupMenu(self, menu): | 102 | def SetPopupMenu(self, menu): |
| 103 | self.menu = menu | 103 | self.menu = menu |
| 104 | 104 | ||
| 105 | + def SetLayout(self, layout): | ||
| 106 | + self.layout = layout | ||
| 107 | + slice_ = sl.Slice() | ||
| 108 | + self.load_renderers(slice_.GetOutput()) | ||
| 109 | + self.__configure_renderers() | ||
| 110 | + self.__configure_scroll() | ||
| 111 | + | ||
| 112 | + def __set_layout(self, pubsub_evt): | ||
| 113 | + layout = pubsub_evt.data | ||
| 114 | + self.SetLayout(layout) | ||
| 115 | + | ||
| 105 | def __config_interactor(self): | 116 | def __config_interactor(self): |
| 106 | 117 | ||
| 107 | ren = vtk.vtkRenderer() | 118 | ren = vtk.vtkRenderer() |
| @@ -659,6 +670,10 @@ class Viewer(wx.Panel): | @@ -659,6 +670,10 @@ class Viewer(wx.Panel): | ||
| 659 | ps.Publisher().subscribe(self.UpdateWindowLevelValue,\ | 670 | ps.Publisher().subscribe(self.UpdateWindowLevelValue,\ |
| 660 | 'Update window level value') | 671 | 'Update window level value') |
| 661 | 672 | ||
| 673 | + ### | ||
| 674 | + ps.Publisher().subscribe(self.__set_layout, | ||
| 675 | + 'Set slice viewer layout') | ||
| 676 | + | ||
| 662 | def ChangeBrushOperation(self, pubsub_evt): | 677 | def ChangeBrushOperation(self, pubsub_evt): |
| 663 | print pubsub_evt.data | 678 | print pubsub_evt.data |
| 664 | self._brush_cursor_op = pubsub_evt.data | 679 | self._brush_cursor_op = pubsub_evt.data |
| @@ -673,18 +688,32 @@ class Viewer(wx.Panel): | @@ -673,18 +688,32 @@ class Viewer(wx.Panel): | ||
| 673 | self.SetInput(imagedata) | 688 | self.SetInput(imagedata) |
| 674 | 689 | ||
| 675 | def load_renderers(self, image): | 690 | def load_renderers(self, image): |
| 691 | + number_renderers = self.layout[0] * self.layout[1] | ||
| 692 | + diff = number_renderers - len(self.slice_data_list) | ||
| 693 | + if diff > 0: | ||
| 694 | + for i in xrange(diff): | ||
| 695 | + slice_data = self.create_slice_window(image) | ||
| 696 | + self.slice_data_list.append(slice_data) | ||
| 697 | + elif diff < 0: | ||
| 698 | + to_remove = self.slice_data_list[number_renderers::] | ||
| 699 | + for slice_data in to_remove: | ||
| 700 | + self.interactor.GetRenderWindow().RemoveRenderer(slice_data.renderer) | ||
| 701 | + self.slice_data_list = self.slice_data_list[:number_renderers] | ||
| 702 | + | ||
| 703 | + def __configure_renderers(self): | ||
| 676 | proportion_x = 1.0 / self.layout[0] | 704 | proportion_x = 1.0 / self.layout[0] |
| 677 | proportion_y = 1.0 / self.layout[1] | 705 | proportion_y = 1.0 / self.layout[1] |
| 678 | # The (0,0) in VTK is in bottom left. So the creation from renderers | 706 | # The (0,0) in VTK is in bottom left. So the creation from renderers |
| 679 | # must be # in inverted order, from the top left to bottom right | 707 | # must be # in inverted order, from the top left to bottom right |
| 708 | + n = 0 | ||
| 680 | for j in xrange(self.layout[1]-1, -1, -1): | 709 | for j in xrange(self.layout[1]-1, -1, -1): |
| 681 | for i in xrange(self.layout[0]): | 710 | for i in xrange(self.layout[0]): |
| 682 | position = ((i*proportion_x, j * proportion_y, | 711 | position = ((i*proportion_x, j * proportion_y, |
| 683 | (i+1)*proportion_x, (j+1)*proportion_y)) | 712 | (i+1)*proportion_x, (j+1)*proportion_y)) |
| 684 | - slice_data = self.create_slice_window(image) | 713 | + slice_data = self.slice_data_list[n] |
| 685 | slice_data.renderer.SetViewport(position) | 714 | slice_data.renderer.SetViewport(position) |
| 686 | slice_data.SetCursor(self.__create_cursor()) | 715 | slice_data.SetCursor(self.__create_cursor()) |
| 687 | - self.slice_data_list.append(slice_data) | 716 | + n += 1 |
| 688 | 717 | ||
| 689 | def __create_cursor(self): | 718 | def __create_cursor(self): |
| 690 | cursor = ca.CursorCircle() | 719 | cursor = ca.CursorCircle() |
| @@ -710,6 +739,7 @@ class Viewer(wx.Panel): | @@ -710,6 +739,7 @@ class Viewer(wx.Panel): | ||
| 710 | #actor = vtk.vtkImageActor() | 739 | #actor = vtk.vtkImageActor() |
| 711 | #actor.SetInput(slice_.GetOutput()) | 740 | #actor.SetInput(slice_.GetOutput()) |
| 712 | self.load_renderers(slice_.GetOutput()) | 741 | self.load_renderers(slice_.GetOutput()) |
| 742 | + self.__configure_renderers() | ||
| 713 | ren = self.slice_data_list[0].renderer | 743 | ren = self.slice_data_list[0].renderer |
| 714 | actor = self.slice_data_list[0].actor | 744 | actor = self.slice_data_list[0].actor |
| 715 | actor_bound = actor.GetBounds() | 745 | actor_bound = actor.GetBounds() |
| @@ -916,6 +946,17 @@ class Viewer(wx.Panel): | @@ -916,6 +946,17 @@ class Viewer(wx.Panel): | ||
| 916 | def UpdateRender(self, evt): | 946 | def UpdateRender(self, evt): |
| 917 | self.interactor.Render() | 947 | self.interactor.Render() |
| 918 | 948 | ||
| 949 | + def __configure_scroll(self): | ||
| 950 | + actor = self.slice_data_list[0].actor | ||
| 951 | + number_of_slices = self.layout[0] * self.layout[1] | ||
| 952 | + max_slice_number = actor.GetSliceNumberMax() / \ | ||
| 953 | + number_of_slices | ||
| 954 | + if actor.GetSliceNumberMax() % number_of_slices: | ||
| 955 | + max_slice_number += 1 | ||
| 956 | + self.scroll.SetScrollbar(wx.SB_VERTICAL, 1, max_slice_number, | ||
| 957 | + max_slice_number) | ||
| 958 | + self.set_scroll_position(0) | ||
| 959 | + | ||
| 919 | def set_scroll_position(self, position): | 960 | def set_scroll_position(self, position): |
| 920 | self.scroll.SetThumbPosition(position) | 961 | self.scroll.SetThumbPosition(position) |
| 921 | self.OnScrollBar() | 962 | self.OnScrollBar() |
invesalius/gui/widgets/slice_menu.py
| @@ -104,7 +104,8 @@ class SliceMenu(wx.Menu): | @@ -104,7 +104,8 @@ class SliceMenu(wx.Menu): | ||
| 104 | 104 | ||
| 105 | elif(key in const.IMAGE_TILING.keys()): | 105 | elif(key in const.IMAGE_TILING.keys()): |
| 106 | values = const.IMAGE_TILING[key] | 106 | values = const.IMAGE_TILING[key] |
| 107 | - print "Changed Window to ", values | 107 | + ps.Publisher().sendMessage('Set slice viewer layout', values) |
| 108 | + ps.Publisher().sendMessage('Update slice viewer') | ||
| 108 | 109 | ||
| 109 | evt.Skip() | 110 | evt.Skip() |
| 110 | 111 |