Commit 4209ef5f21f309aca08e6b272dc7ee10f8672b84

Authored by Thiago Franco de Moraes
1 parent ad467829

Interface to control mip

Showing 1 changed file with 61 additions and 15 deletions   Show diff stats
invesalius/data/viewer_slice.py
@@ -58,23 +58,48 @@ ORIENTATIONS = { @@ -58,23 +58,48 @@ ORIENTATIONS = {
58 58
59 59
60 class ContourMIPConfig(wx.Panel): 60 class ContourMIPConfig(wx.Panel):
61 - def __init__(self, prnt): 61 + def __init__(self, prnt, orientation):
62 wx.Panel.__init__(self, prnt) 62 wx.Panel.__init__(self, prnt)
63 - self.mip_size_spin = wx.SpinCtrl(self, -1, min=1, max=120, initial=1) 63 + self.mip_size_spin = wx.SpinCtrl(self, -1, min=1, max=240, initial=1)
64 self.border_spin = FS.FloatSpin(self, -1, min_val=0, max_val=10, 64 self.border_spin = FS.FloatSpin(self, -1, min_val=0, max_val=10,
65 increment=0.01, value=0.1, 65 increment=0.01, value=0.1,
66 agwStyle=FS.FS_LEFT) 66 agwStyle=FS.FS_LEFT)
  67 + self.inverted = wx.CheckBox(self, -1, "inverted")
  68 +
  69 + txt_mip_size = wx.StaticText(self, -1, "MIP size", style=wx.ALIGN_CENTER_HORIZONTAL)
  70 + txt_mip_border = wx.StaticText(self, -1, "Border")
67 71
68 sizer = wx.BoxSizer(wx.HORIZONTAL) 72 sizer = wx.BoxSizer(wx.HORIZONTAL)
69 - sizer.Add(self.mip_size_spin, 1, wx.EXPAND)  
70 - sizer.Add(self.border_spin, 1, wx.EXPAND) 73 + sizer.Add(txt_mip_size, 0, wx.EXPAND | wx.ALL, 2)
  74 + sizer.Add(self.mip_size_spin, 0, wx.EXPAND)
  75 + sizer.Add(txt_mip_border, 0, wx.EXPAND)
  76 + sizer.Add(self.border_spin, 0, wx.EXPAND)
  77 + sizer.Add(self.inverted, 1, wx.EXPAND)
71 self.SetSizer(sizer) 78 self.SetSizer(sizer)
72 sizer.Fit(self) 79 sizer.Fit(self)
73 80
74 self.Layout() 81 self.Layout()
75 self.Update() 82 self.Update()
76 self.SetAutoLayout(1) 83 self.SetAutoLayout(1)
  84 +
  85 + self.orientation = orientation
  86 +
  87 + self.mip_size_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPSize)
  88 + self.border_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPBorder)
  89 + self.inverted.Bind(wx.EVT_CHECKBOX, self.OnCheckInverted)
77 90
  91 + def OnSetMIPSize(self, evt):
  92 + val = self.mip_size_spin.GetValue()
  93 + Publisher.sendMessage('Set MIP size %s' % self.orientation, val)
  94 +
  95 + def OnSetMIPBorder(self, evt):
  96 + val = self.border_spin.GetValue()
  97 + Publisher.sendMessage('Set MIP border %s' % self.orientation, val)
  98 +
  99 + def OnCheckInverted(self, evt):
  100 + val = self.inverted.GetValue()
  101 + Publisher.sendMessage('Set MIP Invert %s' % self.orientation, val)
  102 +
78 103
79 class Viewer(wx.Panel): 104 class Viewer(wx.Panel):
80 105
@@ -90,6 +115,7 @@ class Viewer(wx.Panel): @@ -90,6 +115,7 @@ class Viewer(wx.Panel):
90 self.right_pressed = 0 115 self.right_pressed = 0
91 116
92 self._number_slices = 10 117 self._number_slices = 10
  118 + self._mip_inverted = False
93 119
94 self.spined_image = False #Use to control to spin 120 self.spined_image = False #Use to control to spin
95 self.paned_image = False 121 self.paned_image = False
@@ -110,11 +136,11 @@ class Viewer(wx.Panel): @@ -110,11 +136,11 @@ class Viewer(wx.Panel):
110 self.actors_by_slice_number = {} 136 self.actors_by_slice_number = {}
111 self.renderers_by_slice_number = {} 137 self.renderers_by_slice_number = {}
112 138
113 - self.__init_gui()  
114 -  
115 self.orientation = orientation 139 self.orientation = orientation
116 self.slice_number = 0 140 self.slice_number = 0
117 141
  142 + self.__init_gui()
  143 +
118 self._brush_cursor_op = const.DEFAULT_BRUSH_OP 144 self._brush_cursor_op = const.DEFAULT_BRUSH_OP
119 self._brush_cursor_size = const.BRUSH_SIZE 145 self._brush_cursor_size = const.BRUSH_SIZE
120 self._brush_cursor_colour = const.BRUSH_COLOUR 146 self._brush_cursor_colour = const.BRUSH_COLOUR
@@ -139,7 +165,7 @@ class Viewer(wx.Panel): @@ -139,7 +165,7 @@ class Viewer(wx.Panel):
139 scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) 165 scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL)
140 self.scroll = scroll 166 self.scroll = scroll
141 167
142 - self.mip_ctrls = ContourMIPConfig(self) 168 + self.mip_ctrls = ContourMIPConfig(self, self.orientation)
143 169
144 sizer = wx.BoxSizer(wx.HORIZONTAL) 170 sizer = wx.BoxSizer(wx.HORIZONTAL)
145 sizer.Add(self.interactor, 1, wx.EXPAND|wx.GROW) 171 sizer.Add(self.interactor, 1, wx.EXPAND|wx.GROW)
@@ -675,6 +701,12 @@ class Viewer(wx.Panel): @@ -675,6 +701,12 @@ class Viewer(wx.Panel):
675 Publisher.subscribe(self.ReloadActualSlice, 'Reload actual slice') 701 Publisher.subscribe(self.ReloadActualSlice, 'Reload actual slice')
676 Publisher.subscribe(self.OnUpdateScroll, 'Update scroll') 702 Publisher.subscribe(self.OnUpdateScroll, 'Update scroll')
677 703
  704 +
  705 + # MIP
  706 + Publisher.subscribe(self.OnSetMIPSize, 'Set MIP size %s' % self.orientation)
  707 + Publisher.subscribe(self.OnSetMIPBorder, 'Set MIP border %s' % self.orientation)
  708 + Publisher.subscribe(self.OnSetMIPInvert, 'Set MIP Invert %s' % self.orientation)
  709 +
678 def SetDefaultCursor(self, pusub_evt): 710 def SetDefaultCursor(self, pusub_evt):
679 self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) 711 self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))
680 712
@@ -771,9 +803,6 @@ class Viewer(wx.Panel): @@ -771,9 +803,6 @@ class Viewer(wx.Panel):
771 self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) 803 self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu)
772 self.interactor.Bind(wx.EVT_SIZE, self.OnSize) 804 self.interactor.Bind(wx.EVT_SIZE, self.OnSize)
773 805
774 - self.mip_ctrls.mip_size_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPSize)  
775 - self.mip_ctrls.border_spin.Bind(wx.EVT_SPINCTRL, self.OnSetMIPBorder)  
776 -  
777 def LoadImagedata(self, pubsub_evt): 806 def LoadImagedata(self, pubsub_evt):
778 imagedata, mask_dict = pubsub_evt.data 807 imagedata, mask_dict = pubsub_evt.data
779 self.SetInput(imagedata, mask_dict) 808 self.SetInput(imagedata, mask_dict)
@@ -1098,6 +1127,15 @@ class Viewer(wx.Panel): @@ -1098,6 +1127,15 @@ class Viewer(wx.Panel):
1098 1127
1099 elif evt.GetKeyCode() in projections: 1128 elif evt.GetKeyCode() in projections:
1100 print "PROJECTION MANOLO!" 1129 print "PROJECTION MANOLO!"
  1130 + if evt.GetKeyCode() != wx.WXK_NUMPAD0 and self.slice_._type_projection == const.PROJECTION_NORMAL:
  1131 + self.mip_ctrls.Show()
  1132 + self.GetSizer().Add(self.mip_ctrls, 0, wx.EXPAND|wx.GROW|wx.ALL, 2)
  1133 + self.Layout()
  1134 + elif evt.GetKeyCode() == wx.WXK_NUMPAD0 and self.slice_._type_projection != const.PROJECTION_NORMAL:
  1135 + self.mip_ctrls.Hide()
  1136 + self.GetSizer().Remove(self.mip_ctrls)
  1137 + self.Layout()
  1138 +
1101 self.slice_.SetTypeProjection(projections[evt.GetKeyCode()]) 1139 self.slice_.SetTypeProjection(projections[evt.GetKeyCode()])
1102 self.ReloadActualSlice() 1140 self.ReloadActualSlice()
1103 1141
@@ -1137,21 +1175,29 @@ class Viewer(wx.Panel): @@ -1137,21 +1175,29 @@ class Viewer(wx.Panel):
1137 self.slice_data.SetSize((w, h)) 1175 self.slice_data.SetSize((w, h))
1138 evt.Skip() 1176 evt.Skip()
1139 1177
1140 - def OnSetMIPSize(self, evt):  
1141 - val = self.mip_ctrls.mip_size_spin.GetValue() 1178 + def OnSetMIPSize(self, pubsub_evt):
  1179 + val = pubsub_evt.data
1142 self.number_slices = val 1180 self.number_slices = val
1143 self.ReloadActualSlice() 1181 self.ReloadActualSlice()
1144 1182
1145 - def OnSetMIPBorder(self, evt):  
1146 - val = self.mip_ctrls.border_spin.GetValue() 1183 + def OnSetMIPBorder(self, pubsub_evt):
  1184 + val = pubsub_evt.data
1147 self.slice_.n_border = val 1185 self.slice_.n_border = val
1148 buffer_ = self.slice_.buffer_slices[self.orientation] 1186 buffer_ = self.slice_.buffer_slices[self.orientation]
1149 buffer_.discard_buffer() 1187 buffer_.discard_buffer()
1150 self.ReloadActualSlice() 1188 self.ReloadActualSlice()
1151 1189
  1190 + def OnSetMIPInvert(self, pubsub_evt):
  1191 + val = pubsub_evt.data
  1192 + self._mip_inverted = val
  1193 + buffer_ = self.slice_.buffer_slices[self.orientation]
  1194 + buffer_.discard_buffer()
  1195 + self.ReloadActualSlice()
  1196 +
1152 def set_slice_number(self, index): 1197 def set_slice_number(self, index):
  1198 + inverted = self.mip_ctrls.inverted.GetValue()
1153 image = self.slice_.GetSlices(self.orientation, index, 1199 image = self.slice_.GetSlices(self.orientation, index,
1154 - self.number_slices) 1200 + self.number_slices, inverted)
1155 self.slice_data.actor.SetInput(image) 1201 self.slice_data.actor.SetInput(image)
1156 for actor in self.actors_by_slice_number.get(self.slice_data.number, []): 1202 for actor in self.actors_by_slice_number.get(self.slice_data.number, []):
1157 self.slice_data.renderer.RemoveActor(actor) 1203 self.slice_data.renderer.RemoveActor(actor)