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 | 27 | |
| 28 | 28 | # VTK text |
| 29 | 29 | TEXT_SIZE = 14 |
| 30 | -TEXT_SIZE_LARGE = 18 | |
| 30 | +TEXT_SIZE_LARGE = 16 | |
| 31 | 31 | TEXT_COLOUR = (1,1,1) |
| 32 | 32 | (X,Y) = (0.03, 0.97) |
| 33 | 33 | TEXT_POS_LEFT_UP = (X, Y) |
| ... | ... | @@ -36,6 +36,10 @@ TEXT_POS_LEFT_DOWN_SLC = (X, 1-0.93) |
| 36 | 36 | TEXT_POS_RIGHT_UP = (1-X, Y) |
| 37 | 37 | TEXT_POS_RIGHT_DOWN = (1-X, 1-Y) |
| 38 | 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 | 44 | # Slice orientation |
| 41 | 45 | AXIAL = 0 | ... | ... |
invesalius/data/slice_data.py
| ... | ... | @@ -34,11 +34,11 @@ class SliceData(object): |
| 34 | 34 | colour = const.ORIENTATION_COLOUR[self.orientation] |
| 35 | 35 | |
| 36 | 36 | text = vu.Text() |
| 37 | - text.BoldOn() | |
| 37 | + #text.BoldOn() | |
| 38 | 38 | text.SetColour(colour) |
| 39 | 39 | text.SetPosition(const.TEXT_POS_LEFT_DOWN_SLC) |
| 40 | 40 | text.SetSize(const.TEXT_SIZE_LARGE) |
| 41 | - text.SetValue("%d" % self.number) | |
| 41 | + text.SetValue(self.number) | |
| 42 | 42 | self.text = text |
| 43 | 43 | |
| 44 | 44 | def SetCursor(self, cursor): | ... | ... |
invesalius/data/viewer_slice.py
| ... | ... | @@ -56,7 +56,7 @@ class Viewer(wx.Panel): |
| 56 | 56 | # The layout from slice_data, the first is number of cols, the second |
| 57 | 57 | # is the number of rows |
| 58 | 58 | self.layout = (1, 1) |
| 59 | - | |
| 59 | + self.orientation_texts = [] | |
| 60 | 60 | self.__init_gui() |
| 61 | 61 | |
| 62 | 62 | self.orientation = orientation |
| ... | ... | @@ -109,15 +109,25 @@ class Viewer(wx.Panel): |
| 109 | 109 | def SetLayout(self, layout): |
| 110 | 110 | self.layout = layout |
| 111 | 111 | if layout == (1,1): |
| 112 | - self.wl_text.Show() | |
| 112 | + self.ShowTextActors() | |
| 113 | 113 | else: |
| 114 | - self.wl_text.Hide() | |
| 115 | - | |
| 114 | + self.HideTextActors() | |
| 115 | + | |
| 116 | 116 | slice_ = sl.Slice() |
| 117 | 117 | self.LoadRenderers(slice_.GetOutput()) |
| 118 | 118 | self.__configure_renderers() |
| 119 | 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 | 131 | def __set_layout(self, pubsub_evt): |
| 122 | 132 | layout = pubsub_evt.data |
| 123 | 133 | self.SetLayout(layout) |
| ... | ... | @@ -132,6 +142,7 @@ class Viewer(wx.Panel): |
| 132 | 142 | self.cam = ren.GetActiveCamera() |
| 133 | 143 | self.ren = ren |
| 134 | 144 | |
| 145 | + | |
| 135 | 146 | def append_mode(self, mode): |
| 136 | 147 | if "ZOOM" in self.modes or "ZOOMSELECT" in self.modes: |
| 137 | 148 | self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) |
| ... | ... | @@ -381,6 +392,47 @@ class Viewer(wx.Panel): |
| 381 | 392 | proj = project.Project() |
| 382 | 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 | 437 | def Reposition(self, slice_data): |
| 386 | 438 | """ | ... | ... |
invesalius/data/vtk_utils.py
| ... | ... | @@ -16,9 +16,10 @@ |
| 16 | 16 | # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais |
| 17 | 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 | 24 | import constants as const |
| 24 | 25 | from gui.dialogs import ProgressDialog |
| ... | ... | @@ -92,43 +93,39 @@ class Text(object): |
| 92 | 93 | property.SetFontFamilyToArial() |
| 93 | 94 | property.BoldOff() |
| 94 | 95 | property.ItalicOff() |
| 95 | - property.ShadowOff() | |
| 96 | + property.ShadowOn() | |
| 96 | 97 | property.SetJustificationToLeft() |
| 97 | 98 | property.SetVerticalJustificationToTop() |
| 98 | 99 | property.SetColor(const.TEXT_COLOUR) |
| 99 | 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 | 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 | 109 | actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() |
| 114 | - actor.GetPositionCoordinate().SetValue(x,y) | |
| 115 | - actor.GetTextProperty().ShallowCopy(property) | |
| 110 | + actor.GetPositionCoordinate().SetValue(x,y) | |
| 116 | 111 | self.actor = actor |
| 117 | 112 | |
| 118 | - def BoldOn(self): | |
| 119 | - self.property.BoldOn() | |
| 120 | - self.actor.GetTextProperty().ShallowCopy(self.property) | |
| 121 | - | |
| 122 | 113 | def SetColour(self, colour): |
| 123 | 114 | self.property.SetColor(colour) |
| 124 | - self.actor.GetTextProperty().ShallowCopy(self.property) | |
| 115 | + | |
| 116 | + def ShadowOff(self): | |
| 117 | + self.property.ShadowOff() | |
| 125 | 118 | |
| 126 | 119 | def SetSize(self, size): |
| 127 | 120 | self.property.SetFontSize(size) |
| 128 | - self.actor.GetTextProperty().ShallowCopy(self.property) | |
| 129 | 121 | |
| 130 | 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 | 130 | def SetPosition(self, position): |
| 134 | 131 | self.actor.GetPositionCoordinate().SetValue(position[0], |
| ... | ... | @@ -139,11 +136,10 @@ class Text(object): |
| 139 | 136 | |
| 140 | 137 | def SetJustificationToRight(self): |
| 141 | 138 | self.property.SetJustificationToRight() |
| 142 | - self.actor.GetTextProperty().ShallowCopy(self.property) | |
| 143 | 139 | |
| 144 | 140 | def SetVerticalJustificationToBottom(self): |
| 145 | 141 | self.property.SetVerticalJustificationToBottom() |
| 146 | - self.actor.GetTextProperty().ShallowCopy(self.property) | |
| 142 | + | |
| 147 | 143 | |
| 148 | 144 | def Show(self, value=1): |
| 149 | 145 | if value: | ... | ... |