Commit 2b56e41f884607f13e272b6dfc48a72428973b34
1 parent
8e334485
Exists in
master
and in
26 other branches
Better way of creating measurements
Showing
2 changed files
with
51 additions
and
7 deletions
Show diff stats
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): |