From 879f747a87186f829865f09f26e530016e21897d Mon Sep 17 00:00:00 2001 From: tfmoraes Date: Wed, 24 Feb 2010 20:03:36 +0000 Subject: [PATCH] ENH: Facilities to work with measures --- invesalius/data/measures.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ invesalius/data/viewer_volume.py | 58 +++++++++++++++++++++++++++++++++------------------------- 2 files changed, 100 insertions(+), 25 deletions(-) diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index ad4d51f..2cf3739 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -124,12 +124,25 @@ class LinearMeasure(object): self.point_actor1 = None self.point_actor2 = None self.line_actor = None + self.text_actor = None self.render = render if not representation: representation = CirclePointRepresentation() self.representation = representation print colour + def IsComplete(self): + """ + Is this measure complete? + """ + return not self.point_actor2 is None + + def AddPoint(self, x, y, z): + if not self.point_actor1: + self.SetPoint1(x, y, z) + elif not self.point_actor2: + self.SetPoint2(x, y, z) + def SetPoint1(self, x, y, z): self.points.append((x, y, z)) self.point_actor1 = self.representation.GetRepresentation(x, y, z) @@ -197,6 +210,26 @@ class LinearMeasure(object): self.line_actor.SetVisibility(v) self.text_actor.SetVisibility(v) + def Remove(self): + if self.point_actor1: + self.render.RemoveActor(self.point_actor1) + del self.point_actor1 + + if self.point_actor2: + self.render.RemoveActor(self.point_actor2) + del self.point_actor2 + + if self.line_actor: + self.render.RemoveActor(self.line_actor) + del self.line_actor + + if self.text_actor: + self.render.RemoveActor(self.text_actor) + del self.text_actor + + def __del__(self): + self.Remove() + class AngularMeasure(object): def __init__(self, render, colour=(1, 0, 0), representation=None): @@ -207,12 +240,24 @@ class AngularMeasure(object): self.point_actor2 = None self.point_actor3 = None self.line_actor = None + self.text_actor = None self.render = render if not representation: representation = CirclePointRepresentation() self.representation = representation print colour + def IsComplete(self): + return not self.point_actor3 is None + + def AddPoint(self, x, y, z): + if not self.point_actor1: + self.SetPoint1(x, y, z) + elif not self.point_actor2: + self.SetPoint2(x, y, z) + elif not self.point_actor3: + self.SetPoint3(x, y, z) + def SetPoint1(self, x, y, z): self.points[0] = (x, y, z) self.number_of_points = 1 @@ -343,4 +388,26 @@ class AngularMeasure(object): angle = math.degrees(math.acos(cos)) return angle + def Remove(self): + if self.point_actor1: + self.render.RemoveActor(self.point_actor1) + del self.point_actor1 + + if self.point_actor2: + self.render.RemoveActor(self.point_actor2) + del self.point_actor2 + + if self.point_actor3: + self.render.RemoveActor(self.point_actor3) + del self.point_actor3 + + if self.line_actor: + self.render.RemoveActor(self.line_actor) + del self.line_actor + + if self.text_actor: + self.render.RemoveActor(self.text_actor) + del self.text_actor + def __del__(self): + self.Remove() diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index 0165034..a84b1a2 100755 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -94,6 +94,8 @@ class Viewer(wx.Panel): self.measure_picker = vtk.vtkPropPicker() #self.measure_picker.SetTolerance(0.005) self.measures = [] + + self._last_state = 0 def __bind_events(self): @@ -306,6 +308,11 @@ class Viewer(wx.Panel): } } + if self._last_state in (const.STATE_MEASURE_DISTANCE, + const.STATE_MEASURE_ANGLE): + if self.measures and not self.measures[-1].text_actor: + del self.measures[-1] + if state == const.STATE_WL: self.on_wl = True if self.raycasting_volume: @@ -334,6 +341,8 @@ class Viewer(wx.Panel): # Bind event style.AddObserver(event,action[state][event]) + self._last_state = state + def OnSpinMove(self, evt, obj): if (self.mouse_pressed): evt.Spin() @@ -615,37 +624,36 @@ class Viewer(wx.Panel): x,y = self.interactor.GetEventPosition() self.measure_picker.Pick(x, y, 0, self.ren) x, y, z = self.measure_picker.GetPickPosition() -# if self.measure_picker.GetPointId() != -1: - if not self.measures or self.measures[-1].point_actor2: - m = measures.LinearMeasure(self.ren) - m.SetPoint1(x, y, z) - self.measures.append(m) - else: - m = self.measures[-1] - m.SetPoint2(x, y, z) - ps.Publisher().sendMessage("Add measure to list", - ("3D", _("%.3f mm3" % m.GetValue()))) - self.interactor.Render() + if self.measure_picker.GetActor(): + if not self.measures or self.measures[-1].IsComplete(): + m = measures.LinearMeasure(self.ren) + m.AddPoint(x, y, z) + self.measures.append(m) + else: + m = self.measures[-1] + m.AddPoint(x, y, z) + if m.IsComplete(): + ps.Publisher().sendMessage("Add measure to list", + ("3D", _("%.3f mm3" % m.GetValue()))) + self.interactor.Render() def OnInsertAngularMeasurePoint(self, obj, evt): print "Hey, you inserted a angular point" x,y = self.interactor.GetEventPosition() self.measure_picker.Pick(x, y, 0, self.ren) x, y, z = self.measure_picker.GetPickPosition() -# if self.measure_picker.GetPointId() != -1: - if not self.measures or self.measures[-1].point_actor3: - m = measures.AngularMeasure(self.ren) - m.SetPoint1(x, y, z) - self.measures.append(m) - elif not self.measures[-1].point_actor2: - m = self.measures[-1] - m.SetPoint2(x, y, z) - else: - m = self.measures[-1] - m.SetPoint3(x, y, z) - ps.Publisher().sendMessage("Add measure to list", - ("3D", _("%.3f" % m.GetValue()))) - self.interactor.Render() + if self.measure_picker.GetActor(): + if not self.measures or self.measures[-1].IsComplete(): + m = measures.AngularMeasure(self.ren) + m.AddPoint(x, y, z) + self.measures.append(m) + else: + m = self.measures[-1] + m.AddPoint(x, y, z) + if m.IsComplete(): + ps.Publisher().sendMessage("Add measure to list", + ("3D", _("%.3f" % m.GetValue()))) + self.interactor.Render() class SlicePlane: -- libgit2 0.21.2