Commit 47e6e1c3b050796669e062561d42c0d38b850963

Authored by tfmoraes
1 parent 33e51c02

Merging cross branch improvements to master

Showing 1 changed file with 69 additions and 238 deletions   Show diff stats
invesalius/data/viewer_slice.py
... ... @@ -29,7 +29,6 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
29 29 import wx
30 30 import wx.lib.pubsub as ps
31 31  
32   -
33 32 import constants as const
34 33 import cursor_actors as ca
35 34 import data.slice_ as sl
... ... @@ -62,6 +61,7 @@ class Viewer(wx.Panel):
62 61 self.left_pressed = 0
63 62 self.right_pressed = 0
64 63 self.last_position_mouse_move = ()
  64 + self.state = const.STATE_DEFAULT
65 65  
66 66 # All renderers and image actors in this viewer
67 67 self.slice_data_list = []
... ... @@ -90,13 +90,12 @@ class Viewer(wx.Panel):
90 90 self.on_text = False
91 91 # VTK pipeline and actors
92 92 self.__config_interactor()
93   - self.pick = vtk.vtkWorldPointPicker()
94 93 self.cross_actor = vtk.vtkActor()
95 94  
96   -
97 95 self.__bind_events()
98 96 self.__bind_events_wx()
99   -
  97 +
  98 + self._warped = False
100 99  
101 100 def __init_gui(self):
102 101 interactor = wxVTKRenderWindowInteractor(self, -1, size=self.GetSize())
... ... @@ -117,15 +116,16 @@ class Viewer(wx.Panel):
117 116 self.SetAutoLayout(1)
118 117  
119 118 self.interactor = interactor
  119 + self.pick = vtk.vtkWorldPointPicker()
  120 +
  121 + self.interactor.SetPicker(self.pick)
120 122  
121 123 def OnContextMenu(self, evt):
122 124 self.right_pressed = 0
123 125 if (self.last_position_mouse_move ==\
124 126 self.interactor.GetLastEventPosition()):
125 127 self.PopupMenu(self.menu)
126   -
127 128 evt.Skip()
128   -
129 129  
130 130 def SetPopupMenu(self, menu):
131 131 self.menu = menu
... ... @@ -158,7 +158,6 @@ class Viewer(wx.Panel):
158 158 self.interactor.Render()
159 159 self.on_text = True
160 160  
161   -
162 161 def __set_layout(self, pubsub_evt):
163 162 layout = pubsub_evt.data
164 163 self.SetLayout(layout)
... ... @@ -173,8 +172,8 @@ class Viewer(wx.Panel):
173 172 self.state = state
174 173 action = {const.SLICE_STATE_CROSS:
175 174 {
176   - "MouseMoveEvent": self.OnCrossMove,
177   - "LeftButtonPressEvent": self.OnCrossMouseClick,
  175 + "MouseMoveEvent": self.OnCrossMove,
  176 + "LeftButtonPressEvent": self.OnCrossMouseClick,
178 177 },
179 178 const.SLICE_STATE_EDITOR:
180 179 {
... ... @@ -238,9 +237,7 @@ class Viewer(wx.Panel):
238 237 self.on_wl = False
239 238 self.wl_text.Hide()
240 239  
241   -
242 240 self.__set_editor_cursor_visibility(0)
243   -
244 241  
245 242 # Bind method according to current mode
246 243 if(state == const.STATE_ZOOM_SL):
... ... @@ -347,7 +344,6 @@ class Viewer(wx.Panel):
347 344 ps.Publisher().sendMessage('Update slice viewer')
348 345 ps.Publisher().sendMessage('Render volume viewer')
349 346  
350   -
351 347 def OnWindowLevelClick(self, evt, obj):
352 348 self.last_x, self.last_y = self.interactor.GetLastEventPosition()
353 349  
... ... @@ -375,7 +371,6 @@ class Viewer(wx.Panel):
375 371  
376 372 self.scroll.SetThumbPosition(self.acum_achange_slice)
377 373 self.OnScrollBar()
378   -
379 374  
380 375 def OnChangeSliceClick(self, evt, obj):
381 376 position = list(self.interactor.GetLastEventPosition())
... ... @@ -398,7 +393,6 @@ class Viewer(wx.Panel):
398 393 def OnVtkRightRelease(self, evt, obj):
399 394 evt.OnRightButtonUp()
400 395  
401   -
402 396 def OnUnZoom(self, evt, obj = None):
403 397 mouse_x, mouse_y = self.interactor.GetLastEventPosition()
404 398 ren = self.interactor.FindPokedRenderer(mouse_x, mouse_y)
... ... @@ -496,74 +490,9 @@ class Viewer(wx.Panel):
496 490 ren = slice_data.renderer
497 491 size = ren.GetSize()
498 492  
499   -
500 493 ren.ResetCamera()
501 494 ren.GetActiveCamera().Zoom(1.0)
502 495 self.interactor.Render()
503   - #self.interactor.GetRenderWindow().Render()
504   -
505   -
506   - #if (size[0] <= size[1] + 60):
507   - # Code bellow doesn't work for Promed 0013
508   - """
509   - if 0:
510   -
511   - bound = slice_data.actor.GetBounds()
512   -
513   - width = abs((bound[3] - bound[2]) * -1)
514   - height = abs((bound[1] - bound[0]) * -1)
515   -
516   - origin = ren.GetOrigin()
517   - cam = ren.GetActiveCamera()
518   -
519   - min = []
520   - min.append(bound[0])
521   - min.append(bound[2])
522   -
523   - rbcenter = []
524   - rbcenter.append(min[0] + 0.5 * width)
525   - rbcenter.append(min[1] + 0.5 * height)
526   - rbcenter.append(0)
527   -
528   - self.ren.SetDisplayPoint(rbcenter)
529   - self.ren.DisplayToView()
530   - self.ren.ViewToWorld()
531   -
532   - worldRBCenter = self.ren.GetWorldPoint()
533   - worldRBCenter = list(worldRBCenter)
534   -
535   - invw = 1.0/worldRBCenter[3]
536   -
537   - worldRBCenter[0] *= invw
538   - worldRBCenter[1] *= invw
539   - worldRBCenter[2] *= invw
540   -
541   - winCenter = []
542   - winCenter.append(origin[0] + 0.5 * size[0])
543   - winCenter.append(origin[1] + 0.5 * size[1])
544   - winCenter.append(0)
545   -
546   - ren.SetDisplayPoint(winCenter)
547   - ren.DisplayToView()
548   - ren.ViewToWorld()
549   -
550   - worldWinCenter = list(ren.GetWorldPoint())
551   - invw = 1.0/worldWinCenter[3]
552   - worldWinCenter[0] *= invw
553   - worldWinCenter[1] *= invw
554   - worldWinCenter[2] *= invw
555   -
556   - translation = []
557   - translation.append(worldRBCenter[0] - worldWinCenter[0])
558   - translation.append(worldRBCenter[1] - worldWinCenter[1])
559   - translation.append(worldRBCenter[2] - worldWinCenter[2])
560   -
561   - if (width > height):
562   - cam.Zoom(size[0] / width)
563   - else:
564   - cam.Zoom(size[1] / height)
565   - """
566   -
567 496  
568 497 def ChangeBrushSize(self, pubsub_evt):
569 498 size = pubsub_evt.data
... ... @@ -607,7 +536,6 @@ class Viewer(wx.Panel):
607 536 slice_data.SetCursor(cursor)
608 537 self.interactor.Render()
609 538  
610   -
611 539 def OnBrushClick(self, evt, obj):
612 540 self.__set_editor_cursor_visibility(1)
613 541  
... ... @@ -641,7 +569,6 @@ class Viewer(wx.Panel):
641 569 # TODO: To create a new function to reload images to viewer.
642 570 self.OnScrollBar()
643 571  
644   -
645 572 def OnBrushMove(self, evt, obj):
646 573 self.__set_editor_cursor_visibility(1)
647 574  
... ... @@ -692,34 +619,40 @@ class Viewer(wx.Panel):
692 619  
693 620 def OnCrossMove(self, evt, obj):
694 621 # The user moved the mouse with left button pressed
695   - if (self.left_pressed):
  622 + if self.left_pressed:
696 623 self.ChangeCrossPosition()
697 624  
698 625 def ChangeCrossPosition(self):
699 626 mouse_x, mouse_y = self.interactor.GetEventPosition()
  627 + renderer = self.slice_data.renderer
  628 + self.pick.Pick(mouse_x, mouse_y, 0, renderer)
  629 +
700 630 # Get in what slice data the click occurred
701   - renderer = self.slice_data_list[0].renderer
702 631 # pick to get click position in the 3d world
703   - self.pick.Pick(mouse_x, mouse_y, self.slice_data_list[0].number, renderer)
704 632 coord_cross = self.get_coordinate_cursor()
705   - coord = self.CalcultateScrollPosition(coord_cross)
706   - ps.Publisher().sendMessage('Update cross position',
707   - (self.orientation, coord_cross))
708   - ps.Publisher().sendMessage('Set ball reference position based on bound', coord_cross)
  633 + position = self.slice_data.actor.GetInput().FindPoint(coord_cross)
  634 + # Forcing focal point to be setted in the center of the pixel.
  635 + coord_cross = self.slice_data.actor.GetInput().GetPoint(position)
  636 +
  637 + coord = self.calcultate_scroll_position(position)
  638 + self.ScrollSlice(coord)
  639 +
  640 + ps.Publisher().sendMessage('Update cross position', coord_cross)
  641 + ps.Publisher().sendMessage('Set ball reference position based on bound',
  642 + coord_cross)
709 643 ps.Publisher().sendMessage('Set camera in volume', coord_cross)
710 644 ps.Publisher().sendMessage('Render volume viewer')
711 645  
712   - print "Scroll to", coord
713   - self.ScrollSlice(coord)
714 646 self.interactor.Render()
715 647  
716 648 def Navigation(self, pubsub_evt):
717 649 # Get point from base change
718 650 x, y, z = pubsub_evt.data
719 651 coord_cross = x, y, z
720   - coord = self.CalcultateScrollPosition(coord_cross)
721   - ps.Publisher().sendMessage('Update cross position',
722   - (self.orientation, coord_cross))
  652 + position = self.slice_data.actor.GetInput().FindPoint(x, y, z)
  653 + coord_cross = self.slice_data.actor.GetInput().GetPoint(position)
  654 + coord = self.calcultate_scroll_position(position)
  655 + ps.Publisher().sendMessage('Update cross position', coord_cross)
723 656  
724 657 self.ScrollSlice(coord)
725 658 self.interactor.Render()
... ... @@ -756,43 +689,28 @@ class Viewer(wx.Panel):
756 689 # WARN: Return the only slice_data used in this slice_viewer.
757 690 return self.slice_data
758 691  
759   - def CalcultateScrollPosition(self, coord):
  692 + def calcultate_scroll_position(self, position):
760 693 # Based in the given coord (x, y, z), returns a list with the scroll positions for each
761 694 # orientation, being the first position the sagital, second the coronal
762 695 # and the last, axial.
763   - x, y, z = coord
  696 + image_width = self.slice_.buffer_slices[self.orientation].image.shape[1]
764 697  
765   - proj = project.Project()
766   - orig_orien = proj.original_orientation
767   -
768   - # First we fix the position origin, based on vtkActor bounds
769   - bounds = self.actor.GetBounds()
770   - bound_xi, bound_xf, bound_yi, bound_yf, bound_zi, bound_zf = bounds
771   - x = float(x - bound_xi)
772   - y = float(y - bound_yi)
773   - z = float(z - bound_zi)
774   -
775   - # Then we fix the porpotion, based on vtkImageData spacing
776   - spacing_x, spacing_y, spacing_z = self.imagedata.GetSpacing()
777   -
778   - x = x/spacing_x
779   - y = y/spacing_y
780   - z = z/spacing_z
781   -
782   - x, y, z = self._assert_coord_into_image([x, y, z])
  698 + if self.orientation == 'AXIAL':
  699 + axial = self.slice_data.number
  700 + coronal = position / image_width
  701 + sagital = position % image_width
783 702  
784   - # Based on the current orientation, we define 3D position
785   - # Sagita, coronal, axial
786   - coordinates = {const.AXIAL: [x, y, z],
787   - const.SAGITAL: [z, x, y],
788   - const.CORONAL: [x, z, y]}
  703 + elif self.orientation == 'CORONAL':
  704 + axial = position / image_width
  705 + coronal = self.slice_data.number
  706 + sagital = position % image_width
789 707  
790   - coord = [int(i) for i in coordinates[orig_orien]]
  708 + elif self.orientation == 'SAGITAL':
  709 + axial = position / image_width
  710 + coronal = position % image_width
  711 + sagital = self.slice_data.number
791 712  
792   - # According to vtkImageData extent, we limit min and max value
793   - # If this is not done, a VTK Error occurs when mouse is pressed outside
794   - # vtkImageData extent
795   - return coord
  713 + return sagital, coronal, axial
796 714  
797 715 def calculate_matrix_position(self, coord):
798 716 x, y, z = coord
... ... @@ -965,7 +883,6 @@ class Viewer(wx.Panel):
965 883 def OnHideText(self, pubsub_evt):
966 884 self.HideTextActors()
967 885  
968   -
969 886 def OnCloseProject(self, pubsub_evt):
970 887 self.CloseProject()
971 888  
... ... @@ -982,15 +899,12 @@ class Viewer(wx.Panel):
982 899 self.wl_text = None
983 900 self.pick = vtk.vtkWorldPointPicker()
984 901  
985   -
986 902 def OnSetInteractorStyle(self, pubsub_evt):
987 903 state = pubsub_evt.data
988 904 self.SetInteractorStyle(state)
989 905  
990 906 if (state != const.SLICE_STATE_EDITOR):
991 907 ps.Publisher().sendMessage('Set interactor default cursor')
992   -
993   -
994 908  
995 909 def ChangeBrushOperation(self, pubsub_evt):
996 910 self._brush_cursor_op = pubsub_evt.data
... ... @@ -1006,7 +920,6 @@ class Viewer(wx.Panel):
1006 920 def LoadImagedata(self, pubsub_evt):
1007 921 imagedata, mask_dict = pubsub_evt.data
1008 922 self.SetInput(imagedata, mask_dict)
1009   -
1010 923  
1011 924 def LoadRenderers(self, imagedata):
1012 925 number_renderers = self.layout[0] * self.layout[1]
... ... @@ -1061,7 +974,6 @@ class Viewer(wx.Panel):
1061 974 slice_data.SetBorderStyle(style)
1062 975 n += 1
1063 976  
1064   -
1065 977 def __create_cursor(self):
1066 978 cursor = ca.CursorCircle()
1067 979 cursor.SetOrientation(self.orientation)
... ... @@ -1083,6 +995,7 @@ class Viewer(wx.Panel):
1083 995 self.slice_data.actor.SetInput(imagedata)
1084 996 self.slice_data.SetCursor(self.__create_cursor())
1085 997 self.cam = self.slice_data.renderer.GetActiveCamera()
  998 + self.__build_cross_lines(imagedata)
1086 999 self.set_slice_number(0)
1087 1000 self.__update_camera()
1088 1001 self.slice_data.renderer.ResetCamera()
... ... @@ -1117,46 +1030,27 @@ class Viewer(wx.Panel):
1117 1030 ## Insert cursor
1118 1031 self.SetInteractorStyle(const.STATE_DEFAULT)
1119 1032  
1120   - #self.__build_cross_lines()
  1033 + def __build_cross_lines(self, imagedata):
  1034 + renderer = self.slice_data.renderer
1121 1035  
1122   - def __build_cross_lines(self):
1123   - actor = self.slice_data_list[0].actor
1124   - renderer = self.slice_data_list[0].renderer
1125   - xi, xf, yi, yf, zi, zf = actor.GetBounds()
1126   -
1127   - #vline = vtk.vtkLineSource()
1128   - #vline.SetPoint1(xi, yi, zi)
1129   - #vline.SetPoint2(xi, yf, zi)
1130   - #self.vline = vline
1131   -
1132   - #hline = vtk.vtkLineSource()
1133   - #hline.SetPoint1(xi, yi, zi)
1134   - #hline.SetPoint2(xf, yi, zi)
1135   - #self.hline = hline
1136   -
1137   - #cross = vtk.vtkAppendPolyData()
1138   - #cross.AddInput(vline.GetOutput())
1139   - #cross.AddInput(hline.GetOutput())
1140 1036 cross = vtk.vtkCursor3D()
1141 1037 cross.AllOff()
1142 1038 cross.AxesOn()
1143   - #cross.WrapOn()
1144   - #cross.OutlineOff()
1145   - #cross.ZShadowsOff()
1146   - #cross.YShadowsOff()
1147   - #cross.XShadowsOff()
1148   - cross.SetModelBounds(self.imagedata.GetBounds())
1149 1039 self.cross = cross
1150 1040  
  1041 + c = vtk.vtkCoordinate()
  1042 + c.SetCoordinateSystemToWorld()
  1043 +
1151 1044 cross_mapper = vtk.vtkPolyDataMapper()
1152 1045 cross_mapper.SetInput(cross.GetOutput())
  1046 + #cross_mapper.SetTransformCoordinate(c)
1153 1047  
1154   - property = vtk.vtkProperty()
1155   - property.SetColor(1, 0, 0)
  1048 + p = vtk.vtkProperty()
  1049 + p.SetColor(1, 0, 0)
1156 1050  
1157 1051 cross_actor = vtk.vtkActor()
1158 1052 cross_actor.SetMapper(cross_mapper)
1159   - cross_actor.SetProperty(property)
  1053 + cross_actor.SetProperty(p)
1160 1054 cross_actor.VisibilityOff()
1161 1055 # Only the slices are pickable
1162 1056 cross_actor.PickableOff()
... ... @@ -1165,78 +1059,9 @@ class Viewer(wx.Panel):
1165 1059 renderer.AddActor(cross_actor)
1166 1060  
1167 1061 def __update_cross_position(self, pubsub_evt):
1168   - x, y, z = pubsub_evt.data[1]
1169   - orientation = pubsub_evt.data[0]
1170   - #xi, yi, zi = self.vline.GetPoint1()
1171   - #xf, yf, zf = self.vline.GetPoint2()
1172   - #self.vline.SetPoint1(x, yi, z)
1173   - #self.vline.SetPoint2(x, yf, z)
1174   - #self.vline.Update()
1175   -
1176   - #xi, yi, zi = self.hline.GetPoint1()
1177   - #xf, yf, zf = self.hline.GetPoint2()
1178   - #self.hline.SetPoint1(xi, y, z)
1179   - #self.hline.SetPoint2(xf, y, z)
1180   - #self.hline.Update()
1181   - slice_data = self.slice_data_list[0]
1182   - slice_number = slice_data.number
1183   - actor_bound = slice_data.actor.GetBounds()
1184   - extent = slice_data.actor.GetDisplayExtent()
1185   - cam = slice_data.renderer.GetActiveCamera()
1186   -
1187   - vCamera = numpy.array(cam.GetPosition()) - numpy.array(cam.GetFocalPoint())
1188   - n_vCamera = vCamera / numpy.linalg.norm(vCamera)
1189   -
1190   - pos = [j + 0.01 * i for i,j in zip(n_vCamera, (x, y, z))]
1191   -
1192   - #yz = [x + abs(x * 0.001), y, z]
1193   - #xz = [x, y - abs(y * 0.001), z]
1194   - #xy = [x, y, z + abs(z * 0.001)]
1195   -
1196   - proj = project.Project()
1197   - orig_orien = proj.original_orientation
1198   - #pos = [x, y, z]
1199   -
1200   - #if (orig_orien == const.SAGITAL):
1201   - # coordinates = {"SAGITAL": xy, "CORONAL": yz, "AXIAL": xz}
1202   - #elif(orig_orien == const.CORONAL):
1203   - # #coordinates = {"SAGITAL": yz, "CORONAL": xy, "AXIAL": xz}
1204   - # if orientation == "AXIAL":
1205   - # pos[2] += abs(pos[2] * 0.001)
1206   - # elif orientation == "SAGITAL":
1207   - # pos[0] += abs(pos[0] * 0.001)
1208   - # elif orientation == "CORONAL":
1209   - # pos[1] -= abs(pos[1] * 0.001)
1210   - #else:
1211   - # #coordinates = {"SAGITAL": yz, "CORONAL": xz, "AXIAL": xy}
1212   - # print "AXIAL"
1213   - # if orientation == "AXIAL":
1214   - # pos[2] += abs(pos[2] * 0.001)
1215   - # elif orientation == "SAGITAL":
1216   - # pos[0] += abs(pos[0] * 0.001)
1217   - # elif orientation == "CORONAL":
1218   - # pos[1] -= abs(pos[1] * 0.001)
1219   -
1220   -
1221   - #pos = [x, y, z]
1222   - #if orientation == "AXIAL":
1223   - # pos[2] += abs(pos[2] * 0.001)
1224   - #elif orientation == "SAGITAL":
1225   - # pos[0] += abs(pos[0] * 0.001)
1226   - #elif orientation == "CORONAL":
1227   - # pos[1] -= abs(pos[1] * 0.001)
1228   - #print ">POS", pos
1229   - #print
  1062 + pos = pubsub_evt.data
1230 1063 self.cross.SetFocalPoint(pos)
1231 1064  
1232   - #print
1233   - #print slice_number
1234   - #print x, y, z
1235   - #print "Focal", self.cross.GetFocalPoint()
1236   - #print "bounds", self.cross.GetModelBounds()
1237   - #print "actor bounds", slice_data.actor.GetBounds()
1238   - #print
1239   -
1240 1065 def __set_cross_visibility(self, visibility):
1241 1066 self.cross_actor.SetVisibility(visibility)
1242 1067  
... ... @@ -1275,6 +1100,7 @@ class Viewer(wx.Panel):
1275 1100 renderer = vtk.vtkRenderer()
1276 1101 self.interactor.GetRenderWindow().AddRenderer(renderer)
1277 1102 actor = vtk.vtkImageActor()
  1103 + actor.InterpolateOff()
1278 1104 slice_data = sd.SliceData()
1279 1105 slice_data.SetOrientation(self.orientation)
1280 1106 slice_data.renderer = renderer
... ... @@ -1294,11 +1120,9 @@ class Viewer(wx.Panel):
1294 1120 self.cam.SetViewUp(const.SLICE_POSITION[orig_orien][0][self.orientation])
1295 1121 self.cam.SetPosition(const.SLICE_POSITION[orig_orien][1][self.orientation])
1296 1122 self.cam.ComputeViewPlaneNormal()
1297   - self.cam.OrthogonalizeViewUp()
  1123 + #self.cam.OrthogonalizeViewUp()
1298 1124 self.cam.ParallelProjectionOn()
1299 1125  
1300   - #slice_data.renderer.Render()
1301   -
1302 1126 def __update_display_extent(self, image):
1303 1127 self.slice_data.actor.SetDisplayExtent(image.GetExtent())
1304 1128 self.slice_data.renderer.ResetCameraClippingRange()
... ... @@ -1340,7 +1164,15 @@ class Viewer(wx.Panel):
1340 1164 def OnScrollBar(self, evt=None):
1341 1165 pos = self.scroll.GetThumbPosition()
1342 1166 self.set_slice_number(pos)
1343   - self.interactor.Render()
  1167 +
  1168 + if self.state == const.SLICE_STATE_CROSS:
  1169 + # Update other slice's cross according to the new focal point from
  1170 + # the actual orientation.
  1171 + focal_point = self.cross.GetFocalPoint()
  1172 + ps.Publisher().sendMessage('Update cross position', focal_point)
  1173 + ps.Publisher().sendMessage('Update slice viewer')
  1174 + else:
  1175 + self.interactor.Render()
1344 1176 if evt:
1345 1177 evt.Skip()
1346 1178  
... ... @@ -1376,8 +1208,6 @@ class Viewer(wx.Panel):
1376 1208 pos = pos - 1
1377 1209 self.scroll.SetThumbPosition(pos)
1378 1210 self.OnScrollBar()
1379   -
1380   -
1381 1211  
1382 1212 def OnScrollBackward(self, evt=None, obj=None):
1383 1213 pos = self.scroll.GetThumbPosition()
... ... @@ -1388,8 +1218,6 @@ class Viewer(wx.Panel):
1388 1218 self.scroll.SetThumbPosition(pos)
1389 1219 self.OnScrollBar()
1390 1220  
1391   -
1392   -
1393 1221 def OnSize(self, evt):
1394 1222 w, h = evt.GetSize()
1395 1223 w = float(w)
... ... @@ -1408,12 +1236,14 @@ class Viewer(wx.Panel):
1408 1236  
1409 1237 self.slice_data.SetNumber(index)
1410 1238 self.__update_display_extent(image)
1411   - #self.interactor.Render()
  1239 + self.cross.SetModelBounds(self.slice_data.actor.GetBounds())
1412 1240  
1413 1241 def ChangeSliceNumber(self, pubsub_evt):
1414 1242 index = pubsub_evt.data
1415   - self.set_slice_number(index)
  1243 + #self.set_slice_number(index)
1416 1244 self.scroll.SetThumbPosition(index)
  1245 + pos = self.scroll.GetThumbPosition()
  1246 + self.set_slice_number(pos)
1417 1247 self.interactor.Render()
1418 1248  
1419 1249 def test_operation_position(self, coord):
... ... @@ -1470,7 +1300,8 @@ class Viewer(wx.Panel):
1470 1300 self.interactor.Render()
1471 1301  
1472 1302 def ReloadActualSlice(self, pubsub_evt):
1473   - self.OnScrollBar()
  1303 + pos = self.scroll.GetThumbPosition()
  1304 + self.set_slice_number(pos)
1474 1305  
1475 1306 def AddActors(self, pubsub_evt):
1476 1307 "Inserting actors"
... ...