diff --git a/app.py b/app.py index 1a6a559..0ee481b 100644 --- a/app.py +++ b/app.py @@ -51,7 +51,7 @@ try: 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'): @@ -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.") @@ -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: diff --git a/docs/devel/example_pubsub.py b/docs/devel/example_pubsub.py index 44b5fe0..aa79c83 100644 --- a/docs/devel/example_pubsub.py +++ b/docs/devel/example_pubsub.py @@ -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: diff --git a/docs/devel/example_singleton_pubsub.py b/docs/devel/example_singleton_pubsub.py index df2f29e..d03d59e 100644 --- a/docs/devel/example_singleton_pubsub.py +++ b/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: diff --git a/invesalius/control.py b/invesalius/control.py index 30ba8bf..c5b7b53 100644 --- a/invesalius/control.py +++ b/invesalius/control.py @@ -24,7 +24,7 @@ import textwrap 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 diff --git a/invesalius/data/coordinates.py b/invesalius/data/coordinates.py index 10399b1..e0dc91c 100644 --- a/invesalius/data/coordinates.py +++ b/invesalius/data/coordinates.py @@ -26,7 +26,7 @@ import invesalius.constants as const 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): diff --git a/invesalius/data/editor.py b/invesalius/data/editor.py index 2174a01..3be19e4 100644 --- a/invesalius/data/editor.py +++ b/invesalius/data/editor.py @@ -18,7 +18,7 @@ #-------------------------------------------------------------------------- import math -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import vtk AXIAL = 2 diff --git a/invesalius/data/geometry.py b/invesalius/data/geometry.py index ba2543c..dc34b1d 100644 --- a/invesalius/data/geometry.py +++ b/invesalius/data/geometry.py @@ -22,7 +22,7 @@ import math 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 diff --git a/invesalius/data/imagedata_utils.py b/invesalius/data/imagedata_utils.py index 3d13f24..1d62e7a 100644 --- a/invesalius/data/imagedata_utils.py +++ b/invesalius/data/imagedata_utils.py @@ -27,7 +27,8 @@ import imageio 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 diff --git a/invesalius/data/mask.py b/invesalius/data/mask.py index 52817cf..1fe79c1 100644 --- a/invesalius/data/mask.py +++ b/invesalius/data/mask.py @@ -33,7 +33,7 @@ from invesalius.data.volume import VolumeMask 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 diff --git a/invesalius/data/measures.py b/invesalius/data/measures.py index d0250bd..82696af 100644 --- a/invesalius/data/measures.py +++ b/invesalius/data/measures.py @@ -4,7 +4,7 @@ import math import random import sys -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import numpy as np import vtk diff --git a/invesalius/data/polydata_utils.py b/invesalius/data/polydata_utils.py index b9c3cf1..6e72ebe 100644 --- a/invesalius/data/polydata_utils.py +++ b/invesalius/data/polydata_utils.py @@ -21,7 +21,7 @@ import sys 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 diff --git a/invesalius/data/record_coords.py b/invesalius/data/record_coords.py index 4382e05..47ea442 100644 --- a/invesalius/data/record_coords.py +++ b/invesalius/data/record_coords.py @@ -23,7 +23,7 @@ import time 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): diff --git a/invesalius/data/slice_.py b/invesalius/data/slice_.py index 1d094e4..e5a0ba1 100644 --- a/invesalius/data/slice_.py +++ b/invesalius/data/slice_.py @@ -22,7 +22,7 @@ import tempfile 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 diff --git a/invesalius/data/styles.py b/invesalius/data/styles.py index 16360a4..4e3867a 100644 --- a/invesalius/data/styles.py +++ b/invesalius/data/styles.py @@ -31,7 +31,7 @@ from scipy import ndimage 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 diff --git a/invesalius/data/styles_3d.py b/invesalius/data/styles_3d.py index 87dad9f..ca6e40a 100644 --- a/invesalius/data/styles_3d.py +++ b/invesalius/data/styles_3d.py @@ -23,7 +23,7 @@ import wx 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 diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index b652040..b69f6fa 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -38,7 +38,7 @@ import vtk 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: diff --git a/invesalius/data/tractography.py b/invesalius/data/tractography.py index 84792f8..bd9231a 100644 --- a/invesalius/data/tractography.py +++ b/invesalius/data/tractography.py @@ -28,7 +28,7 @@ import time 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 diff --git a/invesalius/data/trigger.py b/invesalius/data/trigger.py index adb33d7..3f8dedf 100644 --- a/invesalius/data/trigger.py +++ b/invesalius/data/trigger.py @@ -21,7 +21,7 @@ import threading from time import sleep import wx -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher class Trigger(threading.Thread): diff --git a/invesalius/data/viewer_slice.py b/invesalius/data/viewer_slice.py index b9bf702..0739b63 100644 --- a/invesalius/data/viewer_slice.py +++ b/invesalius/data/viewer_slice.py @@ -31,7 +31,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor 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 diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index d07bd5e..8b02c9d 100644 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -29,7 +29,7 @@ from numpy.core.umath_tests import inner1d 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 @@ -622,6 +622,7 @@ class Viewer(wx.Panel): self.ren.AddActor(self.staticballs[self.ball_id]) self.ball_id = self.ball_id + 1 + #self.UpdateRender() self.Refresh() diff --git a/invesalius/data/volume.py b/invesalius/data/volume.py index 8d89d32..4c6f1e8 100644 --- a/invesalius/data/volume.py +++ b/invesalius/data/volume.py @@ -24,7 +24,7 @@ from distutils.version import LooseVersion 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 diff --git a/invesalius/data/vtk_utils.py b/invesalius/data/vtk_utils.py index 15e6170..34619e3 100644 --- a/invesalius/data/vtk_utils.py +++ b/invesalius/data/vtk_utils.py @@ -20,7 +20,7 @@ import sys 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 diff --git a/invesalius/gui/bitmap_preview_panel.py b/invesalius/gui/bitmap_preview_panel.py index c680846..64ad76e 100644 --- a/invesalius/gui/bitmap_preview_panel.py +++ b/invesalius/gui/bitmap_preview_panel.py @@ -5,7 +5,7 @@ import numpy 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 diff --git a/invesalius/gui/brain_seg_dialog.py b/invesalius/gui/brain_seg_dialog.py index 76ab60f..3f2f91b 100644 --- a/invesalius/gui/brain_seg_dialog.py +++ b/invesalius/gui/brain_seg_dialog.py @@ -12,7 +12,7 @@ import time 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 diff --git a/invesalius/gui/data_notebook.py b/invesalius/gui/data_notebook.py index 5b3de41..983e1f2 100644 --- a/invesalius/gui/data_notebook.py +++ b/invesalius/gui/data_notebook.py @@ -34,7 +34,7 @@ except ImportError: 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_ diff --git a/invesalius/gui/default_tasks.py b/invesalius/gui/default_tasks.py index 19b67a0..a591a6f 100644 --- a/invesalius/gui/default_tasks.py +++ b/invesalius/gui/default_tasks.py @@ -22,7 +22,7 @@ try: 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 diff --git a/invesalius/gui/default_viewers.py b/invesalius/gui/default_viewers.py index 943589f..0368e64 100644 --- a/invesalius/gui/default_viewers.py +++ b/invesalius/gui/default_viewers.py @@ -21,7 +21,7 @@ import os 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 @@ -316,7 +316,7 @@ class VolumeInteraction(wx.Panel): 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() diff --git a/invesalius/gui/dialogs.py b/invesalius/gui/dialogs.py index 58e34ed..fa6cc21 100644 --- a/invesalius/gui/dialogs.py +++ b/invesalius/gui/dialogs.py @@ -47,7 +47,7 @@ from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor 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 diff --git a/invesalius/gui/dicom_preview_panel.py b/invesalius/gui/dicom_preview_panel.py index b727b91..ce47bdd 100644 --- a/invesalius/gui/dicom_preview_panel.py +++ b/invesalius/gui/dicom_preview_panel.py @@ -29,7 +29,7 @@ import vtk 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 diff --git a/invesalius/gui/frame.py b/invesalius/gui/frame.py index 2e95797..a0596f7 100644 --- a/invesalius/gui/frame.py +++ b/invesalius/gui/frame.py @@ -43,7 +43,7 @@ import wx.lib.popupctl as pc 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 diff --git a/invesalius/gui/import_bitmap_panel.py b/invesalius/gui/import_bitmap_panel.py index 0cb0d71..31e9bcf 100644 --- a/invesalius/gui/import_bitmap_panel.py +++ b/invesalius/gui/import_bitmap_panel.py @@ -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 diff --git a/invesalius/gui/import_network_panel.py b/invesalius/gui/import_network_panel.py index e79c7b0..c041b11 100644 --- a/invesalius/gui/import_network_panel.py +++ b/invesalius/gui/import_network_panel.py @@ -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 diff --git a/invesalius/gui/import_panel.py b/invesalius/gui/import_panel.py index cb5dc76..f5d63c8 100644 --- a/invesalius/gui/import_panel.py +++ b/invesalius/gui/import_panel.py @@ -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 diff --git a/invesalius/gui/preferences.py b/invesalius/gui/preferences.py index 2f7e087..bb28f0b 100644 --- a/invesalius/gui/preferences.py +++ b/invesalius/gui/preferences.py @@ -4,7 +4,7 @@ import invesalius.constants as const 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): diff --git a/invesalius/gui/project_properties.py b/invesalius/gui/project_properties.py index ed20001..c75d2f5 100644 --- a/invesalius/gui/project_properties.py +++ b/invesalius/gui/project_properties.py @@ -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 diff --git a/invesalius/gui/task_exporter.py b/invesalius/gui/task_exporter.py index f5e7326..c42ec3f 100644 --- a/invesalius/gui/task_exporter.py +++ b/invesalius/gui/task_exporter.py @@ -29,7 +29,7 @@ except ImportError: 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 diff --git a/invesalius/gui/task_importer.py b/invesalius/gui/task_importer.py index 6d60523..372a730 100644 --- a/invesalius/gui/task_importer.py +++ b/invesalius/gui/task_importer.py @@ -26,7 +26,7 @@ except ImportError: 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 diff --git a/invesalius/gui/task_navigator.py b/invesalius/gui/task_navigator.py index 74096f9..8fb178e 100644 --- a/invesalius/gui/task_navigator.py +++ b/invesalius/gui/task_navigator.py @@ -42,7 +42,7 @@ except ImportError: 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 diff --git a/invesalius/gui/task_slice.py b/invesalius/gui/task_slice.py index ce7a8c6..2d1033b 100644 --- a/invesalius/gui/task_slice.py +++ b/invesalius/gui/task_slice.py @@ -31,7 +31,7 @@ except ImportError: 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_ diff --git a/invesalius/gui/task_surface.py b/invesalius/gui/task_surface.py index 1a27cc1..384fdb4 100644 --- a/invesalius/gui/task_surface.py +++ b/invesalius/gui/task_surface.py @@ -28,7 +28,7 @@ except ImportError: import wx.lib.hyperlink as hl import wx.lib.foldpanelbar as fpb -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import wx.lib.colourselect as csel import wx.lib.scrolledpanel as scrolled diff --git a/invesalius/gui/task_tools.py b/invesalius/gui/task_tools.py index 76dce01..9538066 100644 --- a/invesalius/gui/task_tools.py +++ b/invesalius/gui/task_tools.py @@ -27,7 +27,7 @@ except ImportError: 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 constants import invesalius.constants as const diff --git a/invesalius/gui/widgets/canvas_renderer.py b/invesalius/gui/widgets/canvas_renderer.py index 5d949a2..99713d9 100644 --- a/invesalius/gui/widgets/canvas_renderer.py +++ b/invesalius/gui/widgets/canvas_renderer.py @@ -30,7 +30,7 @@ except ImportError: from weakrefmethod import WeakMethod from invesalius.data import converters -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher class CanvasEvent: diff --git a/invesalius/gui/widgets/clut_raycasting.py b/invesalius/gui/widgets/clut_raycasting.py index b00fb5b..17a481b 100644 --- a/invesalius/gui/widgets/clut_raycasting.py +++ b/invesalius/gui/widgets/clut_raycasting.py @@ -24,7 +24,7 @@ import sys import numpy import wx -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import invesalius.gui.dialogs as dialog import invesalius.constants as const diff --git a/invesalius/gui/widgets/slice_menu.py b/invesalius/gui/widgets/slice_menu.py index 51b7463..89fd5d6 100644 --- a/invesalius/gui/widgets/slice_menu.py +++ b/invesalius/gui/widgets/slice_menu.py @@ -26,7 +26,7 @@ except(ImportError): from ordereddict import OrderedDict import wx -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import invesalius.constants as const import invesalius.data.slice_ as sl diff --git a/invesalius/net/remote_control.py b/invesalius/net/remote_control.py new file mode 100644 index 0000000..0600f33 --- /dev/null +++ b/invesalius/net/remote_control.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +#-------------------------------------------------------------------------- +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer +# Homepage: http://www.softwarepublico.gov.br +# Contact: invesalius@cti.gov.br +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) +#-------------------------------------------------------------------------- +# Este programa e software livre; voce pode redistribui-lo e/ou +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme +# publicada pela Free Software Foundation; de acordo com a versao 2 +# da Licenca. +# +# Este programa eh distribuido na expectativa de ser util, mas SEM +# QUALQUER GARANTIA; sem mesmo a garantia implicita de +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais +# detalhes. +#------------------------------------------------------------------------- + +import time + +import socketio +import wx + +from invesalius.pubsub import pub as Publisher + +class RemoteControl: + def __init__(self, remote_host): + self._remote_host = remote_host + self._connected = False + self._sio = None + + def _on_connect(self): + print("Connected to {}".format(self._remote_host)) + self._connected = True + + def _on_disconnect(self): + print("Disconnected") + self._connected = False + + def _to_neuronavigation(self, msg): + topic = msg["topic"] + data = msg["data"] + if data is None: + data = {} + + print("Received an event into topic '{}' with data {}".format(topic, str(data))) + Publisher.sendMessage_no_hook( + topicName=topic, + **data + ) + + def _to_neuronavigation_wrapper(self, msg): + # wx.CallAfter wrapping is needed to make messages that update WxPython UI work properly, as the + # Socket.IO listener runs inside a thread. (See WxPython and thread-safety for more information.) + wx.CallAfter(self._to_neuronavigation, msg) + + def connect(self): + self._sio = socketio.Client() + + self._sio.on('connect', self._on_connect) + self._sio.on('disconnect', self._on_disconnect) + self._sio.on('to_neuronavigation', self._to_neuronavigation_wrapper) + + self._sio.connect(self._remote_host) + + while not self._connected: + print("Connecting...") + time.sleep(1.0) + + def _emit(topic, data): + print("Emitting data {} to topic {}".format(data, topic)) + try: + if isinstance(topic, str): + self._sio.emit("from_neuronavigation", { + "topic": topic, + "data": data, + }) + except TypeError: + pass + + Publisher.add_sendMessage_hook(_emit) diff --git a/invesalius/plugins.py b/invesalius/plugins.py index 805dda1..ed14091 100644 --- a/invesalius/plugins.py +++ b/invesalius/plugins.py @@ -24,7 +24,7 @@ import pathlib import sys from itertools import chain -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import invesalius.constants as consts from invesalius import inv_paths diff --git a/invesalius/presets.py b/invesalius/presets.py index 14f2e47..c7913d9 100644 --- a/invesalius/presets.py +++ b/invesalius/presets.py @@ -22,7 +22,7 @@ import plistlib import invesalius.constants as const -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher from invesalius import inv_paths from invesalius.utils import TwoWaysDictionary diff --git a/invesalius/project.py b/invesalius/project.py index 72bc069..4098b3c 100644 --- a/invesalius/project.py +++ b/invesalius/project.py @@ -30,7 +30,7 @@ import numpy as np 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.polydata_utils as pu diff --git a/invesalius/pubsub/pub.py b/invesalius/pubsub/pub.py new file mode 100644 index 0000000..55d41e2 --- /dev/null +++ b/invesalius/pubsub/pub.py @@ -0,0 +1,86 @@ +#-------------------------------------------------------------------------- +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer +# Homepage: http://www.softwarepublico.gov.br +# Contact: invesalius@cti.gov.br +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) +#-------------------------------------------------------------------------- +# Este programa e software livre; voce pode redistribui-lo e/ou +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme +# publicada pela Free Software Foundation; de acordo com a versao 2 +# da Licenca. +# +# Este programa eh distribuido na expectativa de ser util, mas SEM +# QUALQUER GARANTIA; sem mesmo a garantia implicita de +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais +# detalhes. +#-------------------------------------------------------------------------- + +from typing import Callable + +from pubsub import pub as Publisher +from pubsub.core.listener import UserListener + +__all__ = [ + # subscribing + 'subscribe', + 'unsubscribe', + + # publishing + 'sendMessage', + 'sendMessage_no_hook', + + # adding hooks + 'add_sendMessage_hook' +] + +Hook = Callable[[str, dict], None] + +sendMessage_hook: Hook = None + +def add_sendMessage_hook(hook: Hook): + """Add a hook for sending messages. The hook is a function that takes the topic + name as the first parameter and the message dict as the second parameter, and + returns None. + + :param hook: + """ + global sendMessage_hook + sendMessage_hook = hook + +def subscribe(listener: UserListener, topicName: str, **curriedArgs): + """Subscribe to a topic. + + :param listener: + :param topicName: + :param curriedArgs: + """ + subscribedListener, success = Publisher.subscribe(listener, topicName, **curriedArgs) + return subscribedListener, success + +def unsubscribe(*args, **kwargs): + """Unsubscribe from a topic. + + """ + Publisher.unsubscribe(*args, **kwargs) + +def sendMessage(topicName: str, **msgdata): + """Send a message in a given topic. + + :param topicName: + :param msgdata: + """ + Publisher.sendMessage(topicName, **msgdata) + if sendMessage_hook is not None: + sendMessage_hook(topicName, msgdata) + +def sendMessage_no_hook(topicName: str, **msgdata): + """Send a message in a given topic, but do not call the hook. + + :param topicName: + :param msgdata: + """ + Publisher.sendMessage(topicName, **msgdata) + +AUTO_TOPIC = Publisher.AUTO_TOPIC diff --git a/invesalius/reader/bitmap_reader.py b/invesalius/reader/bitmap_reader.py index bdc946c..426af7b 100644 --- a/invesalius/reader/bitmap_reader.py +++ b/invesalius/reader/bitmap_reader.py @@ -28,7 +28,7 @@ import numpy import vtk import wx from imageio import imread -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher from vtk.util import numpy_support import invesalius.constants as const diff --git a/invesalius/reader/dicom_reader.py b/invesalius/reader/dicom_reader.py index dfa829d..2820820 100644 --- a/invesalius/reader/dicom_reader.py +++ b/invesalius/reader/dicom_reader.py @@ -28,7 +28,7 @@ import gdcm # Not showing GDCM warning and debug messages gdcm.Trace_DebugOff() gdcm.Trace_WarningOff() -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import invesalius.constants as const import invesalius.reader.dicom as dicom diff --git a/invesalius/session.py b/invesalius/session.py index 713334d..d204bf5 100644 --- a/invesalius/session.py +++ b/invesalius/session.py @@ -31,7 +31,7 @@ import codecs import collections import json -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher import wx from invesalius.utils import Singleton, debug, decode, deep_merge_dict diff --git a/invesalius/style.py b/invesalius/style.py index e97d45b..aba7035 100644 --- a/invesalius/style.py +++ b/invesalius/style.py @@ -17,7 +17,7 @@ # detalhes. #-------------------------------------------------------------------------- -from pubsub import pub as Publisher +from invesalius.pubsub import pub as Publisher # mode.py diff --git a/optional-requirements.txt b/optional-requirements.txt index e4c8931..ab96f4d 100644 --- a/optional-requirements.txt +++ b/optional-requirements.txt @@ -1,2 +1,3 @@ mido==1.2.10 python-rtmidi==1.4.9 +python-socketio[client]==5.3.0 -- libgit2 0.21.2