1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
from operationscore.PixelMapper import *
import util.Geo as Geo
import sys
import math
class C5SignMapper(PixelMapper):
"""C5SignMapper is a modification to SimpleMapper which maps events to the
nearest Pixel. In addtion, it also maps sign artifacts (letters, logo, etc)
to their representative locations if given in the form "ts rs :: conditions"
It also supports strings of the form: {x}>5, {y}<10, {x}*{y}<{x}, etc.
(Conditons, separated by commas. and and or may also be used)."""
signPosition = {
"ls" : {
'all' : [(2,2),(2,8), (2,14), (2,20)],
'1' : [(2,2)],
'2' : [(2,8)],
'3' : [(2,14)],
'4' : [(2,20)] },
"ts" : {
'all' : [(4,22), (10,22), (16,22), (22,22), (27, 22), (33, 22), (39,22), (44, 22)],
'1' : [(4,22)],
'2' : [(10,22)],
'3' : [(16,22)],
'4' : [(22,22)],
'5' : [(27,22)],
'6' : [(33,22)],
'7' : [(39,22)],
'8' : [(44,22)] },
"rs" : {
'all' : [(45,2), (45, 8), (45,14), (45,20)],
'1' : [(45,2)],
'2' : [(45,8)],
'3' : [(45,14)],
'4' : [(45,20)] },
"bs" : {
'all' : [(4,2), (10,2), (16,2), (22, 2), (27,2), (34,2), (39,2), (44,2)],
'1' : [(4,2)],
'2' : [(10,2)],
'3' : [(16,2)],
'4' : [(22,2)],
'5' : [(27,2)],
'6' : [(33,2)],
'7' : [(39,2)],
'8' : [(44,2)] },
"wt" : {
'all' : [(12,5), (13, 5), (16,5), (18,5), (21,5), (23,5), (26,5), (27,5), (30,5), (34,5), (37,5)],
'1' : [(12,5), (13,5)],
'2' : [(16,5)],
'3' : [(18,5)],
'4' : [(21,5)],
'5' : [(23,5)],
'6' : [(26,5),(27,5)],
'7' : [(30,5)],
'8' : [(34,5)],
'9' : [(37,5)] },
"cl" : {
'all' : [(17,8), (21,10), (24,10), (26,12), (31,12)],
'in' : [(21,10),(24,10),(26,12)],
'out' : [(17,8),(31,12)],
'1' : [(17,8)],
'2' : [(21,10)],
'3' : [(24,10)],
'4' : [(26,12)],
'5' : [(31,12)] },
"c5" : {
'all' : [(6,17), (11,17), (15,17), (19,17), (22, 17), (27,17), (33,16), (34, 16), (38,17), (42,17)],
'con' : [(6,17), (11,17), (15,17), (19,17), (22, 17), (27,17)],
'five': [(33,16), (34, 16), (38,17), (42,17)],
'1' : [(6,17)],
'2' : [(11,17)],
'3' : [(15,17)],
'4' : [(19,17)],
'5' : [(22,17)],
'6' : [(27,17)],
'7' : [(33,16)],
'8' : [(34,16)],
'9' : [(38,17)],
'10' : [(42,17)] },
}
def mappingFunction(self, eventLocation, screen):
if type(eventLocation) == type(tuple()):
bestDist = sys.maxint
bestPixel = None
[x,y] = eventLocation
for (x,pixel) in screen.pixelsInRange(x-self['CutoffDist'], \
x+self['CutoffDist']):
pixelDist = Geo.dist(pixel.location, eventLocation)
if pixelDist < bestDist:
bestPixel = pixel
bestDist = pixelDist
if bestPixel != None:
return [(bestPixel,1)]
else:
return []
else:
#pixel locs
eventLocSplit = eventLocation.split('@')
if len(eventLocSplit) == 2:
[eventLocation, signPart] = eventLocSplit
signParts = signPart.split(' ')
#print "*******************"
#print signParts
pixelLocs = []
for part in signParts:
if len(part) > 0:
parts = part.split('.')
pixelLocs.extend(self.signPosition[parts[0]][parts[1]])
#print pixelLocs
screenPixels = [p for p in screen if (p.location in pixelLocs)]
else:
screenPixels = [p for p in screen]
#{x}>5,{y}<k
ret = []
eventLocation = eventLocation.replace('{x}', 'pixel.location[0]')
eventLocation = eventLocation.replace('{y}', 'pixel.location[1]')
if len(eventLocation) > 0:
conditions = eventLocation.split(',')
conditionLambdas = [eval('lambda pixel:'+condition) for condition in conditions]
else:
conditionLambdas = []
for pixel in screenPixels:
try:
pixelValid = True
for p in conditionLambdas:
if p(pixel) == False:
pixelValid = False
continue
if pixelValid:
ret.append((pixel, 1))
except Exception as exp:
import pdb; pdb.set_trace()
raise Exception('Bad event condition')
return ret
|