Module Gnumed.wxpython.gmSnellen
GNUmed onscreen Snellen Chart emulator.
FIXME: store screen size
Classes
class cSnellenCfgDlg
-
Expand source code
class cSnellenCfgDlg (wx.Dialog): """ Dialogue class to get Snellen chart settings. """ def __init__ (self): wx.Dialog.__init__( self, None, -1, _("Snellen Chart Setup"), wx.DefaultPosition, wx.Size(350, 200) ) # print wx.DisplaySize() # print wx.DisplaySizeMM() vbox = wx.BoxSizer (wx.VERTICAL) hbox1 = wx.BoxSizer (wx.HORIZONTAL) hbox1.Add (wx.StaticText(self, -1, _("Screen Height (cm): ")), 0, wx.ALL, 15) self.height_ctrl = wx.SpinCtrl (self, -1, value = "25", min = 10, max = 100) hbox1.Add (self.height_ctrl, 1, wx.TOP, 15) vbox.Add (hbox1, 1, wx.EXPAND) hbox2 = wx.BoxSizer (wx.HORIZONTAL) hbox2.Add (wx.StaticText(self, -1, _("Screen Width (cm): ")), 0, wx.ALL, 15) self.width_ctrl = wx.SpinCtrl (self, -1, value = "30", min = 10, max = 100) hbox2.Add (self.width_ctrl, 1, wx.TOP, 15) vbox.Add (hbox2, 1, wx.EXPAND) hbox3 = wx.BoxSizer (wx.HORIZONTAL) hbox3.Add (wx.StaticText(self, -1, _("Alphabet: ")), 0, wx.ALL, 15) self.alpha_ctrl = wx.Choice (self, -1, choices = cSnellenChart.alphabets.keys ()) hbox3.Add (self.alpha_ctrl, 1, wx.TOP, 15) vbox.Add (hbox3, 1, wx.EXPAND) self.mirror_ctrl = wx.CheckBox (self, -1, label = _("Mirror")) vbox.Add (self.mirror_ctrl, 0, wx.ALL, 15) vbox.Add (wx.StaticText (self, -1, _("""Control Snellen chart using mouse: left-click increases text right-click decreases text double-click ends""")), 0, wx.ALL, 15) hbox5 = wx.BoxSizer (wx.HORIZONTAL) ok = wx.Button(self, wx.ID_OK, _(" OK "), size=wx.DefaultSize) cancel = wx.Button (self, wx.ID_CANCEL, _(" Cancel "), size=wx.DefaultSize) hbox5.Add (ok, 1, wx.TOP, 15) hbox5.Add (cancel, 1, wx.TOP, 15) vbox.Add (hbox5, 1, wx.EXPAND) self.SetSizer (vbox) self.SetAutoLayout (1) vbox.Fit (self) wx.EVT_BUTTON (ok, wx.ID_OK, self.OnOK) wx.EVT_BUTTON (cancel, wx.ID_CANCEL, self.OnCancel) wx.EVT_CLOSE (self, self.OnClose ) # self.Show(1) # self.parent = parent def OnClose (self, event): self.EndModal (wx.ID_CANCEL) def OnCancel (self, event): self.EndModal (wx.ID_CANCEL) def OnOK (self, event): # if self.Validate() and self.TransferDataFromWindow(): selected_alpha_string = self.alpha_ctrl.GetStringSelection() if selected_alpha_string is None or len (selected_alpha_string) < 2: alpha = cSnellenChart.latin else: alpha = cSnellenChart.alphabets[selected_alpha_string] height = self.height_ctrl.GetValue () width = self.width_ctrl.GetValue () mirr = self.mirror_ctrl.GetValue() self.vals = (width, height, alpha, mirr) self.EndModal(wx.ID_OK)
Dialogue class to get Snellen chart settings.
Ancestors
- wx._core.Dialog
- wx._core.TopLevelWindow
- wx._core.NonOwnedWindow
- wx._core.Window
- wx._core.WindowBase
- wx._core.EvtHandler
- wx._core.Object
- wx._core.Trackable
- sip.wrapper
- sip.simplewrapper
Methods
def OnCancel(self, event)
-
Expand source code
def OnCancel (self, event): self.EndModal (wx.ID_CANCEL)
def OnClose(self, event)
-
Expand source code
def OnClose (self, event): self.EndModal (wx.ID_CANCEL)
def OnOK(self, event)
-
Expand source code
def OnOK (self, event): # if self.Validate() and self.TransferDataFromWindow(): selected_alpha_string = self.alpha_ctrl.GetStringSelection() if selected_alpha_string is None or len (selected_alpha_string) < 2: alpha = cSnellenChart.latin else: alpha = cSnellenChart.alphabets[selected_alpha_string] height = self.height_ctrl.GetValue () width = self.width_ctrl.GetValue () mirr = self.mirror_ctrl.GetValue() self.vals = (width, height, alpha, mirr) self.EndModal(wx.ID_OK)
class cSnellenChart (width,
height,
alpha=[<function cSnellenChart.O>, <function cSnellenChart.cross>, <function cSnellenChart.star>, <function cSnellenChart.box>],
mirr=0,
parent=None)-
Expand source code
class cSnellenChart(wx.Frame): def convert (self, X,Y): """Converts a pair of co-ordinates from block co-ords to real. X, Y -- define top-left corner of current character """ if self.mirror: X = 5-X return wx.Point( int ((X * self.blockX) + self.startX), int ((Y * self.blockY) + self.startY) ) def O (self): """ Draws the letter O """ self._draw_arc (2.5, 2.5, 2.5, 0, 360) def Q (self): self.O() self._draw_line (2.6, 3, 4, 5) def C (self): if self.mirror: self._draw_arc (2.5, 2.5, 2.5, 140, -140) else: self._draw_arc (2.5, 2.5, 2.5, 40, 320) def G (self): if self.mirror: self._draw_arc (2.5, 2.5, 2.5, 140, -150) else: self._draw_arc (2.5, 2.5, 2.5, 40, 330) self._draw_rect (2.5, 2.7, 5, 3.7) self._draw_rect (4, 2.7, 5, 5) def W (self): self._draw_line (0, 0, 1, 5) self._draw_line (2, 0, 1, 5) self._draw_line (2, 0, 3, 5) self._draw_line (4, 0, 3, 5) def V (self): self._draw_line (0, 0, 2, 5) self._draw_line (4, 0, 2, 5) def T (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (2, 1, 3, 5) def I (self): self._draw_rect (2, 0, 3, 5) def A (self): self._draw_line (2, 0, 0, 5) self._draw_line (2, 0, 4, 5) self._draw_rect (1.4, 2.5, 3.6, 3.5) def F (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (1, 0, 5, 1) self._draw_rect (1, 2, 5, 3) def E (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 2, 5, 3) self._draw_rect (0, 4, 5, 5) def BackE (self): self._draw_rect (4, 0, 5, 5) self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 2, 5, 3) self._draw_rect (0, 4, 5, 5) def UpE (self): self._draw_rect (0, 4, 5, 5) self._draw_rect (0, 0, 1, 5) self._draw_rect (2, 0, 3, 5) self._draw_rect (4, 0, 5, 5) def DownE (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5) self._draw_rect (2, 0, 3, 5) self._draw_rect (4, 0, 5, 5) def H (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5) self._draw_rect (1, 2, 4, 3) def K (self): self._draw_rect (0, 0, 1, 5) self._draw_line (3.5, 0, 0.5, 2.5, width = 1.5) self._draw_line (0.5, 2.5, 3.5, 5, width = 1.5) def L (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (1, 4, 5, 5) def Z (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 4, 5, 5) self._draw_line (3.5, 1, 0, 4, width = 1.5) def X (self): self._draw_line (4, 0, 0, 5) self._draw_line (0, 0, 4, 5) def NM (self): """Sidebars common to N and M """ self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5) def N (self): self.NM () self._draw_line (0, 0, 4, 5) def BackN (self): self.NM () self._draw_line (4, 0, 0, 5) def M (self): self.NM () self._draw_line (0, 0, 2, 5) self._draw_line (4, 0, 2, 5) def gamma (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5) def delta (self): self._draw_line (2, 0, 0, 5) self._draw_line (2, 0, 4, 5) self._draw_rect (0.5, 4, 4.5, 5) def pi (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5) def cross (self): self._draw_rect (2, 0, 3, 5) self._draw_rect (0, 2, 5, 3) def box (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 4, 5, 5) self._draw_rect (0, 1, 1, 4) self._draw_rect (4, 1, 5, 4) def star (self): """ Star of 5 points """ n = 5 # can change here list = [] for i in range (0, n): theta = (i+0.00001)/n*2*math.pi # points on a circle inside the 5x5 grid x = 2.5 + 2.5*math.sin (theta) y = 2.5 - 2.5*math.cos (theta) list.append (self.convert (x, y)) # add point to list theta = (i+0.5)/n*2*math.pi x = 2.5 + math.sin (theta) y = 2.5 - math.cos (theta) list.append (self.convert (x, y)) self.dc.DrawPolygon (list, fill_style = wx.WINDING_RULE) latin = [A, C, C, E, F, G, H, I, K, L, M, N, O, Q, T, V, W, X, Z] fourE = [E, UpE, DownE, BackE] greek = [A, gamma, delta, E, Z, H, I, K, M, N, O, pi, T, X] cyrillic = [A, delta, E, BackN, K, M, H, O, pi, T, C, X] symbol = [O, cross, star, box] alphabets = { _("Latin"): latin, _("Greek"): greek, _("Cyrillic"): cyrillic, _("Four Es"): fourE, _("Symbol"): symbol } def __init__(self, width, height, alpha = symbol, mirr = 0, parent = None): """ Initialise. width and height define the physical size of the CRT in cm. """ wx.Frame.__init__ (self, parent, -1, _("Snellen Chart")) # width/Y is screen size (X/Y in cm) #wx.SystemSettings.GetMetric(wx.SYS_SCREEN_X) # screensizes = {_("14 inch"):(28, 21), _("16 inch"):(30, 23)} self.screen_width_cm = width self.screen_height_cm = height self.screen_width_pixel = 0 self.screen_height_pixel = 0 self.standard_patient_chart_distances = [3, 5, 6, 7.5, 9, 12, 15, 18, 24, 30, 48, 60] # in metres self.mirror = mirr self.alphabet = alpha wx.EVT_CLOSE (self, self.OnClose) wx.EVT_KEY_DOWN (self, self.OnKeyUp) wx.EVT_LEFT_UP (self, self.OnLeftDown) wx.EVT_RIGHT_UP (self, self.OnRightDown) wx.EVT_LEFT_DCLICK (self, self.OnDClick) wx.EVT_PAINT (self, self.OnPaint) # wx.EVT_WINDOW_CREATE (self, self.OnCreate) self.ShowFullScreen(1) #--------------------------------- # event handlers #--------------------------------- # def OnCreate(self, event): # self.ShowFullScreen(1) #--------------------------------- def OnPaint (self, event): self.dc = wx.PaintDC(self) if self.screen_width_pixel == 0: self.screen_width_pixel, self.screen_height_pixel = self.GetClientSize() self.set_distance(2) # _log.info('I think the screen size is %d x %d' % (self.screen_width_pixel, self.screen_height_pixel)) # self.setup_DC() self.dc.SetFont(wx.Font (36, wx.ROMAN, wx.NORMAL, wx.NORMAL)) self.dc.SetBrush(wx.BLACK_BRUSH) self.dc.SetBackground(wx.WHITE_BRUSH) self.dc.SetPen(wx.TRANSPARENT_PEN) # self.draw () # clear the screen self._swap_fg_bg_col() self.dc.DrawRectangle(0, 0, self.screen_width_pixel, self.screen_height_pixel) self._swap_fg_bg_col () # draw size self.dc.DrawText (str(self.standard_patient_chart_distances[self.distance]), 20, 20) self.startX = self.spacing for i in self.choices: i (self) self.startX += self.blockX*5 self.startX += self.spacing self.dc = None def OnKeyUp (self, key): if key.GetKeyCode() == wx.WXK_UP and self.distance < len (self.standard_patient_chart_distances)-1: self.set_distance (self.distance+1) if key.GetKeyCode() == wx.WXK_DOWN and self.distance > 0: self.set_distance (self.distance-1) if key.GetKeyCode() == wx.WXK_ESCAPE: self.Destroy () def OnLeftDown (self, key): if self.distance > 0: self.set_distance (self.distance-1) self.Refresh () def OnRightDown (self, key): if self.distance < len(self.standard_patient_chart_distances)-1: self.set_distance (self.distance+1) self.Refresh() def OnDClick (self, key): self.DestroyLater() def OnClose (self, event): self.DestroyLater() def DestroyWhenApp (self): import sys sys.exit (0) #--------------------------------- # internal API #--------------------------------- def _swap_fg_bg_col(self): """Swap fore- and background pens.""" background = self.dc.GetBackground() foreground = self.dc.GetBrush() self.dc.SetBrush(background) self.dc.SetBackground(foreground) #--------------------------------- def _draw_rect(self, x1, y1, x2, y2): """Draw a rectangle.""" x1, y1 = self.convert (x1, y1) x2, y2 = self.convert (x2, y2) width = x2 - x1 if width < 0: width = -width x = x2 else: x = x1 height = y2 - y1 if height < 0: height = -height y = y2 else: y = y1 self.dc.DrawRectangle(x, y, width, height) #--------------------------------- def _draw_arc (self, x, y, arm, start, end): """ Draws an arc-stroke, 1 unit wide, subtending (x, y), the outer distance is arm, between start and end angle """ topx, topy = self.convert (x-arm, y-arm) botx, boty = self.convert (x+arm, y+arm) width = botx - topx if width < 0: width = -width t = botx botx = topx topx = t height = boty - topy self.dc.DrawEllipticArc(topx, topy, width, height, start, end) # now do wedge as background, to give arc pen-stroke arm -= 1 self._swap_fg_bg_col() topx, topy = self.convert (x-arm, y-arm) botx, boty = self.convert (x+arm, y+arm) width = botx - topx if width < 0: width = -width t = botx botx = topx topx = t height = boty- topy self.dc.DrawEllipticArc(topx, topy, width, height, start, end) self._swap_fg_bg_col() #--------------------------------- def _draw_line(self, x1, y1, x2, y2, width = 1): """Draws straight descending letter-stroke. (x1, y1) is top-left, (x2, y2) is bottom left point """ coords = [ self.convert (x1, y1), self.convert (x1+width, y1), self.convert (x2+width, y2), self.convert (x2, y2) ] self.dc.DrawPolygon(coords) #--------------------------------- #--------------------------------- def set_distance (self, n): """ Sets standard viewing distance, against which patient is compared. n is an index to the list self.standard_patient_chart_distances """ self.distance = n # Snellen characters are the smallest readable characters by # an average person at the stated distance. They are defined # exactly as being in a box which subtends 5' of an arc on the # patient's eye, each stroke subtending 1' of arc one_minute = (math.pi / 180) / 60 blocksize = (self.standard_patient_chart_distances[n] * 100) * math.atan(one_minute) # in cm # convert to pixels self.blockX = int (blocksize / self.screen_width_cm * self.screen_width_pixel) self.blockY = int (blocksize / self.screen_height_cm * self.screen_height_pixel) # how many characters can we fit now? chars = int (self.screen_width_pixel / (self.blockX*5)) - 1 if chars < 1: chars = 1 if chars > 7: chars = 7 if chars < len (self.alphabet): self.choices = [] while len (self.choices) < chars: c = random.choice (self.alphabet) if not c in self.choices: self.choices.append (c) else: self.choices = [ random.choice(self.alphabet) for i in range(1, chars) ] self.spacing = int ((self.screen_width_pixel - (chars*self.blockX*5))/(chars+1)) if self.spacing < 0: self.spacing = 0 self.startY = int ((self.screen_height_pixel-(self.blockY*5))/2)
Frame() Frame(parent, id=ID_ANY, title=EmptyString, pos=DefaultPosition, size=DefaultSize, style=DEFAULT_FRAME_STYLE, name=FrameNameStr)
A frame is a window whose size and position can (usually) be changed by the user.
Initialise. width and height define the physical size of the CRT in cm.
Ancestors
- wx._core.Frame
- wx._core.TopLevelWindow
- wx._core.NonOwnedWindow
- wx._core.Window
- wx._core.WindowBase
- wx._core.EvtHandler
- wx._core.Object
- wx._core.Trackable
- sip.wrapper
- sip.simplewrapper
Class variables
var alphabets
var cyrillic
var fourE
var greek
var latin
var symbol
Methods
def A(self)
-
Expand source code
def A (self): self._draw_line (2, 0, 0, 5) self._draw_line (2, 0, 4, 5) self._draw_rect (1.4, 2.5, 3.6, 3.5)
def BackE(self)
-
Expand source code
def BackE (self): self._draw_rect (4, 0, 5, 5) self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 2, 5, 3) self._draw_rect (0, 4, 5, 5)
def BackN(self)
-
Expand source code
def BackN (self): self.NM () self._draw_line (4, 0, 0, 5)
def C(self)
-
Expand source code
def C (self): if self.mirror: self._draw_arc (2.5, 2.5, 2.5, 140, -140) else: self._draw_arc (2.5, 2.5, 2.5, 40, 320)
def DestroyWhenApp(self)
-
Expand source code
def DestroyWhenApp (self): import sys sys.exit (0)
def DownE(self)
-
Expand source code
def DownE (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5) self._draw_rect (2, 0, 3, 5) self._draw_rect (4, 0, 5, 5)
def E(self)
-
Expand source code
def E (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 2, 5, 3) self._draw_rect (0, 4, 5, 5)
def F(self)
-
Expand source code
def F (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (1, 0, 5, 1) self._draw_rect (1, 2, 5, 3)
def G(self)
-
Expand source code
def G (self): if self.mirror: self._draw_arc (2.5, 2.5, 2.5, 140, -150) else: self._draw_arc (2.5, 2.5, 2.5, 40, 330) self._draw_rect (2.5, 2.7, 5, 3.7) self._draw_rect (4, 2.7, 5, 5)
def H(self)
-
Expand source code
def H (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5) self._draw_rect (1, 2, 4, 3)
def I(self)
-
Expand source code
def I (self): self._draw_rect (2, 0, 3, 5)
def K(self)
-
Expand source code
def K (self): self._draw_rect (0, 0, 1, 5) self._draw_line (3.5, 0, 0.5, 2.5, width = 1.5) self._draw_line (0.5, 2.5, 3.5, 5, width = 1.5)
def L(self)
-
Expand source code
def L (self): self._draw_rect (0, 0, 1, 5) self._draw_rect (1, 4, 5, 5)
def M(self)
-
Expand source code
def M (self): self.NM () self._draw_line (0, 0, 2, 5) self._draw_line (4, 0, 2, 5)
def N(self)
-
Expand source code
def N (self): self.NM () self._draw_line (0, 0, 4, 5)
def NM(self)
-
Expand source code
def NM (self): """Sidebars common to N and M """ self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5)
Sidebars common to N and M
def O(self)
-
Expand source code
def O (self): """ Draws the letter O """ self._draw_arc (2.5, 2.5, 2.5, 0, 360)
Draws the letter O
def OnClose(self, event)
-
Expand source code
def OnClose (self, event): self.DestroyLater()
def OnDClick(self, key)
-
Expand source code
def OnDClick (self, key): self.DestroyLater()
def OnKeyUp(self, key)
-
Expand source code
def OnKeyUp (self, key): if key.GetKeyCode() == wx.WXK_UP and self.distance < len (self.standard_patient_chart_distances)-1: self.set_distance (self.distance+1) if key.GetKeyCode() == wx.WXK_DOWN and self.distance > 0: self.set_distance (self.distance-1) if key.GetKeyCode() == wx.WXK_ESCAPE: self.Destroy ()
def OnLeftDown(self, key)
-
Expand source code
def OnLeftDown (self, key): if self.distance > 0: self.set_distance (self.distance-1) self.Refresh ()
def OnPaint(self, event)
-
Expand source code
def OnPaint (self, event): self.dc = wx.PaintDC(self) if self.screen_width_pixel == 0: self.screen_width_pixel, self.screen_height_pixel = self.GetClientSize() self.set_distance(2) # _log.info('I think the screen size is %d x %d' % (self.screen_width_pixel, self.screen_height_pixel)) # self.setup_DC() self.dc.SetFont(wx.Font (36, wx.ROMAN, wx.NORMAL, wx.NORMAL)) self.dc.SetBrush(wx.BLACK_BRUSH) self.dc.SetBackground(wx.WHITE_BRUSH) self.dc.SetPen(wx.TRANSPARENT_PEN) # self.draw () # clear the screen self._swap_fg_bg_col() self.dc.DrawRectangle(0, 0, self.screen_width_pixel, self.screen_height_pixel) self._swap_fg_bg_col () # draw size self.dc.DrawText (str(self.standard_patient_chart_distances[self.distance]), 20, 20) self.startX = self.spacing for i in self.choices: i (self) self.startX += self.blockX*5 self.startX += self.spacing self.dc = None
def OnRightDown(self, key)
-
Expand source code
def OnRightDown (self, key): if self.distance < len(self.standard_patient_chart_distances)-1: self.set_distance (self.distance+1) self.Refresh()
def Q(self)
-
Expand source code
def Q (self): self.O() self._draw_line (2.6, 3, 4, 5)
def T(self)
-
Expand source code
def T (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (2, 1, 3, 5)
def UpE(self)
-
Expand source code
def UpE (self): self._draw_rect (0, 4, 5, 5) self._draw_rect (0, 0, 1, 5) self._draw_rect (2, 0, 3, 5) self._draw_rect (4, 0, 5, 5)
def V(self)
-
Expand source code
def V (self): self._draw_line (0, 0, 2, 5) self._draw_line (4, 0, 2, 5)
def W(self)
-
Expand source code
def W (self): self._draw_line (0, 0, 1, 5) self._draw_line (2, 0, 1, 5) self._draw_line (2, 0, 3, 5) self._draw_line (4, 0, 3, 5)
def X(self)
-
Expand source code
def X (self): self._draw_line (4, 0, 0, 5) self._draw_line (0, 0, 4, 5)
def Z(self)
-
Expand source code
def Z (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 4, 5, 5) self._draw_line (3.5, 1, 0, 4, width = 1.5)
def box(self)
-
Expand source code
def box (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 4, 5, 5) self._draw_rect (0, 1, 1, 4) self._draw_rect (4, 1, 5, 4)
def convert(self, X, Y)
-
Expand source code
def convert (self, X,Y): """Converts a pair of co-ordinates from block co-ords to real. X, Y -- define top-left corner of current character """ if self.mirror: X = 5-X return wx.Point( int ((X * self.blockX) + self.startX), int ((Y * self.blockY) + self.startY) )
Converts a pair of co-ordinates from block co-ords to real.
X, Y – define top-left corner of current character
def cross(self)
-
Expand source code
def cross (self): self._draw_rect (2, 0, 3, 5) self._draw_rect (0, 2, 5, 3)
def delta(self)
-
Expand source code
def delta (self): self._draw_line (2, 0, 0, 5) self._draw_line (2, 0, 4, 5) self._draw_rect (0.5, 4, 4.5, 5)
def gamma(self)
-
Expand source code
def gamma (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5)
def pi(self)
-
Expand source code
def pi (self): self._draw_rect (0, 0, 5, 1) self._draw_rect (0, 0, 1, 5) self._draw_rect (4, 0, 5, 5)
def set_distance(self, n)
-
Expand source code
def set_distance (self, n): """ Sets standard viewing distance, against which patient is compared. n is an index to the list self.standard_patient_chart_distances """ self.distance = n # Snellen characters are the smallest readable characters by # an average person at the stated distance. They are defined # exactly as being in a box which subtends 5' of an arc on the # patient's eye, each stroke subtending 1' of arc one_minute = (math.pi / 180) / 60 blocksize = (self.standard_patient_chart_distances[n] * 100) * math.atan(one_minute) # in cm # convert to pixels self.blockX = int (blocksize / self.screen_width_cm * self.screen_width_pixel) self.blockY = int (blocksize / self.screen_height_cm * self.screen_height_pixel) # how many characters can we fit now? chars = int (self.screen_width_pixel / (self.blockX*5)) - 1 if chars < 1: chars = 1 if chars > 7: chars = 7 if chars < len (self.alphabet): self.choices = [] while len (self.choices) < chars: c = random.choice (self.alphabet) if not c in self.choices: self.choices.append (c) else: self.choices = [ random.choice(self.alphabet) for i in range(1, chars) ] self.spacing = int ((self.screen_width_pixel - (chars*self.blockX*5))/(chars+1)) if self.spacing < 0: self.spacing = 0 self.startY = int ((self.screen_height_pixel-(self.blockY*5))/2)
Sets standard viewing distance, against which patient is compared. n is an index to the list self.standard_patient_chart_distances
def star(self)
-
Expand source code
def star (self): """ Star of 5 points """ n = 5 # can change here list = [] for i in range (0, n): theta = (i+0.00001)/n*2*math.pi # points on a circle inside the 5x5 grid x = 2.5 + 2.5*math.sin (theta) y = 2.5 - 2.5*math.cos (theta) list.append (self.convert (x, y)) # add point to list theta = (i+0.5)/n*2*math.pi x = 2.5 + math.sin (theta) y = 2.5 - math.cos (theta) list.append (self.convert (x, y)) self.dc.DrawPolygon (list, fill_style = wx.WINDING_RULE)
Star of 5 points