diff --git a/invesalius/control.py b/invesalius/control.py index 344dccc..980cb2c 100755 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -437,14 +437,13 @@ class Controller(): proj.SavePlistProject(dirpath, filename) def OnOpenDicomGroup(self, pubsub_evt): - group, interval = pubsub_evt.data - imagedata, dicom = self.OpenDicomGroup(group, interval, gui=True) + group, interval, file_range = pubsub_evt.data + imagedata, dicom = self.OpenDicomGroup(group, interval, file_range, gui=True) self.CreateDicomProject(imagedata, dicom) self.LoadProject() ps.Publisher().sendMessage("Enable state project", True) - def OpenDicomGroup(self, dicom_group, interval, gui=True): - + def OpenDicomGroup(self, dicom_group, interval, file_range, gui=True): # Retrieve general DICOM headers dicom = dicom_group.GetDicomSample() @@ -454,7 +453,10 @@ class Controller(): if not filelist: debug("Not used the IPPSorter") filelist = [i.image.file for i in dicom_group.GetHandSortedList()[::interval]] - + + if file_range != None and file_range[1] > file_range[0]: + filelist = filelist[file_range[0]:file_range[1] + 1] + zspacing = dicom_group.zspacing * interval size = dicom.image.size bits = dicom.image.bits_allocad diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index 943c70e..1b14f83 100755 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -29,6 +29,7 @@ import vtk from vtk.util import numpy_support from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor +import wx.lib.pubsub as ps import constants as const from reader import dicom_reader @@ -68,6 +69,7 @@ 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 @@ -85,9 +87,15 @@ class PreviewEvent(wx.PyCommandEvent): def GetItemData(self): return self.data + def GetPressedShift(self): + return self.pressed_shift + def SetItemData(self, data): self.data = data + def SetShiftStatus(self, status): + self.pressed_shift = status + class SerieEvent(PreviewEvent): def __init__(self , evtType, id): @@ -168,16 +176,12 @@ class Preview(wx.Panel): The little previews. """ def __init__(self, parent): - super(Preview, self).__init__(parent, style=wx.TAB_TRAVERSAL|wx.NO_BORDER) + super(Preview, self).__init__(parent) # Will it be white? self.select_on = False self.dicom_info = None self._init_ui() - - self.selected_images = [] - self.pressed_shift = 0 self._bind_events() - self.parent = parent def _init_ui(self): self.SetBackgroundColour(PREVIEW_BACKGROUND) @@ -222,23 +226,11 @@ class Preview(wx.Panel): #self.subtitle.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) self.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) - - - def OnPressedShift(self, evt): - print "ddddddddddddddddddddddddd" - if evt.GetKeyCode() == wx.WXK_SHIFT: - self.pressed_shift = 1 - - - def OnReleasedShift(self, evt): - if evt.GetKeyCode() == wx.WXK_SHIFT: - self.pressed_shift = 0 def SetDicomToPreview(self, dicom_info): """ @@ -277,6 +269,12 @@ class Preview(wx.Panel): self.SetBackgroundColour(c) def OnSelect(self, evt): + + shift_pressed = False + if evt.m_shiftDown: + shift_pressed = True + + dicom_id = self.dicom_info.id self.select_on = True self.dicom_info.selected = True ##c = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNHIGHLIGHT) @@ -292,19 +290,16 @@ class Preview(wx.Panel): #c = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DSHADOW) #self.SetBackgroundColour(c) self.Select() - print evt.m_shiftDown - print "SHIFTHHHHHHHHHHHHHHH>>>>", self.pressed_shift - if (self.pressed_shift): - dicom_id = self.dicom_info.id - print "=======>>>>>>>>>>>>>>>>>>>>>>>>>>>>", self.dicom_info.id - + # 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) + my_evt.SetShiftStatus(shift_pressed) my_evt.SetEventObject(self) self.GetEventHandler().ProcessEvent(my_evt) - + evt.Skip() + def OnSize(self, evt): if self.dicom_info: @@ -319,7 +314,6 @@ class Preview(wx.Panel): self.SetBackgroundColour(c) self.Refresh() - def OnDClick(self, evt): my_evt = SerieEvent(myEVT_PREVIEW_DBLCLICK, self.GetId()) my_evt.SetSelectedID(self.dicom_info.id) @@ -475,6 +469,8 @@ class DicomPreviewSlice(wx.Panel): self.nhidden_last_display = 0 self.selected_dicom = None self.selected_panel = None + self.first_selection = None + self.last_selection = None self._init_ui() def _init_ui(self): @@ -598,18 +594,61 @@ class DicomPreviewSlice(wx.Panel): p.Show() def OnPreviewClick(self, evt): + + dicom_id = evt.GetSelectID() + + if self.first_selection is None: + self.first_selection = dicom_id + + if self.last_selection is None: + self.last_selection = dicom_id + + + if evt.GetPressedShift(): + + if dicom_id < self.first_selection and dicom_id < self.last_selection: + self.first_selection = dicom_id + else: + self.last_selection = dicom_id + else: + self.first_selection = dicom_id + self.last_selection = dicom_id + + for i in xrange(len(self.files)): + + if i == dicom_id: + self.files[i].selected = True + else: + self.files[i].selected = False + + 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() - self.selected_panel.Select() + + if self.first_selection != self.last_selection: + for i in xrange(len(self.files)): + if i >= self.first_selection and i <= self.last_selection: + self.files[i].selected = True + else: + self.files[i].selected = False + + else: + self.selected_panel.Select() + + self._display_previews() self.selected_panel = evt.GetEventObject() self.selected_dicom = self.selected_panel.dicom_info self.GetEventHandler().ProcessEvent(my_evt) + ps.Publisher().sendMessage("Selected Import Images", [self.first_selection, \ + self.last_selection]) + def OnScroll(self, evt=None): if evt: if self.displayed_position != evt.GetPosition(): diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index e942300..19357b6 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -78,7 +78,8 @@ class InnerPanel(wx.Panel): #size=wx.Size(680, 656)) self.patients = [] - + self.first_image_selection = None + self.last_image_selection = None self._init_ui() self._bind_events() self._bind_pubsubevt() @@ -126,7 +127,12 @@ class InnerPanel(wx.Panel): def _bind_pubsubevt(self): ps.Publisher().subscribe(self.ShowDicomPreview, "Load import panel") + ps.Publisher().subscribe(self.GetSelectedImages ,"Selected Import Images") + def GetSelectedImages(self, pubsub_evt): + self.first_image_selection = pubsub_evt.data[0] + self.last_image_selection = pubsub_evt.data[1] + def _bind_events(self): self.Bind(EVT_SELECT_SERIE, self.OnSelectSerie) self.Bind(EVT_SELECT_SLICE, self.OnSelectSlice) @@ -171,11 +177,18 @@ class InnerPanel(wx.Panel): interval = self.combo_interval.GetSelection() if not isinstance(group, dcm.DicomGroup): group = max(group.GetGroups(), key=lambda g: g.nslices) - - nslices_result = group.nslices / (interval + 1) - + + slice_amont = group.nslices + if (self.first_image_selection != None) and (self.first_image_selection != self.last_image_selection): + slice_amont = (self.last_image_selection) - self.first_image_selection + slice_amont += 1 + if slice_amont == 0: + slice_amont = group.nslices + + nslices_result = slice_amont / (interval + 1) if (nslices_result > 1): - ps.Publisher().sendMessage('Open DICOM group', (group, interval)) + ps.Publisher().sendMessage('Open DICOM group', (group, interval, + [self.first_image_selection, self.last_image_selection])) else: dlg.MissingFilesForReconstruction() @@ -391,6 +404,7 @@ class SeriesPanel(wx.Panel): self.serie_preview = dpp.DicomPreviewSeries(self) self.dicom_preview = dpp.DicomPreviewSlice(self) self.dicom_preview.Show(0) + self.sizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(self.serie_preview, 1, wx.EXPAND | wx.ALL, 5) @@ -423,6 +437,9 @@ class SeriesPanel(wx.Panel): self.sizer.Layout() self.Update() + def GetSelectedImagesRange(self): + return [self.dicom_preview.first_selected, self.dicom_preview_last_selection] + def SetPatientSeries(self, pubsub_evt): patient = pubsub_evt.data -- libgit2 0.21.2