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