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') |