regions/tools/plot.py

89 lines
2.3 KiB
Python
Raw Normal View History

#!/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")