Initial version
commit
4fca06fcdf
@ -0,0 +1,56 @@
|
|||||||
|
from .mapfile import MapFile
|
||||||
|
|
||||||
|
import pygame
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
'?' : (192, 192, 192), # Non-tried
|
||||||
|
'*' : (0 , 0 , 255), # Non-trimmed
|
||||||
|
'/' : (255, 255, 0) , # Non-scraped
|
||||||
|
'-' : (255, 0 , 0) , # Bad
|
||||||
|
'+' : (0 , 128, 0) , # Recovered
|
||||||
|
None: (0 , 0 , 0) , # Not on disk
|
||||||
|
}
|
||||||
|
|
||||||
|
BORDERCOLOR = (64,64,64)
|
||||||
|
|
||||||
|
W = 1900
|
||||||
|
H = 1000
|
||||||
|
CELLSIZE = 7
|
||||||
|
CELLBORDER = 1
|
||||||
|
CELLMARGIN = 1
|
||||||
|
|
||||||
|
CELLOFFSET = CELLSIZE + 2*CELLBORDER + CELLMARGIN
|
||||||
|
COLUMNS = W // CELLOFFSET
|
||||||
|
ROWS = H // CELLOFFSET
|
||||||
|
CELLS = COLUMNS * ROWS
|
||||||
|
|
||||||
|
class Visualisation:
|
||||||
|
def __init__(self, fn):
|
||||||
|
pygame.init()
|
||||||
|
self.disp = pygame.display.set_mode((W, H))
|
||||||
|
|
||||||
|
self.mapfile = MapFile(fn)
|
||||||
|
self.mapfile.load()
|
||||||
|
|
||||||
|
def draw(self):
|
||||||
|
self.disp.fill((0,0,0)) # Dark theme :-)
|
||||||
|
|
||||||
|
sz = self.mapfile.size
|
||||||
|
sqsz = sz / CELLS
|
||||||
|
for cid in range(CELLS):
|
||||||
|
start = cid * sqsz
|
||||||
|
end = (cid + 1) * sqsz
|
||||||
|
hist = self.mapfile.get_hist(start, end).items()
|
||||||
|
# Majority
|
||||||
|
symb, _count = max(hist, key=lambda x: x[1])
|
||||||
|
color = colors[symb]
|
||||||
|
|
||||||
|
line = cid // COLUMNS
|
||||||
|
col = cid % COLUMNS
|
||||||
|
pos = (line, col)
|
||||||
|
|
||||||
|
rect = pygame.Rect(col * CELLOFFSET + CELLBORDER, line * CELLOFFSET + CELLBORDER, CELLSIZE+2*CELLBORDER, CELLSIZE+2*CELLBORDER)
|
||||||
|
pygame.draw.rect(self.disp, color, rect)
|
||||||
|
pygame.draw.rect(self.disp, BORDERCOLOR, rect, width=CELLBORDER)
|
||||||
|
|
||||||
|
pygame.display.flip()
|
@ -0,0 +1,73 @@
|
|||||||
|
def read_mapfile(fn):
|
||||||
|
comments = []
|
||||||
|
status = None
|
||||||
|
blockstrings = []
|
||||||
|
with open(fn, 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
if line.startswith("#"):
|
||||||
|
comments.append(line)
|
||||||
|
elif status is None:
|
||||||
|
status = line
|
||||||
|
else:
|
||||||
|
blockstrings.append(line)
|
||||||
|
|
||||||
|
# Post-processing
|
||||||
|
status = status.split()
|
||||||
|
status[0] = int(status[0], base=0)
|
||||||
|
status[2] = int(status[2], base=0)
|
||||||
|
status = tuple(status)
|
||||||
|
|
||||||
|
blocks = []
|
||||||
|
for blockstring in blockstrings:
|
||||||
|
spl = blockstring.split()
|
||||||
|
start = int(spl[0], base=0)
|
||||||
|
length = int(spl[1], base=0)
|
||||||
|
char = spl[2]
|
||||||
|
blocks.append((start, length, char))
|
||||||
|
|
||||||
|
return (status, blocks, comments)
|
||||||
|
|
||||||
|
|
||||||
|
class MapFile:
|
||||||
|
def __init__(self, filename):
|
||||||
|
self.mapfilename = filename
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
self.status, self.blocks, self.comments = read_mapfile(self.mapfilename)
|
||||||
|
self.size = max(map(lambda blk: blk[0]+blk[1], self.blocks))
|
||||||
|
|
||||||
|
def get_state(self, pos):
|
||||||
|
# TODO: this is lame
|
||||||
|
for blk in self.blocks:
|
||||||
|
if pos >= blk[0] and pos < blk[0] + blk[1]:
|
||||||
|
return blk[2]
|
||||||
|
|
||||||
|
def get_hist(self, start, end):
|
||||||
|
relevant_blocks = []
|
||||||
|
for blk in self.blocks:
|
||||||
|
if start < blk[0] + blk[1] and end >= blk[0]:
|
||||||
|
relevant_blocks.append(blk)
|
||||||
|
|
||||||
|
# Trimming:
|
||||||
|
trmblks = []
|
||||||
|
for blk in relevant_blocks:
|
||||||
|
bg, lt, symb = blk
|
||||||
|
if bg < start:
|
||||||
|
lt -= start - bg
|
||||||
|
bg = start
|
||||||
|
if bg + lt > end:
|
||||||
|
lt -= bg+lt - end
|
||||||
|
trmblks.append((bg, lt, symb))
|
||||||
|
|
||||||
|
# Grouping by symbols:
|
||||||
|
grp = {}
|
||||||
|
for blk in trmblks:
|
||||||
|
if blk[2] not in grp:
|
||||||
|
grp[blk[2]] = 0
|
||||||
|
grp[blk[2]] += blk[1]
|
||||||
|
|
||||||
|
return grp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue