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,19 +561,19 @@ class LinearMeasure(object):
561 a.GetProperty().SetOpacity(0.75) 561 a.GetProperty().SetOpacity(0.75)
562 self.text_actor = a 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 Draws to an wx.GraphicsContext. 566 Draws to an wx.GraphicsContext.
567 567
568 Parameters: 568 Parameters:
569 gc: is a wx.GraphicsContext 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 coord = vtk.vtkCoordinate() 572 coord = vtk.vtkCoordinate()
573 lines = [] 573 lines = []
574 for p in self.points: 574 for p in self.points:
575 coord.SetValue(p) 575 coord.SetValue(p)
576 - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) 576 + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
577 cy = -cy 577 cy = -cy
578 lines.append((cx, cy)) 578 lines.append((cx, cy))
579 path = gc.CreatePath() 579 path = gc.CreatePath()
@@ -590,7 +590,8 @@ class LinearMeasure(object): @@ -590,7 +590,8 @@ class LinearMeasure(object):
590 gc.StrokePath(path) 590 gc.StrokePath(path)
591 591
592 txt = u"%.3f mm" % self.GetValue() 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 def GetNumberOfPoints(self): 596 def GetNumberOfPoints(self):
596 return len(self.points) 597 return len(self.points)
@@ -827,20 +828,20 @@ class AngularMeasure(object): @@ -827,20 +828,20 @@ class AngularMeasure(object):
827 a.GetPositionCoordinate().SetValue(x,y,z) 828 a.GetPositionCoordinate().SetValue(x,y,z)
828 self.text_actor = a 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 Draws to an wx.GraphicsContext. 833 Draws to an wx.GraphicsContext.
833 834
834 Parameters: 835 Parameters:
835 gc: is a wx.GraphicsContext 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 coord = vtk.vtkCoordinate() 839 coord = vtk.vtkCoordinate()
839 lines = [] 840 lines = []
840 for p in self.points: 841 for p in self.points:
841 print p 842 print p
842 coord.SetValue(p) 843 coord.SetValue(p)
843 - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) 844 + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer)
844 cy = -cy 845 cy = -cy
845 lines.append((cx, cy)) 846 lines.append((cx, cy))
846 path = gc.CreatePath() 847 path = gc.CreatePath()
@@ -858,7 +859,6 @@ class AngularMeasure(object): @@ -858,7 +859,6 @@ class AngularMeasure(object):
858 859
859 if len(lines) == 3: 860 if len(lines) == 3:
860 txt = u"%.3f° / %.3f°" % (self.GetValue(), 360.0 - self.GetValue()) 861 txt = u"%.3f° / %.3f°" % (self.GetValue(), 360.0 - self.GetValue())
861 - gc.DrawText(txt, *lines[0])  
862 862
863 path = gc.CreatePath() 863 path = gc.CreatePath()
864 864
@@ -882,7 +882,8 @@ class AngularMeasure(object): @@ -882,7 +882,8 @@ class AngularMeasure(object):
882 path.AddArc((c[0], c[1]), min(s0, s1), sa, ea) 882 path.AddArc((c[0], c[1]), min(s0, s1), sa, ea)
883 gc.StrokePath(path) 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 def GetNumberOfPoints(self): 888 def GetNumberOfPoints(self):
888 return self.number_of_points 889 return self.number_of_points
invesalius/data/viewer_slice.py
@@ -151,6 +151,7 @@ class CanvasRendererCTX: @@ -151,6 +151,7 @@ class CanvasRendererCTX:
151 self.viewer = viewer 151 self.viewer = viewer
152 self.canvas_renderer = viewer.slice_data.canvas_renderer 152 self.canvas_renderer = viewer.slice_data.canvas_renderer
153 self._size = self.canvas_renderer.GetSize() 153 self._size = self.canvas_renderer.GetSize()
  154 + self.gc = None
154 self._init_canvas() 155 self._init_canvas()
155 viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint) 156 viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint)
156 157
@@ -205,6 +206,8 @@ class CanvasRendererCTX: @@ -205,6 +206,8 @@ class CanvasRendererCTX:
205 gc = wx.GraphicsContext.Create(self.image) 206 gc = wx.GraphicsContext.Create(self.image)
206 gc.SetAntialiasMode(0) 207 gc.SetAntialiasMode(0)
207 208
  209 + self.gc = gc
  210 +
208 font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) 211 font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
209 # font.SetWeight(wx.BOLD) 212 # font.SetWeight(wx.BOLD)
210 font = gc.CreateFont(font, (0, 0, 255)) 213 font = gc.CreateFont(font, (0, 0, 255))
@@ -219,15 +222,52 @@ class CanvasRendererCTX: @@ -219,15 +222,52 @@ class CanvasRendererCTX:
219 for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number): 222 for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number):
220 if not m.visible: 223 if not m.visible:
221 continue 224 continue
222 - mr.draw_to_canvas(gc, self.viewer) 225 + mr.draw_to_canvas(gc, self)
223 226
224 gc.Destroy() 227 gc.Destroy()
225 228
  229 + self.gc = None
  230 +
226 self.bitmap = self.image.ConvertToBitmap() 231 self.bitmap = self.image.ConvertToBitmap()
227 self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA) 232 self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA)
228 233
229 self._cv_image.Modified() 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 class Viewer(wx.Panel): 272 class Viewer(wx.Panel):
233 273