Skip to content

Commit

Permalink
ADD: Remote control via Socket.IO (#282)
Browse files Browse the repository at this point in the history
* ADD: Remote control via Socket.IO

- Add a command line option (--remote-host) to connect to
  a remote server via Socket.IO.

- Add a hook to send all internal events to the remote server using
  `from_neuronavigation` event.

- Add a Socket.IO event listener for `to_neuronavigation` events, send
  publish those events internally.

* FIX: WxPython-UI modifying Socket.IO messages not working

* FIX: Allow sending message to neuronavigation with data None

* Review comments: Create RemoteControl class under invesalius/net

* Review comments: Move invesalius_pubsub dir to invesalius/pubsub

* ADD: Python modules needed by Socket.IO to requirements.txt

* MOD: Move python-socketio to optional-requirements.txt

- Also, change the requirement name from python-socketio to
  python-socketio[client], causing all dependencies needed by the Socket.IO
  client (e.g., requests) to be installed

- Due to that, remove explicit 'requests' library from the requirements

Co-authored-by: Olli-Pekka Kahilakoski <olli-pekka.kahilakoski@aalto.fi>
  • Loading branch information
okahilak and okahilak committed Jul 29, 2021
1 parent 9d79c88 commit 24de583
Show file tree
Hide file tree
Showing 54 changed files with 234 additions and 52 deletions.
12 changes: 11 additions & 1 deletion app.py
Expand Up @@ -51,7 +51,7 @@
except ImportError:
from wx import SplashScreen

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

#import wx.lib.agw.advancedsplash as agw
#if sys.platform.startswith('linux'):
Expand Down Expand Up @@ -323,6 +323,10 @@ def parse_comand_line():

parser.add_option("--import-folder", action="store", dest="import_folder")

parser.add_option("--remote-host",
action="store",
dest="remote_host")

parser.add_option("-s", "--save",
help="Save the project after an import.")

Expand Down Expand Up @@ -503,6 +507,12 @@ def main():
"""
options, args = parse_comand_line()

if options.remote_host is not None:
from invesalius.net.remote_control import RemoteControl

remote_control = RemoteControl(options.remote_host)
remote_control.connect()

if options.no_gui:
non_gui_startup(options, args)
else:
Expand Down
2 changes: 1 addition & 1 deletion docs/devel/example_pubsub.py
Expand Up @@ -3,7 +3,7 @@
# More information about this design pattern can be found at:
# http://wiki.wxpython.org/ModelViewController
# http://wiki.wxpython.org/PubSub
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

# The maintainer of Pubsub module is Oliver Schoenborn.
# Since the end of 2006 Pubsub is now maintained separately on SourceForge at:
Expand Down
2 changes: 1 addition & 1 deletion docs/devel/example_singleton_pubsub.py
@@ -1,6 +1,6 @@
# Singleton and Publisher-Subscriber design patterns example.

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

class Singleton(type):
# This is a Gary Robinson implementation:
Expand Down
2 changes: 1 addition & 1 deletion invesalius/control.py
Expand Up @@ -24,7 +24,7 @@
import wx
import numpy as np

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.imagedata_utils as image_utils
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/coordinates.py
Expand Up @@ -26,7 +26,7 @@

from time import sleep
from random import uniform
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher


def GetCoordinates(trck_init, trck_id, ref_mode):
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/editor.py
Expand Up @@ -18,7 +18,7 @@
#--------------------------------------------------------------------------

import math
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import vtk

AXIAL = 2
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/geometry.py
Expand Up @@ -22,7 +22,7 @@

import numpy as np
import vtk
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.utils as utils
Expand Down
3 changes: 2 additions & 1 deletion invesalius/data/imagedata_utils.py
Expand Up @@ -27,7 +27,8 @@
import numpy
import numpy as np
import vtk
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

from scipy.ndimage import shift, zoom
from vtk.util import numpy_support

Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/mask.py
Expand Up @@ -33,7 +33,7 @@
import numpy as np
import vtk
from invesalius_cy import floodfill
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
from scipy import ndimage
from vtk.util import numpy_support

Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/measures.py
Expand Up @@ -4,7 +4,7 @@
import random
import sys

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import numpy as np
import vtk
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/polydata_utils.py
Expand Up @@ -21,7 +21,7 @@

import vtk
import wx
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.vtk_utils as vu
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/record_coords.py
Expand Up @@ -23,7 +23,7 @@
import wx
from numpy import array, savetxt, hstack,vstack, asarray
import invesalius.gui.dialogs as dlg
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher


class Record(threading.Thread):
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/slice_.py
Expand Up @@ -22,7 +22,7 @@
import numpy as np
import vtk
from scipy import ndimage
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.converters as converters
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/styles.py
Expand Up @@ -31,7 +31,7 @@
from imageio import imsave
from scipy.ndimage import generate_binary_structure, watershed_ift
from skimage.morphology import watershed
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.converters as converters
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/styles_3d.py
Expand Up @@ -23,7 +23,7 @@
import invesalius.constants as const
import invesalius.project as prj

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher


PROP_MEASURE = 0.8
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/surface.py
Expand Up @@ -38,7 +38,7 @@
import wx
import wx.lib.agw.genericmessagedialog as GMD

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

if sys.platform == 'win32':
try:
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/tractography.py
Expand Up @@ -28,7 +28,7 @@

import numpy as np
import queue
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
from scipy.stats import norm
import vtk

Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/trigger.py
Expand Up @@ -21,7 +21,7 @@
from time import sleep

import wx
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher


class Trigger(threading.Thread):
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/viewer_slice.py
Expand Up @@ -31,7 +31,7 @@
import invesalius.data.styles as styles
import wx
import sys
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

try:
from agw import floatspin as FS
Expand Down
3 changes: 2 additions & 1 deletion invesalius/data/viewer_volume.py
Expand Up @@ -29,7 +29,7 @@
import wx
import vtk
from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import random
from scipy.spatial import distance

Expand Down Expand Up @@ -622,6 +622,7 @@ def AddMarker(self, ball_id, size, colour, coord):

self.ren.AddActor(self.staticballs[self.ball_id])
self.ball_id = self.ball_id + 1

#self.UpdateRender()
self.Refresh()

Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/volume.py
Expand Up @@ -24,7 +24,7 @@
import numpy
import vtk
import wx
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.project as prj
Expand Down
2 changes: 1 addition & 1 deletion invesalius/data/vtk_utils.py
Expand Up @@ -20,7 +20,7 @@

import vtk
import wx
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import invesalius.constants as const
from invesalius.gui.dialogs import ProgressDialog

Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/bitmap_preview_panel.py
Expand Up @@ -5,7 +5,7 @@

from vtk.util import numpy_support
from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.vtk_utils as vtku
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/brain_seg_dialog.py
Expand Up @@ -12,7 +12,7 @@

import numpy as np
import wx
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.data.slice_ as slc
from invesalius.segmentation.brain import segment, utils
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/data_notebook.py
Expand Up @@ -34,7 +34,7 @@
import wx.lib.flatnotebook as fnb

import wx.lib.platebtn as pbtn
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.data.slice_ as slice_
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/default_tasks.py
Expand Up @@ -22,7 +22,7 @@
import wx.lib.agw.foldpanelbar as fpb
except ModuleNotFoundError:
import wx.lib.foldpanelbar as fpb
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.gui.data_notebook as nb
Expand Down
4 changes: 2 additions & 2 deletions invesalius/gui/default_viewers.py
Expand Up @@ -21,7 +21,7 @@

import wx
import wx.lib.agw.fourwaysplitter as fws
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.data.viewer_slice as slice_viewer
import invesalius.data.viewer_volume as volume_viewer
Expand Down Expand Up @@ -316,7 +316,7 @@ def _Exit(self):

import wx.lib.platebtn as pbtn
import wx.lib.buttons as btn
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import wx.lib.colourselect as csel

RAYCASTING_TOOLS = wx.NewId()
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/dialogs.py
Expand Up @@ -47,7 +47,7 @@
from wx.lib import masked
from wx.lib.agw import floatspin
from wx.lib.wordwrap import wordwrap
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

try:
from wx.adv import AboutDialogInfo, AboutBox
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/dicom_preview_panel.py
Expand Up @@ -29,7 +29,7 @@

from vtk.util import numpy_support
from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.reader.dicom_reader as dicom_reader
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/frame.py
Expand Up @@ -43,7 +43,7 @@
from invesalius import inv_paths
from invesalius.gui import project_properties
from wx.lib.agw.aui.auibar import AUI_TB_PLAIN_BACKGROUND, AuiToolBar
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

try:
from wx.adv import TaskBarIcon as wx_TaskBarIcon
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/import_bitmap_panel.py
Expand Up @@ -18,7 +18,7 @@
#--------------------------------------------------------------------------
import wx
import wx.gizmos as gizmos
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import wx.lib.splitter as spl

import invesalius.constants as const
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/import_network_panel.py
Expand Up @@ -19,7 +19,7 @@
import wx
import sys
import wx.gizmos as gizmos
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import wx.lib.splitter as spl

import invesalius.constants as const
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/import_panel.py
Expand Up @@ -18,7 +18,7 @@
#--------------------------------------------------------------------------
import wx
import wx.gizmos as gizmos
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
import wx.lib.splitter as spl

import invesalius.constants as const
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/preferences.py
Expand Up @@ -4,7 +4,7 @@
import invesalius.session as ses
import wx
from invesalius.gui.language_dialog import ComboBoxLanguage
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher


class Preferences(wx.Dialog):
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/project_properties.py
Expand Up @@ -19,7 +19,7 @@

import wx
import invesalius.project as prj
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
from invesalius.gui import utils
from invesalius import constants as const

Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/task_exporter.py
Expand Up @@ -29,7 +29,7 @@
import wx.lib.hyperlink as hl

import wx.lib.platebtn as pbtn
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.gui.dialogs as dlg
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/task_importer.py
Expand Up @@ -26,7 +26,7 @@
import wx.lib.hyperlink as hl
import wx.lib.platebtn as pbtn

from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.constants as const
import invesalius.gui.dialogs as dlg
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/task_navigator.py
Expand Up @@ -42,7 +42,7 @@

import wx.lib.colourselect as csel
import wx.lib.masked.numctrl
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher
from time import sleep

import invesalius.constants as const
Expand Down
2 changes: 1 addition & 1 deletion invesalius/gui/task_slice.py
Expand Up @@ -31,7 +31,7 @@

import wx.lib.platebtn as pbtn
import wx.lib.colourselect as csel
from pubsub import pub as Publisher
from invesalius.pubsub import pub as Publisher

import invesalius.data.mask as mask
import invesalius.data.slice_ as slice_
Expand Down

0 comments on commit 24de583

Please sign in to comment.