Commit 89ea441d62d2397afb94f7692deb32f600f2e4c7
1 parent
0439d030
Exists in
get_pixel
Simplified get positions in viewer_slice
Showing
2 changed files
with
50 additions
and
44 deletions
Show diff stats
invesalius/data/styles.py
| @@ -1162,12 +1162,13 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): | @@ -1162,12 +1162,13 @@ class WaterShedInteractorStyle(DefaultInteractorStyle): | ||
| 1162 | render = iren.FindPokedRenderer(mouse_x, mouse_y) | 1162 | render = iren.FindPokedRenderer(mouse_x, mouse_y) |
| 1163 | slice_data = viewer.get_slice_data(render) | 1163 | slice_data = viewer.get_slice_data(render) |
| 1164 | 1164 | ||
| 1165 | - coord = self.viewer.get_coord_inside_volume(mouse_x, mouse_y, picker=None) | 1165 | + coord = self.viewer.get_coord_inside_volume(mouse_x, mouse_y, self.picker) |
| 1166 | slice_data.cursor.SetPosition(coord) | 1166 | slice_data.cursor.SetPosition(coord) |
| 1167 | 1167 | ||
| 1168 | if (self.left_pressed): | 1168 | if (self.left_pressed): |
| 1169 | cursor = slice_data.cursor | 1169 | cursor = slice_data.cursor |
| 1170 | - position = self.viewer.get_slice_pixel_coord_by_screen_pos(mouse_x, mouse_y, self.picker) | 1170 | + position = self.viewer.get_slice_pixel_coord_by_world_pos(*coord) |
| 1171 | + print ">>>", position | ||
| 1171 | radius = cursor.radius | 1172 | radius = cursor.radius |
| 1172 | 1173 | ||
| 1173 | if position < 0: | 1174 | if position < 0: |
invesalius/data/viewer_slice.py
| @@ -940,25 +940,23 @@ class Viewer(wx.Panel): | @@ -940,25 +940,23 @@ class Viewer(wx.Panel): | ||
| 940 | # WARN: Return the only slice_data used in this slice_viewer. | 940 | # WARN: Return the only slice_data used in this slice_viewer. |
| 941 | return self.slice_data | 941 | return self.slice_data |
| 942 | 942 | ||
| 943 | - def calcultate_scroll_position(self, position): | ||
| 944 | - # Based in the given coord (x, y, z), returns a list with the scroll positions for each | 943 | + def calcultate_scroll_position(self, x, y): |
| 944 | + # Based in the given coord (x, y), returns a list with the scroll positions for each | ||
| 945 | # orientation, being the first position the sagital, second the coronal | 945 | # orientation, being the first position the sagital, second the coronal |
| 946 | # and the last, axial. | 946 | # and the last, axial. |
| 947 | - image_width = self.slice_.buffer_slices[self.orientation].image.shape[1] | ||
| 948 | - | ||
| 949 | if self.orientation == 'AXIAL': | 947 | if self.orientation == 'AXIAL': |
| 950 | axial = self.slice_data.number | 948 | axial = self.slice_data.number |
| 951 | - coronal = position / image_width | ||
| 952 | - sagital = position % image_width | 949 | + coronal = y |
| 950 | + sagital = x | ||
| 953 | 951 | ||
| 954 | elif self.orientation == 'CORONAL': | 952 | elif self.orientation == 'CORONAL': |
| 955 | - axial = position / image_width | 953 | + axial = y |
| 956 | coronal = self.slice_data.number | 954 | coronal = self.slice_data.number |
| 957 | - sagital = position % image_width | 955 | + sagital = x |
| 958 | 956 | ||
| 959 | elif self.orientation == 'SAGITAL': | 957 | elif self.orientation == 'SAGITAL': |
| 960 | - axial = position / image_width | ||
| 961 | - coronal = position % image_width | 958 | + axial = y |
| 959 | + coronal = x | ||
| 962 | sagital = self.slice_data.number | 960 | sagital = self.slice_data.number |
| 963 | 961 | ||
| 964 | return sagital, coronal, axial | 962 | return sagital, coronal, axial |
| @@ -975,7 +973,7 @@ class Viewer(wx.Panel): | @@ -975,7 +973,7 @@ class Viewer(wx.Panel): | ||
| 975 | elif self.orientation == 'SAGITAL': | 973 | elif self.orientation == 'SAGITAL': |
| 976 | mx = round((y - yi)/self.slice_.spacing[1], 0) | 974 | mx = round((y - yi)/self.slice_.spacing[1], 0) |
| 977 | my = round((z - zi)/self.slice_.spacing[2], 0) | 975 | my = round((z - zi)/self.slice_.spacing[2], 0) |
| 978 | - return my, mx | 976 | + return mx, my |
| 979 | 977 | ||
| 980 | def get_coordinate_cursor(self, picker=None): | 978 | def get_coordinate_cursor(self, picker=None): |
| 981 | # Find position | 979 | # Find position |
| @@ -1051,19 +1049,31 @@ class Viewer(wx.Panel): | @@ -1051,19 +1049,31 @@ class Viewer(wx.Panel): | ||
| 1051 | 1049 | ||
| 1052 | picker.Pick(mx, my, 0, renderer) | 1050 | picker.Pick(mx, my, 0, renderer) |
| 1053 | 1051 | ||
| 1054 | - coord = self.get_coordinate_cursor(picker) | ||
| 1055 | - position = slice_data.actor.GetInput().FindPoint(coord) | 1052 | + wx, wy, wz = self.get_coordinate_cursor(picker) |
| 1053 | + x, y, z = self.get_voxel_coord_by_world_pos(wx, wy, wz) | ||
| 1056 | 1054 | ||
| 1057 | - if position != -1: | ||
| 1058 | - coord = slice_data.actor.GetInput().GetPoint(position) | 1055 | + return (x, y, z) |
| 1056 | + | ||
| 1057 | + def get_voxel_coord_by_world_pos(self, wx, wy, wz): | ||
| 1058 | + """ | ||
| 1059 | + Given the (x, my) screen position returns the voxel coordinate | ||
| 1060 | + of the voxel at (that mx, my) position. | ||
| 1059 | 1061 | ||
| 1060 | - if position < 0: | ||
| 1061 | - position = viewer.calculate_matrix_position(coord) | 1062 | + Parameters: |
| 1063 | + wx (float): x position. | ||
| 1064 | + wy (float): y position | ||
| 1065 | + wz (float): z position | ||
| 1062 | 1066 | ||
| 1063 | - x, y, z = self.calcultate_scroll_position(position) | 1067 | + Returns: |
| 1068 | + voxel_coordinate (x, y, z): voxel coordinate inside the matrix. Can | ||
| 1069 | + be used to access the voxel value inside the matrix. | ||
| 1070 | + """ | ||
| 1071 | + px, py = self.get_slice_pixel_coord_by_world_pos(wx, wy, wz) | ||
| 1072 | + x, y, z = self.calcultate_scroll_position(px, py) | ||
| 1064 | 1073 | ||
| 1065 | return (x, y, z) | 1074 | return (x, y, z) |
| 1066 | 1075 | ||
| 1076 | + | ||
| 1067 | def get_slice_pixel_coord_by_screen_pos(self, mx, my, picker=None): | 1077 | def get_slice_pixel_coord_by_screen_pos(self, mx, my, picker=None): |
| 1068 | """ | 1078 | """ |
| 1069 | Given the (mx, my) screen position returns the pixel coordinate | 1079 | Given the (mx, my) screen position returns the pixel coordinate |
| @@ -1086,32 +1096,27 @@ class Viewer(wx.Panel): | @@ -1086,32 +1096,27 @@ class Viewer(wx.Panel): | ||
| 1086 | 1096 | ||
| 1087 | picker.Pick(mx, my, 0, renderer) | 1097 | picker.Pick(mx, my, 0, renderer) |
| 1088 | 1098 | ||
| 1089 | - coord = self.get_coordinate_cursor(picker) | ||
| 1090 | - position = slice_data.actor.GetInput().FindPoint(coord) | 1099 | + wx, wy, wz = self.get_coordinate_cursor(picker) |
| 1100 | + return self.get_slice_pixel_coord_by_world_pos(wx, wy, wz) | ||
| 1091 | 1101 | ||
| 1092 | - if position != -1: | ||
| 1093 | - coord = slice_data.actor.GetInput().GetPoint(position) | 1102 | + return px, py |
| 1094 | 1103 | ||
| 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] | 1104 | + def get_slice_pixel_coord_by_world_pos(self, wx, wy, wz): |
| 1105 | + """ | ||
| 1106 | + Given the (wx, wy, wz) world position returns the pixel coordinate | ||
| 1107 | + of the slice at (that mx, my) position. | ||
| 1108 | + | ||
| 1109 | + Parameters: | ||
| 1110 | + mx (int): x position. | ||
| 1111 | + my (int): y position | ||
| 1112 | + picker: the picker used to get calculate the pixel coordinate. | ||
| 1113 | + | ||
| 1114 | + Returns: | ||
| 1115 | + voxel_coordinate (x, y): voxel coordinate inside the matrix. Can | ||
| 1116 | + be used to access the voxel value inside the matrix. | ||
| 1117 | + """ | ||
| 1118 | + coord = wx, wy, wz | ||
| 1119 | + px, py = self.calculate_matrix_position(coord) | ||
| 1115 | 1120 | ||
| 1116 | return px, py | 1121 | return px, py |
| 1117 | 1122 |