From bc3ba9d1a9e1896628ca1652faa2ddf7c90ccbf1 Mon Sep 17 00:00:00 2001 From: tfmoraes Date: Wed, 30 Dec 2009 17:48:47 +0000 Subject: [PATCH] FIX: UnicodeEncodeError when importing the case 0809, this case has non-ascii characters --- invesalius/data/vtk_utils.py | 6 ++++-- invesalius/gui/import_panel.py | 32 ++++++++++++++++---------------- invesalius/project.py | 20 +++++++++++++------- invesalius/reader/dicom.py | 22 +++++++++++++++++++--- 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/invesalius/data/vtk_utils.py b/invesalius/data/vtk_utils.py index ec4173d..332b723 100644 --- a/invesalius/data/vtk_utils.py +++ b/invesalius/data/vtk_utils.py @@ -129,8 +129,10 @@ class Text(object): value = str(value) if sys.platform == 'win32': value += "" # Otherwise 0 is not shown under win32 - - self.mapper.SetInput(str(value)) + # With some encoding in some dicom fields (like name) raises a + # UnicodeEncodeError because they have non-ascii characters. To avoid + # that we encode in utf-8. + self.mapper.SetInput(value.encode("utf-8")) def SetPosition(self, position): self.actor.GetPositionCoordinate().SetValue(position[0], diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index 852ae29..92348a3 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -160,17 +160,17 @@ class TextPanel(wx.Panel): first += 1 tree.SetItemPyData(parent, patient) - tree.SetItemText(parent, str(dicom.patient.id), 1) - tree.SetItemText(parent, str(dicom.patient.age), 2) - tree.SetItemText(parent, str(dicom.patient.gender), 3) - tree.SetItemText(parent, str(dicom.acquisition.study_description), 4) - tree.SetItemText(parent, str(dicom.acquisition.modality), 5) - tree.SetItemText(parent, str(date_time), 6) - tree.SetItemText(parent, str(patient.nslices), 7) - tree.SetItemText(parent, str(dicom.acquisition.institution), 8) - tree.SetItemText(parent, str(dicom.patient.birthdate), 9) - tree.SetItemText(parent, str(dicom.acquisition.accession_number), 10) - tree.SetItemText(parent, str(dicom.patient.physician), 11) + tree.SetItemText(parent, "%s" % dicom.patient.id, 1) + tree.SetItemText(parent, "%s" % dicom.patient.age, 2) + tree.SetItemText(parent, "%s" % dicom.patient.gender, 3) + tree.SetItemText(parent, "%s" % dicom.acquisition.study_description, 4) + tree.SetItemText(parent, "%s" % dicom.acquisition.modality, 5) + tree.SetItemText(parent, "%s" % date_time, 6) + tree.SetItemText(parent, "%s" % patient.nslices, 7) + tree.SetItemText(parent, "%s" % dicom.acquisition.institution, 8) + tree.SetItemText(parent, "%s" % dicom.patient.birthdate, 9) + tree.SetItemText(parent, "%s" % dicom.acquisition.accession_number, 10) + tree.SetItemText(parent, "%s" % dicom.patient.physician, 11) group_list = patient.GetGroups() for group in group_list: @@ -179,11 +179,11 @@ class TextPanel(wx.Panel): child = tree.AppendItem(parent, group.title) tree.SetItemPyData(child, group) - tree.SetItemText(child, str(group.title), 0) - tree.SetItemText(child, str(dicom.acquisition.protocol_name), 4) - tree.SetItemText(child, str(dicom.acquisition.modality), 5) - tree.SetItemText(child, str(date_time), 6) - tree.SetItemText(child, str(group.nslices), 7) + tree.SetItemText(child, "%s" % group.title, 0) + tree.SetItemText(child, "%s" % dicom.acquisition.protocol_name, 4) + tree.SetItemText(child, "%s" % dicom.acquisition.modality, 5) + tree.SetItemText(child, "%s" % date_time, 6) + tree.SetItemText(child, "%s" % group.nslices, 7) tree.Expand(self.root) diff --git a/invesalius/project.py b/invesalius/project.py index 0ce6f73..a7a9b00 100755 --- a/invesalius/project.py +++ b/invesalius/project.py @@ -157,22 +157,27 @@ class Project(object): ps.Publisher.sendMessage('Set raycasting preset', preset) def SavePlistProject(self, dir_, filename): - + + # Some filenames have non-ascii characters and encoded in a strange + # encoding, in that cases a UnicodeEncodeError is raised. To avoid + # that we encode in utf-8. + filename = filename.encode('utf-8') dir_temp = tempfile.mkdtemp(filename) filename_tmp = os.path.join(dir_temp, filename) - + project = {} - + for key in self.__dict__: if getattr(self.__dict__[key], 'SavePlist', None): - project[key] = {'#plist': self.__dict__[key].SavePlist(filename_tmp)} + project[key] = {'#plist': + self.__dict__[key].SavePlist(filename_tmp).decode('utf-8')} else: project[key] = self.__dict__[key] masks = {} for index in self.mask_dict: masks[str(index)] = {'#mask':\ - self.mask_dict[index].SavePlist(filename_tmp)} + self.mask_dict[index].SavePlist(filename_tmp).decode('utf-8')} print index surfaces = {} @@ -185,9 +190,10 @@ class Project(object): project['mask_dict'] = masks img_file = '%s_%s.vti' % (filename_tmp, 'imagedata') iu.Export(self.imagedata, img_file, bin=True) - project['imagedata'] = {'$vti':os.path.split(img_file)[1]} + project['imagedata'] = {'$vti':os.path.split(img_file)[1].decode('utf-8')} + plistlib.writePlist(project, filename_tmp + '.plist') - + path = os.path.join(dir_,filename) Compress(dir_temp, path)#os.path.join("~/Desktop/","teste.inv3")) shutil.rmtree(dir_temp) diff --git a/invesalius/reader/dicom.py b/invesalius/reader/dicom.py index c2d1eb0..c51a73a 100644 --- a/invesalius/reader/dicom.py +++ b/invesalius/reader/dicom.py @@ -90,6 +90,7 @@ class Parser(): def __init__(self): self.filename = "" + self.encoding = "" self.vtkgdcm_reader = vtkgdcm.vtkGDCMImageReader() def GetAcquisitionDate(self): @@ -1136,7 +1137,8 @@ class Parser(): data = self.vtkgdcm_reader.GetMedicalImageProperties()\ .GetPatientName() if (data): - return data.strip() + # Returns a unicode decoded in the own dicom encoding + return data.strip().decode(self.GetEncoding()) return "" def GetPatientID(self): @@ -1150,7 +1152,8 @@ class Parser(): data = self.vtkgdcm_reader.GetMedicalImageProperties()\ .GetPatientID() if (data): - return data + # Returns a unicode decoded in the own dicom encoding + return data.decode(self.GetEncoding()) return "" @@ -1486,7 +1489,20 @@ class Parser(): data = str(ds.GetDataElement(tag).GetValue()) if (data): return data - return "" + return "" + + def GetEncoding(self): + """ + Return the dicom encoding + DICOM standard tag (0x0008, 0x0005) was used. + """ + if self.encoding: + return self.encoding + tag = gdcm.Tag(0x0008, 0x0005) + ds = self.gdcm_reader.GetFile().GetDataSet() + if ds.FindDataElement(tag): + self.encoding = str(ds.GetDataElement(tag).GetValue()) + return self.encoding class DicomWriter: -- libgit2 0.21.2