diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index e98f168..a8a9798 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -22,6 +22,12 @@ LOCATION = {const.SURFACE: _(u"3D"), const.SAGITAL: _(u"Sagittal") } +map_locations = { + "3D": const.SURFACE, + "AXIAL": const.AXIAL, + "CORONAL": const.CORONAL, + "SAGITAL": const.SAGITAL, +} class MeasureData: """ @@ -51,6 +57,9 @@ class MeasureData: def __len__(self): return len(self._list_measures) + def __getitem__(self, key): + return self.measures[map_locations[key]] + class MeasurementManager(object): """ @@ -102,8 +111,8 @@ class MeasurementManager(object): for point in m.points: x, y, z = point actors = mr.AddPoint(x, y, z) - Publisher.sendMessage(("Add actors " + str(m.location)), - (actors, m.slice_number)) + # Publisher.sendMessage(("Add actors " + str(m.location)), + # (actors, m.slice_number)) self.current = None if not m.is_shown: @@ -186,8 +195,8 @@ class MeasurementManager(object): x, y, z = position actors = mr.AddPoint(x, y, z) m.points.append(position) - Publisher.sendMessage("Add actors " + str(location), - (actors, m.slice_number)) + # Publisher.sendMessage("Add actors " + str(location), + # (actors, m.slice_number)) if mr.IsComplete(): index = prj.Project().AddMeasurement(m) @@ -394,6 +403,7 @@ class LinearMeasure(object): self.point_actor2 = None self.line_actor = None self.text_actor = None + self.renderer = None if not representation: representation = CirclePointRepresentation(colour) self.representation = representation @@ -414,13 +424,31 @@ class LinearMeasure(object): return (self.point_actor2, self.line_actor, self.text_actor) def SetPoint1(self, x, y, z): - self.points.append((x, y, z)) - self.point_actor1 = self.representation.GetRepresentation(x, y, z) + if len(self.points) == 0: + self.points.append((x, y, z)) + self.point_actor1 = self.representation.GetRepresentation(x, y, z) + else: + self.points[0] = (x, y, z) + if len(self.points) == 2: + self.Remove() + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) + self.CreateMeasure() + else: + self.Remove() + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) def SetPoint2(self, x, y, z): - self.points.append((x, y, z)) - self.point_actor2 = self.representation.GetRepresentation(x, y, z) - self.CreateMeasure() + if len(self.points) == 1: + self.points.append((x, y, z)) + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) + self.CreateMeasure() + else: + self.points[1] = (x, y, z) + self.Remove() + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) + self.CreateMeasure() def CreateMeasure(self): self._draw_line() @@ -473,22 +501,22 @@ class LinearMeasure(object): def SetRenderer(self, renderer): if self.point_actor1: - self.render.RemoveActor(self.point_actor1) + self.renderer.RemoveActor(self.point_actor1) renderer.AddActor(self.point_actor1) if self.point_actor2: - self.render.RemoveActor(self.point_actor2) + self.renderer.RemoveActor(self.point_actor2) renderer.AddActor(self.point_actor2) if self.line_actor: - self.render.RemoveActor(self.line_actor) + self.renderer.RemoveActor(self.line_actor) renderer.AddActor(self.line_actor) if self.text_actor: - self.render.RemoveActor(self.text_actor) + self.renderer.RemoveActor(self.text_actor) renderer.AddActor(self.text_actor) - self.render = renderer + self.renderer = renderer def SetVisibility(self, v): self.point_actor1.SetVisibility(v) @@ -513,19 +541,19 @@ class LinearMeasure(object): def Remove(self): if self.point_actor1: - self.render.RemoveActor(self.point_actor1) + self.renderer.RemoveActor(self.point_actor1) del self.point_actor1 if self.point_actor2: - self.render.RemoveActor(self.point_actor2) + self.renderer.RemoveActor(self.point_actor2) del self.point_actor2 if self.line_actor: - self.render.RemoveActor(self.line_actor) + self.renderer.RemoveActor(self.line_actor) del self.line_actor if self.text_actor: - self.render.RemoveActor(self.text_actor) + self.renderer.RemoveActor(self.text_actor) del self.text_actor # def __del__(self): @@ -707,47 +735,47 @@ class AngularMeasure(object): def Remove(self): if self.point_actor1: - self.render.RemoveActor(self.point_actor1) + self.renderer.RemoveActor(self.point_actor1) del self.point_actor1 if self.point_actor2: - self.render.RemoveActor(self.point_actor2) + self.renderer.RemoveActor(self.point_actor2) del self.point_actor2 if self.point_actor3: - self.render.RemoveActor(self.point_actor3) + self.renderer.RemoveActor(self.point_actor3) del self.point_actor3 if self.line_actor: - self.render.RemoveActor(self.line_actor) + self.renderer.RemoveActor(self.line_actor) del self.line_actor if self.text_actor: - self.render.RemoveActor(self.text_actor) + self.renderer.RemoveActor(self.text_actor) del self.text_actor def SetRenderer(self, renderer): if self.point_actor1: - self.render.RemoveActor(self.point_actor1) + self.renderer.RemoveActor(self.point_actor1) renderer.AddActor(self.point_actor1) if self.point_actor2: - self.render.RemoveActor(self.point_actor2) + self.renderer.RemoveActor(self.point_actor2) renderer.AddActor(self.point_actor2) if self.point_actor3: - self.render.RemoveActor(self.point_actor3) + self.renderer.RemoveActor(self.point_actor3) renderer.AddActor(self.point_actor3) if self.line_actor: - self.render.RemoveActor(self.line_actor) + self.renderer.RemoveActor(self.line_actor) renderer.AddActor(self.line_actor) if self.text_actor: - self.render.RemoveActor(self.text_actor) + self.renderer.RemoveActor(self.text_actor) renderer.AddActor(self.text_actor) - self.render = renderer + self.renderer = renderer # def __del__(self): # self.Remove() diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 1a9ad96..b79553b 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -353,6 +353,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.slice_data = viewer.slice_data self.measures = MeasureData() + self.selected = None spacing = self.slice_data.actor.GetInput().GetSpacing() @@ -372,28 +373,82 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.picker.PickFromListOn() self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint) + self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseMeasurePoint) + self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint) def OnInsertLinearMeasurePoint(self, obj, evt): - iren = obj.GetInteractor() - mx,my = iren.GetEventPosition() - render = iren.FindPokedRenderer(mx, my) slice_number = self.slice_data.number - 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) + x, y, z = self._get_pos_clicked() + + selected = self._verify_clicked(x, y, z) + if selected: + self.selected = selected + else: + if self.picker.GetViewProp(): + Publisher.sendMessage("Add measurement point", + ((x, y,z), const.LINEAR, + ORIENTATIONS[self.orientation], + slice_number, self.radius)) + self.viewer.interactor.Render() + + def OnReleaseMeasurePoint(self, obj, evt): + if self.selected: + print "Changing Position" + n, m, mr = self.selected + x, y, z = self._get_pos_clicked() + ren = self.slice_data.renderer + mr.renderer = ren + if n == 0: + mr.SetPoint1(x, y, z) + m.points[0] = x, y, z + elif n == 1: + mr.SetPoint2(x, y, z) + m.points[1] = x, y, z - if self.picker.GetViewProp(): - Publisher.sendMessage("Add measurement point", - ((x, y,z), const.LINEAR, - ORIENTATIONS[self.orientation], - slice_number, self.radius)) self.viewer.interactor.Render() + Publisher.sendMessage('Reload actual slice %s' % self.orientation) + self.selected = None + + def OnMoveMeasurePoint(self, obj, evt): + if self.selected: + print "Changing Position" + n, m, mr = self.selected + x, y, z = self._get_pos_clicked() + ren = self.slice_data.renderer + mr.renderer = ren + if n == 0: + mr.SetPoint1(x, y, z) + m.points[0] = x, y, z + elif n == 1: + mr.SetPoint2(x, y, z) + m.points[1] = x, y, z + self.viewer.interactor.Render() + Publisher.sendMessage('Reload actual slice %s' % self.orientation) def CleanUp(self): Publisher.sendMessage("Remove incomplete measurements") + def _get_pos_clicked(self): + iren = self.viewer.interactor + mx,my = iren.GetEventPosition() + render = iren.FindPokedRenderer(mx, my) + 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) + return (x, y, z) + + def _verify_clicked(self, x, y, z): + slice_number = self.slice_data.number + if slice_number in self.measures.measures[self._ori]: + for m, mr in self.measures.measures[self._ori][slice_number]: + for n, p in enumerate(m.points): + px, py, pz = p + dist = ((px-x)**2 + (py-y)**2 + (pz-z)**2)**0.5 + if dist < 2: + return (n, m, mr) + return None class AngularMeasureInteractorStyle(DefaultInteractorStyle): """ diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index 835aaa4..3974599 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -171,7 +171,7 @@ class Viewer(wx.Panel): self.layout = (1, 1) self.orientation_texts = [] - self.measures = [] + self.measures = measures.MeasureData() self.actors_by_slice_number = {} self.renderers_by_slice_number = {} @@ -1183,6 +1183,14 @@ class Viewer(wx.Panel): for actor in self.actors_by_slice_number.get(index, []): self.slice_data.renderer.AddActor(actor) + for (m, mr) in self.measures[self.orientation].get(self.slice_data.number, []): + for actor in mr.GetActors(): + self.slice_data.renderer.RemoveActor(actor) + + for (m, mr) in self.measures[self.orientation].get(index, []): + for actor in mr.GetActors(): + self.slice_data.renderer.AddActor(actor) + if self.slice_._type_projection == const.PROJECTION_NORMAL: self.slice_data.SetNumber(index) else: -- libgit2 0.21.2