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 574 for p in self.points:
575 575 coord.SetValue(p)
576 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 578 points.append((cx, cy))
579 579  
580 580 if len(points) > 1:
... ... @@ -588,8 +588,11 @@ class LinearMeasure(object):
588 588 return len(self.points)
589 589  
590 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 597 def SetRenderer(self, renderer):
595 598 if self.point_actor1:
... ... @@ -833,7 +836,7 @@ class AngularMeasure(object):
833 836 for p in self.points:
834 837 coord.SetValue(p)
835 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 840 points.append((cx, cy))
838 841  
839 842 if len(points) > 1:
... ... @@ -850,7 +853,10 @@ class AngularMeasure(object):
850 853 return self.number_of_points
851 854  
852 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 861 def SetVisibility(self, v):
856 862 self.point_actor1.SetVisibility(v)
... ... @@ -888,7 +894,11 @@ class AngularMeasure(object):
888 894 v2 = [j-i for i,j in zip(self.points[2], self.points[1])]
889 895 #print vtk.vtkMath.Normalize(v1)
890 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 902 angle = math.degrees(math.acos(cos))
893 903 return angle
894 904  
... ...
invesalius/data/styles.py
... ... @@ -354,6 +354,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
354 354  
355 355 self.measures = MeasureData()
356 356 self.selected = None
  357 + self.creating = None
357 358  
358 359 self._type = const.LINEAR
359 360  
... ... @@ -386,6 +387,25 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
386 387 x, y, z = self._get_pos_clicked()
387 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 409 selected = self._verify_clicked_display(mx, my)
390 410 if selected:
391 411 self.selected = selected
... ... @@ -393,9 +413,16 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
393 413 if self.picker.GetViewProp():
394 414 renderer = self.viewer.slice_data.renderer
395 415 Publisher.sendMessage("Add measurement point",
396   - ((x, y,z), self._type,
  416 + ((x, y, z), self._type,
397 417 ORIENTATIONS[self.orientation],
398 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 426 Publisher.sendMessage('Reload actual slice %s' % self.orientation)
400 427  
401 428 def OnReleaseMeasurePoint(self, obj, evt):
... ... @@ -416,6 +443,13 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
416 443  
417 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 453 else:
420 454 mx, my = self.viewer.interactor.GetEventPosition()
421 455 if self._verify_clicked_display(mx, my):
... ...