Commit 90e1222dc6e5d548fc9e3d0f6c9757ef3ba3d105
1 parent
849fd417
Exists in
master
Created a method to draw text inside a box
Showing
2 changed files
with
51 additions
and
10 deletions
Show diff stats
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 |