gyorgyf@5
|
1 #!/usr/bin/env python
|
gyorgyf@5
|
2 # encoding: utf-8
|
gyorgyf@5
|
3 """
|
gyorgyf@5
|
4 visclient.py
|
gyorgyf@5
|
5
|
gyorgyf@5
|
6 Created by George Fazekas on 2012-06-17.
|
gyorgyf@5
|
7 Copyright (c) 2012 . All rights reserved.
|
gyorgyf@5
|
8 """
|
gyorgyf@5
|
9
|
gyorgyf@12
|
10 import sys,os,math,time,copy
|
gyorgyf@5
|
11 import pygame as pg
|
gyorgyf@5
|
12 from pygame.locals import *
|
gyorgyf@5
|
13 import httplib as ht
|
gyorgyf@5
|
14
|
gyorgyf@5
|
15 import gradients
|
gyorgyf@5
|
16 from gradients import genericFxyGradient
|
gyorgyf@5
|
17
|
gyorgyf@5
|
18 # from pytagcloud import create_tag_image, make_tags
|
gyorgyf@5
|
19 # from pytagcloud.lang.counter import get_tag_counts
|
gyorgyf@5
|
20
|
gyorgyf@5
|
21 # YOUR_TEXT = "A tag cloud is a visual representation for text data, typically\
|
gyorgyf@5
|
22 # used to depict keyword metadata on websites, or to visualize free form text."
|
gyorgyf@5
|
23 #
|
gyorgyf@5
|
24 # tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120)
|
gyorgyf@5
|
25 #
|
gyorgyf@5
|
26 # create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='Lobster')
|
gyorgyf@5
|
27
|
gyorgyf@12
|
28 scol = (0,255,0,255)
|
gyorgyf@12
|
29 ecol = (0,0,0,255)
|
gyorgyf@12
|
30
|
gyorgyf@12
|
31 # X,Y=1140,900
|
gyorgyf@12
|
32 X,Y = 600,400
|
gyorgyf@21
|
33 NBLOBS = 15
|
gyorgyf@22
|
34 BLOBSIZE = 25
|
gyorgyf@14
|
35 G=110
|
gyorgyf@22
|
36 FADE = 15
|
gyorgyf@12
|
37
|
gyorgyf@12
|
38 class Blob(object):
|
gyorgyf@12
|
39
|
gyorgyf@22
|
40 def __init__(self,bg,x,y,color=(255,255,255),mood=None,fade=FADE):
|
gyorgyf@12
|
41 self.x = x
|
gyorgyf@12
|
42 self.y = y
|
gyorgyf@12
|
43 self.xs = x * X
|
gyorgyf@12
|
44 self.ys = Y - (y * Y)
|
gyorgyf@12
|
45 self.bg = bg
|
gyorgyf@14
|
46 self.size = BLOBSIZE
|
gyorgyf@12
|
47 self.time = time.time()
|
gyorgyf@12
|
48 self.alpha = 255
|
gyorgyf@12
|
49 self.c = color
|
gyorgyf@14
|
50 self.count = 1
|
gyorgyf@12
|
51 self.visible = True
|
gyorgyf@22
|
52 self.FADE = fade
|
gyorgyf@12
|
53 if mood and mood.color :
|
gyorgyf@12
|
54 self.c = mood.color
|
gyorgyf@12
|
55
|
gyorgyf@12
|
56 def __cmp__(self,other):
|
gyorgyf@12
|
57 d = math.sqrt( math.pow((self.x-other.x),2) + math.pow((self.y-other.y),2) )
|
gyorgyf@12
|
58 if d < 0.03 :
|
gyorgyf@12
|
59 return 0
|
gyorgyf@12
|
60 else :
|
gyorgyf@12
|
61 return -1
|
gyorgyf@12
|
62
|
gyorgyf@12
|
63 def draw(self):
|
gyorgyf@14
|
64 d=int(self.size)
|
gyorgyf@14
|
65 self.bg.blit(gradients.radial(self.size, (self.c[0],self.c[1],self.c[2],self.alpha), (0,0,0,self.alpha)), (self.xs-d,self.ys-d))
|
gyorgyf@22
|
66 self.alpha = 255 - int(self.age()*self.FADE)
|
gyorgyf@12
|
67 if self.alpha < 5 :
|
gyorgyf@12
|
68 self.alpha = 1
|
gyorgyf@12
|
69 self.visible = False
|
gyorgyf@12
|
70
|
gyorgyf@12
|
71 def age(self):
|
gyorgyf@12
|
72 return time.time() - self.time
|
gyorgyf@12
|
73
|
gyorgyf@12
|
74 def increment(self,count):
|
gyorgyf@21
|
75 self.time = time.time()
|
gyorgyf@14
|
76 self.count = count
|
gyorgyf@14
|
77 self.size = int(BLOBSIZE * int(self.count/1.5))
|
gyorgyf@12
|
78
|
gyorgyf@12
|
79 def get_distance(self,x,y):
|
gyorgyf@12
|
80 return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) )
|
gyorgyf@22
|
81
|
gyorgyf@22
|
82 def fade(self,fade):
|
gyorgyf@22
|
83 if not fade : self.alpha = 255
|
gyorgyf@22
|
84 self.FADE = fade
|
gyorgyf@22
|
85
|
gyorgyf@22
|
86 def reset_time(self):
|
gyorgyf@22
|
87 self.time = time.time()
|
gyorgyf@12
|
88
|
gyorgyf@12
|
89
|
gyorgyf@12
|
90
|
gyorgyf@12
|
91
|
gyorgyf@12
|
92 class Mood():
|
gyorgyf@12
|
93 def __init__(self,word,x,y):
|
gyorgyf@12
|
94 self.word = word
|
gyorgyf@12
|
95 self.x = float(x)
|
gyorgyf@12
|
96 self.y = float(y)
|
gyorgyf@12
|
97 self.color = []
|
gyorgyf@12
|
98
|
gyorgyf@12
|
99 def get_distance(self,x,y):
|
gyorgyf@12
|
100 return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) )
|
gyorgyf@12
|
101
|
gyorgyf@12
|
102
|
gyorgyf@12
|
103
|
gyorgyf@12
|
104 class VisualClient(object):
|
gyorgyf@12
|
105
|
gyorgyf@12
|
106 def __init__(self):
|
gyorgyf@12
|
107 # self.conn = ht.HTTPConnection("192.168.2.184:8030")
|
gyorgyf@12
|
108 self.conn = ht.HTTPConnection("138.37.95.215")
|
gyorgyf@12
|
109
|
gyorgyf@12
|
110 pg.init()
|
gyorgyf@12
|
111
|
gyorgyf@12
|
112 # fontObj = pg.font.Font("freesansbold.ttf",18)
|
gyorgyf@12
|
113 white = ( 255, 255, 255)
|
gyorgyf@12
|
114 black = ( 0,0,0)
|
gyorgyf@12
|
115
|
gyorgyf@12
|
116 self.fpsClock = pg.time.Clock()
|
gyorgyf@12
|
117 self.screen = pg.display.set_mode((X, Y))
|
gyorgyf@12
|
118 pg.display.set_caption('Mood Conductor')
|
gyorgyf@12
|
119 self.bg = pg.Surface(self.screen.get_size())
|
gyorgyf@12
|
120 self.bg = self.bg.convert()
|
gyorgyf@12
|
121 self.bg.fill((0,0,0))
|
gyorgyf@12
|
122
|
gyorgyf@12
|
123
|
gyorgyf@12
|
124 self.scol = (0,255,0,255)
|
gyorgyf@12
|
125 self.ecol = (0,0,0,255)
|
gyorgyf@12
|
126 coordstxt = "test"
|
gyorgyf@12
|
127
|
gyorgyf@12
|
128 self.blobs = []
|
gyorgyf@12
|
129 self.moods = []
|
gyorgyf@12
|
130 self.read_mood_data()
|
gyorgyf@12
|
131 # pg.quit()
|
gyorgyf@12
|
132 # sys.exit(-1)
|
gyorgyf@12
|
133
|
gyorgyf@22
|
134 self.FADE = FADE
|
gyorgyf@22
|
135
|
gyorgyf@12
|
136 pass
|
gyorgyf@12
|
137
|
gyorgyf@12
|
138 def read_mood_data(self):
|
gyorgyf@12
|
139
|
gyorgyf@12
|
140 with open('moods.csv') as mf:
|
gyorgyf@12
|
141 data = mf.readlines()[1:]
|
gyorgyf@12
|
142 for line in data :
|
gyorgyf@12
|
143 l = line.split(',')
|
gyorgyf@14
|
144 mood = Mood(l[0],l[1],l[2])
|
gyorgyf@12
|
145 self.moods.append(mood)
|
gyorgyf@22
|
146 # with open('feelings.txt') as ff:
|
gyorgyf@22
|
147 # data = ff.readlines()
|
gyorgyf@22
|
148 # data = map(lambda x: x.split('\t'),data)
|
gyorgyf@22
|
149 # for mood in self.moods :
|
gyorgyf@22
|
150 # for colors in data :
|
gyorgyf@22
|
151 # if mood.word == colors[0] :
|
gyorgyf@22
|
152 # mood.color = colors[2]
|
gyorgyf@22
|
153 with open('colors.txt') as ff:
|
gyorgyf@22
|
154 data = ff.readlines()[1:]
|
gyorgyf@22
|
155 data = map(lambda x: x.split(','),data)
|
gyorgyf@12
|
156 for mood in self.moods :
|
gyorgyf@22
|
157 d = cd = sys.float_info.max
|
gyorgyf@12
|
158 for colors in data :
|
gyorgyf@22
|
159 d = mood.get_distance(float(colors[0]),float(colors[1]))
|
gyorgyf@22
|
160 if d < cd :
|
gyorgyf@22
|
161 cd = d
|
gyorgyf@22
|
162 mood.color = tuple(map(lambda x: int(pow(math.atan((float(x)/7.0)),12.5)),(colors[2],colors[3],colors[4])))
|
gyorgyf@22
|
163
|
gyorgyf@22
|
164 # for mood in self.moods:
|
gyorgyf@22
|
165 # if mood.color :
|
gyorgyf@22
|
166 # # mood.color = map(lambda x: '0x'+str(x).strip(),[mood.color[0:2],mood.color[2:4],mood.color[4:]])
|
gyorgyf@22
|
167 # mood.color = tuple(map(lambda x: int(x),mood.color))
|
gyorgyf@22
|
168 # print mood.color
|
gyorgyf@12
|
169
|
gyorgyf@12
|
170
|
gyorgyf@12
|
171 def update(self):
|
gyorgyf@12
|
172
|
gyorgyf@12
|
173 # delete invisibles
|
gyorgyf@12
|
174 for blob in self.blobs :
|
gyorgyf@12
|
175 if not blob.visible :
|
gyorgyf@12
|
176 self.blobs.remove(blob)
|
gyorgyf@12
|
177
|
gyorgyf@12
|
178 # get new coordinates from the server
|
gyorgyf@12
|
179 self.conn.putrequest("GET","/moodconductor/result", skip_host=True)
|
gyorgyf@12
|
180 self.conn.putheader("Host", "www.isophonics.net")
|
gyorgyf@12
|
181 self.conn.endheaders()
|
gyorgyf@12
|
182 res = self.conn.getresponse()
|
gyorgyf@12
|
183 data = res.read()
|
gyorgyf@12
|
184 data = eval(data)
|
gyorgyf@12
|
185 if not data :
|
gyorgyf@12
|
186 self.conn.close()
|
gyorgyf@12
|
187 return False
|
gyorgyf@12
|
188 for d in data :
|
gyorgyf@14
|
189 # coordstxt = "x:%s y:%s c:%s" %d
|
gyorgyf@14
|
190 x,y,c = d
|
gyorgyf@12
|
191
|
gyorgyf@12
|
192 cmood = None
|
gyorgyf@12
|
193 d = cd = sys.float_info.max
|
gyorgyf@12
|
194 for mood in self.moods :
|
gyorgyf@12
|
195 d = mood.get_distance(x,y)
|
gyorgyf@12
|
196 if d < cd :
|
gyorgyf@12
|
197 cd = d
|
gyorgyf@14
|
198 cmood = mood
|
gyorgyf@12
|
199
|
gyorgyf@22
|
200 new = Blob(self.bg,x,y,mood=cmood,fade=self.FADE)
|
gyorgyf@12
|
201 if not new in self.blobs :
|
gyorgyf@12
|
202 self.blobs.insert(0,new)
|
gyorgyf@14
|
203 elif c > self.blobs[self.blobs.index(new)].count:
|
gyorgyf@12
|
204 self.blobs[self.blobs.index(new)].increment(c)
|
gyorgyf@12
|
205
|
gyorgyf@12
|
206 self.conn.close()
|
gyorgyf@21
|
207 self.blobs = self.blobs[:NBLOBS]
|
gyorgyf@12
|
208 return True
|
gyorgyf@12
|
209
|
gyorgyf@12
|
210
|
gyorgyf@12
|
211 def draw(self):
|
gyorgyf@12
|
212 self.bg.fill((0,0,0))
|
gyorgyf@12
|
213 # self.bg.blit(gradients.radial(19, self.scol, self.ecol), (rect_x,rect_y))
|
gyorgyf@12
|
214 l = copy.copy(self.blobs)
|
gyorgyf@12
|
215 l.reverse()
|
gyorgyf@12
|
216 for blob in l :
|
gyorgyf@12
|
217 blob.draw()
|
gyorgyf@12
|
218
|
gyorgyf@14
|
219 # axis
|
gyorgyf@14
|
220 pg.draw.line(self.bg, (G,G,G), (int(X/2.0),0),(int(X/2.0),Y), 1)
|
gyorgyf@14
|
221 pg.draw.line(self.bg, (G,G,G), (0,int(Y/2.0)),(X,int(Y/2.0)), 1)
|
gyorgyf@14
|
222
|
gyorgyf@14
|
223
|
gyorgyf@12
|
224
|
gyorgyf@12
|
225 def run(self):
|
gyorgyf@12
|
226 # conn = ht.HTTPConnection("192.168.2.184:8030")
|
gyorgyf@12
|
227 self.conn = ht.HTTPConnection("138.37.95.215")
|
gyorgyf@12
|
228
|
gyorgyf@12
|
229 rect_x,rect_y = 0,0
|
gyorgyf@12
|
230 counter = 0
|
gyorgyf@12
|
231
|
gyorgyf@12
|
232 # main loop
|
gyorgyf@12
|
233 while True :
|
gyorgyf@12
|
234 # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0)
|
gyorgyf@12
|
235 # screen.blit(gradients.radial(99, scol, ecol), (401, 1))
|
gyorgyf@12
|
236
|
gyorgyf@12
|
237 for event in pg.event.get() :
|
gyorgyf@12
|
238 if event.type == QUIT:
|
gyorgyf@14
|
239 self.conn.close()
|
gyorgyf@12
|
240 pg.quit()
|
gyorgyf@12
|
241 sys.exit()
|
gyorgyf@12
|
242 elif event.type == KEYDOWN :
|
gyorgyf@12
|
243 if event.key == K_ESCAPE :
|
gyorgyf@12
|
244 pg.event.post(pg.event.Event(QUIT))
|
gyorgyf@22
|
245 elif event.key == K_SPACE :
|
gyorgyf@22
|
246 self.blobs = []
|
gyorgyf@22
|
247 elif event.key == K_s :
|
gyorgyf@22
|
248 if self.FADE :
|
gyorgyf@22
|
249 print "fade off"
|
gyorgyf@22
|
250 self.FADE = 0
|
gyorgyf@22
|
251 for blob in self.blobs :
|
gyorgyf@22
|
252 blob.fade(0)
|
gyorgyf@22
|
253 else:
|
gyorgyf@22
|
254 print "fade on"
|
gyorgyf@22
|
255 self.FADE = 15
|
gyorgyf@22
|
256 for blob in self.blobs :
|
gyorgyf@22
|
257 blob.fade(15)
|
gyorgyf@22
|
258 blob.reset_time()
|
gyorgyf@22
|
259
|
gyorgyf@22
|
260
|
gyorgyf@12
|
261
|
gyorgyf@12
|
262
|
gyorgyf@12
|
263 # Draw
|
gyorgyf@12
|
264 self.draw()
|
gyorgyf@12
|
265
|
gyorgyf@12
|
266
|
gyorgyf@12
|
267 # update from the server
|
gyorgyf@12
|
268 counter += 1
|
gyorgyf@12
|
269 if counter % 12 :
|
gyorgyf@12
|
270 counter = 0
|
gyorgyf@14
|
271 try :
|
gyorgyf@14
|
272 self.update()
|
gyorgyf@14
|
273 except:
|
gyorgyf@14
|
274 pass
|
gyorgyf@12
|
275 # update display
|
gyorgyf@12
|
276 self.screen.blit(self.bg, (0, 0))
|
gyorgyf@12
|
277 pg.display.flip()
|
gyorgyf@12
|
278 self.fpsClock.tick(50)
|
gyorgyf@12
|
279 pass
|
gyorgyf@5
|
280
|
gyorgyf@5
|
281
|
gyorgyf@5
|
282 def main():
|
gyorgyf@5
|
283
|
gyorgyf@12
|
284 v = VisualClient()
|
gyorgyf@12
|
285 v.run()
|
gyorgyf@5
|
286
|
gyorgyf@12
|
287 # conn = ht.HTTPConnection("192.168.2.184:8030")
|
gyorgyf@12
|
288 #
|
gyorgyf@12
|
289 # pg.init()
|
gyorgyf@12
|
290 # fontObj = pg.font.Font("freesansbold.ttf",18)
|
gyorgyf@12
|
291 #
|
gyorgyf@12
|
292 # white = ( 255, 255, 255)
|
gyorgyf@12
|
293 # black = ( 0,0,0)
|
gyorgyf@12
|
294 # fpsClock = pg.time.Clock()
|
gyorgyf@12
|
295 # screen = pg.display.set_mode((1024, 768))
|
gyorgyf@12
|
296 # rect_x,rect_y=50,50
|
gyorgyf@12
|
297 # rect_xp,rect_yp=50,50
|
gyorgyf@12
|
298 # rect_change_x,rect_change_y=5,5
|
gyorgyf@12
|
299 # counter = 0
|
gyorgyf@12
|
300 # scol = (0,255,0,255)
|
gyorgyf@12
|
301 # # ecol = (100,0,50,255)
|
gyorgyf@12
|
302 # ecol = (0,0,0,255)
|
gyorgyf@12
|
303 # coordstxt = "test"
|
gyorgyf@12
|
304 #
|
gyorgyf@12
|
305 # while True :
|
gyorgyf@12
|
306 # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0)
|
gyorgyf@12
|
307 # # screen.blit(gradients.radial(99, scol, ecol), (401, 1))
|
gyorgyf@12
|
308 #
|
gyorgyf@12
|
309 # for event in pg.event.get() :
|
gyorgyf@12
|
310 # if event.type == QUIT:
|
gyorgyf@12
|
311 # conn.close()
|
gyorgyf@12
|
312 # pg.quit()
|
gyorgyf@12
|
313 # sys.exit()
|
gyorgyf@12
|
314 # elif event.type == KEYDOWN :
|
gyorgyf@12
|
315 # if event.key == K_ESCAPE :
|
gyorgyf@12
|
316 # pg.event.post(pg.event.Event(QUIT))
|
gyorgyf@12
|
317 #
|
gyorgyf@12
|
318 # # put text
|
gyorgyf@12
|
319 # # txtObj = fontObj.render(coordstxt,True,pg.Color(254,254,254))
|
gyorgyf@12
|
320 # # rectObj = txtObj.get_rect()
|
gyorgyf@12
|
321 # # rectObj.topleft = (10,20)
|
gyorgyf@12
|
322 # # # rectObj.fill(pg.Color(254,254,254))
|
gyorgyf@12
|
323 # # screen.blit(txtObj,rectObj)
|
gyorgyf@12
|
324 #
|
gyorgyf@12
|
325 #
|
gyorgyf@12
|
326 # # Draw the rectangle
|
gyorgyf@12
|
327 # # pg.draw.rect(screen,black,[rect_xp,rect_yp,50,50])
|
gyorgyf@12
|
328 # screen.blit(gradients.radial(19, ecol, ecol), (rect_xp,rect_yp))
|
gyorgyf@12
|
329 #
|
gyorgyf@12
|
330 # rect_xp,rect_yp = rect_x,rect_y
|
gyorgyf@12
|
331 # # pg.draw.rect(screen,white,[rect_x,rect_y,50,50])
|
gyorgyf@12
|
332 # screen.blit(gradients.radial(19, scol, ecol), (rect_x,rect_y))
|
gyorgyf@12
|
333 #
|
gyorgyf@12
|
334 #
|
gyorgyf@12
|
335 # # Move the rectangle starting point
|
gyorgyf@12
|
336 # # rect_x += rect_change_x
|
gyorgyf@12
|
337 # # rect_y += rect_change_y
|
gyorgyf@12
|
338 # counter += 1
|
gyorgyf@12
|
339 # if counter % 12 :
|
gyorgyf@12
|
340 # counter = 0
|
gyorgyf@12
|
341 # try :
|
gyorgyf@12
|
342 # conn.request("GET","/moodconductor/result")
|
gyorgyf@12
|
343 # res = conn.getresponse()
|
gyorgyf@12
|
344 # data = eval(res.read())
|
gyorgyf@12
|
345 # coordstxt = "x:%s y:%s" %data
|
gyorgyf@12
|
346 # rect_x = data[0] * 300
|
gyorgyf@12
|
347 # rect_y = data[1] * 1000
|
gyorgyf@12
|
348 # conn.close()
|
gyorgyf@12
|
349 # except :
|
gyorgyf@12
|
350 # pass
|
gyorgyf@12
|
351 #
|
gyorgyf@12
|
352 #
|
gyorgyf@12
|
353 #
|
gyorgyf@12
|
354 # # Bounce the ball if needed
|
gyorgyf@12
|
355 # if rect_y > 450 or rect_y < 0:
|
gyorgyf@12
|
356 # rect_change_y = rect_change_y * -1
|
gyorgyf@12
|
357 # if rect_x > 650 or rect_x < 0:
|
gyorgyf@12
|
358 # rect_change_x = rect_change_x * -1
|
gyorgyf@12
|
359 #
|
gyorgyf@12
|
360 # # pg.display.update()
|
gyorgyf@12
|
361 # pg.display.flip()
|
gyorgyf@12
|
362 # fpsClock.tick(50)
|
gyorgyf@12
|
363 #
|
gyorgyf@12
|
364 #
|
gyorgyf@12
|
365 # # if raw_input("quit?") in ['y'] :
|
gyorgyf@12
|
366 # # pg.quit()
|
gyorgyf@12
|
367 #
|
gyorgyf@12
|
368 # pass
|
gyorgyf@5
|
369
|
gyorgyf@5
|
370
|
gyorgyf@5
|
371 if __name__ == '__main__':
|
gyorgyf@5
|
372 pass
|
gyorgyf@5
|
373 main()
|
gyorgyf@5
|
374
|