Commit 423f557b3c411f35aaefd0f2183360afb978c4bc
1 parent
e4ecdc27
Exists in
master
and in
6 other branches
ADD: Import preview and slice auto-play and slider (under devel)
Showing
2 changed files
with
71 additions
and
10 deletions
Show diff stats
invesalius/gui/dicom_preview_panel.py
... | ... | @@ -31,6 +31,8 @@ import vtkgdcm |
31 | 31 | import constants as const |
32 | 32 | from reader import dicom_reader |
33 | 33 | import data.vtk_utils as vtku |
34 | +import time | |
35 | + | |
34 | 36 | |
35 | 37 | NROWS = 3 |
36 | 38 | NCOLS = 6 |
... | ... | @@ -47,7 +49,9 @@ class SingleImagePreview(wx.Panel): |
47 | 49 | wx.Panel.__init__(self, parent, -1) |
48 | 50 | self.__init_gui() |
49 | 51 | self.__init_vtk() |
50 | - self.filelist = [] | |
52 | + self.__bind_evt_gui() | |
53 | + self.dicom_list = [] | |
54 | + self.nimages = 1 | |
51 | 55 | self.current_index = 0 |
52 | 56 | self.window_width = const.WINDOW_LEVEL["Bone"][0] |
53 | 57 | self.window_level = const.WINDOW_LEVEL["Bone"][1] |
... | ... | @@ -97,7 +101,7 @@ class SingleImagePreview(wx.Panel): |
97 | 101 | style = vtk.vtkInteractorStyleImage() |
98 | 102 | |
99 | 103 | interactor = wxVTKRenderWindowInteractor(self.panel, -1, |
100 | - size=wx.Size(380,380)) | |
104 | + size=wx.Size(340,340)) | |
101 | 105 | interactor.GetRenderWindow().AddRenderer(renderer) |
102 | 106 | interactor.SetInteractorStyle(style) |
103 | 107 | interactor.Render() |
... | ... | @@ -113,28 +117,73 @@ class SingleImagePreview(wx.Panel): |
113 | 117 | |
114 | 118 | def __init_gui(self): |
115 | 119 | self.panel = wx.Panel(self, -1) |
116 | - self.slider = wx.Slider(self, 100, 25, 1, 100, (30, 60), (250, -1), | |
117 | - wx.SL_HORIZONTAL | wx.SL_AUTOTICKS) | |
118 | - self.slider.SetTickFreq(1, 1) | |
120 | + | |
121 | + slider = wx.Slider(self, | |
122 | + id=-1, | |
123 | + value=0, | |
124 | + minValue=0, | |
125 | + maxValue=99, | |
126 | + style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS) | |
127 | + slider.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) | |
128 | + slider.SetTickFreq(1, 1) | |
129 | + self.slider = slider | |
130 | + | |
131 | + checkbox = wx.CheckBox(self, -1, "Auto-play") | |
132 | + self.checkbox = checkbox | |
133 | + | |
134 | + in_sizer = wx.BoxSizer(wx.HORIZONTAL) | |
135 | + in_sizer.Add(slider, 1, wx.GROW|wx.EXPAND) | |
136 | + in_sizer.Add(checkbox, 0) | |
119 | 137 | |
120 | 138 | sizer = wx.BoxSizer(wx.VERTICAL) |
121 | 139 | sizer.Add(self.panel, 20, wx.GROW|wx.EXPAND) |
122 | - sizer.Add(self.slider, 1, wx.GROW|wx.EXPAND) | |
140 | + sizer.Add(in_sizer, 1, wx.GROW|wx.EXPAND) | |
123 | 141 | sizer.Fit(self) |
124 | 142 | |
125 | 143 | self.SetSizer(sizer) |
126 | 144 | self.Layout() |
127 | 145 | self.Update() |
128 | 146 | self.SetAutoLayout(1) |
129 | - | |
130 | 147 | |
148 | + def __bind_evt_gui(self): | |
149 | + self.slider.Bind(wx.EVT_SLIDER, self.OnSlider) | |
150 | + self.checkbox.Bind(wx.EVT_CHECKBOX, self.OnCheckBox) | |
151 | + | |
152 | + def OnSlider(self, evt): | |
153 | + pos = evt.GetInt() | |
154 | + self.ShowSlice(pos) | |
155 | + evt.Skip() | |
156 | + | |
157 | + def OnCheckBox(self, evt): | |
158 | + self.ischecked = evt.IsChecked() | |
159 | + if evt.IsChecked(): | |
160 | + wx.CallAfter(self.OnRun) | |
161 | + evt.Skip() | |
162 | + | |
163 | + def OnRun(self): | |
164 | + pos = self.slider.GetValue() | |
165 | + pos += 1 | |
166 | + if not (self.nimages- pos): | |
167 | + pos = 0 | |
168 | + self.slider.SetValue(pos) | |
169 | + self.ShowSlice(pos) | |
170 | + time.sleep(0.2) | |
171 | + if self.ischecked: | |
172 | + wx.Yield() | |
173 | + wx.CallAfter(self.OnRun) | |
174 | + | |
131 | 175 | def SetDicomGroup(self, group): |
132 | 176 | self.dicom_list = group.GetHandSortedList() |
133 | 177 | self.current_index = 0 |
178 | + self.nimages = len(self.dicom_list) | |
179 | + # GUI | |
180 | + self.slider.SetMax(self.nimages-1) | |
181 | + print self.nimages | |
182 | + self.slider.SetValue(0) | |
134 | 183 | self.ShowSlice() |
135 | 184 | |
136 | - def ShowSlice(self): | |
137 | - index = self.current_index | |
185 | + def ShowSlice(self, index = 0): | |
186 | + print "ShowSlice" | |
138 | 187 | dicom = self.dicom_list[index] |
139 | 188 | |
140 | 189 | # UPDATE GUI |
... | ... | @@ -164,6 +213,10 @@ class SingleImagePreview(wx.Panel): |
164 | 213 | # ADJUST CONTRAST |
165 | 214 | window_level = dicom.image.level |
166 | 215 | window_width = dicom.image.window |
216 | + print "======" | |
217 | + print "WW/WL" | |
218 | + print window_level | |
219 | + print window_width | |
167 | 220 | colorer = vtk.vtkImageMapToWindowLevelColors() |
168 | 221 | colorer.SetInput(reader.GetOutput()) |
169 | 222 | colorer.SetWindow(float(window_width)) | ... | ... |
invesalius/gui/import_panel.py
... | ... | @@ -50,8 +50,16 @@ class InnerPanel(wx.Panel): |
50 | 50 | splitter.SetOrientation(wx.VERTICAL) |
51 | 51 | self.splitter = splitter |
52 | 52 | |
53 | + panel = wx.Panel(self) | |
54 | + button = wx.Button(panel, -1, "Import medical images", (20, 20)) | |
55 | + | |
56 | + inner_sizer = wx.BoxSizer() | |
57 | + inner_sizer.Add(button, 0, wx.ALIGN_CENTER_HORIZONTAL, 40) | |
58 | + panel.SetSizer(inner_sizer) | |
59 | + | |
53 | 60 | sizer = wx.BoxSizer(wx.VERTICAL) |
54 | - sizer.Add(splitter, 1, wx.EXPAND) | |
61 | + sizer.Add(splitter, 20, wx.EXPAND) | |
62 | + sizer.Add(panel, 1, wx.EXPAND) | |
55 | 63 | |
56 | 64 | self.SetSizer(sizer) |
57 | 65 | sizer.Fit(self) | ... | ... |