Commit 3fb68523a156bc0e66b1ae0765414fc2a8acb2e5
1 parent
24de5835
Exists in
master
Using canvas renderer instead of vtkLine to show a colored box around
the renderer.
Showing
3 changed files
with
24 additions
and
116 deletions
Show diff stats
invesalius/data/slice_data.py
@@ -35,14 +35,13 @@ class SliceData(object): | @@ -35,14 +35,13 @@ class SliceData(object): | ||
35 | self.actor = None | 35 | self.actor = None |
36 | self.cursor = None | 36 | self.cursor = None |
37 | self.text = None | 37 | self.text = None |
38 | - | 38 | + self.layer = 99 |
39 | self.number = 0 | 39 | self.number = 0 |
40 | self.orientation = 'AXIAL' | 40 | self.orientation = 'AXIAL' |
41 | self.renderer = None | 41 | self.renderer = None |
42 | self.canvas_renderer = None | 42 | self.canvas_renderer = None |
43 | self.overlay_renderer = None | 43 | self.overlay_renderer = None |
44 | self.__create_text() | 44 | self.__create_text() |
45 | - self.__create_box() | ||
46 | 45 | ||
47 | def __create_text(self): | 46 | def __create_text(self): |
48 | colour = const.ORIENTATION_COLOUR[self.orientation] | 47 | colour = const.ORIENTATION_COLOUR[self.orientation] |
@@ -56,83 +55,6 @@ class SliceData(object): | @@ -56,83 +55,6 @@ class SliceData(object): | ||
56 | text.SetValue(self.number) | 55 | text.SetValue(self.number) |
57 | self.text = text | 56 | self.text = text |
58 | 57 | ||
59 | - def __create_line_actor(self, line): | ||
60 | - line_mapper = vtk.vtkPolyDataMapper2D() | ||
61 | - line_mapper.SetInputConnection(line.GetOutputPort()) | ||
62 | - | ||
63 | - line_actor = vtk.vtkActor2D() | ||
64 | - line_actor.SetMapper(line_mapper) | ||
65 | - return line_actor | ||
66 | - | ||
67 | - def __create_box(self): | ||
68 | - xi = yi = 0.1 | ||
69 | - xf = yf = 200 | ||
70 | - line_i = vtk.vtkLineSource() | ||
71 | - line_i.SetPoint1((xi, yi, 0)) | ||
72 | - line_i.SetPoint2((xf, yi, 0)) | ||
73 | - self.line_i = line_i | ||
74 | - self.line_i_actor = self.__create_line_actor(line_i) | ||
75 | - | ||
76 | - line_s = vtk.vtkLineSource() | ||
77 | - line_s.SetPoint1((xi, yf, 0)) | ||
78 | - line_s.SetPoint2((xf, yf, 0)) | ||
79 | - self.line_s = line_s | ||
80 | - self.line_s_actor = self.__create_line_actor(line_s) | ||
81 | - | ||
82 | - line_l = vtk.vtkLineSource() | ||
83 | - line_l.SetPoint1((xi, yi, 0)) | ||
84 | - line_l.SetPoint2((xi, yf, 0)) | ||
85 | - self.line_l = line_l | ||
86 | - self.line_l_actor = self.__create_line_actor(line_l) | ||
87 | - | ||
88 | - line_r = vtk.vtkLineSource() | ||
89 | - line_r.SetPoint1((xf, yi, 0)) | ||
90 | - line_r.SetPoint2((xf, yf, 0)) | ||
91 | - self.line_r = line_r | ||
92 | - self.line_r_actor = self.__create_line_actor(line_r) | ||
93 | - | ||
94 | - box_actor = vtk.vtkPropAssembly() | ||
95 | - box_actor.AddPart(self.line_i_actor) | ||
96 | - box_actor.AddPart(self.line_s_actor) | ||
97 | - box_actor.AddPart(self.line_l_actor) | ||
98 | - box_actor.AddPart(self.line_r_actor) | ||
99 | - self.box_actor = box_actor | ||
100 | - | ||
101 | - def __set_border_colours(self, colours_borders): | ||
102 | - for colour, actors in colours_borders.items(): | ||
103 | - for actor in actors: | ||
104 | - actor.GetProperty().SetColor(colour) | ||
105 | - | ||
106 | - def SetBorderStyle(self, style=BORDER_NONE): | ||
107 | - colour_e = const.ORIENTATION_COLOUR[self.orientation] | ||
108 | - colour_i = (1, 1, 1) | ||
109 | - | ||
110 | - extern_borders = [] | ||
111 | - intern_borders = [] | ||
112 | - | ||
113 | - if style & BORDER_UP: | ||
114 | - extern_borders.append(self.line_s_actor) | ||
115 | - else: | ||
116 | - intern_borders.append(self.line_s_actor) | ||
117 | - | ||
118 | - if style & BORDER_DOWN: | ||
119 | - extern_borders.append(self.line_i_actor) | ||
120 | - else: | ||
121 | - intern_borders.append(self.line_i_actor) | ||
122 | - | ||
123 | - if style & BORDER_LEFT: | ||
124 | - extern_borders.append(self.line_l_actor) | ||
125 | - else: | ||
126 | - intern_borders.append(self.line_l_actor) | ||
127 | - | ||
128 | - if style & BORDER_RIGHT: | ||
129 | - extern_borders.append(self.line_r_actor) | ||
130 | - else: | ||
131 | - intern_borders.append(self.line_r_actor) | ||
132 | - | ||
133 | - self.__set_border_colours({colour_i: intern_borders, | ||
134 | - colour_e: extern_borders}) | ||
135 | - | ||
136 | def SetCursor(self, cursor): | 58 | def SetCursor(self, cursor): |
137 | if self.cursor: | 59 | if self.cursor: |
138 | self.overlay_renderer.RemoveActor(self.cursor.actor) | 60 | self.overlay_renderer.RemoveActor(self.cursor.actor) |
@@ -150,28 +72,6 @@ class SliceData(object): | @@ -150,28 +72,6 @@ class SliceData(object): | ||
150 | 72 | ||
151 | def SetOrientation(self, orientation): | 73 | def SetOrientation(self, orientation): |
152 | self.orientation = orientation | 74 | self.orientation = orientation |
153 | - colour = const.ORIENTATION_COLOUR[self.orientation] | ||
154 | - self.text.SetColour(colour) | ||
155 | - #self.box_actor.GetProperty().SetColor(colour) | ||
156 | - | ||
157 | - | ||
158 | - def SetSize(self, size): | ||
159 | - w, h = size | ||
160 | - xi = yi = 0.1 | ||
161 | - xf = w - 0.1 | ||
162 | - yf = h - 0.1 | ||
163 | - | ||
164 | - self.line_i.SetPoint1((xi, yi, 0)) | ||
165 | - self.line_i.SetPoint2((xf, yi, 0)) | ||
166 | - | ||
167 | - self.line_s.SetPoint1((xi, yf, 0)) | ||
168 | - self.line_s.SetPoint2((xf, yf, 0)) | ||
169 | - | ||
170 | - self.line_l.SetPoint1((xi, yi, 0)) | ||
171 | - self.line_l.SetPoint2((xi, yf, 0)) | ||
172 | - | ||
173 | - self.line_r.SetPoint1((xf, yi, 0)) | ||
174 | - self.line_r.SetPoint2((xf, yf, 0)) | ||
175 | 75 | ||
176 | def Hide(self): | 76 | def Hide(self): |
177 | self.overlay_renderer.RemoveActor(self.actor) | 77 | self.overlay_renderer.RemoveActor(self.actor) |
@@ -180,3 +80,8 @@ class SliceData(object): | @@ -180,3 +80,8 @@ class SliceData(object): | ||
180 | def Show(self): | 80 | def Show(self): |
181 | self.renderer.AddActor(self.actor) | 81 | self.renderer.AddActor(self.actor) |
182 | self.renderer.AddActor(self.text.actor) | 82 | self.renderer.AddActor(self.text.actor) |
83 | + | ||
84 | + def draw_to_canvas(self, gc, canvas): | ||
85 | + w, h = self.renderer.GetSize() | ||
86 | + colour = const.ORIENTATION_COLOUR[self.orientation] | ||
87 | + canvas.draw_rectangle((0, 0), w, h, line_colour=[255*i for i in colour] + [255], line_width=2) |
invesalius/data/viewer_slice.py
@@ -232,11 +232,11 @@ class Viewer(wx.Panel): | @@ -232,11 +232,11 @@ class Viewer(wx.Panel): | ||
232 | self.mip_ctrls.Hide() | 232 | self.mip_ctrls.Hide() |
233 | 233 | ||
234 | sizer = wx.BoxSizer(wx.HORIZONTAL) | 234 | sizer = wx.BoxSizer(wx.HORIZONTAL) |
235 | - sizer.Add(self.interactor, 1, wx.EXPAND|wx.GROW) | 235 | + sizer.Add(self.interactor, 1, wx.EXPAND) |
236 | sizer.Add(scroll, 0, wx.EXPAND|wx.GROW) | 236 | sizer.Add(scroll, 0, wx.EXPAND|wx.GROW) |
237 | 237 | ||
238 | background_sizer = wx.BoxSizer(wx.VERTICAL) | 238 | background_sizer = wx.BoxSizer(wx.VERTICAL) |
239 | - background_sizer.Add(sizer, 1, wx.EXPAND|wx.GROW|wx.ALL, 2) | 239 | + background_sizer.Add(sizer, 1, wx.EXPAND) |
240 | #background_sizer.Add(self.mip_ctrls, 0, wx.EXPAND|wx.GROW|wx.ALL, 2) | 240 | #background_sizer.Add(self.mip_ctrls, 0, wx.EXPAND|wx.GROW|wx.ALL, 2) |
241 | self.SetSizer(background_sizer) | 241 | self.SetSizer(background_sizer) |
242 | background_sizer.Fit(self) | 242 | background_sizer.Fit(self) |
@@ -935,8 +935,6 @@ class Viewer(wx.Panel): | @@ -935,8 +935,6 @@ class Viewer(wx.Panel): | ||
935 | 935 | ||
936 | def _export_picture(self, id, filename, filetype): | 936 | def _export_picture(self, id, filename, filetype): |
937 | view_prop_list = [] | 937 | view_prop_list = [] |
938 | - view_prop_list.append(self.slice_data.box_actor) | ||
939 | - self.slice_data.renderer.RemoveViewProp(self.slice_data.box_actor) | ||
940 | 938 | ||
941 | dict = {"AXIAL": const.AXIAL, | 939 | dict = {"AXIAL": const.AXIAL, |
942 | "CORONAL": const.CORONAL, | 940 | "CORONAL": const.CORONAL, |
@@ -1030,7 +1028,7 @@ class Viewer(wx.Panel): | @@ -1030,7 +1028,7 @@ class Viewer(wx.Panel): | ||
1030 | #self.scroll.Bind(wx.EVT_SCROLL_ENDSCROLL, self.OnScrollBarRelease) | 1028 | #self.scroll.Bind(wx.EVT_SCROLL_ENDSCROLL, self.OnScrollBarRelease) |
1031 | self.interactor.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) | 1029 | self.interactor.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) |
1032 | self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) | 1030 | self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) |
1033 | - self.interactor.Bind(wx.EVT_SIZE, self.OnSize) | 1031 | + # self.interactor.Bind(wx.EVT_SIZE, self.OnSize) |
1034 | 1032 | ||
1035 | def LoadImagedata(self, mask_dict): | 1033 | def LoadImagedata(self, mask_dict): |
1036 | self.SetInput(mask_dict) | 1034 | self.SetInput(mask_dict) |
@@ -1071,7 +1069,7 @@ class Viewer(wx.Panel): | @@ -1071,7 +1069,7 @@ class Viewer(wx.Panel): | ||
1071 | x, y = const.TEXT_POS_LEFT_DOWN | 1069 | x, y = const.TEXT_POS_LEFT_DOWN |
1072 | slice_data.text.SetPosition((x+slice_xi,y+slice_yi)) | 1070 | slice_data.text.SetPosition((x+slice_xi,y+slice_yi)) |
1073 | slice_data.SetCursor(self.__create_cursor()) | 1071 | slice_data.SetCursor(self.__create_cursor()) |
1074 | - slice_data.SetSize((w, h)) | 1072 | + # slice_data.SetSize((w, h)) |
1075 | self.__update_camera(slice_data) | 1073 | self.__update_camera(slice_data) |
1076 | 1074 | ||
1077 | style = 0 | 1075 | style = 0 |
@@ -1085,7 +1083,7 @@ class Viewer(wx.Panel): | @@ -1085,7 +1083,7 @@ class Viewer(wx.Panel): | ||
1085 | if i == self.layout[0] - 1: | 1083 | if i == self.layout[0] - 1: |
1086 | style = style | sd.BORDER_RIGHT | 1084 | style = style | sd.BORDER_RIGHT |
1087 | 1085 | ||
1088 | - slice_data.SetBorderStyle(style) | 1086 | + # slice_data.SetBorderStyle(style) |
1089 | n += 1 | 1087 | n += 1 |
1090 | 1088 | ||
1091 | def __create_cursor(self): | 1089 | def __create_cursor(self): |
@@ -1112,6 +1110,7 @@ class Viewer(wx.Panel): | @@ -1112,6 +1110,7 @@ class Viewer(wx.Panel): | ||
1112 | 1110 | ||
1113 | self.canvas = CanvasRendererCTX(self, self.slice_data.renderer, self.slice_data.canvas_renderer, self.orientation) | 1111 | self.canvas = CanvasRendererCTX(self, self.slice_data.renderer, self.slice_data.canvas_renderer, self.orientation) |
1114 | self.canvas.draw_list.append(self.slice_data.text) | 1112 | self.canvas.draw_list.append(self.slice_data.text) |
1113 | + self.canvas.draw_list.append(self.slice_data) | ||
1115 | 1114 | ||
1116 | # Set the slice number to the last slice to ensure the camera if far | 1115 | # Set the slice number to the last slice to ensure the camera if far |
1117 | # enough to show all slices. | 1116 | # enough to show all slices. |
@@ -1207,10 +1206,10 @@ class Viewer(wx.Panel): | @@ -1207,10 +1206,10 @@ class Viewer(wx.Panel): | ||
1207 | slice_data.canvas_renderer = canvas_renderer | 1206 | slice_data.canvas_renderer = canvas_renderer |
1208 | slice_data.overlay_renderer = overlay_renderer | 1207 | slice_data.overlay_renderer = overlay_renderer |
1209 | slice_data.actor = actor | 1208 | slice_data.actor = actor |
1210 | - slice_data.SetBorderStyle(sd.BORDER_ALL) | 1209 | + # slice_data.SetBorderStyle(sd.BORDER_ALL) |
1211 | renderer.AddActor(actor) | 1210 | renderer.AddActor(actor) |
1212 | # renderer.AddActor(slice_data.text.actor) | 1211 | # renderer.AddActor(slice_data.text.actor) |
1213 | - renderer.AddViewProp(slice_data.box_actor) | 1212 | + # renderer.AddViewProp(slice_data.box_actor) |
1214 | 1213 | ||
1215 | return slice_data | 1214 | return slice_data |
1216 | 1215 |
invesalius/gui/widgets/canvas_renderer.py
@@ -586,7 +586,9 @@ class CanvasRendererCTX: | @@ -586,7 +586,9 @@ class CanvasRendererCTX: | ||
586 | 586 | ||
587 | return (xi, yi, xf, yf) | 587 | return (xi, yi, xf, yf) |
588 | 588 | ||
589 | - def draw_rectangle(self, pos, width, height, line_colour=(255, 0, 0, 128), fill_colour=(0, 0, 0, 0)): | 589 | + def draw_rectangle(self, pos, width, height, line_colour=(255, 0, 0, 128), |
590 | + fill_colour=(0, 0, 0, 0), line_width=1, pen_style=wx.PENSTYLE_SOLID, | ||
591 | + brush_style=wx.BRUSHSTYLE_SOLID): | ||
590 | """ | 592 | """ |
591 | Draw a rectangle with its top left at pos and with the given width and height. | 593 | Draw a rectangle with its top left at pos and with the given width and height. |
592 | 594 | ||
@@ -603,9 +605,11 @@ class CanvasRendererCTX: | @@ -603,9 +605,11 @@ class CanvasRendererCTX: | ||
603 | 605 | ||
604 | px, py = pos | 606 | px, py = pos |
605 | py = -py | 607 | py = -py |
606 | - gc.SetPen(wx.Pen(wx.Colour(*line_colour))) | ||
607 | - gc.SetBrush(wx.Brush(wx.Colour(*fill_colour))) | ||
608 | - gc.DrawRectangle(px, py, width, height) | 608 | + pen = wx.Pen(wx.Colour(*line_colour), width=line_width, style=pen_style) |
609 | + brush = wx.Brush(wx.Colour(*fill_colour), style=brush_style) | ||
610 | + gc.SetPen(pen) | ||
611 | + gc.SetBrush(brush) | ||
612 | + gc.DrawRectangle(px, py, width, -height) | ||
609 | self._drawn = True | 613 | self._drawn = True |
610 | 614 | ||
611 | def draw_text(self, text, pos, font=None, txt_colour=(255, 255, 255)): | 615 | def draw_text(self, text, pos, font=None, txt_colour=(255, 255, 255)): |
@@ -666,7 +670,7 @@ class CanvasRendererCTX: | @@ -666,7 +670,7 @@ class CanvasRendererCTX: | ||
666 | 670 | ||
667 | # Drawing the box | 671 | # Drawing the box |
668 | cw, ch = w + border * 2, h + border * 2 | 672 | cw, ch = w + border * 2, h + border * 2 |
669 | - self.draw_rectangle((px, py), cw, ch, bg_colour, bg_colour) | 673 | + self.draw_rectangle((px, py - ch), cw, ch, bg_colour, bg_colour) |
670 | 674 | ||
671 | # Drawing the text | 675 | # Drawing the text |
672 | tpx, tpy = px + border, py - border | 676 | tpx, tpy = px + border, py - border |
@@ -817,7 +821,7 @@ class TextBox(CanvasHandlerBase): | @@ -817,7 +821,7 @@ class TextBox(CanvasHandlerBase): | ||
817 | bg_colour=self.box_colour) | 821 | bg_colour=self.box_colour) |
818 | if self._highlight: | 822 | if self._highlight: |
819 | rw, rh = canvas.evt_renderer.GetSize() | 823 | rw, rh = canvas.evt_renderer.GetSize() |
820 | - canvas.draw_rectangle((px, py), w, h, | 824 | + canvas.draw_rectangle((px, py - h), w, h, |
821 | (255, 0, 0, 25), | 825 | (255, 0, 0, 25), |
822 | (255, 0, 0, 25)) | 826 | (255, 0, 0, 25)) |
823 | 827 |