diff --git a/invesalius/control.py b/invesalius/control.py index 2fca87f..e21df24 100755 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -599,7 +599,6 @@ class Controller(): else: prj.Project().raycasting_preset = 0 Publisher.sendMessage('Update raycasting preset') - Publisher.sendMessage("Hide raycasting volume") def SaveRaycastingPreset(self, pubsub_evt): preset_name = pubsub_evt.data diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index f5f490b..9be780b 100755 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -110,11 +110,14 @@ class Viewer(wx.Panel): self.repositioned_coronal_plan = 0 self.added_actor = 0 + self._to_show_ball = 0 + def __bind_events(self): Publisher.subscribe(self.LoadActor, 'Load surface actor into viewer') Publisher.subscribe(self.RemoveActor, 'Remove surface actor from viewer') + Publisher.subscribe(self.OnShowSurface, 'Show surface') Publisher.subscribe(self.UpdateRender, 'Render volume viewer') Publisher.subscribe(self.ChangeBackgroundColour, @@ -225,22 +228,35 @@ class Viewer(wx.Panel): self.ball_actor.SetProperty(p) def ActivateBallReference(self, pubsub_evt): - if not self.ball_reference: - self.CreateBallReference() - self.ren.AddActor(self.ball_actor) + if self._to_show_ball: + if not self.ball_reference: + self.CreateBallReference() + self.ren.AddActor(self.ball_actor) def DeactivateBallReference(self, pubsub_evt): if self.ball_reference: self.ren.RemoveActor(self.ball_actor) + def OnShowSurface(self, pubsub_evt): + index, value = pubsub_evt.data + if value: + self._to_show_ball += 1 + else: + self._to_show_ball -= 1 + print "to show ball", self._to_show_ball + def SetBallReferencePosition(self, pubsub_evt): x, y, z = pubsub_evt.data self.ball_reference.SetCenter(x, y, z) def SetBallReferencePositionBasedOnBound(self, pubsub_evt): - coord = pubsub_evt.data - x, y, z = bases.FlipX(coord) - self.ball_reference.SetCenter(x, y, z) + if self._to_show_ball: + self.ActivateBallReference(None) + coord = pubsub_evt.data + x, y, z = bases.FlipX(coord) + self.ball_reference.SetCenter(x, y, z) + else: + self.DeactivateBallReference(None) def OnStartSeed(self, pubsub_evt): index = pubsub_evt.data @@ -321,6 +337,7 @@ class Viewer(wx.Panel): if (volumes.GetNumberOfItems()): self.ren.RemoveVolume(volumes.GetLastProp()) self.interactor.Render() + self._to_show_ball -= 1 def RemoveActors(self, pubsub_evt): "Remove a list of actors" @@ -605,12 +622,16 @@ class Viewer(wx.Panel): def OnShowRaycasting(self, pubsub_evt): self.raycasting_volume = True + self._to_show_ball += 1 + print "to show ball", self._to_show_ball if self.on_wl: self.text.Show() def OnHideRaycasting(self, pubsub_evt): self.raycasting_volume = False self.text.Hide() + self._to_show_ball -= 1 + print "to show ball", self._to_show_ball def OnSize(self, evt): self.UpdateRender() @@ -639,6 +660,8 @@ class Viewer(wx.Panel): #self.ShowOrientationCube() self.interactor.Render() + self._to_show_ball += 1 + print "to show ball", self._to_show_ball def RemoveActor(self, pubsub_evt): utils.debug("RemoveActor") @@ -646,6 +669,8 @@ class Viewer(wx.Panel): ren = self.ren ren.RemoveActor(actor) self.interactor.Render() + #self._to_show_ball -= 1 + #print "to show ball", self._to_show_ball def RemoveAllActor(self, pubsub_evt): utils.debug("RemoveAllActor") @@ -658,6 +683,8 @@ class Viewer(wx.Panel): def LoadVolume(self, pubsub_evt): self.raycasting_volume = True + #self._to_show_ball += 1 + #print "to show ball", self._to_show_ball volume = pubsub_evt.data[0] colour = pubsub_evt.data[1] @@ -685,7 +712,10 @@ class Viewer(wx.Panel): def UnloadVolume(self, pubsub_evt): volume = pubsub_evt.data + self._to_show_ball -= 1 self.ren.RemoveVolume(volume) + del volume + print "to show ball", self._to_show_ball def OnSetViewAngle(self, evt_pubsub): view = evt_pubsub.data @@ -824,6 +854,9 @@ class Viewer(wx.Panel): self.SetViewAngle(const.VOL_ISO) self.repositioned_coronal_plan = 1 + def _verify_necessity_ball_ref(self): + pass + diff --git a/invesalius/data/volume.py b/invesalius/data/volume.py index e42afe5..3256a2e 100755 --- a/invesalius/data/volume.py +++ b/invesalius/data/volume.py @@ -18,6 +18,7 @@ #-------------------------------------------------------------------------- import plistlib import os +import weakref import numpy import vtk @@ -173,12 +174,30 @@ class Volume(): #Publisher.sendMessage('Render volume viewer') else: self.LoadVolume() - self.CalculateHistogram() + #self.CalculateHistogram() self.exist = 1 colour = self.GetBackgroundColour() Publisher.sendMessage('Change volume viewer background colour', colour) Publisher.sendMessage('Change volume viewer gui colour', colour) + else: + Publisher.sendMessage('Unload volume', self.volume) + del self.image + del self.imagedata + del self.final_imagedata + del self.volume + del self.color_transfer + del self.opacity_transfer_func + del self.volume_properties + del self.volume_mapper + self.volume = None + self.exist = False + self.loaded_image = False + self.image = None + self.final_imagedata = None + self.opacity_transfer_func = None + self.color_transfer = None + Publisher.sendMessage('Render volume viewer') def OnFlipVolume(self, pubsub_evt): print "Flipping Volume" @@ -198,7 +217,6 @@ class Volume(): self.Create8bColorTable(self.scale) self.Create8bOpacityTable(self.scale) - def __load_preset(self): # Update colour table self.__update_colour_table() @@ -212,7 +230,6 @@ class Volume(): self.SetShading() self.SetTypeRaycasting() - def OnSetCurve(self, pubsub_evt): self.curve = pubsub_evt.data self.CalculateWWWL() @@ -469,9 +486,16 @@ class Volume(): convolve = vtk.vtkImageConvolve() convolve.SetInput(imagedata) convolve.SetKernel5x5([i/60.0 for i in Kernels[filter]]) - convolve.AddObserver("ProgressEvent", lambda obj,evt: - update_progress(convolve, "Rendering...")) + convolve.ReleaseDataFlagOn() + + convolve_ref = weakref.ref(convolve) + + convolve_ref().AddObserver("ProgressEvent", lambda obj,evt: + update_progress(convolve_ref(), "Rendering...")) + convolve.Update() + del imagedata imagedata = convolve.GetOutput() + del convolve #convolve.GetOutput().ReleaseDataFlagOn() return imagedata @@ -509,12 +533,13 @@ class Volume(): flip.SetInput(image) flip.SetFilteredAxis(1) flip.FlipAboutOriginOn() - flip.AddObserver("ProgressEvent", lambda obj,evt: - update_progress(flip, "Rendering...")) + flip.ReleaseDataFlagOn() + + flip_ref = weakref.ref(flip) + flip_ref().AddObserver("ProgressEvent", lambda obj,evt: + update_progress(flip_ref(), "Rendering...")) flip.Update() image = flip.GetOutput() - #else: - #update_progress= vtk_utils.ShowProgress(1 + number_filters) scale = image.GetScalarRange() self.scale = scale @@ -523,10 +548,13 @@ class Volume(): cast.SetInput(image) cast.SetShift(abs(scale[0])) cast.SetOutputScalarTypeToUnsignedShort() - cast.AddObserver("ProgressEvent", lambda obj,evt: - update_progress(cast, "Rendering...")) + cast.ReleaseDataFlagOn() + cast_ref = weakref.ref(cast) + cast_ref().AddObserver("ProgressEvent", lambda obj,evt: + update_progress(cast_ref(), "Rendering...")) cast.Update() image2 = cast + self.imagedata = image2 if self.config['advancedCLUT']: self.Create16bColorTable(scale) @@ -606,6 +634,8 @@ class Volume(): Publisher.sendMessage('Load volume into viewer', (volume, colour, (self.ww, self.wl))) + del flip + del cast def OnEnableTool(self, pubsub_evt): tool_name, enable = pubsub_evt.data @@ -630,6 +660,7 @@ class Volume(): accumulate.SetInput(image) accumulate.SetComponentExtent(0, r -1, 0, 0, 0, 0) accumulate.SetComponentOrigin(image.GetScalarRange()[0], 0, 0) + accumulate.ReleaseDataFlagOn() accumulate.Update() n_image = numpy_support.vtk_to_numpy(accumulate.GetOutput().GetPointData().GetScalars()) Publisher.sendMessage('Load histogram', (n_image, -- libgit2 0.21.2