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 |