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 288 Publisher.subscribe(self.BlinkMarker, 'Blink Marker')
289 289 Publisher.subscribe(self.StopBlinkMarker, 'Stop Blink Marker')
290 290 Publisher.subscribe(self.SetNewColor, 'Set new color')
  291 + Publisher.subscribe(self.SetMarkers, 'Set markers')
291 292  
292 293 # Related to object tracking during neuronavigation
293 294 Publisher.subscribe(self.OnNavigationStatus, 'Navigation status')
... ... @@ -298,7 +299,7 @@ class Viewer(wx.Panel):
298 299 Publisher.subscribe(self.ActivateTargetMode, 'Target navigation mode')
299 300 Publisher.subscribe(self.OnUpdateObjectTargetGuide, 'Update object matrix')
300 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 303 Publisher.subscribe(self.OnTargetMarkerTransparency, 'Set target transparency')
303 304 Publisher.subscribe(self.OnUpdateAngleThreshold, 'Update angle threshold')
304 305 Publisher.subscribe(self.OnUpdateDistThreshold, 'Update dist threshold')
... ... @@ -563,6 +564,38 @@ class Viewer(wx.Panel):
563 564 actor = self.points_reference.pop(point)
564 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 599 def AddMarker(self, ball_id, size, colour, coord):
567 600 """
568 601 Markers created by navigation tools and rendered in volume viewer.
... ... @@ -928,12 +961,18 @@ class Viewer(wx.Panel):
928 961 self.target_coord = coord
929 962 self.target_coord[1] = -self.target_coord[1]
930 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 974 if not status:
934   - self.target_mode = None
935   - self.target_coord = None
936   - self.RemoveTargetAim()
  975 + self.RemoveTarget()
937 976 self.DisableCoilTracker()
938 977  
939 978 def CreateTargetAim(self):
... ...
invesalius/gui/default_viewers.py
... ... @@ -388,7 +388,7 @@ class VolumeToolPanel(wx.Panel):
388 388 # sizer.Add(self.button_3d_mask, 0, wx.TOP | wx.BOTTOM, 1)
389 389  
390 390 self.navigation_status = False
391   - self.status_target_select = False
  391 + self.status_target_selected = False
392 392 self.status_obj_tracker = False
393 393  
394 394 sizer.Fit(self)
... ... @@ -408,7 +408,7 @@ class VolumeToolPanel(wx.Panel):
408 408 Publisher.subscribe(self.DisablePreset, 'Close project data')
409 409 Publisher.subscribe(self.Uncheck, 'Uncheck image plane menu')
410 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 412 Publisher.subscribe(self.StatusObjTracker, 'Status target button')
413 413 Publisher.subscribe(self.ActiveTarget, 'Active target button')
414 414 Publisher.subscribe(self.DeactiveTarget, 'Deactive target button')
... ... @@ -442,8 +442,8 @@ class VolumeToolPanel(wx.Panel):
442 442 self.status_obj_tracker = status
443 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 447 self.StatusNavigation()
448 448  
449 449 def ActiveTarget(self):
... ... @@ -453,7 +453,7 @@ class VolumeToolPanel(wx.Panel):
453 453 self.button_target.Hide()
454 454  
455 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 457 self.button_target.Enable(1)
458 458 else:
459 459 self.OnButtonTarget(False)
... ...
invesalius/gui/task_navigator.py
... ... @@ -1389,7 +1389,6 @@ class MarkersPanel(wx.Panel):
1389 1389  
1390 1390 Publisher.sendMessage('Update target', coord=self.list_coord[self.tgt_index][:6])
1391 1391 Publisher.sendMessage('Set target transparency', status=True, index=self.tgt_index)
1392   - Publisher.sendMessage('Disable or enable coil tracker', status=True)
1393 1392 self.OnMenuEditMarkerId('TARGET')
1394 1393 self.tgt_flag = True
1395 1394 wx.MessageBox(_("New target selected."), _("InVesalius 3"))
... ...