Commit 0439d030316245e13c2474fea15feb2130f2fd63

Authored by Thiago Franco de Moraes
1 parent 10945a2a
Exists in get_pixel

Added a function to calculate the pixel clicked

invesalius/data/styles.py
@@ -1115,28 +1115,15 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): @@ -1115,28 +1115,15 @@ class WaterShedInteractorStyle(DefaultInteractorStyle):
1115 render = iren.FindPokedRenderer(mouse_x, mouse_y) 1115 render = iren.FindPokedRenderer(mouse_x, mouse_y)
1116 slice_data = viewer.get_slice_data(render) 1116 slice_data = viewer.get_slice_data(render)
1117 1117
1118 - # TODO: Improve!  
1119 - #for i in self.slice_data_list:  
1120 - #i.cursor.Show(0)  
1121 - slice_data.cursor.Show()  
1122 -  
1123 - self.picker.Pick(mouse_x, mouse_y, 0, render)  
1124 -  
1125 - coord = self.get_coordinate_cursor()  
1126 - position = slice_data.actor.GetInput().FindPoint(coord)  
1127 -  
1128 - if position != -1:  
1129 - coord = slice_data.actor.GetInput().GetPoint(position) 1118 + coord = self.viewer.get_coord_inside_volume(mouse_x, mouse_y, picker=None)
  1119 + position = self.viewer.get_slice_pixel_coord_by_screen_pos(mouse_x, mouse_y, self.picker)
1130 1120
  1121 + slice_data.cursor.Show()
1131 slice_data.cursor.SetPosition(coord) 1122 slice_data.cursor.SetPosition(coord)
1132 1123
1133 cursor = slice_data.cursor 1124 cursor = slice_data.cursor
1134 - position = slice_data.actor.GetInput().FindPoint(coord)  
1135 radius = cursor.radius 1125 radius = cursor.radius
1136 1126
1137 - if position < 0:  
1138 - position = viewer.calculate_matrix_position(coord)  
1139 -  
1140 operation = self.config.operation 1127 operation = self.config.operation
1141 1128
1142 if operation == BRUSH_FOREGROUND: 1129 if operation == BRUSH_FOREGROUND:
@@ -1175,31 +1162,12 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): @@ -1175,31 +1162,12 @@ class WaterShedInteractorStyle(DefaultInteractorStyle):
1175 render = iren.FindPokedRenderer(mouse_x, mouse_y) 1162 render = iren.FindPokedRenderer(mouse_x, mouse_y)
1176 slice_data = viewer.get_slice_data(render) 1163 slice_data = viewer.get_slice_data(render)
1177 1164
1178 - # TODO: Improve!  
1179 - #for i in self.slice_data_list:  
1180 - #i.cursor.Show(0)  
1181 -  
1182 - self.picker.Pick(mouse_x, mouse_y, 0, render)  
1183 -  
1184 - #if (self.pick.GetViewProp()):  
1185 - #self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_BLANK))  
1186 - #else:  
1187 - #self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT))  
1188 -  
1189 - coord = self.get_coordinate_cursor()  
1190 - position = viewer.slice_data.actor.GetInput().FindPoint(coord)  
1191 -  
1192 - # when position == -1 the cursos is not over the image, so is not  
1193 - # necessary to set the cursor position to world coordinate center of  
1194 - # pixel from slice image.  
1195 - if position != -1:  
1196 - coord = slice_data.actor.GetInput().GetPoint(position) 1165 + coord = self.viewer.get_coord_inside_volume(mouse_x, mouse_y, picker=None)
1197 slice_data.cursor.SetPosition(coord) 1166 slice_data.cursor.SetPosition(coord)
1198 - #self.__update_cursor_position(slice_data, coord)  
1199 1167
1200 if (self.left_pressed): 1168 if (self.left_pressed):
1201 cursor = slice_data.cursor 1169 cursor = slice_data.cursor
1202 - position = slice_data.actor.GetInput().FindPoint(coord) 1170 + position = self.viewer.get_slice_pixel_coord_by_screen_pos(mouse_x, mouse_y, self.picker)
1203 radius = cursor.radius 1171 radius = cursor.radius
1204 1172
1205 if position < 0: 1173 if position < 0:
@@ -1306,18 +1274,6 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): @@ -1306,18 +1274,6 @@ class WaterShedInteractorStyle(DefaultInteractorStyle):
1306 1274
1307 Publisher.sendMessage('Reload actual slice') 1275 Publisher.sendMessage('Reload actual slice')
1308 1276
1309 - def get_coordinate_cursor(self):  
1310 - # Find position  
1311 - x, y, z = self.picker.GetPickPosition()  
1312 - bounds = self.viewer.slice_data.actor.GetBounds()  
1313 - if bounds[0] == bounds[1]:  
1314 - x = bounds[0]  
1315 - elif bounds[2] == bounds[3]:  
1316 - y = bounds[2]  
1317 - elif bounds[4] == bounds[5]:  
1318 - z = bounds[4]  
1319 - return x, y, z  
1320 -  
1321 def edit_mask_pixel(self, operation, n, index, position, radius, orientation): 1277 def edit_mask_pixel(self, operation, n, index, position, radius, orientation):
1322 if orientation == 'AXIAL': 1278 if orientation == 'AXIAL':
1323 mask = self.matrix[n, :, :] 1279 mask = self.matrix[n, :, :]
@@ -1328,7 +1284,7 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): @@ -1328,7 +1284,7 @@ class WaterShedInteractorStyle(DefaultInteractorStyle):
1328 1284
1329 spacing = self.viewer.slice_.spacing 1285 spacing = self.viewer.slice_.spacing
1330 if hasattr(position, '__iter__'): 1286 if hasattr(position, '__iter__'):
1331 - py, px = position 1287 + px, py = position
1332 if orientation == 'AXIAL': 1288 if orientation == 'AXIAL':
1333 sx = spacing[0] 1289 sx = spacing[0]
1334 sy = spacing[1] 1290 sy = spacing[1]
@@ -1767,7 +1723,7 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle): @@ -1767,7 +1723,7 @@ class FloodFillMaskInteractorStyle(DefaultInteractorStyle):
1767 viewer = self.viewer 1723 viewer = self.viewer
1768 iren = viewer.interactor 1724 iren = viewer.interactor
1769 mouse_x, mouse_y = iren.GetEventPosition() 1725 mouse_x, mouse_y = iren.GetEventPosition()
1770 - x, y, z = self.viewer.get_voxel_clicked(mouse_x, mouse_y, self.picker) 1726 + x, y, z = self.viewer.get_voxel_coord_by_screen_pos(mouse_x, mouse_y, self.picker)
1771 1727
1772 mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] 1728 mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:]
1773 if mask[z, y, x] < self.t0 or mask[z, y, x] > self.t1: 1729 if mask[z, y, x] < self.t0 or mask[z, y, x] > self.t1:
@@ -1900,7 +1856,7 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): @@ -1900,7 +1856,7 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle):
1900 1856
1901 iren = self.viewer.interactor 1857 iren = self.viewer.interactor
1902 mouse_x, mouse_y = iren.GetEventPosition() 1858 mouse_x, mouse_y = iren.GetEventPosition()
1903 - x, y, z = self.viewer.get_voxel_clicked(mouse_x, mouse_y, self.picker) 1859 + x, y, z = self.viewer.get_voxel_coord_by_screen_pos(mouse_x, mouse_y, self.picker)
1904 1860
1905 mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] 1861 mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:]
1906 1862
invesalius/data/viewer_slice.py
@@ -1029,9 +1029,9 @@ class Viewer(wx.Panel): @@ -1029,9 +1029,9 @@ class Viewer(wx.Panel):
1029 1029
1030 return x, y, z 1030 return x, y, z
1031 1031
1032 - def get_voxel_clicked(self, mx, my, picker=None): 1032 + def get_voxel_coord_by_screen_pos(self, mx, my, picker=None):
1033 """ 1033 """
1034 - Given the (mx, my) mouse clicked position returns the voxel coordinate 1034 + Given the (mx, my) screen position returns the voxel coordinate
1035 of the voxel at (that mx, my) position. 1035 of the voxel at (that mx, my) position.
1036 1036
1037 Parameters: 1037 Parameters:
@@ -1064,6 +1064,74 @@ class Viewer(wx.Panel): @@ -1064,6 +1064,74 @@ class Viewer(wx.Panel):
1064 1064
1065 return (x, y, z) 1065 return (x, y, z)
1066 1066
  1067 + def get_slice_pixel_coord_by_screen_pos(self, mx, my, picker=None):
  1068 + """
  1069 + Given the (mx, my) screen position returns the pixel coordinate
  1070 + of the slice at (that mx, my) position.
  1071 +
  1072 + Parameters:
  1073 + mx (int): x position.
  1074 + my (int): y position
  1075 + picker: the picker used to get calculate the pixel coordinate.
  1076 +
  1077 + Returns:
  1078 + voxel_coordinate (x, y): voxel coordinate inside the matrix. Can
  1079 + be used to access the voxel value inside the matrix.
  1080 + """
  1081 + if picker is None:
  1082 + picker = self.pick
  1083 +
  1084 + slice_data = self.slice_data
  1085 + renderer = slice_data.renderer
  1086 +
  1087 + picker.Pick(mx, my, 0, renderer)
  1088 +
  1089 + coord = self.get_coordinate_cursor(picker)
  1090 + position = slice_data.actor.GetInput().FindPoint(coord)
  1091 +
  1092 + if position != -1:
  1093 + coord = slice_data.actor.GetInput().GetPoint(position)
  1094 +
  1095 + if position < 0:
  1096 + px, py = viewer.calculate_matrix_position(coord)
  1097 + else:
  1098 + spacing = self.slice_.spacing
  1099 + image = self.slice_.buffer_slices[self.orientation].image
  1100 + if self.orientation == 'AXIAL':
  1101 + sx = spacing[0]
  1102 + sy = spacing[1]
  1103 + py = position / image.shape[1]
  1104 + px = position % image.shape[1]
  1105 + elif self.orientation == 'CORONAL':
  1106 + sx = spacing[0]
  1107 + sy = spacing[2]
  1108 + py = position / image.shape[1]
  1109 + px = position % image.shape[1]
  1110 + elif self.orientation == 'SAGITAL':
  1111 + sx = spacing[2]
  1112 + sy = spacing[1]
  1113 + py = position / image.shape[1]
  1114 + px = position % image.shape[1]
  1115 +
  1116 + return px, py
  1117 +
  1118 + def get_coord_inside_volume(self, mx, my, picker=None):
  1119 + if picker is None:
  1120 + picker = self.pick
  1121 +
  1122 + slice_data = self.slice_data
  1123 + renderer = slice_data.renderer
  1124 +
  1125 + picker.Pick(mx, my, 0, renderer)
  1126 +
  1127 + coord = self.get_coordinate_cursor(picker)
  1128 + position = slice_data.actor.GetInput().FindPoint(coord)
  1129 +
  1130 + if position != -1:
  1131 + coord = slice_data.actor.GetInput().GetPoint(position)
  1132 +
  1133 + return coord
  1134 +
1067 def __bind_events(self): 1135 def __bind_events(self):
1068 Publisher.subscribe(self.LoadImagedata, 1136 Publisher.subscribe(self.LoadImagedata,
1069 'Load slice to viewer') 1137 'Load slice to viewer')