gyorgyf@5: #!/usr/bin/env python gyorgyf@5: # encoding: utf-8 gyorgyf@5: """ gyorgyf@5: visclient.py gyorgyf@5: gyorgyf@5: Created by George Fazekas on 2012-06-17. gyorgyf@5: Copyright (c) 2012 . All rights reserved. gyorgyf@5: """ gyorgyf@5: gyorgyf@12: import sys,os,math,time,copy gyorgyf@5: import pygame as pg gyorgyf@5: from pygame.locals import * gyorgyf@5: import httplib as ht gyorgyf@5: gyorgyf@5: import gradients gyorgyf@5: from gradients import genericFxyGradient gyorgyf@5: gyorgyf@5: # from pytagcloud import create_tag_image, make_tags gyorgyf@5: # from pytagcloud.lang.counter import get_tag_counts gyorgyf@5: gyorgyf@5: # YOUR_TEXT = "A tag cloud is a visual representation for text data, typically\ gyorgyf@5: # used to depict keyword metadata on websites, or to visualize free form text." gyorgyf@5: # gyorgyf@5: # tags = make_tags(get_tag_counts(YOUR_TEXT), maxsize=120) gyorgyf@5: # gyorgyf@5: # create_tag_image(tags, 'cloud_large.png', size=(900, 600), fontname='Lobster') gyorgyf@5: gyorgyf@12: scol = (0,255,0,255) gyorgyf@12: ecol = (0,0,0,255) gyorgyf@12: gyorgyf@12: # X,Y=1140,900 gyorgyf@12: X,Y = 600,400 gyorgyf@14: BLOBSIZE = 20 gyorgyf@14: G=110 gyorgyf@12: gyorgyf@12: class Blob(object): gyorgyf@12: gyorgyf@12: def __init__(self,bg,x,y,color=(255,255,255),mood=None): gyorgyf@12: self.x = x gyorgyf@12: self.y = y gyorgyf@12: self.xs = x * X gyorgyf@12: self.ys = Y - (y * Y) gyorgyf@12: self.bg = bg gyorgyf@14: self.size = BLOBSIZE gyorgyf@12: self.time = time.time() gyorgyf@12: self.alpha = 255 gyorgyf@12: self.c = color gyorgyf@14: self.count = 1 gyorgyf@12: self.visible = True gyorgyf@12: if mood and mood.color : gyorgyf@12: self.c = mood.color gyorgyf@12: gyorgyf@12: def __cmp__(self,other): gyorgyf@12: d = math.sqrt( math.pow((self.x-other.x),2) + math.pow((self.y-other.y),2) ) gyorgyf@12: if d < 0.03 : gyorgyf@12: return 0 gyorgyf@12: else : gyorgyf@12: return -1 gyorgyf@12: gyorgyf@12: def draw(self): gyorgyf@14: d=int(self.size) gyorgyf@14: 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@12: self.alpha = 255 - int(self.age()*15) gyorgyf@12: if self.alpha < 5 : gyorgyf@12: self.alpha = 1 gyorgyf@12: self.visible = False gyorgyf@12: gyorgyf@12: def age(self): gyorgyf@12: return time.time() - self.time gyorgyf@12: gyorgyf@12: def increment(self,count): gyorgyf@14: self.count = count gyorgyf@14: self.size = int(BLOBSIZE * int(self.count/1.5)) gyorgyf@12: gyorgyf@12: def get_distance(self,x,y): gyorgyf@12: return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) ) gyorgyf@12: gyorgyf@12: gyorgyf@12: gyorgyf@12: gyorgyf@12: class Mood(): gyorgyf@12: def __init__(self,word,x,y): gyorgyf@12: self.word = word gyorgyf@12: self.x = float(x) gyorgyf@12: self.y = float(y) gyorgyf@12: self.color = [] gyorgyf@12: gyorgyf@12: def get_distance(self,x,y): gyorgyf@12: return math.sqrt( math.pow((self.x-x),2) + math.pow((self.y-y),2) ) gyorgyf@12: gyorgyf@12: gyorgyf@12: gyorgyf@12: class VisualClient(object): gyorgyf@12: gyorgyf@12: def __init__(self): gyorgyf@12: # self.conn = ht.HTTPConnection("192.168.2.184:8030") gyorgyf@12: self.conn = ht.HTTPConnection("138.37.95.215") gyorgyf@12: gyorgyf@12: pg.init() gyorgyf@12: gyorgyf@12: # fontObj = pg.font.Font("freesansbold.ttf",18) gyorgyf@12: white = ( 255, 255, 255) gyorgyf@12: black = ( 0,0,0) gyorgyf@12: gyorgyf@12: self.fpsClock = pg.time.Clock() gyorgyf@12: self.screen = pg.display.set_mode((X, Y)) gyorgyf@12: pg.display.set_caption('Mood Conductor') gyorgyf@12: self.bg = pg.Surface(self.screen.get_size()) gyorgyf@12: self.bg = self.bg.convert() gyorgyf@12: self.bg.fill((0,0,0)) gyorgyf@12: gyorgyf@12: gyorgyf@12: self.scol = (0,255,0,255) gyorgyf@12: self.ecol = (0,0,0,255) gyorgyf@12: coordstxt = "test" gyorgyf@12: gyorgyf@12: self.blobs = [] gyorgyf@12: self.moods = [] gyorgyf@12: self.read_mood_data() gyorgyf@12: # pg.quit() gyorgyf@12: # sys.exit(-1) gyorgyf@12: gyorgyf@12: pass gyorgyf@12: gyorgyf@12: def read_mood_data(self): gyorgyf@12: gyorgyf@12: with open('moods.csv') as mf: gyorgyf@12: data = mf.readlines()[1:] gyorgyf@12: for line in data : gyorgyf@12: l = line.split(',') gyorgyf@14: mood = Mood(l[0],l[1],l[2]) gyorgyf@12: self.moods.append(mood) gyorgyf@12: with open('feelings.txt') as ff: gyorgyf@12: data = ff.readlines() gyorgyf@12: data = map(lambda x: x.split('\t'),data) gyorgyf@12: for mood in self.moods : gyorgyf@12: for colors in data : gyorgyf@12: if mood.word == colors[0] : gyorgyf@12: mood.color = colors[2] gyorgyf@12: pass gyorgyf@12: for mood in self.moods: gyorgyf@12: if mood.color : gyorgyf@12: mood.color = map(lambda x: '0x'+str(x).strip(),[mood.color[0:2],mood.color[2:4],mood.color[4:]]) gyorgyf@12: mood.color = tuple(map(lambda x: int(eval(x)),mood.color)) gyorgyf@12: # print mood.color gyorgyf@12: gyorgyf@12: gyorgyf@12: def update(self): gyorgyf@12: gyorgyf@12: # delete invisibles gyorgyf@12: for blob in self.blobs : gyorgyf@12: if not blob.visible : gyorgyf@12: self.blobs.remove(blob) gyorgyf@12: gyorgyf@12: # get new coordinates from the server gyorgyf@12: self.conn.putrequest("GET","/moodconductor/result", skip_host=True) gyorgyf@12: self.conn.putheader("Host", "www.isophonics.net") gyorgyf@12: self.conn.endheaders() gyorgyf@12: res = self.conn.getresponse() gyorgyf@12: data = res.read() gyorgyf@12: data = eval(data) gyorgyf@12: if not data : gyorgyf@12: self.conn.close() gyorgyf@12: return False gyorgyf@12: for d in data : gyorgyf@14: # coordstxt = "x:%s y:%s c:%s" %d gyorgyf@14: x,y,c = d gyorgyf@12: gyorgyf@12: cmood = None gyorgyf@12: d = cd = sys.float_info.max gyorgyf@12: for mood in self.moods : gyorgyf@12: d = mood.get_distance(x,y) gyorgyf@12: if d < cd : gyorgyf@12: cd = d gyorgyf@14: cmood = mood gyorgyf@12: gyorgyf@12: new = Blob(self.bg,x,y,mood=cmood) gyorgyf@12: if not new in self.blobs : gyorgyf@12: self.blobs.insert(0,new) gyorgyf@14: elif c > self.blobs[self.blobs.index(new)].count: gyorgyf@12: self.blobs[self.blobs.index(new)].increment(c) gyorgyf@12: gyorgyf@12: self.conn.close() gyorgyf@12: self.blobs = self.blobs[:5] gyorgyf@12: return True gyorgyf@12: gyorgyf@12: gyorgyf@12: def draw(self): gyorgyf@12: self.bg.fill((0,0,0)) gyorgyf@12: # self.bg.blit(gradients.radial(19, self.scol, self.ecol), (rect_x,rect_y)) gyorgyf@12: l = copy.copy(self.blobs) gyorgyf@12: l.reverse() gyorgyf@12: for blob in l : gyorgyf@12: blob.draw() gyorgyf@12: gyorgyf@14: # axis gyorgyf@14: pg.draw.line(self.bg, (G,G,G), (int(X/2.0),0),(int(X/2.0),Y), 1) gyorgyf@14: pg.draw.line(self.bg, (G,G,G), (0,int(Y/2.0)),(X,int(Y/2.0)), 1) gyorgyf@14: gyorgyf@14: gyorgyf@12: gyorgyf@12: def run(self): gyorgyf@12: # conn = ht.HTTPConnection("192.168.2.184:8030") gyorgyf@12: self.conn = ht.HTTPConnection("138.37.95.215") gyorgyf@12: gyorgyf@12: rect_x,rect_y = 0,0 gyorgyf@12: counter = 0 gyorgyf@12: gyorgyf@12: # main loop gyorgyf@12: while True : gyorgyf@12: # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0) gyorgyf@12: # screen.blit(gradients.radial(99, scol, ecol), (401, 1)) gyorgyf@12: gyorgyf@12: for event in pg.event.get() : gyorgyf@12: if event.type == QUIT: gyorgyf@14: self.conn.close() gyorgyf@12: pg.quit() gyorgyf@12: sys.exit() gyorgyf@12: elif event.type == KEYDOWN : gyorgyf@12: if event.key == K_ESCAPE : gyorgyf@12: pg.event.post(pg.event.Event(QUIT)) gyorgyf@12: gyorgyf@12: gyorgyf@12: # Draw gyorgyf@12: self.draw() gyorgyf@12: gyorgyf@12: gyorgyf@12: # update from the server gyorgyf@12: counter += 1 gyorgyf@12: if counter % 12 : gyorgyf@12: counter = 0 gyorgyf@14: try : gyorgyf@14: self.update() gyorgyf@14: except: gyorgyf@14: pass gyorgyf@12: # update display gyorgyf@12: self.screen.blit(self.bg, (0, 0)) gyorgyf@12: pg.display.flip() gyorgyf@12: self.fpsClock.tick(50) gyorgyf@12: pass gyorgyf@5: gyorgyf@5: gyorgyf@5: def main(): gyorgyf@5: gyorgyf@12: v = VisualClient() gyorgyf@12: v.run() gyorgyf@5: gyorgyf@12: # conn = ht.HTTPConnection("192.168.2.184:8030") gyorgyf@12: # gyorgyf@12: # pg.init() gyorgyf@12: # fontObj = pg.font.Font("freesansbold.ttf",18) gyorgyf@12: # gyorgyf@12: # white = ( 255, 255, 255) gyorgyf@12: # black = ( 0,0,0) gyorgyf@12: # fpsClock = pg.time.Clock() gyorgyf@12: # screen = pg.display.set_mode((1024, 768)) gyorgyf@12: # rect_x,rect_y=50,50 gyorgyf@12: # rect_xp,rect_yp=50,50 gyorgyf@12: # rect_change_x,rect_change_y=5,5 gyorgyf@12: # counter = 0 gyorgyf@12: # scol = (0,255,0,255) gyorgyf@12: # # ecol = (100,0,50,255) gyorgyf@12: # ecol = (0,0,0,255) gyorgyf@12: # coordstxt = "test" gyorgyf@12: # gyorgyf@12: # while True : gyorgyf@12: # pg.draw.circle(screen, pg.Color(255,0,0), (300,50),20,0) gyorgyf@12: # # screen.blit(gradients.radial(99, scol, ecol), (401, 1)) gyorgyf@12: # gyorgyf@12: # for event in pg.event.get() : gyorgyf@12: # if event.type == QUIT: gyorgyf@12: # conn.close() gyorgyf@12: # pg.quit() gyorgyf@12: # sys.exit() gyorgyf@12: # elif event.type == KEYDOWN : gyorgyf@12: # if event.key == K_ESCAPE : gyorgyf@12: # pg.event.post(pg.event.Event(QUIT)) gyorgyf@12: # gyorgyf@12: # # put text gyorgyf@12: # # txtObj = fontObj.render(coordstxt,True,pg.Color(254,254,254)) gyorgyf@12: # # rectObj = txtObj.get_rect() gyorgyf@12: # # rectObj.topleft = (10,20) gyorgyf@12: # # # rectObj.fill(pg.Color(254,254,254)) gyorgyf@12: # # screen.blit(txtObj,rectObj) gyorgyf@12: # gyorgyf@12: # gyorgyf@12: # # Draw the rectangle gyorgyf@12: # # pg.draw.rect(screen,black,[rect_xp,rect_yp,50,50]) gyorgyf@12: # screen.blit(gradients.radial(19, ecol, ecol), (rect_xp,rect_yp)) gyorgyf@12: # gyorgyf@12: # rect_xp,rect_yp = rect_x,rect_y gyorgyf@12: # # pg.draw.rect(screen,white,[rect_x,rect_y,50,50]) gyorgyf@12: # screen.blit(gradients.radial(19, scol, ecol), (rect_x,rect_y)) gyorgyf@12: # gyorgyf@12: # gyorgyf@12: # # Move the rectangle starting point gyorgyf@12: # # rect_x += rect_change_x gyorgyf@12: # # rect_y += rect_change_y gyorgyf@12: # counter += 1 gyorgyf@12: # if counter % 12 : gyorgyf@12: # counter = 0 gyorgyf@12: # try : gyorgyf@12: # conn.request("GET","/moodconductor/result") gyorgyf@12: # res = conn.getresponse() gyorgyf@12: # data = eval(res.read()) gyorgyf@12: # coordstxt = "x:%s y:%s" %data gyorgyf@12: # rect_x = data[0] * 300 gyorgyf@12: # rect_y = data[1] * 1000 gyorgyf@12: # conn.close() gyorgyf@12: # except : gyorgyf@12: # pass gyorgyf@12: # gyorgyf@12: # gyorgyf@12: # gyorgyf@12: # # Bounce the ball if needed gyorgyf@12: # if rect_y > 450 or rect_y < 0: gyorgyf@12: # rect_change_y = rect_change_y * -1 gyorgyf@12: # if rect_x > 650 or rect_x < 0: gyorgyf@12: # rect_change_x = rect_change_x * -1 gyorgyf@12: # gyorgyf@12: # # pg.display.update() gyorgyf@12: # pg.display.flip() gyorgyf@12: # fpsClock.tick(50) gyorgyf@12: # gyorgyf@12: # gyorgyf@12: # # if raw_input("quit?") in ['y'] : gyorgyf@12: # # pg.quit() gyorgyf@12: # gyorgyf@12: # pass gyorgyf@5: gyorgyf@5: gyorgyf@5: if __name__ == '__main__': gyorgyf@5: pass gyorgyf@5: main() gyorgyf@5: