Commit 69febb4211ba18f2dafb8f536e64505f6cdaade2

Authored by Paulo Henrique Junqueira Amorim
1 parent 3174c58f

ENH: Add thread to read dicom

invesalius/control.py
@@ -22,6 +22,7 @@ class Controller(): @@ -22,6 +22,7 @@ class Controller():
22 self.surface_manager = surface.SurfaceManager() 22 self.surface_manager = surface.SurfaceManager()
23 self.volume = volume.Volume() 23 self.volume = volume.Volume()
24 self.__bind_events() 24 self.__bind_events()
  25 + self.frame = frame
25 26
26 def __bind_events(self): 27 def __bind_events(self):
27 ps.Publisher().subscribe(self.OnImportMedicalImages, 'Import directory') 28 ps.Publisher().subscribe(self.OnImportMedicalImages, 'Import directory')
@@ -36,9 +37,25 @@ class Controller(): @@ -36,9 +37,25 @@ class Controller():
36 def StartImportPanel(self, pubsub_evt): 37 def StartImportPanel(self, pubsub_evt):
37 # path to directory 38 # path to directory
38 path = pubsub_evt.data 39 path = pubsub_evt.data
39 -  
40 # retrieve DICOM files splited into groups 40 # retrieve DICOM files splited into groups
41 - patient_series = dcm.GetDicomGroups(path) 41 +
  42 + reader = dcm.ProgressDicomReader()
  43 + reader.SetWindowEvent(self.frame)
  44 + reader.SetDirectoryPath(str(path))
  45 +
  46 + self.frame.Bind(dicomgroups.evt_update_progress, self.Progress)
  47 + self.frame.Bind(dicomgroups.evt_end_load_file, self.LoadPanel)
  48 + #thread.start_new_thread(t.GetDicomGroups, (path,True, lock))
  49 +
  50 + def Progress(self, evt):
  51 + print evt.progress
  52 + print "AAAAA"
  53 + #ps.Publisher().sendMessage("Progress Import")
  54 +
  55 + def LoadPanel(self,evt):
  56 + print "LoadPanel"
  57 + print evt.value
  58 + patient_series = evt.value
42 if patient_series: 59 if patient_series:
43 ps.Publisher().sendMessage("Load import panel", patient_series) 60 ps.Publisher().sendMessage("Load import panel", patient_series)
44 first_patient = patient_series[0] 61 first_patient = patient_series[0]
@@ -46,6 +63,8 @@ class Controller(): @@ -46,6 +63,8 @@ class Controller():
46 else: 63 else:
47 print "No DICOM files on directory" 64 print "No DICOM files on directory"
48 65
  66 +
  67 +
49 def OnImportMedicalImages(self, pubsub_evt): 68 def OnImportMedicalImages(self, pubsub_evt):
50 directory = pubsub_evt.data 69 directory = pubsub_evt.data
51 self.ImportMedicalImages(directory) 70 self.ImportMedicalImages(directory)
@@ -53,6 +72,7 @@ class Controller(): @@ -53,6 +72,7 @@ class Controller():
53 def ImportMedicalImages(self, directory): 72 def ImportMedicalImages(self, directory):
54 # OPTION 1: DICOM? 73 # OPTION 1: DICOM?
55 patients_groups = dcm.GetDicomGroups(directory) 74 patients_groups = dcm.GetDicomGroups(directory)
  75 +
56 if len(patients_groups): 76 if len(patients_groups):
57 group = dcm.SelectLargerDicomGroup(patients_groups) 77 group = dcm.SelectLargerDicomGroup(patients_groups)
58 imagedata, dicom = self.OpenDicomGroup(group, gui=False) 78 imagedata, dicom = self.OpenDicomGroup(group, gui=False)
invesalius/reader/dicom_reader.py
@@ -16,12 +16,16 @@ @@ -16,12 +16,16 @@
16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais 16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais
17 # detalhes. 17 # detalhes.
18 #-------------------------------------------------------------------------- 18 #--------------------------------------------------------------------------
  19 +from vtk.util.colors import yellow
19 import glob 20 import glob
20 import os 21 import os
21 22
22 import vtk 23 import vtk
23 import vtkgdcm 24 import vtkgdcm
24 import gdcm 25 import gdcm
  26 +import thread
  27 +import wx
  28 +import wx.lib.pubsub as ps
25 29
26 import constants as const 30 import constants as const
27 import dicom 31 import dicom
@@ -29,8 +33,9 @@ import dicom_grouper @@ -29,8 +33,9 @@ import dicom_grouper
29 import data.imagedata_utils as iu 33 import data.imagedata_utils as iu
30 34
31 def ReadDicomGroup(dir_): 35 def ReadDicomGroup(dir_):
32 - 36 +
33 patient_group = GetDicomGroups(dir_) 37 patient_group = GetDicomGroups(dir_)
  38 +
34 if len(patient_group) > 0: 39 if len(patient_group) > 0:
35 filelist, dicom, zspacing = SelectLargerDicomGroup(patient_group) 40 filelist, dicom, zspacing = SelectLargerDicomGroup(patient_group)
36 filelist = SortFiles(filelist, dicom) 41 filelist = SortFiles(filelist, dicom)
@@ -65,13 +70,10 @@ def SortFiles(filelist, dicom): @@ -65,13 +70,10 @@ def SortFiles(filelist, dicom):
65 return filelist 70 return filelist
66 71
67 72
68 -  
69 -def GetDicomGroups(directory, recursive=True): 73 +def yGetDicomGroups(directory, recursive=True, gui=True):
70 """ 74 """
71 Return all full paths to DICOM files inside given directory. 75 Return all full paths to DICOM files inside given directory.
72 """ 76 """
73 - grouper = dicom_grouper.DicomPatientGrouper()  
74 -  
75 nfiles = 0 77 nfiles = 0
76 # Find total number of files 78 # Find total number of files
77 if recursive: 79 if recursive:
@@ -80,8 +82,10 @@ def GetDicomGroups(directory, recursive=True): @@ -80,8 +82,10 @@ def GetDicomGroups(directory, recursive=True):
80 else: 82 else:
81 dirpath, dirnames, filenames = os.walk(directory) 83 dirpath, dirnames, filenames = os.walk(directory)
82 nfiles = len(filenames) 84 nfiles = len(filenames)
  85 +
83 print "TOTAL FILES:", nfiles 86 print "TOTAL FILES:", nfiles
84 - 87 + counter = 0.0
  88 + grouper = dicom_grouper.DicomPatientGrouper()
85 # Retrieve only DICOM files, splited into groups 89 # Retrieve only DICOM files, splited into groups
86 if recursive: 90 if recursive:
87 for dirpath, dirnames, filenames in os.walk(directory): 91 for dirpath, dirnames, filenames in os.walk(directory):
@@ -89,6 +93,9 @@ def GetDicomGroups(directory, recursive=True): @@ -89,6 +93,9 @@ def GetDicomGroups(directory, recursive=True):
89 for name in filenames: 93 for name in filenames:
90 filepath = str(os.path.join(dirpath, name)) 94 filepath = str(os.path.join(dirpath, name))
91 parser = dicom.Parser() 95 parser = dicom.Parser()
  96 + counter += 1
  97 + if gui:
  98 + yield counter/nfiles*100
92 if parser.SetFileName(filepath): 99 if parser.SetFileName(filepath):
93 dcm = dicom.Dicom() 100 dcm = dicom.Dicom()
94 dcm.SetParser(parser) 101 dcm.SetParser(parser)
@@ -99,10 +106,100 @@ def GetDicomGroups(directory, recursive=True): @@ -99,10 +106,100 @@ def GetDicomGroups(directory, recursive=True):
99 for name in filenames: 106 for name in filenames:
100 filepath = str(os.path.join(dirpath, name)) 107 filepath = str(os.path.join(dirpath, name))
101 parser = dicom.Parser() 108 parser = dicom.Parser()
  109 + counter += 1
  110 + if gui:
  111 + yield counter/nfiles*100
102 if parser.SetFileName(filepath): 112 if parser.SetFileName(filepath):
103 dcm = dicom.Dicom() 113 dcm = dicom.Dicom()
104 dcm.SetParser(parser) 114 dcm.SetParser(parser)
105 grouper.AddFile(dcm) 115 grouper.AddFile(dcm)
106 116
107 - return grouper.GetPatientsGroups() 117 + yield grouper.GetPatientsGroups()
  118 +
  119 +def GetDicomGroups(directory, recursive=True):
  120 + return yGetDicomGroups(directory, recursive, gui=False).next()
  121 +
  122 +class ProgressDicomReader:
  123 +
  124 + def __init__(self):
  125 + (self.LoadFilesProgress, EVT_LOAD_FILE_PROGRESS) = wx.lib.newevent.NewEvent()
  126 + (self.EndLoadFiles, EVT_END_LOAD_FILE) = wx.lib.newevent.NewEvent()
  127 +
  128 + self.evt_update_progress = EVT_LOAD_FILE_PROGRESS
  129 + self.evt_end_load_file = EVT_END_LOAD_FILE
  130 +
  131 + def SetWindowEvent(self, frame):
  132 + self.frame = frame
  133 +
  134 + def SetDirectoryPath(self, path,recursive=True):
  135 + self.running = True
  136 + print "1",path,recursive
  137 + thread.start_new_thread(self.GetDicomGroupsIntern,(path,recursive))
  138 +
  139 + def UpdateLoadFileProgress(self,cont_progress):
  140 + evt = self.LoadFilesProgress(progress = cont_progress)
  141 + wx.PostEvent(self.frame, evt)
  142 +
  143 + def EndLoadFile(self, grouper):
  144 + evt = self.EndLoadFiles(value = grouper)
  145 + wx.PostEvent(self.frame, evt)
  146 +
  147 + def GetDicomGroups(self, path, recursive):
  148 + y = yGetDicomGroups(path, recursive)
  149 + while self.running:
  150 + value_progress = y.next()
  151 + if isinstance(value_progress, float):
  152 + self.UpdateLoadFileProgress(value_progress)
  153 + else:
  154 + print "____________________"
  155 + print value_progress
  156 + self.EndLoadFile(value_progress)
  157 + self.running = False
  158 +
  159 + def GetDicomGroupsOld(self):
  160 + """
  161 + Return all full paths to DICOM files inside given directory.
  162 + """
  163 + while self.running:
  164 + grouper = dicom_grouper.DicomPatientGrouper()
  165 + dirpath = directory = self.dirpath
  166 + nfiles = 0
  167 + # Find total number of files
  168 + if self.recursive:
  169 + for dirpath, dirnames, filenames in os.walk(directory):
  170 + nfiles += len(filenames)
  171 + else:
  172 + dirpath, dirnames, filenames = os.walk(directory)
  173 + nfiles = len(filenames)
  174 +
  175 + print "TOTAL FILES:", nfiles
  176 + cont_progress = 0
  177 + # Retrieve only DICOM files, splited into groups
  178 + if self.recursive:
  179 + for dirpath, dirnames, filenames in os.walk(directory):
  180 + print "@: ",dirpath
  181 + for name in filenames:
  182 + filepath = str(os.path.join(dirpath, name))
  183 + parser = dicom.Parser()
  184 +
  185 + cont_progress += 1
  186 + self.UpdateLoadFileProgress(cont_progress, nfiles)
  187 +
  188 + if parser.SetFileName(filepath):
  189 + dcm = dicom.Dicom()
  190 + dcm.SetParser(parser)
  191 + grouper.AddFile(dcm)
  192 + else:
  193 + dirpath, dirnames, filenames = os.walk(directory)
  194 + print "@: ",dirpath
  195 + for name in filenames:
  196 + filepath = str(os.path.join(dirpath, name))
  197 + parser = dicom.Parser()
  198 + if parser.SetFileName(filepath):
  199 + dcm = dicom.Dicom()
  200 + dcm.SetParser(parser)
  201 + grouper.AddFile(dcm)
  202 + self.running = False
  203 + self.EndLoadFile(grouper)
  204 + #return grouper.GetPatientsGroups()
108 205