From e5349ae2bcb47728d4148adde4547f6f2582b3d9 Mon Sep 17 00:00:00 2001 From: Thiago Franco de Moraes Date: Tue, 5 Jul 2016 13:20:36 -0300 Subject: [PATCH] Picking only the slice actor when adding measure --- invesalius/data/measures.py | 3 ++- invesalius/data/styles.py | 18 +++++++++++++++--- invesalius/utils.py | 10 ++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index 802b3c5..e98f168 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -10,6 +10,7 @@ import vtk import constants as const import project as prj import session as ses +import utils TYPE = {const.LINEAR: _(u"Linear"), const.ANGULAR: _(u"Angular"), @@ -26,6 +27,7 @@ class MeasureData: """ Responsible to keep measures data. """ + __metaclass__= utils.Singleton def __init__(self): self.measures = {const.SURFACE: {}, const.AXIAL: {}, @@ -34,7 +36,6 @@ class MeasureData: self._list_measures = [] def append(self, m): - print m[0].location, m[0].slice_number try: self.measures[m[0].location][m[0].slice_number].append(m) except KeyError: diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 623edf9..1a9ad96 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -40,6 +40,8 @@ from scipy.ndimage import watershed_ift, generate_binary_structure from skimage.morphology import watershed from skimage import filter +from .measures import MeasureData + import watershed_process import utils @@ -350,28 +352,37 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.orientation = viewer.orientation self.slice_data = viewer.slice_data + self.measures = MeasureData() + spacing = self.slice_data.actor.GetInput().GetSpacing() if self.orientation == "AXIAL": self.radius = min(spacing[1], spacing[2]) * 0.8 + self._ori = const.AXIAL elif self.orientation == 'CORONAL': self.radius = min(spacing[0], spacing[1]) * 0.8 + self._ori = const.CORONAL elif self.orientation == 'SAGITAL': self.radius = min(spacing[1], spacing[2]) * 0.8 + self._ori = const.SAGITAL self.picker = vtk.vtkCellPicker() + self.picker.PickFromListOn() self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint) def OnInsertLinearMeasurePoint(self, obj, evt): iren = obj.GetInteractor() - x,y = iren.GetEventPosition() - render = iren.FindPokedRenderer(x, y) + mx,my = iren.GetEventPosition() + render = iren.FindPokedRenderer(mx, my) slice_number = self.slice_data.number - self.picker.Pick(x, y, 0, render) + self.picker.AddPickList(self.slice_data.actor) + self.picker.Pick(mx, my, 0, render) x, y, z = self.picker.GetPickPosition() + self.picker.DeletePickList(self.slice_data.actor) + if self.picker.GetViewProp(): Publisher.sendMessage("Add measurement point", ((x, y,z), const.LINEAR, @@ -379,6 +390,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): slice_number, self.radius)) self.viewer.interactor.Render() + def CleanUp(self): Publisher.sendMessage("Remove incomplete measurements") diff --git a/invesalius/utils.py b/invesalius/utils.py index 5870984..1d4fc32 100644 --- a/invesalius/utils.py +++ b/invesalius/utils.py @@ -23,6 +23,8 @@ import re import locale import math +import numpy as np + def format_time(value): sp1 = value.split(".") sp2 = value.split(":") @@ -418,3 +420,11 @@ def UpdateCheck(): if (last!=const.INVESALIUS_VERSION): print " ...New update found!!! -> version:", last #, ", url=",url wx.CallAfter(wx.CallLater, 1000, _show_update_info) + + +def vtkarray_to_numpy(m): + nm = np.zeros((4, 4)) + for i in xrange(4): + for j in xrange(4): + nm[i, j] = m.GetElement(i, j) + return nm -- libgit2 0.21.2