Commit 054fa427fe2d24b952266c9142e163309fbc8db7

Authored by okahilak
Committed by GitHub
1 parent 3cdb23d0
Exists in master

Allow setting markers remotely by using 'Set markers' event (#289)

* ADD: 'Set markers' event to set all markers directly

Not used by InVesalius, but useful when controlling InVesalius
remotely and wanting to override InVesalius's own markers.

* MOD: Allow updating target with 'Set markers' event

* MOD: Remove target in 'Set markers' event if no target is selected

* MOD: Enable target button when setting target remotely

Co-authored-by: Olli-Pekka Kahilakoski <olli-pekka.kahilakoski@aalto.fi>
invesalius/data/viewer_volume.py
@@ -288,6 +288,7 @@ class Viewer(wx.Panel): @@ -288,6 +288,7 @@ class Viewer(wx.Panel):
288 Publisher.subscribe(self.BlinkMarker, 'Blink Marker') 288 Publisher.subscribe(self.BlinkMarker, 'Blink Marker')
289 Publisher.subscribe(self.StopBlinkMarker, 'Stop Blink Marker') 289 Publisher.subscribe(self.StopBlinkMarker, 'Stop Blink Marker')
290 Publisher.subscribe(self.SetNewColor, 'Set new color') 290 Publisher.subscribe(self.SetNewColor, 'Set new color')
  291 + Publisher.subscribe(self.SetMarkers, 'Set markers')
291 292
292 # Related to object tracking during neuronavigation 293 # Related to object tracking during neuronavigation
293 Publisher.subscribe(self.OnNavigationStatus, 'Navigation status') 294 Publisher.subscribe(self.OnNavigationStatus, 'Navigation status')
@@ -298,7 +299,7 @@ class Viewer(wx.Panel): @@ -298,7 +299,7 @@ class Viewer(wx.Panel):
298 Publisher.subscribe(self.ActivateTargetMode, 'Target navigation mode') 299 Publisher.subscribe(self.ActivateTargetMode, 'Target navigation mode')
299 Publisher.subscribe(self.OnUpdateObjectTargetGuide, 'Update object matrix') 300 Publisher.subscribe(self.OnUpdateObjectTargetGuide, 'Update object matrix')
300 Publisher.subscribe(self.OnUpdateTargetCoordinates, 'Update target') 301 Publisher.subscribe(self.OnUpdateTargetCoordinates, 'Update target')
301 - Publisher.subscribe(self.OnRemoveTarget, 'Disable or enable coil tracker') 302 + Publisher.subscribe(self.OnDisableOrEnableCoilTracker, 'Disable or enable coil tracker')
302 Publisher.subscribe(self.OnTargetMarkerTransparency, 'Set target transparency') 303 Publisher.subscribe(self.OnTargetMarkerTransparency, 'Set target transparency')
303 Publisher.subscribe(self.OnUpdateAngleThreshold, 'Update angle threshold') 304 Publisher.subscribe(self.OnUpdateAngleThreshold, 'Update angle threshold')
304 Publisher.subscribe(self.OnUpdateDistThreshold, 'Update dist threshold') 305 Publisher.subscribe(self.OnUpdateDistThreshold, 'Update dist threshold')
@@ -563,6 +564,38 @@ class Viewer(wx.Panel): @@ -563,6 +564,38 @@ class Viewer(wx.Panel):
563 actor = self.points_reference.pop(point) 564 actor = self.points_reference.pop(point)
564 self.ren.RemoveActor(actor) 565 self.ren.RemoveActor(actor)
565 566
  567 + def SetMarkers(self, markers):
  568 + """
  569 + Set all markers, overwriting the previous markers.
  570 + """
  571 + self.RemoveAllMarkers(len(self.staticballs))
  572 +
  573 + target_selected = False
  574 + for marker in markers:
  575 +
  576 + ball_id = marker["ball_id"]
  577 + size = marker["size"]
  578 + colour = marker["colour"]
  579 + position = marker["position"]
  580 + direction = marker["direction"]
  581 + target = marker["target"]
  582 +
  583 + self.AddMarker(
  584 + ball_id=ball_id,
  585 + size=size,
  586 + colour=colour,
  587 + coord=position,
  588 + )
  589 +
  590 + if target:
  591 + Publisher.sendMessage('Update target', coord=position + direction)
  592 + target_selected = True
  593 +
  594 + if not target_selected:
  595 + self.RemoveTarget()
  596 +
  597 + self.UpdateRender()
  598 +
566 def AddMarker(self, ball_id, size, colour, coord): 599 def AddMarker(self, ball_id, size, colour, coord):
567 """ 600 """
568 Markers created by navigation tools and rendered in volume viewer. 601 Markers created by navigation tools and rendered in volume viewer.
@@ -928,12 +961,18 @@ class Viewer(wx.Panel): @@ -928,12 +961,18 @@ class Viewer(wx.Panel):
928 self.target_coord = coord 961 self.target_coord = coord
929 self.target_coord[1] = -self.target_coord[1] 962 self.target_coord[1] = -self.target_coord[1]
930 self.CreateTargetAim() 963 self.CreateTargetAim()
  964 + Publisher.sendMessage('Target selected', status=True)
  965 + print("Target updated to coordinates {}".format(coord))
931 966
932 - def OnRemoveTarget(self, status): 967 + def RemoveTarget(self):
  968 + self.target_mode = None
  969 + self.target_coord = None
  970 + self.RemoveTargetAim()
  971 + Publisher.sendMessage('Target selected', status=False)
  972 +
  973 + def OnDisableOrEnableCoilTracker(self, status):
933 if not status: 974 if not status:
934 - self.target_mode = None  
935 - self.target_coord = None  
936 - self.RemoveTargetAim() 975 + self.RemoveTarget()
937 self.DisableCoilTracker() 976 self.DisableCoilTracker()
938 977
939 def CreateTargetAim(self): 978 def CreateTargetAim(self):
invesalius/gui/default_viewers.py
@@ -388,7 +388,7 @@ class VolumeToolPanel(wx.Panel): @@ -388,7 +388,7 @@ class VolumeToolPanel(wx.Panel):
388 # sizer.Add(self.button_3d_mask, 0, wx.TOP | wx.BOTTOM, 1) 388 # sizer.Add(self.button_3d_mask, 0, wx.TOP | wx.BOTTOM, 1)
389 389
390 self.navigation_status = False 390 self.navigation_status = False
391 - self.status_target_select = False 391 + self.status_target_selected = False
392 self.status_obj_tracker = False 392 self.status_obj_tracker = False
393 393
394 sizer.Fit(self) 394 sizer.Fit(self)
@@ -408,7 +408,7 @@ class VolumeToolPanel(wx.Panel): @@ -408,7 +408,7 @@ class VolumeToolPanel(wx.Panel):
408 Publisher.subscribe(self.DisablePreset, 'Close project data') 408 Publisher.subscribe(self.DisablePreset, 'Close project data')
409 Publisher.subscribe(self.Uncheck, 'Uncheck image plane menu') 409 Publisher.subscribe(self.Uncheck, 'Uncheck image plane menu')
410 Publisher.subscribe(self.DisableVolumeCutMenu, 'Disable volume cut menu') 410 Publisher.subscribe(self.DisableVolumeCutMenu, 'Disable volume cut menu')
411 - Publisher.subscribe(self.StatusTargetSelect, 'Disable or enable coil tracker') 411 + Publisher.subscribe(self.StatusTargetSelected, 'Target selected')
412 Publisher.subscribe(self.StatusObjTracker, 'Status target button') 412 Publisher.subscribe(self.StatusObjTracker, 'Status target button')
413 Publisher.subscribe(self.ActiveTarget, 'Active target button') 413 Publisher.subscribe(self.ActiveTarget, 'Active target button')
414 Publisher.subscribe(self.DeactiveTarget, 'Deactive target button') 414 Publisher.subscribe(self.DeactiveTarget, 'Deactive target button')
@@ -442,8 +442,8 @@ class VolumeToolPanel(wx.Panel): @@ -442,8 +442,8 @@ class VolumeToolPanel(wx.Panel):
442 self.status_obj_tracker = status 442 self.status_obj_tracker = status
443 self.StatusNavigation() 443 self.StatusNavigation()
444 444
445 - def StatusTargetSelect(self, status):  
446 - self.status_target_select = status 445 + def StatusTargetSelected(self, status):
  446 + self.status_target_selected = status
447 self.StatusNavigation() 447 self.StatusNavigation()
448 448
449 def ActiveTarget(self): 449 def ActiveTarget(self):
@@ -453,7 +453,7 @@ class VolumeToolPanel(wx.Panel): @@ -453,7 +453,7 @@ class VolumeToolPanel(wx.Panel):
453 self.button_target.Hide() 453 self.button_target.Hide()
454 454
455 def StatusNavigation(self): 455 def StatusNavigation(self):
456 - if self.status_target_select and self.status_obj_tracker: 456 + if self.status_target_selected and self.status_obj_tracker:
457 self.button_target.Enable(1) 457 self.button_target.Enable(1)
458 else: 458 else:
459 self.OnButtonTarget(False) 459 self.OnButtonTarget(False)
invesalius/gui/task_navigator.py
@@ -1389,7 +1389,6 @@ class MarkersPanel(wx.Panel): @@ -1389,7 +1389,6 @@ class MarkersPanel(wx.Panel):
1389 1389
1390 Publisher.sendMessage('Update target', coord=self.list_coord[self.tgt_index][:6]) 1390 Publisher.sendMessage('Update target', coord=self.list_coord[self.tgt_index][:6])
1391 Publisher.sendMessage('Set target transparency', status=True, index=self.tgt_index) 1391 Publisher.sendMessage('Set target transparency', status=True, index=self.tgt_index)
1392 - Publisher.sendMessage('Disable or enable coil tracker', status=True)  
1393 self.OnMenuEditMarkerId('TARGET') 1392 self.OnMenuEditMarkerId('TARGET')
1394 self.tgt_flag = True 1393 self.tgt_flag = True
1395 wx.MessageBox(_("New target selected."), _("InVesalius 3")) 1394 wx.MessageBox(_("New target selected."), _("InVesalius 3"))