Commit eead43d517b427aecc929d52c37b41fa1c6ac599

Authored by Thiago Franco de Moraes
1 parent c010bda2

starting to clean slice_.py

Showing 1 changed file with 18 additions and 176 deletions   Show diff stats
invesalius/data/slice_.py
... ... @@ -16,7 +16,6 @@
16 16 # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais
17 17 # detalhes.
18 18 #--------------------------------------------------------------------------
19   -import math
20 19 import os
21 20 import tempfile
22 21  
... ... @@ -79,7 +78,6 @@ class Slice(object):
79 78 # Therefore, we use Singleton design pattern for implementing it.
80 79  
81 80 def __init__(self):
82   - self.imagedata = None
83 81 self.current_mask = None
84 82 self.blend_filter = None
85 83 self.histogram = None
... ... @@ -249,7 +247,6 @@ class Slice(object):
249 247 self.CloseProject()
250 248  
251 249 def CloseProject(self):
252   - self.imagedata = None
253 250 f = self._matrix.filename
254 251 self._matrix._mmap.close()
255 252 self._matrix = None
... ... @@ -836,19 +833,12 @@ class Slice(object):
836 833  
837 834 def SelectCurrentMask(self, index):
838 835 "Insert mask data, based on given index, into pipeline."
839   - # This condition is not necessary in Linux, only under mac and windows
840   - # because combobox event is binded when the same item is selected again.
841   - #if index != self.current_mask.index:
842   - print "SelectCurrentMask"
843   - print "index:", index
844 836 proj = Project()
845 837 future_mask = proj.GetMask(index)
846 838 future_mask.is_shown = True
847 839 self.current_mask = future_mask
848 840  
849 841 colour = future_mask.colour
850   - #index = future_mask.index
851   - print index
852 842 self.SetMaskColour(index, colour, update=False)
853 843  
854 844 self.buffer_slices = {"AXIAL": SliceBuffer(),
... ... @@ -871,18 +861,9 @@ class Slice(object):
871 861 proj = Project()
872 862 mask = proj.mask_dict[surface_parameters['options']['index']]
873 863  
874   - # This is very important. Do not use masks' imagedata. It would mess up
875   - # surface quality event when using contour
876   - #self.SetMaskThreshold(mask.index, threshold)
877   - for n in xrange(1, mask.matrix.shape[0]):
878   - if mask.matrix[n, 0, 0] == 0:
879   - m = mask.matrix[n, 1:, 1:]
880   - mask.matrix[n, 1:, 1:] = self.do_threshold_to_a_slice(self.matrix[n-1], m)
  864 + self.do_threshold_to_all_slices(mask)
  865 + Publisher.sendMessage('Create surface', (self, mask, surface_parameters))
881 866  
882   - mask.matrix.flush()
883   -
884   - Publisher.sendMessage('Create surface', (self, mask,
885   - surface_parameters))
886 867 def GetOutput(self):
887 868 return self.blend_filter.GetOutput()
888 869  
... ... @@ -906,59 +887,6 @@ class Slice(object):
906 887  
907 888 Publisher.sendMessage('Check projection menu', tprojection)
908 889  
909   - def SetInput(self, imagedata, mask_dict):
910   - print "SETINPUT!"
911   - self.imagedata = imagedata
912   - self.extent = imagedata.GetExtent()
913   -
914   - imagedata_bg = self.__create_background(imagedata)
915   -
916   - if not mask_dict:
917   - imagedata_mask = self.__build_mask(imagedata, create=True)
918   - else:
919   - self.__load_masks(imagedata, mask_dict)
920   - imagedata_mask = self.img_colours_mask.GetOutput()
921   -
922   - mask_opacity = self.current_mask.opacity
923   -
924   - # blend both imagedatas, so it can be inserted into viewer
925   - blend_filter = vtk.vtkImageBlend()
926   - blend_filter.SetBlendModeToNormal()
927   - blend_filter.SetOpacity(0, 1)
928   - if self.current_mask.is_shown:
929   - blend_filter.SetOpacity(1, mask_opacity)
930   - else:
931   - blend_filter.SetOpacity(1, 0)
932   - blend_filter.SetInput(0, imagedata_bg)
933   - blend_filter.SetInput(1, imagedata_mask)
934   - blend_filter.SetBlendModeToNormal()
935   - blend_filter.GetOutput().ReleaseDataFlagOn()
936   - self.blend_filter = blend_filter
937   -
938   - self.window_level = vtk.vtkImageMapToWindowLevelColors()
939   - self.window_level.SetInput(self.imagedata)
940   -
941   - def __create_background(self, imagedata):
942   - thresh_min, thresh_max = imagedata.GetScalarRange()
943   - Publisher.sendMessage('Update threshold limits list', (thresh_min,
944   - thresh_max))
945   -
946   - # map scalar values into colors
947   - lut_bg = self.lut_bg = vtk.vtkLookupTable()
948   - lut_bg.SetTableRange(thresh_min, thresh_max)
949   - lut_bg.SetSaturationRange(0, 0)
950   - lut_bg.SetHueRange(0, 0)
951   - lut_bg.SetValueRange(0, 1)
952   - lut_bg.Build()
953   -
954   - # map the input image through a lookup table
955   - img_colours_bg = self.img_colours_bg = vtk.vtkImageMapToColors()
956   - img_colours_bg.SetOutputFormatToRGBA()
957   - img_colours_bg.SetLookupTable(lut_bg)
958   - img_colours_bg.SetInput(imagedata)
959   -
960   - return img_colours_bg.GetOutput()
961   -
962 890 def UpdateWindowLevelBackground(self, pubsub_evt):
963 891 window, level = pubsub_evt.data
964 892 self.window_width = window
... ... @@ -1030,15 +958,12 @@ class Slice(object):
1030 958 cast.ClampOverflowOn()
1031 959 cast.Update()
1032 960  
1033   - #if (original_orientation == const.AXIAL):
1034 961 flip = vtk.vtkImageFlip()
1035 962 flip.SetInput(cast.GetOutput())
1036 963 flip.SetFilteredAxis(1)
1037 964 flip.FlipAboutOriginOn()
1038 965 flip.Update()
1039 966 widget.SetInput(flip.GetOutput())
1040   - #else:
1041   - #widget.SetInput(cast.GetOutput())
1042 967  
1043 968 def UpdateSlice3D(self, pubsub_evt):
1044 969 widget, orientation = pubsub_evt.data
... ... @@ -1111,27 +1036,6 @@ class Slice(object):
1111 1036 Publisher.sendMessage('Change mask selected', mask.index)
1112 1037 Publisher.sendMessage('Update slice viewer')
1113 1038  
1114   - def __load_masks(self, imagedata, mask_dict):
1115   - keys = mask_dict.keys()
1116   - keys.sort()
1117   - for key in keys:
1118   - mask = mask_dict[key]
1119   -
1120   - # update gui related to mask
1121   - utils.debug("__load_masks")
1122   - utils.debug('THRESHOLD_RANGE %s'% mask.threshold_range)
1123   - Publisher.sendMessage('Add mask',
1124   - (mask.index,
1125   - mask.name,
1126   - mask.threshold_range,
1127   - mask.colour))
1128   -
1129   - self.current_mask = mask
1130   - self.__build_mask(imagedata, False)
1131   -
1132   - Publisher.sendMessage('Change mask selected', mask.index)
1133   - Publisher.sendMessage('Update slice viewer')
1134   -
1135 1039 def do_ww_wl(self, image):
1136 1040 if self.from_ == PLIST:
1137 1041 lut = vtk.vtkWindowLevelLookupTable()
... ... @@ -1212,12 +1116,16 @@ class Slice(object):
1212 1116 m[mask == 254] = 254
1213 1117 return m.astype('uint8')
1214 1118  
1215   - def do_threshold_to_all_slices(self):
1216   - mask = self.current_mask
  1119 + def do_threshold_to_all_slices(self, mask=None):
  1120 + """
  1121 + Apply threshold to all slices.
1217 1122  
1218   - # This is very important. Do not use masks' imagedata. It would mess up
1219   - # surface quality event when using contour
1220   - #self.SetMaskThreshold(mask.index, threshold)
  1123 + Params:
  1124 + - mask: the mask where result of the threshold will be stored.If
  1125 + None, it'll be the current mask.
  1126 + """
  1127 + if mask is None:
  1128 + mask = self.current_mask
1221 1129 for n in xrange(1, mask.matrix.shape[0]):
1222 1130 if mask.matrix[n, 0, 0] == 0:
1223 1131 m = mask.matrix[n, 1:, 1:]
... ... @@ -1390,76 +1298,9 @@ class Slice(object):
1390 1298 self.buffer_slices[o].discard_vtk_mask()
1391 1299 Publisher.sendMessage('Reload actual slice')
1392 1300  
1393   - def __build_mask(self, imagedata, create=True):
1394   - # create new mask instance and insert it into project
1395   - if create:
1396   - self.CreateMask(imagedata=imagedata)
1397   - current_mask = self.current_mask
1398   -
1399   - # properties to be inserted into pipeline
1400   - scalar_range = int(imagedata.GetScalarRange()[1])
1401   - r,g,b = current_mask.colour
1402   -
1403   - # map scalar values into colors
1404   - lut_mask = vtk.vtkLookupTable()
1405   - lut_mask.SetNumberOfTableValues(1)
1406   - lut_mask.SetNumberOfColors(1)
1407   - lut_mask.SetHueRange(const.THRESHOLD_HUE_RANGE)
1408   - lut_mask.SetSaturationRange(1, 1)
1409   - lut_mask.SetValueRange(1, 1)
1410   - lut_mask.SetNumberOfTableValues(scalar_range)
1411   - lut_mask.SetTableValue(1, r, g, b, 1.0)
1412   - lut_mask.SetTableValue(scalar_range - 1, r, g, b, 1.0)
1413   - lut_mask.SetRampToLinear()
1414   - lut_mask.Build()
1415   - self.lut_mask = lut_mask
1416   -
1417   - mask_thresh_imagedata = self.__create_mask_threshold(imagedata)
1418   -
1419   - if create:
1420   - # threshold pipeline
1421   - current_mask.imagedata.DeepCopy(mask_thresh_imagedata)
1422   - else:
1423   - mask_thresh_imagedata = self.current_mask.imagedata
1424   -
1425   - # map the input image through a lookup table
1426   - img_colours_mask = vtk.vtkImageMapToColors()
1427   - img_colours_mask.SetOutputFormatToRGBA()
1428   - img_colours_mask.SetLookupTable(lut_mask)
1429   -
1430   - img_colours_mask.SetInput(mask_thresh_imagedata)
1431   -
1432   - self.img_colours_mask = img_colours_mask
1433   -
1434   - return img_colours_mask.GetOutput()
1435   -
1436   - def __create_mask_threshold(self, imagedata, threshold_range=None):
1437   - if not threshold_range:
1438   - thresh_min, thresh_max = self.current_mask.threshold_range
1439   - else:
1440   - thresh_min, thresh_max = threshold_range
1441   -
1442   - # flexible threshold
1443   - img_thresh_mask = vtk.vtkImageThreshold()
1444   - img_thresh_mask.SetInValue(const.THRESHOLD_INVALUE)
1445   - img_thresh_mask.SetInput(imagedata)
1446   - img_thresh_mask.SetOutValue(const.THRESHOLD_OUTVALUE)
1447   - img_thresh_mask.ThresholdBetween(float(thresh_min), float(thresh_max))
1448   - img_thresh_mask.Update()
1449   - self.img_thresh_mask = img_thresh_mask
1450   -
1451   - # copy of threshold output
1452   - imagedata_mask = vtk.vtkImageData()
1453   - imagedata_mask.DeepCopy(img_thresh_mask.GetOutput())
1454   - imagedata_mask.Update()
1455   -
1456   - return imagedata_mask
1457   -
1458 1301 def _open_image_matrix(self, filename, shape, dtype):
1459 1302 self.matrix_filename = filename
1460   - print ">>>", filename
1461   - self.matrix = numpy.memmap(filename, shape=shape, dtype=dtype,
1462   - mode='r+')
  1303 + self.matrix = numpy.memmap(filename, shape=shape, dtype=dtype, mode='r+')
1463 1304  
1464 1305 def OnFlipVolume(self, pubsub_evt):
1465 1306 axis = pubsub_evt.data
... ... @@ -1489,8 +1330,9 @@ class Slice(object):
1489 1330 print type(self.matrix)
1490 1331  
1491 1332 def OnExportMask(self, pubsub_evt):
1492   - #imagedata = self.current_mask.imagedata
1493   - imagedata = self.imagedata
1494   - filename, filetype = pubsub_evt.data
1495   - if (filetype == const.FILETYPE_IMAGEDATA):
1496   - iu.Export(imagedata, filename)
  1333 + pass
  1334 + ##imagedata = self.current_mask.imagedata
  1335 + #imagedata = self.imagedata
  1336 + #filename, filetype = pubsub_evt.data
  1337 + #if (filetype == const.FILETYPE_IMAGEDATA):
  1338 + #iu.Export(imagedata, filename)
... ...