Commit bc3ba9d1a9e1896628ca1652faa2ddf7c90ccbf1

Authored by tfmoraes
1 parent 9bc7d016

FIX: UnicodeEncodeError when importing the case 0809, this case has non-ascii characters

invesalius/data/vtk_utils.py
@@ -129,8 +129,10 @@ class Text(object): @@ -129,8 +129,10 @@ class Text(object):
129 value = str(value) 129 value = str(value)
130 if sys.platform == 'win32': 130 if sys.platform == 'win32':
131 value += "" # Otherwise 0 is not shown under win32 131 value += "" # Otherwise 0 is not shown under win32
132 -  
133 - self.mapper.SetInput(str(value)) 132 + # With some encoding in some dicom fields (like name) raises a
  133 + # UnicodeEncodeError because they have non-ascii characters. To avoid
  134 + # that we encode in utf-8.
  135 + self.mapper.SetInput(value.encode("utf-8"))
134 136
135 def SetPosition(self, position): 137 def SetPosition(self, position):
136 self.actor.GetPositionCoordinate().SetValue(position[0], 138 self.actor.GetPositionCoordinate().SetValue(position[0],
invesalius/gui/import_panel.py
@@ -160,17 +160,17 @@ class TextPanel(wx.Panel): @@ -160,17 +160,17 @@ class TextPanel(wx.Panel):
160 first += 1 160 first += 1
161 161
162 tree.SetItemPyData(parent, patient) 162 tree.SetItemPyData(parent, patient)
163 - tree.SetItemText(parent, str(dicom.patient.id), 1)  
164 - tree.SetItemText(parent, str(dicom.patient.age), 2)  
165 - tree.SetItemText(parent, str(dicom.patient.gender), 3)  
166 - tree.SetItemText(parent, str(dicom.acquisition.study_description), 4)  
167 - tree.SetItemText(parent, str(dicom.acquisition.modality), 5)  
168 - tree.SetItemText(parent, str(date_time), 6)  
169 - tree.SetItemText(parent, str(patient.nslices), 7)  
170 - tree.SetItemText(parent, str(dicom.acquisition.institution), 8)  
171 - tree.SetItemText(parent, str(dicom.patient.birthdate), 9)  
172 - tree.SetItemText(parent, str(dicom.acquisition.accession_number), 10)  
173 - tree.SetItemText(parent, str(dicom.patient.physician), 11) 163 + tree.SetItemText(parent, "%s" % dicom.patient.id, 1)
  164 + tree.SetItemText(parent, "%s" % dicom.patient.age, 2)
  165 + tree.SetItemText(parent, "%s" % dicom.patient.gender, 3)
  166 + tree.SetItemText(parent, "%s" % dicom.acquisition.study_description, 4)
  167 + tree.SetItemText(parent, "%s" % dicom.acquisition.modality, 5)
  168 + tree.SetItemText(parent, "%s" % date_time, 6)
  169 + tree.SetItemText(parent, "%s" % patient.nslices, 7)
  170 + tree.SetItemText(parent, "%s" % dicom.acquisition.institution, 8)
  171 + tree.SetItemText(parent, "%s" % dicom.patient.birthdate, 9)
  172 + tree.SetItemText(parent, "%s" % dicom.acquisition.accession_number, 10)
  173 + tree.SetItemText(parent, "%s" % dicom.patient.physician, 11)
174 174
175 group_list = patient.GetGroups() 175 group_list = patient.GetGroups()
176 for group in group_list: 176 for group in group_list:
@@ -179,11 +179,11 @@ class TextPanel(wx.Panel): @@ -179,11 +179,11 @@ class TextPanel(wx.Panel):
179 child = tree.AppendItem(parent, group.title) 179 child = tree.AppendItem(parent, group.title)
180 tree.SetItemPyData(child, group) 180 tree.SetItemPyData(child, group)
181 181
182 - tree.SetItemText(child, str(group.title), 0)  
183 - tree.SetItemText(child, str(dicom.acquisition.protocol_name), 4)  
184 - tree.SetItemText(child, str(dicom.acquisition.modality), 5)  
185 - tree.SetItemText(child, str(date_time), 6)  
186 - tree.SetItemText(child, str(group.nslices), 7) 182 + tree.SetItemText(child, "%s" % group.title, 0)
  183 + tree.SetItemText(child, "%s" % dicom.acquisition.protocol_name, 4)
  184 + tree.SetItemText(child, "%s" % dicom.acquisition.modality, 5)
  185 + tree.SetItemText(child, "%s" % date_time, 6)
  186 + tree.SetItemText(child, "%s" % group.nslices, 7)
187 187
188 tree.Expand(self.root) 188 tree.Expand(self.root)
189 189
invesalius/project.py
@@ -157,22 +157,27 @@ class Project(object): @@ -157,22 +157,27 @@ class Project(object):
157 ps.Publisher.sendMessage('Set raycasting preset', preset) 157 ps.Publisher.sendMessage('Set raycasting preset', preset)
158 158
159 def SavePlistProject(self, dir_, filename): 159 def SavePlistProject(self, dir_, filename):
160 - 160 +
  161 + # Some filenames have non-ascii characters and encoded in a strange
  162 + # encoding, in that cases a UnicodeEncodeError is raised. To avoid
  163 + # that we encode in utf-8.
  164 + filename = filename.encode('utf-8')
161 dir_temp = tempfile.mkdtemp(filename) 165 dir_temp = tempfile.mkdtemp(filename)
162 filename_tmp = os.path.join(dir_temp, filename) 166 filename_tmp = os.path.join(dir_temp, filename)
163 - 167 +
164 project = {} 168 project = {}
165 - 169 +
166 for key in self.__dict__: 170 for key in self.__dict__:
167 if getattr(self.__dict__[key], 'SavePlist', None): 171 if getattr(self.__dict__[key], 'SavePlist', None):
168 - project[key] = {'#plist': self.__dict__[key].SavePlist(filename_tmp)} 172 + project[key] = {'#plist':
  173 + self.__dict__[key].SavePlist(filename_tmp).decode('utf-8')}
169 else: 174 else:
170 project[key] = self.__dict__[key] 175 project[key] = self.__dict__[key]
171 176
172 masks = {} 177 masks = {}
173 for index in self.mask_dict: 178 for index in self.mask_dict:
174 masks[str(index)] = {'#mask':\ 179 masks[str(index)] = {'#mask':\
175 - self.mask_dict[index].SavePlist(filename_tmp)} 180 + self.mask_dict[index].SavePlist(filename_tmp).decode('utf-8')}
176 print index 181 print index
177 182
178 surfaces = {} 183 surfaces = {}
@@ -185,9 +190,10 @@ class Project(object): @@ -185,9 +190,10 @@ class Project(object):
185 project['mask_dict'] = masks 190 project['mask_dict'] = masks
186 img_file = '%s_%s.vti' % (filename_tmp, 'imagedata') 191 img_file = '%s_%s.vti' % (filename_tmp, 'imagedata')
187 iu.Export(self.imagedata, img_file, bin=True) 192 iu.Export(self.imagedata, img_file, bin=True)
188 - project['imagedata'] = {'$vti':os.path.split(img_file)[1]} 193 + project['imagedata'] = {'$vti':os.path.split(img_file)[1].decode('utf-8')}
  194 +
189 plistlib.writePlist(project, filename_tmp + '.plist') 195 plistlib.writePlist(project, filename_tmp + '.plist')
190 - 196 +
191 path = os.path.join(dir_,filename) 197 path = os.path.join(dir_,filename)
192 Compress(dir_temp, path)#os.path.join("~/Desktop/","teste.inv3")) 198 Compress(dir_temp, path)#os.path.join("~/Desktop/","teste.inv3"))
193 shutil.rmtree(dir_temp) 199 shutil.rmtree(dir_temp)
invesalius/reader/dicom.py
@@ -90,6 +90,7 @@ class Parser(): @@ -90,6 +90,7 @@ class Parser():
90 90
91 def __init__(self): 91 def __init__(self):
92 self.filename = "" 92 self.filename = ""
  93 + self.encoding = ""
93 self.vtkgdcm_reader = vtkgdcm.vtkGDCMImageReader() 94 self.vtkgdcm_reader = vtkgdcm.vtkGDCMImageReader()
94 95
95 def GetAcquisitionDate(self): 96 def GetAcquisitionDate(self):
@@ -1136,7 +1137,8 @@ class Parser(): @@ -1136,7 +1137,8 @@ class Parser():
1136 data = self.vtkgdcm_reader.GetMedicalImageProperties()\ 1137 data = self.vtkgdcm_reader.GetMedicalImageProperties()\
1137 .GetPatientName() 1138 .GetPatientName()
1138 if (data): 1139 if (data):
1139 - return data.strip() 1140 + # Returns a unicode decoded in the own dicom encoding
  1141 + return data.strip().decode(self.GetEncoding())
1140 return "" 1142 return ""
1141 1143
1142 def GetPatientID(self): 1144 def GetPatientID(self):
@@ -1150,7 +1152,8 @@ class Parser(): @@ -1150,7 +1152,8 @@ class Parser():
1150 data = self.vtkgdcm_reader.GetMedicalImageProperties()\ 1152 data = self.vtkgdcm_reader.GetMedicalImageProperties()\
1151 .GetPatientID() 1153 .GetPatientID()
1152 if (data): 1154 if (data):
1153 - return data 1155 + # Returns a unicode decoded in the own dicom encoding
  1156 + return data.decode(self.GetEncoding())
1154 return "" 1157 return ""
1155 1158
1156 1159
@@ -1486,7 +1489,20 @@ class Parser(): @@ -1486,7 +1489,20 @@ class Parser():
1486 data = str(ds.GetDataElement(tag).GetValue()) 1489 data = str(ds.GetDataElement(tag).GetValue())
1487 if (data): 1490 if (data):
1488 return data 1491 return data
1489 - return "" 1492 + return ""
  1493 +
  1494 + def GetEncoding(self):
  1495 + """
  1496 + Return the dicom encoding
  1497 + DICOM standard tag (0x0008, 0x0005) was used.
  1498 + """
  1499 + if self.encoding:
  1500 + return self.encoding
  1501 + tag = gdcm.Tag(0x0008, 0x0005)
  1502 + ds = self.gdcm_reader.GetFile().GetDataSet()
  1503 + if ds.FindDataElement(tag):
  1504 + self.encoding = str(ds.GetDataElement(tag).GetValue())
  1505 + return self.encoding
1490 1506
1491 1507
1492 class DicomWriter: 1508 class DicomWriter: