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 | 102 | def SetPopupMenu(self, menu): |
| 103 | 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 | 116 | def __config_interactor(self): |
| 106 | 117 | |
| 107 | 118 | ren = vtk.vtkRenderer() |
| ... | ... | @@ -659,6 +670,10 @@ class Viewer(wx.Panel): |
| 659 | 670 | ps.Publisher().subscribe(self.UpdateWindowLevelValue,\ |
| 660 | 671 | 'Update window level value') |
| 661 | 672 | |
| 673 | + ### | |
| 674 | + ps.Publisher().subscribe(self.__set_layout, | |
| 675 | + 'Set slice viewer layout') | |
| 676 | + | |
| 662 | 677 | def ChangeBrushOperation(self, pubsub_evt): |
| 663 | 678 | print pubsub_evt.data |
| 664 | 679 | self._brush_cursor_op = pubsub_evt.data |
| ... | ... | @@ -673,18 +688,32 @@ class Viewer(wx.Panel): |
| 673 | 688 | self.SetInput(imagedata) |
| 674 | 689 | |
| 675 | 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 | 704 | proportion_x = 1.0 / self.layout[0] |
| 677 | 705 | proportion_y = 1.0 / self.layout[1] |
| 678 | 706 | # The (0,0) in VTK is in bottom left. So the creation from renderers |
| 679 | 707 | # must be # in inverted order, from the top left to bottom right |
| 708 | + n = 0 | |
| 680 | 709 | for j in xrange(self.layout[1]-1, -1, -1): |
| 681 | 710 | for i in xrange(self.layout[0]): |
| 682 | 711 | position = ((i*proportion_x, j * proportion_y, |
| 683 | 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 | 714 | slice_data.renderer.SetViewport(position) |
| 686 | 715 | slice_data.SetCursor(self.__create_cursor()) |
| 687 | - self.slice_data_list.append(slice_data) | |
| 716 | + n += 1 | |
| 688 | 717 | |
| 689 | 718 | def __create_cursor(self): |
| 690 | 719 | cursor = ca.CursorCircle() |
| ... | ... | @@ -710,6 +739,7 @@ class Viewer(wx.Panel): |
| 710 | 739 | #actor = vtk.vtkImageActor() |
| 711 | 740 | #actor.SetInput(slice_.GetOutput()) |
| 712 | 741 | self.load_renderers(slice_.GetOutput()) |
| 742 | + self.__configure_renderers() | |
| 713 | 743 | ren = self.slice_data_list[0].renderer |
| 714 | 744 | actor = self.slice_data_list[0].actor |
| 715 | 745 | actor_bound = actor.GetBounds() |
| ... | ... | @@ -916,6 +946,17 @@ class Viewer(wx.Panel): |
| 916 | 946 | def UpdateRender(self, evt): |
| 917 | 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 | 960 | def set_scroll_position(self, position): |
| 920 | 961 | self.scroll.SetThumbPosition(position) |
| 921 | 962 | self.OnScrollBar() | ... | ... |
invesalius/gui/widgets/slice_menu.py
| ... | ... | @@ -104,7 +104,8 @@ class SliceMenu(wx.Menu): |
| 104 | 104 | |
| 105 | 105 | elif(key in const.IMAGE_TILING.keys()): |
| 106 | 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 | 110 | evt.Skip() |
| 110 | 111 | ... | ... |