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