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