Source code for manual

"""Manual grid selection module"""

from math import sqrt, acos, copysign
from PIL import ImageDraw
import pygame

from geometry import l2ad, line, intersection
from manual_lines import *

class UserQuitError(Exception):
    pass

class Screen:
    def __init__(self, res):
        pygame.init()
        pygame.display.set_mode(res)
        pygame.display.set_caption("Imago manual mode")
        self._screen = pygame.display.get_surface()

    def display_picture(self, img):
        pg_img = pygame.image.frombuffer(img.tostring(), img.size, img.mode)
        self._screen.blit(pg_img, (0, 0))
        pygame.display.flip()


def display_instr():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                raise UserQuitError 
            if event.type == pygame.MOUSEBUTTONDOWN or event.type == pygame.KEYDOWN:
                return 

[docs]def find_lines(im_orig): """Run the GUI.""" im = im_orig.copy() screen = Screen((620, 350)) font = pygame.font.Font(None, 25) instructions = ["Imago manual mode", "", "To set the grid position, click on the corners of the grid. Once you mark", "all four corners, the grid will appear. To adjust it, just click on the new", "position and the nearest corner will move there. Once you are content", "with the alignment, press any key on your keyboard or close the window.", "", "", "", "Press any key to continue."] y = 10 for i in instructions: text1 = font.render(i, True, [128, 255, 128]) screen._screen.blit(text1, [10, y]) y += 25 pygame.display.flip() display_instr() pygame.display.set_mode(im.size) clock = pygame.time.Clock() draw = ImageDraw.Draw(im) hoshi = lambda c: draw.ellipse((c[0] - 1, c[1] - 1, c[0] + 1, c[1] + 1), fill=(255, 64, 64)) corners = [] color = (32, 255, 32) line_width = 1 lines_r = [] def dst((x1, y1), (x2, y2)): return (x1 - x2) ** 2 + (y1 - y2) ** 2 while True: for event in pygame.event.get(): if event.type == pygame.QUIT or event.type == pygame.KEYDOWN: pygame.quit() if len(corners) == 4: return lines_r else: raise UserQuitError if event.type == pygame.MOUSEBUTTONDOWN: np = pygame.mouse.get_pos() if len(corners) >= 4: corners.sort(key=lambda p: dst(p, np)) corners = corners[1:] corners.append(np) (x, y) = corners[-1] draw.line((x-2, y, x + 2, y), fill=color) draw.line((x, y+2, x, y-2), fill=color) if len(corners) == 4: im = im_orig.copy() draw = ImageDraw.Draw(im) try: l_vert, l_hor = lines(corners) except Exception: corners = corners[:-1] for l in l_vert: draw.line(l, fill=color, width=line_width) for l in l_hor: draw.line(l, fill=color, width=line_width) # TODO sort by distance #l_vert.sort() #l_hor.sort() #for i in [3, 9, 15]: # for j in [3, 9, 15]: # hoshi(intersection(line(l_vert[i][0], l_vert[i][1]), # line(l_hor[j][0], l_hor[j][1]))) lines_r = [[l2ad(l, im.size) for l in l_vert], [l2ad(l, im.size) for l in l_hor]] screen.display_picture(im) clock.tick(15)