From 801adea375f57a51cf6dd23cd4cda496cfc47bfd Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Fri, 18 Oct 2013 01:14:40 +0200 Subject: [PATCH 1/1] SGF output for multiple images --- TODO | 3 +++ imago_pack/imago.py | 15 ++++++++++++--- imago_pack/output.py | 49 +++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index f74b253..3c4e5ad 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,7 @@ documentation +better color clustering +auto-calibration (too much new stones -> smaller clusters) +use information from previous board faster (and more realiable) grid search stone finding better user interface diff --git a/imago_pack/imago.py b/imago_pack/imago.py index e2c2876..7c6c1f2 100755 --- a/imago_pack/imago.py +++ b/imago_pack/imago.py @@ -18,6 +18,7 @@ import linef import manual import intrsc import gridf +import output def argument_parser(): parser = argparse.ArgumentParser(description=__doc__) @@ -111,17 +112,25 @@ def main(): print board else: + game = output.Game(19, board) #TODO size parameter for f in args.files[1:]: try: image = Image.open(f) except IOError, msg: print >> sys.stderr, msg continue + if verbose: + print >> sys.stderr, "Opening", f if image.mode == 'P': image = image.convert('RGB') board = intrsc.board(image, lines, show_all, do_something) - for line in board: - print ' '.join(line) + if args.sgf_output: + game.addMove(board) + else: + print board + + if args.sgf_output: + print game.asSGF() return 0 @@ -144,5 +153,5 @@ if __name__ == '__main__': try: sys.exit(main()) except KeyboardInterrupt: #TODO does this work? - print "Interrupted." + print >> sys.stderr, "Interrupted." sys.exit(1) diff --git a/imago_pack/output.py b/imago_pack/output.py index ba43ebd..bc13280 100644 --- a/imago_pack/output.py +++ b/imago_pack/output.py @@ -23,6 +23,13 @@ class Board: def asSGFsetPos(self): """Returns SGF (set position) representation of the position.""" + #TODO version numbering + sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n" + sgf += self.SGFpos() + sgf += ")" + return sgf + + def SGFpos(self): black = [] white = [] @@ -33,22 +40,44 @@ class Board: black.append((i, j)) elif stone == 'W': white.append((i, j)) - sgf = "" - #TODO version numbering - sgf += "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n" - sgf += "AB" + ''.join('[' + COORDS[j] + COORDS[i] + ']' + if len(black) > 0: + sgf += "AB" + ''.join('[' + COORDS[j] + COORDS[i] + ']' for (i, j) in black) + "\n" - sgf += "AW" + ''.join('[' + COORDS[j] + COORDS[i] + ']' + if len(white) > 0: + sgf += "AW" + ''.join('[' + COORDS[j] + COORDS[i] + ']' for (i, j) in white) + "\n" - sgf += ")" return sgf + def getMove(self, board): + for i in range(self.size): + for j in range(self.size): + if (self.stones[self.size * i + j] == "."): + if (board.stones[self.size * i + j] == "W"): + return ("W", COORDS[i] + COORDS[j]) + elif (board.stones[self.size * i + j] == "B"): + return ("B", COORDS[i] + COORDS[j]) + return None + + class Game: - def __init__(self, size): - self.board = (size * size) * "." + def __init__(self, size, board=None): + self.init_board = board or Board(size, (size * size) * ".") + self.board = self.init_board self.moves = [] + self.size = size + + def addMove(self, board): + self.moves.append(self.board.getMove(board)) + self.board = board + + def asSGF(self): + sgf = "(;FF[4]GM[1]SZ[" + str(self.size) + "]AP[Imago:0.1.0]\n" + sgf += self.init_board.SGFpos() + for m in self.moves: + if m: + sgf += ";" + m[0] + "[" + m[1] + "]\n" + sgf += ")" + return sgf - def add(self, board): - self -- 2.4.2