Commit 472d5065df182b788a9a3ee35f09e23ebe9c485a

Authored by tfmoraes
1 parent 18e7b520

ADD: Support to use measures in 2D.

invesalius/data/measures.py
@@ -204,6 +204,25 @@ class LinearMeasure(object): @@ -204,6 +204,25 @@ class LinearMeasure(object):
204 p1, p2 = self.points 204 p1, p2 = self.points
205 return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2)) 205 return math.sqrt(vtk.vtkMath.Distance2BetweenPoints(p1, p2))
206 206
  207 + def SetRenderer(self, renderer):
  208 + if self.point_actor1:
  209 + self.render.RemoveActor(self.point_actor1)
  210 + renderer.AddActor(self.point_actor1)
  211 +
  212 + if self.point_actor2:
  213 + self.render.RemoveActor(self.point_actor2)
  214 + renderer.AddActor(self.point_actor2)
  215 +
  216 + if self.line_actor:
  217 + self.render.RemoveActor(self.line_actor)
  218 + renderer.AddActor(self.line_actor)
  219 +
  220 + if self.text_actor:
  221 + self.render.RemoveActor(self.text_actor)
  222 + renderer.AddActor(self.text_actor)
  223 +
  224 + self.render = renderer
  225 +
207 def SetVisibility(self, v): 226 def SetVisibility(self, v):
208 self.point_actor1.SetVisibility(v) 227 self.point_actor1.SetVisibility(v)
209 self.point_actor2.SetVisibility(v) 228 self.point_actor2.SetVisibility(v)
@@ -409,5 +428,28 @@ class AngularMeasure(object): @@ -409,5 +428,28 @@ class AngularMeasure(object):
409 self.render.RemoveActor(self.text_actor) 428 self.render.RemoveActor(self.text_actor)
410 del self.text_actor 429 del self.text_actor
411 430
  431 + def SetRenderer(self, renderer):
  432 + if self.point_actor1:
  433 + self.render.RemoveActor(self.point_actor1)
  434 + renderer.AddActor(self.point_actor1)
  435 +
  436 + if self.point_actor2:
  437 + self.render.RemoveActor(self.point_actor2)
  438 + renderer.AddActor(self.point_actor2)
  439 +
  440 + if self.point_actor3:
  441 + self.render.RemoveActor(self.point_actor3)
  442 + renderer.AddActor(self.point_actor3)
  443 +
  444 + if self.line_actor:
  445 + self.render.RemoveActor(self.line_actor)
  446 + renderer.AddActor(self.line_actor)
  447 +
  448 + if self.text_actor:
  449 + self.render.RemoveActor(self.text_actor)
  450 + renderer.AddActor(self.text_actor)
  451 +
  452 + self.render = renderer
  453 +
412 def __del__(self): 454 def __del__(self):
413 self.Remove() 455 self.Remove()
invesalius/data/viewer_slice.py
@@ -36,6 +36,8 @@ import project @@ -36,6 +36,8 @@ import project
36 import slice_data as sd 36 import slice_data as sd
37 import utils 37 import utils
38 38
  39 +from data import measures
  40 +
39 ID_TO_TOOL_ITEM = {} 41 ID_TO_TOOL_ITEM = {}
40 STR_WL = "WL: %d WW: %d" 42 STR_WL = "WL: %d WW: %d"
41 43
@@ -78,6 +80,8 @@ class Viewer(wx.Panel): @@ -78,6 +80,8 @@ class Viewer(wx.Panel):
78 self.pick = vtk.vtkPropPicker() 80 self.pick = vtk.vtkPropPicker()
79 self.cross_actor = vtk.vtkActor() 81 self.cross_actor = vtk.vtkActor()
80 82
  83 + self.measures = []
  84 +
81 self.__bind_events() 85 self.__bind_events()
82 self.__bind_events_wx() 86 self.__bind_events_wx()
83 87
@@ -206,7 +210,12 @@ class Viewer(wx.Panel): @@ -206,7 +210,12 @@ class Viewer(wx.Panel):
206 }, 210 },
207 const.STATE_MEASURE_DISTANCE: 211 const.STATE_MEASURE_DISTANCE:
208 { 212 {
209 - } 213 + "LeftButtonPressEvent": self.OnInsertLinearMeasurePoint
  214 + },
  215 + const.STATE_MEASURE_ANGLE:
  216 + {
  217 + "LeftButtonPressEvent": self.OnInsertAngularMeasurePoint
  218 + },
210 } 219 }
211 if state == const.SLICE_STATE_CROSS: 220 if state == const.SLICE_STATE_CROSS:
212 self.__set_cross_visibility(1) 221 self.__set_cross_visibility(1)
@@ -1360,6 +1369,8 @@ class Viewer(wx.Panel): @@ -1360,6 +1369,8 @@ class Viewer(wx.Panel):
1360 1369
1361 def set_slice_number(self, index): 1370 def set_slice_number(self, index):
1362 self.slice_number = index 1371 self.slice_number = index
  1372 + # Showing off all the measures
  1373 + [m[1].SetVisibility(0) for m in self.measures]
1363 for n, slice_data in enumerate(self.slice_data_list): 1374 for n, slice_data in enumerate(self.slice_data_list):
1364 ren = slice_data.renderer 1375 ren = slice_data.renderer
1365 actor = slice_data.actor 1376 actor = slice_data.actor
@@ -1367,6 +1378,8 @@ class Viewer(wx.Panel): @@ -1367,6 +1378,8 @@ class Viewer(wx.Panel):
1367 max = actor.GetSliceNumberMax() + 1 1378 max = actor.GetSliceNumberMax() + 1
1368 if pos < max: 1379 if pos < max:
1369 slice_data.SetNumber(pos) 1380 slice_data.SetNumber(pos)
  1381 + [m[1].SetRenderer(ren) for m in self.measures if m[0] == pos]
  1382 + [m[1].SetVisibility(1) for m in self.measures if m[0] == pos]
1370 self.__update_display_extent(slice_data) 1383 self.__update_display_extent(slice_data)
1371 slice_data.Show() 1384 slice_data.Show()
1372 else: 1385 else:
@@ -1410,3 +1423,45 @@ class Viewer(wx.Panel): @@ -1410,3 +1423,45 @@ class Viewer(wx.Panel):
1410 elif coord[index] < extent_min[index]: 1423 elif coord[index] < extent_min[index]:
1411 coord[index] = extent_min[index] 1424 coord[index] = extent_min[index]
1412 return coord 1425 return coord
  1426 +
  1427 + def OnInsertLinearMeasurePoint(self, obj, evt):
  1428 + x,y = self.interactor.GetEventPosition()
  1429 + render = self.interactor.FindPokedRenderer(x, y)
  1430 + slice_data = self.get_slice_data(render)
  1431 + slice_number = slice_data.number
  1432 + self.pick.Pick(x, y, 0, render)
  1433 + x, y, z = self.pick.GetPickPosition()
  1434 + if self.pick.GetViewProp():
  1435 + print "Hey, you inserted measure point"
  1436 + if not self.measures or self.measures[-1][1].IsComplete():
  1437 + m = measures.LinearMeasure(render)
  1438 + m.AddPoint(x, y, z)
  1439 + self.measures.append((slice_number, m))
  1440 + else:
  1441 + m = self.measures[-1][1]
  1442 + m.AddPoint(x, y, z)
  1443 + if m.IsComplete():
  1444 + ps.Publisher().sendMessage("Add measure to list",
  1445 + ("3D", _("%.3f mm3" % m.GetValue())))
  1446 + self.interactor.Render()
  1447 +
  1448 + def OnInsertAngularMeasurePoint(self, obj, evt):
  1449 + print "Hey, you inserted a angular point"
  1450 + x,y = self.interactor.GetEventPosition()
  1451 + render = self.interactor.FindPokedRenderer(x, y)
  1452 + slice_data = self.get_slice_data(render)
  1453 + slice_number = slice_data.number
  1454 + self.pick.Pick(x, y, 0, render)
  1455 + x, y, z = self.pick.GetPickPosition()
  1456 + if self.pick.GetViewProp():
  1457 + if not self.measures or self.measures[-1][1].IsComplete():
  1458 + m = measures.AngularMeasure(render)
  1459 + m.AddPoint(x, y, z)
  1460 + self.measures.append((slice_number, m))
  1461 + else:
  1462 + m = self.measures[-1][1]
  1463 + m.AddPoint(x, y, z)
  1464 + if m.IsComplete():
  1465 + ps.Publisher().sendMessage("Add measure to list",
  1466 + ("3D", _("%.3f" % m.GetValue())))
  1467 + self.interactor.Render()
invesalius/data/vtk_utils.py
@@ -111,6 +111,7 @@ class Text(object): @@ -111,6 +111,7 @@ class Text(object):
111 actor = vtk.vtkActor2D() 111 actor = vtk.vtkActor2D()
112 actor.SetMapper(mapper) 112 actor.SetMapper(mapper)
113 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 113 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
  114 + actor.PickableOff()
114 self.actor = actor 115 self.actor = actor
115 116
116 self.SetPosition(const.TEXT_POS_LEFT_UP) 117 self.SetPosition(const.TEXT_POS_LEFT_UP)
@@ -180,6 +181,7 @@ class TextZero(object): @@ -180,6 +181,7 @@ class TextZero(object):
180 actor = vtk.vtkTextActor() 181 actor = vtk.vtkTextActor()
181 actor.GetTextProperty().ShallowCopy(property) 182 actor.GetTextProperty().ShallowCopy(property)
182 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 183 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
  184 + actor.PickableOff()
183 self.actor = actor 185 self.actor = actor
184 186
185 def SetColour(self, colour): 187 def SetColour(self, colour):