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 204 p1, p2 = self.points
205 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 226 def SetVisibility(self, v):
208 227 self.point_actor1.SetVisibility(v)
209 228 self.point_actor2.SetVisibility(v)
... ... @@ -409,5 +428,28 @@ class AngularMeasure(object):
409 428 self.render.RemoveActor(self.text_actor)
410 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 454 def __del__(self):
413 455 self.Remove()
... ...
invesalius/data/viewer_slice.py
... ... @@ -36,6 +36,8 @@ import project
36 36 import slice_data as sd
37 37 import utils
38 38  
  39 +from data import measures
  40 +
39 41 ID_TO_TOOL_ITEM = {}
40 42 STR_WL = "WL: %d WW: %d"
41 43  
... ... @@ -78,6 +80,8 @@ class Viewer(wx.Panel):
78 80 self.pick = vtk.vtkPropPicker()
79 81 self.cross_actor = vtk.vtkActor()
80 82  
  83 + self.measures = []
  84 +
81 85 self.__bind_events()
82 86 self.__bind_events_wx()
83 87  
... ... @@ -206,7 +210,12 @@ class Viewer(wx.Panel):
206 210 },
207 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 220 if state == const.SLICE_STATE_CROSS:
212 221 self.__set_cross_visibility(1)
... ... @@ -1360,6 +1369,8 @@ class Viewer(wx.Panel):
1360 1369  
1361 1370 def set_slice_number(self, index):
1362 1371 self.slice_number = index
  1372 + # Showing off all the measures
  1373 + [m[1].SetVisibility(0) for m in self.measures]
1363 1374 for n, slice_data in enumerate(self.slice_data_list):
1364 1375 ren = slice_data.renderer
1365 1376 actor = slice_data.actor
... ... @@ -1367,6 +1378,8 @@ class Viewer(wx.Panel):
1367 1378 max = actor.GetSliceNumberMax() + 1
1368 1379 if pos < max:
1369 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 1383 self.__update_display_extent(slice_data)
1371 1384 slice_data.Show()
1372 1385 else:
... ... @@ -1410,3 +1423,45 @@ class Viewer(wx.Panel):
1410 1423 elif coord[index] < extent_min[index]:
1411 1424 coord[index] = extent_min[index]
1412 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 111 actor = vtk.vtkActor2D()
112 112 actor.SetMapper(mapper)
113 113 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
  114 + actor.PickableOff()
114 115 self.actor = actor
115 116  
116 117 self.SetPosition(const.TEXT_POS_LEFT_UP)
... ... @@ -180,6 +181,7 @@ class TextZero(object):
180 181 actor = vtk.vtkTextActor()
181 182 actor.GetTextProperty().ShallowCopy(property)
182 183 actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
  184 + actor.PickableOff()
183 185 self.actor = actor
184 186  
185 187 def SetColour(self, colour):
... ...