Commit 2faf0f450ff1fa12b7ee1ce35283a04dd7542053
1 parent
4811ecf0
Exists in
master
and in
68 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): | ... | ... |