Commit af5e7366872af822374031de72ec54714439617b
Committed by
Thiago Franco de Moraes
1 parent
811f7ad5
Exists in
master
Navigator updates (#170)
* Remove set button from navigation tab * Reduce panel size and cleaning * More cleaning * Updates to code standards * Support to the fourth FTsensor
Showing
4 changed files
with
49 additions
and
52 deletions
Show diff stats
invesalius/constants.py
... | ... | @@ -708,6 +708,7 @@ STATIC_REF = 0 |
708 | 708 | DYNAMIC_REF = 1 |
709 | 709 | DEFAULT_REF_MODE = DYNAMIC_REF |
710 | 710 | REF_MODE = [_("Static ref."), _("Dynamic ref.")] |
711 | +FT_SENSOR_MODE = [_("Sensor 3"), _("Sensor 4")] | |
711 | 712 | |
712 | 713 | DEFAULT_COIL = SELECT |
713 | 714 | COIL = [_("Select coil:"), _("Neurosoft Figure-8"), |
... | ... | @@ -735,13 +736,11 @@ TIPS_IMG = [_("Select left ear in image"), |
735 | 736 | |
736 | 737 | BTNS_TRK = {TR1: {3: _('LET')}, |
737 | 738 | TR2: {4: _('RET')}, |
738 | - TR3: {5: _('NAT')}, | |
739 | - SET: {6: _('SET')}} | |
739 | + TR3: {5: _('NAT')}} | |
740 | 740 | |
741 | 741 | TIPS_TRK = [_("Select left ear with spatial tracker"), |
742 | 742 | _("Select right ear with spatial tracker"), |
743 | - _("Select nasion with spatial tracker"), | |
744 | - _("Show set coordinates in image")] | |
743 | + _("Select nasion with spatial tracker")] | |
745 | 744 | |
746 | 745 | OBJL = wx.NewId() |
747 | 746 | OBJR = wx.NewId() | ... | ... |
invesalius/data/coordinates.py
... | ... | @@ -109,7 +109,10 @@ def PolhemusWrapperCoord(trck, trck_id, ref_mode): |
109 | 109 | coord3 = np.array([float(trck.PositionTooltipX3) * scale[0], float(trck.PositionTooltipY3) * scale[1], |
110 | 110 | float(trck.PositionTooltipZ3) * scale[2], |
111 | 111 | float(trck.AngleX3), float(trck.AngleY3), float(trck.AngleZ3)]) |
112 | - coord = np.vstack([coord, coord3]) | |
112 | + coord4 = np.array([float(trck.PositionTooltipX4) * scale[0], float(trck.PositionTooltipY4) * scale[1], | |
113 | + float(trck.PositionTooltipZ4) * scale[2], | |
114 | + float(trck.AngleX4), float(trck.AngleY4), float(trck.AngleZ4)]) | |
115 | + coord = np.vstack([coord, coord3, coord4]) | |
113 | 116 | |
114 | 117 | if trck.StylusButton: |
115 | 118 | Publisher.sendMessage('PLH Stylus Button On') |
... | ... | @@ -208,9 +211,12 @@ def DebugCoord(trk_init, trck_id, ref_mode): |
208 | 211 | coord3 = np.array([uniform(1, 200), uniform(1, 200), uniform(1, 200), |
209 | 212 | uniform(-180.0, 180.0), uniform(-180.0, 180.0), uniform(-180.0, 180.0)]) |
210 | 213 | |
214 | + coord4 = np.array([uniform(1, 200), uniform(1, 200), uniform(1, 200), | |
215 | + uniform(-180.0, 180.0), uniform(-180.0, 180.0), uniform(-180.0, 180.0)]) | |
216 | + | |
211 | 217 | Publisher.sendMessage('Sensors ID', probe_id=int(uniform(0, 5)), ref_id=int(uniform(0, 5))) |
212 | 218 | |
213 | - return np.vstack([coord1, coord2, coord3]) | |
219 | + return np.vstack([coord1, coord2, coord3, coord4]) | |
214 | 220 | |
215 | 221 | |
216 | 222 | def dynamic_reference(probe, reference): | ... | ... |
invesalius/gui/dialogs.py
... | ... | @@ -3487,8 +3487,19 @@ class ObjectCalibrationDialog(wx.Dialog): |
3487 | 3487 | choice_ref.SetSelection(self.obj_ref_id) |
3488 | 3488 | choice_ref.SetToolTip(tooltip) |
3489 | 3489 | choice_ref.Bind(wx.EVT_COMBOBOX, self.OnChoiceRefMode) |
3490 | - if self.tracker_id != const.MTC: | |
3491 | - choice_ref.Enable(0) | |
3490 | + choice_ref.Enable(0) | |
3491 | + if self.tracker_id == const.MTC or self.tracker_id == const.FASTRAK or self.tracker_id == const.DEBUGTRACK: | |
3492 | + choice_ref.Enable(1) | |
3493 | + | |
3494 | + # ComboBox for sensor selection for FASTRAK | |
3495 | + tooltip = wx.ToolTip(_(u"Choose the FASTRAK sensor port")) | |
3496 | + choice_sensor = wx.ComboBox(self, -1, "", size=wx.Size(90, 23), | |
3497 | + choices=const.FT_SENSOR_MODE, style=wx.CB_DROPDOWN | wx.CB_READONLY) | |
3498 | + choice_sensor.SetSelection(0) | |
3499 | + choice_sensor.SetToolTip(tooltip) | |
3500 | + choice_sensor.Bind(wx.EVT_COMBOBOX, self.OnChoiceFTSensor) | |
3501 | + choice_sensor.Show(False) | |
3502 | + self.choice_sensor = choice_sensor | |
3492 | 3503 | |
3493 | 3504 | # Buttons to finish or cancel object registration |
3494 | 3505 | tooltip = wx.ToolTip(_(u"Registration done")) |
... | ... | @@ -3496,9 +3507,10 @@ class ObjectCalibrationDialog(wx.Dialog): |
3496 | 3507 | btn_ok = wx.Button(self, wx.ID_OK, _(u"Done"), size=wx.Size(90, 30)) |
3497 | 3508 | btn_ok.SetToolTip(tooltip) |
3498 | 3509 | |
3499 | - extra_sizer = wx.FlexGridSizer(rows=2, cols=1, hgap=5, vgap=30) | |
3510 | + extra_sizer = wx.FlexGridSizer(rows=3, cols=1, hgap=5, vgap=30) | |
3500 | 3511 | extra_sizer.AddMany([choice_ref, |
3501 | - btn_ok]) | |
3512 | + btn_ok, | |
3513 | + choice_sensor]) | |
3502 | 3514 | |
3503 | 3515 | # Push buttons for object fiducials |
3504 | 3516 | btns_obj = const.BTNS_OBJ |
... | ... | @@ -3651,7 +3663,7 @@ class ObjectCalibrationDialog(wx.Dialog): |
3651 | 3663 | if self.trk_init and self.tracker_id: |
3652 | 3664 | coord_raw = dco.GetCoordinates(self.trk_init, self.tracker_id, self.obj_ref_id) |
3653 | 3665 | if self.obj_ref_id and btn_id == 4: |
3654 | - coord = coord_raw[2, :] | |
3666 | + coord = coord_raw[self.obj_ref_id, :] | |
3655 | 3667 | else: |
3656 | 3668 | coord = coord_raw[0, :] |
3657 | 3669 | else: |
... | ... | @@ -3680,6 +3692,9 @@ class ObjectCalibrationDialog(wx.Dialog): |
3680 | 3692 | |
3681 | 3693 | if evt.GetSelection(): |
3682 | 3694 | self.obj_ref_id = 2 |
3695 | + if self.tracker_id == const.FASTRAK or self.tracker_id == const.DEBUGTRACK: | |
3696 | + self.choice_sensor.Show(True) | |
3697 | + self.Layout() | |
3683 | 3698 | else: |
3684 | 3699 | self.obj_ref_id = 0 |
3685 | 3700 | for m in range(0, 5): |
... | ... | @@ -3688,6 +3703,12 @@ class ObjectCalibrationDialog(wx.Dialog): |
3688 | 3703 | for n in range(0, 3): |
3689 | 3704 | self.txt_coord[m][n].SetLabel('-') |
3690 | 3705 | |
3706 | + def OnChoiceFTSensor(self, evt): | |
3707 | + if evt.GetSelection(): | |
3708 | + self.obj_ref_id = 3 | |
3709 | + else: | |
3710 | + self.obj_ref_id = 0 | |
3711 | + | |
3691 | 3712 | def GetValue(self): |
3692 | 3713 | return self.obj_fiducials, self.obj_orients, self.obj_ref_id, self.obj_name |
3693 | 3714 | ... | ... |
invesalius/gui/task_navigator.py
... | ... | @@ -134,13 +134,9 @@ class InnerFoldPanel(wx.Panel): |
134 | 134 | # is not working properly in this panel. It might be on some child or |
135 | 135 | # parent panel. Perhaps we need to insert the item into the sizer also... |
136 | 136 | # Study this. |
137 | - displaySize = wx.DisplaySize() | |
138 | - if displaySize[1] > 768: | |
139 | - fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition, | |
140 | - (10, 350), 0, fpb.FPB_SINGLE_FOLD) | |
141 | - else: | |
142 | - fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition, | |
143 | - (10, 320), 0, fpb.FPB_SINGLE_FOLD) | |
137 | + | |
138 | + fold_panel = fpb.FoldPanelBar(self, -1, wx.DefaultPosition, | |
139 | + (10, 290), 0, fpb.FPB_SINGLE_FOLD) | |
144 | 140 | # Fold panel style |
145 | 141 | style = fpb.CaptionBarStyle() |
146 | 142 | style.SetCaptionStyle(fpb.CAPTIONBAR_GRADIENT_V) |
... | ... | @@ -305,8 +301,8 @@ class NeuronavigationPanel(wx.Panel): |
305 | 301 | self.ref_mode_id = const.DEFAULT_REF_MODE |
306 | 302 | |
307 | 303 | # Initialize list of buttons and numctrls for wx objects |
308 | - self.btns_coord = [None] * 7 | |
309 | - self.numctrls_coord = [list(), list(), list(), list(), list(), list(), list()] | |
304 | + self.btns_coord = [None, None, None, None, None, None] | |
305 | + self.numctrls_coord = [[], [], [], [], [], []] | |
310 | 306 | |
311 | 307 | # ComboBox for spatial tracker device selection |
312 | 308 | tooltip = wx.ToolTip(_("Choose the tracking device")) |
... | ... | @@ -345,11 +341,7 @@ class NeuronavigationPanel(wx.Panel): |
345 | 341 | lab = list(btns_trk[k].values())[0] |
346 | 342 | self.btns_coord[n] = wx.Button(self, k, label=lab, size=wx.Size(45, 23)) |
347 | 343 | self.btns_coord[n].SetToolTip(wx.ToolTip(tips_trk[n-3])) |
348 | - # Exception for event of button that set image coordinates | |
349 | - if n == 6: | |
350 | - self.btns_coord[n].Bind(wx.EVT_BUTTON, self.OnSetImageCoordinates) | |
351 | - else: | |
352 | - self.btns_coord[n].Bind(wx.EVT_BUTTON, self.OnTrackerFiducials) | |
344 | + self.btns_coord[n].Bind(wx.EVT_BUTTON, self.OnTrackerFiducials) | |
353 | 345 | |
354 | 346 | # TODO: Find a better allignment between FRE, text and navigate button |
355 | 347 | txt_fre = wx.StaticText(self, -1, _('FRE:')) |
... | ... | @@ -370,8 +362,8 @@ class NeuronavigationPanel(wx.Panel): |
370 | 362 | btn_nav.Bind(wx.EVT_TOGGLEBUTTON, partial(self.OnNavigate, btn=(btn_nav, choice_trck, choice_ref))) |
371 | 363 | |
372 | 364 | # Image and tracker coordinates number controls |
373 | - for m in range(0, 7): | |
374 | - for n in range(0, 3): | |
365 | + for m in range(len(self.btns_coord)): | |
366 | + for n in range(3): | |
375 | 367 | self.numctrls_coord[m].append( |
376 | 368 | wx.lib.masked.numctrl.NumCtrl(parent=self, integerWidth=4, fractionWidth=1)) |
377 | 369 | |
... | ... | @@ -382,9 +374,9 @@ class NeuronavigationPanel(wx.Panel): |
382 | 374 | |
383 | 375 | coord_sizer = wx.GridBagSizer(hgap=5, vgap=5) |
384 | 376 | |
385 | - for m in range(0, 7): | |
377 | + for m in range(len(self.btns_coord)): | |
386 | 378 | coord_sizer.Add(self.btns_coord[m], pos=wx.GBPosition(m, 0)) |
387 | - for n in range(0, 3): | |
379 | + for n in range(3): | |
388 | 380 | coord_sizer.Add(self.numctrls_coord[m][n], pos=wx.GBPosition(m, n+1)) |
389 | 381 | if m in range(1, 6): |
390 | 382 | self.numctrls_coord[m][n].SetEditable(False) |
... | ... | @@ -432,13 +424,8 @@ class NeuronavigationPanel(wx.Panel): |
432 | 424 | def UpdateImageCoordinates(self, position): |
433 | 425 | # TODO: Change from world coordinates to matrix coordinates. They are better for multi software communication. |
434 | 426 | self.current_coord = position |
435 | - for m in [0, 1, 2, 6]: | |
436 | - if m == 6 and self.btns_coord[m].IsEnabled(): | |
437 | - for n in [0, 1, 2]: | |
438 | - self.numctrls_coord[m][n].SetValue(float(self.current_coord[n])) | |
439 | - elif m != 6 and not self.btns_coord[m].GetValue(): | |
440 | - # btn_state = self.btns_coord[m].GetValue() | |
441 | - # if not btn_state: | |
427 | + for m in [0, 1, 2]: | |
428 | + if not self.btns_coord[m].GetValue(): | |
442 | 429 | for n in [0, 1, 2]: |
443 | 430 | self.numctrls_coord[m][n].SetValue(float(self.current_coord[n])) |
444 | 431 | |
... | ... | @@ -544,19 +531,6 @@ class NeuronavigationPanel(wx.Panel): |
544 | 531 | nav_prop=(self.tracker_id, self.trk_init, self.ref_mode_id)) |
545 | 532 | print("Reference mode changed!") |
546 | 533 | |
547 | - def OnSetImageCoordinates(self, evt): | |
548 | - # FIXME: Cross does not update in last clicked slice, only on the other two | |
549 | - btn_id = list(const.BTNS_TRK[evt.GetId()].keys())[0] | |
550 | - | |
551 | - ux, uy, uz = self.numctrls_coord[btn_id][0].GetValue(),\ | |
552 | - self.numctrls_coord[btn_id][1].GetValue(),\ | |
553 | - self.numctrls_coord[btn_id][2].GetValue() | |
554 | - | |
555 | - Publisher.sendMessage('Set ball reference position', position=(ux, uy, uz)) | |
556 | - # Publisher.sendMessage('Set camera in volume', (ux, uy, uz)) | |
557 | - Publisher.sendMessage('Co-registered points', arg=(ux, uy, uz), position=(0., 0., 0.)) | |
558 | - Publisher.sendMessage('Update cross position', position=(ux, uy, uz)) | |
559 | - | |
560 | 534 | def OnImageFiducials(self, evt): |
561 | 535 | btn_id = list(const.BTNS_IMG_MKS[evt.GetId()].keys())[0] |
562 | 536 | marker_id = list(const.BTNS_IMG_MKS[evt.GetId()].values())[0] |
... | ... | @@ -714,9 +688,6 @@ class NeuronavigationPanel(wx.Panel): |
714 | 688 | for n in range(0, 3): |
715 | 689 | self.numctrls_coord[m][n].SetValue(0.0) |
716 | 690 | |
717 | - for n in range(0, 3): | |
718 | - self.numctrls_coord[6][n].SetValue(0.0) | |
719 | - | |
720 | 691 | def ResetTrackerFiducials(self): |
721 | 692 | for m in range(3, 6): |
722 | 693 | self.fiducials[m, :] = [np.nan, np.nan, np.nan] | ... | ... |