Commit 472d5065df182b788a9a3ee35f09e23ebe9c485a
1 parent
18e7b520
Exists in
master
and in
68 other branches
ADD: Support to use measures in 2D.
Showing
3 changed files
with
100 additions
and
1 deletions
Show diff stats
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): |