Commit 472d5065df182b788a9a3ee35f09e23ebe9c485a
1 parent
18e7b520
Exists in
master
and in
6 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): |