Commit aff7c8adc60487090638fbb50f526a6938cbdb6b

Authored by Thiago Franco de Moraes
1 parent 7c25cbf9
Exists in select_part

Better method to get the position of the clicked voxel

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