Commit 2b56e41f884607f13e272b6dfc48a72428973b34

Authored by Thiago Franco de Moraes
1 parent 8e334485

Better way of creating measurements

invesalius/data/measures.py
@@ -574,7 +574,7 @@ class LinearMeasure(object): @@ -574,7 +574,7 @@ class LinearMeasure(object):
574 for p in self.points: 574 for p in self.points:
575 coord.SetValue(p) 575 coord.SetValue(p)
576 cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) 576 cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
577 - canvas.draw_circle((cx, cy), 2.5) 577 + # canvas.draw_circle((cx, cy), 2.5)
578 points.append((cx, cy)) 578 points.append((cx, cy))
579 579
580 if len(points) > 1: 580 if len(points) > 1:
@@ -588,8 +588,11 @@ class LinearMeasure(object): @@ -588,8 +588,11 @@ class LinearMeasure(object):
588 return len(self.points) 588 return len(self.points)
589 589
590 def GetValue(self): 590 def GetValue(self):
591 - p1, p2 = self.points  
592 - return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2)) 591 + if self.IsComplete():
  592 + p1, p2 = self.points
  593 + return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2))
  594 + else:
  595 + return 0.0
593 596
594 def SetRenderer(self, renderer): 597 def SetRenderer(self, renderer):
595 if self.point_actor1: 598 if self.point_actor1:
@@ -833,7 +836,7 @@ class AngularMeasure(object): @@ -833,7 +836,7 @@ class AngularMeasure(object):
833 for p in self.points: 836 for p in self.points:
834 coord.SetValue(p) 837 coord.SetValue(p)
835 cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) 838 cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
836 - canvas.draw_circle((cx, cy), 2.5) 839 + # canvas.draw_circle((cx, cy), 2.5)
837 points.append((cx, cy)) 840 points.append((cx, cy))
838 841
839 if len(points) > 1: 842 if len(points) > 1:
@@ -850,7 +853,10 @@ class AngularMeasure(object): @@ -850,7 +853,10 @@ class AngularMeasure(object):
850 return self.number_of_points 853 return self.number_of_points
851 854
852 def GetValue(self): 855 def GetValue(self):
853 - return self.CalculateAngle() 856 + if self.IsComplete():
  857 + return self.CalculateAngle()
  858 + else:
  859 + return 0.0
854 860
855 def SetVisibility(self, v): 861 def SetVisibility(self, v):
856 self.point_actor1.SetVisibility(v) 862 self.point_actor1.SetVisibility(v)
@@ -888,7 +894,11 @@ class AngularMeasure(object): @@ -888,7 +894,11 @@ class AngularMeasure(object):
888 v2 = [j-i for i,j in zip(self.points[2], self.points[1])] 894 v2 = [j-i for i,j in zip(self.points[2], self.points[1])]
889 #print vtk.vtkMath.Normalize(v1) 895 #print vtk.vtkMath.Normalize(v1)
890 #print vtk.vtkMath.Normalize(v2) 896 #print vtk.vtkMath.Normalize(v2)
891 - cos = vtk.vtkMath.Dot(v1, v2)/(vtk.vtkMath.Norm(v1)*vtk.vtkMath.Norm(v2)) 897 + try:
  898 + cos = vtk.vtkMath.Dot(v1, v2)/(vtk.vtkMath.Norm(v1)*vtk.vtkMath.Norm(v2))
  899 + except ZeroDivisionError:
  900 + return 0.0
  901 +
892 angle = math.degrees(math.acos(cos)) 902 angle = math.degrees(math.acos(cos))
893 return angle 903 return angle
894 904
invesalius/data/styles.py
@@ -354,6 +354,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -354,6 +354,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
354 354
355 self.measures = MeasureData() 355 self.measures = MeasureData()
356 self.selected = None 356 self.selected = None
  357 + self.creating = None
357 358
358 self._type = const.LINEAR 359 self._type = const.LINEAR
359 360
@@ -386,6 +387,25 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -386,6 +387,25 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
386 x, y, z = self._get_pos_clicked() 387 x, y, z = self._get_pos_clicked()
387 mx, my = self.viewer.interactor.GetEventPosition() 388 mx, my = self.viewer.interactor.GetEventPosition()
388 389
  390 + if self.selected:
  391 + self.selected = None
  392 + return
  393 +
  394 + if self.creating:
  395 + n, m, mr = self.creating
  396 + if mr.IsComplete():
  397 + print "COMPLETED"
  398 + self.creating = None
  399 + else:
  400 + Publisher.sendMessage("Add measurement point",
  401 + ((x, y, z), self._type,
  402 + ORIENTATIONS[self.orientation],
  403 + slice_number, self.radius))
  404 + n = len(m.points)-1
  405 + self.creating = n, m, mr
  406 + Publisher.sendMessage('Reload actual slice %s' % self.orientation)
  407 + return
  408 +
389 selected = self._verify_clicked_display(mx, my) 409 selected = self._verify_clicked_display(mx, my)
390 if selected: 410 if selected:
391 self.selected = selected 411 self.selected = selected
@@ -393,9 +413,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -393,9 +413,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
393 if self.picker.GetViewProp(): 413 if self.picker.GetViewProp():
394 renderer = self.viewer.slice_data.renderer 414 renderer = self.viewer.slice_data.renderer
395 Publisher.sendMessage("Add measurement point", 415 Publisher.sendMessage("Add measurement point",
396 - ((x, y,z), self._type, 416 + ((x, y, z), self._type,
397 ORIENTATIONS[self.orientation], 417 ORIENTATIONS[self.orientation],
398 slice_number, self.radius)) 418 slice_number, self.radius))
  419 + Publisher.sendMessage("Add measurement point",
  420 + ((x, y, z), self._type,
  421 + ORIENTATIONS[self.orientation],
  422 + slice_number, self.radius))
  423 +
  424 + n, (m, mr) = 1, self.measures.measures[self._ori][slice_number][-1]
  425 + self.creating = n, m, mr
399 Publisher.sendMessage('Reload actual slice %s' % self.orientation) 426 Publisher.sendMessage('Reload actual slice %s' % self.orientation)
400 427
401 def OnReleaseMeasurePoint(self, obj, evt): 428 def OnReleaseMeasurePoint(self, obj, evt):
@@ -416,6 +443,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): @@ -416,6 +443,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
416 443
417 Publisher.sendMessage('Reload actual slice %s' % self.orientation) 444 Publisher.sendMessage('Reload actual slice %s' % self.orientation)
418 445
  446 + elif self.creating:
  447 + n, m, mr = self.creating
  448 + idx = self.measures._list_measures.index((m, mr))
  449 + Publisher.sendMessage('Change measurement point position', (idx, n, (x, y, z)))
  450 +
  451 + Publisher.sendMessage('Reload actual slice %s' % self.orientation)
  452 +
419 else: 453 else:
420 mx, my = self.viewer.interactor.GetEventPosition() 454 mx, my = self.viewer.interactor.GetEventPosition()
421 if self._verify_clicked_display(mx, my): 455 if self._verify_clicked_display(mx, my):