Compare View

switch
from
...
to
 
Commits (3)
invesalius/data/viewer_slice.py
@@ -1049,7 +1049,6 @@ class Viewer(wx.Panel): @@ -1049,7 +1049,6 @@ class Viewer(wx.Panel):
1049 #self.scroll.Bind(wx.EVT_SCROLL_ENDSCROLL, self.OnScrollBarRelease) 1049 #self.scroll.Bind(wx.EVT_SCROLL_ENDSCROLL, self.OnScrollBarRelease)
1050 self.interactor.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 1050 self.interactor.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
1051 self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu) 1051 self.interactor.Bind(wx.EVT_RIGHT_UP, self.OnContextMenu)
1052 - self.interactor.Bind(wx.EVT_SIZE, self.OnSize)  
1053 1052
1054 def LoadImagedata(self, mask_dict): 1053 def LoadImagedata(self, mask_dict):
1055 self.SetInput(mask_dict) 1054 self.SetInput(mask_dict)
@@ -1433,15 +1432,6 @@ class Viewer(wx.Panel): @@ -1433,15 +1432,6 @@ class Viewer(wx.Panel):
1433 self.scroll.SetThumbPosition(pos) 1432 self.scroll.SetThumbPosition(pos)
1434 self.OnScrollBar() 1433 self.OnScrollBar()
1435 1434
1436 - def OnSize(self, evt):  
1437 - print("OnSize")  
1438 - w, h = self.GetSize()  
1439 - rwin = self.interactor.GetRenderWindow()  
1440 - rwin.SetSize(w, h)  
1441 - # if self.slice_data:  
1442 - # self.slice_data.SetSize((w, h))  
1443 - # evt.Skip()  
1444 -  
1445 def OnSetMIPSize(self, number_slices): 1435 def OnSetMIPSize(self, number_slices):
1446 self.number_slices = number_slices 1436 self.number_slices = number_slices
1447 self.ReloadActualSlice() 1437 self.ReloadActualSlice()
invesalius/net/neuronavigation_api.py
@@ -28,20 +28,26 @@ class NeuronavigationApi(metaclass=Singleton): @@ -28,20 +28,26 @@ class NeuronavigationApi(metaclass=Singleton):
28 An API used internally in InVesalius to communicate with the 28 An API used internally in InVesalius to communicate with the
29 outside world. 29 outside world.
30 30
31 - When something noteworthy happens when running InVesalius, e.g.,  
32 - the coil is moved during neuronavigation, an object created from  
33 - this class can be used to update that information. 31 + When an event of one of several types happens while running InVesalius, e.g.,
  32 + the coil is moved during neuronavigation, this class is used to update the
  33 + information conveyed by the event.
34 34
35 When created for the first time, takes a connection object obtained 35 When created for the first time, takes a connection object obtained
36 from outside InVesalius (see the main entrypoint in app.py). 36 from outside InVesalius (see the main entrypoint in app.py).
37 37
38 - If connection object is not given or it is None, skip doing the updates. 38 + The owner of the connection object can update the state of InVesalius by implementing
  39 + functions to set callbacks, used then to communicate the new state to InVesalius (see,
  40 + e.g., set_callback__set_markers below).
  41 +
  42 + If connection object is not given or it is None, do not do the updates.
39 """ 43 """
40 N_VERTICES_IN_POLYGON = 3 44 N_VERTICES_IN_POLYGON = 3
41 45
42 def __init__(self, connection=None): 46 def __init__(self, connection=None):
43 if connection is not None: 47 if connection is not None:
44 - assert self._hasmethod(connection, 'update_coil_pose') 48 + self.assert_valid(connection)
  49 +
  50 + self.__set_callbacks(connection)
45 self.__bind_events() 51 self.__bind_events()
46 52
47 self.connection = connection 53 self.connection = connection
@@ -49,9 +55,16 @@ class NeuronavigationApi(metaclass=Singleton): @@ -49,9 +55,16 @@ class NeuronavigationApi(metaclass=Singleton):
49 def _hasmethod(self, obj, name): 55 def _hasmethod(self, obj, name):
50 return hasattr(obj, name) and callable(getattr(obj, name)) 56 return hasattr(obj, name) and callable(getattr(obj, name))
51 57
  58 + def assert_valid(self, connection):
  59 + assert self._hasmethod(connection, 'update_coil_pose')
  60 + assert self._hasmethod(connection, 'update_focus')
  61 + assert self._hasmethod(connection, 'set_callback__set_markers')
  62 +
52 def __bind_events(self): 63 def __bind_events(self):
53 Publisher.subscribe(self.update_focus, 'Set cross focal point') 64 Publisher.subscribe(self.update_focus, 'Set cross focal point')
54 65
  66 + # Functions for InVesalius to send updates.
  67 +
55 # TODO: Not the cleanest API; for an example of a better API, see update_coil_pose 68 # TODO: Not the cleanest API; for an example of a better API, see update_coil_pose
56 # below, for which position and orientation are sent separately. Changing this 69 # below, for which position and orientation are sent separately. Changing this
57 # would require changing 'Set cross focal point' publishers and subscribers 70 # would require changing 'Set cross focal point' publishers and subscribers
@@ -96,3 +109,11 @@ class NeuronavigationApi(metaclass=Singleton): @@ -96,3 +109,11 @@ class NeuronavigationApi(metaclass=Singleton):
96 points=points, 109 points=points,
97 polygons=polygons, 110 polygons=polygons,
98 ) 111 )
  112 +
  113 + # Functions for InVesalius to receive updates via callbacks.
  114 +
  115 + def __set_callbacks(self, connection):
  116 + connection.set_callback__set_markers(self.set_markers)
  117 +
  118 + def set_markers(self, markers):
  119 + Publisher.sendMessage('Set markers', markers=markers)
requirements.txt
1 -Cython==0.29.24  
2 -Pillow==9.0.1 1 +Cython==0.29.28
  2 +Pillow==9.1.0
3 Pypubsub==4.0.3 3 Pypubsub==4.0.3
4 configparser==5.0.1 4 configparser==5.0.1
5 h5py==2.10.0 5 h5py==2.10.0
6 imageio==2.9.0 6 imageio==2.9.0
7 nibabel==3.2.1 7 nibabel==3.2.1
8 -numpy==1.21.2 8 +numpy==1.22.1
9 plaidml-keras==0.7.0 9 plaidml-keras==0.7.0
10 psutil==5.8.0 10 psutil==5.8.0
11 pyserial==3.5 11 pyserial==3.5
12 -python-gdcm==3.0.9.1  
13 -scikit-image==0.18.3  
14 -scipy==1.7.1  
15 -vtk==9.0.3 12 +python-gdcm==3.0.12
  13 +scikit-image==0.19.1
  14 +scipy==1.7.3
  15 +vtk==9.1.0
16 wxPython==4.1.1 16 wxPython==4.1.1
17 Theano==1.0.5 17 Theano==1.0.5
18 -torch==1.9.1 18 +torch==1.11.0
19 pyacvd==0.2.7 19 pyacvd==0.2.7
requirements_m1.txt
1 -Cython==0.29.24  
2 -Pillow==9.0.0 1 +Cython==0.29.28
  2 +Pillow==9.1.0
3 Pypubsub==4.0.3 3 Pypubsub==4.0.3
4 configparser==5.0.1 4 configparser==5.0.1
5 h5py==3.6.0 5 h5py==3.6.0
@@ -8,10 +8,10 @@ nibabel==3.2.1 @@ -8,10 +8,10 @@ nibabel==3.2.1
8 numpy==1.22.1 8 numpy==1.22.1
9 psutil==5.8.0 9 psutil==5.8.0
10 pyserial==3.5 10 pyserial==3.5
11 -python-gdcm==3.0.9.1 11 +python-gdcm==3.0.12
12 scikit-image==0.19.1 12 scikit-image==0.19.1
13 scipy==1.7.3 13 scipy==1.7.3
14 -vtk==9.0.3 14 +vtk==9.1.0
15 wxPython==4.1.1 15 wxPython==4.1.1
16 -torch==1.10.0 16 +torch==1.11.0
17 pyacvd==0.2.7 17 pyacvd==0.2.7