Commit 6a2fe195f10ee152dee13c99203f19c8eda531e8
1 parent
8cb54de9
Exists in
master
and in
68 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() |