Commit 7040d74d51838af8cfd399b1a2ab2436179f8c67

Authored by tfmoraes
1 parent cf8e1cc5

ENH: Sync between treeview and preview and only show one selection in preview

invesalius/gui/dicom_preview_panel.py
@@ -286,6 +286,7 @@ class Preview(wx.Panel): @@ -286,6 +286,7 @@ class Preview(wx.Panel):
286 my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId()) 286 my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId())
287 my_evt.SetSelectedID(self.dicom_info.id) 287 my_evt.SetSelectedID(self.dicom_info.id)
288 my_evt.SetItemData(self.dicom_info.dicom) 288 my_evt.SetItemData(self.dicom_info.dicom)
  289 + my_evt.SetEventObject(self)
289 print "patient", self.dicom_info.dicom.patient 290 print "patient", self.dicom_info.dicom.patient
290 self.GetEventHandler().ProcessEvent(my_evt) 291 self.GetEventHandler().ProcessEvent(my_evt)
291 292
@@ -306,6 +307,7 @@ class Preview(wx.Panel): @@ -306,6 +307,7 @@ class Preview(wx.Panel):
306 my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) 307 my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId())
307 my_evt.SetSelectedID(self.dicom_info.id) 308 my_evt.SetSelectedID(self.dicom_info.id)
308 my_evt.SetItemData(self.dicom_info.dicom) 309 my_evt.SetItemData(self.dicom_info.dicom)
  310 + my_evt.SetEventObject(self)
309 self.GetEventHandler().ProcessEvent(my_evt) 311 self.GetEventHandler().ProcessEvent(my_evt)
310 312
311 313
@@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel): @@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel):
319 #self.SetSizer(self.sizer) 321 #self.SetSizer(self.sizer)
320 self.displayed_position = 0 322 self.displayed_position = 0
321 self.nhidden_last_display = 0 323 self.nhidden_last_display = 0
  324 + self.selected_dicom = None
  325 + self.selected_panel = None
322 self._init_ui() 326 self._init_ui()
323 327
324 def _init_ui(self): 328 def _init_ui(self):
@@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel): @@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel):
369 my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId()) 373 my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId())
370 my_evt.SetSelectedID(evt.GetSelectID()) 374 my_evt.SetSelectedID(evt.GetSelectID())
371 my_evt.SetItemData(evt.GetItemData()) 375 my_evt.SetItemData(evt.GetItemData())
  376 +
  377 + if self.selected_dicom:
  378 + self.selected_dicom.selected = self.selected_dicom is \
  379 + evt.GetEventObject().dicom_info
  380 + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject()
  381 + print "Unselecting a panel", self.selected_panel.select_on
  382 + self.selected_panel.Select()
  383 + self.selected_panel = evt.GetEventObject()
  384 + self.selected_dicom = self.selected_panel.dicom_info
372 self.GetEventHandler().ProcessEvent(my_evt) 385 self.GetEventHandler().ProcessEvent(my_evt)
373 386
374 def SetPatientGroups(self, patient): 387 def SetPatientGroups(self, patient):
@@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel): @@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel):
379 self.group_list = group_list 392 self.group_list = group_list
380 n = 0 393 n = 0
381 for group in group_list: 394 for group in group_list:
382 - info = DicomInfo(n, group.dicom, 395 + info = DicomInfo((group.dicom.patient.id,
  396 + group.dicom.acquisition.serie_number),
  397 + group.dicom,
383 group.title, 398 group.title,
384 - _("%d Images") %(group.nslices),  
385 - ) 399 + _("%d Images") %(group.nslices))
386 self.files.append(info) 400 self.files.append(info)
387 n+=1 401 n+=1
388 402
@@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel): @@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel):
417 for f, p in zip(self.files[initial:final], self.previews): 431 for f, p in zip(self.files[initial:final], self.previews):
418 #print "f", f 432 #print "f", f
419 p.SetDicomToPreview(f) 433 p.SetDicomToPreview(f)
  434 + if f.selected:
  435 + self.selected_panel = p
420 #p.interactor.Render() 436 #p.interactor.Render()
421 437
422 for f, p in zip(self.files[initial:final], self.previews): 438 for f, p in zip(self.files[initial:final], self.previews):
@@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel): @@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel):
436 # I have to test. 452 # I have to test.
437 self.displayed_position = 0 453 self.displayed_position = 0
438 self.nhidden_last_display = 0 454 self.nhidden_last_display = 0
  455 + self.selected_dicom = None
  456 + self.selected_panel = None
439 self._init_ui() 457 self._init_ui()
440 458
441 def _init_ui(self): 459 def _init_ui(self):
@@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel): @@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel):
516 n = 0 534 n = 0
517 for dicom in dicom_files: 535 for dicom in dicom_files:
518 info = DicomInfo(n, dicom, 536 info = DicomInfo(n, dicom,
519 - _("Image %d") % (dicom.image.number),  
520 - "%.2f" % (dicom.image.position[2]), 537 + _("Image %d") % (dicom.image.number),
  538 + "%.2f" % (dicom.image.position[2]),
521 ) 539 )
522 self.files.append(info) 540 self.files.append(info)
523 n+=1 541 n+=1
@@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel): @@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel):
555 573
556 for f, p in zip(self.files[initial:final], self.previews): 574 for f, p in zip(self.files[initial:final], self.previews):
557 p.SetDicomToPreview(f) 575 p.SetDicomToPreview(f)
  576 + if f.selected:
  577 + self.selected_panel = p
558 #p.interactor.Render() 578 #p.interactor.Render()
559 579
560 for f, p in zip(self.files[initial:final], self.previews): 580 for f, p in zip(self.files[initial:final], self.previews):
@@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel): @@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel):
570 my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId()) 590 my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId())
571 my_evt.SetSelectedID(evt.GetSelectID()) 591 my_evt.SetSelectedID(evt.GetSelectID())
572 my_evt.SetItemData(evt.GetItemData()) 592 my_evt.SetItemData(evt.GetItemData())
  593 +
  594 + if self.selected_dicom:
  595 + self.selected_dicom.selected = self.selected_dicom is \
  596 + evt.GetEventObject().dicom_info
  597 + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject()
  598 + print "Unselecting a panel", self.selected_panel.select_on
  599 + self.selected_panel.Select()
  600 + self.selected_panel = evt.GetEventObject()
  601 + self.selected_dicom = self.selected_panel.dicom_info
573 self.GetEventHandler().ProcessEvent(my_evt) 602 self.GetEventHandler().ProcessEvent(my_evt)
574 603
575 604
@@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel): @@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel):
737 dicom.acquisition.time) 766 dicom.acquisition.time)
738 self.text_acquisition.SetValue(value) 767 self.text_acquisition.SetValue(value)
739 768
740 - # READ FILE  
741 - #filename = dicom.image.file  
742 - #reader = vtkgdcm.vtkGDCMImageReader()  
743 - #reader.SetFileName(filename)  
744 -  
745 # ADJUST CONTRAST 769 # ADJUST CONTRAST
746 window_level = dicom.image.level 770 window_level = dicom.image.level
747 window_width = dicom.image.window 771 window_width = dicom.image.window
@@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel): @@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel):
755 self.renderer.ResetCamera() 779 self.renderer.ResetCamera()
756 self.interactor.Render() 780 self.interactor.Render()
757 781
  782 + # Setting slider position
  783 + self.slider.SetValue(index)
  784 +
758 def __del__(self): 785 def __del__(self):
759 print "---------> morri" 786 print "---------> morri"
760 787
invesalius/gui/import_panel.py
@@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) @@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1)
30 myEVT_SELECT_SLICE = wx.NewEventType() 30 myEVT_SELECT_SLICE = wx.NewEventType()
31 EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1) 31 EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1)
32 32
  33 +myEVT_SELECT_PATIENT = wx.NewEventType()
  34 +EVT_SELECT_PATIENT = wx.PyEventBinder(myEVT_SELECT_PATIENT, 1)
  35 +
33 class SelectEvent(wx.PyCommandEvent): 36 class SelectEvent(wx.PyCommandEvent):
34 def __init__(self , evtType, id): 37 def __init__(self , evtType, id):
35 super(SelectEvent, self).__init__(evtType, id) 38 super(SelectEvent, self).__init__(evtType, id)
@@ -69,6 +72,8 @@ class InnerPanel(wx.Panel): @@ -69,6 +72,8 @@ class InnerPanel(wx.Panel):
69 wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, 72 wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#,
70 #size=wx.Size(680, 656)) 73 #size=wx.Size(680, 656))
71 74
  75 + self.patients = []
  76 +
72 splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) 77 splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE)
73 splitter.SetOrientation(wx.VERTICAL) 78 splitter.SetOrientation(wx.VERTICAL)
74 self.splitter = splitter 79 self.splitter = splitter
@@ -106,38 +111,56 @@ class InnerPanel(wx.Panel): @@ -106,38 +111,56 @@ class InnerPanel(wx.Panel):
106 def _bind_events(self): 111 def _bind_events(self):
107 self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) 112 self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie)
108 self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) 113 self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice)
  114 + self.Bind(EVT_SELECT_PATIENT, self.OnSelectPatient)
109 115
110 def ShowDicomPreview(self, pubsub_evt): 116 def ShowDicomPreview(self, pubsub_evt):
111 - dicom_groups = pubsub_evt.data 117 + dicom_groups = pubsub_evt.data
  118 + self.patients.extend(dicom_groups)
112 self.text_panel.Populate(dicom_groups) 119 self.text_panel.Populate(dicom_groups)
113 120
114 def OnSelectSerie(self, evt): 121 def OnSelectSerie(self, evt):
115 - print "You've selected the serie", evt.GetSelectID() 122 + patient_id, serie_number = evt.GetSelectID()
  123 + self.text_panel.SelectSerie(evt.GetSelectID())
  124 + for patient in self.patients:
  125 + if patient_id == patient.GetDicomSample().patient.id:
  126 + for group in patient.GetGroups():
  127 + if serie_number == group.GetDicomSample().acquisition.serie_number:
  128 + self.image_panel.SetSerie(group)
116 129
117 def OnSelectSlice(self, evt): 130 def OnSelectSlice(self, evt):
118 print "You've selected the slice", evt.GetSelectID() 131 print "You've selected the slice", evt.GetSelectID()
  132 +
  133 + def OnSelectPatient(self, evt):
  134 + print "You've selected the patient", evt.GetSelectID()
119 135
120 136
121 class TextPanel(wx.Panel): 137 class TextPanel(wx.Panel):
122 def __init__(self, parent): 138 def __init__(self, parent):
123 wx.Panel.__init__(self, parent, -1) 139 wx.Panel.__init__(self, parent, -1)
124 - self.Bind(wx.EVT_SIZE, self.OnSize) 140 +
  141 + self._selected_by_user = True
  142 + self.idserie_treeitem = {}
  143 + self.treeitem_idpatient = {}
125 144
126 self.__init_gui() 145 self.__init_gui()
127 - self.__bind_evt() 146 + self.__bind_events_wx()
  147 + self.__bind_pubsub_evt()
128 148
129 - def __bind_evt(self): 149 + def __bind_pubsub_evt(self):
130 ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel') 150 ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel')
131 151
  152 + def __bind_events_wx(self):
  153 + self.Bind(wx.EVT_SIZE, self.OnSize)
  154 +
132 def __init_gui(self): 155 def __init_gui(self):
133 tree = gizmos.TreeListCtrl(self, -1, style = 156 tree = gizmos.TreeListCtrl(self, -1, style =
134 - wx.TR_DEFAULT_STYLE  
135 - | wx.TR_HIDE_ROOT  
136 - | wx.TR_ROW_LINES  
137 - | wx.TR_COLUMN_LINES  
138 - | wx.TR_FULL_ROW_HIGHLIGHT  
139 - | wx.TR_SINGLE  
140 - ) 157 + wx.TR_DEFAULT_STYLE
  158 + | wx.TR_HIDE_ROOT
  159 + | wx.TR_ROW_LINES
  160 + | wx.TR_COLUMN_LINES
  161 + | wx.TR_FULL_ROW_HIGHLIGHT
  162 + | wx.TR_SINGLE
  163 + )
141 164
142 165
143 tree.AddColumn(_("Patient name")) 166 tree.AddColumn(_("Patient name"))
@@ -175,7 +198,6 @@ class TextPanel(wx.Panel): @@ -175,7 +198,6 @@ class TextPanel(wx.Panel):
175 198
176 def Populate(self, patient_list): 199 def Populate(self, patient_list):
177 tree = self.tree 200 tree = self.tree
178 - self.idserie_treeitem = {}  
179 201
180 first = 0 202 first = 0
181 for patient in patient_list: 203 for patient in patient_list:
@@ -219,7 +241,8 @@ class TextPanel(wx.Panel): @@ -219,7 +241,8 @@ class TextPanel(wx.Panel):
219 tree.SetItemText(child, "%s" % date_time, 6) 241 tree.SetItemText(child, "%s" % date_time, 6)
220 tree.SetItemText(child, "%s" % group.nslices, 7) 242 tree.SetItemText(child, "%s" % group.nslices, 7)
221 243
222 - self.idserie_treeitem[n] = child 244 + self.idserie_treeitem[(dicom.patient.id,
  245 + dicom.acquisition.serie_number)] = child
223 246
224 tree.Expand(self.root) 247 tree.Expand(self.root)
225 248
@@ -231,13 +254,25 @@ class TextPanel(wx.Panel): @@ -231,13 +254,25 @@ class TextPanel(wx.Panel):
231 254
232 def OnSelChanged(self, evt): 255 def OnSelChanged(self, evt):
233 item = self.tree.GetSelection() 256 item = self.tree.GetSelection()
234 - group = self.tree.GetItemPyData(item)  
235 - if isinstance(group, dcm.DicomGroup):  
236 - ps.Publisher().sendMessage('Load group into import panel',  
237 - group)  
238 - elif isinstance(group, dcm.PatientGroup):  
239 - ps.Publisher().sendMessage('Load patient into import panel',  
240 - group) 257 + if self._selected_by_user:
  258 + print "Yes, I'm here"
  259 + group = self.tree.GetItemPyData(item)
  260 + if isinstance(group, dcm.DicomGroup):
  261 + ps.Publisher().sendMessage('Load group into import panel',
  262 + group)
  263 +
  264 + elif isinstance(group, dcm.PatientGroup):
  265 + id = group.GetDicomSample().patient.id
  266 + my_evt = SelectEvent(myEVT_SELECT_PATIENT, self.GetId())
  267 + my_evt.SetSelectedID(id)
  268 + self.GetEventHandler().ProcessEvent(my_evt)
  269 +
  270 + ps.Publisher().sendMessage('Load patient into import panel',
  271 + group)
  272 + else:
  273 + parent_id = self.tree.GetItemParent(item)
  274 + self.tree.Expand(parent_id)
  275 + evt.Skip()
241 276
242 def OnActivate(self, evt): 277 def OnActivate(self, evt):
243 item = evt.GetItem() 278 item = evt.GetItem()
@@ -255,8 +290,10 @@ class TextPanel(wx.Panel): @@ -255,8 +290,10 @@ class TextPanel(wx.Panel):
255 self.tree.SetSize(self.GetSize()) 290 self.tree.SetSize(self.GetSize())
256 291
257 def SelectSerie(self, serie): 292 def SelectSerie(self, serie):
  293 + self._selected_by_user = False
258 item = self.idserie_treeitem[serie] 294 item = self.idserie_treeitem[serie]
259 self.tree.SelectItem(item) 295 self.tree.SelectItem(item)
  296 + self._selected_by_user = True
260 297
261 298
262 class ImagePanel(wx.Panel): 299 class ImagePanel(wx.Panel):
@@ -303,6 +340,9 @@ class ImagePanel(wx.Panel): @@ -303,6 +340,9 @@ class ImagePanel(wx.Panel):
303 self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID()) 340 self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID())
304 evt.Skip() 341 evt.Skip()
305 342
  343 + def SetSerie(self, serie):
  344 + self.image_panel.dicom_preview.SetDicomGroup(serie)
  345 +
306 346
307 class SeriesPanel(wx.Panel): 347 class SeriesPanel(wx.Panel):
308 def __init__(self, parent): 348 def __init__(self, parent):
@@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel): @@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel):
365 my_evt.SetItemData(evt.GetItemData()) 405 my_evt.SetItemData(evt.GetItemData())
366 self.GetEventHandler().ProcessEvent(my_evt) 406 self.GetEventHandler().ProcessEvent(my_evt)
367 407
368 - self.dicom_preview.SetDicomSerie(serie)  
369 - self.dicom_preview.Show(1)  
370 - self.serie_preview.Show(0) 408 + #self.dicom_preview.SetDicomGroup(serie)
  409 + #self.dicom_preview.Show(1)
  410 + #self.serie_preview.Show(0)
371 self.sizer.Layout() 411 self.sizer.Layout()
372 #self.Show() 412 #self.Show()
373 self.Update() 413 self.Update()