Commit aff7c8adc60487090638fbb50f526a6938cbdb6b
1 parent
7c25cbf9
Exists in
select_part
Better method to get the position of the clicked voxel
Showing
2 changed files
with
47 additions
and
57 deletions
Show diff stats
invesalius/data/styles.py
@@ -1966,26 +1966,11 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): | @@ -1966,26 +1966,11 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): | ||
1966 | if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): | 1966 | if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): |
1967 | return | 1967 | return |
1968 | 1968 | ||
1969 | - viewer = self.viewer | ||
1970 | - iren = viewer.interactor | ||
1971 | - | 1969 | + iren = self.viewer.interactor |
1972 | mouse_x, mouse_y = iren.GetEventPosition() | 1970 | mouse_x, mouse_y = iren.GetEventPosition() |
1973 | - render = iren.FindPokedRenderer(mouse_x, mouse_y) | ||
1974 | - slice_data = viewer.get_slice_data(render) | ||
1975 | - | ||
1976 | - self.picker.Pick(mouse_x, mouse_y, 0, render) | ||
1977 | - | ||
1978 | - coord = self.get_coordinate_cursor() | ||
1979 | - position = slice_data.actor.GetInput().FindPoint(coord) | ||
1980 | - | ||
1981 | - if position != -1: | ||
1982 | - coord = slice_data.actor.GetInput().GetPoint(position) | ||
1983 | - | ||
1984 | - if position < 0: | ||
1985 | - position = viewer.calculate_matrix_position(coord) | 1971 | + x, y, z = self.viewer.get_voxel_clicked(mouse_x, mouse_y, self.picker) |
1986 | 1972 | ||
1987 | mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] | 1973 | mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] |
1988 | - x, y, z = self.calcultate_scroll_position(position) | ||
1989 | 1974 | ||
1990 | bstruct = np.array(generate_binary_structure(3, CON3D[self.config.con_3d]), dtype='uint8') | 1975 | bstruct = np.array(generate_binary_structure(3, CON3D[self.config.con_3d]), dtype='uint8') |
1991 | self.viewer.slice_.do_threshold_to_all_slices() | 1976 | self.viewer.slice_.do_threshold_to_all_slices() |
@@ -2009,42 +1994,6 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): | @@ -2009,42 +1994,6 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): | ||
2009 | 1994 | ||
2010 | self.config.mask = mask | 1995 | self.config.mask = mask |
2011 | 1996 | ||
2012 | - def get_coordinate_cursor(self): | ||
2013 | - # Find position | ||
2014 | - x, y, z = self.picker.GetPickPosition() | ||
2015 | - bounds = self.viewer.slice_data.actor.GetBounds() | ||
2016 | - if bounds[0] == bounds[1]: | ||
2017 | - x = bounds[0] | ||
2018 | - elif bounds[2] == bounds[3]: | ||
2019 | - y = bounds[2] | ||
2020 | - elif bounds[4] == bounds[5]: | ||
2021 | - z = bounds[4] | ||
2022 | - return x, y, z | ||
2023 | - | ||
2024 | - def calcultate_scroll_position(self, position): | ||
2025 | - # Based in the given coord (x, y, z), returns a list with the scroll positions for each | ||
2026 | - # orientation, being the first position the sagital, second the coronal | ||
2027 | - # and the last, axial. | ||
2028 | - | ||
2029 | - if self.orientation == 'AXIAL': | ||
2030 | - image_width = self.slice_actor.GetInput().GetDimensions()[0] | ||
2031 | - axial = self.slice_data.number | ||
2032 | - coronal = position / image_width | ||
2033 | - sagital = position % image_width | ||
2034 | - | ||
2035 | - elif self.orientation == 'CORONAL': | ||
2036 | - image_width = self.slice_actor.GetInput().GetDimensions()[0] | ||
2037 | - axial = position / image_width | ||
2038 | - coronal = self.slice_data.number | ||
2039 | - sagital = position % image_width | ||
2040 | - | ||
2041 | - elif self.orientation == 'SAGITAL': | ||
2042 | - image_width = self.slice_actor.GetInput().GetDimensions()[1] | ||
2043 | - axial = position / image_width | ||
2044 | - coronal = position % image_width | ||
2045 | - sagital = self.slice_data.number | ||
2046 | - | ||
2047 | - return sagital, coronal, axial | ||
2048 | 1997 | ||
2049 | def get_style(style): | 1998 | def get_style(style): |
2050 | STYLES = { | 1999 | STYLES = { |
invesalius/data/viewer_slice.py
@@ -977,9 +977,12 @@ class Viewer(wx.Panel): | @@ -977,9 +977,12 @@ class Viewer(wx.Panel): | ||
977 | my = round((z - zi)/self.slice_.spacing[2], 0) | 977 | my = round((z - zi)/self.slice_.spacing[2], 0) |
978 | return my, mx | 978 | return my, mx |
979 | 979 | ||
980 | - def get_coordinate_cursor(self): | 980 | + def get_coordinate_cursor(self, picker=None): |
981 | # Find position | 981 | # Find position |
982 | - x, y, z = self.pick.GetPickPosition() | 982 | + if picker is None: |
983 | + picker = self.pick | ||
984 | + | ||
985 | + x, y, z = picker.GetPickPosition() | ||
983 | bounds = self.slice_data.actor.GetBounds() | 986 | bounds = self.slice_data.actor.GetBounds() |
984 | if bounds[0] == bounds[1]: | 987 | if bounds[0] == bounds[1]: |
985 | x = bounds[0] | 988 | x = bounds[0] |
@@ -989,11 +992,14 @@ class Viewer(wx.Panel): | @@ -989,11 +992,14 @@ class Viewer(wx.Panel): | ||
989 | z = bounds[4] | 992 | z = bounds[4] |
990 | return x, y, z | 993 | return x, y, z |
991 | 994 | ||
992 | - def get_coordinate_cursor_edition(self, slice_data): | 995 | + def get_coordinate_cursor_edition(self, slice_data, picker=None): |
993 | # Find position | 996 | # Find position |
994 | actor = slice_data.actor | 997 | actor = slice_data.actor |
995 | slice_number = slice_data.number | 998 | slice_number = slice_data.number |
996 | - x, y, z = self.pick.GetPickPosition() | 999 | + if picker is None: |
1000 | + picker = self.pick | ||
1001 | + | ||
1002 | + x, y, z = picker.GetPickPosition() | ||
997 | 1003 | ||
998 | # First we fix the position origin, based on vtkActor bounds | 1004 | # First we fix the position origin, based on vtkActor bounds |
999 | bounds = actor.GetBounds() | 1005 | bounds = actor.GetBounds() |
@@ -1023,6 +1029,41 @@ class Viewer(wx.Panel): | @@ -1023,6 +1029,41 @@ class Viewer(wx.Panel): | ||
1023 | 1029 | ||
1024 | return x, y, z | 1030 | return x, y, z |
1025 | 1031 | ||
1032 | + def get_voxel_clicked(self, mx, my, picker=None): | ||
1033 | + """ | ||
1034 | + Given the (mx, my) mouse clicked position returns the voxel coordinate | ||
1035 | + of the voxel at (that mx, my) position. | ||
1036 | + | ||
1037 | + Parameters: | ||
1038 | + mx (int): x position. | ||
1039 | + my (int): y position | ||
1040 | + picker: the picker used to get calculate the voxel coordinate. | ||
1041 | + | ||
1042 | + Returns: | ||
1043 | + voxel_coordinate (x, y, z): voxel coordinate inside the matrix. Can | ||
1044 | + be used to access the voxel value inside the matrix. | ||
1045 | + """ | ||
1046 | + if picker is None: | ||
1047 | + picker = self.pick | ||
1048 | + | ||
1049 | + slice_data = self.slice_data | ||
1050 | + renderer = slice_data.renderer | ||
1051 | + | ||
1052 | + picker.Pick(mx, my, 0, renderer) | ||
1053 | + | ||
1054 | + coord = self.get_coordinate_cursor(picker) | ||
1055 | + position = slice_data.actor.GetInput().FindPoint(coord) | ||
1056 | + | ||
1057 | + if position != -1: | ||
1058 | + coord = slice_data.actor.GetInput().GetPoint(position) | ||
1059 | + | ||
1060 | + if position < 0: | ||
1061 | + position = viewer.calculate_matrix_position(coord) | ||
1062 | + | ||
1063 | + x, y, z = self.calcultate_scroll_position(position) | ||
1064 | + | ||
1065 | + return (x, y, z) | ||
1066 | + | ||
1026 | def __bind_events(self): | 1067 | def __bind_events(self): |
1027 | Publisher.subscribe(self.LoadImagedata, | 1068 | Publisher.subscribe(self.LoadImagedata, |
1028 | 'Load slice to viewer') | 1069 | 'Load slice to viewer') |