Commit fe1b1850b40327aa879cd5d4e8dde78a07a2a952
Committed by
GitHub
1 parent
8e5c5977
Exists in
master
ADD: Callbacks to NeuronavigationAPI, allowing controlling InVesalius (#441)
Showing
1 changed file
with
26 additions
and
5 deletions
Show diff stats
invesalius/net/neuronavigation_api.py
| ... | ... | @@ -28,20 +28,26 @@ class NeuronavigationApi(metaclass=Singleton): |
| 28 | 28 | An API used internally in InVesalius to communicate with the |
| 29 | 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 | 35 | When created for the first time, takes a connection object obtained |
| 36 | 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 | 44 | N_VERTICES_IN_POLYGON = 3 |
| 41 | 45 | |
| 42 | 46 | def __init__(self, connection=None): |
| 43 | 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 | 51 | self.__bind_events() |
| 46 | 52 | |
| 47 | 53 | self.connection = connection |
| ... | ... | @@ -49,9 +55,16 @@ class NeuronavigationApi(metaclass=Singleton): |
| 49 | 55 | def _hasmethod(self, obj, name): |
| 50 | 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 | 63 | def __bind_events(self): |
| 53 | 64 | Publisher.subscribe(self.update_focus, 'Set cross focal point') |
| 54 | 65 | |
| 66 | + # Functions for InVesalius to send updates. | |
| 67 | + | |
| 55 | 68 | # TODO: Not the cleanest API; for an example of a better API, see update_coil_pose |
| 56 | 69 | # below, for which position and orientation are sent separately. Changing this |
| 57 | 70 | # would require changing 'Set cross focal point' publishers and subscribers |
| ... | ... | @@ -96,3 +109,11 @@ class NeuronavigationApi(metaclass=Singleton): |
| 96 | 109 | points=points, |
| 97 | 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) | ... | ... |