From 7040d74d51838af8cfd399b1a2ab2436179f8c67 Mon Sep 17 00:00:00 2001 From: tfmoraes Date: Fri, 22 Jan 2010 13:47:15 +0000 Subject: [PATCH] ENH: Sync between treeview and preview and only show one selection in preview --- invesalius/gui/dicom_preview_panel.py | 47 +++++++++++++++++++++++++++++++++++++---------- invesalius/gui/import_panel.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 101 insertions(+), 34 deletions(-) diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index 538d2f6..124b4ac 100755 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -286,6 +286,7 @@ class Preview(wx.Panel): my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId()) my_evt.SetSelectedID(self.dicom_info.id) my_evt.SetItemData(self.dicom_info.dicom) + my_evt.SetEventObject(self) print "patient", self.dicom_info.dicom.patient self.GetEventHandler().ProcessEvent(my_evt) @@ -306,6 +307,7 @@ class Preview(wx.Panel): my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) my_evt.SetSelectedID(self.dicom_info.id) my_evt.SetItemData(self.dicom_info.dicom) + my_evt.SetEventObject(self) self.GetEventHandler().ProcessEvent(my_evt) @@ -319,6 +321,8 @@ class DicomPreviewSeries(wx.Panel): #self.SetSizer(self.sizer) self.displayed_position = 0 self.nhidden_last_display = 0 + self.selected_dicom = None + self.selected_panel = None self._init_ui() def _init_ui(self): @@ -369,6 +373,15 @@ class DicomPreviewSeries(wx.Panel): my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId()) my_evt.SetSelectedID(evt.GetSelectID()) my_evt.SetItemData(evt.GetItemData()) + + if self.selected_dicom: + self.selected_dicom.selected = self.selected_dicom is \ + evt.GetEventObject().dicom_info + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject() + print "Unselecting a panel", self.selected_panel.select_on + self.selected_panel.Select() + self.selected_panel = evt.GetEventObject() + self.selected_dicom = self.selected_panel.dicom_info self.GetEventHandler().ProcessEvent(my_evt) def SetPatientGroups(self, patient): @@ -379,10 +392,11 @@ class DicomPreviewSeries(wx.Panel): self.group_list = group_list n = 0 for group in group_list: - info = DicomInfo(n, group.dicom, + info = DicomInfo((group.dicom.patient.id, + group.dicom.acquisition.serie_number), + group.dicom, group.title, - _("%d Images") %(group.nslices), - ) + _("%d Images") %(group.nslices)) self.files.append(info) n+=1 @@ -417,6 +431,8 @@ class DicomPreviewSeries(wx.Panel): for f, p in zip(self.files[initial:final], self.previews): #print "f", f p.SetDicomToPreview(f) + if f.selected: + self.selected_panel = p #p.interactor.Render() for f, p in zip(self.files[initial:final], self.previews): @@ -436,6 +452,8 @@ class DicomPreviewSlice(wx.Panel): # I have to test. self.displayed_position = 0 self.nhidden_last_display = 0 + self.selected_dicom = None + self.selected_panel = None self._init_ui() def _init_ui(self): @@ -516,8 +534,8 @@ class DicomPreviewSlice(wx.Panel): n = 0 for dicom in dicom_files: info = DicomInfo(n, dicom, - _("Image %d") % (dicom.image.number), - "%.2f" % (dicom.image.position[2]), + _("Image %d") % (dicom.image.number), + "%.2f" % (dicom.image.position[2]), ) self.files.append(info) n+=1 @@ -555,6 +573,8 @@ class DicomPreviewSlice(wx.Panel): for f, p in zip(self.files[initial:final], self.previews): p.SetDicomToPreview(f) + if f.selected: + self.selected_panel = p #p.interactor.Render() for f, p in zip(self.files[initial:final], self.previews): @@ -570,6 +590,15 @@ class DicomPreviewSlice(wx.Panel): my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId()) my_evt.SetSelectedID(evt.GetSelectID()) my_evt.SetItemData(evt.GetItemData()) + + if self.selected_dicom: + self.selected_dicom.selected = self.selected_dicom is \ + evt.GetEventObject().dicom_info + self.selected_panel.select_on = self.selected_panel is evt.GetEventObject() + print "Unselecting a panel", self.selected_panel.select_on + self.selected_panel.Select() + self.selected_panel = evt.GetEventObject() + self.selected_dicom = self.selected_panel.dicom_info self.GetEventHandler().ProcessEvent(my_evt) @@ -737,11 +766,6 @@ class SingleImagePreview(wx.Panel): dicom.acquisition.time) self.text_acquisition.SetValue(value) - # READ FILE - #filename = dicom.image.file - #reader = vtkgdcm.vtkGDCMImageReader() - #reader.SetFileName(filename) - # ADJUST CONTRAST window_level = dicom.image.level window_width = dicom.image.window @@ -755,6 +779,9 @@ class SingleImagePreview(wx.Panel): self.renderer.ResetCamera() self.interactor.Render() + # Setting slider position + self.slider.SetValue(index) + def __del__(self): print "---------> morri" diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index 0a4b8e5..4e86b78 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -30,6 +30,9 @@ EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) myEVT_SELECT_SLICE = wx.NewEventType() EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1) +myEVT_SELECT_PATIENT = wx.NewEventType() +EVT_SELECT_PATIENT = wx.PyEventBinder(myEVT_SELECT_PATIENT, 1) + class SelectEvent(wx.PyCommandEvent): def __init__(self , evtType, id): super(SelectEvent, self).__init__(evtType, id) @@ -69,6 +72,8 @@ class InnerPanel(wx.Panel): wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, #size=wx.Size(680, 656)) + self.patients = [] + splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) splitter.SetOrientation(wx.VERTICAL) self.splitter = splitter @@ -106,38 +111,56 @@ class InnerPanel(wx.Panel): def _bind_events(self): self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) + self.Bind(EVT_SELECT_PATIENT, self.OnSelectPatient) def ShowDicomPreview(self, pubsub_evt): - dicom_groups = pubsub_evt.data + dicom_groups = pubsub_evt.data + self.patients.extend(dicom_groups) self.text_panel.Populate(dicom_groups) def OnSelectSerie(self, evt): - print "You've selected the serie", evt.GetSelectID() + patient_id, serie_number = evt.GetSelectID() + self.text_panel.SelectSerie(evt.GetSelectID()) + for patient in self.patients: + if patient_id == patient.GetDicomSample().patient.id: + for group in patient.GetGroups(): + if serie_number == group.GetDicomSample().acquisition.serie_number: + self.image_panel.SetSerie(group) def OnSelectSlice(self, evt): print "You've selected the slice", evt.GetSelectID() + + def OnSelectPatient(self, evt): + print "You've selected the patient", evt.GetSelectID() class TextPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) - self.Bind(wx.EVT_SIZE, self.OnSize) + + self._selected_by_user = True + self.idserie_treeitem = {} + self.treeitem_idpatient = {} self.__init_gui() - self.__bind_evt() + self.__bind_events_wx() + self.__bind_pubsub_evt() - def __bind_evt(self): + def __bind_pubsub_evt(self): ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel') + def __bind_events_wx(self): + self.Bind(wx.EVT_SIZE, self.OnSize) + def __init_gui(self): tree = gizmos.TreeListCtrl(self, -1, style = - wx.TR_DEFAULT_STYLE - | wx.TR_HIDE_ROOT - | wx.TR_ROW_LINES - | wx.TR_COLUMN_LINES - | wx.TR_FULL_ROW_HIGHLIGHT - | wx.TR_SINGLE - ) + wx.TR_DEFAULT_STYLE + | wx.TR_HIDE_ROOT + | wx.TR_ROW_LINES + | wx.TR_COLUMN_LINES + | wx.TR_FULL_ROW_HIGHLIGHT + | wx.TR_SINGLE + ) tree.AddColumn(_("Patient name")) @@ -175,7 +198,6 @@ class TextPanel(wx.Panel): def Populate(self, patient_list): tree = self.tree - self.idserie_treeitem = {} first = 0 for patient in patient_list: @@ -219,7 +241,8 @@ class TextPanel(wx.Panel): tree.SetItemText(child, "%s" % date_time, 6) tree.SetItemText(child, "%s" % group.nslices, 7) - self.idserie_treeitem[n] = child + self.idserie_treeitem[(dicom.patient.id, + dicom.acquisition.serie_number)] = child tree.Expand(self.root) @@ -231,13 +254,25 @@ class TextPanel(wx.Panel): def OnSelChanged(self, evt): item = self.tree.GetSelection() - group = self.tree.GetItemPyData(item) - if isinstance(group, dcm.DicomGroup): - ps.Publisher().sendMessage('Load group into import panel', - group) - elif isinstance(group, dcm.PatientGroup): - ps.Publisher().sendMessage('Load patient into import panel', - group) + if self._selected_by_user: + print "Yes, I'm here" + group = self.tree.GetItemPyData(item) + if isinstance(group, dcm.DicomGroup): + ps.Publisher().sendMessage('Load group into import panel', + group) + + elif isinstance(group, dcm.PatientGroup): + id = group.GetDicomSample().patient.id + my_evt = SelectEvent(myEVT_SELECT_PATIENT, self.GetId()) + my_evt.SetSelectedID(id) + self.GetEventHandler().ProcessEvent(my_evt) + + ps.Publisher().sendMessage('Load patient into import panel', + group) + else: + parent_id = self.tree.GetItemParent(item) + self.tree.Expand(parent_id) + evt.Skip() def OnActivate(self, evt): item = evt.GetItem() @@ -255,8 +290,10 @@ class TextPanel(wx.Panel): self.tree.SetSize(self.GetSize()) def SelectSerie(self, serie): + self._selected_by_user = False item = self.idserie_treeitem[serie] self.tree.SelectItem(item) + self._selected_by_user = True class ImagePanel(wx.Panel): @@ -303,6 +340,9 @@ class ImagePanel(wx.Panel): self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID()) evt.Skip() + def SetSerie(self, serie): + self.image_panel.dicom_preview.SetDicomGroup(serie) + class SeriesPanel(wx.Panel): def __init__(self, parent): @@ -365,9 +405,9 @@ class SeriesPanel(wx.Panel): my_evt.SetItemData(evt.GetItemData()) self.GetEventHandler().ProcessEvent(my_evt) - self.dicom_preview.SetDicomSerie(serie) - self.dicom_preview.Show(1) - self.serie_preview.Show(0) + #self.dicom_preview.SetDicomGroup(serie) + #self.dicom_preview.Show(1) + #self.serie_preview.Show(0) self.sizer.Layout() #self.Show() self.Update() -- libgit2 0.21.2