Commit 201ada86ca19e429aede3240257baa211ad111c7
1 parent
4a13efb8
Exists in
master
and in
68 other branches
ADD: Orientation text actors in volume viewer
Showing
4 changed files
with
83 additions
and
31 deletions
Show diff stats
invesalius/constants.py
| @@ -27,7 +27,7 @@ from project import Project | @@ -27,7 +27,7 @@ from project import Project | ||
| 27 | 27 | ||
| 28 | # VTK text | 28 | # VTK text |
| 29 | TEXT_SIZE = 14 | 29 | TEXT_SIZE = 14 |
| 30 | -TEXT_SIZE_LARGE = 18 | 30 | +TEXT_SIZE_LARGE = 16 |
| 31 | TEXT_COLOUR = (1,1,1) | 31 | TEXT_COLOUR = (1,1,1) |
| 32 | (X,Y) = (0.03, 0.97) | 32 | (X,Y) = (0.03, 0.97) |
| 33 | TEXT_POS_LEFT_UP = (X, Y) | 33 | TEXT_POS_LEFT_UP = (X, Y) |
| @@ -36,6 +36,10 @@ TEXT_POS_LEFT_DOWN_SLC = (X, 1-0.93) | @@ -36,6 +36,10 @@ TEXT_POS_LEFT_DOWN_SLC = (X, 1-0.93) | ||
| 36 | TEXT_POS_RIGHT_UP = (1-X, Y) | 36 | TEXT_POS_RIGHT_UP = (1-X, Y) |
| 37 | TEXT_POS_RIGHT_DOWN = (1-X, 1-Y) | 37 | TEXT_POS_RIGHT_DOWN = (1-X, 1-Y) |
| 38 | TEXT_POSITION = TEXT_POS_LEFT_UP | 38 | TEXT_POSITION = TEXT_POS_LEFT_UP |
| 39 | +TEXT_POS_HCENTRE_UP = (0.5, 0.97) | ||
| 40 | +TEXT_POS_HCENTRE_DOWN = (0.5, 0.07) | ||
| 41 | +TEXT_POS_VCENTRE_RIGHT = (0.95, 0.5) | ||
| 42 | +TEXT_POS_VCENPRE_LEFT = (0.03, 0.5) | ||
| 39 | 43 | ||
| 40 | # Slice orientation | 44 | # Slice orientation |
| 41 | AXIAL = 0 | 45 | AXIAL = 0 |
invesalius/data/slice_data.py
| @@ -34,11 +34,11 @@ class SliceData(object): | @@ -34,11 +34,11 @@ class SliceData(object): | ||
| 34 | colour = const.ORIENTATION_COLOUR[self.orientation] | 34 | colour = const.ORIENTATION_COLOUR[self.orientation] |
| 35 | 35 | ||
| 36 | text = vu.Text() | 36 | text = vu.Text() |
| 37 | - text.BoldOn() | 37 | + #text.BoldOn() |
| 38 | text.SetColour(colour) | 38 | text.SetColour(colour) |
| 39 | text.SetPosition(const.TEXT_POS_LEFT_DOWN_SLC) | 39 | text.SetPosition(const.TEXT_POS_LEFT_DOWN_SLC) |
| 40 | text.SetSize(const.TEXT_SIZE_LARGE) | 40 | text.SetSize(const.TEXT_SIZE_LARGE) |
| 41 | - text.SetValue("%d" % self.number) | 41 | + text.SetValue(self.number) |
| 42 | self.text = text | 42 | self.text = text |
| 43 | 43 | ||
| 44 | def SetCursor(self, cursor): | 44 | def SetCursor(self, cursor): |
invesalius/data/viewer_slice.py
| @@ -56,7 +56,7 @@ class Viewer(wx.Panel): | @@ -56,7 +56,7 @@ class Viewer(wx.Panel): | ||
| 56 | # The layout from slice_data, the first is number of cols, the second | 56 | # The layout from slice_data, the first is number of cols, the second |
| 57 | # is the number of rows | 57 | # is the number of rows |
| 58 | self.layout = (1, 1) | 58 | self.layout = (1, 1) |
| 59 | - | 59 | + self.orientation_texts = [] |
| 60 | self.__init_gui() | 60 | self.__init_gui() |
| 61 | 61 | ||
| 62 | self.orientation = orientation | 62 | self.orientation = orientation |
| @@ -109,15 +109,25 @@ class Viewer(wx.Panel): | @@ -109,15 +109,25 @@ class Viewer(wx.Panel): | ||
| 109 | def SetLayout(self, layout): | 109 | def SetLayout(self, layout): |
| 110 | self.layout = layout | 110 | self.layout = layout |
| 111 | if layout == (1,1): | 111 | if layout == (1,1): |
| 112 | - self.wl_text.Show() | 112 | + self.ShowTextActors() |
| 113 | else: | 113 | else: |
| 114 | - self.wl_text.Hide() | ||
| 115 | - | 114 | + self.HideTextActors() |
| 115 | + | ||
| 116 | slice_ = sl.Slice() | 116 | slice_ = sl.Slice() |
| 117 | self.LoadRenderers(slice_.GetOutput()) | 117 | self.LoadRenderers(slice_.GetOutput()) |
| 118 | self.__configure_renderers() | 118 | self.__configure_renderers() |
| 119 | self.__configure_scroll() | 119 | self.__configure_scroll() |
| 120 | 120 | ||
| 121 | + def HideTextActors(self): | ||
| 122 | + self.wl_text.Hide() | ||
| 123 | + [t.Hide() for t in self.orientation_texts] | ||
| 124 | + | ||
| 125 | + def ShowTextActors(self): | ||
| 126 | + self.wl_text.Show() | ||
| 127 | + [t.Show() for t in self.orientation_texts] | ||
| 128 | + | ||
| 129 | + | ||
| 130 | + | ||
| 121 | def __set_layout(self, pubsub_evt): | 131 | def __set_layout(self, pubsub_evt): |
| 122 | layout = pubsub_evt.data | 132 | layout = pubsub_evt.data |
| 123 | self.SetLayout(layout) | 133 | self.SetLayout(layout) |
| @@ -132,6 +142,7 @@ class Viewer(wx.Panel): | @@ -132,6 +142,7 @@ class Viewer(wx.Panel): | ||
| 132 | self.cam = ren.GetActiveCamera() | 142 | self.cam = ren.GetActiveCamera() |
| 133 | self.ren = ren | 143 | self.ren = ren |
| 134 | 144 | ||
| 145 | + | ||
| 135 | def append_mode(self, mode): | 146 | def append_mode(self, mode): |
| 136 | if "ZOOM" in self.modes or "ZOOMSELECT" in self.modes: | 147 | if "ZOOM" in self.modes or "ZOOMSELECT" in self.modes: |
| 137 | self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) | 148 | self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) |
| @@ -381,6 +392,47 @@ class Viewer(wx.Panel): | @@ -381,6 +392,47 @@ class Viewer(wx.Panel): | ||
| 381 | proj = project.Project() | 392 | proj = project.Project() |
| 382 | self.SetWLText(proj.level, proj.window) | 393 | self.SetWLText(proj.level, proj.window) |
| 383 | 394 | ||
| 395 | + colour = const.ORIENTATION_COLOUR[self.orientation] | ||
| 396 | + | ||
| 397 | + #### Orientation text | ||
| 398 | + if self.orientation == 'AXIAL': | ||
| 399 | + values = ['R', 'L', 'A', 'P'] | ||
| 400 | + elif self.orientation == 'SAGITAL': | ||
| 401 | + values = ['R', 'L', 'T', 'B'] | ||
| 402 | + else: | ||
| 403 | + values = ['P', 'A', 'T', 'B'] | ||
| 404 | + | ||
| 405 | + left_text = vtku.Text() | ||
| 406 | + left_text.SetColour(colour) | ||
| 407 | + left_text.ShadowOff() | ||
| 408 | + left_text.SetPosition(const.TEXT_POS_VCENPRE_LEFT) | ||
| 409 | + left_text.SetValue(values[0]) | ||
| 410 | + | ||
| 411 | + right_text = vtku.Text() | ||
| 412 | + right_text.SetColour(colour) | ||
| 413 | + right_text.ShadowOff() | ||
| 414 | + right_text.SetPosition(const.TEXT_POS_VCENTRE_RIGHT) | ||
| 415 | + right_text.SetValue(values[1]) | ||
| 416 | + | ||
| 417 | + up_text = vtku.Text() | ||
| 418 | + up_text.SetColour(colour) | ||
| 419 | + up_text.ShadowOff() | ||
| 420 | + up_text.SetPosition(const.TEXT_POS_HCENTRE_UP) | ||
| 421 | + up_text.SetValue(values[2]) | ||
| 422 | + | ||
| 423 | + down_text = vtku.Text() | ||
| 424 | + down_text.SetColour(colour) | ||
| 425 | + down_text.ShadowOff() | ||
| 426 | + down_text.SetPosition(const.TEXT_POS_HCENTRE_DOWN) | ||
| 427 | + down_text.SetValue(values[3]) | ||
| 428 | + | ||
| 429 | + self.orientation_texts = [left_text, right_text, up_text, | ||
| 430 | + down_text] | ||
| 431 | + | ||
| 432 | + self.ren.AddActor(left_text.actor) | ||
| 433 | + self.ren.AddActor(right_text.actor) | ||
| 434 | + self.ren.AddActor(up_text.actor) | ||
| 435 | + self.ren.AddActor(down_text.actor) | ||
| 384 | 436 | ||
| 385 | def Reposition(self, slice_data): | 437 | def Reposition(self, slice_data): |
| 386 | """ | 438 | """ |
invesalius/data/vtk_utils.py
| @@ -16,9 +16,10 @@ | @@ -16,9 +16,10 @@ | ||
| 16 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | 16 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
| 17 | # detalhes. | 17 | # detalhes. |
| 18 | #-------------------------------------------------------------------------- | 18 | #-------------------------------------------------------------------------- |
| 19 | -import wx.lib.pubsub as ps | ||
| 20 | -import vtk | 19 | +import sys |
| 21 | 20 | ||
| 21 | +import vtk | ||
| 22 | +import wx.lib.pubsub as ps | ||
| 22 | 23 | ||
| 23 | import constants as const | 24 | import constants as const |
| 24 | from gui.dialogs import ProgressDialog | 25 | from gui.dialogs import ProgressDialog |
| @@ -92,43 +93,39 @@ class Text(object): | @@ -92,43 +93,39 @@ class Text(object): | ||
| 92 | property.SetFontFamilyToArial() | 93 | property.SetFontFamilyToArial() |
| 93 | property.BoldOff() | 94 | property.BoldOff() |
| 94 | property.ItalicOff() | 95 | property.ItalicOff() |
| 95 | - property.ShadowOff() | 96 | + property.ShadowOn() |
| 96 | property.SetJustificationToLeft() | 97 | property.SetJustificationToLeft() |
| 97 | property.SetVerticalJustificationToTop() | 98 | property.SetVerticalJustificationToTop() |
| 98 | property.SetColor(const.TEXT_COLOUR) | 99 | property.SetColor(const.TEXT_COLOUR) |
| 99 | self.property = property | 100 | self.property = property |
| 100 | 101 | ||
| 101 | - #mapper = vtk.vtkTextMapper() | ||
| 102 | - #mapper.SetTextProperty(property) | ||
| 103 | - #self.mapper = mapper | 102 | + mapper = vtk.vtkTextMapper() |
| 103 | + mapper.SetTextProperty(property) | ||
| 104 | + self.mapper = mapper | ||
| 104 | 105 | ||
| 105 | x, y = const.TEXT_POSITION | 106 | x, y = const.TEXT_POSITION |
| 106 | - #actor = vtk.vtkActor2D() | ||
| 107 | - #actor.SetMapper(mapper) | ||
| 108 | - #actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() | ||
| 109 | - #actor.GetPositionCoordinate().SetValue(x,y) | ||
| 110 | - #self.actor = actor | ||
| 111 | - | ||
| 112 | - actor = vtk.vtkTextActor() | 107 | + actor = vtk.vtkActor2D() |
| 108 | + actor.SetMapper(mapper) | ||
| 113 | actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() | 109 | actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() |
| 114 | - actor.GetPositionCoordinate().SetValue(x,y) | ||
| 115 | - actor.GetTextProperty().ShallowCopy(property) | 110 | + actor.GetPositionCoordinate().SetValue(x,y) |
| 116 | self.actor = actor | 111 | self.actor = actor |
| 117 | 112 | ||
| 118 | - def BoldOn(self): | ||
| 119 | - self.property.BoldOn() | ||
| 120 | - self.actor.GetTextProperty().ShallowCopy(self.property) | ||
| 121 | - | ||
| 122 | def SetColour(self, colour): | 113 | def SetColour(self, colour): |
| 123 | self.property.SetColor(colour) | 114 | self.property.SetColor(colour) |
| 124 | - self.actor.GetTextProperty().ShallowCopy(self.property) | 115 | + |
| 116 | + def ShadowOff(self): | ||
| 117 | + self.property.ShadowOff() | ||
| 125 | 118 | ||
| 126 | def SetSize(self, size): | 119 | def SetSize(self, size): |
| 127 | self.property.SetFontSize(size) | 120 | self.property.SetFontSize(size) |
| 128 | - self.actor.GetTextProperty().ShallowCopy(self.property) | ||
| 129 | 121 | ||
| 130 | def SetValue(self, value): | 122 | def SetValue(self, value): |
| 131 | - self.actor.SetInput(str(value)) | 123 | + if isinstance(value, int) or isinstance(value, float): |
| 124 | + value = str(value) | ||
| 125 | + if sys.platform == 'win32': | ||
| 126 | + value += "" # Otherwise 0 is not shown under win32 | ||
| 127 | + | ||
| 128 | + self.mapper.SetInput(str(value)) | ||
| 132 | 129 | ||
| 133 | def SetPosition(self, position): | 130 | def SetPosition(self, position): |
| 134 | self.actor.GetPositionCoordinate().SetValue(position[0], | 131 | self.actor.GetPositionCoordinate().SetValue(position[0], |
| @@ -139,11 +136,10 @@ class Text(object): | @@ -139,11 +136,10 @@ class Text(object): | ||
| 139 | 136 | ||
| 140 | def SetJustificationToRight(self): | 137 | def SetJustificationToRight(self): |
| 141 | self.property.SetJustificationToRight() | 138 | self.property.SetJustificationToRight() |
| 142 | - self.actor.GetTextProperty().ShallowCopy(self.property) | ||
| 143 | 139 | ||
| 144 | def SetVerticalJustificationToBottom(self): | 140 | def SetVerticalJustificationToBottom(self): |
| 145 | self.property.SetVerticalJustificationToBottom() | 141 | self.property.SetVerticalJustificationToBottom() |
| 146 | - self.actor.GetTextProperty().ShallowCopy(self.property) | 142 | + |
| 147 | 143 | ||
| 148 | def Show(self, value=1): | 144 | def Show(self, value=1): |
| 149 | if value: | 145 | if value: |