From 0ba6002010b090f85010fc4e92c8cca0a34d4784 Mon Sep 17 00:00:00 2001 From: Renan Date: Fri, 7 Jun 2019 09:34:42 -0300 Subject: [PATCH] Navigation updates (#187) --- invesalius/constants.py | 22 +++++++++++++--------- invesalius/data/coordinates.py | 44 ++++++++++++++++++++++++++++++++++++++------ invesalius/data/surface.py | 1 + invesalius/data/trackers.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- invesalius/data/viewer_volume.py | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------ invesalius/gui/dialogs.py | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ invesalius/gui/task_navigator.py | 6 +++--- invesalius/inv_paths.py | 11 ++++++++--- navigation/mtc_files/Markers/3Coil_big | 39 +++++++++++++++++++++++++++++++++++++++ navigation/ndi_files/Markers/8700338.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/8700339.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/8700340.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/NBSprobe.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/NBSref.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/NT-103.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/NT-112.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/NT-115.rom | Bin 0 -> 752 bytes navigation/ndi_files/Markers/active-wireless.rom | Bin 0 -> 752 bytes 18 files changed, 381 insertions(+), 118 deletions(-) create mode 100644 navigation/mtc_files/Markers/3Coil_big create mode 100644 navigation/ndi_files/Markers/8700338.rom create mode 100644 navigation/ndi_files/Markers/8700339.rom create mode 100644 navigation/ndi_files/Markers/8700340.rom create mode 100644 navigation/ndi_files/Markers/NBSprobe.rom create mode 100644 navigation/ndi_files/Markers/NBSref.rom create mode 100644 navigation/ndi_files/Markers/NT-103.rom create mode 100644 navigation/ndi_files/Markers/NT-112.rom create mode 100644 navigation/ndi_files/Markers/NT-115.rom create mode 100644 navigation/ndi_files/Markers/active-wireless.rom diff --git a/invesalius/constants.py b/invesalius/constants.py index 36fa3ac..7a793db 100644 --- a/invesalius/constants.py +++ b/invesalius/constants.py @@ -650,14 +650,18 @@ MTC = 1 FASTRAK = 2 ISOTRAKII = 3 PATRIOT = 4 -DEBUGTRACK = 5 -DISCTRACK = 6 +CAMERA = 5 +POLARIS = 6 +DEBUGTRACK = 7 +DISCTRACK = 8 DEFAULT_TRACKER = SELECT +NDICOMPORT = b'COM1' + TRACKER = [_("Select tracker:"), _("Claron MicronTracker"), _("Polhemus FASTRAK"), _("Polhemus ISOTRAK II"), - _("Polhemus PATRIOT"), _("Debug tracker"), - _("Disconnect tracker")] + _("Polhemus PATRIOT"), _("Camera tracker"), + _("NDI Polaris"), _("Debug tracker"), _("Disconnect tracker")] STATIC_REF = 0 DYNAMIC_REF = 1 @@ -715,13 +719,13 @@ TIPS_OBJ = [_("Select left object fiducial"), _("Select object center"), _("Attach sensor to object")] -PROBE_NAME = "1Probe" -REF_NAME = "2Ref" -OBJ_NAME = "3Coil" +MTC_PROBE_NAME = "1Probe" +MTC_REF_NAME = "2Ref" +MTC_OBJ_NAME = "3Coil" #OBJECT TRACKING -ARROW_SCALE = 3 -ARROW_UPPER_LIMIT = 30 +ARROW_SCALE = 6 +ARROW_UPPER_LIMIT = 15 #COIL_ANGLES_THRESHOLD = 3 * ARROW_SCALE COIL_ANGLES_THRESHOLD = 3 COIL_COORD_THRESHOLD = 3 diff --git a/invesalius/data/coordinates.py b/invesalius/data/coordinates.py index aef364a..c1b759d 100644 --- a/invesalius/data/coordinates.py +++ b/invesalius/data/coordinates.py @@ -21,6 +21,7 @@ from math import sin, cos import numpy as np import invesalius.data.transformations as tr +import invesalius.constants as const from time import sleep from random import uniform @@ -40,17 +41,48 @@ def GetCoordinates(trck_init, trck_id, ref_mode): coord = None if trck_id: - getcoord = {1: ClaronCoord, - 2: PolhemusCoord, - 3: PolhemusCoord, - 4: PolhemusCoord, - 5: DebugCoord} + getcoord = {const.MTC: ClaronCoord, + const.FASTRAK: PolhemusCoord, + const.ISOTRAKII: PolhemusCoord, + const.PATRIOT: PolhemusCoord, + const.CAMERA: CameraCoord, + const.POLARIS: PolarisCoord, + const.DEBUGTRACK: DebugCoord} coord = getcoord[trck_id](trck_init, trck_id, ref_mode) else: print("Select Tracker") return coord +def PolarisCoord(trck_init, trck_id, ref_mode): + trck = trck_init[0] + trck.Run() + + probe = trck.probe.decode(const.FS_ENCODE).split(',') + angles_probe = np.degrees(tr.euler_from_quaternion(probe[2:6], axes='rzyx')) + trans_probe = np.array(probe[6:9]).astype(float) + coord1 = np.hstack((trans_probe, angles_probe)) + + ref = trck.ref.decode(const.FS_ENCODE).split(',') + angles_ref = np.degrees(tr.euler_from_quaternion(ref[2:6], axes='rzyx')) + trans_ref = np.array(ref[6:9]).astype(float) + coord2 = np.hstack((trans_ref, angles_ref)) + + obj = trck.obj.decode(const.FS_ENCODE).split(',') + angles_obj = np.degrees(tr.euler_from_quaternion(obj[2:6], axes='rzyx')) + trans_obj = np.array(obj[6:9]).astype(float) + coord3 = np.hstack((trans_obj, angles_obj)) + + coord = np.vstack([coord1, coord2, coord3]) + Publisher.sendMessage('Sensors ID', probe_id=trck.probeID, ref_id=trck.refID, obj_id=trck.objID) + + return coord + +def CameraCoord(trck_init, trck_id, ref_mode): + trck = trck_init[0] + coord, probeID, refID = trck.Run() + Publisher.sendMessage('Sensors ID', probe_id=probeID, ref_id=refID) + return coord def ClaronCoord(trck_init, trck_id, ref_mode): trck = trck_init[0] @@ -214,7 +246,7 @@ def DebugCoord(trk_init, trck_id, ref_mode): coord4 = np.array([uniform(1, 200), uniform(1, 200), uniform(1, 200), uniform(-180.0, 180.0), uniform(-180.0, 180.0), uniform(-180.0, 180.0)]) - Publisher.sendMessage('Sensors ID', probe_id=int(uniform(0, 5)), ref_id=int(uniform(0, 5))) + Publisher.sendMessage('Sensors ID', probe_id=int(uniform(0, 5)), ref_id=int(uniform(0, 5)), obj_id=int(uniform(0, 5))) return np.vstack([coord1, coord2, coord3, coord4]) diff --git a/invesalius/data/surface.py b/invesalius/data/surface.py index 4a7179b..238bb84 100644 --- a/invesalius/data/surface.py +++ b/invesalius/data/surface.py @@ -313,6 +313,7 @@ class SurfaceManager(): reader = vtk.vtkSTLReader() elif filename.lower().endswith('.ply'): reader = vtk.vtkPLYReader() + scalar = True elif filename.lower().endswith('.obj'): reader = vtk.vtkOBJReader() elif filename.lower().endswith('.vtp'): diff --git a/invesalius/data/trackers.py b/invesalius/data/trackers.py index aec84d6..7a072b6 100644 --- a/invesalius/data/trackers.py +++ b/invesalius/data/trackers.py @@ -16,7 +16,8 @@ # PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais # detalhes. #-------------------------------------------------------------------------- - +import invesalius.constants as const +import invesalius.gui.dialogs as dlg # TODO: Disconnect tracker when a new one is connected # TODO: Test if there are too many prints when connection fails @@ -32,11 +33,13 @@ def TrackerConnection(tracker_id, trck_init, action): """ if action == 'connect': - trck_fcn = {1: ClaronTracker, - 2: PolhemusTracker, # FASTRAK - 3: PolhemusTracker, # ISOTRAK - 4: PolhemusTracker, # PATRIOT - 5: DebugTracker} + trck_fcn = {const.MTC: ClaronTracker, + const.FASTRAK: PolhemusTracker, # FASTRAK + const.ISOTRAKII: PolhemusTracker, # ISOTRAK + const.PATRIOT: PolhemusTracker, # PATRIOT + const.CAMERA: CameraTracker, # CAMERA + const.POLARIS: PolarisTracker, # POLARIS + const.DEBUGTRACK: DebugTracker} trck_init = trck_fcn[tracker_id](tracker_id) @@ -58,6 +61,48 @@ def DefaultTracker(tracker_id): # return tracker initialization variable and type of connection return trck_init, 'wrapper' +def PolarisTracker(tracker_id): + from wx import ID_OK + trck_init = None + dlg_port = dlg.SetNDIconfigs() + if dlg_port.ShowModal() == ID_OK: + com_port, PROBE_DIR, REF_DIR, OBJ_DIR = dlg_port.GetValue() + try: + import pypolaris + lib_mode = 'wrapper' + trck_init = pypolaris.pypolaris() + + if trck_init.Initialize(com_port, PROBE_DIR, REF_DIR, OBJ_DIR) != 0: + trck_init = None + lib_mode = None + print('Could not connect to default tracker.') + else: + print('Connect to polaris tracking device.') + + except: + lib_mode = 'error' + trck_init = None + print('Could not connect to default tracker.') + else: + lib_mode = None + print('Could not connect to default tracker.') + + # return tracker initialization variable and type of connection + return trck_init, lib_mode + +def CameraTracker(tracker_id): + trck_init = None + try: + import invesalius.data.camera_tracker as cam + trck_init = cam.camera() + trck_init.Initialize() + print('Connect to camera tracking device.') + + except: + print('Could not connect to default tracker.') + + # return tracker initialization variable and type of connection + return trck_init, 'wrapper' def ClaronTracker(tracker_id): import invesalius.constants as const @@ -69,13 +114,13 @@ def ClaronTracker(tracker_id): lib_mode = 'wrapper' trck_init = pyclaron.pyclaron() - trck_init.CalibrationDir = inv_paths.CAL_DIR.encode(const.FS_ENCODE) - trck_init.MarkerDir = inv_paths.MAR_DIR.encode(const.FS_ENCODE) + trck_init.CalibrationDir = inv_paths.MTC_CAL_DIR.encode(const.FS_ENCODE) + trck_init.MarkerDir = inv_paths.MTC_MAR_DIR.encode(const.FS_ENCODE) trck_init.NumberFramesProcessed = 1 trck_init.FramesExtrapolated = 0 - trck_init.PROBE_NAME = const.PROBE_NAME.encode(const.FS_ENCODE) - trck_init.REF_NAME = const.REF_NAME.encode(const.FS_ENCODE) - trck_init.OBJ_NAME = const.OBJ_NAME.encode(const.FS_ENCODE) + trck_init.PROBE_NAME = const.MTC_PROBE_NAME.encode(const.FS_ENCODE) + trck_init.REF_NAME = const.MTC_REF_NAME.encode(const.FS_ENCODE) + trck_init.OBJ_NAME = const.MTC_OBJ_NAME.encode(const.FS_ENCODE) trck_init.Initialize() if trck_init.GetIdentifyingCamera(): @@ -146,25 +191,38 @@ def PlhWrapperConnection(tracker_id): def PlhSerialConnection(tracker_id): import serial + from wx import ID_OK + trck_init = None + dlg_port = dlg.SetCOMport() + if dlg_port.ShowModal() == ID_OK: + com_port = dlg_port.GetValue() + try: + trck_init = serial.Serial(com_port, baudrate=115200, timeout=0.03) + + if tracker_id == 2: + # Polhemus FASTRAK needs configurations first + trck_init.write(0x02, str.encode("u")) + trck_init.write(0x02, str.encode("F")) + elif tracker_id == 3: + # Polhemus ISOTRAK needs to set tracking point from + # center to tip. + trck_init.write(str.encode("u")) + trck_init.write(str.encode("F")) + trck_init.write(str.encode("Y")) + + trck_init.write(str.encode("P")) + data = trck_init.readlines() + if not data: + trck_init = None + print('Could not connect to Polhemus serial without error.') - trck_init = serial.Serial('COM3', baudrate=115200, timeout=0.03) - - if tracker_id == 2: - # Polhemus FASTRAK needs configurations first - trck_init.write(0x02, str.encode("u")) - trck_init.write(0x02, str.encode("F")) - elif tracker_id == 3: - # Polhemus ISOTRAK needs to set tracking point from - # center to tip. - trck_init.write(str.encode("u")) - trck_init.write(str.encode("F")) - trck_init.write(str.encode("Y")) - - trck_init.write(str.encode("P")) - data = trck_init.readlines() - if not data: - trck_init = None - print('Could not connect to Polhemus serial without error.') + except: + lib_mode = 'error' + trck_init = None + print('Could not connect to default tracker.') + else: + lib_mode = None + print('Could not connect to default tracker.') return trck_init @@ -211,13 +269,13 @@ def DisconnectTracker(tracker_id, trck_init): :param trck_init: Initialization variable of tracking device. """ - if tracker_id == 5: + if tracker_id == const.DEBUGTRACK: trck_init = False lib_mode = 'debug' print('Debug tracker disconnected.') else: try: - if tracker_id == 3: + if tracker_id == const.ISOTRAKII: trck_init.close() trck_init = False lib_mode = 'serial' diff --git a/invesalius/data/viewer_volume.py b/invesalius/data/viewer_volume.py index b49fdaf..dd7310e 100644 --- a/invesalius/data/viewer_volume.py +++ b/invesalius/data/viewer_volume.py @@ -172,8 +172,9 @@ class Viewer(wx.Panel): self._to_show_ball = 0 self._ball_ref_visibility = False - self.sen1 = False - self.sen2 = False + self.probe = False + self.ref = False + self.obj = False self.timer = False self.index = False @@ -325,8 +326,8 @@ class Viewer(wx.Panel): self.RemoveBallReference() self.interactor.Render() - def OnSensors(self, probe_id, ref_id): - if not self.sen1: + def OnSensors(self, probe_id, ref_id, obj_id=0): + if not self.probe: self.CreateSensorID() if probe_id: @@ -337,35 +338,49 @@ class Viewer(wx.Panel): colour2 = (0, 1, 0) else: colour2 = (1, 0, 0) + if obj_id: + colour3 = (0, 1, 0) + else: + colour3 = (1, 0, 0) - self.sen1.SetColour(colour1) - self.sen2.SetColour(colour2) + self.probe.SetColour(colour1) + self.ref.SetColour(colour2) + self.obj.SetColour(colour3) 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) + probe = vtku.Text() + probe.SetSize(const.TEXT_SIZE_LARGE) + probe.SetPosition((const.X, const.Y)) + probe.ShadowOff() + probe.SetValue("P") + self.probe = probe + self.ren.AddActor(probe.actor) + + ref = vtku.Text() + ref.SetSize(const.TEXT_SIZE_LARGE) + ref.SetPosition((const.X+0.04, const.Y)) + ref.ShadowOff() + ref.SetValue("R") + self.ref = ref + self.ren.AddActor(ref.actor) + + obj = vtku.Text() + obj.SetSize(const.TEXT_SIZE_LARGE) + obj.SetPosition((const.X+0.08, const.Y)) + obj.ShadowOff() + obj.SetValue("O") + self.obj = obj + self.ren.AddActor(obj.actor) self.interactor.Render() def OnRemoveSensorsID(self): - if self.sen1: - self.ren.RemoveActor(self.sen1.actor) - self.ren.RemoveActor(self.sen2.actor) - self.sen1 = self.sen2 = False + if self.probe: + self.ren.RemoveActor(self.probe.actor) + self.ren.RemoveActor(self.ref.actor) + self.ren.RemoveActor(self.obj.actor) + self.probe = self.ref = self.obj = False self.interactor.Render() def OnShowSurface(self, index, visibility): @@ -708,7 +723,7 @@ class Viewer(wx.Panel): (self.target_coord[0], -self.target_coord[1], self.target_coord[2])) # self.txt.SetCoilDistanceValue(target_dist) - self.textSource.SetText('Dist: ' + str("{:06.2f}".format(target_dist)) + ' mm') + self.tdist.SetValue('Distance: ' + str("{:06.2f}".format(target_dist)) + ' mm') self.ren.ResetCamera() self.SetCameraTarget() if target_dist > 100: @@ -819,9 +834,6 @@ class Viewer(wx.Panel): self.ren2.AddActor(ind) - x, y, z = bases.flip_x(coord[0:3]) - self.tactor.SetPosition(x-20, y-30, z+20) - self.Refresh() def OnUpdateTargetCoordinates(self, coord): @@ -841,27 +853,6 @@ class Viewer(wx.Panel): self.RemoveTargetAim() self.aim_actor = None - self.textSource = vtk.vtkVectorText() - mapper = vtk.vtkPolyDataMapper() - mapper.SetInputConnection(self.textSource.GetOutputPort()) - tactor = vtk.vtkFollower() - tactor.SetMapper(mapper) - tactor.GetProperty().SetColor(1.0, 0.25, 0.0) - tactor.SetScale(5) - #tactor.SetPosition(self.target_coord[0]+10, self.target_coord[1]+30, self.target_coord[2]+20) - self.ren.AddActor(tactor) - self.tactor = tactor - tactor.SetCamera(self.ren.GetActiveCamera()) - - - # v3, M_plane_inv = self.Plane(self.target_coord[0:3], self.pTarget) - # mat4x4 = vtk.vtkMatrix4x4() - # for i in range(4): - # mat4x4.SetElement(i, 0, M_plane_inv[i][0]) - # mat4x4.SetElement(i, 1, M_plane_inv[i][1]) - # mat4x4.SetElement(i, 2, M_plane_inv[i][2]) - # mat4x4.SetElement(i, 3, M_plane_inv[i][3]) - a, b, g = np.radians(self.target_coord[3:]) r_ref = tr.euler_matrix(a, b, g, 'sxyz') t_ref = tr.translation_matrix(self.target_coord[:3]) @@ -885,7 +876,6 @@ class Viewer(wx.Panel): # Transform the polydata transform = vtk.vtkTransform() transform.SetMatrix(m_img_vtk) - #transform.SetMatrix(mat4x4) transformPD = vtk.vtkTransformPolyDataFilter() transformPD.SetTransform(transform) transformPD.SetInputConnection(reader.GetOutputPort()) @@ -934,24 +924,24 @@ class Viewer(wx.Panel): def RemoveTargetAim(self): self.ren.RemoveActor(self.aim_actor) self.ren.RemoveActor(self.dummy_coil_actor) - self.ren.RemoveActor(self.tactor) self.Refresh() def CreateTextDistance(self): - txt = vtku.Text() - txt.SetSize(const.TEXT_SIZE_EXTRA_LARGE) - txt.SetPosition((0.76, 0.05)) - txt.ShadowOff() - txt.BoldOn() - self.txt = txt - self.ren2.AddActor(txt.actor) + tdist = vtku.Text() + tdist.SetSize(const.TEXT_SIZE_LARGE) + tdist.SetPosition((const.X, 1.03-const.Y)) + tdist.ShadowOff() + tdist.BoldOn() + + self.ren.AddActor(tdist.actor) + self.tdist = tdist def DisableCoilTracker(self): try: self.ren.SetViewport(0, 0, 1, 1) self.interactor.GetRenderWindow().RemoveRenderer(self.ren2) self.SetViewAngle(const.VOL_FRONT) - self.ren.RemoveActor(self.txt.actor) + self.ren.RemoveActor(self.tdist.actor) self.CreateTargetAim() self.interactor.Render() except: diff --git a/invesalius/gui/dialogs.py b/invesalius/gui/dialogs.py index eb3e815..53bec7d 100644 --- a/invesalius/gui/dialogs.py +++ b/invesalius/gui/dialogs.py @@ -923,11 +923,13 @@ def NavigationTrackerWarning(trck_id, lib_mode): """ Spatial Tracker connection error """ - trck = {1: 'Claron MicronTracker', - 2: 'Polhemus FASTRAK', - 3: 'Polhemus ISOTRAK', - 4: 'Polhemus PATRIOT', - 5: 'Debug tracker device'} + trck = {const.MTC: 'Claron MicronTracker', + const.FASTRAK: 'Polhemus FASTRAK', + const.ISOTRAKII: 'Polhemus ISOTRAK', + const.PATRIOT: 'Polhemus PATRIOT', + const.CAMERA: 'CAMERA', + const.POLARIS: 'NDI Polaris', + const.DEBUGTRACK: 'Debug tracker device'} if lib_mode == 'choose': msg = _('No tracking device selected') @@ -3351,7 +3353,7 @@ class ObjectCalibrationDialog(wx.Dialog): choice_ref.SetToolTip(tooltip) choice_ref.Bind(wx.EVT_COMBOBOX, self.OnChoiceRefMode) choice_ref.Enable(0) - if self.tracker_id == const.MTC or self.tracker_id == const.FASTRAK or self.tracker_id == const.DEBUGTRACK: + if not (self.tracker_id == const.PATRIOT or self.tracker_id == const.ISOTRAKII): choice_ref.Enable(1) # ComboBox for sensor selection for FASTRAK @@ -3778,3 +3780,135 @@ class GoToDialogScannerCoord(wx.Dialog): def Close(self): wx.Dialog.Close(self) self.Destroy() + +class SetNDIconfigs(wx.Dialog): + def __init__(self, title=_("Setting NDI polaris configs:")): + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) + self._init_gui() + + def serial_ports(self): + """ Lists serial port names + """ + import serial.tools.list_ports + if sys.platform.startswith('win'): + ports = ([comport.device for comport in serial.tools.list_ports.comports()]) + else: + raise EnvironmentError('Unsupported platform') + return ports + + def _init_gui(self): + self.com_ports = wx.ComboBox(self, -1, style=wx.CB_DROPDOWN|wx.CB_READONLY) + row_com = wx.BoxSizer(wx.VERTICAL) + row_com.Add(wx.StaticText(self, wx.ID_ANY, "Select the COM port"), 0, wx.TOP|wx.RIGHT,5) + row_com.Add(self.com_ports, 0, wx.EXPAND) + + ports = self.serial_ports() + self.com_ports.Append(ports) + + self.dir_probe = wx.FilePickerCtrl(self, path=inv_paths.NDI_MAR_DIR_REF, style=wx.FLP_USE_TEXTCTRL|wx.FLP_SMALL, + wildcard="Rom files (*.rom)|*.rom", message="Select probe's rom file") + row_probe = wx.BoxSizer(wx.VERTICAL) + row_probe.Add(wx.StaticText(self, wx.ID_ANY, "Set probe's rom file"), 0, wx.TOP|wx.RIGHT, 5) + row_probe.Add(self.dir_probe, 0, wx.EXPAND|wx.ALIGN_CENTER) + + self.dir_ref = wx.FilePickerCtrl(self, path=inv_paths.NDI_MAR_DIR_REF, style=wx.FLP_USE_TEXTCTRL|wx.FLP_SMALL, + wildcard="Rom files (*.rom)|*.rom", message="Select reference's rom file") + row_ref = wx.BoxSizer(wx.VERTICAL) + row_ref.Add(wx.StaticText(self, wx.ID_ANY, "Set reference's rom file"), 0, wx.TOP | wx.RIGHT, 5) + row_ref.Add(self.dir_ref, 0, wx.EXPAND|wx.ALIGN_CENTER) + + self.dir_obj = wx.FilePickerCtrl(self, path=inv_paths.NDI_MAR_DIR_OBJ, style=wx.FLP_USE_TEXTCTRL|wx.FLP_SMALL, + wildcard="Rom files (*.rom)|*.rom", message="Select object's rom file") + #self.dir_probe.Bind(wx.EVT_FILEPICKER_CHANGED, self.Selected) + row_obj = wx.BoxSizer(wx.VERTICAL) + row_obj.Add(wx.StaticText(self, wx.ID_ANY, "Set object's rom file"), 0, wx.TOP|wx.RIGHT, 5) + row_obj.Add(self.dir_obj, 0, wx.EXPAND|wx.ALIGN_CENTER) + + # self.goto_orientation.SetSelection(cb_init) + + btn_ok = wx.Button(self, wx.ID_OK) + btn_ok.SetHelpText("") + btn_ok.SetDefault() + + btn_cancel = wx.Button(self, wx.ID_CANCEL) + btn_cancel.SetHelpText("") + + btnsizer = wx.StdDialogButtonSizer() + btnsizer.AddButton(btn_ok) + btnsizer.AddButton(btn_cancel) + btnsizer.Realize() + + main_sizer = wx.BoxSizer(wx.VERTICAL) + + main_sizer.Add((5, 5)) + main_sizer.Add(row_com, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) + main_sizer.Add((5, 5)) + main_sizer.Add(row_probe, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) + main_sizer.Add((5, 5)) + main_sizer.Add(row_ref, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) + main_sizer.Add((5, 5)) + main_sizer.Add(row_obj, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) + main_sizer.Add((15, 15)) + main_sizer.Add(btnsizer, 0, wx.EXPAND) + main_sizer.Add((5, 5)) + + self.SetSizer(main_sizer) + main_sizer.Fit(self) + + self.CenterOnParent() + + def GetValue(self): + return self.com_ports.GetString(self.com_ports.GetSelection()).encode(const.FS_ENCODE), \ + self.dir_probe.GetPath().encode(const.FS_ENCODE),\ + self.dir_ref.GetPath().encode(const.FS_ENCODE), \ + self.dir_obj.GetPath().encode(const.FS_ENCODE) + +class SetCOMport(wx.Dialog): + def __init__(self, title=_("Select COM port")): + wx.Dialog.__init__(self, wx.GetApp().GetTopWindow(), -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.STAY_ON_TOP) + self._init_gui() + + def serial_ports(self): + """ Lists serial port names + """ + import serial.tools.list_ports + if sys.platform.startswith('win'): + ports = ([comport.device for comport in serial.tools.list_ports.comports()]) + else: + raise EnvironmentError('Unsupported platform') + return ports + + def _init_gui(self): + self.com_ports = wx.ComboBox(self, -1, style=wx.CB_DROPDOWN|wx.CB_READONLY) + ports = self.serial_ports() + self.com_ports.Append(ports) + + # self.goto_orientation.SetSelection(cb_init) + + btn_ok = wx.Button(self, wx.ID_OK) + btn_ok.SetHelpText("") + btn_ok.SetDefault() + + btn_cancel = wx.Button(self, wx.ID_CANCEL) + btn_cancel.SetHelpText("") + + btnsizer = wx.StdDialogButtonSizer() + btnsizer.AddButton(btn_ok) + btnsizer.AddButton(btn_cancel) + btnsizer.Realize() + + main_sizer = wx.BoxSizer(wx.VERTICAL) + + main_sizer.Add((5, 5)) + main_sizer.Add(self.com_ports, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) + main_sizer.Add((5, 5)) + main_sizer.Add(btnsizer, 0, wx.EXPAND) + main_sizer.Add((5, 5)) + + self.SetSizer(main_sizer) + main_sizer.Fit(self) + + self.CenterOnParent() + + def GetValue(self): + return self.com_ports.GetString(self.com_ports.GetSelection()) \ No newline at end of file diff --git a/invesalius/gui/task_navigator.py b/invesalius/gui/task_navigator.py index 2ae3210..c72aa7d 100644 --- a/invesalius/gui/task_navigator.py +++ b/invesalius/gui/task_navigator.py @@ -453,7 +453,7 @@ class NeuronavigationPanel(wx.Panel): if hasattr(evt, 'GetSelection'): choice = evt.GetSelection() else: - choice = 6 + choice = const.DISCTRACK if self.trk_init: trck = self.trk_init[0] @@ -462,7 +462,7 @@ class NeuronavigationPanel(wx.Panel): # Conditions check if click was on current selection and if any other tracker # has been initialized before - if trck and choice != 6: + if trck and choice != const.DISCTRACK: self.ResetTrackerFiducials() Publisher.sendMessage('Update status text in GUI', label=_("Disconnecting tracker...")) @@ -480,7 +480,7 @@ class NeuronavigationPanel(wx.Panel): else: ctrl.SetSelection(self.tracker_id) print("Tracker connected!") - elif choice == 6: + elif choice == const.DISCTRACK: if trck: self.ResetTrackerFiducials() Publisher.sendMessage('Update status text in GUI', diff --git a/invesalius/inv_paths.py b/invesalius/inv_paths.py index dd7d523..544b82d 100644 --- a/invesalius/inv_paths.py +++ b/invesalius/inv_paths.py @@ -49,9 +49,14 @@ else: ) # Navigation paths -CAL_DIR = INV_TOP_DIR.joinpath("navigation", "mtc_files", "CalibrationFiles") -MAR_DIR = INV_TOP_DIR.joinpath("navigation", "mtc_files", "Markers") -OBJ_DIR = INV_TOP_DIR.joinpath("navigation", "objects") +OBJ_DIR = str(INV_TOP_DIR.joinpath("navigation", "objects")) + +MTC_CAL_DIR = str(INV_TOP_DIR.joinpath("navigation", "mtc_files", "CalibrationFiles")) +MTC_MAR_DIR = str(INV_TOP_DIR.joinpath("navigation", "mtc_files", "Markers")) + +NDI_MAR_DIR_PROBE = str(INV_TOP_DIR.joinpath("navigation", "ndi_files", "Markers", "8700340.rom")) +NDI_MAR_DIR_REF = str(INV_TOP_DIR.joinpath("navigation", "ndi_files", "Markers", "8700339.rom")) +NDI_MAR_DIR_OBJ = str(INV_TOP_DIR.joinpath("navigation", "ndi_files", "Markers", "8700338.rom")) # MAC App if not os.path.exists(ICON_DIR): diff --git a/navigation/mtc_files/Markers/3Coil_big b/navigation/mtc_files/Markers/3Coil_big new file mode 100644 index 0000000..c99a7db --- /dev/null +++ b/navigation/mtc_files/Markers/3Coil_big @@ -0,0 +1,39 @@ + +[Marker] +FacetsCount=1 +SliderControlledXpointsCount=0 +Name=3Coil_big + +[Facet1] +VectorsCount=2 + +[Facet1V1] +EndPos(0,0)=-12.130921665071337 +EndPos(0,1)=4.771099944171531e-005 +EndPos(0,2)=-1.6777868612989378e-016 +EndPos(1,0)=12.131083622124752 +EndPos(1,1)=1.0800131569805988e-004 +EndPos(1,2)=-2.4831245547224282e-015 + +[Facet1V2] +EndPos(0,0)=-12.143021882072084 +EndPos(0,1)=-16.190735690907974 +EndPos(0,2)=-1.3422294890391503e-015 +EndPos(1,0)=-12.130921665071337 +EndPos(1,1)=4.771099944171531e-005 +EndPos(1,2)=-1.6777868612989378e-016 + +[Tooltip2MarkerXf] +Scale=1. +S0=0. +R0,0=1. +R1,0=0. +R2,0=0. +S1=0. +R0,1=0. +R1,1=1. +R2,1=0. +S2=0. +R0,2=0. +R1,2=0. +R2,2=1. diff --git a/navigation/ndi_files/Markers/8700338.rom b/navigation/ndi_files/Markers/8700338.rom new file mode 100644 index 0000000..5070293 Binary files /dev/null and b/navigation/ndi_files/Markers/8700338.rom differ diff --git a/navigation/ndi_files/Markers/8700339.rom b/navigation/ndi_files/Markers/8700339.rom new file mode 100644 index 0000000..9d72a88 Binary files /dev/null and b/navigation/ndi_files/Markers/8700339.rom differ diff --git a/navigation/ndi_files/Markers/8700340.rom b/navigation/ndi_files/Markers/8700340.rom new file mode 100644 index 0000000..71fe8a0 Binary files /dev/null and b/navigation/ndi_files/Markers/8700340.rom differ diff --git a/navigation/ndi_files/Markers/NBSprobe.rom b/navigation/ndi_files/Markers/NBSprobe.rom new file mode 100644 index 0000000..869c1f6 Binary files /dev/null and b/navigation/ndi_files/Markers/NBSprobe.rom differ diff --git a/navigation/ndi_files/Markers/NBSref.rom b/navigation/ndi_files/Markers/NBSref.rom new file mode 100644 index 0000000..4264973 Binary files /dev/null and b/navigation/ndi_files/Markers/NBSref.rom differ diff --git a/navigation/ndi_files/Markers/NT-103.rom b/navigation/ndi_files/Markers/NT-103.rom new file mode 100644 index 0000000..bc34327 Binary files /dev/null and b/navigation/ndi_files/Markers/NT-103.rom differ diff --git a/navigation/ndi_files/Markers/NT-112.rom b/navigation/ndi_files/Markers/NT-112.rom new file mode 100644 index 0000000..8d5dfd3 Binary files /dev/null and b/navigation/ndi_files/Markers/NT-112.rom differ diff --git a/navigation/ndi_files/Markers/NT-115.rom b/navigation/ndi_files/Markers/NT-115.rom new file mode 100644 index 0000000..dd67e76 Binary files /dev/null and b/navigation/ndi_files/Markers/NT-115.rom differ diff --git a/navigation/ndi_files/Markers/active-wireless.rom b/navigation/ndi_files/Markers/active-wireless.rom new file mode 100644 index 0000000..e986143 Binary files /dev/null and b/navigation/ndi_files/Markers/active-wireless.rom differ -- libgit2 0.21.2