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 | 1966 | if (self.viewer.slice_.buffer_slices[self.orientation].mask is None): |
| 1967 | 1967 | return |
| 1968 | 1968 | |
| 1969 | - viewer = self.viewer | |
| 1970 | - iren = viewer.interactor | |
| 1971 | - | |
| 1969 | + iren = self.viewer.interactor | |
| 1972 | 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 | 1973 | mask = self.viewer.slice_.current_mask.matrix[1:, 1:, 1:] |
| 1988 | - x, y, z = self.calcultate_scroll_position(position) | |
| 1989 | 1974 | |
| 1990 | 1975 | bstruct = np.array(generate_binary_structure(3, CON3D[self.config.con_3d]), dtype='uint8') |
| 1991 | 1976 | self.viewer.slice_.do_threshold_to_all_slices() |
| ... | ... | @@ -2009,42 +1994,6 @@ class SelectMaskPartsInteractorStyle(DefaultInteractorStyle): |
| 2009 | 1994 | |
| 2010 | 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 | 1998 | def get_style(style): |
| 2050 | 1999 | STYLES = { | ... | ... |
invesalius/data/viewer_slice.py
| ... | ... | @@ -977,9 +977,12 @@ class Viewer(wx.Panel): |
| 977 | 977 | my = round((z - zi)/self.slice_.spacing[2], 0) |
| 978 | 978 | return my, mx |
| 979 | 979 | |
| 980 | - def get_coordinate_cursor(self): | |
| 980 | + def get_coordinate_cursor(self, picker=None): | |
| 981 | 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 | 986 | bounds = self.slice_data.actor.GetBounds() |
| 984 | 987 | if bounds[0] == bounds[1]: |
| 985 | 988 | x = bounds[0] |
| ... | ... | @@ -989,11 +992,14 @@ class Viewer(wx.Panel): |
| 989 | 992 | z = bounds[4] |
| 990 | 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 | 996 | # Find position |
| 994 | 997 | actor = slice_data.actor |
| 995 | 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 | 1004 | # First we fix the position origin, based on vtkActor bounds |
| 999 | 1005 | bounds = actor.GetBounds() |
| ... | ... | @@ -1023,6 +1029,41 @@ class Viewer(wx.Panel): |
| 1023 | 1029 | |
| 1024 | 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 | 1067 | def __bind_events(self): |
| 1027 | 1068 | Publisher.subscribe(self.LoadImagedata, |
| 1028 | 1069 | 'Load slice to viewer') | ... | ... |