Commit dd1c83b9b56330fe51d672d5261df8937ec223da

Authored by Paulo Henrique Junqueira Amorim
1 parent aa5e2841

ADD: Showing patient series in CFind

invesalius/gui/import_network_panel.py
... ... @@ -219,7 +219,7 @@ class TextPanel(wx.Panel):
219 219  
220 220 def __bind_pubsub_evt(self):
221 221 #ps.Publisher().subscribe(self.SelectSeries, 'Select series in import panel')
222   - pass
  222 + ps.Publisher().subscribe(self.Populate, 'Populate tree')
223 223  
224 224 def __bind_events_wx(self):
225 225 self.Bind(wx.EVT_SIZE, self.OnSize)
... ... @@ -268,10 +268,83 @@ class TextPanel(wx.Panel):
268 268 def SelectSeries(self, pubsub_evt):
269 269 group_index = pubsub_evt.data
270 270  
271   - def Populate(self, patient_list):
  271 + def Populate(self, pubsub_evt):
272 272 tree = self.tree
  273 + #print ">>>>>>>>>>>>>>>>>>>>>>>>>>", dir(tree.GetRootItem())
  274 + #print ">>>>>>>>>>>>",dir(self.tree)
  275 + patients = pubsub_evt.data
273 276  
274 277 first = 0
  278 + self.idserie_treeitem = {}
  279 +
  280 + for patient in patients.keys():
  281 +
  282 +
  283 + #ngroups = patient.ngroups
  284 + #dicom = patient.GetDicomSample()
  285 + #title = dicom.patient.name + " (%d series)"%(ngroups)
  286 + #date_time = "%s %s"%(dicom.acquisition.date,
  287 + # dicom.acquisition.time)
  288 +
  289 + first_serie = patients[patient].keys()[0]
  290 + title = patients[patient][first_serie]['name']
  291 + p = patients[patient][first_serie]
  292 +
  293 + p_id = patient
  294 + age = p['age']
  295 + gender = p['gender']
  296 + study_description = p['study_description']
  297 + modality = p['modality']
  298 + date = p['acquisition_date']
  299 + time = p['acquisition_time']
  300 + institution = p['institution']
  301 + birthdate = p['date_of_birth']
  302 + acession_number = p['acession_number']
  303 + physician = p['ref_physician']
  304 +
  305 + parent = tree.AppendItem(self.root, title)
  306 +
  307 + n_amount_images = 0
  308 + for se in patients[patient]:
  309 + n_amount_images = n_amount_images + patients[patient][se]['n_images']
  310 +
  311 +
  312 + tree.SetItemPyData(parent, patient)
  313 + tree.SetItemText(parent, "%s" % p_id, 1)
  314 + tree.SetItemText(parent, "%s" % age, 2)
  315 + tree.SetItemText(parent, "%s" % gender, 3)
  316 + tree.SetItemText(parent, "%s" % study_description, 4)
  317 + tree.SetItemText(parent, "%s" % modality, 5)
  318 + tree.SetItemText(parent, "%s" % date + " " + time, 6)
  319 + tree.SetItemText(parent, "%s" % str(n_amount_images), 7)
  320 + tree.SetItemText(parent, "%s" % institution, 8)
  321 + tree.SetItemText(parent, "%s" % birthdate, 9)
  322 + tree.SetItemText(parent, "%s" % acession_number, 10)
  323 + tree.SetItemText(parent, "%s" % physician, 11)
  324 +
  325 +
  326 +
  327 + for series in patients[patient].keys():
  328 +
  329 + serie_description = patients[patient][series]['serie_description']
  330 + n_images = patients[patient][series]['n_images']
  331 + date = patients[patient][series]['acquisition_date']
  332 + time = patients[patient][series]['acquisition_time']
  333 +
  334 + child = tree.AppendItem(parent, serie_description)
  335 + tree.SetItemPyData(child, series)
  336 +
  337 + tree.SetItemText(child, "%s" % serie_description, 0)
  338 + #tree.SetItemText(child, "%s" % dicom.acquisition.protocol_name, 4)
  339 + #tree.SetItemText(child, "%s" % dicom.acquisition.modality, 5)
  340 + tree.SetItemText(child, "%s" % date + " " + time, 6)
  341 + tree.SetItemText(child, "%s" % n_images , 7)
  342 +
  343 + self.idserie_treeitem[child] = (patient, series)
  344 +
  345 +
  346 + """
  347 +
275 348 for patient in patient_list:
276 349 if not isinstance(patient, dcm.PatientGroup):
277 350 return None
... ... @@ -319,7 +392,7 @@ class TextPanel(wx.Panel):
319 392 tree.Expand(self.root)
320 393 tree.SelectItem(parent_select)
321 394 tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate)
322   - tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
  395 + tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)"""
323 396  
324 397 def OnSelChanged(self, evt):
325 398 item = self.tree.GetSelection()
... ... @@ -436,7 +509,8 @@ class FindPanel(wx.Panel):
436 509 dn.SetAETitleCall(self.hosts[key][3])
437 510 dn.SetAETitle(self.hosts[0][3])
438 511 dn.SetSearchWord(self.find_txt.GetValue())
439   - print dn.RunCFind()
  512 +
  513 + ps.Publisher().sendMessage('Populate tree', dn.RunCFind())
440 514  
441 515  
442 516 def SetHostsList(self, evt_pub):
... ...
invesalius/net/dicom.py
1 1 import gdcm
  2 +import utils
  3 +
2 4  
3 5 class DicomNet:
4 6  
... ... @@ -34,6 +36,8 @@ class DicomNet:
34 36 def GetValueFromDICOM(self, ret, tag):
35 37 value = str(ret.GetDataElement(gdcm.Tag(tag[0],\
36 38 tag[1])).GetValue())
  39 + if value == 'None' and tag != (0x0008,0x103E):
  40 + value = ''
37 41 return value
38 42  
39 43  
... ... @@ -46,20 +50,22 @@ class DicomNet:
46 50  
47 51 tags = [(0x0010, 0x0010), (0x0010, 0x1010), (0x0010,0x0040), (0x0008,0x1030),\
48 52 (0x0008,0x0060), (0x0008,0x0022), (0x0008,0x0080), (0x0010,0x0030),\
49   - (0x0008,0x0050), (0x0008,0x0090)]
  53 + (0x0008,0x0050), (0x0008,0x0090), (0x0008,0x103E), (0x0008,0x0033),\
  54 + (0x0008,0x0032)]
50 55  
51 56  
52 57 ds = gdcm.DataSet()
53 58  
54 59 for tag in tags:
55 60  
56   - bit_size = len(self.search_word) + 1
57 61  
58 62 tg = gdcm.Tag(tag[0], tag[1])
59 63  
60 64 de = gdcm.DataElement(tg)
61 65  
62   - if self.search_type == 'patient':
  66 + if self.search_type == 'patient' and tag == (0x0010, 0x0010):
  67 +
  68 + bit_size = len(self.search_word) + 1
63 69 de.SetByteValue(str(self.search_word + '*'), gdcm.VL(bit_size))
64 70 else:
65 71 de.SetByteValue('*', gdcm.VL(1))
... ... @@ -90,26 +96,29 @@ class DicomNet:
90 96  
91 97 rt = ret[i]
92 98  
93   -
94   - name = self.GetValueFromDICOM(rt, ((0x0010, 0x0010)))
95   - age = self.GetValueFromDICOM(rt, ((0x0010, 0x1010)))
96   - gender = self.GetValueFromDICOM(rt, ((0x0010),(0x0040)))
97   - study_description = self.GetValueFromDICOM(rt, ((0x0008),(0x1030)))
98   - modality = self.GetValueFromDICOM(rt, ((0x0008),(0x0060)))
99   - date_acquisition = self.GetValueFromDICOM(rt, ((0x0008),(0x0022)))
100   - institution = self.GetValueFromDICOM(rt, ((0x0008),(0x0080)))
101   - date_of_birth = self.GetValueFromDICOM(rt, ((0x0010),(0x0030)))
102   - acession_number = self.GetValueFromDICOM(rt, ((0x0008),(0x0050)))
103   - ref_physician = self.GetValueFromDICOM(rt, ((0x0008),(0x0090)))
  99 + name = self.GetValueFromDICOM(rt, (0x0010, 0x0010))
  100 + age = self.GetValueFromDICOM(rt, (0x0010, 0x1010))
  101 + gender = self.GetValueFromDICOM(rt, (0x0010,0x0040))
  102 + study_description = self.GetValueFromDICOM(rt, (0x0008,0x1030))
  103 + modality = self.GetValueFromDICOM(rt, (0x0008,0x0060))
  104 + institution = self.GetValueFromDICOM(rt, (0x0008,0x0080))
  105 + date_of_birth = utils.format_date(self.GetValueFromDICOM(rt, (0x0010,0x0030)))
  106 + acession_number = self.GetValueFromDICOM(rt, (0x0008,0x0050))
  107 + ref_physician = self.GetValueFromDICOM(rt, (0x0008,0x0090))
  108 + serie_description = self.GetValueFromDICOM(rt, (0x0008,0x103E))
  109 + acquisition_time = utils.format_time(self.GetValueFromDICOM(rt, (0x0008,0x0032)))
  110 + acquisition_date = utils.format_date(self.GetValueFromDICOM(rt, (0x0008,0x0022)))
104 111  
105 112 patients[patient_id][serie_id] = {'name':name, 'age':age, 'gender':gender,\
106 113 'study_description':study_description,\
107 114 'modality':modality, \
108   - 'date_acquision':date_acquisition,\
  115 + 'acquisition_time':acquisition_time,\
  116 + 'acquisition_date':acquisition_date,\
109 117 'institution':institution,\
110 118 'date_of_birth':date_of_birth,\
111 119 'acession_number':acession_number,\
112   - 'ref_physician':ref_physician}
  120 + 'ref_physician':ref_physician,\
  121 + 'serie_description':serie_description}
113 122  
114 123 patients[patient_id][serie_id]['n_images'] = 1
115 124 else:
... ...
invesalius/utils.py
... ... @@ -17,11 +17,53 @@
17 17 # detalhes.
18 18 #--------------------------------------------------------------------------
19 19 import platform
  20 +import time
20 21 import sigar
21 22 import sys
22 23 import re
23 24 import locale
24 25  
  26 +def format_time(value):
  27 + sp1 = value.split(".")
  28 + sp2 = value.split(":")
  29 +
  30 + if (len(sp1) == 2) and (len(sp2) == 3):
  31 + new_value = str(sp2[0]+sp2[1]+
  32 + str(int(float(sp2[2]))))
  33 + data = time.strptime(new_value, "%H%M%S")
  34 + elif (len(sp1) == 2):
  35 + data = time.gmtime(float(value))
  36 + elif (len(sp1) > 2):
  37 + data = time.strptime(value, "%H.%M.%S")
  38 + elif(len(sp2) > 1):
  39 + data = time.strptime(value, "%H:%M:%S")
  40 + else:
  41 + try:
  42 + data = time.strptime(value, "%H%M%S")
  43 + # If the time is not in a bad format only return it.
  44 + except ValueError:
  45 + return value
  46 + return time.strftime("%H:%M:%S",data)
  47 +
  48 +def format_date(value):
  49 +
  50 + sp1 = value.split(".")
  51 + try:
  52 +
  53 + if (len(sp1) > 1):
  54 + if (len(sp1[0]) <= 2):
  55 + data = time.strptime(value, "%D.%M.%Y")
  56 + else:
  57 + data = time.strptime(value, "%Y.%M.%d")
  58 + elif(len(value.split("//")) > 1):
  59 + data = time.strptime(value, "%D/%M/%Y")
  60 + else:
  61 + data = time.strptime(value, "%Y%M%d")
  62 + return time.strftime("%d/%M/%Y",data)
  63 +
  64 + except(ValueError):
  65 + return ""
  66 +
25 67 def debug(error_str):
26 68 """
27 69 Redirects output to file, or to the terminal
... ...