Commit 4209ef5f21f309aca08e6b272dc7ee10f8672b84
1 parent
ad467829
Exists in
master
and in
3 other branches
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) |