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 | 5 | import random |
6 | 6 | |
7 | 7 | from wx.lib.pubsub import pub as Publisher |
8 | + | |
9 | +import numpy as np | |
8 | 10 | import vtk |
9 | 11 | |
10 | 12 | import constants as const |
... | ... | @@ -559,6 +561,37 @@ class LinearMeasure(object): |
559 | 561 | a.GetProperty().SetOpacity(0.75) |
560 | 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 | 595 | def GetNumberOfPoints(self): |
563 | 596 | return len(self.points) |
564 | 597 | |
... | ... | @@ -631,7 +664,7 @@ class LinearMeasure(object): |
631 | 664 | class AngularMeasure(object): |
632 | 665 | def __init__(self, colour=(1, 0, 0), representation=None): |
633 | 666 | self.colour = colour |
634 | - self.points = [0, 0, 0] | |
667 | + self.points = [] | |
635 | 668 | self.number_of_points = 0 |
636 | 669 | self.point_actor1 = None |
637 | 670 | self.point_actor2 = None |
... | ... | @@ -659,7 +692,7 @@ class AngularMeasure(object): |
659 | 692 | |
660 | 693 | def SetPoint1(self, x, y, z): |
661 | 694 | if self.number_of_points == 0: |
662 | - self.points[0] = (x, y, z) | |
695 | + self.points.append((x, y, z)) | |
663 | 696 | self.number_of_points = 1 |
664 | 697 | self.point_actor1 = self.representation.GetRepresentation(x, y, z) |
665 | 698 | else: |
... | ... | @@ -678,7 +711,7 @@ class AngularMeasure(object): |
678 | 711 | def SetPoint2(self, x, y, z): |
679 | 712 | if self.number_of_points == 1: |
680 | 713 | self.number_of_points = 2 |
681 | - self.points[1] = (x, y, z) | |
714 | + self.points.append((x, y, z)) | |
682 | 715 | self.point_actor2 = self.representation.GetRepresentation(x, y, z) |
683 | 716 | else: |
684 | 717 | self.points[1] = (x, y, z) |
... | ... | @@ -696,7 +729,7 @@ class AngularMeasure(object): |
696 | 729 | def SetPoint3(self, x, y, z): |
697 | 730 | if self.number_of_points == 2: |
698 | 731 | self.number_of_points = 3 |
699 | - self.points[2] = (x, y, z) | |
732 | + self.points.append((x, y, z)) | |
700 | 733 | self.point_actor3 = self.representation.GetRepresentation(x, y, z) |
701 | 734 | self.CreateMeasure() |
702 | 735 | else: |
... | ... | @@ -794,6 +827,63 @@ class AngularMeasure(object): |
794 | 827 | a.GetPositionCoordinate().SetValue(x,y,z) |
795 | 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 | 887 | def GetNumberOfPoints(self): |
798 | 888 | return self.number_of_points |
799 | 889 | ... | ... |
invesalius/data/viewer_slice.py
... | ... | @@ -217,55 +217,9 @@ class CanvasRendererCTX: |
217 | 217 | gc.Scale(1, -1) |
218 | 218 | |
219 | 219 | for (m, mr) in self.viewer.measures.get(self.viewer.orientation, self.viewer.slice_data.number): |
220 | - lines = [] | |
221 | 220 | if not m.visible: |
222 | 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 | 224 | gc.Destroy() |
271 | 225 | |
... | ... | @@ -274,10 +228,6 @@ class CanvasRendererCTX: |
274 | 228 | |
275 | 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 | 232 | class Viewer(wx.Panel): |
283 | 233 | ... | ... |