Commit 651829cef1fd79d2bd7b692b03fb3e2bcdf526bc
1 parent
dc3edb07
Exists in
measure_improvements
Improvements
Showing
2 changed files
with
59 additions
and
49 deletions
Show diff stats
invesalius/data/measures.py
| @@ -657,20 +657,59 @@ class AngularMeasure(object): | @@ -657,20 +657,59 @@ class AngularMeasure(object): | ||
| 657 | return (self.point_actor3, self.line_actor, self.text_actor) | 657 | return (self.point_actor3, self.line_actor, self.text_actor) |
| 658 | 658 | ||
| 659 | def SetPoint1(self, x, y, z): | 659 | def SetPoint1(self, x, y, z): |
| 660 | - self.points[0] = (x, y, z) | ||
| 661 | - self.number_of_points = 1 | ||
| 662 | - self.point_actor1 = self.representation.GetRepresentation(x, y, z) | 660 | + if self.number_of_points == 0: |
| 661 | + self.points[0] = (x, y, z) | ||
| 662 | + self.number_of_points = 1 | ||
| 663 | + self.point_actor1 = self.representation.GetRepresentation(x, y, z) | ||
| 664 | + else: | ||
| 665 | + self.points[0] = (x, y, z) | ||
| 666 | + if len(self.points) == 3: | ||
| 667 | + self.Remove() | ||
| 668 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 669 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 670 | + self.point_actor3 = self.representation.GetRepresentation(*self.points[2]) | ||
| 671 | + self.CreateMeasure() | ||
| 672 | + else: | ||
| 673 | + self.Remove() | ||
| 674 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 675 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 663 | 676 | ||
| 664 | def SetPoint2(self, x, y, z): | 677 | def SetPoint2(self, x, y, z): |
| 665 | - self.number_of_points = 2 | ||
| 666 | - self.points[1] = (x, y, z) | ||
| 667 | - self.point_actor2 = self.representation.GetRepresentation(x, y, z) | 678 | + if self.number_of_points == 1: |
| 679 | + self.number_of_points = 2 | ||
| 680 | + self.points[1] = (x, y, z) | ||
| 681 | + self.point_actor2 = self.representation.GetRepresentation(x, y, z) | ||
| 682 | + else: | ||
| 683 | + self.points[1] = (x, y, z) | ||
| 684 | + if len(self.points) == 3: | ||
| 685 | + self.Remove() | ||
| 686 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 687 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 688 | + self.point_actor3 = self.representation.GetRepresentation(*self.points[2]) | ||
| 689 | + self.CreateMeasure() | ||
| 690 | + else: | ||
| 691 | + self.Remove() | ||
| 692 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 693 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 668 | 694 | ||
| 669 | def SetPoint3(self, x, y, z): | 695 | def SetPoint3(self, x, y, z): |
| 670 | - self.number_of_points = 3 | ||
| 671 | - self.points[2] = (x, y, z) | ||
| 672 | - self.point_actor3 = self.representation.GetRepresentation(x, y, z) | ||
| 673 | - self.CreateMeasure() | 696 | + if self.number_of_points == 2: |
| 697 | + self.number_of_points = 3 | ||
| 698 | + self.points[2] = (x, y, z) | ||
| 699 | + self.point_actor3 = self.representation.GetRepresentation(x, y, z) | ||
| 700 | + self.CreateMeasure() | ||
| 701 | + else: | ||
| 702 | + self.points[2] = (x, y, z) | ||
| 703 | + if len(self.points) == 3: | ||
| 704 | + self.Remove() | ||
| 705 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 706 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 707 | + self.point_actor3 = self.representation.GetRepresentation(*self.points[2]) | ||
| 708 | + self.CreateMeasure() | ||
| 709 | + else: | ||
| 710 | + self.Remove() | ||
| 711 | + self.point_actor1 = self.representation.GetRepresentation(*self.points[0]) | ||
| 712 | + self.point_actor2 = self.representation.GetRepresentation(*self.points[1]) | ||
| 674 | 713 | ||
| 675 | def CreateMeasure(self): | 714 | def CreateMeasure(self): |
| 676 | self._draw_line() | 715 | self._draw_line() |
invesalius/data/styles.py
| @@ -355,6 +355,8 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | @@ -355,6 +355,8 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 355 | self.measures = MeasureData() | 355 | self.measures = MeasureData() |
| 356 | self.selected = None | 356 | self.selected = None |
| 357 | 357 | ||
| 358 | + self._type = const.LINEAR | ||
| 359 | + | ||
| 358 | spacing = self.slice_data.actor.GetInput().GetSpacing() | 360 | spacing = self.slice_data.actor.GetInput().GetSpacing() |
| 359 | 361 | ||
| 360 | if self.orientation == "AXIAL": | 362 | if self.orientation == "AXIAL": |
| @@ -372,6 +374,9 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | @@ -372,6 +374,9 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 372 | self.picker = vtk.vtkCellPicker() | 374 | self.picker = vtk.vtkCellPicker() |
| 373 | self.picker.PickFromListOn() | 375 | self.picker.PickFromListOn() |
| 374 | 376 | ||
| 377 | + self._bind_events() | ||
| 378 | + | ||
| 379 | + def _bind_events(self): | ||
| 375 | self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint) | 380 | self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint) |
| 376 | self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseMeasurePoint) | 381 | self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseMeasurePoint) |
| 377 | self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint) | 382 | self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint) |
| @@ -387,7 +392,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | @@ -387,7 +392,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 387 | if self.picker.GetViewProp(): | 392 | if self.picker.GetViewProp(): |
| 388 | renderer = self.viewer.slice_data.renderer | 393 | renderer = self.viewer.slice_data.renderer |
| 389 | Publisher.sendMessage("Add measurement point", | 394 | Publisher.sendMessage("Add measurement point", |
| 390 | - ((x, y,z), const.LINEAR, | 395 | + ((x, y,z), self._type, |
| 391 | ORIENTATIONS[self.orientation], | 396 | ORIENTATIONS[self.orientation], |
| 392 | slice_number, self.radius)) | 397 | slice_number, self.radius)) |
| 393 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) | 398 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) |
| @@ -411,6 +416,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | @@ -411,6 +416,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 411 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) | 416 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) |
| 412 | 417 | ||
| 413 | def CleanUp(self): | 418 | def CleanUp(self): |
| 419 | + self.picker.PickFromListOff() | ||
| 414 | Publisher.sendMessage("Remove incomplete measurements") | 420 | Publisher.sendMessage("Remove incomplete measurements") |
| 415 | 421 | ||
| 416 | def _get_pos_clicked(self): | 422 | def _get_pos_clicked(self): |
| @@ -443,45 +449,10 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | @@ -443,45 +449,10 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 443 | return (n, m, mr) | 449 | return (n, m, mr) |
| 444 | return None | 450 | return None |
| 445 | 451 | ||
| 446 | -class AngularMeasureInteractorStyle(DefaultInteractorStyle): | ||
| 447 | - """ | ||
| 448 | - Interactor style responsible for insert angular measurements. | ||
| 449 | - """ | 452 | +class AngularMeasureInteractorStyle(LinearMeasureInteractorStyle): |
| 450 | def __init__(self, viewer): | 453 | def __init__(self, viewer): |
| 451 | - DefaultInteractorStyle.__init__(self, viewer) | ||
| 452 | - | ||
| 453 | - self.viewer = viewer | ||
| 454 | - self.orientation = viewer.orientation | ||
| 455 | - self.slice_data = viewer.slice_data | ||
| 456 | - | ||
| 457 | - spacing = self.slice_data.actor.GetInput().GetSpacing() | ||
| 458 | - | ||
| 459 | - if self.orientation == "AXIAL": | ||
| 460 | - self.radius = min(spacing[1], spacing[2]) * 0.8 | ||
| 461 | - | ||
| 462 | - elif self.orientation == 'CORONAL': | ||
| 463 | - self.radius = min(spacing[0], spacing[1]) * 0.8 | ||
| 464 | - | ||
| 465 | - elif self.orientation == 'SAGITAL': | ||
| 466 | - self.radius = min(spacing[1], spacing[2]) * 0.8 | ||
| 467 | - | ||
| 468 | - self.picker = vtk.vtkCellPicker() | ||
| 469 | - | ||
| 470 | - self.AddObserver("LeftButtonPressEvent", self.OnInsertAngularMeasurePoint) | ||
| 471 | - | ||
| 472 | - def OnInsertAngularMeasurePoint(self, obj, evt): | ||
| 473 | - iren = obj.GetInteractor() | ||
| 474 | - x,y = iren.GetEventPosition() | ||
| 475 | - render = iren.FindPokedRenderer(x, y) | ||
| 476 | - slice_number = self.slice_data.number | ||
| 477 | - self.picker.Pick(x, y, 0, render) | ||
| 478 | - x, y, z = self.picker.GetPickPosition() | ||
| 479 | - if self.picker.GetViewProp(): | ||
| 480 | - Publisher.sendMessage("Add measurement point", | ||
| 481 | - ((x, y,z), const.ANGULAR, | ||
| 482 | - ORIENTATIONS[self.orientation], | ||
| 483 | - slice_number, self.radius)) | ||
| 484 | - self.viewer.interactor.Render() | 454 | + LinearMeasureInteractorStyle.__init__(self, viewer) |
| 455 | + self._type = const.ANGULAR | ||
| 485 | 456 | ||
| 486 | 457 | ||
| 487 | class PanMoveInteractorStyle(DefaultInteractorStyle): | 458 | class PanMoveInteractorStyle(DefaultInteractorStyle): |