Commit 6a2fe195f10ee152dee13c99203f19c8eda531e8
1 parent
8cb54de9
Exists in
master
and in
6 other branches
FIX: Not raising a exception when removing a point anterior to a selected one
Showing
1 changed file
with
60 additions
and
59 deletions
Show diff stats
invesalius/gui/widgets/clut_raycasting.py
@@ -33,8 +33,8 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -33,8 +33,8 @@ class CLUTRaycastingWidget(wx.Panel): | ||
33 | parent -- parent of this frame | 33 | parent -- parent of this frame |
34 | """ | 34 | """ |
35 | super(CLUTRaycastingWidget, self).__init__(parent, id) | 35 | super(CLUTRaycastingWidget, self).__init__(parent, id) |
36 | - self.points = []#plistlib.readPlist(sys.argv[-1])['16bitClutCurves'] | ||
37 | - self.colours = []#plistlib.readPlist(sys.argv[-1])['16bitClutColors'] | 36 | + self.points = [] |
37 | + self.colours = [] | ||
38 | self.init = -1024 | 38 | self.init = -1024 |
39 | self.end = 2000 | 39 | self.end = 2000 |
40 | self.padding = 5 | 40 | self.padding = 5 |
@@ -43,17 +43,10 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -43,17 +43,10 @@ class CLUTRaycastingWidget(wx.Panel): | ||
43 | self.histogram_pixel_points = [[0,0]] | 43 | self.histogram_pixel_points = [[0,0]] |
44 | self.histogram_array = [100,100] | 44 | self.histogram_array = [100,100] |
45 | self.CreatePixelArray() | 45 | self.CreatePixelArray() |
46 | - #self.sizer = wx.BoxSizer(wx.HORIZONTAL) | ||
47 | - #self.SetSizer(self.sizer) | ||
48 | - #self.DrawControls() | ||
49 | self.dragged = False | 46 | self.dragged = False |
50 | self.point_dragged = None | 47 | self.point_dragged = None |
51 | - self.DoBind() | ||
52 | - #self.__bind_events() | ||
53 | - #self.SetAutoLayout(True) | ||
54 | - #self.sizer.Fit(self) | 48 | + self.__bind_events_wx() |
55 | self.Show() | 49 | self.Show() |
56 | - #self.LoadVolume() | ||
57 | 50 | ||
58 | def SetRange(self, range): | 51 | def SetRange(self, range): |
59 | self.init, self.end = range | 52 | self.init, self.end = range |
@@ -63,7 +56,7 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -63,7 +56,7 @@ class CLUTRaycastingWidget(wx.Panel): | ||
63 | def SetPadding(self, padding): | 56 | def SetPadding(self, padding): |
64 | self.padding = padding | 57 | self.padding = padding |
65 | 58 | ||
66 | - def DoBind(self): | 59 | + def __bind_events_wx(self): |
67 | self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) | 60 | self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) |
68 | self.Bind(wx.EVT_LEFT_DOWN , self.OnClick) | 61 | self.Bind(wx.EVT_LEFT_DOWN , self.OnClick) |
69 | self.Bind(wx.EVT_LEFT_DCLICK , self.OnDoubleClick) | 62 | self.Bind(wx.EVT_LEFT_DCLICK , self.OnDoubleClick) |
@@ -102,6 +95,9 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -102,6 +95,9 @@ class CLUTRaycastingWidget(wx.Panel): | ||
102 | evt.Skip() | 95 | evt.Skip() |
103 | 96 | ||
104 | def OnDoubleClick(self, evt): | 97 | def OnDoubleClick(self, evt): |
98 | + """ | ||
99 | + Used to change the colour of a point | ||
100 | + """ | ||
105 | point = self._has_clicked_in_a_point(evt.GetPositionTuple()) | 101 | point = self._has_clicked_in_a_point(evt.GetPositionTuple()) |
106 | if point: | 102 | if point: |
107 | colour = wx.GetColourFromUser(self) | 103 | colour = wx.GetColourFromUser(self) |
@@ -117,45 +113,15 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -117,45 +113,15 @@ class CLUTRaycastingWidget(wx.Panel): | ||
117 | return | 113 | return |
118 | evt.Skip() | 114 | evt.Skip() |
119 | 115 | ||
120 | - def _has_clicked_in_a_point(self, position): | 116 | + def OnRighClick(self, evt): |
121 | """ | 117 | """ |
122 | - returns the index from the selected point | 118 | + Used to remove a point |
123 | """ | 119 | """ |
124 | - for i,curve in enumerate(self.pixels_points): | ||
125 | - for j,point in enumerate(curve): | ||
126 | - if self._calculate_distance(point, position) <= RADIUS: | ||
127 | - return (i, j) | ||
128 | - return None | ||
129 | - | ||
130 | - def _has_clicked_in_line(self, position): | ||
131 | - for n, point in enumerate(self.pixels_points): | ||
132 | - p = bisect.bisect([i[0] for i in point], position[0]) | ||
133 | - print p | ||
134 | - if p != 0 and p != len(point): | ||
135 | - x1, y1 = point[p-1] | ||
136 | - x2, y2 = position | ||
137 | - x3, y3 = point[p] | ||
138 | - if int(float(x2 - x1) / (x3 - x2)) - int(float(y2 - y1) / (y3 - y2)) == 0: | ||
139 | - return (n, p) | ||
140 | - return None | ||
141 | - | ||
142 | - def _calculate_distance(self, p1, p2): | ||
143 | - return ((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) ** 0.5 | ||
144 | - | ||
145 | - def OnRighClick(self, evt): | ||
146 | point = self._has_clicked_in_a_point(evt.GetPositionTuple()) | 120 | point = self._has_clicked_in_a_point(evt.GetPositionTuple()) |
147 | if point: | 121 | if point: |
148 | i, j = point | 122 | i, j = point |
149 | print "RightClick", i, j | 123 | print "RightClick", i, j |
150 | - self.pixels_points[i].pop(j) | ||
151 | - self.points[i].pop(j) | ||
152 | - self.colours[i].pop(j) | ||
153 | - if (i, j) == self.point_dragged: | ||
154 | - self.point_dragged = None | ||
155 | - if len(self.points[i]) == 1: | ||
156 | - self.points.pop(i) | ||
157 | - self.pixels_points.pop(i) | ||
158 | - self.colours.pop(i) | 124 | + self.RemovePoint(i, j) |
159 | self.Refresh() | 125 | self.Refresh() |
160 | nevt = CLUTEvent(myEVT_CLUT_POINT_CHANGED, self.GetId()) | 126 | nevt = CLUTEvent(myEVT_CLUT_POINT_CHANGED, self.GetId()) |
161 | self.GetEventHandler().ProcessEvent(nevt) | 127 | self.GetEventHandler().ProcessEvent(nevt) |
@@ -226,7 +192,7 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -226,7 +192,7 @@ class CLUTRaycastingWidget(wx.Panel): | ||
226 | def OnSize(self, evt): | 192 | def OnSize(self, evt): |
227 | self.CreatePixelArray() | 193 | self.CreatePixelArray() |
228 | self.Refresh() | 194 | self.Refresh() |
229 | - | 195 | + |
230 | def _draw_gradient(self, ctx, height): | 196 | def _draw_gradient(self, ctx, height): |
231 | #The gradient | 197 | #The gradient |
232 | height += self.padding | 198 | height += self.padding |
@@ -249,6 +215,55 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -249,6 +215,55 @@ class CLUTRaycastingWidget(wx.Panel): | ||
249 | ctx.close_path() | 215 | ctx.close_path() |
250 | ctx.set_source(gradient) | 216 | ctx.set_source(gradient) |
251 | ctx.fill() | 217 | ctx.fill() |
218 | + def _has_clicked_in_a_point(self, position): | ||
219 | + """ | ||
220 | + returns the index from the selected point | ||
221 | + """ | ||
222 | + for i,curve in enumerate(self.pixels_points): | ||
223 | + for j,point in enumerate(curve): | ||
224 | + if self._calculate_distance(point, position) <= RADIUS: | ||
225 | + return (i, j) | ||
226 | + return None | ||
227 | + | ||
228 | + def _has_clicked_in_line(self, position): | ||
229 | + for n, point in enumerate(self.pixels_points): | ||
230 | + p = bisect.bisect([i[0] for i in point], position[0]) | ||
231 | + print p | ||
232 | + if p != 0 and p != len(point): | ||
233 | + x1, y1 = point[p-1] | ||
234 | + x2, y2 = position | ||
235 | + x3, y3 = point[p] | ||
236 | + if int(float(x2 - x1) / (x3 - x2)) - int(float(y2 - y1) / (y3 - y2)) == 0: | ||
237 | + return (n, p) | ||
238 | + return None | ||
239 | + | ||
240 | + def _calculate_distance(self, p1, p2): | ||
241 | + return ((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) ** 0.5 | ||
242 | + | ||
243 | + def RemovePoint(self, i, j): | ||
244 | + """ | ||
245 | + The point the point in the given i,j index | ||
246 | + """ | ||
247 | + self.pixels_points[i].pop(j) | ||
248 | + self.points[i].pop(j) | ||
249 | + self.colours[i].pop(j) | ||
250 | + # If the point to removed is that was selected before and have a | ||
251 | + # textbox, then remove the point and the textbox | ||
252 | + if (i, j) == self.point_dragged: | ||
253 | + self.point_dragged = None | ||
254 | + # If there is textbox and the point to remove is before it, then | ||
255 | + # decrement the index referenced to point that have the textbox. | ||
256 | + elif self.point_dragged and i == self.point_dragged[0] \ | ||
257 | + and j < self.point_dragged[1]: | ||
258 | + new_i = self.point_dragged[0] | ||
259 | + new_j = self.point_dragged[1] - 1 | ||
260 | + self.point_dragged = (new_i, new_j) | ||
261 | + # Can't have only one point in the curve | ||
262 | + if len(self.points[i]) == 1: | ||
263 | + self.points.pop(i) | ||
264 | + self.pixels_points.pop(i) | ||
265 | + self.colours.pop(i) | ||
266 | + self.point_dragged = None | ||
252 | 267 | ||
253 | def _draw_curves(self, ctx): | 268 | def _draw_curves(self, ctx): |
254 | #Drawing the lines | 269 | #Drawing the lines |
@@ -388,7 +403,6 @@ class CLUTRaycastingWidget(wx.Panel): | @@ -388,7 +403,6 @@ class CLUTRaycastingWidget(wx.Panel): | ||
388 | y = height - y * proportion_y | 403 | y = height - y * proportion_y |
389 | self.histogram_pixel_points.append((x, y)) | 404 | self.histogram_pixel_points.append((x, y)) |
390 | 405 | ||
391 | - | ||
392 | def CreatePixelArray(self): | 406 | def CreatePixelArray(self): |
393 | self.pixels_points = [] | 407 | self.pixels_points = [] |
394 | for curve in self.points: | 408 | for curve in self.points: |
@@ -459,16 +473,3 @@ EVT_CLUT_POINT = wx.PyEventBinder(myEVT_CLUT_POINT, 1) | @@ -459,16 +473,3 @@ EVT_CLUT_POINT = wx.PyEventBinder(myEVT_CLUT_POINT, 1) | ||
459 | # Occurs when a CLUT point was changed | 473 | # Occurs when a CLUT point was changed |
460 | myEVT_CLUT_POINT_CHANGED = wx.NewEventType() | 474 | myEVT_CLUT_POINT_CHANGED = wx.NewEventType() |
461 | EVT_CLUT_POINT_CHANGED = wx.PyEventBinder(myEVT_CLUT_POINT_CHANGED, 1) | 475 | EVT_CLUT_POINT_CHANGED = wx.PyEventBinder(myEVT_CLUT_POINT_CHANGED, 1) |
462 | - | ||
463 | -class App(wx.App): | ||
464 | - def OnInit(self): | ||
465 | - str_type = sys.argv[-1].split("/")[-1].split(".")[0] | ||
466 | - self.frame = CLUTRaycastingWidget(None, -1, "InVesalius 3 - Raycasting: "+ str_type) | ||
467 | - self.frame.SetPreset(plistlib.readPlist(sys.argv[-1])) | ||
468 | - self.frame.Center() | ||
469 | - self.SetTopWindow(self.frame) | ||
470 | - return True | ||
471 | - | ||
472 | -if __name__ == '__main__': | ||
473 | - app = App() | ||
474 | - app.MainLoop() |