Commit 90e1222dc6e5d548fc9e3d0f6c9757ef3ba3d105

Authored by Thiago Franco de Moraes
1 parent 849fd417
Exists in master

Created a method to draw text inside a box

invesalius/data/measures.py
... ... @@ -561,19 +561,19 @@ class LinearMeasure(object):
561 561 a.GetProperty().SetOpacity(0.75)
562 562 self.text_actor = a
563 563  
564   - def draw_to_canvas(self, gc, viewer):
  564 + def draw_to_canvas(self, gc, canvas):
565 565 """
566 566 Draws to an wx.GraphicsContext.
567 567  
568 568 Parameters:
569 569 gc: is a wx.GraphicsContext
570   - viewer: the viewer where the canvas is in.
  570 + canvas: the canvas it's being drawn.
571 571 """
572 572 coord = vtk.vtkCoordinate()
573 573 lines = []
574 574 for p in self.points:
575 575 coord.SetValue(p)
576   - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer)
  576 + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
577 577 cy = -cy
578 578 lines.append((cx, cy))
579 579 path = gc.CreatePath()
... ... @@ -590,7 +590,8 @@ class LinearMeasure(object):
590 590 gc.StrokePath(path)
591 591  
592 592 txt = u"%.3f mm" % self.GetValue()
593   - gc.DrawText(txt, *lines[0])
  593 + # gc.DrawText(txt, *lines[0])
  594 + canvas.draw_text_box(txt, (lines[0][0], -lines[0][1]))
594 595  
595 596 def GetNumberOfPoints(self):
596 597 return len(self.points)
... ... @@ -827,20 +828,20 @@ class AngularMeasure(object):
827 828 a.GetPositionCoordinate().SetValue(x,y,z)
828 829 self.text_actor = a
829 830  
830   - def draw_to_canvas(self, gc, viewer):
  831 + def draw_to_canvas(self, gc, canvas):
831 832 """
832 833 Draws to an wx.GraphicsContext.
833 834  
834 835 Parameters:
835 836 gc: is a wx.GraphicsContext
836   - viewer: the viewer where the canvas is in.
  837 + canvas: the canvas it's being drawn.
837 838 """
838 839 coord = vtk.vtkCoordinate()
839 840 lines = []
840 841 for p in self.points:
841 842 print p
842 843 coord.SetValue(p)
843   - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer)
  844 + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
844 845 cy = -cy
845 846 lines.append((cx, cy))
846 847 path = gc.CreatePath()
... ... @@ -858,7 +859,6 @@ class AngularMeasure(object):
858 859  
859 860 if len(lines) == 3:
860 861 txt = u"%.3f° / %.3f°" % (self.GetValue(), 360.0 - self.GetValue())
861   - gc.DrawText(txt, *lines[0])
862 862  
863 863 path = gc.CreatePath()
864 864  
... ... @@ -882,7 +882,8 @@ class AngularMeasure(object):
882 882 path.AddArc((c[0], c[1]), min(s0, s1), sa, ea)
883 883 gc.StrokePath(path)
884 884  
885   - gc.DrawText(txt, *lines[0])
  885 + # gc.DrawText(txt, *lines[0])
  886 + canvas.draw_text_box(txt, (lines[0][0], -lines[0][1]))
886 887  
887 888 def GetNumberOfPoints(self):
888 889 return self.number_of_points
... ...
invesalius/data/viewer_slice.py
... ... @@ -151,6 +151,7 @@ class CanvasRendererCTX:
151 151 self.viewer = viewer
152 152 self.canvas_renderer = viewer.slice_data.canvas_renderer
153 153 self._size = self.canvas_renderer.GetSize()
  154 + self.gc = None
154 155 self._init_canvas()
155 156 viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint)
156 157  
... ... @@ -205,6 +206,8 @@ class CanvasRendererCTX:
205 206 gc = wx.GraphicsContext.Create(self.image)
206 207 gc.SetAntialiasMode(0)
207 208  
  209 + self.gc = gc
  210 +
208 211 font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
209 212 # font.SetWeight(wx.BOLD)
210 213 font = gc.CreateFont(font, (0, 0, 255))
... ... @@ -219,15 +222,52 @@ class CanvasRendererCTX:
219 222 for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number):
220 223 if not m.visible:
221 224 continue
222   - mr.draw_to_canvas(gc, self.viewer)
  225 + mr.draw_to_canvas(gc, self)
223 226  
224 227 gc.Destroy()
225 228  
  229 + self.gc = None
  230 +
226 231 self.bitmap = self.image.ConvertToBitmap()
227 232 self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA)
228 233  
229 234 self._cv_image.Modified()
230 235  
  236 + def draw_text_box(self, text, pos, font=None, txt_colour=(0.0, 0.0, 0.0), bg_colour=(128, 0, 0, 128), border=5):
  237 + """
  238 + Draw text inside a text box.
  239 +
  240 + Params:
  241 + text: an unicode text.
  242 + pos: (x, y) position.
  243 + font: if None it'll use the default gui font.
  244 + txt_colour: RGB text colour
  245 + bg_colour: RGBA box colour
  246 + border: the border size.
  247 + """
  248 + if self.gc is None:
  249 + return None
  250 + gc = self.gc
  251 +
  252 + if font is None:
  253 + font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
  254 +
  255 + font = gc.CreateFont(font, txt_colour)
  256 + gc.SetFont(font)
  257 + w, h = gc.GetTextExtent(text)
  258 +
  259 + px, py = pos
  260 + py = -py
  261 +
  262 + # Drawing the box
  263 + cw, ch = w + border * 2, h + border * 2
  264 + gc.SetBrush(wx.Brush(bg_colour))
  265 + gc.SetPen(wx.Pen(bg_colour))
  266 + gc.DrawRectangle(px, py, cw, ch)
  267 +
  268 + tpx, tpy = px + border, py + border
  269 + gc.DrawText(text, tpx, tpy)
  270 +
231 271  
232 272 class Viewer(wx.Panel):
233 273  
... ...