diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index 336b58d..7fcf519 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -574,7 +574,7 @@ class LinearMeasure(object): for p in self.points: coord.SetValue(p) cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) - canvas.draw_circle((cx, cy), 2.5) + # canvas.draw_circle((cx, cy), 2.5) points.append((cx, cy)) if len(points) > 1: @@ -588,8 +588,11 @@ class LinearMeasure(object): return len(self.points) def GetValue(self): - p1, p2 = self.points - return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2)) + if self.IsComplete(): + p1, p2 = self.points + return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2)) + else: + return 0.0 def SetRenderer(self, renderer): if self.point_actor1: @@ -833,7 +836,7 @@ class AngularMeasure(object): for p in self.points: coord.SetValue(p) cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) - canvas.draw_circle((cx, cy), 2.5) + # canvas.draw_circle((cx, cy), 2.5) points.append((cx, cy)) if len(points) > 1: @@ -850,7 +853,10 @@ class AngularMeasure(object): return self.number_of_points def GetValue(self): - return self.CalculateAngle() + if self.IsComplete(): + return self.CalculateAngle() + else: + return 0.0 def SetVisibility(self, v): self.point_actor1.SetVisibility(v) @@ -888,7 +894,11 @@ class AngularMeasure(object): v2 = [j-i for i,j in zip(self.points[2], self.points[1])] #print vtk.vtkMath.Normalize(v1) #print vtk.vtkMath.Normalize(v2) - cos = vtk.vtkMath.Dot(v1, v2)/(vtk.vtkMath.Norm(v1)*vtk.vtkMath.Norm(v2)) + try: + cos = vtk.vtkMath.Dot(v1, v2)/(vtk.vtkMath.Norm(v1)*vtk.vtkMath.Norm(v2)) + except ZeroDivisionError: + return 0.0 + angle = math.degrees(math.acos(cos)) return angle diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 78fe880..3d1976b 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -354,6 +354,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): self.measures = MeasureData() self.selected = None + self.creating = None self._type = const.LINEAR @@ -386,6 +387,25 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): x, y, z = self._get_pos_clicked() mx, my = self.viewer.interactor.GetEventPosition() + if self.selected: + self.selected = None + return + + if self.creating: + n, m, mr = self.creating + if mr.IsComplete(): + print "COMPLETED" + self.creating = None + else: + Publisher.sendMessage("Add measurement point", + ((x, y, z), self._type, + ORIENTATIONS[self.orientation], + slice_number, self.radius)) + n = len(m.points)-1 + self.creating = n, m, mr + Publisher.sendMessage('Reload actual slice %s' % self.orientation) + return + selected = self._verify_clicked_display(mx, my) if selected: self.selected = selected @@ -393,9 +413,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): if self.picker.GetViewProp(): renderer = self.viewer.slice_data.renderer Publisher.sendMessage("Add measurement point", - ((x, y,z), self._type, + ((x, y, z), self._type, ORIENTATIONS[self.orientation], slice_number, self.radius)) + Publisher.sendMessage("Add measurement point", + ((x, y, z), self._type, + ORIENTATIONS[self.orientation], + slice_number, self.radius)) + + n, (m, mr) = 1, self.measures.measures[self._ori][slice_number][-1] + self.creating = n, m, mr Publisher.sendMessage('Reload actual slice %s' % self.orientation) def OnReleaseMeasurePoint(self, obj, evt): @@ -416,6 +443,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): Publisher.sendMessage('Reload actual slice %s' % self.orientation) + elif self.creating: + n, m, mr = self.creating + idx = self.measures._list_measures.index((m, mr)) + Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z))) + + Publisher.sendMessage('Reload actual slice %s' % self.orientation) + else: mx, my = self.viewer.interactor.GetEventPosition() if self._verify_clicked_display(mx, my): -- libgit2 0.21.2