Commit 2faf0f450ff1fa12b7ee1ce35283a04dd7542053
1 parent
4811ecf0
Exists in
master
and in
6 other branches
ENH: Advances in import panel (still under devel)
Showing
3 changed files
with
302 additions
and
110 deletions
Show diff stats
invesalius/gui/dicom_preview_panel.py
@@ -9,6 +9,13 @@ import vtkgdcm | @@ -9,6 +9,13 @@ import vtkgdcm | ||
9 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | 9 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor |
10 | from reader import dicom_reader | 10 | from reader import dicom_reader |
11 | 11 | ||
12 | + | ||
13 | + | ||
14 | +NROWS = 3 | ||
15 | +NCOLS = 6 | ||
16 | +MAX_VALUE = NCOLS*NROWS | ||
17 | + | ||
18 | + | ||
12 | myEVT_SELECT = wx.NewEventType() | 19 | myEVT_SELECT = wx.NewEventType() |
13 | # This event occurs when the user select a preview | 20 | # This event occurs when the user select a preview |
14 | EVT_SELECT = wx.PyEventBinder(myEVT_SELECT, 1) | 21 | EVT_SELECT = wx.PyEventBinder(myEVT_SELECT, 1) |
@@ -40,39 +47,67 @@ class Preview(wx.Panel): | @@ -40,39 +47,67 @@ class Preview(wx.Panel): | ||
40 | super(Preview, self).__init__(parent) | 47 | super(Preview, self).__init__(parent) |
41 | # Will it be white? | 48 | # Will it be white? |
42 | self.SetBackgroundColour((255, 255, 255)) | 49 | self.SetBackgroundColour((255, 255, 255)) |
43 | - self.sizer = wx.BoxSizer(wx.VERTICAL) | ||
44 | - self.SetSizer(self.sizer) | ||
45 | self._init_ui() | 50 | self._init_ui() |
46 | self._init_vtk() | 51 | self._init_vtk() |
47 | self._bind_events() | 52 | self._bind_events() |
48 | 53 | ||
49 | def _init_ui(self): | 54 | def _init_ui(self): |
55 | + | ||
50 | self.title = wx.StaticText(self, -1, "Image", | 56 | self.title = wx.StaticText(self, -1, "Image", |
51 | style=wx.ALIGN_CENTER) | 57 | style=wx.ALIGN_CENTER) |
52 | 58 | ||
53 | self.subtitle = wx.StaticText(self, -1, "Image", | 59 | self.subtitle = wx.StaticText(self, -1, "Image", |
54 | style=wx.ALIGN_CENTER) | 60 | style=wx.ALIGN_CENTER) |
55 | 61 | ||
56 | - self.interactor = wxVTKRenderWindowInteractor(self, -1, size=(70, 70)) | 62 | + self.panel = wx.Panel(self, -1) |
63 | + | ||
64 | + self.sizer = wx.BoxSizer(wx.VERTICAL) | ||
65 | + self.sizer.AddSpacer(2) | ||
66 | + self.sizer.Add(self.title, 1, wx.GROW|wx.EXPAND) | ||
67 | + self.sizer.Add(self.subtitle, 1, wx.GROW|wx.EXPAND) | ||
68 | + self.sizer.Add(self.panel, 5, wx.GROW|wx.EXPAND|wx.ALL, 4) | ||
69 | + self.sizer.Fit(self) | ||
70 | + | ||
71 | + | ||
72 | + self.SetSizer(self.sizer) | ||
73 | + | ||
74 | + | ||
75 | + self.Layout() | ||
76 | + self.Update() | ||
77 | + self.Fit() | ||
78 | + self.SetAutoLayout(1) | ||
57 | 79 | ||
58 | - self.sizer.Add(self.title, 0, wx.ALIGN_CENTER_HORIZONTAL) | ||
59 | - self.sizer.Add(self.subtitle, 0, wx.ALIGN_CENTER_HORIZONTAL) | ||
60 | - self.sizer.Add(self.interactor, 0, wx.ALIGN_CENTER_HORIZONTAL\ | ||
61 | - | wx.ALL, 5) | ||
62 | 80 | ||
63 | def _init_vtk(self): | 81 | def _init_vtk(self): |
82 | + | ||
83 | + self.interactor = wxVTKRenderWindowInteractor(self.panel, -1, size=(70, 70)) | ||
84 | + | ||
85 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
86 | + sizer.Add(self.interactor, 1, wx.GROW|wx.EXPAND) | ||
87 | + sizer.Fit(self.panel) | ||
88 | + | ||
89 | + self.panel.SetSizer(sizer) | ||
90 | + | ||
91 | + self.panel.Layout() | ||
92 | + self.panel.Update() | ||
93 | + self.panel.SetAutoLayout(1) | ||
94 | + | ||
64 | self.actor = vtk.vtkImageActor() | 95 | self.actor = vtk.vtkImageActor() |
65 | 96 | ||
66 | self.render = vtk.vtkRenderer() | 97 | self.render = vtk.vtkRenderer() |
98 | + self.render.AddActor(self.actor) | ||
67 | 99 | ||
68 | self.interactor.SetInteractorStyle(None) | 100 | self.interactor.SetInteractorStyle(None) |
69 | self.interactor.GetRenderWindow().AddRenderer(self.render) | 101 | self.interactor.GetRenderWindow().AddRenderer(self.render) |
70 | 102 | ||
71 | - self.render.AddActor(self.actor) | ||
72 | - | ||
73 | 103 | ||
74 | def _bind_events(self): | 104 | def _bind_events(self): |
75 | self.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) | 105 | self.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) |
106 | + self.interactor.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) | ||
107 | + self.panel.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) | ||
108 | + self.title.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) | ||
109 | + self.subtitle.Bind( wx.EVT_LEFT_DCLICK, self.OnSelect) | ||
110 | + | ||
76 | 111 | ||
77 | def OnSelect(self, evt): | 112 | def OnSelect(self, evt): |
78 | evt = PreviewEvent(myEVT_SELECT, self.GetId()) | 113 | evt = PreviewEvent(myEVT_SELECT, self.GetId()) |
@@ -91,6 +126,10 @@ class Preview(wx.Panel): | @@ -91,6 +126,10 @@ class Preview(wx.Panel): | ||
91 | """ | 126 | """ |
92 | self.SetTitle(image_file[3]) | 127 | self.SetTitle(image_file[3]) |
93 | self.SetSubtitle(image_file[4]) | 128 | self.SetSubtitle(image_file[4]) |
129 | + | ||
130 | + self.Layout() | ||
131 | + self.Update() | ||
132 | + | ||
94 | self.ID = image_file[5] | 133 | self.ID = image_file[5] |
95 | 134 | ||
96 | image_reader = vtkgdcm.vtkGDCMImageReader() | 135 | image_reader = vtkgdcm.vtkGDCMImageReader() |
@@ -117,7 +156,9 @@ class Preview(wx.Panel): | @@ -117,7 +156,9 @@ class Preview(wx.Panel): | ||
117 | cast.SetLevel(level) | 156 | cast.SetLevel(level) |
118 | self.actor.SetInput(cast.GetOutput()) | 157 | self.actor.SetInput(cast.GetOutput()) |
119 | self.render.ResetCamera() | 158 | self.render.ResetCamera() |
120 | - #self.interactor.Render() | 159 | + self.interactor.Render() |
160 | + | ||
161 | + | ||
121 | 162 | ||
122 | 163 | ||
123 | class DicomPreviewSeries(wx.Panel): | 164 | class DicomPreviewSeries(wx.Panel): |
@@ -126,28 +167,46 @@ class DicomPreviewSeries(wx.Panel): | @@ -126,28 +167,46 @@ class DicomPreviewSeries(wx.Panel): | ||
126 | super(DicomPreviewSeries, self).__init__(parent) | 167 | super(DicomPreviewSeries, self).__init__(parent) |
127 | # TODO: 3 pixels between the previews is a good idea? | 168 | # TODO: 3 pixels between the previews is a good idea? |
128 | # I have to test. | 169 | # I have to test. |
129 | - self.sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
130 | - self.SetSizer(self.sizer) | 170 | + #self.sizer = wx.BoxSizer(wx.HORIZONTAL) |
171 | + #self.SetSizer(self.sizer) | ||
131 | self.displayed_position = 0 | 172 | self.displayed_position = 0 |
132 | - self.files = [] | 173 | + self.nhidden_last_display = 0 |
133 | self._init_ui() | 174 | self._init_ui() |
134 | 175 | ||
135 | def _init_ui(self): | 176 | def _init_ui(self): |
136 | - self.scroll = wx.ScrollBar(self, style=wx.SB_VERTICAL) | ||
137 | - self.grid = wx.GridSizer(rows=3, cols=5, vgap=3, hgap=3) | ||
138 | - self.sizer.Add(self.grid) | ||
139 | - self.sizer.Add(self.scroll, 0, wx.EXPAND) | 177 | + |
178 | + scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) | ||
179 | + self.scroll = scroll | ||
180 | + | ||
181 | + self.grid = wx.GridSizer(rows=NROWS, cols=NCOLS, vgap=3, hgap=3) | ||
182 | + | ||
183 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
184 | + sizer.AddSizer(self.grid, 1, wx.EXPAND|wx.GROW|wx.ALL, 2) | ||
185 | + | ||
186 | + background_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
187 | + background_sizer.AddSizer(sizer, 1, wx.EXPAND|wx.GROW|wx.ALL, 2) | ||
188 | + background_sizer.Add(scroll, 0, wx.EXPAND|wx.GROW) | ||
189 | + self.SetSizer(background_sizer) | ||
190 | + background_sizer.Fit(self) | ||
191 | + | ||
192 | + | ||
193 | + self.Layout() | ||
194 | + self.Update() | ||
195 | + self.SetAutoLayout(1) | ||
196 | + | ||
197 | + self.sizer = background_sizer | ||
198 | + | ||
140 | self._Add_Panels_Preview() | 199 | self._Add_Panels_Preview() |
141 | self._bind_events() | 200 | self._bind_events() |
142 | 201 | ||
143 | def _Add_Panels_Preview(self): | 202 | def _Add_Panels_Preview(self): |
144 | self.previews = [] | 203 | self.previews = [] |
145 | - for i in xrange(3): | ||
146 | - for j in xrange(5): | 204 | + for i in xrange(NROWS): |
205 | + for j in xrange(NCOLS): | ||
147 | p = Preview(self) | 206 | p = Preview(self) |
148 | - p.Hide() | 207 | + #p.Hide() |
149 | self.previews.append(p) | 208 | self.previews.append(p) |
150 | - self.grid.Add(p, i, j) | 209 | + self.grid.Add(p, 1, flag=wx.EXPAND) |
151 | 210 | ||
152 | def _bind_events(self): | 211 | def _bind_events(self): |
153 | # When the user scrolls the window | 212 | # When the user scrolls the window |
@@ -160,7 +219,11 @@ class DicomPreviewSeries(wx.Panel): | @@ -160,7 +219,11 @@ class DicomPreviewSeries(wx.Panel): | ||
160 | self.GetEventHandler().ProcessEvent(my_evt) | 219 | self.GetEventHandler().ProcessEvent(my_evt) |
161 | 220 | ||
162 | def SetPatientGroups(self, patient): | 221 | def SetPatientGroups(self, patient): |
222 | + self.files = [] | ||
223 | + self.displayed_position = 0 | ||
224 | + self.nhidden_last_display = 0 | ||
163 | group_list = patient.GetGroups() | 225 | group_list = patient.GetGroups() |
226 | + print "LEN:", len(group_list) | ||
164 | n = 0 | 227 | n = 0 |
165 | for group in group_list: | 228 | for group in group_list: |
166 | info = (group.dicom.image.file, | 229 | info = (group.dicom.image.file, |
@@ -172,47 +235,50 @@ class DicomPreviewSeries(wx.Panel): | @@ -172,47 +235,50 @@ class DicomPreviewSeries(wx.Panel): | ||
172 | self.files.append(info) | 235 | self.files.append(info) |
173 | n+=1 | 236 | n+=1 |
174 | 237 | ||
175 | - scroll_range = len(self.files)/5 | ||
176 | - if scroll_range * 5 < len(self.files): | 238 | + scroll_range = len(self.files)/NCOLS |
239 | + if scroll_range * NCOLS < len(self.files): | ||
177 | scroll_range +=1 | 240 | scroll_range +=1 |
178 | - self.scroll.SetScrollbar(0, 3, scroll_range, 5) | 241 | + self.scroll.SetScrollbar(0, NROWS, scroll_range, NCOLS) |
242 | + self._display_previews() | ||
243 | + | ||
244 | + def _display_previews(self): | ||
245 | + initial = self.displayed_position * NCOLS | ||
246 | + final = initial + MAX_VALUE | ||
247 | + print "len:", len(self.files) | ||
248 | + | ||
249 | + if len(self.files) < final: | ||
250 | + for i in xrange(final-len(self.files)): | ||
251 | + print "hide ", i | ||
252 | + try: | ||
253 | + self.previews[-i-1].Hide() | ||
254 | + except IndexError: | ||
255 | + #print "doesn't exist!" | ||
256 | + pass | ||
257 | + self.nhidden_last_display = final-len(self.files) | ||
258 | + else: | ||
259 | + if self.nhidden_last_display: | ||
260 | + for i in xrange(self.nhidden_last_display): | ||
261 | + try: | ||
262 | + self.previews[-i-1].Show() | ||
263 | + except IndexError: | ||
264 | + #print "doesn't exist!" | ||
265 | + pass | ||
266 | + self.nhidden_last_display = 0 | ||
179 | 267 | ||
180 | - self._Display_Previews() | ||
181 | 268 | ||
182 | 269 | ||
183 | - def SetDicomDirectoryOld(self, directory): | ||
184 | - import time | ||
185 | - a = time.time() | ||
186 | - self.directory = directory | ||
187 | - self.series = dicom_reader.GetSeries(directory)[0] | ||
188 | - b = time.time() | ||
189 | - # TODO: I need to improve this | ||
190 | - self.files = [(self.series[i][0][0][8], # Filename | ||
191 | - self.series[i][0][0][12], # Window Level | ||
192 | - self.series[i][0][0][13], # Window Width | ||
193 | - "Serie %d" % (n + 1), # Title | ||
194 | - "%d Images" % len(self.series[i][0]), # Subtitle | ||
195 | - n) for n, i in enumerate(self.series)] | ||
196 | - | ||
197 | - scroll_range = len(self.files)/5 | ||
198 | - if scroll_range * 5 < len(self.files): | ||
199 | - scroll_range +=1 | ||
200 | - self.scroll.SetScrollbar(0, 3, scroll_range, 5) | ||
201 | - | ||
202 | - self._Display_Previews() | ||
203 | - | ||
204 | - def _Display_Previews(self): | ||
205 | - initial = self.displayed_position * 5 | ||
206 | - final = initial + 15 | ||
207 | for f, p in zip(self.files[initial:final], self.previews): | 270 | for f, p in zip(self.files[initial:final], self.previews): |
208 | p.SetImage(f) | 271 | p.SetImage(f) |
272 | + #p.interactor.Render() | ||
273 | + | ||
274 | + for f, p in zip(self.files[initial:final], self.previews): | ||
209 | p.Show() | 275 | p.Show() |
210 | 276 | ||
211 | - def OnScroll(self, evt): | ||
212 | - self.displayed_position = evt.GetPosition() | ||
213 | - [i.Hide() for i in self.previews] | ||
214 | - self._Display_Previews() | ||
215 | 277 | ||
278 | + def OnScroll(self, evt): | ||
279 | + if self.displayed_position != evt.GetPosition(): | ||
280 | + self.displayed_position = evt.GetPosition() | ||
281 | + self._display_previews() | ||
216 | 282 | ||
217 | class DicomPreview(wx.Panel): | 283 | class DicomPreview(wx.Panel): |
218 | """A dicom preview panel""" | 284 | """A dicom preview panel""" |
@@ -220,28 +286,44 @@ class DicomPreview(wx.Panel): | @@ -220,28 +286,44 @@ class DicomPreview(wx.Panel): | ||
220 | super(DicomPreview, self).__init__(parent) | 286 | super(DicomPreview, self).__init__(parent) |
221 | # TODO: 3 pixels between the previews is a good idea? | 287 | # TODO: 3 pixels between the previews is a good idea? |
222 | # I have to test. | 288 | # I have to test. |
223 | - self.sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
224 | - self.SetSizer(self.sizer) | ||
225 | self.displayed_position = 0 | 289 | self.displayed_position = 0 |
226 | - self.files = [] | 290 | + self.nhidden_last_display = 0 |
227 | self._init_ui() | 291 | self._init_ui() |
228 | 292 | ||
293 | + | ||
229 | def _init_ui(self): | 294 | def _init_ui(self): |
230 | - self.scroll = wx.ScrollBar(self, style=wx.SB_VERTICAL) | ||
231 | - self.grid = wx.GridSizer(rows=3, cols=5, vgap=3, hgap=3) | ||
232 | - self.sizer.Add(self.grid) | ||
233 | - self.sizer.Add(self.scroll, 0, wx.EXPAND) | 295 | + scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) |
296 | + self.scroll = scroll | ||
297 | + | ||
298 | + self.grid = wx.GridSizer(rows=NROWS, cols=NCOLS, vgap=3, hgap=3) | ||
299 | + | ||
300 | + sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
301 | + sizer.AddSizer(self.grid, 1, wx.EXPAND|wx.GROW|wx.ALL, 2) | ||
302 | + | ||
303 | + background_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
304 | + background_sizer.AddSizer(sizer, 1, wx.EXPAND|wx.GROW|wx.ALL, 2) | ||
305 | + background_sizer.Add(scroll, 0, wx.EXPAND|wx.GROW) | ||
306 | + self.SetSizer(background_sizer) | ||
307 | + background_sizer.Fit(self) | ||
308 | + | ||
309 | + | ||
310 | + self.Layout() | ||
311 | + self.Update() | ||
312 | + self.SetAutoLayout(1) | ||
313 | + | ||
314 | + self.sizer = background_sizer | ||
315 | + | ||
234 | self._Add_Panels_Preview() | 316 | self._Add_Panels_Preview() |
235 | self._bind_events() | 317 | self._bind_events() |
236 | 318 | ||
237 | def _Add_Panels_Preview(self): | 319 | def _Add_Panels_Preview(self): |
238 | self.previews = [] | 320 | self.previews = [] |
239 | - for i in xrange(3): | ||
240 | - for j in xrange(5): | 321 | + for i in xrange(NROWS): |
322 | + for j in xrange(NCOLS): | ||
241 | p = Preview(self) | 323 | p = Preview(self) |
242 | - p.Hide() | 324 | + #p.Hide() |
243 | self.previews.append(p) | 325 | self.previews.append(p) |
244 | - self.grid.Add(p, i, j) | 326 | + self.grid.Add(p, 1, flag=wx.EXPAND) |
245 | 327 | ||
246 | def _bind_events(self): | 328 | def _bind_events(self): |
247 | # When the user scrolls the window | 329 | # When the user scrolls the window |
@@ -255,6 +337,9 @@ class DicomPreview(wx.Panel): | @@ -255,6 +337,9 @@ class DicomPreview(wx.Panel): | ||
255 | self.group_list = patient.GetGroups() | 337 | self.group_list = patient.GetGroups() |
256 | 338 | ||
257 | def SetDicomSerie(self, pos): | 339 | def SetDicomSerie(self, pos): |
340 | + self.files = [] | ||
341 | + self.displayed_position = 0 | ||
342 | + self.nhidden_last_display = 0 | ||
258 | group = self.group_list[pos] | 343 | group = self.group_list[pos] |
259 | #dicom_files = group.GetList() | 344 | #dicom_files = group.GetList() |
260 | dicom_files = group.GetHandSortedList() | 345 | dicom_files = group.GetHandSortedList() |
@@ -269,37 +354,71 @@ class DicomPreview(wx.Panel): | @@ -269,37 +354,71 @@ class DicomPreview(wx.Panel): | ||
269 | self.files.append(info) | 354 | self.files.append(info) |
270 | n+=1 | 355 | n+=1 |
271 | 356 | ||
272 | - scroll_range = len(self.files)/5 | ||
273 | - if scroll_range * 5 < len(self.files): | 357 | + scroll_range = len(self.files)/NCOLS |
358 | + if scroll_range * NCOLS < len(self.files): | ||
274 | scroll_range +=1 | 359 | scroll_range +=1 |
275 | - self.scroll.SetScrollbar(0, 3, scroll_range, 5) | ||
276 | - self._Display_Previews() | ||
277 | - | ||
278 | - def SetDicomSerieOld(self, serie): | ||
279 | - k = self.series.keys()[serie] | ||
280 | - self.files = [(i[8], | ||
281 | - i[12], | ||
282 | - i[13], | ||
283 | - "Serie %d" % (n + 1), # Title | ||
284 | - "%d Images" % n, # Subtitle | ||
285 | - n)for n, i in enumerate(self.series[k][0])] | ||
286 | - scroll_range = len(self.files)/5 | ||
287 | - if scroll_range * 5 < len(self.files): | 360 | + self.scroll.SetScrollbar(0, NROWS, scroll_range, NCOLS) |
361 | + | ||
362 | + self._display_previews() | ||
363 | + | ||
364 | + def SetDicomGroup(self, group): | ||
365 | + self.files = [] | ||
366 | + self.displayed_position = 0 | ||
367 | + self.nhidden_last_display = 0 | ||
368 | + #dicom_files = group.GetList() | ||
369 | + dicom_files = group.GetHandSortedList() | ||
370 | + n = 0 | ||
371 | + for dicom in dicom_files: | ||
372 | + info = (dicom.image.file, | ||
373 | + dicom.image.window, | ||
374 | + dicom.image.level, | ||
375 | + "Image %d" % (dicom.image.number), | ||
376 | + "%.2f" % (dicom.image.position[2]), | ||
377 | + n) | ||
378 | + self.files.append(info) | ||
379 | + n+=1 | ||
380 | + | ||
381 | + scroll_range = len(self.files)/NCOLS | ||
382 | + if scroll_range * NCOLS < len(self.files): | ||
288 | scroll_range +=1 | 383 | scroll_range +=1 |
289 | - self.scroll.SetScrollbar(0, 3, scroll_range, 5) | ||
290 | - self._Display_Previews() | 384 | + self.scroll.SetScrollbar(0, NROWS, scroll_range, NCOLS) |
385 | + | ||
386 | + self._display_previews() | ||
387 | + | ||
388 | + | ||
389 | + def _display_previews(self): | ||
390 | + initial = self.displayed_position * NCOLS | ||
391 | + final = initial + MAX_VALUE | ||
392 | + print "len:", len(self.files) | ||
393 | + | ||
394 | + if len(self.files) < final: | ||
395 | + for i in xrange(final-len(self.files)): | ||
396 | + print "hide ", i | ||
397 | + try: | ||
398 | + self.previews[-i-1].Hide() | ||
399 | + except IndexError: | ||
400 | + #print "doesn't exist!" | ||
401 | + pass | ||
402 | + self.nhidden_last_display = final-len(self.files) | ||
403 | + else: | ||
404 | + if self.nhidden_last_display: | ||
405 | + for i in xrange(self.nhidden_last_display): | ||
406 | + try: | ||
407 | + self.previews[-i-1].Show() | ||
408 | + except IndexError: | ||
409 | + #print "doesn't exist!" | ||
410 | + pass | ||
411 | + self.nhidden_last_display = 0 | ||
291 | 412 | ||
292 | - def _Display_Previews(self): | ||
293 | - initial = self.displayed_position * 5 | ||
294 | - final = initial + 15 | ||
295 | for f, p in zip(self.files[initial:final], self.previews): | 413 | for f, p in zip(self.files[initial:final], self.previews): |
296 | p.SetImage(f) | 414 | p.SetImage(f) |
415 | + #p.interactor.Render() | ||
416 | + | ||
417 | + for f, p in zip(self.files[initial:final], self.previews): | ||
297 | p.Show() | 418 | p.Show() |
298 | 419 | ||
299 | - def OnScroll(self, evt): | ||
300 | - self.displayed_position = evt.GetPosition() | ||
301 | - [i.Hide() for i in self.previews] | ||
302 | - self._Display_Previews() | ||
303 | - self.Update() | ||
304 | - self.Update() | ||
305 | 420 | ||
421 | + def OnScroll(self, evt): | ||
422 | + if self.displayed_position != evt.GetPosition(): | ||
423 | + self.displayed_position = evt.GetPosition() | ||
424 | + self._display_previews() |
invesalius/gui/import_panel.py
@@ -4,21 +4,29 @@ import wx.lib.pubsub as ps | @@ -4,21 +4,29 @@ import wx.lib.pubsub as ps | ||
4 | import wx.lib.splitter as spl | 4 | import wx.lib.splitter as spl |
5 | 5 | ||
6 | import dicom_preview_panel as dpp | 6 | import dicom_preview_panel as dpp |
7 | +import reader.dicom_grouper as dcm | ||
7 | 8 | ||
8 | class Panel(wx.Panel): | 9 | class Panel(wx.Panel): |
9 | def __init__(self, parent): | 10 | def __init__(self, parent): |
10 | - wx.Panel.__init__(self, parent, pos=wx.Point(5, 5), | ||
11 | - size=wx.Size(280, 656)) | 11 | + wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, |
12 | + #size=wx.Size(280, 656)) | ||
12 | 13 | ||
13 | sizer = wx.BoxSizer(wx.VERTICAL) | 14 | sizer = wx.BoxSizer(wx.VERTICAL) |
14 | sizer.Add(InnerPanel(self), 1, wx.EXPAND|wx.GROW|wx.ALL, 5) | 15 | sizer.Add(InnerPanel(self), 1, wx.EXPAND|wx.GROW|wx.ALL, 5) |
16 | + | ||
15 | self.SetSizer(sizer) | 17 | self.SetSizer(sizer) |
18 | + sizer.Fit(self) | ||
19 | + | ||
20 | + self.Layout() | ||
21 | + self.Update() | ||
22 | + self.SetAutoLayout(1) | ||
23 | + | ||
16 | 24 | ||
17 | # Inner fold panel | 25 | # Inner fold panel |
18 | class InnerPanel(wx.Panel): | 26 | class InnerPanel(wx.Panel): |
19 | def __init__(self, parent): | 27 | def __init__(self, parent): |
20 | - wx.Panel.__init__(self, parent, pos=wx.Point(5, 5), | ||
21 | - size=wx.Size(680, 656)) | 28 | + wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, |
29 | + #size=wx.Size(680, 656)) | ||
22 | 30 | ||
23 | splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) | 31 | splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) |
24 | splitter.SetOrientation(wx.VERTICAL) | 32 | splitter.SetOrientation(wx.VERTICAL) |
@@ -26,8 +34,14 @@ class InnerPanel(wx.Panel): | @@ -26,8 +34,14 @@ class InnerPanel(wx.Panel): | ||
26 | 34 | ||
27 | sizer = wx.BoxSizer(wx.VERTICAL) | 35 | sizer = wx.BoxSizer(wx.VERTICAL) |
28 | sizer.Add(splitter, 1, wx.EXPAND) | 36 | sizer.Add(splitter, 1, wx.EXPAND) |
37 | + | ||
29 | self.SetSizer(sizer) | 38 | self.SetSizer(sizer) |
30 | - | 39 | + sizer.Fit(self) |
40 | + | ||
41 | + self.Layout() | ||
42 | + self.Update() | ||
43 | + self.SetAutoLayout(1) | ||
44 | + | ||
31 | self.text_panel = TextPanel(splitter) | 45 | self.text_panel = TextPanel(splitter) |
32 | splitter.AppendWindow(self.text_panel, 250) | 46 | splitter.AppendWindow(self.text_panel, 250) |
33 | 47 | ||
@@ -105,10 +119,10 @@ class TextPanel(wx.Panel): | @@ -105,10 +119,10 @@ class TextPanel(wx.Panel): | ||
105 | parent = tree.AppendItem(self.root, title) | 119 | parent = tree.AppendItem(self.root, title) |
106 | 120 | ||
107 | if not first: | 121 | if not first: |
108 | - tree.SelectItem(parent) | 122 | + parent_select = parent |
109 | first += 1 | 123 | first += 1 |
110 | 124 | ||
111 | - | 125 | + tree.SetItemPyData(parent, patient) |
112 | tree.SetItemText(parent, str(dicom.patient.id), 1) | 126 | tree.SetItemText(parent, str(dicom.patient.id), 1) |
113 | tree.SetItemText(parent, str(dicom.patient.age), 2) | 127 | tree.SetItemText(parent, str(dicom.patient.age), 2) |
114 | tree.SetItemText(parent, str(dicom.patient.gender), 3) | 128 | tree.SetItemText(parent, str(dicom.patient.gender), 3) |
@@ -136,17 +150,37 @@ class TextPanel(wx.Panel): | @@ -136,17 +150,37 @@ class TextPanel(wx.Panel): | ||
136 | 150 | ||
137 | tree.Expand(self.root) | 151 | tree.Expand(self.root) |
138 | 152 | ||
153 | + tree.SelectItem(parent_select) | ||
154 | + | ||
139 | tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate) | 155 | tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate) |
156 | + tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged) | ||
157 | + | ||
158 | + | ||
159 | + def OnSelChanged(self, evt): | ||
160 | + print "OnLeftUp" | ||
161 | + item = self.tree.GetSelection() | ||
162 | + group = self.tree.GetItemPyData(item) | ||
163 | + if isinstance(group, dcm.DicomGroup): | ||
164 | + print " :)" | ||
165 | + ps.Publisher().sendMessage('Load group into import panel', | ||
166 | + group) | ||
167 | + elif isinstance(group, dcm.PatientGroup): | ||
168 | + print " :) patient" | ||
169 | + ps.Publisher().sendMessage('Load patient into import panel', | ||
170 | + group) | ||
171 | + | ||
172 | + else: | ||
173 | + print " :(" | ||
174 | + | ||
175 | + | ||
140 | 176 | ||
141 | def OnActivate(self, evt): | 177 | def OnActivate(self, evt): |
142 | print "OnActivate" | 178 | print "OnActivate" |
143 | item = evt.GetItem() | 179 | item = evt.GetItem() |
144 | group = self.tree.GetItemPyData(item) | 180 | group = self.tree.GetItemPyData(item) |
145 | - if group: | ||
146 | - print "send" | 181 | + if isinstance(group, dcm.DicomGroup): |
147 | ps.Publisher().sendMessage('Open DICOM group', | 182 | ps.Publisher().sendMessage('Open DICOM group', |
148 | group) | 183 | group) |
149 | - | ||
150 | else: | 184 | else: |
151 | if self.tree.IsExpanded(item): | 185 | if self.tree.IsExpanded(item): |
152 | self.tree.Collapse(item) | 186 | self.tree.Collapse(item) |
@@ -155,7 +189,10 @@ class TextPanel(wx.Panel): | @@ -155,7 +189,10 @@ class TextPanel(wx.Panel): | ||
155 | 189 | ||
156 | def OnSize(self, evt): | 190 | def OnSize(self, evt): |
157 | self.tree.SetSize(self.GetSize()) | 191 | self.tree.SetSize(self.GetSize()) |
158 | - | 192 | + |
193 | + | ||
194 | + | ||
195 | + | ||
159 | class ImagePanel(wx.Panel): | 196 | class ImagePanel(wx.Panel): |
160 | def __init__(self, parent): | 197 | def __init__(self, parent): |
161 | wx.Panel.__init__(self, parent, -1) | 198 | wx.Panel.__init__(self, parent, -1) |
@@ -174,6 +211,14 @@ class ImagePanel(wx.Panel): | @@ -174,6 +211,14 @@ class ImagePanel(wx.Panel): | ||
174 | 211 | ||
175 | self.image_panel = SlicePanel(splitter) | 212 | self.image_panel = SlicePanel(splitter) |
176 | splitter.AppendWindow(self.image_panel, 250) | 213 | splitter.AppendWindow(self.image_panel, 250) |
214 | + | ||
215 | + | ||
216 | + self.SetSizer(sizer) | ||
217 | + sizer.Fit(self) | ||
218 | + | ||
219 | + self.Layout() | ||
220 | + self.Update() | ||
221 | + self.SetAutoLayout(1) | ||
177 | 222 | ||
178 | class SeriesPanel(wx.Panel): | 223 | class SeriesPanel(wx.Panel): |
179 | def __init__(self, parent): | 224 | def __init__(self, parent): |
@@ -184,31 +229,58 @@ class SeriesPanel(wx.Panel): | @@ -184,31 +229,58 @@ class SeriesPanel(wx.Panel): | ||
184 | self.dicom_preview = dpp.DicomPreview(self) | 229 | self.dicom_preview = dpp.DicomPreview(self) |
185 | self.dicom_preview.Show(0) | 230 | self.dicom_preview.Show(0) |
186 | 231 | ||
187 | - self.sizer = wx.BoxSizer(wx.VERTICAL) | 232 | + self.sizer = wx.BoxSizer(wx.HORIZONTAL) |
188 | self.sizer.Add(self.serie_preview, 1, wx.EXPAND | wx.ALL, 5) | 233 | self.sizer.Add(self.serie_preview, 1, wx.EXPAND | wx.ALL, 5) |
189 | self.sizer.Add(self.dicom_preview, 1, wx.EXPAND | wx.ALL, 5) | 234 | self.sizer.Add(self.dicom_preview, 1, wx.EXPAND | wx.ALL, 5) |
190 | self.sizer.Fit(self) | 235 | self.sizer.Fit(self) |
191 | 236 | ||
237 | + | ||
192 | self.SetSizer(self.sizer) | 238 | self.SetSizer(self.sizer) |
193 | - self.SetAutoLayout(True) | ||
194 | - self.Show() | ||
195 | 239 | ||
196 | 240 | ||
241 | + self.Layout() | ||
242 | + self.Update() | ||
243 | + self.SetAutoLayout(1) | ||
244 | + | ||
197 | self.__bind_evt() | 245 | self.__bind_evt() |
198 | self._bind_gui_evt() | 246 | self._bind_gui_evt() |
199 | 247 | ||
200 | def __bind_evt(self): | 248 | def __bind_evt(self): |
201 | - ps.Publisher().subscribe(self.ShowDicomSeries, "Load dicom preview") | 249 | + ps.Publisher().subscribe(self.ShowDicomSeries, 'Load dicom preview') |
250 | + ps.Publisher().subscribe(self.SetDicomSeries, 'Load group into import panel') | ||
251 | + ps.Publisher().subscribe(self.SetPatientSeries, 'Load patient into import panel') | ||
202 | 252 | ||
203 | def _bind_gui_evt(self): | 253 | def _bind_gui_evt(self): |
204 | self.Bind(dpp.EVT_SELECT_SERIE, self.OnSelectSerie) | 254 | self.Bind(dpp.EVT_SELECT_SERIE, self.OnSelectSerie) |
205 | 255 | ||
256 | + def SetDicomSeries(self, pubsub_evt): | ||
257 | + group = pubsub_evt.data | ||
258 | + print "X" | ||
259 | + self.dicom_preview.Show(1) | ||
260 | + self.serie_preview.Show(0) | ||
261 | + self.dicom_preview.SetDicomGroup(group) | ||
262 | + self.Update() | ||
263 | + | ||
264 | + | ||
265 | + def SetPatientSeries(self, pubsub_evt): | ||
266 | + print "Z" | ||
267 | + patient = pubsub_evt.data | ||
268 | + | ||
269 | + self.dicom_preview.Show(0) | ||
270 | + self.serie_preview.Show(1) | ||
271 | + | ||
272 | + | ||
273 | + self.serie_preview.SetPatientGroups(patient) | ||
274 | + self.dicom_preview.SetPatientGroups(patient) | ||
275 | + | ||
276 | + self.Update() | ||
277 | + | ||
278 | + | ||
206 | def OnSelectSerie(self, evt): | 279 | def OnSelectSerie(self, evt): |
207 | serie = evt.GetSelectID() | 280 | serie = evt.GetSelectID() |
208 | self.dicom_preview.SetDicomSerie(serie) | 281 | self.dicom_preview.SetDicomSerie(serie) |
209 | 282 | ||
210 | self.dicom_preview.Show(1) | 283 | self.dicom_preview.Show(1) |
211 | - #self.sizer.Detach(self.serie_preview) | ||
212 | self.serie_preview.Show(0) | 284 | self.serie_preview.Show(0) |
213 | self.sizer.Layout() | 285 | self.sizer.Layout() |
214 | #self.Show() | 286 | #self.Show() |
@@ -217,9 +289,9 @@ class SeriesPanel(wx.Panel): | @@ -217,9 +289,9 @@ class SeriesPanel(wx.Panel): | ||
217 | 289 | ||
218 | def ShowDicomSeries(self, pubsub_evt): | 290 | def ShowDicomSeries(self, pubsub_evt): |
219 | print "---- ShowDicomSeries ----" | 291 | print "---- ShowDicomSeries ----" |
220 | - first_patient = pubsub_evt.data | ||
221 | - self.serie_preview.SetPatientGroups(first_patient) | ||
222 | - self.dicom_preview.SetPatientGroups(first_patient) | 292 | + patient = pubsub_evt.data |
293 | + self.serie_preview.SetPatientGroups(patient) | ||
294 | + self.dicom_preview.SetPatientGroups(patient) | ||
223 | 295 | ||
224 | 296 | ||
225 | 297 |
invesalius/reader/dicom_grouper.py
@@ -125,7 +125,8 @@ class DicomGroup: | @@ -125,7 +125,8 @@ class DicomGroup: | ||
125 | list_ = self.slices_dict.values() | 125 | list_ = self.slices_dict.values() |
126 | dicom = list_[0] | 126 | dicom = list_[0] |
127 | axis = ORIENT_MAP[dicom.image.orientation_label] | 127 | axis = ORIENT_MAP[dicom.image.orientation_label] |
128 | - list_ = sorted(list_, key = lambda dicom:dicom.image.position[axis]) | 128 | + #list_ = sorted(list_, key = lambda dicom:dicom.image.position[axis]) |
129 | + list_ = sorted(list_, key = lambda dicom:dicom.image.number) | ||
129 | return list_ | 130 | return list_ |
130 | 131 | ||
131 | def UpdateZSpacing(self): | 132 | def UpdateZSpacing(self): |