diff --git a/invesalius/control.py b/invesalius/control.py index ee16b9f..66a9b87 100755 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -22,6 +22,7 @@ class Controller(): self.surface_manager = surface.SurfaceManager() self.volume = volume.Volume() self.__bind_events() + self.frame = frame def __bind_events(self): ps.Publisher().subscribe(self.OnImportMedicalImages, 'Import directory') @@ -36,9 +37,25 @@ class Controller(): def StartImportPanel(self, pubsub_evt): # path to directory path = pubsub_evt.data - # retrieve DICOM files splited into groups - patient_series = dcm.GetDicomGroups(path) + + reader = dcm.ProgressDicomReader() + reader.SetWindowEvent(self.frame) + reader.SetDirectoryPath(str(path)) + + self.frame.Bind(dicomgroups.evt_update_progress, self.Progress) + self.frame.Bind(dicomgroups.evt_end_load_file, self.LoadPanel) + #thread.start_new_thread(t.GetDicomGroups, (path,True, lock)) + + def Progress(self, evt): + print evt.progress + print "AAAAA" + #ps.Publisher().sendMessage("Progress Import") + + def LoadPanel(self,evt): + print "LoadPanel" + print evt.value + patient_series = evt.value if patient_series: ps.Publisher().sendMessage("Load import panel", patient_series) first_patient = patient_series[0] @@ -46,6 +63,8 @@ class Controller(): else: print "No DICOM files on directory" + + def OnImportMedicalImages(self, pubsub_evt): directory = pubsub_evt.data self.ImportMedicalImages(directory) @@ -53,6 +72,7 @@ class Controller(): def ImportMedicalImages(self, directory): # OPTION 1: DICOM? patients_groups = dcm.GetDicomGroups(directory) + if len(patients_groups): group = dcm.SelectLargerDicomGroup(patients_groups) imagedata, dicom = self.OpenDicomGroup(group, gui=False) diff --git a/invesalius/reader/dicom_reader.py b/invesalius/reader/dicom_reader.py index ca72b43..29496db 100644 --- a/invesalius/reader/dicom_reader.py +++ b/invesalius/reader/dicom_reader.py @@ -16,12 +16,16 @@ # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais # detalhes. #-------------------------------------------------------------------------- +from vtk.util.colors import yellow import glob import os import vtk import vtkgdcm import gdcm +import thread +import wx +import wx.lib.pubsub as ps import constants as const import dicom @@ -29,8 +33,9 @@ import dicom_grouper import data.imagedata_utils as iu def ReadDicomGroup(dir_): - + patient_group = GetDicomGroups(dir_) + if len(patient_group) > 0: filelist, dicom, zspacing = SelectLargerDicomGroup(patient_group) filelist = SortFiles(filelist, dicom) @@ -65,13 +70,10 @@ def SortFiles(filelist, dicom): return filelist - -def GetDicomGroups(directory, recursive=True): +def yGetDicomGroups(directory, recursive=True, gui=True): """ Return all full paths to DICOM files inside given directory. """ - grouper = dicom_grouper.DicomPatientGrouper() - nfiles = 0 # Find total number of files if recursive: @@ -80,8 +82,10 @@ def GetDicomGroups(directory, recursive=True): else: dirpath, dirnames, filenames = os.walk(directory) nfiles = len(filenames) + print "TOTAL FILES:", nfiles - + counter = 0.0 + grouper = dicom_grouper.DicomPatientGrouper() # Retrieve only DICOM files, splited into groups if recursive: for dirpath, dirnames, filenames in os.walk(directory): @@ -89,6 +93,9 @@ def GetDicomGroups(directory, recursive=True): for name in filenames: filepath = str(os.path.join(dirpath, name)) parser = dicom.Parser() + counter += 1 + if gui: + yield counter/nfiles*100 if parser.SetFileName(filepath): dcm = dicom.Dicom() dcm.SetParser(parser) @@ -99,10 +106,100 @@ def GetDicomGroups(directory, recursive=True): for name in filenames: filepath = str(os.path.join(dirpath, name)) parser = dicom.Parser() + counter += 1 + if gui: + yield counter/nfiles*100 if parser.SetFileName(filepath): dcm = dicom.Dicom() dcm.SetParser(parser) grouper.AddFile(dcm) - return grouper.GetPatientsGroups() + yield grouper.GetPatientsGroups() + +def GetDicomGroups(directory, recursive=True): + return yGetDicomGroups(directory, recursive, gui=False).next() + +class ProgressDicomReader: + + def __init__(self): + (self.LoadFilesProgress, EVT_LOAD_FILE_PROGRESS) = wx.lib.newevent.NewEvent() + (self.EndLoadFiles, EVT_END_LOAD_FILE) = wx.lib.newevent.NewEvent() + + self.evt_update_progress = EVT_LOAD_FILE_PROGRESS + self.evt_end_load_file = EVT_END_LOAD_FILE + + def SetWindowEvent(self, frame): + self.frame = frame + + def SetDirectoryPath(self, path,recursive=True): + self.running = True + print "1",path,recursive + thread.start_new_thread(self.GetDicomGroupsIntern,(path,recursive)) + + def UpdateLoadFileProgress(self,cont_progress): + evt = self.LoadFilesProgress(progress = cont_progress) + wx.PostEvent(self.frame, evt) + + def EndLoadFile(self, grouper): + evt = self.EndLoadFiles(value = grouper) + wx.PostEvent(self.frame, evt) + + def GetDicomGroups(self, path, recursive): + y = yGetDicomGroups(path, recursive) + while self.running: + value_progress = y.next() + if isinstance(value_progress, float): + self.UpdateLoadFileProgress(value_progress) + else: + print "____________________" + print value_progress + self.EndLoadFile(value_progress) + self.running = False + + def GetDicomGroupsOld(self): + """ + Return all full paths to DICOM files inside given directory. + """ + while self.running: + grouper = dicom_grouper.DicomPatientGrouper() + dirpath = directory = self.dirpath + nfiles = 0 + # Find total number of files + if self.recursive: + for dirpath, dirnames, filenames in os.walk(directory): + nfiles += len(filenames) + else: + dirpath, dirnames, filenames = os.walk(directory) + nfiles = len(filenames) + + print "TOTAL FILES:", nfiles + cont_progress = 0 + # Retrieve only DICOM files, splited into groups + if self.recursive: + for dirpath, dirnames, filenames in os.walk(directory): + print "@: ",dirpath + for name in filenames: + filepath = str(os.path.join(dirpath, name)) + parser = dicom.Parser() + + cont_progress += 1 + self.UpdateLoadFileProgress(cont_progress, nfiles) + + if parser.SetFileName(filepath): + dcm = dicom.Dicom() + dcm.SetParser(parser) + grouper.AddFile(dcm) + else: + dirpath, dirnames, filenames = os.walk(directory) + print "@: ",dirpath + for name in filenames: + filepath = str(os.path.join(dirpath, name)) + parser = dicom.Parser() + if parser.SetFileName(filepath): + dcm = dicom.Dicom() + dcm.SetParser(parser) + grouper.AddFile(dcm) + self.running = False + self.EndLoadFile(grouper) + #return grouper.GetPatientsGroups() -- libgit2 0.21.2