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