Commit a30db6845eba378787909e24a75edd7ed10b7c04
1 parent
994b42f7
Exists in
master
and in
26 other branches
Drawing inside LinearMeasure and AngularMeasure
Showing
2 changed files
with
95 additions
and
55 deletions
Show diff stats
invesalius/data/measures.py
| @@ -5,6 +5,8 @@ import math | @@ -5,6 +5,8 @@ import math | ||
| 5 | import random | 5 | import random |
| 6 | 6 | ||
| 7 | from wx.lib.pubsub import pub as Publisher | 7 | from wx.lib.pubsub import pub as Publisher |
| 8 | + | ||
| 9 | +import numpy as np | ||
| 8 | import vtk | 10 | import vtk |
| 9 | 11 | ||
| 10 | import constants as const | 12 | import constants as const |
| @@ -559,6 +561,37 @@ class LinearMeasure(object): | @@ -559,6 +561,37 @@ class LinearMeasure(object): | ||
| 559 | a.GetProperty().SetOpacity(0.75) | 561 | a.GetProperty().SetOpacity(0.75) |
| 560 | self.text_actor = a | 562 | self.text_actor = a |
| 561 | 563 | ||
| 564 | + def draw_to_canvas(self, gc, viewer): | ||
| 565 | + """ | ||
| 566 | + Draws to an wx.GraphicsContext. | ||
| 567 | + | ||
| 568 | + Parameters: | ||
| 569 | + gc: is a wx.GraphicsContext | ||
| 570 | + viewer: the viewer where the canvas is in. | ||
| 571 | + """ | ||
| 572 | + coord = vtk.vtkCoordinate() | ||
| 573 | + lines = [] | ||
| 574 | + for p in self.points: | ||
| 575 | + coord.SetValue(p) | ||
| 576 | + cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) | ||
| 577 | + cy = -cy | ||
| 578 | + lines.append((cx, cy)) | ||
| 579 | + path = gc.CreatePath() | ||
| 580 | + path.AddCircle(cx, cy, 2.5) | ||
| 581 | + gc.StrokePath(path) | ||
| 582 | + gc.FillPath(path) | ||
| 583 | + | ||
| 584 | + if len(lines) > 1: | ||
| 585 | + path = gc.CreatePath() | ||
| 586 | + | ||
| 587 | + path.MoveToPoint(*lines[0]) | ||
| 588 | + for p in lines[1::]: | ||
| 589 | + path.AddLineToPoint(*p) | ||
| 590 | + gc.StrokePath(path) | ||
| 591 | + | ||
| 592 | + txt = u"%.3f mm" % self.GetValue() | ||
| 593 | + gc.DrawText(txt, *lines[0]) | ||
| 594 | + | ||
| 562 | def GetNumberOfPoints(self): | 595 | def GetNumberOfPoints(self): |
| 563 | return len(self.points) | 596 | return len(self.points) |
| 564 | 597 | ||
| @@ -631,7 +664,7 @@ class LinearMeasure(object): | @@ -631,7 +664,7 @@ class LinearMeasure(object): | ||
| 631 | class AngularMeasure(object): | 664 | class AngularMeasure(object): |
| 632 | def __init__(self, colour=(1, 0, 0), representation=None): | 665 | def __init__(self, colour=(1, 0, 0), representation=None): |
| 633 | self.colour = colour | 666 | self.colour = colour |
| 634 | - self.points = [0, 0, 0] | 667 | + self.points = [] |
| 635 | self.number_of_points = 0 | 668 | self.number_of_points = 0 |
| 636 | self.point_actor1 = None | 669 | self.point_actor1 = None |
| 637 | self.point_actor2 = None | 670 | self.point_actor2 = None |
| @@ -659,7 +692,7 @@ class AngularMeasure(object): | @@ -659,7 +692,7 @@ class AngularMeasure(object): | ||
| 659 | 692 | ||
| 660 | def SetPoint1(self, x, y, z): | 693 | def SetPoint1(self, x, y, z): |
| 661 | if self.number_of_points == 0: | 694 | if self.number_of_points == 0: |
| 662 | - self.points[0] = (x, y, z) | 695 | + self.points.append((x, y, z)) |
| 663 | self.number_of_points = 1 | 696 | self.number_of_points = 1 |
| 664 | self.point_actor1 = self.representation.GetRepresentation(x, y, z) | 697 | self.point_actor1 = self.representation.GetRepresentation(x, y, z) |
| 665 | else: | 698 | else: |
| @@ -678,7 +711,7 @@ class AngularMeasure(object): | @@ -678,7 +711,7 @@ class AngularMeasure(object): | ||
| 678 | def SetPoint2(self, x, y, z): | 711 | def SetPoint2(self, x, y, z): |
| 679 | if self.number_of_points == 1: | 712 | if self.number_of_points == 1: |
| 680 | self.number_of_points = 2 | 713 | self.number_of_points = 2 |
| 681 | - self.points[1] = (x, y, z) | 714 | + self.points.append((x, y, z)) |
| 682 | self.point_actor2 = self.representation.GetRepresentation(x, y, z) | 715 | self.point_actor2 = self.representation.GetRepresentation(x, y, z) |
| 683 | else: | 716 | else: |
| 684 | self.points[1] = (x, y, z) | 717 | self.points[1] = (x, y, z) |
| @@ -696,7 +729,7 @@ class AngularMeasure(object): | @@ -696,7 +729,7 @@ class AngularMeasure(object): | ||
| 696 | def SetPoint3(self, x, y, z): | 729 | def SetPoint3(self, x, y, z): |
| 697 | if self.number_of_points == 2: | 730 | if self.number_of_points == 2: |
| 698 | self.number_of_points = 3 | 731 | self.number_of_points = 3 |
| 699 | - self.points[2] = (x, y, z) | 732 | + self.points.append((x, y, z)) |
| 700 | self.point_actor3 = self.representation.GetRepresentation(x, y, z) | 733 | self.point_actor3 = self.representation.GetRepresentation(x, y, z) |
| 701 | self.CreateMeasure() | 734 | self.CreateMeasure() |
| 702 | else: | 735 | else: |
| @@ -794,6 +827,63 @@ class AngularMeasure(object): | @@ -794,6 +827,63 @@ class AngularMeasure(object): | ||
| 794 | a.GetPositionCoordinate().SetValue(x,y,z) | 827 | a.GetPositionCoordinate().SetValue(x,y,z) |
| 795 | self.text_actor = a | 828 | self.text_actor = a |
| 796 | 829 | ||
| 830 | + def draw_to_canvas(self, gc, viewer): | ||
| 831 | + """ | ||
| 832 | + Draws to an wx.GraphicsContext. | ||
| 833 | + | ||
| 834 | + Parameters: | ||
| 835 | + gc: is a wx.GraphicsContext | ||
| 836 | + viewer: the viewer where the canvas is in. | ||
| 837 | + """ | ||
| 838 | + coord = vtk.vtkCoordinate() | ||
| 839 | + lines = [] | ||
| 840 | + for p in self.points: | ||
| 841 | + print p | ||
| 842 | + coord.SetValue(p) | ||
| 843 | + cx, cy = coord.GetComputedDisplayValue(viewer.slice_data.renderer) | ||
| 844 | + cy = -cy | ||
| 845 | + lines.append((cx, cy)) | ||
| 846 | + path = gc.CreatePath() | ||
| 847 | + path.AddCircle(cx, cy, 2.5) | ||
| 848 | + gc.StrokePath(path) | ||
| 849 | + gc.FillPath(path) | ||
| 850 | + | ||
| 851 | + if len(lines) > 1: | ||
| 852 | + path = gc.CreatePath() | ||
| 853 | + | ||
| 854 | + path.MoveToPoint(*lines[0]) | ||
| 855 | + for p in lines[1::]: | ||
| 856 | + path.AddLineToPoint(*p) | ||
| 857 | + gc.StrokePath(path) | ||
| 858 | + | ||
| 859 | + if len(lines) == 3: | ||
| 860 | + txt = u"%.3f° / %.3f°" % (self.GetValue(), 360.0 - self.GetValue()) | ||
| 861 | + gc.DrawText(txt, *lines[0]) | ||
| 862 | + | ||
| 863 | + path = gc.CreatePath() | ||
| 864 | + | ||
| 865 | + c = np.array(lines[1]) | ||
| 866 | + v0 = np.array(lines[0]) - c | ||
| 867 | + v1 = np.array(lines[2]) - c | ||
| 868 | + | ||
| 869 | + s0 = np.linalg.norm(v0) | ||
| 870 | + s1 = np.linalg.norm(v1) | ||
| 871 | + | ||
| 872 | + a0 = np.arctan2(v0[1] , v0[0]) | ||
| 873 | + a1 = np.arctan2(v1[1] , v1[0]) | ||
| 874 | + | ||
| 875 | + if (a1 - a0) % (np.pi*2) < (a0 - a1) % (np.pi*2): | ||
| 876 | + sa = a0 | ||
| 877 | + ea = a1 | ||
| 878 | + else: | ||
| 879 | + sa = a1 | ||
| 880 | + ea = a0 | ||
| 881 | + | ||
| 882 | + path.AddArc((c[0], c[1]), min(s0, s1), sa, ea) | ||
| 883 | + gc.StrokePath(path) | ||
| 884 | + | ||
| 885 | + gc.DrawText(txt, *lines[0]) | ||
| 886 | + | ||
| 797 | def GetNumberOfPoints(self): | 887 | def GetNumberOfPoints(self): |
| 798 | return self.number_of_points | 888 | return self.number_of_points |
| 799 | 889 |
invesalius/data/viewer_slice.py
| @@ -217,55 +217,9 @@ class CanvasRendererCTX: | @@ -217,55 +217,9 @@ class CanvasRendererCTX: | ||
| 217 | gc.Scale(1, -1) | 217 | gc.Scale(1, -1) |
| 218 | 218 | ||
| 219 | for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number): | 219 | for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number): |
| 220 | - lines = [] | ||
| 221 | if not m.visible: | 220 | if not m.visible: |
| 222 | continue | 221 | continue |
| 223 | - for p in m.points: | ||
| 224 | - coord.SetValue(p) | ||
| 225 | - cx, cy = coord.GetComputedDisplayValue(self.viewer.slice_data.renderer) | ||
| 226 | - print (p, cx, cy) | ||
| 227 | - cy = -cy | ||
| 228 | - lines.append((cx, cy)) | ||
| 229 | - path = gc.CreatePath() | ||
| 230 | - path.AddCircle(cx, cy, 2.5) | ||
| 231 | - gc.StrokePath(path) | ||
| 232 | - gc.FillPath(path) | ||
| 233 | - | ||
| 234 | - if len(lines) > 1: | ||
| 235 | - path = gc.CreatePath() | ||
| 236 | - | ||
| 237 | - path.MoveToPoint(*lines[0]) | ||
| 238 | - for p in lines[1::]: | ||
| 239 | - path.AddLineToPoint(*p) | ||
| 240 | - gc.StrokePath(path) | ||
| 241 | - if m.type == const.ANGULAR: | ||
| 242 | - txt = u"%.3f° / %.3f" % (m.value, 360.0 - m.value) | ||
| 243 | - | ||
| 244 | - if len(lines) == 3: | ||
| 245 | - path = gc.CreatePath() | ||
| 246 | - | ||
| 247 | - c = np.array(lines[1]) | ||
| 248 | - v0 = np.array(lines[0]) - c | ||
| 249 | - v1 = np.array(lines[2]) - c | ||
| 250 | - | ||
| 251 | - s0 = np.linalg.norm(v0) | ||
| 252 | - s1 = np.linalg.norm(v1) | ||
| 253 | - | ||
| 254 | - a0 = np.arctan2(v0[1] , v0[0]) | ||
| 255 | - a1 = np.arctan2(v1[1] , v1[0]) | ||
| 256 | - | ||
| 257 | - if (a1 - a0) % (np.pi*2) < (a0 - a1) % (np.pi*2): | ||
| 258 | - sa = a0 | ||
| 259 | - ea = a1 | ||
| 260 | - else: | ||
| 261 | - sa = a1 | ||
| 262 | - ea = a0 | ||
| 263 | - | ||
| 264 | - # path.AddArc((c[0], c[1]), min(s0, s1), sa, ea) | ||
| 265 | - # gc.StrokePath(path) | ||
| 266 | - else: | ||
| 267 | - txt = u"%.3f mm" % m.value | ||
| 268 | - gc.DrawText(txt, *lines[0]) | 222 | + mr.draw_to_canvas(gc, self.viewer) |
| 269 | 223 | ||
| 270 | gc.Destroy() | 224 | gc.Destroy() |
| 271 | 225 | ||
| @@ -274,10 +228,6 @@ class CanvasRendererCTX: | @@ -274,10 +228,6 @@ class CanvasRendererCTX: | ||
| 274 | 228 | ||
| 275 | self._cv_image.Modified() | 229 | self._cv_image.Modified() |
| 276 | 230 | ||
| 277 | - # self.canvas_renderer.Render() | ||
| 278 | - | ||
| 279 | - # img = self.bitmap.ConvertToImage() | ||
| 280 | - # img.SaveFile('/tmp/manolo.png', wx.BITMAP_TYPE_PNG) | ||
| 281 | 231 | ||
| 282 | class Viewer(wx.Panel): | 232 | class Viewer(wx.Panel): |
| 283 | 233 |