diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index f70c41c..129df30 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -561,19 +561,19 @@ class LinearMeasure(object): a.GetProperty().SetOpacity(0.75) self.text_actor = a - def draw_to_canvas(self, gc, viewer): + def draw_to_canvas(self, gc, canvas): """ Draws to an wx.GraphicsContext. Parameters: gc: is a wx.GraphicsContext - viewer: the viewer where the canvas is in. + canvas: the canvas it's being drawn. """ coord = vtk.vtkCoordinate() lines = [] for p in self.points: coord.SetValue(p) - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) cy = -cy lines.append((cx, cy)) path = gc.CreatePath() @@ -590,7 +590,8 @@ class LinearMeasure(object): gc.StrokePath(path) txt = u"%.3f mm" % self.GetValue() - gc.DrawText(txt, *lines[0]) + # gc.DrawText(txt, *lines[0]) + canvas.draw_text_box(txt, (lines[0][0], -lines[0][1])) def GetNumberOfPoints(self): return len(self.points) @@ -827,20 +828,20 @@ class AngularMeasure(object): a.GetPositionCoordinate().SetValue(x,y,z) self.text_actor = a - def draw_to_canvas(self, gc, viewer): + def draw_to_canvas(self, gc, canvas): """ Draws to an wx.GraphicsContext. Parameters: gc: is a wx.GraphicsContext - viewer: the viewer where the canvas is in. + canvas: the canvas it's being drawn. """ coord = vtk.vtkCoordinate() lines = [] for p in self.points: print p coord.SetValue(p) - cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) + cx, cy = coord.GetComputedDisplayValue(canvas.viewer.slice_data.renderer) cy = -cy lines.append((cx, cy)) path = gc.CreatePath() @@ -858,7 +859,6 @@ class AngularMeasure(object): if len(lines) == 3: txt = u"%.3f° / %.3f°" % (self.GetValue(), 360.0 - self.GetValue()) - gc.DrawText(txt, *lines[0]) path = gc.CreatePath() @@ -882,7 +882,8 @@ class AngularMeasure(object): path.AddArc((c[0], c[1]), min(s0, s1), sa, ea) gc.StrokePath(path) - gc.DrawText(txt, *lines[0]) + # gc.DrawText(txt, *lines[0]) + canvas.draw_text_box(txt, (lines[0][0], -lines[0][1])) def GetNumberOfPoints(self): return self.number_of_points diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index f999b53..6230aa1 100755 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -151,6 +151,7 @@ class CanvasRendererCTX: self.viewer = viewer self.canvas_renderer = viewer.slice_data.canvas_renderer self._size = self.canvas_renderer.GetSize() + self.gc = None self._init_canvas() viewer.slice_data.renderer.AddObserver("StartEvent", self.OnPaint) @@ -205,6 +206,8 @@ class CanvasRendererCTX: gc = wx.GraphicsContext.Create(self.image) gc.SetAntialiasMode(0) + self.gc = gc + font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) # font.SetWeight(wx.BOLD) font = gc.CreateFont(font, (0, 0, 255)) @@ -219,15 +222,52 @@ class CanvasRendererCTX: for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number): if not m.visible: continue - mr.draw_to_canvas(gc, self.viewer) + mr.draw_to_canvas(gc, self) gc.Destroy() + self.gc = None + self.bitmap = self.image.ConvertToBitmap() self.bitmap.CopyToBuffer(self._array, wx.BitmapBufferFormat_RGBA) self._cv_image.Modified() + 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): + """ + Draw text inside a text box. + + Params: + text: an unicode text. + pos: (x, y) position. + font: if None it'll use the default gui font. + txt_colour: RGB text colour + bg_colour: RGBA box colour + border: the border size. + """ + if self.gc is None: + return None + gc = self.gc + + if font is None: + font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) + + font = gc.CreateFont(font, txt_colour) + gc.SetFont(font) + w, h = gc.GetTextExtent(text) + + px, py = pos + py = -py + + # Drawing the box + cw, ch = w + border * 2, h + border * 2 + gc.SetBrush(wx.Brush(bg_colour)) + gc.SetPen(wx.Pen(bg_colour)) + gc.DrawRectangle(px, py, cw, ch) + + tpx, tpy = px + border, py + border + gc.DrawText(text, tpx, tpy) + class Viewer(wx.Panel): -- libgit2 0.21.2