Commit 054fa427fe2d24b952266c9142e163309fbc8db7
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>
Showing
3 changed files
with
49 additions
and
11 deletions
Show diff stats
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")) |