diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index d2050ba..538d2f6 100755 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -47,6 +47,49 @@ STR_LOCAL = _("Location: %.2f") STR_PATIENT = "%s\n%s" STR_ACQ = _("%s %s\nMade in InVesalius") +myEVT_PREVIEW_CLICK = wx.NewEventType() +EVT_PREVIEW_CLICK = wx.PyEventBinder(myEVT_PREVIEW_CLICK, 1) + +myEVT_PREVIEW_DBLCLICK = wx.NewEventType() +EVT_PREVIEW_DBLCLICK = wx.PyEventBinder(myEVT_PREVIEW_DBLCLICK, 1) + +myEVT_CLICK_SLICE = wx.NewEventType() +# This event occurs when the user select a preview +EVT_CLICK_SLICE = wx.PyEventBinder(myEVT_CLICK_SLICE, 1) + +myEVT_CLICK_SERIE = wx.NewEventType() +# This event occurs when the user select a preview +EVT_CLICK_SERIE = wx.PyEventBinder(myEVT_CLICK_SERIE, 1) + +myEVT_CLICK = wx.NewEventType() +EVT_CLICK = wx.PyEventBinder(myEVT_CLICK, 1) + +class SelectionEvent(wx.PyCommandEvent): + pass + + +class PreviewEvent(wx.PyCommandEvent): + def __init__(self , evtType, id): + super(PreviewEvent, self).__init__(evtType, id) + + def GetSelectID(self): + return self.SelectedID + + def SetSelectedID(self, id): + self.SelectedID = id + + def GetItemData(self): + return self.data + + def SetItemData(self, data): + self.data = data + + +class SerieEvent(PreviewEvent): + def __init__(self , evtType, id): + super(SerieEvent, self).__init__(evtType, id) + + class DicomInfo(object): """ Keep the informations and the image used by preview. @@ -57,25 +100,14 @@ class DicomInfo(object): self.title = title self.subtitle = subtitle self._preview = None - self._size = (70, 70) self.selected = False - self.resized = False - - @property - def size(self): - return self._size - - @size.setter - def size(self, size): - if size != self._size: - self._size = size - self.resized = True @property def preview(self): if self._preview: return self._preview else: + print "First time!" colorer = vtk.vtkImageMapToWindowLevelColors() colorer.SetInput(self.dicom.image.imagedata) colorer.SetWindow(float(self.dicom.image.window)) @@ -118,7 +150,6 @@ class DicomPaintPanel(wx.Panel): else: return image.Scale(*self.last_size) - def SetImage(self, image): self.image = image r_img = self._image_resize(image) @@ -193,10 +224,9 @@ class Preview(wx.Panel): #self.subtitle.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) self.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) - #self.interactor.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) - #self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) - #self.title.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) - #self.subtitle.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) + self.title.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) + self.subtitle.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) + self.image_viewer.Bind(wx.EVT_LEFT_DOWN, self.OnSelect) #self.Bind(wx.EVT_SIZE, self.OnSize) @@ -252,6 +282,13 @@ class Preview(wx.Panel): #self.SetBackgroundColour(c) self.Select() + # Generating a EVT_PREVIEW_CLICK event + my_evt = SerieEvent(myEVT_PREVIEW_CLICK, self.GetId()) + my_evt.SetSelectedID(self.dicom_info.id) + my_evt.SetItemData(self.dicom_info.dicom) + print "patient", self.dicom_info.dicom.patient + self.GetEventHandler().ProcessEvent(my_evt) + def OnSize(self, evt): if self.dicom_info: self.SetDicomToPreview(self.dicom_info) @@ -266,313 +303,10 @@ class Preview(wx.Panel): self.Refresh() def OnDClick(self, evt): - evt = PreviewEvent(myEVT_SELECT, self.GetId()) - evt.SetSelectedID(self.ID) - evt.SetItemData(self.data) - self.GetEventHandler().ProcessEvent(evt) - - def ShowShadow(self): - self._nImgSize = 16 - nPadding = 4 - print "ShowShadow" - dc = wx.BufferedPaintDC(self) - style = self.GetParent().GetWindowStyleFlag() - - backBrush = wx.WHITE_BRUSH - if 1: #style & INB_BORDER: - borderPen = wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW)) - #else: - # borderPen = wx.TRANSPARENT_PEN - - size = self.GetSize() - - # Background - dc.SetBrush(backBrush) - - borderPen.SetWidth(1) - dc.SetPen(borderPen) - dc.DrawRectangle(0, 0, size.x, size.y) - #bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0] - - borderPen = wx.BLACK_PEN - borderPen.SetWidth(1) - dc.SetPen(borderPen) - dc.DrawLine(0, size.y, size.x, size.y) - dc.DrawPoint(0, size.y) - - clientSize = 0 - #bUseYcoord = (style & INB_RIGHT or style & INB_LEFT) - bUseYcoord = 1 - - if bUseYcoord: - clientSize = size.GetHeight() - else: - clientSize = size.GetWidth() - - if 1: - # Default values for the surronounding rectangle - # around a button - rectWidth = self._nImgSize * 2 # To avoid the recangle to 'touch' the borders - rectHeight = self._nImgSize * 2 - - # Incase the style requires non-fixed button (fit to text) - # recalc the rectangle width - if 1: - #if style & INB_FIT_BUTTON and \ - # not ((style & INB_LEFT) or (style & INB_RIGHT)) and \ - # not self._pagesInfoVec[i].GetCaption() == "" and \ - # not (style & INB_SHOW_ONLY_IMAGES): - - - #rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0] - - rectWidth = ((nPadding * 2) > rectWidth and [nPadding * 2] or [rectWidth])[0] - # Make the width an even number - if rectWidth % 2 != 0: - rectWidth += 1 - - # If Pin button is used, consider its space as well (applicable for top/botton style) - # since in the left/right, its size is already considered in 'pos' - #pinBtnSize = (bUsePin and [20] or [0])[0] - - #if pos + rectWidth + pinBtnSize > clientSize: - # break - - # Calculate the button rectangle - modRectWidth = rectWidth - 2# or [rectWidth])[0] - modRectHeight = rectHeight# or [rectHeight - 2])[0] - - pos = rectWidth - - if bUseYcoord: - buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight) - else: - buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight) - - def ShowShadow2(self): - pass - - -class SingleImagePreview(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent, -1) - self.__init_gui() - self.__init_vtk() - self.__bind_evt_gui() - self.dicom_list = [] - self.nimages = 1 - self.current_index = 0 - self.window_width = const.WINDOW_LEVEL[_("Bone")][0] - self.window_level = const.WINDOW_LEVEL[_("Bone")][1] - - def __init_vtk(self): - actor = vtk.vtkImageActor() - self.actor = actor - - text_image_size = vtku.Text() - text_image_size.SetPosition(const.TEXT_POS_LEFT_UP) - text_image_size.SetValue(_("image size")) - self.text_image_size = text_image_size - - text_image_location = vtku.Text() - text_image_location.SetVerticalJustificationToBottom() - text_image_location.SetPosition(const.TEXT_POS_LEFT_DOWN) - text_image_location.SetValue("localization") - self.text_image_location = text_image_location - - value = _("id\nprotocol") - text_patient = vtku.Text() - text_patient.SetJustificationToRight() - text_patient.SetPosition(const.TEXT_POS_RIGHT_UP) - text_patient.SetValue(value) - self.text_patient = text_patient - - value = _("date time\n Made in InVesalius") - text_acquisition = vtku.Text() - text_acquisition.SetJustificationToRight() - text_acquisition.SetVerticalJustificationToBottom() - text_acquisition.SetPosition(const.TEXT_POS_RIGHT_DOWN) - text_acquisition.SetValue(value) - self.text_acquisition = text_acquisition - - renderer = vtk.vtkRenderer() - renderer.AddActor(actor) - renderer.AddActor(text_image_size.actor) - renderer.AddActor(text_image_location.actor) - renderer.AddActor(text_patient.actor) - renderer.AddActor(text_acquisition.actor) - self.renderer = renderer - - style = vtk.vtkInteractorStyleImage() - - interactor = wxVTKRenderWindowInteractor(self.panel, -1, - size=wx.Size(340,340)) - interactor.GetRenderWindow().AddRenderer(renderer) - interactor.SetInteractorStyle(style) - interactor.Render() - self.interactor = interactor - - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(interactor, 1, wx.GROW|wx.EXPAND) - sizer.Fit(self.panel) - self.panel.SetSizer(sizer) - self.Layout() - self.Update() - - - def __init_gui(self): - self.panel = wx.Panel(self, -1) - - slider = wx.Slider(self, - id=-1, - value=0, - minValue=0, - maxValue=99, - style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS) - slider.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) - slider.SetTickFreq(1, 1) - self.slider = slider - - checkbox = wx.CheckBox(self, -1, _("Auto-play")) - self.checkbox = checkbox - - in_sizer = wx.BoxSizer(wx.HORIZONTAL) - in_sizer.Add(slider, 1, wx.GROW|wx.EXPAND) - in_sizer.Add(checkbox, 0) - - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(self.panel, 20, wx.GROW|wx.EXPAND) - sizer.Add(in_sizer, 1, wx.GROW|wx.EXPAND) - sizer.Fit(self) - - self.SetSizer(sizer) - self.Layout() - self.Update() - self.SetAutoLayout(1) - - def __bind_evt_gui(self): - self.slider.Bind(wx.EVT_SLIDER, self.OnSlider) - self.checkbox.Bind(wx.EVT_CHECKBOX, self.OnCheckBox) - - def OnSlider(self, evt): - pos = evt.GetInt() - self.ShowSlice(pos) - evt.Skip() - - def OnCheckBox(self, evt): - self.ischecked = evt.IsChecked() - if evt.IsChecked(): - wx.CallAfter(self.OnRun) - evt.Skip() - - def OnRun(self): - pos = self.slider.GetValue() - pos += 1 - if not (self.nimages- pos): - pos = 0 - self.slider.SetValue(pos) - self.ShowSlice(pos) - time.sleep(0.2) - if self.ischecked: - try: - wx.Yield() - #TODO: temporary fix necessary in the Windows XP 64 Bits - #BUG in wxWidgets http://trac.wxwidgets.org/ticket/10896 - except(wx._core.PyAssertionError): - print "wx._core.PyAssertionError" - finally: - wx.CallAfter(self.OnRun) - - def SetDicomGroup(self, group): - self.dicom_list = group.GetHandSortedList() - self.current_index = 0 - self.nimages = len(self.dicom_list) - # GUI - self.slider.SetMax(self.nimages-1) - print self.nimages - self.slider.SetValue(0) - self.ShowSlice() - - def ShowSlice(self, index = 0): - print "ShowSlice" - dicom = self.dicom_list[index] - - # UPDATE GUI - ## Text related to size - value = STR_SIZE %(dicom.image.size[0], dicom.image.size[1]) - self.text_image_size.SetValue(value) - - ## Text related to slice position - value1 = STR_SPC %(dicom.image.spacing[2]) - value2 = STR_LOCAL %(dicom.image.position[2]) - value = "%s\n%s" %(value1, value2) - self.text_image_location.SetValue(value) - - ## Text related to patient/ acquisiiton data - value = STR_PATIENT %(dicom.patient.id,\ - dicom.acquisition.protocol_name) - self.text_patient.SetValue(value) - - ## Text related to acquisition date and time - value = STR_ACQ % (dicom.acquisition.date, - 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 - colorer = vtk.vtkImageMapToWindowLevelColors() - colorer.SetInput(dicom.image.imagedata) - colorer.SetWindow(float(window_width)) - colorer.SetLevel(float(window_level)) - - # PLOT IMAGE INTO VIEWER - self.actor.SetInput(colorer.GetOutput()) - self.renderer.ResetCamera() - self.interactor.Render() - - def __del__(self): - print "---------> morri" - - - -myEVT_SELECT = wx.NewEventType() -# This event occurs when the user select a preview -EVT_SELECT = wx.PyEventBinder(myEVT_SELECT, 1) - -myEVT_SELECT_SERIE = wx.NewEventType() -# This event occurs when the user select a preview -EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) - -myEVT_CLICK = wx.NewEventType() -EVT_CLICK = wx.PyEventBinder(myEVT_CLICK, 1) - -class PreviewEvent(wx.PyCommandEvent): - def __init__(self , evtType, id): - wx.PyCommandEvent.__init__(self, evtType, id) - - def GetSelectID(self): - return self.SelectedID - - def SetSelectedID(self, id): - self.SelectedID = id - - def GetItemData(self): - return self.data - - def SetItemData(self, data): - self.data = data - - -class SerieEvent(PreviewEvent): - def __init__(self , evtType, id): - super(SerieEvent, self).__init__(evtType, id) - + my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) + my_evt.SetSelectedID(self.dicom_info.id) + my_evt.SetItemData(self.dicom_info.dicom) + self.GetEventHandler().ProcessEvent(my_evt) class DicomPreviewSeries(wx.Panel): @@ -588,7 +322,6 @@ class DicomPreviewSeries(wx.Panel): self._init_ui() def _init_ui(self): - scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) self.scroll = scroll @@ -603,7 +336,6 @@ class DicomPreviewSeries(wx.Panel): self.SetSizer(background_sizer) background_sizer.Fit(self) - self.Layout() self.Update() self.SetAutoLayout(1) @@ -618,6 +350,7 @@ class DicomPreviewSeries(wx.Panel): for i in xrange(NROWS): for j in xrange(NCOLS): p = Preview(self) + p.Bind(EVT_PREVIEW_CLICK, self.OnSelect) #if (i == j == 0): #self._show_shadow(p) #p.Hide() @@ -627,16 +360,15 @@ class DicomPreviewSeries(wx.Panel): #def _show_shadow(self, preview): # preview.ShowShadow() - def _bind_events(self): # When the user scrolls the window self.Bind(wx.EVT_SCROLL, self.OnScroll) - self.Bind(EVT_SELECT, self.OnSelect) def OnSelect(self, evt): - my_evt = SerieEvent(myEVT_SELECT_SERIE, self.GetId()) + print dir(evt) + my_evt = SerieEvent(myEVT_CLICK_SERIE, self.GetId()) my_evt.SetSelectedID(evt.GetSelectID()) - my_evt.SetItemData(self.group_list) + my_evt.SetItemData(evt.GetItemData()) self.GetEventHandler().ProcessEvent(my_evt) def SetPatientGroups(self, patient): @@ -647,14 +379,6 @@ class DicomPreviewSeries(wx.Panel): self.group_list = group_list n = 0 for group in group_list: - #info = (group.dicom.image, - # float(group.dicom.image.window), - # float(group.dicom.image.level), - # group.title, - # _("%d Images") %(group.nslices), - # n, - # group_list, - # group.dicom) info = DicomInfo(n, group.dicom, group.title, _("%d Images") %(group.nslices), @@ -690,8 +414,6 @@ class DicomPreviewSeries(wx.Panel): pass self.nhidden_last_display = 0 - - for f, p in zip(self.files[initial:final], self.previews): #print "f", f p.SetDicomToPreview(f) @@ -700,23 +422,22 @@ class DicomPreviewSeries(wx.Panel): for f, p in zip(self.files[initial:final], self.previews): p.Show() - def OnScroll(self, evt): if self.displayed_position != evt.GetPosition(): self.displayed_position = evt.GetPosition() self._display_previews() -class DicomPreview(wx.Panel): + +class DicomPreviewSlice(wx.Panel): """A dicom preview panel""" def __init__(self, parent): - super(DicomPreview, self).__init__(parent) + super(DicomPreviewSlice, self).__init__(parent) # TODO: 3 pixels between the previews is a good idea? # I have to test. self.displayed_position = 0 self.nhidden_last_display = 0 self._init_ui() - def _init_ui(self): scroll = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL) self.scroll = scroll @@ -732,7 +453,6 @@ class DicomPreview(wx.Panel): self.SetSizer(background_sizer) background_sizer.Fit(self) - self.Layout() self.Update() self.SetAutoLayout(1) @@ -747,6 +467,7 @@ class DicomPreview(wx.Panel): for i in xrange(NROWS): for j in xrange(NCOLS): p = Preview(self) + p.Bind(EVT_PREVIEW_CLICK, self.OnPreviewClick) #p.Hide() self.previews.append(p) self.grid.Add(p, 1, flag=wx.EXPAND) @@ -839,8 +560,201 @@ class DicomPreview(wx.Panel): for f, p in zip(self.files[initial:final], self.previews): p.Show() - def OnScroll(self, evt): if self.displayed_position != evt.GetPosition(): self.displayed_position = evt.GetPosition() self._display_previews() + + def OnPreviewClick(self, evt): + print "Hey man, you've clicked over me" + my_evt = SerieEvent(myEVT_CLICK_SLICE, self.GetId()) + my_evt.SetSelectedID(evt.GetSelectID()) + my_evt.SetItemData(evt.GetItemData()) + self.GetEventHandler().ProcessEvent(my_evt) + + +class SingleImagePreview(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self.__init_gui() + self.__init_vtk() + self.__bind_evt_gui() + self.dicom_list = [] + self.nimages = 1 + self.current_index = 0 + self.window_width = const.WINDOW_LEVEL[_("Bone")][0] + self.window_level = const.WINDOW_LEVEL[_("Bone")][1] + + def __init_vtk(self): + actor = vtk.vtkImageActor() + self.actor = actor + + text_image_size = vtku.Text() + text_image_size.SetPosition(const.TEXT_POS_LEFT_UP) + text_image_size.SetValue(_("image size")) + self.text_image_size = text_image_size + + text_image_location = vtku.Text() + text_image_location.SetVerticalJustificationToBottom() + text_image_location.SetPosition(const.TEXT_POS_LEFT_DOWN) + text_image_location.SetValue("localization") + self.text_image_location = text_image_location + + value = _("id\nprotocol") + text_patient = vtku.Text() + text_patient.SetJustificationToRight() + text_patient.SetPosition(const.TEXT_POS_RIGHT_UP) + text_patient.SetValue(value) + self.text_patient = text_patient + + value = _("date time\n Made in InVesalius") + text_acquisition = vtku.Text() + text_acquisition.SetJustificationToRight() + text_acquisition.SetVerticalJustificationToBottom() + text_acquisition.SetPosition(const.TEXT_POS_RIGHT_DOWN) + text_acquisition.SetValue(value) + self.text_acquisition = text_acquisition + + renderer = vtk.vtkRenderer() + renderer.AddActor(actor) + renderer.AddActor(text_image_size.actor) + renderer.AddActor(text_image_location.actor) + renderer.AddActor(text_patient.actor) + renderer.AddActor(text_acquisition.actor) + self.renderer = renderer + + style = vtk.vtkInteractorStyleImage() + + interactor = wxVTKRenderWindowInteractor(self.panel, -1, + size=wx.Size(340,340)) + interactor.GetRenderWindow().AddRenderer(renderer) + interactor.SetInteractorStyle(style) + interactor.Render() + self.interactor = interactor + + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(interactor, 1, wx.GROW|wx.EXPAND) + sizer.Fit(self.panel) + self.panel.SetSizer(sizer) + self.Layout() + self.Update() + + def __init_gui(self): + self.panel = wx.Panel(self, -1) + + slider = wx.Slider(self, + id=-1, + value=0, + minValue=0, + maxValue=99, + style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS) + slider.SetWindowVariant(wx.WINDOW_VARIANT_SMALL) + slider.SetTickFreq(1, 1) + self.slider = slider + + checkbox = wx.CheckBox(self, -1, _("Auto-play")) + self.checkbox = checkbox + + in_sizer = wx.BoxSizer(wx.HORIZONTAL) + in_sizer.Add(slider, 1, wx.GROW|wx.EXPAND) + in_sizer.Add(checkbox, 0) + + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.panel, 20, wx.GROW|wx.EXPAND) + sizer.Add(in_sizer, 1, wx.GROW|wx.EXPAND) + sizer.Fit(self) + + self.SetSizer(sizer) + self.Layout() + self.Update() + self.SetAutoLayout(1) + + def __bind_evt_gui(self): + self.slider.Bind(wx.EVT_SLIDER, self.OnSlider) + self.checkbox.Bind(wx.EVT_CHECKBOX, self.OnCheckBox) + + def OnSlider(self, evt): + pos = evt.GetInt() + self.ShowSlice(pos) + evt.Skip() + + def OnCheckBox(self, evt): + self.ischecked = evt.IsChecked() + if evt.IsChecked(): + wx.CallAfter(self.OnRun) + evt.Skip() + + def OnRun(self): + pos = self.slider.GetValue() + pos += 1 + if not (self.nimages- pos): + pos = 0 + self.slider.SetValue(pos) + self.ShowSlice(pos) + time.sleep(0.2) + if self.ischecked: + try: + wx.Yield() + #TODO: temporary fix necessary in the Windows XP 64 Bits + #BUG in wxWidgets http://trac.wxwidgets.org/ticket/10896 + except(wx._core.PyAssertionError): + print "wx._core.PyAssertionError" + finally: + wx.CallAfter(self.OnRun) + + def SetDicomGroup(self, group): + self.dicom_list = group.GetHandSortedList() + self.current_index = 0 + self.nimages = len(self.dicom_list) + # GUI + self.slider.SetMax(self.nimages-1) + print self.nimages + self.slider.SetValue(0) + self.ShowSlice() + + def ShowSlice(self, index = 0): + print "ShowSlice" + dicom = self.dicom_list[index] + + # UPDATE GUI + ## Text related to size + value = STR_SIZE %(dicom.image.size[0], dicom.image.size[1]) + self.text_image_size.SetValue(value) + + ## Text related to slice position + value1 = STR_SPC %(dicom.image.spacing[2]) + value2 = STR_LOCAL %(dicom.image.position[2]) + value = "%s\n%s" %(value1, value2) + self.text_image_location.SetValue(value) + + ## Text related to patient/ acquisiiton data + value = STR_PATIENT %(dicom.patient.id,\ + dicom.acquisition.protocol_name) + self.text_patient.SetValue(value) + + ## Text related to acquisition date and time + value = STR_ACQ % (dicom.acquisition.date, + 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 + colorer = vtk.vtkImageMapToWindowLevelColors() + colorer.SetInput(dicom.image.imagedata) + colorer.SetWindow(float(window_width)) + colorer.SetLevel(float(window_level)) + + # PLOT IMAGE INTO VIEWER + self.actor.SetInput(colorer.GetOutput()) + self.renderer.ResetCamera() + self.interactor.Render() + + def __del__(self): + print "---------> morri" + diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index 16bbcd8..0a4b8e5 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -24,6 +24,29 @@ import wx.lib.splitter as spl import dicom_preview_panel as dpp import reader.dicom_grouper as dcm +myEVT_SELECT_SERIE = wx.NewEventType() +EVT_SELECT_SERIE = wx.PyEventBinder(myEVT_SELECT_SERIE, 1) + +myEVT_SELECT_SLICE = wx.NewEventType() +EVT_SELECT_SLICE = wx.PyEventBinder(myEVT_SELECT_SLICE, 1) + +class SelectEvent(wx.PyCommandEvent): + def __init__(self , evtType, id): + super(SelectEvent, self).__init__(evtType, id) + + def GetSelectID(self): + return self.SelectedID + + def SetSelectedID(self, id): + self.SelectedID = id + + def GetItemData(self): + return self.data + + def SetItemData(self, data): + self.data = data + + class Panel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, pos=wx.Point(5, 5))#, @@ -74,14 +97,25 @@ class InnerPanel(wx.Panel): self.image_panel = ImagePanel(splitter) splitter.AppendWindow(self.image_panel, 250) - self.__bind_evt() + self._bind_events() + self._bind_pubsubevt() - def __bind_evt(self): + def _bind_pubsubevt(self): ps.Publisher().subscribe(self.ShowDicomPreview, "Load import panel") + + def _bind_events(self): + self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) + self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) def ShowDicomPreview(self, pubsub_evt): dicom_groups = pubsub_evt.data self.text_panel.Populate(dicom_groups) + + def OnSelectSerie(self, evt): + print "You've selected the serie", evt.GetSelectID() + + def OnSelectSlice(self, evt): + print "You've selected the slice", evt.GetSelectID() class TextPanel(wx.Panel): @@ -141,6 +175,7 @@ class TextPanel(wx.Panel): def Populate(self, patient_list): tree = self.tree + self.idserie_treeitem = {} first = 0 for patient in patient_list: @@ -172,7 +207,7 @@ class TextPanel(wx.Panel): tree.SetItemText(parent, "%s" % dicom.patient.physician, 11) group_list = patient.GetGroups() - for group in group_list: + for n, group in enumerate(group_list): dicom = group.GetDicomSample() child = tree.AppendItem(parent, group.title) @@ -184,14 +219,16 @@ class TextPanel(wx.Panel): tree.SetItemText(child, "%s" % date_time, 6) tree.SetItemText(child, "%s" % group.nslices, 7) + self.idserie_treeitem[n] = child + tree.Expand(self.root) tree.SelectItem(parent_select) + print "parent select", parent_select tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate) tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged) - def OnSelChanged(self, evt): item = self.tree.GetSelection() group = self.tree.GetItemPyData(item) @@ -202,7 +239,6 @@ class TextPanel(wx.Panel): ps.Publisher().sendMessage('Load patient into import panel', group) - def OnActivate(self, evt): item = evt.GetItem() group = self.tree.GetItemPyData(item) @@ -218,15 +254,23 @@ class TextPanel(wx.Panel): def OnSize(self, evt): self.tree.SetSize(self.GetSize()) + def SelectSerie(self, serie): + item = self.idserie_treeitem[serie] + self.tree.SelectItem(item) + class ImagePanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) - #self.SetBackgroundColour((0,255,0)) - + self._init_ui() + self._bind_events() + + def _init_ui(self): splitter = spl.MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE) splitter.SetOrientation(wx.HORIZONTAL) self.splitter = splitter + + splitter.ContainingSizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(splitter, 1, wx.EXPAND) @@ -238,13 +282,27 @@ class ImagePanel(wx.Panel): self.image_panel = SlicePanel(splitter) splitter.AppendWindow(self.image_panel, 250) - self.SetSizer(sizer) sizer.Fit(self) self.Layout() self.Update() self.SetAutoLayout(1) + + def _bind_events(self): + self.text_panel.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) + self.text_panel.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) + + def OnSelectSerie(self, evt): + print "Hi, You selected Serie" + evt.Skip() + + def OnSelectSlice(self, evt): + print "Hi, You selected slice" + print "Selected ID", evt.GetSelectID() + self.image_panel.dicom_preview.ShowSlice(evt.GetSelectID()) + evt.Skip() + class SeriesPanel(wx.Panel): def __init__(self, parent): @@ -252,7 +310,7 @@ class SeriesPanel(wx.Panel): #self.SetBackgroundColour((0,0,0)) self.serie_preview = dpp.DicomPreviewSeries(self) - self.dicom_preview = dpp.DicomPreview(self) + self.dicom_preview = dpp.DicomPreviewSlice(self) self.dicom_preview.Show(0) self.sizer = wx.BoxSizer(wx.HORIZONTAL) @@ -260,10 +318,8 @@ class SeriesPanel(wx.Panel): self.sizer.Add(self.dicom_preview, 1, wx.EXPAND | wx.ALL, 5) self.sizer.Fit(self) - self.SetSizer(self.sizer) - self.Layout() self.Update() self.SetAutoLayout(1) @@ -277,7 +333,8 @@ class SeriesPanel(wx.Panel): ps.Publisher().subscribe(self.SetPatientSeries, 'Load patient into import panel') def _bind_gui_evt(self): - self.Bind(dpp.EVT_SELECT_SERIE, self.OnSelectSerie) + self.serie_preview.Bind(dpp.EVT_CLICK_SERIE, self.OnSelectSerie) + self.dicom_preview.Bind(dpp.EVT_CLICK_SLICE, self.OnSelectSlice) def SetDicomSeries(self, pubsub_evt): group = pubsub_evt.data @@ -286,7 +343,6 @@ class SeriesPanel(wx.Panel): self.serie_preview.Show(0) self.sizer.Layout() self.Update() - def SetPatientSeries(self, pubsub_evt): patient = pubsub_evt.data @@ -299,26 +355,36 @@ class SeriesPanel(wx.Panel): self.Update() - def OnSelectSerie(self, evt): - serie = evt.GetSelectID() - self.dicom_preview.SetDicomSerie(serie) - + print "Hey, You selected a serie" + serie = evt.GetItemData() data = evt.GetItemData() + my_evt = SelectEvent(myEVT_SELECT_SERIE, self.GetId()) + my_evt.SetSelectedID(evt.GetSelectID()) + 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.sizer.Layout() #self.Show() self.Update() + def OnSelectSlice(self, evt): + print "Hey, Ho, Let's go", evt.GetSelectID() + + my_evt = SelectEvent(myEVT_SELECT_SLICE, self.GetId()) + my_evt.SetSelectedID(evt.GetSelectID()) + my_evt.SetItemData(evt.GetItemData()) + self.GetEventHandler().ProcessEvent(my_evt) def ShowDicomSeries(self, pubsub_evt): patient = pubsub_evt.data if isinstance(patient, dcm.PatientGroup): self.serie_preview.SetPatientGroups(patient) self.dicom_preview.SetPatientGroups(patient) - class SlicePanel(wx.Panel): @@ -352,15 +418,13 @@ class SlicePanel(wx.Panel): self.dicom_preview.SetDicomGroup(group) self.sizer.Layout() self.Update() - - def SetDicomSeries(self, pubsub_evt): - group = pubsub_evt.data + def SetDicomSeries(self, evt): + group = evt.data self.dicom_preview.SetDicomGroup(group) self.sizer.Layout() self.Update() - def ShowDicomSeries(self, pubsub_evt): patient = pubsub_evt.data group = patient.GetGroups()[0] -- libgit2 0.21.2