Commit 24de58350db20db24f2267d4ac91feaaf9f24341
Committed by
GitHub
1 parent
9d79c88d
Exists in
master
ADD: Remote control via Socket.IO (#282)
* 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>
Showing
54 changed files
with
234 additions
and
52 deletions
Show diff stats
app.py
@@ -51,7 +51,7 @@ try: | @@ -51,7 +51,7 @@ try: | ||
51 | except ImportError: | 51 | except ImportError: |
52 | from wx import SplashScreen | 52 | from wx import SplashScreen |
53 | 53 | ||
54 | -from pubsub import pub as Publisher | 54 | +from invesalius.pubsub import pub as Publisher |
55 | 55 | ||
56 | #import wx.lib.agw.advancedsplash as agw | 56 | #import wx.lib.agw.advancedsplash as agw |
57 | #if sys.platform.startswith('linux'): | 57 | #if sys.platform.startswith('linux'): |
@@ -323,6 +323,10 @@ def parse_comand_line(): | @@ -323,6 +323,10 @@ def parse_comand_line(): | ||
323 | 323 | ||
324 | parser.add_option("--import-folder", action="store", dest="import_folder") | 324 | parser.add_option("--import-folder", action="store", dest="import_folder") |
325 | 325 | ||
326 | + parser.add_option("--remote-host", | ||
327 | + action="store", | ||
328 | + dest="remote_host") | ||
329 | + | ||
326 | parser.add_option("-s", "--save", | 330 | parser.add_option("-s", "--save", |
327 | help="Save the project after an import.") | 331 | help="Save the project after an import.") |
328 | 332 | ||
@@ -503,6 +507,12 @@ def main(): | @@ -503,6 +507,12 @@ def main(): | ||
503 | """ | 507 | """ |
504 | options, args = parse_comand_line() | 508 | options, args = parse_comand_line() |
505 | 509 | ||
510 | + if options.remote_host is not None: | ||
511 | + from invesalius.net.remote_control import RemoteControl | ||
512 | + | ||
513 | + remote_control = RemoteControl(options.remote_host) | ||
514 | + remote_control.connect() | ||
515 | + | ||
506 | if options.no_gui: | 516 | if options.no_gui: |
507 | non_gui_startup(options, args) | 517 | non_gui_startup(options, args) |
508 | else: | 518 | else: |
docs/devel/example_pubsub.py
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | # More information about this design pattern can be found at: | 3 | # More information about this design pattern can be found at: |
4 | # http://wiki.wxpython.org/ModelViewController | 4 | # http://wiki.wxpython.org/ModelViewController |
5 | # http://wiki.wxpython.org/PubSub | 5 | # http://wiki.wxpython.org/PubSub |
6 | -from pubsub import pub as Publisher | 6 | +from invesalius.pubsub import pub as Publisher |
7 | 7 | ||
8 | # The maintainer of Pubsub module is Oliver Schoenborn. | 8 | # The maintainer of Pubsub module is Oliver Schoenborn. |
9 | # Since the end of 2006 Pubsub is now maintained separately on SourceForge at: | 9 | # Since the end of 2006 Pubsub is now maintained separately on SourceForge at: |
docs/devel/example_singleton_pubsub.py
1 | # Singleton and Publisher-Subscriber design patterns example. | 1 | # Singleton and Publisher-Subscriber design patterns example. |
2 | 2 | ||
3 | -from pubsub import pub as Publisher | 3 | +from invesalius.pubsub import pub as Publisher |
4 | 4 | ||
5 | class Singleton(type): | 5 | class Singleton(type): |
6 | # This is a Gary Robinson implementation: | 6 | # This is a Gary Robinson implementation: |
invesalius/control.py
@@ -24,7 +24,7 @@ import textwrap | @@ -24,7 +24,7 @@ import textwrap | ||
24 | import wx | 24 | import wx |
25 | import numpy as np | 25 | import numpy as np |
26 | 26 | ||
27 | -from pubsub import pub as Publisher | 27 | +from invesalius.pubsub import pub as Publisher |
28 | 28 | ||
29 | import invesalius.constants as const | 29 | import invesalius.constants as const |
30 | import invesalius.data.imagedata_utils as image_utils | 30 | import invesalius.data.imagedata_utils as image_utils |
invesalius/data/coordinates.py
@@ -26,7 +26,7 @@ import invesalius.constants as const | @@ -26,7 +26,7 @@ import invesalius.constants as const | ||
26 | 26 | ||
27 | from time import sleep | 27 | from time import sleep |
28 | from random import uniform | 28 | from random import uniform |
29 | -from pubsub import pub as Publisher | 29 | +from invesalius.pubsub import pub as Publisher |
30 | 30 | ||
31 | 31 | ||
32 | def GetCoordinates(trck_init, trck_id, ref_mode): | 32 | def GetCoordinates(trck_init, trck_id, ref_mode): |
invesalius/data/editor.py
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | #-------------------------------------------------------------------------- | 18 | #-------------------------------------------------------------------------- |
19 | 19 | ||
20 | import math | 20 | import math |
21 | -from pubsub import pub as Publisher | 21 | +from invesalius.pubsub import pub as Publisher |
22 | import vtk | 22 | import vtk |
23 | 23 | ||
24 | AXIAL = 2 | 24 | AXIAL = 2 |
invesalius/data/geometry.py
@@ -22,7 +22,7 @@ import math | @@ -22,7 +22,7 @@ import math | ||
22 | 22 | ||
23 | import numpy as np | 23 | import numpy as np |
24 | import vtk | 24 | import vtk |
25 | -from pubsub import pub as Publisher | 25 | +from invesalius.pubsub import pub as Publisher |
26 | 26 | ||
27 | import invesalius.constants as const | 27 | import invesalius.constants as const |
28 | import invesalius.utils as utils | 28 | import invesalius.utils as utils |
invesalius/data/imagedata_utils.py
@@ -27,7 +27,8 @@ import imageio | @@ -27,7 +27,8 @@ import imageio | ||
27 | import numpy | 27 | import numpy |
28 | import numpy as np | 28 | import numpy as np |
29 | import vtk | 29 | import vtk |
30 | -from pubsub import pub as Publisher | 30 | +from invesalius.pubsub import pub as Publisher |
31 | + | ||
31 | from scipy.ndimage import shift, zoom | 32 | from scipy.ndimage import shift, zoom |
32 | from vtk.util import numpy_support | 33 | from vtk.util import numpy_support |
33 | 34 |
invesalius/data/mask.py
@@ -33,7 +33,7 @@ from invesalius.data.volume import VolumeMask | @@ -33,7 +33,7 @@ from invesalius.data.volume import VolumeMask | ||
33 | import numpy as np | 33 | import numpy as np |
34 | import vtk | 34 | import vtk |
35 | from invesalius_cy import floodfill | 35 | from invesalius_cy import floodfill |
36 | -from pubsub import pub as Publisher | 36 | +from invesalius.pubsub import pub as Publisher |
37 | from scipy import ndimage | 37 | from scipy import ndimage |
38 | from vtk.util import numpy_support | 38 | from vtk.util import numpy_support |
39 | 39 |
invesalius/data/measures.py
invesalius/data/polydata_utils.py
@@ -21,7 +21,7 @@ import sys | @@ -21,7 +21,7 @@ import sys | ||
21 | 21 | ||
22 | import vtk | 22 | import vtk |
23 | import wx | 23 | import wx |
24 | -from pubsub import pub as Publisher | 24 | +from invesalius.pubsub import pub as Publisher |
25 | 25 | ||
26 | import invesalius.constants as const | 26 | import invesalius.constants as const |
27 | import invesalius.data.vtk_utils as vu | 27 | import invesalius.data.vtk_utils as vu |
invesalius/data/record_coords.py
@@ -23,7 +23,7 @@ import time | @@ -23,7 +23,7 @@ import time | ||
23 | import wx | 23 | import wx |
24 | from numpy import array, savetxt, hstack,vstack, asarray | 24 | from numpy import array, savetxt, hstack,vstack, asarray |
25 | import invesalius.gui.dialogs as dlg | 25 | import invesalius.gui.dialogs as dlg |
26 | -from pubsub import pub as Publisher | 26 | +from invesalius.pubsub import pub as Publisher |
27 | 27 | ||
28 | 28 | ||
29 | class Record(threading.Thread): | 29 | class Record(threading.Thread): |
invesalius/data/slice_.py
@@ -22,7 +22,7 @@ import tempfile | @@ -22,7 +22,7 @@ import tempfile | ||
22 | import numpy as np | 22 | import numpy as np |
23 | import vtk | 23 | import vtk |
24 | from scipy import ndimage | 24 | from scipy import ndimage |
25 | -from pubsub import pub as Publisher | 25 | +from invesalius.pubsub import pub as Publisher |
26 | 26 | ||
27 | import invesalius.constants as const | 27 | import invesalius.constants as const |
28 | import invesalius.data.converters as converters | 28 | import invesalius.data.converters as converters |
invesalius/data/styles.py
@@ -31,7 +31,7 @@ from scipy import ndimage | @@ -31,7 +31,7 @@ from scipy import ndimage | ||
31 | from imageio import imsave | 31 | from imageio import imsave |
32 | from scipy.ndimage import generate_binary_structure, watershed_ift | 32 | from scipy.ndimage import generate_binary_structure, watershed_ift |
33 | from skimage.morphology import watershed | 33 | from skimage.morphology import watershed |
34 | -from pubsub import pub as Publisher | 34 | +from invesalius.pubsub import pub as Publisher |
35 | 35 | ||
36 | import invesalius.constants as const | 36 | import invesalius.constants as const |
37 | import invesalius.data.converters as converters | 37 | import invesalius.data.converters as converters |
invesalius/data/styles_3d.py
@@ -23,7 +23,7 @@ import wx | @@ -23,7 +23,7 @@ import wx | ||
23 | import invesalius.constants as const | 23 | import invesalius.constants as const |
24 | import invesalius.project as prj | 24 | import invesalius.project as prj |
25 | 25 | ||
26 | -from pubsub import pub as Publisher | 26 | +from invesalius.pubsub import pub as Publisher |
27 | 27 | ||
28 | 28 | ||
29 | PROP_MEASURE = 0.8 | 29 | PROP_MEASURE = 0.8 |
invesalius/data/surface.py
@@ -38,7 +38,7 @@ import vtk | @@ -38,7 +38,7 @@ import vtk | ||
38 | import wx | 38 | import wx |
39 | import wx.lib.agw.genericmessagedialog as GMD | 39 | import wx.lib.agw.genericmessagedialog as GMD |
40 | 40 | ||
41 | -from pubsub import pub as Publisher | 41 | +from invesalius.pubsub import pub as Publisher |
42 | 42 | ||
43 | if sys.platform == 'win32': | 43 | if sys.platform == 'win32': |
44 | try: | 44 | try: |
invesalius/data/tractography.py
@@ -28,7 +28,7 @@ import time | @@ -28,7 +28,7 @@ import time | ||
28 | 28 | ||
29 | import numpy as np | 29 | import numpy as np |
30 | import queue | 30 | import queue |
31 | -from pubsub import pub as Publisher | 31 | +from invesalius.pubsub import pub as Publisher |
32 | from scipy.stats import norm | 32 | from scipy.stats import norm |
33 | import vtk | 33 | import vtk |
34 | 34 |
invesalius/data/trigger.py
@@ -21,7 +21,7 @@ import threading | @@ -21,7 +21,7 @@ import threading | ||
21 | from time import sleep | 21 | from time import sleep |
22 | 22 | ||
23 | import wx | 23 | import wx |
24 | -from pubsub import pub as Publisher | 24 | +from invesalius.pubsub import pub as Publisher |
25 | 25 | ||
26 | 26 | ||
27 | class Trigger(threading.Thread): | 27 | class Trigger(threading.Thread): |
invesalius/data/viewer_slice.py
@@ -31,7 +31,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | @@ -31,7 +31,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | ||
31 | import invesalius.data.styles as styles | 31 | import invesalius.data.styles as styles |
32 | import wx | 32 | import wx |
33 | import sys | 33 | import sys |
34 | -from pubsub import pub as Publisher | 34 | +from invesalius.pubsub import pub as Publisher |
35 | 35 | ||
36 | try: | 36 | try: |
37 | from agw import floatspin as FS | 37 | from agw import floatspin as FS |
invesalius/data/viewer_volume.py
@@ -29,7 +29,7 @@ from numpy.core.umath_tests import inner1d | @@ -29,7 +29,7 @@ from numpy.core.umath_tests import inner1d | ||
29 | import wx | 29 | import wx |
30 | import vtk | 30 | import vtk |
31 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | 31 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor |
32 | -from pubsub import pub as Publisher | 32 | +from invesalius.pubsub import pub as Publisher |
33 | import random | 33 | import random |
34 | from scipy.spatial import distance | 34 | from scipy.spatial import distance |
35 | 35 | ||
@@ -622,6 +622,7 @@ class Viewer(wx.Panel): | @@ -622,6 +622,7 @@ class Viewer(wx.Panel): | ||
622 | 622 | ||
623 | self.ren.AddActor(self.staticballs[self.ball_id]) | 623 | self.ren.AddActor(self.staticballs[self.ball_id]) |
624 | self.ball_id = self.ball_id + 1 | 624 | self.ball_id = self.ball_id + 1 |
625 | + | ||
625 | #self.UpdateRender() | 626 | #self.UpdateRender() |
626 | self.Refresh() | 627 | self.Refresh() |
627 | 628 |
invesalius/data/volume.py
@@ -24,7 +24,7 @@ from distutils.version import LooseVersion | @@ -24,7 +24,7 @@ from distutils.version import LooseVersion | ||
24 | import numpy | 24 | import numpy |
25 | import vtk | 25 | import vtk |
26 | import wx | 26 | import wx |
27 | -from pubsub import pub as Publisher | 27 | +from invesalius.pubsub import pub as Publisher |
28 | 28 | ||
29 | import invesalius.constants as const | 29 | import invesalius.constants as const |
30 | import invesalius.project as prj | 30 | import invesalius.project as prj |
invesalius/data/vtk_utils.py
@@ -20,7 +20,7 @@ import sys | @@ -20,7 +20,7 @@ import sys | ||
20 | 20 | ||
21 | import vtk | 21 | import vtk |
22 | import wx | 22 | import wx |
23 | -from pubsub import pub as Publisher | 23 | +from invesalius.pubsub import pub as Publisher |
24 | import invesalius.constants as const | 24 | import invesalius.constants as const |
25 | from invesalius.gui.dialogs import ProgressDialog | 25 | from invesalius.gui.dialogs import ProgressDialog |
26 | 26 |
invesalius/gui/bitmap_preview_panel.py
@@ -5,7 +5,7 @@ import numpy | @@ -5,7 +5,7 @@ import numpy | ||
5 | 5 | ||
6 | from vtk.util import numpy_support | 6 | from vtk.util import numpy_support |
7 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | 7 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor |
8 | -from pubsub import pub as Publisher | 8 | +from invesalius.pubsub import pub as Publisher |
9 | 9 | ||
10 | import invesalius.constants as const | 10 | import invesalius.constants as const |
11 | import invesalius.data.vtk_utils as vtku | 11 | import invesalius.data.vtk_utils as vtku |
invesalius/gui/brain_seg_dialog.py
@@ -12,7 +12,7 @@ import time | @@ -12,7 +12,7 @@ import time | ||
12 | 12 | ||
13 | import numpy as np | 13 | import numpy as np |
14 | import wx | 14 | import wx |
15 | -from pubsub import pub as Publisher | 15 | +from invesalius.pubsub import pub as Publisher |
16 | 16 | ||
17 | import invesalius.data.slice_ as slc | 17 | import invesalius.data.slice_ as slc |
18 | from invesalius.segmentation.brain import segment, utils | 18 | from invesalius.segmentation.brain import segment, utils |
invesalius/gui/data_notebook.py
@@ -34,7 +34,7 @@ except ImportError: | @@ -34,7 +34,7 @@ except ImportError: | ||
34 | import wx.lib.flatnotebook as fnb | 34 | import wx.lib.flatnotebook as fnb |
35 | 35 | ||
36 | import wx.lib.platebtn as pbtn | 36 | import wx.lib.platebtn as pbtn |
37 | -from pubsub import pub as Publisher | 37 | +from invesalius.pubsub import pub as Publisher |
38 | 38 | ||
39 | import invesalius.constants as const | 39 | import invesalius.constants as const |
40 | import invesalius.data.slice_ as slice_ | 40 | import invesalius.data.slice_ as slice_ |
invesalius/gui/default_tasks.py
@@ -22,7 +22,7 @@ try: | @@ -22,7 +22,7 @@ try: | ||
22 | import wx.lib.agw.foldpanelbar as fpb | 22 | import wx.lib.agw.foldpanelbar as fpb |
23 | except ModuleNotFoundError: | 23 | except ModuleNotFoundError: |
24 | import wx.lib.foldpanelbar as fpb | 24 | import wx.lib.foldpanelbar as fpb |
25 | -from pubsub import pub as Publisher | 25 | +from invesalius.pubsub import pub as Publisher |
26 | 26 | ||
27 | import invesalius.constants as const | 27 | import invesalius.constants as const |
28 | import invesalius.gui.data_notebook as nb | 28 | import invesalius.gui.data_notebook as nb |
invesalius/gui/default_viewers.py
@@ -21,7 +21,7 @@ import os | @@ -21,7 +21,7 @@ import os | ||
21 | 21 | ||
22 | import wx | 22 | import wx |
23 | import wx.lib.agw.fourwaysplitter as fws | 23 | import wx.lib.agw.fourwaysplitter as fws |
24 | -from pubsub import pub as Publisher | 24 | +from invesalius.pubsub import pub as Publisher |
25 | 25 | ||
26 | import invesalius.data.viewer_slice as slice_viewer | 26 | import invesalius.data.viewer_slice as slice_viewer |
27 | import invesalius.data.viewer_volume as volume_viewer | 27 | import invesalius.data.viewer_volume as volume_viewer |
@@ -316,7 +316,7 @@ class VolumeInteraction(wx.Panel): | @@ -316,7 +316,7 @@ class VolumeInteraction(wx.Panel): | ||
316 | 316 | ||
317 | import wx.lib.platebtn as pbtn | 317 | import wx.lib.platebtn as pbtn |
318 | import wx.lib.buttons as btn | 318 | import wx.lib.buttons as btn |
319 | -from pubsub import pub as Publisher | 319 | +from invesalius.pubsub import pub as Publisher |
320 | import wx.lib.colourselect as csel | 320 | import wx.lib.colourselect as csel |
321 | 321 | ||
322 | RAYCASTING_TOOLS = wx.NewId() | 322 | RAYCASTING_TOOLS = wx.NewId() |
invesalius/gui/dialogs.py
@@ -47,7 +47,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | @@ -47,7 +47,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | ||
47 | from wx.lib import masked | 47 | from wx.lib import masked |
48 | from wx.lib.agw import floatspin | 48 | from wx.lib.agw import floatspin |
49 | from wx.lib.wordwrap import wordwrap | 49 | from wx.lib.wordwrap import wordwrap |
50 | -from pubsub import pub as Publisher | 50 | +from invesalius.pubsub import pub as Publisher |
51 | 51 | ||
52 | try: | 52 | try: |
53 | from wx.adv import AboutDialogInfo, AboutBox | 53 | from wx.adv import AboutDialogInfo, AboutBox |
invesalius/gui/dicom_preview_panel.py
@@ -29,7 +29,7 @@ import vtk | @@ -29,7 +29,7 @@ import vtk | ||
29 | 29 | ||
30 | from vtk.util import numpy_support | 30 | from vtk.util import numpy_support |
31 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor | 31 | from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor |
32 | -from pubsub import pub as Publisher | 32 | +from invesalius.pubsub import pub as Publisher |
33 | 33 | ||
34 | import invesalius.constants as const | 34 | import invesalius.constants as const |
35 | import invesalius.reader.dicom_reader as dicom_reader | 35 | import invesalius.reader.dicom_reader as dicom_reader |
invesalius/gui/frame.py
@@ -43,7 +43,7 @@ import wx.lib.popupctl as pc | @@ -43,7 +43,7 @@ import wx.lib.popupctl as pc | ||
43 | from invesalius import inv_paths | 43 | from invesalius import inv_paths |
44 | from invesalius.gui import project_properties | 44 | from invesalius.gui import project_properties |
45 | from wx.lib.agw.aui.auibar import AUI_TB_PLAIN_BACKGROUND, AuiToolBar | 45 | from wx.lib.agw.aui.auibar import AUI_TB_PLAIN_BACKGROUND, AuiToolBar |
46 | -from pubsub import pub as Publisher | 46 | +from invesalius.pubsub import pub as Publisher |
47 | 47 | ||
48 | try: | 48 | try: |
49 | from wx.adv import TaskBarIcon as wx_TaskBarIcon | 49 | from wx.adv import TaskBarIcon as wx_TaskBarIcon |
invesalius/gui/import_bitmap_panel.py
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | #-------------------------------------------------------------------------- | 18 | #-------------------------------------------------------------------------- |
19 | import wx | 19 | import wx |
20 | import wx.gizmos as gizmos | 20 | import wx.gizmos as gizmos |
21 | -from pubsub import pub as Publisher | 21 | +from invesalius.pubsub import pub as Publisher |
22 | import wx.lib.splitter as spl | 22 | import wx.lib.splitter as spl |
23 | 23 | ||
24 | import invesalius.constants as const | 24 | import invesalius.constants as const |
invesalius/gui/import_network_panel.py
@@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
19 | import wx | 19 | import wx |
20 | import sys | 20 | import sys |
21 | import wx.gizmos as gizmos | 21 | import wx.gizmos as gizmos |
22 | -from pubsub import pub as Publisher | 22 | +from invesalius.pubsub import pub as Publisher |
23 | import wx.lib.splitter as spl | 23 | import wx.lib.splitter as spl |
24 | 24 | ||
25 | import invesalius.constants as const | 25 | import invesalius.constants as const |
invesalius/gui/import_panel.py
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | #-------------------------------------------------------------------------- | 18 | #-------------------------------------------------------------------------- |
19 | import wx | 19 | import wx |
20 | import wx.gizmos as gizmos | 20 | import wx.gizmos as gizmos |
21 | -from pubsub import pub as Publisher | 21 | +from invesalius.pubsub import pub as Publisher |
22 | import wx.lib.splitter as spl | 22 | import wx.lib.splitter as spl |
23 | 23 | ||
24 | import invesalius.constants as const | 24 | import invesalius.constants as const |
invesalius/gui/preferences.py
@@ -4,7 +4,7 @@ import invesalius.constants as const | @@ -4,7 +4,7 @@ import invesalius.constants as const | ||
4 | import invesalius.session as ses | 4 | import invesalius.session as ses |
5 | import wx | 5 | import wx |
6 | from invesalius.gui.language_dialog import ComboBoxLanguage | 6 | from invesalius.gui.language_dialog import ComboBoxLanguage |
7 | -from pubsub import pub as Publisher | 7 | +from invesalius.pubsub import pub as Publisher |
8 | 8 | ||
9 | 9 | ||
10 | class Preferences(wx.Dialog): | 10 | class Preferences(wx.Dialog): |
invesalius/gui/project_properties.py
@@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
19 | 19 | ||
20 | import wx | 20 | import wx |
21 | import invesalius.project as prj | 21 | import invesalius.project as prj |
22 | -from pubsub import pub as Publisher | 22 | +from invesalius.pubsub import pub as Publisher |
23 | from invesalius.gui import utils | 23 | from invesalius.gui import utils |
24 | from invesalius import constants as const | 24 | from invesalius import constants as const |
25 | 25 |
invesalius/gui/task_exporter.py
@@ -29,7 +29,7 @@ except ImportError: | @@ -29,7 +29,7 @@ except ImportError: | ||
29 | import wx.lib.hyperlink as hl | 29 | import wx.lib.hyperlink as hl |
30 | 30 | ||
31 | import wx.lib.platebtn as pbtn | 31 | import wx.lib.platebtn as pbtn |
32 | -from pubsub import pub as Publisher | 32 | +from invesalius.pubsub import pub as Publisher |
33 | 33 | ||
34 | import invesalius.constants as const | 34 | import invesalius.constants as const |
35 | import invesalius.gui.dialogs as dlg | 35 | import invesalius.gui.dialogs as dlg |
invesalius/gui/task_importer.py
@@ -26,7 +26,7 @@ except ImportError: | @@ -26,7 +26,7 @@ except ImportError: | ||
26 | import wx.lib.hyperlink as hl | 26 | import wx.lib.hyperlink as hl |
27 | import wx.lib.platebtn as pbtn | 27 | import wx.lib.platebtn as pbtn |
28 | 28 | ||
29 | -from pubsub import pub as Publisher | 29 | +from invesalius.pubsub import pub as Publisher |
30 | 30 | ||
31 | import invesalius.constants as const | 31 | import invesalius.constants as const |
32 | import invesalius.gui.dialogs as dlg | 32 | import invesalius.gui.dialogs as dlg |
invesalius/gui/task_navigator.py
@@ -42,7 +42,7 @@ except ImportError: | @@ -42,7 +42,7 @@ except ImportError: | ||
42 | 42 | ||
43 | import wx.lib.colourselect as csel | 43 | import wx.lib.colourselect as csel |
44 | import wx.lib.masked.numctrl | 44 | import wx.lib.masked.numctrl |
45 | -from pubsub import pub as Publisher | 45 | +from invesalius.pubsub import pub as Publisher |
46 | from time import sleep | 46 | from time import sleep |
47 | 47 | ||
48 | import invesalius.constants as const | 48 | import invesalius.constants as const |
invesalius/gui/task_slice.py
@@ -31,7 +31,7 @@ except ImportError: | @@ -31,7 +31,7 @@ except ImportError: | ||
31 | 31 | ||
32 | import wx.lib.platebtn as pbtn | 32 | import wx.lib.platebtn as pbtn |
33 | import wx.lib.colourselect as csel | 33 | import wx.lib.colourselect as csel |
34 | -from pubsub import pub as Publisher | 34 | +from invesalius.pubsub import pub as Publisher |
35 | 35 | ||
36 | import invesalius.data.mask as mask | 36 | import invesalius.data.mask as mask |
37 | import invesalius.data.slice_ as slice_ | 37 | import invesalius.data.slice_ as slice_ |
invesalius/gui/task_surface.py
@@ -28,7 +28,7 @@ except ImportError: | @@ -28,7 +28,7 @@ except ImportError: | ||
28 | import wx.lib.hyperlink as hl | 28 | import wx.lib.hyperlink as hl |
29 | import wx.lib.foldpanelbar as fpb | 29 | import wx.lib.foldpanelbar as fpb |
30 | 30 | ||
31 | -from pubsub import pub as Publisher | 31 | +from invesalius.pubsub import pub as Publisher |
32 | import wx.lib.colourselect as csel | 32 | import wx.lib.colourselect as csel |
33 | import wx.lib.scrolledpanel as scrolled | 33 | import wx.lib.scrolledpanel as scrolled |
34 | 34 |
invesalius/gui/task_tools.py
@@ -27,7 +27,7 @@ except ImportError: | @@ -27,7 +27,7 @@ except ImportError: | ||
27 | import wx.lib.hyperlink as hl | 27 | import wx.lib.hyperlink as hl |
28 | 28 | ||
29 | import wx.lib.platebtn as pbtn | 29 | import wx.lib.platebtn as pbtn |
30 | -from pubsub import pub as Publisher | 30 | +from invesalius.pubsub import pub as Publisher |
31 | 31 | ||
32 | import invesalius.constants as constants | 32 | import invesalius.constants as constants |
33 | import invesalius.constants as const | 33 | import invesalius.constants as const |
invesalius/gui/widgets/canvas_renderer.py
@@ -30,7 +30,7 @@ except ImportError: | @@ -30,7 +30,7 @@ except ImportError: | ||
30 | from weakrefmethod import WeakMethod | 30 | from weakrefmethod import WeakMethod |
31 | 31 | ||
32 | from invesalius.data import converters | 32 | from invesalius.data import converters |
33 | -from pubsub import pub as Publisher | 33 | +from invesalius.pubsub import pub as Publisher |
34 | 34 | ||
35 | 35 | ||
36 | class CanvasEvent: | 36 | class CanvasEvent: |
invesalius/gui/widgets/clut_raycasting.py
@@ -24,7 +24,7 @@ import sys | @@ -24,7 +24,7 @@ import sys | ||
24 | 24 | ||
25 | import numpy | 25 | import numpy |
26 | import wx | 26 | import wx |
27 | -from pubsub import pub as Publisher | 27 | +from invesalius.pubsub import pub as Publisher |
28 | 28 | ||
29 | import invesalius.gui.dialogs as dialog | 29 | import invesalius.gui.dialogs as dialog |
30 | import invesalius.constants as const | 30 | import invesalius.constants as const |
invesalius/gui/widgets/slice_menu.py
@@ -26,7 +26,7 @@ except(ImportError): | @@ -26,7 +26,7 @@ except(ImportError): | ||
26 | from ordereddict import OrderedDict | 26 | from ordereddict import OrderedDict |
27 | 27 | ||
28 | import wx | 28 | import wx |
29 | -from pubsub import pub as Publisher | 29 | +from invesalius.pubsub import pub as Publisher |
30 | 30 | ||
31 | import invesalius.constants as const | 31 | import invesalius.constants as const |
32 | import invesalius.data.slice_ as sl | 32 | import invesalius.data.slice_ as sl |
@@ -0,0 +1,83 @@ | @@ -0,0 +1,83 @@ | ||
1 | +#!/usr/bin/env python3 | ||
2 | +#-------------------------------------------------------------------------- | ||
3 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | ||
4 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | ||
5 | +# Homepage: http://www.softwarepublico.gov.br | ||
6 | +# Contact: invesalius@cti.gov.br | ||
7 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | ||
8 | +#-------------------------------------------------------------------------- | ||
9 | +# Este programa e software livre; voce pode redistribui-lo e/ou | ||
10 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | ||
11 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | ||
12 | +# da Licenca. | ||
13 | +# | ||
14 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | ||
15 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | ||
16 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | ||
17 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | ||
18 | +# detalhes. | ||
19 | +#------------------------------------------------------------------------- | ||
20 | + | ||
21 | +import time | ||
22 | + | ||
23 | +import socketio | ||
24 | +import wx | ||
25 | + | ||
26 | +from invesalius.pubsub import pub as Publisher | ||
27 | + | ||
28 | +class RemoteControl: | ||
29 | + def __init__(self, remote_host): | ||
30 | + self._remote_host = remote_host | ||
31 | + self._connected = False | ||
32 | + self._sio = None | ||
33 | + | ||
34 | + def _on_connect(self): | ||
35 | + print("Connected to {}".format(self._remote_host)) | ||
36 | + self._connected = True | ||
37 | + | ||
38 | + def _on_disconnect(self): | ||
39 | + print("Disconnected") | ||
40 | + self._connected = False | ||
41 | + | ||
42 | + def _to_neuronavigation(self, msg): | ||
43 | + topic = msg["topic"] | ||
44 | + data = msg["data"] | ||
45 | + if data is None: | ||
46 | + data = {} | ||
47 | + | ||
48 | + print("Received an event into topic '{}' with data {}".format(topic, str(data))) | ||
49 | + Publisher.sendMessage_no_hook( | ||
50 | + topicName=topic, | ||
51 | + **data | ||
52 | + ) | ||
53 | + | ||
54 | + def _to_neuronavigation_wrapper(self, msg): | ||
55 | + # wx.CallAfter wrapping is needed to make messages that update WxPython UI work properly, as the | ||
56 | + # Socket.IO listener runs inside a thread. (See WxPython and thread-safety for more information.) | ||
57 | + wx.CallAfter(self._to_neuronavigation, msg) | ||
58 | + | ||
59 | + def connect(self): | ||
60 | + self._sio = socketio.Client() | ||
61 | + | ||
62 | + self._sio.on('connect', self._on_connect) | ||
63 | + self._sio.on('disconnect', self._on_disconnect) | ||
64 | + self._sio.on('to_neuronavigation', self._to_neuronavigation_wrapper) | ||
65 | + | ||
66 | + self._sio.connect(self._remote_host) | ||
67 | + | ||
68 | + while not self._connected: | ||
69 | + print("Connecting...") | ||
70 | + time.sleep(1.0) | ||
71 | + | ||
72 | + def _emit(topic, data): | ||
73 | + print("Emitting data {} to topic {}".format(data, topic)) | ||
74 | + try: | ||
75 | + if isinstance(topic, str): | ||
76 | + self._sio.emit("from_neuronavigation", { | ||
77 | + "topic": topic, | ||
78 | + "data": data, | ||
79 | + }) | ||
80 | + except TypeError: | ||
81 | + pass | ||
82 | + | ||
83 | + Publisher.add_sendMessage_hook(_emit) |
invesalius/plugins.py
@@ -24,7 +24,7 @@ import pathlib | @@ -24,7 +24,7 @@ import pathlib | ||
24 | import sys | 24 | import sys |
25 | from itertools import chain | 25 | from itertools import chain |
26 | 26 | ||
27 | -from pubsub import pub as Publisher | 27 | +from invesalius.pubsub import pub as Publisher |
28 | 28 | ||
29 | import invesalius.constants as consts | 29 | import invesalius.constants as consts |
30 | from invesalius import inv_paths | 30 | from invesalius import inv_paths |
invesalius/presets.py
@@ -22,7 +22,7 @@ import plistlib | @@ -22,7 +22,7 @@ import plistlib | ||
22 | 22 | ||
23 | import invesalius.constants as const | 23 | import invesalius.constants as const |
24 | 24 | ||
25 | -from pubsub import pub as Publisher | 25 | +from invesalius.pubsub import pub as Publisher |
26 | 26 | ||
27 | from invesalius import inv_paths | 27 | from invesalius import inv_paths |
28 | from invesalius.utils import TwoWaysDictionary | 28 | from invesalius.utils import TwoWaysDictionary |
invesalius/project.py
@@ -30,7 +30,7 @@ import numpy as np | @@ -30,7 +30,7 @@ import numpy as np | ||
30 | import vtk | 30 | import vtk |
31 | import wx | 31 | import wx |
32 | 32 | ||
33 | -from pubsub import pub as Publisher | 33 | +from invesalius.pubsub import pub as Publisher |
34 | 34 | ||
35 | import invesalius.constants as const | 35 | import invesalius.constants as const |
36 | import invesalius.data.polydata_utils as pu | 36 | import invesalius.data.polydata_utils as pu |
@@ -0,0 +1,86 @@ | @@ -0,0 +1,86 @@ | ||
1 | +#-------------------------------------------------------------------------- | ||
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | ||
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | ||
4 | +# Homepage: http://www.softwarepublico.gov.br | ||
5 | +# Contact: invesalius@cti.gov.br | ||
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | ||
7 | +#-------------------------------------------------------------------------- | ||
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | ||
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | ||
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | ||
11 | +# da Licenca. | ||
12 | +# | ||
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | ||
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | ||
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | ||
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | ||
17 | +# detalhes. | ||
18 | +#-------------------------------------------------------------------------- | ||
19 | + | ||
20 | +from typing import Callable | ||
21 | + | ||
22 | +from pubsub import pub as Publisher | ||
23 | +from pubsub.core.listener import UserListener | ||
24 | + | ||
25 | +__all__ = [ | ||
26 | + # subscribing | ||
27 | + 'subscribe', | ||
28 | + 'unsubscribe', | ||
29 | + | ||
30 | + # publishing | ||
31 | + 'sendMessage', | ||
32 | + 'sendMessage_no_hook', | ||
33 | + | ||
34 | + # adding hooks | ||
35 | + 'add_sendMessage_hook' | ||
36 | +] | ||
37 | + | ||
38 | +Hook = Callable[[str, dict], None] | ||
39 | + | ||
40 | +sendMessage_hook: Hook = None | ||
41 | + | ||
42 | +def add_sendMessage_hook(hook: Hook): | ||
43 | + """Add a hook for sending messages. The hook is a function that takes the topic | ||
44 | + name as the first parameter and the message dict as the second parameter, and | ||
45 | + returns None. | ||
46 | + | ||
47 | + :param hook: | ||
48 | + """ | ||
49 | + global sendMessage_hook | ||
50 | + sendMessage_hook = hook | ||
51 | + | ||
52 | +def subscribe(listener: UserListener, topicName: str, **curriedArgs): | ||
53 | + """Subscribe to a topic. | ||
54 | + | ||
55 | + :param listener: | ||
56 | + :param topicName: | ||
57 | + :param curriedArgs: | ||
58 | + """ | ||
59 | + subscribedListener, success = Publisher.subscribe(listener, topicName, **curriedArgs) | ||
60 | + return subscribedListener, success | ||
61 | + | ||
62 | +def unsubscribe(*args, **kwargs): | ||
63 | + """Unsubscribe from a topic. | ||
64 | + | ||
65 | + """ | ||
66 | + Publisher.unsubscribe(*args, **kwargs) | ||
67 | + | ||
68 | +def sendMessage(topicName: str, **msgdata): | ||
69 | + """Send a message in a given topic. | ||
70 | + | ||
71 | + :param topicName: | ||
72 | + :param msgdata: | ||
73 | + """ | ||
74 | + Publisher.sendMessage(topicName, **msgdata) | ||
75 | + if sendMessage_hook is not None: | ||
76 | + sendMessage_hook(topicName, msgdata) | ||
77 | + | ||
78 | +def sendMessage_no_hook(topicName: str, **msgdata): | ||
79 | + """Send a message in a given topic, but do not call the hook. | ||
80 | + | ||
81 | + :param topicName: | ||
82 | + :param msgdata: | ||
83 | + """ | ||
84 | + Publisher.sendMessage(topicName, **msgdata) | ||
85 | + | ||
86 | +AUTO_TOPIC = Publisher.AUTO_TOPIC |
invesalius/reader/bitmap_reader.py
@@ -28,7 +28,7 @@ import numpy | @@ -28,7 +28,7 @@ import numpy | ||
28 | import vtk | 28 | import vtk |
29 | import wx | 29 | import wx |
30 | from imageio import imread | 30 | from imageio import imread |
31 | -from pubsub import pub as Publisher | 31 | +from invesalius.pubsub import pub as Publisher |
32 | from vtk.util import numpy_support | 32 | from vtk.util import numpy_support |
33 | 33 | ||
34 | import invesalius.constants as const | 34 | import invesalius.constants as const |
invesalius/reader/dicom_reader.py
@@ -28,7 +28,7 @@ import gdcm | @@ -28,7 +28,7 @@ import gdcm | ||
28 | # Not showing GDCM warning and debug messages | 28 | # Not showing GDCM warning and debug messages |
29 | gdcm.Trace_DebugOff() | 29 | gdcm.Trace_DebugOff() |
30 | gdcm.Trace_WarningOff() | 30 | gdcm.Trace_WarningOff() |
31 | -from pubsub import pub as Publisher | 31 | +from invesalius.pubsub import pub as Publisher |
32 | 32 | ||
33 | import invesalius.constants as const | 33 | import invesalius.constants as const |
34 | import invesalius.reader.dicom as dicom | 34 | import invesalius.reader.dicom as dicom |
invesalius/session.py
@@ -31,7 +31,7 @@ import codecs | @@ -31,7 +31,7 @@ import codecs | ||
31 | import collections | 31 | import collections |
32 | import json | 32 | import json |
33 | 33 | ||
34 | -from pubsub import pub as Publisher | 34 | +from invesalius.pubsub import pub as Publisher |
35 | import wx | 35 | import wx |
36 | 36 | ||
37 | from invesalius.utils import Singleton, debug, decode, deep_merge_dict | 37 | from invesalius.utils import Singleton, debug, decode, deep_merge_dict |
invesalius/style.py
@@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
17 | # detalhes. | 17 | # detalhes. |
18 | #-------------------------------------------------------------------------- | 18 | #-------------------------------------------------------------------------- |
19 | 19 | ||
20 | -from pubsub import pub as Publisher | 20 | +from invesalius.pubsub import pub as Publisher |
21 | 21 | ||
22 | 22 | ||
23 | # mode.py | 23 | # mode.py |
optional-requirements.txt