Commit 0a8d35b25865f6fde0c25f7d1f0c407baf292f62
1 parent
3dfaec66
Exists in
master
and in
68 other branches
ENC: Changed import panel's implementation
Showing
4 changed files
with
56 additions
and
113 deletions
Show diff stats
invesalius/control.py
... | ... | @@ -35,56 +35,10 @@ class Controller(): |
35 | 35 | path = pubsub_evt.data |
36 | 36 | |
37 | 37 | # retrieve DICOM files splited into groups |
38 | - dicom_series = dcm.GetSeries(path) | |
39 | - | |
40 | - # create dictionary with DICOM files' groups with | |
41 | - # information as it will be shown on import panel | |
42 | - dict = {} | |
43 | - series_preview = [] | |
44 | - | |
45 | - for key in dicom_series: | |
46 | - patient_name = key[0] | |
47 | - dicom = dicom_series[key][0] | |
48 | - | |
49 | - # Compute how many images per series: | |
50 | - n_images = str(len(dicom_series[key])) | |
51 | - # Add date and time in a single field: | |
52 | - date_time = "%s %s"%(dicom.acquisition.date, | |
53 | - dicom.acquisition.time) | |
54 | - | |
55 | - # Data per series | |
56 | - exam_data = [dicom.acquisition.series_description, | |
57 | - dicom.patient.id, | |
58 | - str(dicom.patient.age), | |
59 | - dicom.patient.gender, | |
60 | - dicom.acquisition.study_description, # per patient | |
61 | - dicom.acquisition.modality, | |
62 | - date_time, | |
63 | - n_images, | |
64 | - dicom.acquisition.institution, | |
65 | - dicom.patient.birthdate, | |
66 | - dicom.acquisition.accession_number, | |
67 | - dicom.patient.physician, | |
68 | - dicom.acquisition.protocol_name] # per series | |
69 | - | |
70 | - # Preview data | |
71 | - series_preview.append((dicom.image.file, # Filename | |
72 | - dicom.image.level, # Window level | |
73 | - dicom.image.window, # Window width | |
74 | - dicom.acquisition.series_description, # Title | |
75 | - "%s Images" %(n_images), # Subtitle | |
76 | - )) | |
77 | - | |
78 | - try: | |
79 | - dict[patient_name].append(exam_data) | |
80 | - except KeyError: | |
81 | - dict[patient_name] = [exam_data] | |
82 | - print dict | |
83 | - | |
84 | - | |
38 | + dicom_series = dcm.GetDicomGroups(path) | |
39 | + ps.Publisher().sendMessage("Load import panel", dicom_series) | |
85 | 40 | |
86 | - ps.Publisher().sendMessage("Load import panel", dict) | |
87 | - ps.Publisher().sendMessage("Load dicom preview", series_preview) | |
41 | + #ps.Publisher().sendMessage("Load dicom preview", series_preview) | |
88 | 42 | |
89 | 43 | |
90 | 44 | def ImportDirectory(self, pubsub_evt=None, dir_=None): | ... | ... |
invesalius/gui/import_panel.py
... | ... | @@ -40,8 +40,8 @@ class InnerPanel(wx.Panel): |
40 | 40 | ps.Publisher().subscribe(self.ShowDicomPreview, "Load import panel") |
41 | 41 | |
42 | 42 | def ShowDicomPreview(self, pubsub_evt): |
43 | - dict = pubsub_evt.data | |
44 | - self.text_panel.Populate(dict) | |
43 | + dicom_groups = pubsub_evt.data | |
44 | + self.text_panel.Populate(dicom_groups) | |
45 | 45 | |
46 | 46 | |
47 | 47 | class TextPanel(wx.Panel): |
... | ... | @@ -92,64 +92,47 @@ class TextPanel(wx.Panel): |
92 | 92 | self.root = tree.AddRoot("InVesalius Database") |
93 | 93 | self.tree = tree |
94 | 94 | |
95 | - def Populate(self, dict): | |
95 | + def Populate(self, patient_list): | |
96 | 96 | tree = self.tree |
97 | 97 | |
98 | - i = 0 | |
98 | + for patient in patient_list: | |
99 | + ngroups = patient.ngroups | |
100 | + dicom = patient.GetDicomSample() | |
101 | + title = dicom.patient.name + " (%d series)"%(ngroups) | |
102 | + date_time = "%s %s"%(dicom.acquisition.date, | |
103 | + dicom.acquisition.time) | |
99 | 104 | |
100 | - # For each patient on dictionary | |
101 | - for patient_name in dict: | |
102 | - # In spite of the patient name, we'll show number of | |
103 | - # series also | |
104 | - title = patient_name + " (%d series)"%(len(dict[patient_name])) | |
105 | 105 | parent = tree.AppendItem(self.root, title) |
106 | - patient_data = dict[patient_name] | |
107 | - | |
108 | - # Row background colour | |
109 | - if i%2: | |
110 | - tree.SetItemBackgroundColour(parent, (242,246,254)) | |
111 | - | |
112 | - # Insert patient data into columns based on first series | |
113 | - for item in xrange(1, len(patient_data[0])-1): | |
114 | - value = patient_data[0][item] | |
115 | - # Sum slices of all patient's series | |
116 | - if (item == 7): | |
117 | - value = 0 | |
118 | - for series in xrange(len(patient_data)): | |
119 | - value += int(patient_data[series][7]) | |
120 | - tree.SetItemText(parent, str(value), item) # ID | |
121 | - | |
122 | - # For each series on patient | |
123 | - j = 0 | |
124 | - for series in xrange(len(patient_data)): | |
125 | - series_title = patient_data[series][0] | |
126 | - | |
127 | - child = self.tree.AppendItem(parent, series_title) | |
128 | - if not j%2: | |
129 | - tree.SetItemBackgroundColour(child, (242,246,254)) | |
130 | - | |
131 | - # TODO: change description "protocol_name" | |
132 | - description = patient_data[series][-1] | |
133 | - modality = patient_data[series][5] | |
134 | - # TODO: add to date the time | |
135 | - date = patient_data[series][6] | |
136 | - nimages = patient_data[series][7] | |
137 | - | |
138 | - tree.SetItemText(child, series_title, 0) | |
139 | - tree.SetItemText(child, description, 4) | |
140 | - tree.SetItemText(child, modality, 5) | |
141 | - tree.SetItemText(child, date, 6) | |
142 | - tree.SetItemText(child, nimages, 7) | |
143 | - | |
144 | - j += 1 | |
145 | - i += 1 | |
146 | - | |
106 | + tree.SetItemText(parent, str(dicom.patient.id), 1) | |
107 | + tree.SetItemText(parent, str(dicom.patient.age), 2) | |
108 | + tree.SetItemText(parent, str(dicom.patient.gender), 3) | |
109 | + tree.SetItemText(parent, str(dicom.acquisition.study_description), 4) | |
110 | + tree.SetItemText(parent, str(dicom.acquisition.modality), 5) | |
111 | + tree.SetItemText(parent, str(date_time), 6) | |
112 | + tree.SetItemText(parent, str(patient.nslices), 7) | |
113 | + tree.SetItemText(parent, str(dicom.acquisition.institution), 8) | |
114 | + tree.SetItemText(parent, str(dicom.patient.birthdate), 9) | |
115 | + tree.SetItemText(parent, str(dicom.acquisition.accession_number), 10) | |
116 | + tree.SetItemText(parent, str(dicom.patient.physician), 11) | |
117 | + | |
118 | + group_list = patient.GetGroups() | |
119 | + for group in group_list: | |
120 | + dicom = group.GetDicomSample() | |
121 | + group_title = dicom.acquisition.series_description | |
122 | + | |
123 | + child = self.tree.AppendItem(parent, group_title) | |
124 | + | |
125 | + tree.SetItemText(child, str(group_title), 0) | |
126 | + tree.SetItemText(child, str(dicom.acquisition.protocol_name), 4) | |
127 | + tree.SetItemText(child, str(dicom.acquisition.modality), 5) | |
128 | + tree.SetItemText(child, str(date_time), 6) | |
129 | + tree.SetItemText(child, str(group.nslices), 7) | |
130 | + | |
147 | 131 | tree.Expand(self.root) |
148 | 132 | |
149 | 133 | tree.GetMainWindow().Bind(wx.EVT_RIGHT_UP, self.OnRightUp) |
150 | 134 | tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate) |
151 | 135 | |
152 | - | |
153 | 136 | def OnActivate(self, evt): |
154 | 137 | print 'OnActivate: %s' % self.tree.GetItemText(evt.GetItem()) |
155 | 138 | ... | ... |
invesalius/reader/dicom_grouper.py
... | ... | @@ -66,11 +66,13 @@ class DicomGroup: |
66 | 66 | # externally as list |
67 | 67 | self.nslices = 0 |
68 | 68 | self.zspacing = 1 |
69 | + self.dicom = None | |
69 | 70 | |
70 | 71 | def AddSlice(self, dicom): |
72 | + if not self.dicom: | |
73 | + self.dicom = dicom | |
71 | 74 | pos = tuple(dicom.image.position) |
72 | 75 | if pos not in self.slices_dict.keys(): |
73 | - | |
74 | 76 | self.slices_dict[pos] = dicom |
75 | 77 | self.nslices += 1 |
76 | 78 | return True |
... | ... | @@ -106,6 +108,9 @@ class DicomGroup: |
106 | 108 | self.zspacing = abs(p1 - p2) |
107 | 109 | else: |
108 | 110 | self.zspacing = 1 |
111 | + | |
112 | + def GetDicomSample(self): | |
113 | + return self.dicom | |
109 | 114 | |
110 | 115 | class PatientGroup: |
111 | 116 | def __init__(self): |
... | ... | @@ -114,6 +119,8 @@ class PatientGroup: |
114 | 119 | self.key = () |
115 | 120 | self.groups_dict = {} # group_key: DicomGroup |
116 | 121 | self.nslices = 0 |
122 | + self.ngroups = 0 | |
123 | + self.dicom = None | |
117 | 124 | |
118 | 125 | def AddFile(self, dicom, index=0): |
119 | 126 | # Given general DICOM information, we group slices according |
... | ... | @@ -129,10 +136,14 @@ class PatientGroup: |
129 | 136 | dicom.acquisition.serie_number, |
130 | 137 | dicom.image.orientation_label, |
131 | 138 | index) # This will be used to deal with Problem 2 |
139 | + if not self.dicom: | |
140 | + self.dicom = dicom | |
141 | + | |
132 | 142 | self.nslices += 1 |
133 | 143 | # Does this group exist? Best case ;) |
134 | 144 | if group_key not in self.groups_dict.keys(): |
135 | 145 | group = DicomGroup() |
146 | + self.ngroups += 1 | |
136 | 147 | group.AddSlice(dicom) |
137 | 148 | self.groups_dict[group_key] = group |
138 | 149 | # Group exists... Lets try to add slice |
... | ... | @@ -168,6 +179,9 @@ class PatientGroup: |
168 | 179 | def GetGroups(self): |
169 | 180 | return self.groups_dict.values() |
170 | 181 | |
182 | + def GetDicomSample(self): | |
183 | + return self.dicom | |
184 | + | |
171 | 185 | def FixProblem1(self, dict): |
172 | 186 | """ |
173 | 187 | Merge multiple DICOM groups in case Problem 1 (description |
... | ... | @@ -268,6 +282,7 @@ class DicomPatientGrouper: |
268 | 282 | # Does this patient exist? |
269 | 283 | if patient_key not in self.patients_dict.keys(): |
270 | 284 | patient = PatientGroup() |
285 | + patient.key = patient_key | |
271 | 286 | patient.AddFile(dicom) |
272 | 287 | self.patients_dict[patient_key] = patient |
273 | 288 | # Patient exists... Lets add group to it |
... | ... | @@ -290,5 +305,7 @@ class DicomPatientGrouper: |
290 | 305 | # :) you've got a list of dicom.Dicom |
291 | 306 | # of the same series |
292 | 307 | """ |
293 | - return self.patients_dict.values() | |
308 | + plist = self.patients_dict.values() | |
309 | + plist = sorted(plist, key = lambda patient:patient.key[0]) | |
310 | + return plist | |
294 | 311 | ... | ... |
invesalius/reader/dicom_reader.py
... | ... | @@ -118,17 +118,6 @@ def CreateImageData(filelist, zspacing): |
118 | 118 | imagedata.Update() |
119 | 119 | return imagedata |
120 | 120 | |
121 | -def GetSeries(path): | |
122 | - """ | |
123 | - Return DICOM group of files inside given directory. | |
124 | - """ | |
125 | - dcm_files = GetDicomFiles(path) | |
126 | - | |
127 | - dcm_series = dicom_grouper.DicomGroups() | |
128 | - dcm_series.SetFileList(dcm_files) | |
129 | - dcm_series.Update() | |
130 | - | |
131 | - return dcm_series.GetOutput() | |
132 | 121 | |
133 | 122 | def GetDicomGroups(directory, recursive=True): |
134 | 123 | """ | ... | ... |