annotate visualclient/visclient.py @ 22:858fc44a17c1

added s option to stop blobs from fading
author gyorgyf
date Fri, 22 Jun 2012 16:52:57 +0100
parents 92903c908539
children c97feb7ef9e9
rev   line source
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