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 | 657 | return (self.point_actor3, self.line_actor, self.text_actor) |
| 658 | 658 | |
| 659 | 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 | 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 | 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 | 714 | def CreateMeasure(self): |
| 676 | 715 | self._draw_line() | ... | ... |
invesalius/data/styles.py
| ... | ... | @@ -355,6 +355,8 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 355 | 355 | self.measures = MeasureData() |
| 356 | 356 | self.selected = None |
| 357 | 357 | |
| 358 | + self._type = const.LINEAR | |
| 359 | + | |
| 358 | 360 | spacing = self.slice_data.actor.GetInput().GetSpacing() |
| 359 | 361 | |
| 360 | 362 | if self.orientation == "AXIAL": |
| ... | ... | @@ -372,6 +374,9 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 372 | 374 | self.picker = vtk.vtkCellPicker() |
| 373 | 375 | self.picker.PickFromListOn() |
| 374 | 376 | |
| 377 | + self._bind_events() | |
| 378 | + | |
| 379 | + def _bind_events(self): | |
| 375 | 380 | self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint) |
| 376 | 381 | self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseMeasurePoint) |
| 377 | 382 | self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint) |
| ... | ... | @@ -387,7 +392,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 387 | 392 | if self.picker.GetViewProp(): |
| 388 | 393 | renderer = self.viewer.slice_data.renderer |
| 389 | 394 | Publisher.sendMessage("Add measurement point", |
| 390 | - ((x, y,z), const.LINEAR, | |
| 395 | + ((x, y,z), self._type, | |
| 391 | 396 | ORIENTATIONS[self.orientation], |
| 392 | 397 | slice_number, self.radius)) |
| 393 | 398 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) |
| ... | ... | @@ -411,6 +416,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 411 | 416 | Publisher.sendMessage('Reload actual slice %s' % self.orientation) |
| 412 | 417 | |
| 413 | 418 | def CleanUp(self): |
| 419 | + self.picker.PickFromListOff() | |
| 414 | 420 | Publisher.sendMessage("Remove incomplete measurements") |
| 415 | 421 | |
| 416 | 422 | def _get_pos_clicked(self): |
| ... | ... | @@ -443,45 +449,10 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle): |
| 443 | 449 | return (n, m, mr) |
| 444 | 450 | return None |
| 445 | 451 | |
| 446 | -class AngularMeasureInteractorStyle(DefaultInteractorStyle): | |
| 447 | - """ | |
| 448 | - Interactor style responsible for insert angular measurements. | |
| 449 | - """ | |
| 452 | +class AngularMeasureInteractorStyle(LinearMeasureInteractorStyle): | |
| 450 | 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 | 458 | class PanMoveInteractorStyle(DefaultInteractorStyle): | ... | ... |