diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index 2cf3739..eb160bb 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -204,6 +204,25 @@ class LinearMeasure(object): p1, p2 = self.points return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2)) + def SetRenderer(self, renderer): + if self.point_actor1: + self.render.RemoveActor(self.point_actor1) + renderer.AddActor(self.point_actor1) + + if self.point_actor2: + self.render.RemoveActor(self.point_actor2) + renderer.AddActor(self.point_actor2) + + if self.line_actor: + self.render.RemoveActor(self.line_actor) + renderer.AddActor(self.line_actor) + + if self.text_actor: + self.render.RemoveActor(self.text_actor) + renderer.AddActor(self.text_actor) + + self.render = renderer + def SetVisibility(self, v): self.point_actor1.SetVisibility(v) self.point_actor2.SetVisibility(v) @@ -409,5 +428,28 @@ class AngularMeasure(object): self.render.RemoveActor(self.text_actor) del self.text_actor + def SetRenderer(self, renderer): + if self.point_actor1: + self.render.RemoveActor(self.point_actor1) + renderer.AddActor(self.point_actor1) + + if self.point_actor2: + self.render.RemoveActor(self.point_actor2) + renderer.AddActor(self.point_actor2) + + if self.point_actor3: + self.render.RemoveActor(self.point_actor3) + renderer.AddActor(self.point_actor3) + + if self.line_actor: + self.render.RemoveActor(self.line_actor) + renderer.AddActor(self.line_actor) + + if self.text_actor: + self.render.RemoveActor(self.text_actor) + renderer.AddActor(self.text_actor) + + self.render = renderer + def __del__(self): self.Remove() diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index 97c489c..90f254c 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -36,6 +36,8 @@ import project import slice_data as sd import utils +from data import measures + ID_TO_TOOL_ITEM = {} STR_WL = "WL: %d WW: %d" @@ -78,6 +80,8 @@ class Viewer(wx.Panel): self.pick = vtk.vtkPropPicker() self.cross_actor = vtk.vtkActor() + self.measures = [] + self.__bind_events() self.__bind_events_wx() @@ -206,7 +210,12 @@ class Viewer(wx.Panel): }, const.STATE_MEASURE_DISTANCE: { - } + "LeftButtonPressEvent": self.OnInsertLinearMeasurePoint + }, + const.STATE_MEASURE_ANGLE: + { + "LeftButtonPressEvent": self.OnInsertAngularMeasurePoint + }, } if state == const.SLICE_STATE_CROSS: self.__set_cross_visibility(1) @@ -1360,6 +1369,8 @@ class Viewer(wx.Panel): def set_slice_number(self, index): self.slice_number = index + # Showing off all the measures + [m[1].SetVisibility(0) for m in self.measures] for n, slice_data in enumerate(self.slice_data_list): ren = slice_data.renderer actor = slice_data.actor @@ -1367,6 +1378,8 @@ class Viewer(wx.Panel): max = actor.GetSliceNumberMax() + 1 if pos < max: slice_data.SetNumber(pos) + [m[1].SetRenderer(ren) for m in self.measures if m[0] == pos] + [m[1].SetVisibility(1) for m in self.measures if m[0] == pos] self.__update_display_extent(slice_data) slice_data.Show() else: @@ -1410,3 +1423,45 @@ class Viewer(wx.Panel): elif coord[index] < extent_min[index]: coord[index] = extent_min[index] return coord + + def OnInsertLinearMeasurePoint(self, obj, evt): + x,y = self.interactor.GetEventPosition() + render = self.interactor.FindPokedRenderer(x, y) + slice_data = self.get_slice_data(render) + slice_number = slice_data.number + self.pick.Pick(x, y, 0, render) + x, y, z = self.pick.GetPickPosition() + if self.pick.GetViewProp(): + print "Hey, you inserted measure point" + if not self.measures or self.measures[-1][1].IsComplete(): + m = measures.LinearMeasure(render) + m.AddPoint(x, y, z) + self.measures.append((slice_number, m)) + else: + m = self.measures[-1][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() + render = self.interactor.FindPokedRenderer(x, y) + slice_data = self.get_slice_data(render) + slice_number = slice_data.number + self.pick.Pick(x, y, 0, render) + x, y, z = self.pick.GetPickPosition() + if self.pick.GetViewProp(): + if not self.measures or self.measures[-1][1].IsComplete(): + m = measures.AngularMeasure(render) + m.AddPoint(x, y, z) + self.measures.append((slice_number, m)) + else: + m = self.measures[-1][1] + m.AddPoint(x, y, z) + if m.IsComplete(): + ps.Publisher().sendMessage("Add measure to list", + ("3D", _("%.3f" % m.GetValue()))) + self.interactor.Render() diff --git a/invesalius/data/vtk_utils.py b/invesalius/data/vtk_utils.py index 5d8fd2c..e088ea9 100644 --- a/invesalius/data/vtk_utils.py +++ b/invesalius/data/vtk_utils.py @@ -111,6 +111,7 @@ class Text(object): actor = vtk.vtkActor2D() actor.SetMapper(mapper) actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() + actor.PickableOff() self.actor = actor self.SetPosition(const.TEXT_POS_LEFT_UP) @@ -180,6 +181,7 @@ class TextZero(object): actor = vtk.vtkTextActor() actor.GetTextProperty().ShallowCopy(property) actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() + actor.PickableOff() self.actor = actor def SetColour(self, colour): -- libgit2 0.21.2