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 | 9 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor |
10 | 10 | from reader import dicom_reader |
11 | 11 | |
12 | + | |
13 | + | |
14 | +NROWS = 3 | |
15 | +NCOLS = 6 | |
16 | +MAX_VALUE = NCOLS*NROWS | |
17 | + | |
18 | + | |
12 | 19 | myEVT_SELECT = wx.NewEventType() |
13 | 20 | # This event occurs when the user select a preview |
14 | 21 | EVT_SELECT = wx.PyEventBinder(myEVT_SELECT, 1) |
... | ... | @@ -40,39 +47,67 @@ class Preview(wx.Panel): |
40 | 47 | super(Preview, self).__init__(parent) |
41 | 48 | # Will it be white? |
42 | 49 | self.SetBackgroundColour((255, 255, 255)) |
43 | - self.sizer = wx.BoxSizer(wx.VERTICAL) | |
44 | - self.SetSizer(self.sizer) | |
45 | 50 | self._init_ui() |
46 | 51 | self._init_vtk() |
47 | 52 | self._bind_events() |
48 | 53 | |
49 | 54 | def _init_ui(self): |
55 | + | |
50 | 56 | self.title = wx.StaticText(self, -1, "Image", |
51 | 57 | style=wx.ALIGN_CENTER) |
52 | 58 | |
53 | 59 | self.subtitle = wx.StaticText(self, -1, "Image", |
54 | 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 | 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 | 95 | self.actor = vtk.vtkImageActor() |
65 | 96 | |
66 | 97 | self.render = vtk.vtkRenderer() |
98 | + self.render.AddActor(self.actor) | |
67 | 99 | |
68 | 100 | self.interactor.SetInteractorStyle(None) |
69 | 101 | self.interactor.GetRenderWindow().AddRenderer(self.render) |
70 | 102 | |
71 | - self.render.AddActor(self.actor) | |
72 | - | |
73 | 103 | |
74 | 104 | def _bind_events(self): |
75 | 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 | 112 | def OnSelect(self, evt): |
78 | 113 | evt = PreviewEvent(myEVT_SELECT, self.GetId()) |
... | ... | @@ -91,6 +126,10 @@ class Preview(wx.Panel): |
91 | 126 | """ |
92 | 127 | self.SetTitle(image_file[3]) |
93 | 128 | self.SetSubtitle(image_file[4]) |
129 | + | |
130 | + self.Layout() | |
131 | + self.Update() | |
132 | + | |
94 | 133 | self.ID = image_file[5] |
95 | 134 | |
96 | 135 | image_reader = vtkgdcm.vtkGDCMImageReader() |
... | ... | @@ -117,7 +156,9 @@ class Preview(wx.Panel): |
117 | 156 | cast.SetLevel(level) |
118 | 157 | self.actor.SetInput(cast.GetOutput()) |
119 | 158 | self.render.ResetCamera() |
120 | - #self.interactor.Render() | |
159 | + self.interactor.Render() | |
160 | + | |
161 | + | |
121 | 162 | |
122 | 163 | |
123 | 164 | class DicomPreviewSeries(wx.Panel): |
... | ... | @@ -126,28 +167,46 @@ class DicomPreviewSeries(wx.Panel): |
126 | 167 | super(DicomPreviewSeries, self).__init__(parent) |
127 | 168 | # TODO: 3 pixels between the previews is a good idea? |
128 | 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 | 172 | self.displayed_position = 0 |
132 | - self.files = [] | |
173 | + self.nhidden_last_display = 0 | |
133 | 174 | self._init_ui() |
134 | 175 | |
135 | 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 | 199 | self._Add_Panels_Preview() |
141 | 200 | self._bind_events() |
142 | 201 | |
143 | 202 | def _Add_Panels_Preview(self): |
144 | 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 | 206 | p = Preview(self) |
148 | - p.Hide() | |
207 | + #p.Hide() | |
149 | 208 | self.previews.append(p) |
150 | - self.grid.Add(p, i, j) | |
209 | + self.grid.Add(p, 1, flag=wx.EXPAND) | |
151 | 210 | |
152 | 211 | def _bind_events(self): |
153 | 212 | # When the user scrolls the window |
... | ... | @@ -160,7 +219,11 @@ class DicomPreviewSeries(wx.Panel): |
160 | 219 | self.GetEventHandler().ProcessEvent(my_evt) |
161 | 220 | |
162 | 221 | def SetPatientGroups(self, patient): |
222 | + self.files = [] | |
223 | + self.displayed_position = 0 | |
224 | + self.nhidden_last_display = 0 | |
163 | 225 | group_list = patient.GetGroups() |
226 | + print "LEN:", len(group_list) | |
164 | 227 | n = 0 |
165 | 228 | for group in group_list: |
166 | 229 | info = (group.dicom.image.file, |
... | ... | @@ -172,47 +235,50 @@ class DicomPreviewSeries(wx.Panel): |
172 | 235 | self.files.append(info) |
173 | 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 | 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 | 270 | for f, p in zip(self.files[initial:final], self.previews): |
208 | 271 | p.SetImage(f) |
272 | + #p.interactor.Render() | |
273 | + | |
274 | + for f, p in zip(self.files[initial:final], self.previews): | |
209 | 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 | 283 | class DicomPreview(wx.Panel): |
218 | 284 | """A dicom preview panel""" |
... | ... | @@ -220,28 +286,44 @@ class DicomPreview(wx.Panel): |
220 | 286 | super(DicomPreview, self).__init__(parent) |
221 | 287 | # TODO: 3 pixels between the previews is a good idea? |
222 | 288 | # I have to test. |
223 | - self.sizer = wx.BoxSizer(wx.HORIZONTAL) | |
224 | - self.SetSizer(self.sizer) | |
225 | 289 | self.displayed_position = 0 |
226 | - self.files = [] | |
290 | + self.nhidden_last_display = 0 | |
227 | 291 | self._init_ui() |
228 | 292 | |
293 | + | |
229 | 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 | 316 | self._Add_Panels_Preview() |
235 | 317 | self._bind_events() |
236 | 318 | |
237 | 319 | def _Add_Panels_Preview(self): |
238 | 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 | 323 | p = Preview(self) |
242 | - p.Hide() | |
324 | + #p.Hide() | |
243 | 325 | self.previews.append(p) |
244 | - self.grid.Add(p, i, j) | |
326 | + self.grid.Add(p, 1, flag=wx.EXPAND) | |
245 | 327 | |
246 | 328 | def _bind_events(self): |
247 | 329 | # When the user scrolls the window |
... | ... | @@ -255,6 +337,9 @@ class DicomPreview(wx.Panel): |
255 | 337 | self.group_list = patient.GetGroups() |
256 | 338 | |
257 | 339 | def SetDicomSerie(self, pos): |
340 | + self.files = [] | |
341 | + self.displayed_position = 0 | |
342 | + self.nhidden_last_display = 0 | |
258 | 343 | group = self.group_list[pos] |
259 | 344 | #dicom_files = group.GetList() |
260 | 345 | dicom_files = group.GetHandSortedList() |
... | ... | @@ -269,37 +354,71 @@ class DicomPreview(wx.Panel): |
269 | 354 | self.files.append(info) |
270 | 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 | 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 | 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 | 413 | for f, p in zip(self.files[initial:final], self.previews): |
296 | 414 | p.SetImage(f) |
415 | + #p.interactor.Render() | |
416 | + | |
417 | + for f, p in zip(self.files[initial:final], self.previews): | |
297 | 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 | 4 | import wx.lib.splitter as spl |
5 | 5 | |
6 | 6 | import dicom_preview_panel as dpp |
7 | +import reader.dicom_grouper as dcm | |
7 | 8 | |
8 | 9 | class Panel(wx.Panel): |
9 | 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 | 14 | sizer = wx.BoxSizer(wx.VERTICAL) |
14 | 15 | sizer.Add(InnerPanel(self), 1, wx.EXPAND|wx.GROW|wx.ALL, 5) |
16 | + | |
15 | 17 | self.SetSizer(sizer) |
18 | + sizer.Fit(self) | |
19 | + | |
20 | + self.Layout() | |
21 | + self.Update() | |
22 | + self.SetAutoLayout(1) | |
23 | + | |
16 | 24 | |
17 | 25 | # Inner fold panel |
18 | 26 | class InnerPanel(wx.Panel): |
19 | 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 | 31 | splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) |
24 | 32 | splitter.SetOrientation(wx.VERTICAL) |
... | ... | @@ -26,8 +34,14 @@ class InnerPanel(wx.Panel): |
26 | 34 | |
27 | 35 | sizer = wx.BoxSizer(wx.VERTICAL) |
28 | 36 | sizer.Add(splitter, 1, wx.EXPAND) |
37 | + | |
29 | 38 | self.SetSizer(sizer) |
30 | - | |
39 | + sizer.Fit(self) | |
40 | + | |
41 | + self.Layout() | |
42 | + self.Update() | |
43 | + self.SetAutoLayout(1) | |
44 | + | |
31 | 45 | self.text_panel = TextPanel(splitter) |
32 | 46 | splitter.AppendWindow(self.text_panel, 250) |
33 | 47 | |
... | ... | @@ -105,10 +119,10 @@ class TextPanel(wx.Panel): |
105 | 119 | parent = tree.AppendItem(self.root, title) |
106 | 120 | |
107 | 121 | if not first: |
108 | - tree.SelectItem(parent) | |
122 | + parent_select = parent | |
109 | 123 | first += 1 |
110 | 124 | |
111 | - | |
125 | + tree.SetItemPyData(parent, patient) | |
112 | 126 | tree.SetItemText(parent, str(dicom.patient.id), 1) |
113 | 127 | tree.SetItemText(parent, str(dicom.patient.age), 2) |
114 | 128 | tree.SetItemText(parent, str(dicom.patient.gender), 3) |
... | ... | @@ -136,17 +150,37 @@ class TextPanel(wx.Panel): |
136 | 150 | |
137 | 151 | tree.Expand(self.root) |
138 | 152 | |
153 | + tree.SelectItem(parent_select) | |
154 | + | |
139 | 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 | 177 | def OnActivate(self, evt): |
142 | 178 | print "OnActivate" |
143 | 179 | item = evt.GetItem() |
144 | 180 | group = self.tree.GetItemPyData(item) |
145 | - if group: | |
146 | - print "send" | |
181 | + if isinstance(group, dcm.DicomGroup): | |
147 | 182 | ps.Publisher().sendMessage('Open DICOM group', |
148 | 183 | group) |
149 | - | |
150 | 184 | else: |
151 | 185 | if self.tree.IsExpanded(item): |
152 | 186 | self.tree.Collapse(item) |
... | ... | @@ -155,7 +189,10 @@ class TextPanel(wx.Panel): |
155 | 189 | |
156 | 190 | def OnSize(self, evt): |
157 | 191 | self.tree.SetSize(self.GetSize()) |
158 | - | |
192 | + | |
193 | + | |
194 | + | |
195 | + | |
159 | 196 | class ImagePanel(wx.Panel): |
160 | 197 | def __init__(self, parent): |
161 | 198 | wx.Panel.__init__(self, parent, -1) |
... | ... | @@ -174,6 +211,14 @@ class ImagePanel(wx.Panel): |
174 | 211 | |
175 | 212 | self.image_panel = SlicePanel(splitter) |
176 | 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 | 223 | class SeriesPanel(wx.Panel): |
179 | 224 | def __init__(self, parent): |
... | ... | @@ -184,31 +229,58 @@ class SeriesPanel(wx.Panel): |
184 | 229 | self.dicom_preview = dpp.DicomPreview(self) |
185 | 230 | self.dicom_preview.Show(0) |
186 | 231 | |
187 | - self.sizer = wx.BoxSizer(wx.VERTICAL) | |
232 | + self.sizer = wx.BoxSizer(wx.HORIZONTAL) | |
188 | 233 | self.sizer.Add(self.serie_preview, 1, wx.EXPAND | wx.ALL, 5) |
189 | 234 | self.sizer.Add(self.dicom_preview, 1, wx.EXPAND | wx.ALL, 5) |
190 | 235 | self.sizer.Fit(self) |
191 | 236 | |
237 | + | |
192 | 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 | 245 | self.__bind_evt() |
198 | 246 | self._bind_gui_evt() |
199 | 247 | |
200 | 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 | 253 | def _bind_gui_evt(self): |
204 | 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 | 279 | def OnSelectSerie(self, evt): |
207 | 280 | serie = evt.GetSelectID() |
208 | 281 | self.dicom_preview.SetDicomSerie(serie) |
209 | 282 | |
210 | 283 | self.dicom_preview.Show(1) |
211 | - #self.sizer.Detach(self.serie_preview) | |
212 | 284 | self.serie_preview.Show(0) |
213 | 285 | self.sizer.Layout() |
214 | 286 | #self.Show() |
... | ... | @@ -217,9 +289,9 @@ class SeriesPanel(wx.Panel): |
217 | 289 | |
218 | 290 | def ShowDicomSeries(self, pubsub_evt): |
219 | 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 | 125 | list_ = self.slices_dict.values() |
126 | 126 | dicom = list_[0] |
127 | 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 | 130 | return list_ |
130 | 131 | |
131 | 132 | def UpdateZSpacing(self): | ... | ... |