diff --git a/invesalius/data/coordinates.py b/invesalius/data/coordinates.py index d24c5af..d4eff39 100644 --- a/invesalius/data/coordinates.py +++ b/invesalius/data/coordinates.py @@ -22,7 +22,7 @@ import numpy as np from time import sleep from random import uniform - +from wx.lib.pubsub import pub as Publisher def GetCoordinates(trck_init, trck_id, ref_mode): @@ -55,6 +55,7 @@ def ClaronCoord(trck_init, trck_id, ref_mode): coord = None k = 0 # TODO: try to replace while and use some Claron internal computation + if ref_mode: while k < 20: try: @@ -80,6 +81,8 @@ def ClaronCoord(trck_init, trck_id, ref_mode): k += 1 print "wait, collecting coordinates ..." + Publisher.sendMessage('Sensors ID', [trck.probeID, trck.refID]) + return coord @@ -123,6 +126,9 @@ def PolhemusWrapperCoord(trck, trck_id, ref_mode): float(trck.PositionTooltipZ1) * scale[2], float(trck.AngleX1), float(trck.AngleY1), float(trck.AngleZ1)]) + if trck.StylusButton: + Publisher.sendMessage('PLH Stylus Button On') + return coord @@ -221,6 +227,8 @@ def DebugCoord(trk_init, trck_id, ref_mode): coord = np.array([uniform(1, 200), uniform(1, 200), uniform(1, 200), uniform(1, 200), uniform(1, 200), uniform(1, 200)]) + Publisher.sendMessage('Sensors ID', [int(uniform(0, 5)), int(uniform(0, 5))]) + return coord diff --git a/invesalius/data/trackers.py b/invesalius/data/trackers.py index ead6ac5..89914e0 100644 --- a/invesalius/data/trackers.py +++ b/invesalius/data/trackers.py @@ -200,6 +200,7 @@ def DisconnectTracker(tracker_id): """ from wx.lib.pubsub import pub as Publisher Publisher.sendMessage('Update status text in GUI', _("Disconnecting tracker ...")) + Publisher.sendMessage('Remove sensors ID') trck_init = None # TODO: create individual functions to disconnect each other device, e.g. Polhemus. if tracker_id == 1: diff --git a/invesalius/data/trigger.py b/invesalius/data/trigger.py index a25719b..df6566d 100644 --- a/invesalius/data/trigger.py +++ b/invesalius/data/trigger.py @@ -47,12 +47,12 @@ class Trigger(threading.Thread): print 'Connection with port COM1 failed.' def stop(self): - if self.trigger_init: - self.trigger_init.close() self._pause_ = True def run(self): while self.nav_id: + self.trigger_init.write('0') + sleep(0.3) lines = self.trigger_init.readlines() # Following lines can simulate a trigger in 3 sec repetitions # sleep(3) @@ -61,4 +61,6 @@ class Trigger(threading.Thread): wx.CallAfter(Publisher.sendMessage, 'Create marker') sleep(0.175) if self._pause_: + if self.trigger_init: + self.trigger_init.close() return diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index 067ba85..0518eb2 100755 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -120,6 +120,9 @@ class Viewer(wx.Panel): self._to_show_ball = 0 self._ball_ref_visibility = False + self.sen1 = False + self.sen2 = False + def __bind_events(self): Publisher.subscribe(self.LoadActor, 'Load surface actor into viewer') @@ -191,6 +194,9 @@ class Viewer(wx.Panel): Publisher.subscribe(self._check_ball_reference, 'Enable style') Publisher.subscribe(self._uncheck_ball_reference, 'Disable style') + Publisher.subscribe(self.OnSensors, 'Sensors ID') + Publisher.subscribe(self.OnRemoveSensorsID, 'Remove sensors ID') + # Related to marker creation in navigation tools Publisher.subscribe(self.AddMarker, 'Add marker') Publisher.subscribe(self.HideAllMarkers, 'Hide all markers') @@ -241,6 +247,51 @@ class Viewer(wx.Panel): self.RemoveBallReference() self.interactor.Render() + def OnSensors(self, pubsub_evt): + probe_id = pubsub_evt.data[0] + ref_id = pubsub_evt.data[1] + if not self.sen1: + self.CreateSensorID() + + if probe_id: + colour1 = (0, 1, 0) + else: + colour1 = (1, 0, 0) + if ref_id: + colour2 = (0, 1, 0) + else: + colour2 = (1, 0, 0) + + self.sen1.SetColour(colour1) + self.sen2.SetColour(colour2) + self.Refresh() + + def CreateSensorID(self): + sen1 = vtku.Text() + sen1.SetSize(const.TEXT_SIZE_LARGE) + sen1.SetPosition((const.X, const.Y)) + sen1.ShadowOff() + sen1.SetValue("O") + self.sen1 = sen1 + self.ren.AddActor(sen1.actor) + + sen2 = vtku.Text() + sen2.SetSize(const.TEXT_SIZE_LARGE) + sen2.SetPosition((const.X+0.04, const.Y)) + sen2.ShadowOff() + sen2.SetValue("O") + self.sen2 = sen2 + self.ren.AddActor(sen2.actor) + + self.interactor.Render() + + def OnRemoveSensorsID(self, pubsub_evt): + if self.sen1: + self.ren.RemoveActor(self.sen1.actor) + self.ren.RemoveActor(self.sen2.actor) + self.sen1 = self.sen2 = False + self.interactor.Render() + def OnShowSurface(self, pubsub_evt): index, value = pubsub_evt.data if value: diff --git a/invesalius/gui/dialogs.py b/invesalius/gui/dialogs.py index bc77dce..2acc223 100644 --- a/invesalius/gui/dialogs.py +++ b/invesalius/gui/dialogs.py @@ -793,11 +793,23 @@ def NoMarkerSelected(): dlg = wx.MessageDialog(None, "", msg, wx.ICON_INFORMATION | wx.OK) else: - dlg = wx.MessageDialog(None,msg, "InVesalius 3 - Neuronavigator", + dlg = wx.MessageDialog(None, msg, "InVesalius 3 - Neuronavigator", wx.ICON_INFORMATION | wx.OK) dlg.ShowModal() dlg.Destroy() +def DeleteAllMarkers(): + msg = _("Do you really want to delete all markers?") + if sys.platform == 'darwin': + dlg = wx.MessageDialog(None, "", msg, + wx.OK | wx.CANCEL | wx.ICON_QUESTION) + else: + dlg = wx.MessageDialog(None, msg, "InVesalius 3 - Neuronavigator", + wx.OK | wx.CANCEL | wx.ICON_QUESTION) + result = dlg.ShowModal() + dlg.Destroy() + return result + def EnterMarkerID(default): msg = _("Edit marker ID") diff --git a/invesalius/gui/frame.py b/invesalius/gui/frame.py index 7f3e0b1..7ad0652 100644 --- a/invesalius/gui/frame.py +++ b/invesalius/gui/frame.py @@ -486,6 +486,8 @@ class Frame(wx.Frame): wx.MessageBox(_('Currently the Navigation mode is only working on Windows'), 'Info', wx.OK | wx.ICON_INFORMATION) self._show_navigator_message = False Publisher.sendMessage('Set navigation mode', status) + if not status: + Publisher.sendMessage('Remove sensors ID') def OnSize(self, evt): """ diff --git a/invesalius/gui/task_navigator.py b/invesalius/gui/task_navigator.py index b234d1a..6482c75 100644 --- a/invesalius/gui/task_navigator.py +++ b/invesalius/gui/task_navigator.py @@ -325,6 +325,7 @@ class NeuronavigationPanel(wx.Panel): Publisher.subscribe(self.UpdateTriggerState, 'Update trigger state') Publisher.subscribe(self.UpdateImageCoordinates, 'Set ball reference position') Publisher.subscribe(self.OnDisconnectTracker, 'Disconnect tracker') + Publisher.subscribe(self.OnStylusButton, 'PLH Stylus Button On') def LoadImageFiducials(self, pubsub_evt): marker_id = pubsub_evt.data[0] @@ -358,6 +359,10 @@ class NeuronavigationPanel(wx.Panel): if self.tracker_id: dt.TrackerConnection(self.tracker_id, 'disconnect') + def OnStylusButton(self, pubsub_evt): + if self.trigger_state: + Publisher.sendMessage('Create marker') + def OnChoiceTracker(self, evt, ctrl): Publisher.sendMessage('Update status text in GUI', _("Configuring tracker ...")) if evt: @@ -642,10 +647,12 @@ class MarkersPanel(wx.Panel): self.list_coord[list_index][7] = str(id_label) def OnDeleteAllMarkers(self, pubsub_evt): - self.list_coord = [] - self.marker_ind = 0 - Publisher.sendMessage('Remove all markers', self.lc.GetItemCount()) - self.lc.DeleteAllItems() + result = dlg.DeleteAllMarkers() + if result == wx.ID_OK: + self.list_coord = [] + self.marker_ind = 0 + Publisher.sendMessage('Remove all markers', self.lc.GetItemCount()) + self.lc.DeleteAllItems() def OnDeleteSingleMarker(self, evt): # OnDeleteSingleMarker is used for both pubsub and button click events @@ -682,7 +689,7 @@ class MarkersPanel(wx.Panel): # OnCreateMarker is used for both pubsub and button click events # Pubsub is used for markers created with fiducial buttons, trigger and create marker button if hasattr(evt, 'data'): - if evt.data: + if evt.data is not None: self.CreateMarker(evt.data[0], (0.0, 1.0, 0.0), self.marker_size, evt.data[1]) else: self.CreateMarker(self.current_coord, self.marker_colour, self.marker_size) -- libgit2 0.21.2