Commit 6dbca98b38feba54921fe2a15d1f25498b63e6bc
1 parent
6ca69379
Exists in
master
and in
67 other branches
FIX: Fixed problem change plane slices in volume view
Showing
3 changed files
with
87 additions
and
140 deletions
Show diff stats
invesalius/data/slice_.py
| ... | ... | @@ -114,6 +114,7 @@ class Slice(object): |
| 114 | 114 | 'Change colour table from background image') |
| 115 | 115 | |
| 116 | 116 | ps.Publisher().subscribe(self.InputImageWidget, 'Input Image in the widget') |
| 117 | + | |
| 117 | 118 | ps.Publisher().subscribe(self.OnExportMask,'Export mask to file') |
| 118 | 119 | |
| 119 | 120 | ps.Publisher().subscribe(self.OnCloseProject, 'Close project data') |
| ... | ... | @@ -123,7 +124,8 @@ class Slice(object): |
| 123 | 124 | |
| 124 | 125 | ps.Publisher().subscribe(self.OnRemoveMasks, 'Remove masks') |
| 125 | 126 | ps.Publisher().subscribe(self.OnDuplicateMasks, 'Duplicate masks') |
| 126 | - | |
| 127 | + ps.Publisher().subscribe(self.UpdateSlice3D,'Update slice 3D') | |
| 128 | + | |
| 127 | 129 | def GetMaxSliceNumber(self, orientation): |
| 128 | 130 | shape = self.matrix.shape |
| 129 | 131 | |
| ... | ... | @@ -661,17 +663,41 @@ class Slice(object): |
| 661 | 663 | |
| 662 | 664 | |
| 663 | 665 | def InputImageWidget(self, pubsub_evt): |
| 664 | - #widget = pubsub_evt.data | |
| 665 | - | |
| 666 | - #flip = vtk.vtkImageFlip() | |
| 667 | - #flip.SetInput(self.window_level.GetOutput()) | |
| 668 | - #flip.SetFilteredAxis(1) | |
| 669 | - #flip.FlipAboutOriginOn() | |
| 670 | - #flip.Update() | |
| 671 | - | |
| 672 | - #widget.SetInput(flip.GetOutput()) | |
| 673 | - pass | |
| 666 | + widget, orientation = pubsub_evt.data | |
| 674 | 667 | |
| 668 | + original_orientation = Project().original_orientation | |
| 669 | + | |
| 670 | + img = self.buffer_slices[orientation].vtk_image | |
| 671 | + | |
| 672 | + cast = vtk.vtkImageCast() | |
| 673 | + cast.SetInput(img) | |
| 674 | + cast.SetOutputScalarTypeToDouble() | |
| 675 | + cast.ClampOverflowOn() | |
| 676 | + cast.Update() | |
| 677 | + | |
| 678 | + flip = vtk.vtkImageFlip() | |
| 679 | + flip.SetInput(cast.GetOutput()) | |
| 680 | + flip.SetFilteredAxis(1) | |
| 681 | + flip.FlipAboutOriginOn() | |
| 682 | + flip.Update() | |
| 683 | + widget.SetInput(flip.GetOutput()) | |
| 684 | + | |
| 685 | + def UpdateSlice3D(self, pubsub_evt): | |
| 686 | + widget, orientation = pubsub_evt.data | |
| 687 | + img = self.buffer_slices[orientation].vtk_image | |
| 688 | + | |
| 689 | + cast = vtk.vtkImageCast() | |
| 690 | + cast.SetInput(img) | |
| 691 | + cast.SetOutputScalarTypeToDouble() | |
| 692 | + cast.ClampOverflowOn() | |
| 693 | + cast.Update() | |
| 694 | + | |
| 695 | + flip = vtk.vtkImageFlip() | |
| 696 | + flip.SetInput(cast.GetOutput()) | |
| 697 | + flip.SetFilteredAxis(1) | |
| 698 | + flip.FlipAboutOriginOn() | |
| 699 | + flip.Update() | |
| 700 | + widget.SetInput(flip.GetOutput()) | |
| 675 | 701 | |
| 676 | 702 | def CreateMask(self, imagedata=None, name=None, colour=None, |
| 677 | 703 | opacity=None, threshold_range=None, | ... | ... |
invesalius/data/viewer_slice.py
| ... | ... | @@ -821,6 +821,7 @@ class Viewer(wx.Panel): |
| 821 | 821 | ps.Publisher().subscribe(self.RemoveActors, ('Remove actors', ORIENTATIONS[self.orientation])) |
| 822 | 822 | |
| 823 | 823 | ps.Publisher().subscribe(self.ReloadActualSlice, 'Reload actual slice') |
| 824 | + | |
| 824 | 825 | |
| 825 | 826 | def SetDefaultCursor(self, pusub_evt): |
| 826 | 827 | self.interactor.SetCursor(wx.StockCursor(wx.CURSOR_DEFAULT)) |
| ... | ... | @@ -1149,22 +1150,22 @@ class Viewer(wx.Panel): |
| 1149 | 1150 | def UpdateSlice3D(self, pos): |
| 1150 | 1151 | original_orientation = project.Project().original_orientation |
| 1151 | 1152 | pos = self.scroll.GetThumbPosition() |
| 1152 | - if (self.orientation == "CORONAL") and \ | |
| 1153 | - (original_orientation == const.AXIAL): | |
| 1154 | - pos = abs(self.scroll.GetRange() - pos) | |
| 1155 | - elif(self.orientation == "AXIAL") and \ | |
| 1156 | - (original_orientation == const.CORONAL): | |
| 1157 | - pos = abs(self.scroll.GetRange() - pos) | |
| 1158 | - elif(self.orientation == "AXIAL") and \ | |
| 1159 | - (original_orientation == const.SAGITAL): | |
| 1160 | - pos = abs(self.scroll.GetRange() - pos) | |
| 1153 | + #if (self.orientation == "CORONAL") and \ | |
| 1154 | + # (original_orientation == const.AXIAL): | |
| 1155 | + # pos = abs(self.scroll.GetRange() - pos) | |
| 1156 | + #elif(self.orientation == "AXIAL") and \ | |
| 1157 | + # (original_orientation == const.CORONAL): | |
| 1158 | + # pos = abs(self.scroll.GetRange() - pos) | |
| 1159 | + #elif(self.orientation == "AXIAL") and \ | |
| 1160 | + # (original_orientation == const.SAGITAL): | |
| 1161 | + # pos = abs(self.scroll.GetRange() - pos) | |
| 1161 | 1162 | ps.Publisher().sendMessage('Change slice from slice plane',\ |
| 1162 | 1163 | (self.orientation, pos)) |
| 1163 | 1164 | |
| 1164 | 1165 | def OnScrollBar(self, evt=None): |
| 1165 | - pos = self.scroll.GetThumbPosition() | |
| 1166 | + pos = self.scroll.GetThumbPosition() | |
| 1166 | 1167 | self.set_slice_number(pos) |
| 1167 | - | |
| 1168 | + self.UpdateSlice3D(pos) | |
| 1168 | 1169 | if self.state == const.SLICE_STATE_CROSS: |
| 1169 | 1170 | # Update other slice's cross according to the new focal point from |
| 1170 | 1171 | # the actual orientation. |
| ... | ... | @@ -1172,12 +1173,13 @@ class Viewer(wx.Panel): |
| 1172 | 1173 | ps.Publisher().sendMessage('Update cross position', focal_point) |
| 1173 | 1174 | ps.Publisher().sendMessage('Update slice viewer') |
| 1174 | 1175 | else: |
| 1175 | - self.interactor.Render() | |
| 1176 | + self.interactor.Render() | |
| 1176 | 1177 | if evt: |
| 1177 | 1178 | evt.Skip() |
| 1178 | 1179 | |
| 1179 | 1180 | def OnScrollBarRelease(self, evt): |
| 1180 | - #self.UpdateSlice3D(self.pos) | |
| 1181 | + pos = self.scroll.GetThumbPosition() | |
| 1182 | + #self.UpdateSlice3D(pos) | |
| 1181 | 1183 | evt.Skip() |
| 1182 | 1184 | |
| 1183 | 1185 | def OnKeyDown(self, evt=None, obj=None): | ... | ... |
invesalius/data/viewer_volume.py
| ... | ... | @@ -801,120 +801,69 @@ class SlicePlane: |
| 801 | 801 | self.original_orientation = project.original_orientation |
| 802 | 802 | self.Create() |
| 803 | 803 | self.__bind_evt() |
| 804 | - self.__bind_vtk_evt() | |
| 805 | 804 | |
| 806 | 805 | def __bind_evt(self): |
| 807 | 806 | ps.Publisher().subscribe(self.Enable, 'Enable plane') |
| 808 | 807 | ps.Publisher().subscribe(self.Disable, 'Disable plane') |
| 809 | 808 | ps.Publisher().subscribe(self.ChangeSlice, 'Change slice from slice plane') |
| 810 | 809 | |
| 811 | - def __bind_vtk_evt(self): | |
| 812 | - self.plane_x.AddObserver("InteractionEvent", self.PlaneEvent) | |
| 813 | - self.plane_y.AddObserver("InteractionEvent", self.PlaneEvent) | |
| 814 | - self.plane_z.AddObserver("InteractionEvent", self.PlaneEvent) | |
| 815 | - | |
| 816 | - def PlaneEvent(self, obj, evt): | |
| 817 | - number = obj.GetSliceIndex() | |
| 818 | - plane_axis = obj.GetPlaneOrientation() | |
| 819 | - if (self.original_orientation == const.AXIAL): | |
| 820 | - if (plane_axis == 0): | |
| 821 | - orientation = "SAGITAL" | |
| 822 | - elif(plane_axis == 1): | |
| 823 | - orientation = "CORONAL" | |
| 824 | - dimen = obj.GetInput().GetDimensions() | |
| 825 | - number = abs(dimen[0] - (number + 1)) | |
| 826 | - else: | |
| 827 | - orientation = "AXIAL" | |
| 828 | - | |
| 829 | - elif(self.original_orientation == const.SAGITAL): | |
| 830 | - if (plane_axis == 0): | |
| 831 | - orientation = "CORONAL" | |
| 832 | - elif(plane_axis == 1): | |
| 833 | - orientation = "AXIAL" | |
| 834 | - dimen = obj.GetInput().GetDimensions() | |
| 835 | - number = abs(dimen[0] - (number + 1)) | |
| 836 | - else: | |
| 837 | - orientation = "SAGITAL" | |
| 838 | - else: | |
| 839 | - if (plane_axis == 0): | |
| 840 | - orientation = "SAGITAL" | |
| 841 | - elif(plane_axis == 1): | |
| 842 | - orientation = "AXIAL" | |
| 843 | - dimen = obj.GetInput().GetDimensions() | |
| 844 | - number = abs(dimen[0] - (number + 1)) | |
| 845 | - else: | |
| 846 | - orientation = "CORONAL" | |
| 847 | - | |
| 848 | - if (obj.GetSlicePosition() != 0.0): | |
| 849 | - ps.Publisher().sendMessage(('Set scroll position', \ | |
| 850 | - orientation), number) | |
| 851 | - | |
| 852 | 810 | def Create(self): |
| 853 | 811 | plane_x = self.plane_x = vtk.vtkImagePlaneWidget() |
| 854 | - plane_x.DisplayTextOff() | |
| 855 | - ps.Publisher().sendMessage('Input Image in the widget', plane_x) | |
| 812 | + plane_x.InteractionOff() | |
| 813 | + ps.Publisher().sendMessage('Input Image in the widget', | |
| 814 | + (plane_x, 'SAGITAL')) | |
| 856 | 815 | plane_x.SetPlaneOrientationToXAxes() |
| 857 | 816 | plane_x.TextureVisibilityOn() |
| 858 | - plane_x.SetLeftButtonAction(1) | |
| 817 | + plane_x.SetLeftButtonAction(0) | |
| 859 | 818 | plane_x.SetRightButtonAction(0) |
| 860 | - prop1 = plane_x.GetPlaneProperty() | |
| 861 | - prop1.SetColor(0, 0, 1) | |
| 819 | + plane_x.SetMiddleButtonAction(0) | |
| 862 | 820 | cursor_property = plane_x.GetCursorProperty() |
| 863 | 821 | cursor_property.SetOpacity(0) |
| 864 | 822 | |
| 865 | 823 | plane_y = self.plane_y = vtk.vtkImagePlaneWidget() |
| 866 | 824 | plane_y.DisplayTextOff() |
| 867 | - ps.Publisher().sendMessage('Input Image in the widget', plane_y) | |
| 825 | + ps.Publisher().sendMessage('Input Image in the widget', | |
| 826 | + (plane_y, 'CORONAL')) | |
| 868 | 827 | plane_y.SetPlaneOrientationToYAxes() |
| 869 | 828 | plane_y.TextureVisibilityOn() |
| 870 | - plane_y.SetLeftButtonAction(1) | |
| 829 | + plane_y.SetLeftButtonAction(0) | |
| 871 | 830 | plane_y.SetRightButtonAction(0) |
| 831 | + plane_y.SetMiddleButtonAction(0) | |
| 872 | 832 | prop1 = plane_y.GetPlaneProperty() |
| 873 | - prop1.SetColor(0, 1, 0) | |
| 874 | 833 | cursor_property = plane_y.GetCursorProperty() |
| 875 | 834 | cursor_property.SetOpacity(0) |
| 876 | 835 | |
| 877 | 836 | plane_z = self.plane_z = vtk.vtkImagePlaneWidget() |
| 878 | - plane_z.DisplayTextOff() | |
| 879 | - ps.Publisher().sendMessage('Input Image in the widget', plane_z) | |
| 837 | + plane_z.InteractionOff() | |
| 838 | + ps.Publisher().sendMessage('Input Image in the widget', | |
| 839 | + (plane_z, 'AXIAL')) | |
| 880 | 840 | plane_z.SetPlaneOrientationToZAxes() |
| 881 | 841 | plane_z.TextureVisibilityOn() |
| 882 | - plane_z.SetLeftButtonAction(1) | |
| 842 | + plane_z.SetLeftButtonAction(0) | |
| 883 | 843 | plane_z.SetRightButtonAction(0) |
| 884 | - prop1 = plane_z.GetPlaneProperty() | |
| 885 | - prop1.SetColor(1, 0, 0) | |
| 844 | + plane_z.SetMiddleButtonAction(0) | |
| 845 | + | |
| 886 | 846 | cursor_property = plane_z.GetCursorProperty() |
| 887 | 847 | cursor_property.SetOpacity(0) |
| 888 | 848 | |
| 889 | - if(self.original_orientation == const.AXIAL): | |
| 890 | - prop3 = plane_z.GetPlaneProperty() | |
| 891 | - prop3.SetColor(1, 0, 0) | |
| 892 | - | |
| 893 | - prop1 = plane_x.GetPlaneProperty() | |
| 894 | - prop1.SetColor(0, 0, 1) | |
| 895 | - | |
| 896 | - prop2 = plane_y.GetPlaneProperty() | |
| 897 | - prop2.SetColor(0, 1, 0) | |
| 898 | - | |
| 899 | - elif(self.original_orientation == const.SAGITAL): | |
| 900 | - prop3 = plane_y.GetPlaneProperty() | |
| 901 | - prop3.SetColor(1, 0, 0) | |
| 902 | 849 | |
| 903 | - prop1 = plane_z.GetPlaneProperty() | |
| 904 | - prop1.SetColor(0, 0, 1) | |
| 905 | - | |
| 906 | - prop2 = plane_x.GetPlaneProperty() | |
| 907 | - prop2.SetColor(0, 1, 0) | |
| 908 | - | |
| 909 | - else: | |
| 910 | - prop3 = plane_y.GetPlaneProperty() | |
| 911 | - prop3.SetColor(1, 0, 0) | |
| 850 | + prop3 = plane_z.GetPlaneProperty() | |
| 851 | + prop3.SetColor(1, 0, 0) | |
| 852 | + | |
| 853 | + selected_prop3 = plane_z.GetSelectedPlaneProperty() | |
| 854 | + selected_prop3.SetColor(1,0,0) | |
| 855 | + | |
| 856 | + prop1 = plane_x.GetPlaneProperty() | |
| 857 | + prop1.SetColor(0, 0, 1) | |
| 912 | 858 | |
| 913 | - prop1 = plane_x.GetPlaneProperty() | |
| 914 | - prop1.SetColor(0, 0, 1) | |
| 859 | + selected_prop1 = plane_x.GetSelectedPlaneProperty() | |
| 860 | + selected_prop1.SetColor(0, 0, 1) | |
| 861 | + | |
| 862 | + prop2 = plane_y.GetPlaneProperty() | |
| 863 | + prop2.SetColor(0, 1, 0) | |
| 915 | 864 | |
| 916 | - prop2 = plane_z.GetPlaneProperty() | |
| 917 | - prop2.SetColor(0, 1, 0) | |
| 865 | + selected_prop2 = plane_y.GetSelectedPlaneProperty() | |
| 866 | + selected_prop2.SetColor(0, 1, 0) | |
| 918 | 867 | |
| 919 | 868 | ps.Publisher().sendMessage('Set Widget Interactor', plane_x) |
| 920 | 869 | ps.Publisher().sendMessage('Set Widget Interactor', plane_y) |
| ... | ... | @@ -999,42 +948,12 @@ class SlicePlane: |
| 999 | 948 | def ChangeSlice(self, pubsub_evt = None): |
| 1000 | 949 | orientation, number = pubsub_evt.data |
| 1001 | 950 | |
| 1002 | - if (self.original_orientation == const.AXIAL): | |
| 1003 | - if (orientation == "CORONAL"): | |
| 1004 | - self.SetSliceNumber(number, "Y") | |
| 1005 | - elif(orientation == "SAGITAL"): | |
| 1006 | - self.SetSliceNumber(number, "X") | |
| 1007 | - else: | |
| 1008 | - self.SetSliceNumber(number, "Z") | |
| 1009 | - | |
| 1010 | - elif(self.original_orientation == const.SAGITAL): | |
| 1011 | - if (orientation == "CORONAL"): | |
| 1012 | - self.SetSliceNumber(number, "X") | |
| 1013 | - elif(orientation == "SAGITAL"): | |
| 1014 | - self.SetSliceNumber(number, "Z") | |
| 1015 | - else: | |
| 1016 | - self.SetSliceNumber(number, "Y") | |
| 1017 | - | |
| 1018 | - else: | |
| 1019 | - if (orientation == "CORONAL"): | |
| 1020 | - self.SetSliceNumber(number, "Z") | |
| 1021 | - elif(orientation == "SAGITAL"): | |
| 1022 | - self.SetSliceNumber(number, "X") | |
| 1023 | - else: | |
| 1024 | - self.SetSliceNumber(number, "Y") | |
| 1025 | - | |
| 1026 | - self.Render() | |
| 1027 | - | |
| 1028 | - def SetSliceNumber(self, number, axis): | |
| 1029 | - if (axis == "X"): | |
| 1030 | - self.plane_x.SetPlaneOrientationToXAxes() | |
| 1031 | - self.plane_x.SetSliceIndex(number) | |
| 1032 | - elif(axis == "Y"): | |
| 1033 | - self.plane_y.SetPlaneOrientationToYAxes() | |
| 1034 | - self.plane_y.SetSliceIndex(number) | |
| 951 | + if (orientation == "CORONAL"): | |
| 952 | + ps.Publisher().sendMessage('Update slice 3D', (self.plane_y,orientation)) | |
| 953 | + elif(orientation == "SAGITAL"): | |
| 954 | + ps.Publisher().sendMessage('Update slice 3D', (self.plane_x,orientation)) | |
| 1035 | 955 | else: |
| 1036 | - self.plane_z.SetPlaneOrientationToZAxes() | |
| 1037 | - self.plane_z.SetSliceIndex(number) | |
| 956 | + ps.Publisher().sendMessage('Update slice 3D', (self.plane_z,orientation)) | |
| 1038 | 957 | |
| 1039 | 958 | def DeletePlanes(self): |
| 1040 | 959 | del self.plane_x | ... | ... |