Commit 948769479684ef1927f2de2b72c9cb4fcda932cf

Authored by tfmoraes
1 parent d30339af

ENH: The option to set image tiling is working

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