Commit 2b068431df83e6ff48fe062236a6338bd3f44c6a

Authored by Thiago Franco de Moraes
1 parent e5349ae2

Moving measure points

invesalius/data/measures.py
... ... @@ -22,6 +22,12 @@ LOCATION = {const.SURFACE: _(u"3D"),
22 22 const.SAGITAL: _(u"Sagittal")
23 23 }
24 24  
  25 +map_locations = {
  26 + "3D": const.SURFACE,
  27 + "AXIAL": const.AXIAL,
  28 + "CORONAL": const.CORONAL,
  29 + "SAGITAL": const.SAGITAL,
  30 +}
25 31  
26 32 class MeasureData:
27 33 """
... ... @@ -51,6 +57,9 @@ class MeasureData:
51 57 def __len__(self):
52 58 return len(self._list_measures)
53 59  
  60 + def __getitem__(self, key):
  61 + return self.measures[map_locations[key]]
  62 +
54 63  
55 64 class MeasurementManager(object):
56 65 """
... ... @@ -102,8 +111,8 @@ class MeasurementManager(object):
102 111 for point in m.points:
103 112 x, y, z = point
104 113 actors = mr.AddPoint(x, y, z)
105   - Publisher.sendMessage(("Add actors " + str(m.location)),
106   - (actors, m.slice_number))
  114 + # Publisher.sendMessage(("Add actors " + str(m.location)),
  115 + # (actors, m.slice_number))
107 116 self.current = None
108 117  
109 118 if not m.is_shown:
... ... @@ -186,8 +195,8 @@ class MeasurementManager(object):
186 195 x, y, z = position
187 196 actors = mr.AddPoint(x, y, z)
188 197 m.points.append(position)
189   - Publisher.sendMessage("Add actors " + str(location),
190   - (actors, m.slice_number))
  198 + # Publisher.sendMessage("Add actors " + str(location),
  199 + # (actors, m.slice_number))
191 200  
192 201 if mr.IsComplete():
193 202 index = prj.Project().AddMeasurement(m)
... ... @@ -394,6 +403,7 @@ class LinearMeasure(object):
394 403 self.point_actor2 = None
395 404 self.line_actor = None
396 405 self.text_actor = None
  406 + self.renderer = None
397 407 if not representation:
398 408 representation = CirclePointRepresentation(colour)
399 409 self.representation = representation
... ... @@ -414,13 +424,31 @@ class LinearMeasure(object):
414 424 return (self.point_actor2, self.line_actor, self.text_actor)
415 425  
416 426 def SetPoint1(self, x, y, z):
417   - self.points.append((x, y, z))
418   - self.point_actor1 = self.representation.GetRepresentation(x, y, z)
  427 + if len(self.points) == 0:
  428 + self.points.append((x, y, z))
  429 + self.point_actor1 = self.representation.GetRepresentation(x, y, z)
  430 + else:
  431 + self.points[0] = (x, y, z)
  432 + if len(self.points) == 2:
  433 + self.Remove()
  434 + self.point_actor1 = self.representation.GetRepresentation(*self.points[0])
  435 + self.point_actor2 = self.representation.GetRepresentation(*self.points[1])
  436 + self.CreateMeasure()
  437 + else:
  438 + self.Remove()
  439 + self.point_actor1 = self.representation.GetRepresentation(*self.points[0])
419 440  
420 441 def SetPoint2(self, x, y, z):
421   - self.points.append((x, y, z))
422   - self.point_actor2 = self.representation.GetRepresentation(x, y, z)
423   - self.CreateMeasure()
  442 + if len(self.points) == 1:
  443 + self.points.append((x, y, z))
  444 + self.point_actor2 = self.representation.GetRepresentation(*self.points[1])
  445 + self.CreateMeasure()
  446 + else:
  447 + self.points[1] = (x, y, z)
  448 + self.Remove()
  449 + self.point_actor1 = self.representation.GetRepresentation(*self.points[0])
  450 + self.point_actor2 = self.representation.GetRepresentation(*self.points[1])
  451 + self.CreateMeasure()
424 452  
425 453 def CreateMeasure(self):
426 454 self._draw_line()
... ... @@ -473,22 +501,22 @@ class LinearMeasure(object):
473 501  
474 502 def SetRenderer(self, renderer):
475 503 if self.point_actor1:
476   - self.render.RemoveActor(self.point_actor1)
  504 + self.renderer.RemoveActor(self.point_actor1)
477 505 renderer.AddActor(self.point_actor1)
478 506  
479 507 if self.point_actor2:
480   - self.render.RemoveActor(self.point_actor2)
  508 + self.renderer.RemoveActor(self.point_actor2)
481 509 renderer.AddActor(self.point_actor2)
482 510  
483 511 if self.line_actor:
484   - self.render.RemoveActor(self.line_actor)
  512 + self.renderer.RemoveActor(self.line_actor)
485 513 renderer.AddActor(self.line_actor)
486 514  
487 515 if self.text_actor:
488   - self.render.RemoveActor(self.text_actor)
  516 + self.renderer.RemoveActor(self.text_actor)
489 517 renderer.AddActor(self.text_actor)
490 518  
491   - self.render = renderer
  519 + self.renderer = renderer
492 520  
493 521 def SetVisibility(self, v):
494 522 self.point_actor1.SetVisibility(v)
... ... @@ -513,19 +541,19 @@ class LinearMeasure(object):
513 541  
514 542 def Remove(self):
515 543 if self.point_actor1:
516   - self.render.RemoveActor(self.point_actor1)
  544 + self.renderer.RemoveActor(self.point_actor1)
517 545 del self.point_actor1
518 546  
519 547 if self.point_actor2:
520   - self.render.RemoveActor(self.point_actor2)
  548 + self.renderer.RemoveActor(self.point_actor2)
521 549 del self.point_actor2
522 550  
523 551 if self.line_actor:
524   - self.render.RemoveActor(self.line_actor)
  552 + self.renderer.RemoveActor(self.line_actor)
525 553 del self.line_actor
526 554  
527 555 if self.text_actor:
528   - self.render.RemoveActor(self.text_actor)
  556 + self.renderer.RemoveActor(self.text_actor)
529 557 del self.text_actor
530 558  
531 559 # def __del__(self):
... ... @@ -707,47 +735,47 @@ class AngularMeasure(object):
707 735  
708 736 def Remove(self):
709 737 if self.point_actor1:
710   - self.render.RemoveActor(self.point_actor1)
  738 + self.renderer.RemoveActor(self.point_actor1)
711 739 del self.point_actor1
712 740  
713 741 if self.point_actor2:
714   - self.render.RemoveActor(self.point_actor2)
  742 + self.renderer.RemoveActor(self.point_actor2)
715 743 del self.point_actor2
716 744  
717 745 if self.point_actor3:
718   - self.render.RemoveActor(self.point_actor3)
  746 + self.renderer.RemoveActor(self.point_actor3)
719 747 del self.point_actor3
720 748  
721 749 if self.line_actor:
722   - self.render.RemoveActor(self.line_actor)
  750 + self.renderer.RemoveActor(self.line_actor)
723 751 del self.line_actor
724 752  
725 753 if self.text_actor:
726   - self.render.RemoveActor(self.text_actor)
  754 + self.renderer.RemoveActor(self.text_actor)
727 755 del self.text_actor
728 756  
729 757 def SetRenderer(self, renderer):
730 758 if self.point_actor1:
731   - self.render.RemoveActor(self.point_actor1)
  759 + self.renderer.RemoveActor(self.point_actor1)
732 760 renderer.AddActor(self.point_actor1)
733 761  
734 762 if self.point_actor2:
735   - self.render.RemoveActor(self.point_actor2)
  763 + self.renderer.RemoveActor(self.point_actor2)
736 764 renderer.AddActor(self.point_actor2)
737 765  
738 766 if self.point_actor3:
739   - self.render.RemoveActor(self.point_actor3)
  767 + self.renderer.RemoveActor(self.point_actor3)
740 768 renderer.AddActor(self.point_actor3)
741 769  
742 770 if self.line_actor:
743   - self.render.RemoveActor(self.line_actor)
  771 + self.renderer.RemoveActor(self.line_actor)
744 772 renderer.AddActor(self.line_actor)
745 773  
746 774 if self.text_actor:
747   - self.render.RemoveActor(self.text_actor)
  775 + self.renderer.RemoveActor(self.text_actor)
748 776 renderer.AddActor(self.text_actor)
749 777  
750   - self.render = renderer
  778 + self.renderer = renderer
751 779  
752 780 # def __del__(self):
753 781 # self.Remove()
... ...
invesalius/data/styles.py
... ... @@ -353,6 +353,7 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
353 353 self.slice_data = viewer.slice_data
354 354  
355 355 self.measures = MeasureData()
  356 + self.selected = None
356 357  
357 358 spacing = self.slice_data.actor.GetInput().GetSpacing()
358 359  
... ... @@ -372,28 +373,82 @@ class LinearMeasureInteractorStyle(DefaultInteractorStyle):
372 373 self.picker.PickFromListOn()
373 374  
374 375 self.AddObserver("LeftButtonPressEvent", self.OnInsertLinearMeasurePoint)
  376 + self.AddObserver("LeftButtonReleaseEvent", self.OnReleaseMeasurePoint)
  377 + self.AddObserver("MouseMoveEvent", self.OnMoveMeasurePoint)
375 378  
376 379 def OnInsertLinearMeasurePoint(self, obj, evt):
377   - iren = obj.GetInteractor()
378   - mx,my = iren.GetEventPosition()
379   - render = iren.FindPokedRenderer(mx, my)
380 380 slice_number = self.slice_data.number
381   - self.picker.AddPickList(self.slice_data.actor)
382   - self.picker.Pick(mx, my, 0, render)
383   - x, y, z = self.picker.GetPickPosition()
384   - self.picker.DeletePickList(self.slice_data.actor)
  381 + x, y, z = self._get_pos_clicked()
  382 +
  383 + selected = self._verify_clicked(x, y, z)
  384 + if selected:
  385 + self.selected = selected
  386 + else:
  387 + if self.picker.GetViewProp():
  388 + Publisher.sendMessage("Add measurement point",
  389 + ((x, y,z), const.LINEAR,
  390 + ORIENTATIONS[self.orientation],
  391 + slice_number, self.radius))
  392 + self.viewer.interactor.Render()
  393 +
  394 + def OnReleaseMeasurePoint(self, obj, evt):
  395 + if self.selected:
  396 + print "Changing Position"
  397 + n, m, mr = self.selected
  398 + x, y, z = self._get_pos_clicked()
  399 + ren = self.slice_data.renderer
  400 + mr.renderer = ren
  401 + if n == 0:
  402 + mr.SetPoint1(x, y, z)
  403 + m.points[0] = x, y, z
  404 + elif n == 1:
  405 + mr.SetPoint2(x, y, z)
  406 + m.points[1] = x, y, z
385 407  
386   - if self.picker.GetViewProp():
387   - Publisher.sendMessage("Add measurement point",
388   - ((x, y,z), const.LINEAR,
389   - ORIENTATIONS[self.orientation],
390   - slice_number, self.radius))
391 408 self.viewer.interactor.Render()
  409 + Publisher.sendMessage('Reload actual slice %s' % self.orientation)
  410 + self.selected = None
  411 +
  412 + def OnMoveMeasurePoint(self, obj, evt):
  413 + if self.selected:
  414 + print "Changing Position"
  415 + n, m, mr = self.selected
  416 + x, y, z = self._get_pos_clicked()
  417 + ren = self.slice_data.renderer
  418 + mr.renderer = ren
  419 + if n == 0:
  420 + mr.SetPoint1(x, y, z)
  421 + m.points[0] = x, y, z
  422 + elif n == 1:
  423 + mr.SetPoint2(x, y, z)
  424 + m.points[1] = x, y, z
392 425  
  426 + self.viewer.interactor.Render()
  427 + Publisher.sendMessage('Reload actual slice %s' % self.orientation)
393 428  
394 429 def CleanUp(self):
395 430 Publisher.sendMessage("Remove incomplete measurements")
396 431  
  432 + def _get_pos_clicked(self):
  433 + iren = self.viewer.interactor
  434 + mx,my = iren.GetEventPosition()
  435 + render = iren.FindPokedRenderer(mx, my)
  436 + self.picker.AddPickList(self.slice_data.actor)
  437 + self.picker.Pick(mx, my, 0, render)
  438 + x, y, z = self.picker.GetPickPosition()
  439 + self.picker.DeletePickList(self.slice_data.actor)
  440 + return (x, y, z)
  441 +
  442 + def _verify_clicked(self, x, y, z):
  443 + slice_number = self.slice_data.number
  444 + if slice_number in self.measures.measures[self._ori]:
  445 + for m, mr in self.measures.measures[self._ori][slice_number]:
  446 + for n, p in enumerate(m.points):
  447 + px, py, pz = p
  448 + dist = ((px-x)**2 + (py-y)**2 + (pz-z)**2)**0.5
  449 + if dist < 2:
  450 + return (n, m, mr)
  451 + return None
397 452  
398 453 class AngularMeasureInteractorStyle(DefaultInteractorStyle):
399 454 """
... ...
invesalius/data/viewer_slice.py
... ... @@ -171,7 +171,7 @@ class Viewer(wx.Panel):
171 171 self.layout = (1, 1)
172 172 self.orientation_texts = []
173 173  
174   - self.measures = []
  174 + self.measures = measures.MeasureData()
175 175 self.actors_by_slice_number = {}
176 176 self.renderers_by_slice_number = {}
177 177  
... ... @@ -1183,6 +1183,14 @@ class Viewer(wx.Panel):
1183 1183 for actor in self.actors_by_slice_number.get(index, []):
1184 1184 self.slice_data.renderer.AddActor(actor)
1185 1185  
  1186 + for (m, mr) in self.measures[self.orientation].get(self.slice_data.number, []):
  1187 + for actor in mr.GetActors():
  1188 + self.slice_data.renderer.RemoveActor(actor)
  1189 +
  1190 + for (m, mr) in self.measures[self.orientation].get(index, []):
  1191 + for actor in mr.GetActors():
  1192 + self.slice_data.renderer.AddActor(actor)
  1193 +
1186 1194 if self.slice_._type_projection == const.PROJECTION_NORMAL:
1187 1195 self.slice_data.SetNumber(index)
1188 1196 else:
... ...