Commit 2faf0f450ff1fa12b7ee1ce35283a04dd7542053

Authored by tatiana
1 parent 4811ecf0

ENH: Advances in import panel (still under devel)

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):