Commit bc21685fee9a79071c8678b8792739b3e6c722b5
1 parent
2faf0f45
Exists in
master
and in
68 other branches
ADD: ProgressDialog in the loading serie
Showing
5 changed files
with
123 additions
and
16 deletions
Show diff stats
invesalius/control.py
| ... | ... | @@ -51,8 +51,9 @@ class Controller(): |
| 51 | 51 | #self.frame.Bind(reader.evt_end_load_file, self.LoadPanel) |
| 52 | 52 | |
| 53 | 53 | def Progress(self, evt): |
| 54 | - print evt | |
| 55 | 54 | data = evt.data |
| 55 | + if (data): | |
| 56 | + message = "Loading file %d of %d"%(data[0],data[1]) | |
| 56 | 57 | |
| 57 | 58 | if (data): |
| 58 | 59 | if not(self.progress_dialog): |
| ... | ... | @@ -60,7 +61,7 @@ class Controller(): |
| 60 | 61 | maximum = data[1]) |
| 61 | 62 | else: |
| 62 | 63 | print data[0] |
| 63 | - if not(self.progress_dialog.Update(data[0])): | |
| 64 | + if not(self.progress_dialog.Update(data[0],message)): | |
| 64 | 65 | self.progress_dialog.Close() |
| 65 | 66 | self.progress_dialog = None |
| 66 | 67 | else: |
| ... | ... | @@ -153,7 +154,7 @@ class Controller(): |
| 153 | 154 | |
| 154 | 155 | def OnOpenDicomGroup(self, pubsub_evt): |
| 155 | 156 | group = pubsub_evt.data |
| 156 | - imagedata, dicom = self.OpenDicomGroup(group, gui=False) | |
| 157 | + imagedata, dicom = self.OpenDicomGroup(group, gui=True) | |
| 157 | 158 | self.CreateDicomProject(imagedata, dicom) |
| 158 | 159 | self.LoadProject() |
| 159 | 160 | ... | ... |
invesalius/data/imagedata_utils.py
| 1 | 1 | import math |
| 2 | 2 | import vtk |
| 3 | 3 | import vtkgdcm |
| 4 | +import wx.lib.pubsub as ps | |
| 4 | 5 | |
| 5 | 6 | import constants as const |
| 7 | +from data import vtk_utils | |
| 8 | + | |
| 6 | 9 | |
| 7 | 10 | # TODO: Test cases which are originally in sagittal/coronal orientation |
| 8 | 11 | # and have gantry |
| ... | ... | @@ -27,7 +30,8 @@ def ResampleImage3D(imagedata, value): |
| 27 | 30 | |
| 28 | 31 | return resample.GetOutput() |
| 29 | 32 | |
| 30 | -def ResampleImage2D(imagedata, xy_dimension): | |
| 33 | +def ResampleImage2D(imagedata, xy_dimension, | |
| 34 | + update_progress = None): | |
| 31 | 35 | """ |
| 32 | 36 | Resample vtkImageData matrix. |
| 33 | 37 | """ |
| ... | ... | @@ -56,6 +60,10 @@ def ResampleImage2D(imagedata, xy_dimension): |
| 56 | 60 | resample.SetAxisMagnificationFactor(0, factor) |
| 57 | 61 | resample.SetAxisMagnificationFactor(1, factor) |
| 58 | 62 | resample.SetOutputSpacing(spacing[0] * factor, spacing[1] * factor, spacing[2]) |
| 63 | + if (update_progress): | |
| 64 | + message = "Generating multiplanar visualization..." | |
| 65 | + resample.AddObserver("ProgressEvent", lambda obj, | |
| 66 | + evt:update_progress(resample,message)) | |
| 59 | 67 | resample.Update() |
| 60 | 68 | |
| 61 | 69 | |
| ... | ... | @@ -167,14 +175,18 @@ def ExtractVOI(imagedata,xi,xf,yi,yf,zi,zf): |
| 167 | 175 | return voi.GetOutput() |
| 168 | 176 | |
| 169 | 177 | def CreateImageData(filelist, zspacing): |
| 170 | - | |
| 178 | + message = "Generating multiplanar visualization..." | |
| 171 | 179 | if not(const.REDUCE_IMAGEDATA_QUALITY): |
| 180 | + update_progress= vtk_utils.ShowProgress(1) | |
| 181 | + | |
| 172 | 182 | array = vtk.vtkStringArray() |
| 173 | 183 | for x in xrange(len(filelist)): |
| 174 | 184 | array.InsertValue(x,filelist[x]) |
| 175 | - | |
| 185 | + | |
| 176 | 186 | reader = vtkgdcm.vtkGDCMImageReader() |
| 177 | 187 | reader.SetFileNames(array) |
| 188 | + reader.AddObserver("ProgressEvent", lambda obj,evt: | |
| 189 | + update_progress(reader,message)) | |
| 178 | 190 | reader.Update() |
| 179 | 191 | |
| 180 | 192 | # The zpacing is a DicomGroup property, so we need to set it |
| ... | ... | @@ -183,6 +195,9 @@ def CreateImageData(filelist, zspacing): |
| 183 | 195 | spacing = imagedata.GetSpacing() |
| 184 | 196 | imagedata.SetSpacing(spacing[0], spacing[1], zspacing) |
| 185 | 197 | else: |
| 198 | + update_progress= vtk_utils.ShowProgress(2*len(filelist), | |
| 199 | + dialog_type = "ProgressDialog") | |
| 200 | + | |
| 186 | 201 | # Reformat each slice and future append them |
| 187 | 202 | appender = vtk.vtkImageAppend() |
| 188 | 203 | appender.SetAppendAxis(2) #Define Stack in Z |
| ... | ... | @@ -194,13 +209,16 @@ def CreateImageData(filelist, zspacing): |
| 194 | 209 | # If the resolution of the matrix is too large |
| 195 | 210 | reader = vtkgdcm.vtkGDCMImageReader() |
| 196 | 211 | reader.SetFileName(filelist[x]) |
| 212 | + reader.AddObserver("ProgressEvent", lambda obj,evt: | |
| 213 | + update_progress(reader,message)) | |
| 197 | 214 | reader.Update() |
| 198 | 215 | |
| 199 | 216 | #Resample image in x,y dimension |
| 200 | - slice_imagedata = ResampleImage2D(reader.GetOutput(), 256) | |
| 217 | + slice_imagedata = ResampleImage2D(reader.GetOutput(), 256, update_progress) | |
| 201 | 218 | |
| 202 | 219 | #Stack images in Z axes |
| 203 | 220 | appender.AddInput(slice_imagedata) |
| 221 | + #appender.AddObserver("ProgressEvent", lambda obj,evt:update_progress(appender)) | |
| 204 | 222 | appender.Update() |
| 205 | 223 | |
| 206 | 224 | # The zpacing is a DicomGroup property, so we need to set it |
| ... | ... | @@ -210,7 +228,78 @@ def CreateImageData(filelist, zspacing): |
| 210 | 228 | |
| 211 | 229 | imagedata.SetSpacing(spacing[0], spacing[1], zspacing) |
| 212 | 230 | |
| 231 | + imagedata.AddObserver("ProgressEvent", lambda obj,evt: | |
| 232 | + update_progress(imagedata,message)) | |
| 213 | 233 | imagedata.Update() |
| 234 | + | |
| 214 | 235 | return imagedata |
| 215 | 236 | |
| 216 | 237 | |
| 238 | +class ImageCreator: | |
| 239 | + def __init__(self): | |
| 240 | + ps.Publisher().sendMessage("Cancel imagedata load", self.CancelImageDataLoad) | |
| 241 | + | |
| 242 | + def CancelImageDataLoad(self, evt_pusub): | |
| 243 | + self.running = evt_pusub.data | |
| 244 | + | |
| 245 | + def CreateImageData(filelist, zspacing): | |
| 246 | + message = "Generating multiplanar visualization..." | |
| 247 | + if not(const.REDUCE_IMAGEDATA_QUALITY): | |
| 248 | + update_progress= vtk_utils.ShowProgress(1) | |
| 249 | + | |
| 250 | + array = vtk.vtkStringArray() | |
| 251 | + for x in xrange(len(filelist)): | |
| 252 | + array.InsertValue(x,filelist[x]) | |
| 253 | + | |
| 254 | + reader = vtkgdcm.vtkGDCMImageReader() | |
| 255 | + reader.SetFileNames(array) | |
| 256 | + reader.AddObserver("ProgressEvent", lambda obj,evt: | |
| 257 | + update_progress(reader,message)) | |
| 258 | + reader.Update() | |
| 259 | + | |
| 260 | + # The zpacing is a DicomGroup property, so we need to set it | |
| 261 | + imagedata = vtk.vtkImageData() | |
| 262 | + imagedata.DeepCopy(reader.GetOutput()) | |
| 263 | + spacing = imagedata.GetSpacing() | |
| 264 | + imagedata.SetSpacing(spacing[0], spacing[1], zspacing) | |
| 265 | + else: | |
| 266 | + update_progress= vtk_utils.ShowProgress(2*len(filelist), | |
| 267 | + dialog_type = "ProgressDialog") | |
| 268 | + | |
| 269 | + # Reformat each slice and future append them | |
| 270 | + appender = vtk.vtkImageAppend() | |
| 271 | + appender.SetAppendAxis(2) #Define Stack in Z | |
| 272 | + | |
| 273 | + # Reformat each slice | |
| 274 | + for x in xrange(len(filelist)): | |
| 275 | + # TODO: We need to check this automatically according | |
| 276 | + # to each computer's architecture | |
| 277 | + # If the resolution of the matrix is too large | |
| 278 | + reader = vtkgdcm.vtkGDCMImageReader() | |
| 279 | + reader.SetFileName(filelist[x]) | |
| 280 | + reader.AddObserver("ProgressEvent", lambda obj,evt: | |
| 281 | + update_progress(reader,message)) | |
| 282 | + reader.Update() | |
| 283 | + | |
| 284 | + #Resample image in x,y dimension | |
| 285 | + slice_imagedata = ResampleImage2D(reader.GetOutput(), 256, update_progress) | |
| 286 | + | |
| 287 | + #Stack images in Z axes | |
| 288 | + appender.AddInput(slice_imagedata) | |
| 289 | + #appender.AddObserver("ProgressEvent", lambda obj,evt:update_progress(appender)) | |
| 290 | + appender.Update() | |
| 291 | + | |
| 292 | + # The zpacing is a DicomGroup property, so we need to set it | |
| 293 | + imagedata = vtk.vtkImageData() | |
| 294 | + imagedata.DeepCopy(appender.GetOutput()) | |
| 295 | + spacing = imagedata.GetSpacing() | |
| 296 | + | |
| 297 | + imagedata.SetSpacing(spacing[0], spacing[1], zspacing) | |
| 298 | + | |
| 299 | + imagedata.AddObserver("ProgressEvent", lambda obj,evt: | |
| 300 | + update_progress(imagedata,message)) | |
| 301 | + imagedata.Update() | |
| 302 | + | |
| 303 | + return imagedata | |
| 304 | + | |
| 305 | + | ... | ... |
invesalius/data/vtk_utils.py
| 1 | 1 | import wx.lib.pubsub as ps |
| 2 | 2 | import vtk |
| 3 | 3 | |
| 4 | + | |
| 4 | 5 | import constants as const |
| 6 | +from gui.dialogs import ProgressDialog | |
| 5 | 7 | |
| 6 | 8 | # If you are frightened by the code bellow, or think it must have been result of |
| 7 | 9 | # an identation error, lookup at: |
| ... | ... | @@ -13,7 +15,8 @@ import constants as const |
| 13 | 15 | # http://www.ibm.com/developerworks/library/l-prog2.html |
| 14 | 16 | # http://jjinux.blogspot.com/2006/10/python-modifying-counter-in-closure.html |
| 15 | 17 | |
| 16 | -def ShowProgress(number_of_filters = 1): | |
| 18 | +def ShowProgress(number_of_filters = 1, | |
| 19 | + dialog_type="GaugeProgress"): | |
| 17 | 20 | """ |
| 18 | 21 | To use this closure, do something like this: |
| 19 | 22 | UpdateProgress = ShowProgress(NUM_FILTERS) |
| ... | ... | @@ -21,10 +24,13 @@ def ShowProgress(number_of_filters = 1): |
| 21 | 24 | """ |
| 22 | 25 | progress = [0] |
| 23 | 26 | last_obj_progress = [0] |
| 27 | + if (dialog_type == "ProgressDialog"): | |
| 28 | + dlg = ProgressDialog(100) | |
| 29 | + | |
| 24 | 30 | |
| 25 | 31 | # when the pipeline is larger than 1, we have to consider this object |
| 26 | 32 | # percentage |
| 27 | - ratio = 100.0 / number_of_filters | |
| 33 | + ratio = (100.0 / number_of_filters) | |
| 28 | 34 | |
| 29 | 35 | def UpdateProgress(obj, label=""): |
| 30 | 36 | """ |
| ... | ... | @@ -46,8 +52,16 @@ def ShowProgress(number_of_filters = 1): |
| 46 | 52 | progress[0] = progress[0] + ratio*difference |
| 47 | 53 | |
| 48 | 54 | # Tell GUI to update progress status value |
| 49 | - ps.Publisher().sendMessage('Update status in GUI', | |
| 50 | - (progress[0], label)) | |
| 55 | + if (dialog_type == "GaugeProgress"): | |
| 56 | + ps.Publisher().sendMessage('Update status in GUI', | |
| 57 | + (progress[0], label)) | |
| 58 | + else: | |
| 59 | + if (int(progress[0]) == 99): | |
| 60 | + progress[0] = 100 | |
| 61 | + | |
| 62 | + if not(dlg.Update(progress[0],label)): | |
| 63 | + dlg.Close() | |
| 64 | + | |
| 51 | 65 | return progress[0] |
| 52 | 66 | |
| 53 | 67 | return UpdateProgress | ... | ... |
invesalius/gui/dialogs.py
| ... | ... | @@ -78,19 +78,18 @@ class ProgressDialog(object): |
| 78 | 78 | ) |
| 79 | 79 | |
| 80 | 80 | self.dlg.Bind(wx.EVT_BUTTON, self.Cancel) |
| 81 | - self.dlg.SetSize(wx.Size(200,150)) | |
| 81 | + self.dlg.SetSize(wx.Size(215,150)) | |
| 82 | 82 | |
| 83 | 83 | def Cancel(self, evt): |
| 84 | 84 | ps.Publisher().sendMessage("Cancel DICOM load") |
| 85 | 85 | |
| 86 | - def Update(self, value): | |
| 87 | - message = "Loading file %d of %d"%(value,self.maximum) | |
| 88 | - if(value != self.maximum): | |
| 86 | + def Update(self, value, message): | |
| 87 | + if(int(value) != self.maximum): | |
| 89 | 88 | self.dlg.Update(value,message) |
| 90 | 89 | return True |
| 91 | 90 | else: |
| 92 | 91 | return False |
| 93 | - | |
| 92 | + | |
| 94 | 93 | def Close(self): |
| 95 | 94 | self.dlg.Destroy() |
| 96 | 95 | ... | ... |
invesalius/gui/frame.py
| ... | ... | @@ -308,6 +308,10 @@ class StatusBar(wx.StatusBar): |
| 308 | 308 | value, label = pubsub_evt.data |
| 309 | 309 | self.progress_bar.UpdateValue(value) |
| 310 | 310 | self.SetStatusText(label, 0) |
| 311 | + if (int(value) >= 99): | |
| 312 | + self.SetStatusText("",0) | |
| 313 | + wx.Yield() | |
| 314 | + | |
| 311 | 315 | |
| 312 | 316 | def UpdateStatusLabel(self, pubsub_evt): |
| 313 | 317 | label = pubsub_evt.data | ... | ... |