From 104fc169a7e959e8976302c4b505b1b1be725193 Mon Sep 17 00:00:00 2001 From: Trever Fischer Date: Wed, 25 Apr 2012 16:02:28 -0400 Subject: [PATCH] Add a tool to plot a resultant config.yml --- tools/plot.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 tools/plot.py diff --git a/tools/plot.py b/tools/plot.py new file mode 100755 index 0000000..713344e --- /dev/null +++ b/tools/plot.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +from yaml import load +import random +from PIL import Image, ImageFont, ImageDraw +from PIL.ImageColor import getcolor +from argparse import ArgumentParser + +parser = ArgumentParser(description='Plot a world') +parser.add_argument('config', help='path to config.yml') +parser.add_argument('--world', help='world name', dest='world', default='world') +parser.add_argument('--output', help='Output file', dest='output', default='plot.png') +args = parser.parse_args() + +colorList = [] +colors = open("/usr/share/config/colors/Web.colors") +for c in colors: + colorTuple = c.strip().split(" ") + try: + colorList.append((int(colorTuple[0]), int(colorTuple[1]), int(colorTuple[2]))) + except Exception, e: + pass + +data = load(open(args.config)) + +regions = data['worlds'][args.world]['regions'] + +regionData = [] + +for region in regions: + regionData.append({'name': region, 'x': regions[region]['x'], 'y': regions[region]['z'], 'color': random.choice(colorList)}) + +minX = 0 +minY = 0 +maxX = 0 +maxY = 0 +for region in regionData: + if region['x'] < minX: + minX = region['x'] + if region['y'] < minY: + minY = region['y'] + if region['x'] > maxX: + maxX = region['x'] + if region['y'] > maxY: + maxY = region['y'] + print region['name'], region['color'] + +minX = minX-100 +minY = minY-100 +maxX = maxX+100 +maxY = maxY+100 + +width = abs(maxX-minX) +height = abs(maxY-minY) + +def nearest(x, y, regions): + minDistance = 0 + nearest = None + for region in regions: + check = abs(region['x']-x)+abs(region['y']-y) + #check = math.sqrt(abs(region['x']-x)**2+abs(region['y']-y)**2) + if (minDistance == 0 or check < minDistance): + nearest = region + minDistance = check + return nearest + +img = Image.new("RGB", (width, height)) +putpixel = img.im.putpixel +pix = img.load() +for x in range(0, width): + worldX = minX + x + for y in range(0, height): + worldY = minY + y + region = nearest(worldX, worldY, regionData) + pix[x, y] = region['color'] + + print "%d/%d"%(x, width) + +draw = ImageDraw.Draw(img) +font = ImageFont.truetype("/usr/share/fonts/gnu-free/FreeSansBold.ttf", 24) +for region in regionData: + regionX = region['x']+abs(minX) + regionY = region['y']+abs(minY) + draw.ellipse((regionX-10, regionY-10, regionX+10, regionY+10), fill=128) + draw.text((regionX, regionY), region['name'], font=font) + + +img.save(args.output, "PNG") +