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): |