Commit 423f557b3c411f35aaefd0f2183360afb978c4bc
1 parent
e4ecdc27
Exists in
master
and in
6 other branches
ADD: Import preview and slice auto-play and slider (under devel)
Showing
2 changed files
with
71 additions
and
10 deletions
Show diff stats
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) |