diff --git a/invesalius/control.py b/invesalius/control.py index 1459c0e..3ee4f33 100755 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -59,6 +59,7 @@ class Controller(): ps.Publisher().subscribe(self.Progress, "Update dicom load") ps.Publisher().subscribe(self.OnLoadImportPanel, "End dicom load") ps.Publisher().subscribe(self.OnCancelImport, 'Cancel DICOM load') + ps.Publisher().subscribe(self.OnSaveProject, 'Save Project') def OnCancelImport(self, pubsub_evt): @@ -118,7 +119,9 @@ class Controller(): if len(patients_groups): group = dcm.SelectLargerDicomGroup(patients_groups) + print "Group", group.GetHandSortedList() imagedata, dicom = self.OpenDicomGroup(group, gui=False) + print "imagedata", imagedata self.CreateDicomProject(imagedata, dicom) # OPTION 2: ANALYZE? else: @@ -194,6 +197,7 @@ class Controller(): # Create imagedata filelist = dicom_group.GetFilenameList() + print "filelist", filelist zspacing = dicom_group.zspacing imagedata = utils.CreateImageData(filelist, zspacing) @@ -247,3 +251,7 @@ class Controller(): preset = prj.Project().raycasting_preset preset_dir = os.path.join(const.USER_RAYCASTING_PRESETS_DIRECTORY, preset_name) plistlib.writePlist(preset, preset_dir) + + def OnSaveProject(self, pubsub_evt): + filename = prj.Project().name + prj.Project().SavePlistProject(filename) diff --git a/invesalius/data/mask.py b/invesalius/data/mask.py index 75e8755..8b8d681 100644 --- a/invesalius/data/mask.py +++ b/invesalius/data/mask.py @@ -19,13 +19,16 @@ import random import constants as const +import imagedata_utils as iu +import plistlib +import vtk class Mask(): general_index = -1 def __init__(self): Mask.general_index += 1 self.index = Mask.general_index - self.imagedata = None # vtkImageData + self.imagedata = '' # vtkImageData self.colour = random.choice(const.MASK_COLOUR) self.opacity = const.MASK_OPACITY self.threshold_range = const.THRESHOLD_RANGE @@ -33,3 +36,19 @@ class Mask(): self.edition_threshold_range = [const.THRESHOLD_OUTVALUE, const.THRESHOLD_INVALUE] self.is_shown = 1 self.edited_points = {} + + def SavePlist(self, filename): + mask = {} + filename = '%s$%s$%d' % (filename, 'mask', self.index) + d = self.__dict__ + for key in d: + if isinstance(d[key], vtk.vtkImageData): + img_name = '%s_%s.vti' % (filename, key) + iu.Export(d[key], img_name, bin=True) + mask[key] = {'$imagedata': img_name} + else: + mask[key] = d[key] + + print mask + plistlib.writePlist(mask, filename + '.plist') + return filename diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index fcf2d3b..c061b05 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -16,6 +16,7 @@ # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais # detalhes. #-------------------------------------------------------------------------- +import plistlib import vtk import wx.lib.pubsub as ps @@ -34,13 +35,27 @@ class Surface(): def __init__(self): Surface.general_index += 1 self.index = Surface.general_index - self.polydata = None - self.colour = None + self.polydata = '' + self.colour = '' self.transparency = const.SURFACE_TRANSPARENCY self.volume = 0 self.is_shown = 1 self.name = const.SURFACE_NAME_PATTERN %(Surface.general_index+1) + def SavePlist(self, filename): + surface = {} + filename = '%s$%s$%d' % (filename, 'surface', self.index) + d = self.__dict__ + for key in d: + if isinstance(d[key], vtk.vtkPolyData): + img_name = '%s_%s.vtp' % (filename, key) + pu.Export(d[key], img_name, bin=True) + surface[key] = {'$polydata': img_name} + else: + surface[key] = d[key] + plistlib.writePlist(surface, filename + '.plist') + return filename + # TODO: will be initialized inside control as it is being done? class SurfaceManager(): """ diff --git a/invesalius/gui/frame.py b/invesalius/gui/frame.py index 2791aea..0e57401 100755 --- a/invesalius/gui/frame.py +++ b/invesalius/gui/frame.py @@ -329,7 +329,8 @@ class StatusBar(wx.StatusBar): self.SetStatusText(label, 0) if (int(value) >= 99): self.SetStatusText("",0) - wx.Yield() + if sys.platform != 'linux2': + wx.Yield() def UpdateStatusLabel(self, pubsub_evt): @@ -434,8 +435,11 @@ class ProjectToolBar(wx.ToolBar): self.Realize() def __bind_events(self): - pass + self.Bind(wx.EVT_TOOL, self.OnToolSave, id=const.ID_FILE_SAVE) + def OnToolSave(self, evt): + print "Saving ..." + ps.Publisher().sendMessage('Save Project') # ------------------------------------------------------------------ class ObjectToolBar(wx.ToolBar): diff --git a/invesalius/presets.py b/invesalius/presets.py index 6b9e246..4b56e05 100644 --- a/invesalius/presets.py +++ b/invesalius/presets.py @@ -16,6 +16,8 @@ # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais # detalhes. #-------------------------------------------------------------------------- +import os +import plistlib import wx.lib.pubsub as ps @@ -39,7 +41,7 @@ class Presets(): "Fat Tissue (Adult)":(-212,-72), "Skin Tissue (Adult)":(-718,-177), "Skin Tissue (Child)":(-766,-202), - "Custom":(None, None) + "Custom":('', '') }) self.thresh_mri = TwoWaysDictionary({ @@ -57,7 +59,7 @@ class Presets(): "Fat Tissue (Adult)":(812,952), "Skin Tissue (Adult)":(306,847), "Skin Tissue (Child)":(258,822), - "Custom":(None, None) + "Custom":('', '') }) self.__bind_events() @@ -93,3 +95,16 @@ class Presets(): ps.Publisher().sendMessage('Update threshold limits', (thresh_min, thresh_max)) + + def SavePlist(self, filename): + filename = "%s$%s" % (filename, 'presets.plist') + preset = {} + preset['thresh_mri'] = self.thresh_mri.copy() + preset['thresh_ct'] = self.thresh_ct.copy() + plistlib.writePlist(preset, filename) + return filename + + def OpenPlist(self, filename): + preset = plistlib.readPlist(filename) + self.thresh_mri = TwoWaysDictionary(preset['thresh_mri']) + self.thresh_ct = TwoWaysDictionary(preset['thresh_ct']) diff --git a/invesalius/project.py b/invesalius/project.py index 53c4dbc..e5e0178 100755 --- a/invesalius/project.py +++ b/invesalius/project.py @@ -21,6 +21,10 @@ import os import plistlib import wx import wx.lib.pubsub as ps +import vtk + +import data.imagedata_utils as iu +import data.polydata_utils as pu from utils import Singleton from presets import Presets @@ -124,42 +128,56 @@ class Project(object): preset = plistlib.readPlist(path) ps.Publisher.sendMessage('Set raycasting preset', preset) - def SavePlistProjectOld(self, filename): + def SavePlistProject(self, filename): project = {} for key in self.__dict__: - if getattr(self.__dict__[key], 'SavePlist'): - project[key] = {'path': self.__dict__[key].SavePlist('.')} + if getattr(self.__dict__[key], 'SavePlist', None): + project[key] = {'path': self.__dict__[key].SavePlist(filename)} else: project[key] = self.__dict__[key] masks = {} for index in self.mask_dict: - masks[str(index)] = "self.mask_dict[index]" + masks[str(index)] = self.mask_dict[index].SavePlist(filename) print index surfaces = {} for index in self.surface_dict: - surfaces[str(index)] = "self.surface_dict[index]" + surfaces[str(index)] = self.surface_dict[index].SavePlist(filename) print index - + project['surface_dict'] = surfaces project['mask_dict'] = masks - project['imagedata'] = 'imagedata' + img_file = '%s_%s.vti' % (filename, 'imagedata') + iu.Export(self.imagedata, img_file, bin=True) + project['imagedata'] = img_file - plistlib.writePlist(project, filename) + plistlib.writePlist(project, filename + '.plist') - def SavePlistProject(self, filename, object=None): - if object is None: - object = self - supported_types = (str, int, float, bool, tuple, list, dict, + def SavePlistProjectOld(self, filename, dict_object=None): + if dict_object is None: + dict_object = self.__dict__ + supported_types = (str, int, float, bool, tuple, list, plistlib.Data) project = {} - for key in object.__dict__: - prop = object.__dict__[key] + for key in dict_object: + prop = dict_object[key] if isinstance(prop, supported_types): - project[key] = prop - print key + project[str(key)] = prop + elif isinstance(prop, dict): + project[str(key)] = self.SavePlistProject('%s$%s' % (filename, + key), prop) + elif isinstance(prop, vtk.vtkImageData): + img_name = '%s_%s' % (key, filename) + img_file = iu.Export(prop, img_name, bin=True) + project[str(key)] = {'imagedatafile': img_file} + elif isinstance(prop, vtk.vtkPolyData): + pd_name = '%s_%s' % (key, filename) + pd_file = pu.Export(prop, pd_name, bin=True) + project[str(key)] = {'polydatafile': pd_file} + else: + project[str(key)] = {'plistfile': self.SavePlistProject("%s$%s" % (filename, key), prop.__dict__)} print project plistlib.writePlist(project, filename) -- libgit2 0.21.2