Commit f55f424118149ff21850e80661d8f87b49d96bfe

Authored by tfmoraes
1 parent d176f8ec

ADD: Applying Victor's patch to add support and operations to navigator

invesalius/data/viewer_slice.py
@@ -230,8 +230,10 @@ class Viewer(wx.Panel): @@ -230,8 +230,10 @@ class Viewer(wx.Panel):
230 } 230 }
231 if state == const.SLICE_STATE_CROSS: 231 if state == const.SLICE_STATE_CROSS:
232 self.__set_cross_visibility(1) 232 self.__set_cross_visibility(1)
  233 + ps.Publisher().sendMessage('Activate ball reference')
233 else: 234 else:
234 self.__set_cross_visibility(0) 235 self.__set_cross_visibility(0)
  236 + ps.Publisher().sendMessage('Deactivate ball reference')
235 237
236 if state == const.STATE_WL: 238 if state == const.STATE_WL:
237 self.on_wl = True 239 self.on_wl = True
@@ -704,10 +706,25 @@ class Viewer(wx.Panel): @@ -704,10 +706,25 @@ class Viewer(wx.Panel):
704 coord = self.CalcultateScrollPosition(coord_cross) 706 coord = self.CalcultateScrollPosition(coord_cross)
705 ps.Publisher().sendMessage('Update cross position', 707 ps.Publisher().sendMessage('Update cross position',
706 (self.orientation, coord_cross)) 708 (self.orientation, coord_cross))
  709 + ps.Publisher().sendMessage('Set ball reference position based on bound', coord_cross)
  710 + ps.Publisher().sendMessage('Set camera in volume', coord_cross)
  711 + ps.Publisher().sendMessage('Render volume viewer')
  712 +
707 print "Scroll to", coord 713 print "Scroll to", coord
708 self.ScrollSlice(coord) 714 self.ScrollSlice(coord)
709 self.interactor.Render() 715 self.interactor.Render()
710 716
  717 + def Navigation(self, pubsub_evt):
  718 + # Get point from base change
  719 + x, y, z = pubsub_evt.data
  720 + coord_cross = x, y, z
  721 + coord = self.CalcultateScrollPosition(coord_cross)
  722 + ps.Publisher().sendMessage('Update cross position',
  723 + (self.orientation, coord_cross))
  724 +
  725 + self.ScrollSlice(coord)
  726 + self.interactor.Render()
  727 +
711 def ScrollSlice(self, coord): 728 def ScrollSlice(self, coord):
712 if self.orientation == "AXIAL": 729 if self.orientation == "AXIAL":
713 ps.Publisher().sendMessage(('Set scroll position', 'SAGITAL'), 730 ps.Publisher().sendMessage(('Set scroll position', 'SAGITAL'),
@@ -834,6 +851,8 @@ class Viewer(wx.Panel): @@ -834,6 +851,8 @@ class Viewer(wx.Panel):
834 self.orientation)) 851 self.orientation))
835 ps.Publisher().subscribe(self.__update_cross_position, 852 ps.Publisher().subscribe(self.__update_cross_position,
836 'Update cross position') 853 'Update cross position')
  854 + ps.Publisher().subscribe(self.Navigation,
  855 + 'Co-registered Points')
837 ### 856 ###
838 ps.Publisher().subscribe(self.ChangeBrushSize, 857 ps.Publisher().subscribe(self.ChangeBrushSize,
839 'Set edition brush size') 858 'Set edition brush size')
invesalius/data/viewer_volume.py
@@ -22,12 +22,14 @@ @@ -22,12 +22,14 @@
22 22
23 import sys 23 import sys
24 24
  25 +import numpy
25 import wx 26 import wx
26 import vtk 27 import vtk
27 from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor 28 from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor
28 import wx.lib.pubsub as ps 29 import wx.lib.pubsub as ps
29 30
30 import constants as const 31 import constants as const
  32 +import data.bases as bases
31 import data.vtk_utils as vtku 33 import data.vtk_utils as vtku
32 import project as prj 34 import project as prj
33 import style as st 35 import style as st
@@ -42,6 +44,9 @@ class Viewer(wx.Panel): @@ -42,6 +44,9 @@ class Viewer(wx.Panel):
42 44
43 self.interaction_style = st.StyleStateManager() 45 self.interaction_style = st.StyleStateManager()
44 46
  47 + self.ball_reference = None
  48 + self.initial_foco = None
  49 +
45 style = vtk.vtkInteractorStyleTrackballCamera() 50 style = vtk.vtkInteractorStyleTrackballCamera()
46 self.style = style 51 self.style = style
47 52
@@ -135,6 +140,7 @@ class Viewer(wx.Panel): @@ -135,6 +140,7 @@ class Viewer(wx.Panel):
135 ps.Publisher().subscribe(self.LoadSlicePlane, 'Load slice plane') 140 ps.Publisher().subscribe(self.LoadSlicePlane, 'Load slice plane')
136 141
137 ps.Publisher().subscribe(self.ResetCamClippingRange, 'Reset cam clipping range') 142 ps.Publisher().subscribe(self.ResetCamClippingRange, 'Reset cam clipping range')
  143 + ps.Publisher().subscribe(self.SetVolumeCamera, 'Set camera in volume')
138 144
139 ps.Publisher().subscribe(self.OnEnableStyle, 'Enable style') 145 ps.Publisher().subscribe(self.OnEnableStyle, 'Enable style')
140 ps.Publisher().subscribe(self.OnDisableStyle, 'Disable style') 146 ps.Publisher().subscribe(self.OnDisableStyle, 'Disable style')
@@ -157,6 +163,47 @@ class Viewer(wx.Panel): @@ -157,6 +163,47 @@ class Viewer(wx.Panel):
157 ps.Publisher().subscribe(self.OnStartSeed,'Create surface by seeding - start') 163 ps.Publisher().subscribe(self.OnStartSeed,'Create surface by seeding - start')
158 ps.Publisher().subscribe(self.OnEndSeed,'Create surface by seeding - end') 164 ps.Publisher().subscribe(self.OnEndSeed,'Create surface by seeding - end')
159 165
  166 + ps.Publisher().subscribe(self.ActivateBallReference,
  167 + 'Activate ball reference')
  168 + ps.Publisher().subscribe(self.DeactivateBallReference,
  169 + 'Deactivate ball reference')
  170 + ps.Publisher().subscribe(self.SetBallReferencePosition,
  171 + 'Set ball reference position')
  172 + ps.Publisher().subscribe(self.SetBallReferencePositionBasedOnBound,
  173 + 'Set ball reference position based on bound')
  174 +
  175 + def CreateBallReference(self):
  176 + self.ball_reference = vtk.vtkSphereSource()
  177 + self.ball_reference.SetRadius(5)
  178 +
  179 + mapper = vtk.vtkPolyDataMapper()
  180 + mapper.SetInput(self.ball_reference.GetOutput())
  181 +
  182 + p = vtk.vtkProperty()
  183 + p.SetColor(1, 0, 0)
  184 +
  185 + self.ball_actor = vtk.vtkActor()
  186 + self.ball_actor.SetMapper(mapper)
  187 + self.ball_actor.SetProperty(p)
  188 +
  189 + def ActivateBallReference(self, pubsub_evt):
  190 + if not self.ball_reference:
  191 + self.CreateBallReference()
  192 + self.ren.AddActor(self.ball_actor)
  193 +
  194 + def DeactivateBallReference(self, pubsub_evt):
  195 + if self.ball_reference:
  196 + self.ren.RemoveActor(self.ball_actor)
  197 +
  198 + def SetBallReferencePosition(self, pubsub_evt):
  199 + x, y, z = pubsub_evt.data
  200 + self.ball_reference.SetCenter(x, y, z)
  201 +
  202 + def SetBallReferencePositionBasedOnBound(self, pubsub_evt):
  203 + coord = pubsub_evt.data
  204 + x, y, z = bases.FlipX(coord)
  205 + self.ball_reference.SetCenter(x, y, z)
  206 +
160 def OnStartSeed(self, pubsub_evt): 207 def OnStartSeed(self, pubsub_evt):
161 index = pubsub_evt.data 208 index = pubsub_evt.data
162 self.seed_points = [] 209 self.seed_points = []
@@ -441,6 +488,31 @@ class Viewer(wx.Panel): @@ -441,6 +488,31 @@ class Viewer(wx.Panel):
441 self.ren.ResetCamera() 488 self.ren.ResetCamera()
442 self.ren.ResetCameraClippingRange() 489 self.ren.ResetCameraClippingRange()
443 490
  491 + def SetVolumeCamera(self, pubsub_evt):
  492 +
  493 + coord_camera = pubsub_evt.data
  494 + coord_camera = numpy.array(bases.FlipX(coord_camera))
  495 +
  496 + cam = self.ren.GetActiveCamera()
  497 +
  498 + if self.initial_foco is None:
  499 + self.initial_foco = numpy.array(cam.GetFocalPoint())
  500 +
  501 + cam_initialposition = numpy.array(cam.GetPosition())
  502 + cam_initialfoco = numpy.array(cam.GetFocalPoint())
  503 +
  504 + cam_sub = cam_initialposition - cam_initialfoco
  505 + cam_sub_norm = numpy.linalg.norm(cam_sub)
  506 + vet1 = cam_sub/cam_sub_norm
  507 +
  508 + cam_sub_novo = coord_camera - self.initial_foco
  509 + cam_sub_novo_norm = numpy.linalg.norm(cam_sub_novo)
  510 + vet2 = cam_sub_novo/cam_sub_novo_norm
  511 + vet2 = vet2*cam_sub_norm + coord_camera
  512 +
  513 + cam.SetFocalPoint(coord_camera)
  514 + cam.SetPosition(vet2)
  515 +
444 def OnExportSurface(self, pubsub_evt): 516 def OnExportSurface(self, pubsub_evt):
445 filename, filetype = pubsub_evt.data 517 filename, filetype = pubsub_evt.data
446 fileprefix = filename.split(".")[-2] 518 fileprefix = filename.split(".")[-2]
invesalius/gui/task_navigator.py
@@ -20,8 +20,26 @@ @@ -20,8 +20,26 @@
20 import os 20 import os
21 import sys 21 import sys
22 22
  23 +import serial
23 import wx 24 import wx
24 import wx.lib.hyperlink as hl 25 import wx.lib.hyperlink as hl
  26 +import wx.lib.masked.numctrl
  27 +import wx.lib.platebtn as pbtn
  28 +import wx.lib.pubsub as ps
  29 +
  30 +import data.bases as db
  31 +import data.co_registration as dcr
  32 +import project
  33 +
  34 +IR1 = wx.NewId()
  35 +IR2 = wx.NewId()
  36 +IR3 = wx.NewId()
  37 +PR1 = wx.NewId()
  38 +PR2 = wx.NewId()
  39 +PR3 = wx.NewId()
  40 +Neuronavigate = wx.NewId()
  41 +Corregistration = wx.NewId()
  42 +GetPoint = wx.NewId()
25 43
26 class TaskPanel(wx.Panel): 44 class TaskPanel(wx.Panel):
27 """ 45 """
@@ -36,7 +54,7 @@ class TaskPanel(wx.Panel): @@ -36,7 +54,7 @@ class TaskPanel(wx.Panel):
36 54
37 sizer = wx.BoxSizer(wx.HORIZONTAL) 55 sizer = wx.BoxSizer(wx.HORIZONTAL)
38 sizer.Add(inner_panel, 1, wx.EXPAND | wx.GROW | wx.BOTTOM | wx.RIGHT | 56 sizer.Add(inner_panel, 1, wx.EXPAND | wx.GROW | wx.BOTTOM | wx.RIGHT |
39 - wx.LEFT, 7) 57 + wx.LEFT, 8)
40 sizer.Fit(self) 58 sizer.Fit(self)
41 59
42 self.SetSizer(sizer) 60 self.SetSizer(sizer)
@@ -46,51 +64,387 @@ class TaskPanel(wx.Panel): @@ -46,51 +64,387 @@ class TaskPanel(wx.Panel):
46 class InnerTaskPanel(wx.Panel): 64 class InnerTaskPanel(wx.Panel):
47 65
48 def __init__(self, parent): 66 def __init__(self, parent):
49 - wx.Panel.__init__(self, parent)  
50 - self.SetBackgroundColour(wx.Colour(255,255,255)) 67 + wx.Panel.__init__(self, parent, size=wx.Size(320,300))
  68 + self.SetBackgroundColour(wx.Colour(221, 221, 221, 255))
51 self.SetAutoLayout(1) 69 self.SetAutoLayout(1)
  70 + self.__bind_events()
  71 +
  72 + self.aux_img_ref1 = 0
  73 + self.aux_img_ref2 = 0
  74 + self.aux_img_ref3 = 0
  75 + self.flagpoint = 0
  76 + self.aux_plh_ref1 = 1
  77 + self.aux_plh_ref2 = 1
  78 + self.aux_plh_ref3 = 1
  79 + self.a = 0, 0, 0
  80 + self.coord1a = (0, 0, 0)
  81 + self.coord2a = (0, 0, 0)
  82 + self.coord3a = (0, 0, 0)
  83 + self.coord1b = (0, 0, 0)
  84 + self.coord2b = (0, 0, 0)
  85 + self.coord3b = (0, 0, 0)
  86 + self.correg = None
  87 +
  88 +
  89 + self.button_img_ref1 = wx.ToggleButton(self, IR1, label = 'TEI', size = wx.Size(30,23))
  90 + self.button_img_ref1.Bind(wx.EVT_TOGGLEBUTTON, self.Img_Ref_ToggleButton1)
  91 +
  92 + self.button_img_ref2 = wx.ToggleButton(self, IR2, label = 'TDI', size = wx.Size(30,23))
  93 + self.button_img_ref2.Bind(wx.EVT_TOGGLEBUTTON, self.Img_Ref_ToggleButton2)
52 94
53 - # Build GUI  
54 - self.__init_gui() 95 + self.button_img_ref3 = wx.ToggleButton(self, IR3, label = 'FNI', size = wx.Size(30,23))
  96 + self.button_img_ref3.Bind(wx.EVT_TOGGLEBUTTON, self.Img_Ref_ToggleButton3)
55 97
56 - # Bind events  
57 - self.__bind_events()  
58 - self.__bind_wx_events()  
59 -  
60 - def __init_gui(self):  
61 - """  
62 - Build widgets in current panel  
63 - """  
64 - # Create widgets to be inserted in this panel  
65 - link_test = hl.HyperLinkCtrl(self, -1, _("Testing..."))  
66 - link_test.SetUnderlines(False, False, False)  
67 - link_test.SetColours("BLACK", "BLACK", "BLACK")  
68 - link_test.AutoBrowse(False)  
69 - link_test.UpdateLink()  
70 - self.link_test = link_test  
71 -  
72 - # Add line sizers into main sizer  
73 - sizer = wx.BoxSizer(wx.VERTICAL)  
74 - sizer.Add(link_test, 0, wx.GROW|wx.EXPAND)  
75 - self.SetSizer(sizer) 98 + self.button_plh_ref1 = wx.Button(self, PR1, label = 'TEP', size = wx.Size(30,23))
  99 + self.button_plh_ref2 = wx.Button(self, PR2, label = 'TDP', size = wx.Size(30,23))
  100 + self.button_plh_ref3 = wx.Button(self, PR3, label = 'FNP', size = wx.Size(30,23))
  101 + self.button_crg = wx.Button(self, Corregistration, label = 'Corregistrate')
  102 + self.button_getpoint = wx.Button(self, GetPoint, label = 'GP', size = wx.Size(23,23))
  103 + self.Bind(wx.EVT_BUTTON, self.Buttons)
  104 +
  105 + self.button_neuronavigate = wx.ToggleButton(self, Neuronavigate, "Neuronavigate")
  106 + self.button_neuronavigate.Bind(wx.EVT_TOGGLEBUTTON, self.Neuronavigate_ToggleButton)
  107 +
  108 + self.numCtrl1a = wx.lib.masked.numctrl.NumCtrl(
  109 + name='numCtrl1a', parent=self, integerWidth = 4, fractionWidth = 1)
  110 + self.numCtrl2a = wx.lib.masked.numctrl.NumCtrl(
  111 + name='numCtrl2a', parent=self, integerWidth = 4, fractionWidth = 1)
  112 + self.numCtrl3a = wx.lib.masked.numctrl.NumCtrl(
  113 + name='numCtrl3a', parent=self, integerWidth = 4, fractionWidth = 1)
  114 + self.numCtrl1b = wx.lib.masked.numctrl.NumCtrl(
  115 + name='numCtrl1b', parent=self, integerWidth = 4, fractionWidth = 1)
  116 + self.numCtrl2b = wx.lib.masked.numctrl.NumCtrl(
  117 + name='numCtrl2b', parent=self, integerWidth = 4, fractionWidth = 1)
  118 + self.numCtrl3b = wx.lib.masked.numctrl.NumCtrl(
  119 + name='numCtrl3b', parent=self, integerWidth = 4, fractionWidth = 1)
  120 + self.numCtrl1c = wx.lib.masked.numctrl.NumCtrl(
  121 + name='numCtrl1c', parent=self, integerWidth = 4, fractionWidth = 1)
  122 + self.numCtrl2c = wx.lib.masked.numctrl.NumCtrl(
  123 + name='numCtrl2c', parent=self, integerWidth = 4, fractionWidth = 1)
  124 + self.numCtrl3c = wx.lib.masked.numctrl.NumCtrl(
  125 + name='numCtrl3c', parent=self, integerWidth = 4, fractionWidth = 1)
  126 + self.numCtrl1d = wx.lib.masked.numctrl.NumCtrl(
  127 + name='numCtrl1d', parent=self, integerWidth = 4, fractionWidth = 1)
  128 + self.numCtrl2d = wx.lib.masked.numctrl.NumCtrl(
  129 + name='numCtrl2d', parent=self, integerWidth = 4, fractionWidth = 1)
  130 + self.numCtrl3d = wx.lib.masked.numctrl.NumCtrl(
  131 + name='numCtrl3d', parent=self, integerWidth = 4, fractionWidth = 1)
  132 + self.numCtrl1e = wx.lib.masked.numctrl.NumCtrl(
  133 + name='numCtrl1e', parent=self, integerWidth = 4, fractionWidth = 1)
  134 + self.numCtrl2e = wx.lib.masked.numctrl.NumCtrl(
  135 + name='numCtrl2e', parent=self, integerWidth = 4, fractionWidth = 1)
  136 + self.numCtrl3e = wx.lib.masked.numctrl.NumCtrl(
  137 + name='numCtrl3e', parent=self, integerWidth = 4, fractionWidth = 1)
  138 + self.numCtrl1f = wx.lib.masked.numctrl.NumCtrl(
  139 + name='numCtrl1f', parent=self, integerWidth = 4, fractionWidth = 1)
  140 + self.numCtrl2f = wx.lib.masked.numctrl.NumCtrl(
  141 + name='numCtrl2f', parent=self, integerWidth = 4, fractionWidth = 1)
  142 + self.numCtrl3f = wx.lib.masked.numctrl.NumCtrl(
  143 + name='numCtrl3f', parent=self, integerWidth = 4, fractionWidth = 1)
  144 + self.numCtrl1g = wx.lib.masked.numctrl.NumCtrl(
  145 + name='numCtrl1g', parent=self, integerWidth = 4, fractionWidth = 1)
  146 + self.numCtrl2g = wx.lib.masked.numctrl.NumCtrl(
  147 + name='numCtrl2g', parent=self, integerWidth = 4, fractionWidth = 1)
  148 + self.numCtrl3g = wx.lib.masked.numctrl.NumCtrl(
  149 + name='numCtrl3g', parent=self, integerWidth = 4, fractionWidth = 1)
  150 +
  151 + RefImg_sizer1 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  152 + RefImg_sizer1.AddMany([ (self.button_img_ref1),
  153 + (self.numCtrl1a),
  154 + (self.numCtrl2a),
  155 + (self.numCtrl3a)])
  156 +
  157 + RefImg_sizer2 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  158 + RefImg_sizer2.AddMany([ (self.button_img_ref2),
  159 + (self.numCtrl1b),
  160 + (self.numCtrl2b),
  161 + (self.numCtrl3b)])
  162 +
  163 + RefImg_sizer3 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  164 + RefImg_sizer3.AddMany([ (self.button_img_ref3),
  165 + (self.numCtrl1c),
  166 + (self.numCtrl2c),
  167 + (self.numCtrl3c)])
  168 +
  169 + RefPlh_sizer1 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  170 + RefPlh_sizer1.AddMany([ (self.button_plh_ref1, 0, wx.GROW|wx.EXPAND),
  171 + (self.numCtrl1d, wx.RIGHT),
  172 + (self.numCtrl2d),
  173 + (self.numCtrl3d, wx.LEFT)])
  174 +
  175 + RefPlh_sizer2 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  176 + RefPlh_sizer2.AddMany([ (self.button_plh_ref2, 0, wx.GROW|wx.EXPAND),
  177 + (self.numCtrl1e, 0, wx.RIGHT),
  178 + (self.numCtrl2e),
  179 + (self.numCtrl3e, 0, wx.LEFT)])
  180 +
  181 + RefPlh_sizer3 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  182 + RefPlh_sizer3.AddMany([ (self.button_plh_ref3, 0, wx.GROW|wx.EXPAND),
  183 + (self.numCtrl1f, wx.RIGHT),
  184 + (self.numCtrl2f),
  185 + (self.numCtrl3f, wx.LEFT)])
  186 +
  187 + Buttons_sizer4 = wx.FlexGridSizer(rows=1, cols=3, hgap=5, vgap=5)
  188 + Buttons_sizer4.AddMany([ (self.button_crg, wx.RIGHT),
  189 + (self.button_neuronavigate, wx.LEFT)])
  190 +
  191 + GetPoint_sizer5 = wx.FlexGridSizer(rows=1, cols=4, hgap=5, vgap=5)
  192 + GetPoint_sizer5.AddMany([ (self.button_getpoint, 0, wx.GROW|wx.EXPAND),
  193 + (self.numCtrl1g, wx.RIGHT),
  194 + (self.numCtrl2g),
  195 + (self.numCtrl3g, wx.LEFT)])
  196 +
  197 + text = wx.StaticText(self, -1, 'Neuronavigator')
  198 +
  199 + Ref_sizer = wx.FlexGridSizer(rows=9, cols=1, hgap=5, vgap=5)
  200 + Ref_sizer.AddGrowableCol(0, 1)
  201 + Ref_sizer.AddGrowableRow(0, 1)
  202 + Ref_sizer.AddGrowableRow(1, 1)
  203 + Ref_sizer.AddGrowableRow(2, 1)
  204 + Ref_sizer.AddGrowableRow(3, 1)
  205 + Ref_sizer.AddGrowableRow(4, 1)
  206 + Ref_sizer.AddGrowableRow(5, 1)
  207 + Ref_sizer.AddGrowableRow(6, 1)
  208 + Ref_sizer.AddGrowableRow(7, 1)
  209 + Ref_sizer.AddGrowableRow(8, 1)
  210 + Ref_sizer.SetFlexibleDirection(wx.BOTH)
  211 + Ref_sizer.AddMany([ (text, 0, wx.ALIGN_CENTER_HORIZONTAL),
  212 + (RefImg_sizer1, 0, wx.ALIGN_CENTER_HORIZONTAL),
  213 + (RefImg_sizer2, 0, wx.ALIGN_CENTER_HORIZONTAL),
  214 + (RefImg_sizer3, 0, wx.ALIGN_CENTER_HORIZONTAL),
  215 + (RefPlh_sizer1, 0, wx.ALIGN_CENTER_HORIZONTAL),
  216 + (RefPlh_sizer2, 0, wx.ALIGN_CENTER_HORIZONTAL),
  217 + (RefPlh_sizer3, 0, wx.ALIGN_CENTER_HORIZONTAL),
  218 + (Buttons_sizer4, 0, wx.ALIGN_CENTER_HORIZONTAL),
  219 + (GetPoint_sizer5, 0, wx.ALIGN_CENTER_HORIZONTAL)])
  220 +
  221 + main_sizer = wx.BoxSizer(wx.HORIZONTAL)
  222 + main_sizer.Add(Ref_sizer, 1, wx.ALIGN_CENTER_HORIZONTAL, 10)
  223 + self.sizer = main_sizer
  224 + self.SetSizer(main_sizer)
76 self.Fit() 225 self.Fit()
77 226
  227 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the image")
  228 + self.button_img_ref1.SetToolTip(tooltip)
  229 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the image")
  230 + self.button_img_ref2.SetToolTip(tooltip)
  231 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the image")
  232 + self.button_img_ref3.SetToolTip(tooltip)
  233 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the space")
  234 + self.button_plh_ref1.SetToolTip(tooltip)
  235 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the space")
  236 + self.button_plh_ref2.SetToolTip(tooltip)
  237 + tooltip = wx.ToolTip("Pick the coordinates x, y, z in the space")
  238 + self.button_plh_ref3.SetToolTip(tooltip)
  239 + tooltip = wx.ToolTip("X Coordinate")
  240 + self.numCtrl1a.SetToolTip(tooltip)
  241 + tooltip = wx.ToolTip("X Coordinate")
  242 + self.numCtrl1b.SetToolTip(tooltip)
  243 + tooltip = wx.ToolTip("X Coordinate")
  244 + self.numCtrl1c.SetToolTip(tooltip)
  245 + tooltip = wx.ToolTip("X Coordinate")
  246 + self.numCtrl1d.SetToolTip(tooltip)
  247 + tooltip = wx.ToolTip("X Coordinate")
  248 + self.numCtrl1e.SetToolTip(tooltip)
  249 + tooltip = wx.ToolTip("X Coordinate")
  250 + self.numCtrl1f.SetToolTip(tooltip)
  251 + tooltip = wx.ToolTip("X Coordinate")
  252 + self.numCtrl1g.SetToolTip(tooltip)
  253 + tooltip = wx.ToolTip("Y Coordinate")
  254 + self.numCtrl2a.SetToolTip(tooltip)
  255 + tooltip = wx.ToolTip("Y Coordinate")
  256 + self.numCtrl2b.SetToolTip(tooltip)
  257 + tooltip = wx.ToolTip("Y Coordinate")
  258 + self.numCtrl2c.SetToolTip(tooltip)
  259 + tooltip = wx.ToolTip("Y Coordinate")
  260 + self.numCtrl2d.SetToolTip(tooltip)
  261 + tooltip = wx.ToolTip("Y Coordinate")
  262 + self.numCtrl2e.SetToolTip(tooltip)
  263 + tooltip = wx.ToolTip("Y Coordinate")
  264 + self.numCtrl2f.SetToolTip(tooltip)
  265 + tooltip = wx.ToolTip("Y Coordinate")
  266 + self.numCtrl2g.SetToolTip(tooltip)
  267 + tooltip = wx.ToolTip("Z Coordinate")
  268 + self.numCtrl3a.SetToolTip(tooltip)
  269 + tooltip = wx.ToolTip("Z Coordinate")
  270 + self.numCtrl3b.SetToolTip(tooltip)
  271 + tooltip = wx.ToolTip("Z Coordinate")
  272 + self.numCtrl3c.SetToolTip(tooltip)
  273 + tooltip = wx.ToolTip("Z Coordinate")
  274 + self.numCtrl3d.SetToolTip(tooltip)
  275 + tooltip = wx.ToolTip("Z Coordinate")
  276 + self.numCtrl3e.SetToolTip(tooltip)
  277 + tooltip = wx.ToolTip("Z Coordinate")
  278 + self.numCtrl3f.SetToolTip(tooltip)
  279 + tooltip = wx.ToolTip("Z Coordinate")
  280 + self.numCtrl3g.SetToolTip(tooltip)
  281 + tooltip = wx.ToolTip("Corregistration of the real position with the image position")
  282 + self.button_crg.SetToolTip(tooltip)
  283 + tooltip = wx.ToolTip("Neuronavigation")
  284 + self.button_neuronavigate.SetToolTip(tooltip)
  285 + tooltip = wx.ToolTip("Get Cross Center Coordinates")
  286 + self.button_getpoint.SetToolTip(tooltip)
  287 +
78 def __bind_events(self): 288 def __bind_events(self):
79 - """  
80 - Bind pubsub events  
81 - """  
82 - # Example: ps.Publisher().subscribe("Test")  
83 - pass  
84 -  
85 - def __bind_wx_events(self):  
86 - """  
87 - Bind wx general events  
88 - """  
89 - # Example: self.Bind(wx.EVT_BUTTON, self.OnButton)  
90 - self.link_test.Bind(hl.EVT_HYPERLINK_LEFT, self.OnTest) 289 + ps.Publisher().subscribe(self.__update_points_img, 'Update cross position')
  290 + ps.Publisher().subscribe(self.__update_points_plh, 'Update plh position')
  291 +
  292 + def __update_points_img(self, pubsub_evt):
  293 + x, y, z = pubsub_evt.data[1]
  294 + self.a = x, y, z
  295 + if self.aux_img_ref1 == 0:
  296 + self.numCtrl1a.SetValue(x)
  297 + self.numCtrl2a.SetValue(y)
  298 + self.numCtrl3a.SetValue(z)
  299 + if self.aux_img_ref2 == 0:
  300 + self.numCtrl1b.SetValue(x)
  301 + self.numCtrl2b.SetValue(y)
  302 + self.numCtrl3b.SetValue(z)
  303 + if self.aux_img_ref3 == 0:
  304 + self.numCtrl1c.SetValue(x)
  305 + self.numCtrl2c.SetValue(y)
  306 + self.numCtrl3c.SetValue(z)
  307 +
  308 +
  309 + def __update_points_plh(self, pubsub_evt):
  310 + coord = pubsub_evt.data
  311 + if self.aux_plh_ref1 == 0:
  312 + self.numCtrl1d.SetValue(coord[0])
  313 + self.numCtrl2d.SetValue(coord[1])
  314 + self.numCtrl3d.SetValue(coord[2])
  315 + self.aux_plh_ref1 = 1
  316 + if self.aux_plh_ref2 == 0:
  317 + self.numCtrl1e.SetValue(coord[0])
  318 + self.numCtrl2e.SetValue(coord[1])
  319 + self.numCtrl3e.SetValue(coord[2])
  320 + self.aux_plh_ref2 = 1
  321 + if self.aux_plh_ref3 == 0:
  322 + self.numCtrl1f.SetValue(coord[0])
  323 + self.numCtrl2f.SetValue(coord[1])
  324 + self.numCtrl3f.SetValue(coord[2])
  325 + self.aux_plh_ref3 = 1
  326 +
  327 + def Buttons(self, evt):
  328 + id = evt.GetId()
  329 + x, y, z = self.a
  330 + if id == PR1:
  331 + self.aux_plh_ref1 = 0
  332 + self.coord1b = self.Coordinates()
  333 + coord = self.coord1b
  334 + elif id == PR2:
  335 + self.aux_plh_ref2 = 0
  336 + self.coord2b = self.Coordinates()
  337 + coord = self.coord2b
  338 + elif id == PR3:
  339 + self.aux_plh_ref3 = 0
  340 + self.coord3b = self.Coordinates()
  341 + coord = self.coord3b
  342 + elif id == GetPoint:
  343 + x, y, z = self.a
  344 + self.numCtrl1g.SetValue(x)
  345 + self.numCtrl2g.SetValue(y)
  346 + self.numCtrl3g.SetValue(z)
  347 + info = self.a, self.flagpoint
  348 + self.SaveCoordinates(info)
  349 + self.flagpoint = 1
  350 + elif id == Corregistration and self.aux_img_ref1 == 1 and self.aux_img_ref2 == 1 and self.aux_img_ref3 == 1:
  351 + print "Coordenadas Imagem: ", self.coord1a, self.coord2a, self.coord3a
  352 + print "Coordenadas Polhemus: ", self.coord1b, self.coord2b, self.coord3b
  353 +
  354 + self.M, self.q1, self.Minv = db.Bases(self.coord1a, self.coord2a, self.coord3a).Basecreation()
  355 + self.N, self.q2, self.Ninv = db.Bases(self.coord1b, self.coord2b, self.coord3b).Basecreation()
  356 +
  357 + if self.aux_plh_ref1 == 0 or self.aux_plh_ref2 == 0 or self.aux_plh_ref3 == 0:
  358 + ps.Publisher().sendMessage('Update plh position', coord)
  359 +
  360 + def Coordinates(self):
  361 + #Get Polhemus points for base creation
  362 + ser = serial.Serial(0)
  363 + ser.write("Y")
  364 + ser.write("P")
  365 + str = ser.readline()
  366 + ser.write("Y")
  367 + str = str.replace("\r\n","")
  368 + str = str.replace("-"," -")
  369 + aostr = [s for s in str.split()]
  370 + #aoflt -> 0:letter 1:x 2:y 3:z
  371 + aoflt = [float(aostr[1]), float(aostr[2]), float(aostr[3]),
  372 + float(aostr[4]), float(aostr[5]), float(aostr[6])]
  373 + ser.close()
  374 + #Unit change: inches to millimeters
  375 + x = 25.4
  376 + y = 25.4
  377 + z = -25.4
  378 +
  379 + coord = (aoflt[0]*x, aoflt[1]*y, aoflt[2]*z)
  380 + return coord
91 381
92 - def OnTest(self, event):  
93 - """  
94 - Describe what this method does  
95 - """  
96 - event.Skip() 382 + def Img_Ref_ToggleButton1(self, evt):
  383 + id = evt.GetId()
  384 + flag1 = self.button_img_ref1.GetValue()
  385 + x, y, z = self.a
  386 + if flag1 == True:
  387 + self.coord1a = x, y, z
  388 + self.aux_img_ref1 = 1
  389 + elif flag1 == False:
  390 + self.aux_img_ref1 = 0
  391 + self.coord1a = (0, 0, 0)
  392 + self.numCtrl1a.SetValue(x)
  393 + self.numCtrl2a.SetValue(y)
  394 + self.numCtrl3a.SetValue(z)
  395 +
  396 + def Img_Ref_ToggleButton2(self, evt):
  397 + id = evt.GetId()
  398 + flag2 = self.button_img_ref2.GetValue()
  399 + x, y, z = self.a
  400 + if flag2 == True:
  401 + self.coord2a = x, y, z
  402 + self.aux_img_ref2 = 1
  403 + elif flag2 == False:
  404 + self.aux_img_ref2 = 0
  405 + self.coord2a = (0, 0, 0)
  406 + self.numCtrl1b.SetValue(x)
  407 + self.numCtrl2b.SetValue(y)
  408 + self.numCtrl3b.SetValue(z)
  409 +
  410 + def Img_Ref_ToggleButton3(self, evt):
  411 + id = evt.GetId()
  412 + flag3 = self.button_img_ref3.GetValue()
  413 + x, y, z = self.a
  414 + if flag3 == True:
  415 + self.coord3a = x, y, z
  416 + self.aux_img_ref3 = 1
  417 + elif flag3 == False:
  418 + self.aux_img_ref3 = 0
  419 + self.coord3a = (0, 0, 0)
  420 + self.numCtrl1c.SetValue(x)
  421 + self.numCtrl2c.SetValue(y)
  422 + self.numCtrl3c.SetValue(z)
  423 +
  424 + def Neuronavigate_ToggleButton(self, evt):
  425 + id = evt.GetId()
  426 + flag4 = self.button_neuronavigate.GetValue()
  427 + bases = self.Minv, self.N, self.q1, self.q2
  428 + if flag4 == True:
  429 + self.correg = dcr.Corregister(bases, flag4)
  430 + elif flag4 == False:
  431 + self.correg.stop()
  432 +
  433 + def SaveCoordinates(self, info):
  434 + #Create a file and write the points given by getpoint's button
  435 + x, y, z = info[0]
  436 + flag = info[1]
  437 +
  438 + if flag == 0:
  439 + text_file = open("points.txt", "w")
  440 + line = str('%.2f' %x) + "\t" + str('%.2f' %y) + "\t" + str('%.2f' %z) + "\n"
  441 + text_file.writelines(line)
  442 + text_file.close()
  443 + else:
  444 + text_file = open("points.txt", "r")
  445 + filedata = text_file.read()
  446 + line = filedata + str('%.2f' %x) + "\t" + str('%.2f' %y) + "\t" + str('%.2f' %z) + "\n"
  447 + text_file = open("points.txt", "w")
  448 + text_file.write(line)
  449 + text_file.close()
  450 +