Commit 423f557b3c411f35aaefd0f2183360afb978c4bc

Authored by tatiana
1 parent e4ecdc27

ADD: Import preview and slice auto-play and slider (under devel)

invesalius/gui/dicom_preview_panel.py
@@ -31,6 +31,8 @@ import vtkgdcm @@ -31,6 +31,8 @@ import vtkgdcm
31 import constants as const 31 import constants as const
32 from reader import dicom_reader 32 from reader import dicom_reader
33 import data.vtk_utils as vtku 33 import data.vtk_utils as vtku
  34 +import time
  35 +
34 36
35 NROWS = 3 37 NROWS = 3
36 NCOLS = 6 38 NCOLS = 6
@@ -47,7 +49,9 @@ class SingleImagePreview(wx.Panel): @@ -47,7 +49,9 @@ class SingleImagePreview(wx.Panel):
47 wx.Panel.__init__(self, parent, -1) 49 wx.Panel.__init__(self, parent, -1)
48 self.__init_gui() 50 self.__init_gui()
49 self.__init_vtk() 51 self.__init_vtk()
50 - self.filelist = [] 52 + self.__bind_evt_gui()
  53 + self.dicom_list = []
  54 + self.nimages = 1
51 self.current_index = 0 55 self.current_index = 0
52 self.window_width = const.WINDOW_LEVEL["Bone"][0] 56 self.window_width = const.WINDOW_LEVEL["Bone"][0]
53 self.window_level = const.WINDOW_LEVEL["Bone"][1] 57 self.window_level = const.WINDOW_LEVEL["Bone"][1]
@@ -97,7 +101,7 @@ class SingleImagePreview(wx.Panel): @@ -97,7 +101,7 @@ class SingleImagePreview(wx.Panel):
97 style = vtk.vtkInteractorStyleImage() 101 style = vtk.vtkInteractorStyleImage()
98 102
99 interactor = wxVTKRenderWindowInteractor(self.panel, -1, 103 interactor = wxVTKRenderWindowInteractor(self.panel, -1,
100 - size=wx.Size(380,380)) 104 + size=wx.Size(340,340))
101 interactor.GetRenderWindow().AddRenderer(renderer) 105 interactor.GetRenderWindow().AddRenderer(renderer)
102 interactor.SetInteractorStyle(style) 106 interactor.SetInteractorStyle(style)
103 interactor.Render() 107 interactor.Render()
@@ -113,28 +117,73 @@ class SingleImagePreview(wx.Panel): @@ -113,28 +117,73 @@ class SingleImagePreview(wx.Panel):
113 117
114 def __init_gui(self): 118 def __init_gui(self):
115 self.panel = wx.Panel(self, -1) 119 self.panel = wx.Panel(self, -1)
116 - self.slider = wx.Slider(self, 100, 25, 1, 100, (30, 60), (250, -1),  
117 - wx.SL_HORIZONTAL | wx.SL_AUTOTICKS)  
118 - self.slider.SetTickFreq(1, 1) 120 +
  121 + slider = wx.Slider(self,
  122 + id=-1,
  123 + value=0,
  124 + minValue=0,
  125 + maxValue=99,
  126 + style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS)
  127 + slider.SetWindowVariant(wx.WINDOW_VARIANT_SMALL)
  128 + slider.SetTickFreq(1, 1)
  129 + self.slider = slider
  130 +
  131 + checkbox = wx.CheckBox(self, -1, "Auto-play")
  132 + self.checkbox = checkbox
  133 +
  134 + in_sizer = wx.BoxSizer(wx.HORIZONTAL)
  135 + in_sizer.Add(slider, 1, wx.GROW|wx.EXPAND)
  136 + in_sizer.Add(checkbox, 0)
119 137
120 sizer = wx.BoxSizer(wx.VERTICAL) 138 sizer = wx.BoxSizer(wx.VERTICAL)
121 sizer.Add(self.panel, 20, wx.GROW|wx.EXPAND) 139 sizer.Add(self.panel, 20, wx.GROW|wx.EXPAND)
122 - sizer.Add(self.slider, 1, wx.GROW|wx.EXPAND) 140 + sizer.Add(in_sizer, 1, wx.GROW|wx.EXPAND)
123 sizer.Fit(self) 141 sizer.Fit(self)
124 142
125 self.SetSizer(sizer) 143 self.SetSizer(sizer)
126 self.Layout() 144 self.Layout()
127 self.Update() 145 self.Update()
128 self.SetAutoLayout(1) 146 self.SetAutoLayout(1)
129 -  
130 147
  148 + def __bind_evt_gui(self):
  149 + self.slider.Bind(wx.EVT_SLIDER, self.OnSlider)
  150 + self.checkbox.Bind(wx.EVT_CHECKBOX, self.OnCheckBox)
  151 +
  152 + def OnSlider(self, evt):
  153 + pos = evt.GetInt()
  154 + self.ShowSlice(pos)
  155 + evt.Skip()
  156 +
  157 + def OnCheckBox(self, evt):
  158 + self.ischecked = evt.IsChecked()
  159 + if evt.IsChecked():
  160 + wx.CallAfter(self.OnRun)
  161 + evt.Skip()
  162 +
  163 + def OnRun(self):
  164 + pos = self.slider.GetValue()
  165 + pos += 1
  166 + if not (self.nimages- pos):
  167 + pos = 0
  168 + self.slider.SetValue(pos)
  169 + self.ShowSlice(pos)
  170 + time.sleep(0.2)
  171 + if self.ischecked:
  172 + wx.Yield()
  173 + wx.CallAfter(self.OnRun)
  174 +
131 def SetDicomGroup(self, group): 175 def SetDicomGroup(self, group):
132 self.dicom_list = group.GetHandSortedList() 176 self.dicom_list = group.GetHandSortedList()
133 self.current_index = 0 177 self.current_index = 0
  178 + self.nimages = len(self.dicom_list)
  179 + # GUI
  180 + self.slider.SetMax(self.nimages-1)
  181 + print self.nimages
  182 + self.slider.SetValue(0)
134 self.ShowSlice() 183 self.ShowSlice()
135 184
136 - def ShowSlice(self):  
137 - index = self.current_index 185 + def ShowSlice(self, index = 0):
  186 + print "ShowSlice"
138 dicom = self.dicom_list[index] 187 dicom = self.dicom_list[index]
139 188
140 # UPDATE GUI 189 # UPDATE GUI
@@ -164,6 +213,10 @@ class SingleImagePreview(wx.Panel): @@ -164,6 +213,10 @@ class SingleImagePreview(wx.Panel):
164 # ADJUST CONTRAST 213 # ADJUST CONTRAST
165 window_level = dicom.image.level 214 window_level = dicom.image.level
166 window_width = dicom.image.window 215 window_width = dicom.image.window
  216 + print "======"
  217 + print "WW/WL"
  218 + print window_level
  219 + print window_width
167 colorer = vtk.vtkImageMapToWindowLevelColors() 220 colorer = vtk.vtkImageMapToWindowLevelColors()
168 colorer.SetInput(reader.GetOutput()) 221 colorer.SetInput(reader.GetOutput())
169 colorer.SetWindow(float(window_width)) 222 colorer.SetWindow(float(window_width))
invesalius/gui/import_panel.py
@@ -50,8 +50,16 @@ class InnerPanel(wx.Panel): @@ -50,8 +50,16 @@ class InnerPanel(wx.Panel):
50 splitter.SetOrientation(wx.VERTICAL) 50 splitter.SetOrientation(wx.VERTICAL)
51 self.splitter = splitter 51 self.splitter = splitter
52 52
  53 + panel = wx.Panel(self)
  54 + button = wx.Button(panel, -1, "Import medical images", (20, 20))
  55 +
  56 + inner_sizer = wx.BoxSizer()
  57 + inner_sizer.Add(button, 0, wx.ALIGN_CENTER_HORIZONTAL, 40)
  58 + panel.SetSizer(inner_sizer)
  59 +
53 sizer = wx.BoxSizer(wx.VERTICAL) 60 sizer = wx.BoxSizer(wx.VERTICAL)
54 - sizer.Add(splitter, 1, wx.EXPAND) 61 + sizer.Add(splitter, 20, wx.EXPAND)
  62 + sizer.Add(panel, 1, wx.EXPAND)
55 63
56 self.SetSizer(sizer) 64 self.SetSizer(sizer)
57 sizer.Fit(self) 65 sizer.Fit(self)