From 7e18f1db1ceb23e921bd2a0b241c26813d88fe50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Wed, 5 Feb 2020 00:18:56 +0100 Subject: [PATCH] Restructured code --- .../{cv => card_detection}/__init__.py | 0 .../{cv => card_detection}/adjustment.py | 0 .../{cv => card_detection}/board_parser.py | 0 .../{cv => card_detection}/card_finder.py | 0 .../{cv => card_detection}/configuration.py | 0 .../{ => solver}/board_actions.py | 2 +- .../{ => solver}/board_possibilities.py | 2 +- shenzhen_solitaire/{ => solver}/solver.py | 2 +- test/cv_helper.py | 38 ------------------- test/test_chain.py | 6 +-- test/test_cv.py | 24 ++++++++++++ test/test_solver.py | 4 +- tools/__init__.py | 0 tools/generate_config.py | 14 +++++++ 14 files changed, 46 insertions(+), 46 deletions(-) rename shenzhen_solitaire/{cv => card_detection}/__init__.py (100%) rename shenzhen_solitaire/{cv => card_detection}/adjustment.py (100%) rename shenzhen_solitaire/{cv => card_detection}/board_parser.py (100%) rename shenzhen_solitaire/{cv => card_detection}/card_finder.py (100%) rename shenzhen_solitaire/{cv => card_detection}/configuration.py (100%) rename shenzhen_solitaire/{ => solver}/board_actions.py (99%) rename shenzhen_solitaire/{ => solver}/board_possibilities.py (99%) rename shenzhen_solitaire/{ => solver}/solver.py (99%) delete mode 100644 test/cv_helper.py create mode 100644 test/test_cv.py create mode 100644 tools/__init__.py create mode 100644 tools/generate_config.py diff --git a/shenzhen_solitaire/cv/__init__.py b/shenzhen_solitaire/card_detection/__init__.py similarity index 100% rename from shenzhen_solitaire/cv/__init__.py rename to shenzhen_solitaire/card_detection/__init__.py diff --git a/shenzhen_solitaire/cv/adjustment.py b/shenzhen_solitaire/card_detection/adjustment.py similarity index 100% rename from shenzhen_solitaire/cv/adjustment.py rename to shenzhen_solitaire/card_detection/adjustment.py diff --git a/shenzhen_solitaire/cv/board_parser.py b/shenzhen_solitaire/card_detection/board_parser.py similarity index 100% rename from shenzhen_solitaire/cv/board_parser.py rename to shenzhen_solitaire/card_detection/board_parser.py diff --git a/shenzhen_solitaire/cv/card_finder.py b/shenzhen_solitaire/card_detection/card_finder.py similarity index 100% rename from shenzhen_solitaire/cv/card_finder.py rename to shenzhen_solitaire/card_detection/card_finder.py diff --git a/shenzhen_solitaire/cv/configuration.py b/shenzhen_solitaire/card_detection/configuration.py similarity index 100% rename from shenzhen_solitaire/cv/configuration.py rename to shenzhen_solitaire/card_detection/configuration.py diff --git a/shenzhen_solitaire/board_actions.py b/shenzhen_solitaire/solver/board_actions.py similarity index 99% rename from shenzhen_solitaire/board_actions.py rename to shenzhen_solitaire/solver/board_actions.py index d9e49bb..27bd47f 100644 --- a/shenzhen_solitaire/board_actions.py +++ b/shenzhen_solitaire/solver/board_actions.py @@ -1,7 +1,7 @@ """Contains actions that can be used on the board""" from typing import List, Tuple from dataclasses import dataclass -from . import board +from .. import board class Action: diff --git a/shenzhen_solitaire/board_possibilities.py b/shenzhen_solitaire/solver/board_possibilities.py similarity index 99% rename from shenzhen_solitaire/board_possibilities.py rename to shenzhen_solitaire/solver/board_possibilities.py index d5a65f7..1fb81ac 100644 --- a/shenzhen_solitaire/board_possibilities.py +++ b/shenzhen_solitaire/solver/board_possibilities.py @@ -1,6 +1,6 @@ """Contains function to iterate different kinds of possible actions""" from typing import Iterator, List, Tuple -from . import board +from .. import board from . import board_actions diff --git a/shenzhen_solitaire/solver.py b/shenzhen_solitaire/solver/solver.py similarity index 99% rename from shenzhen_solitaire/solver.py rename to shenzhen_solitaire/solver/solver.py index d5bddad..8e43ace 100644 --- a/shenzhen_solitaire/solver.py +++ b/shenzhen_solitaire/solver/solver.py @@ -1,6 +1,6 @@ """Contains solver for solitaire""" from typing import List, Iterator, Optional -from .board import Board +from ..board import Board from . import board_actions from .board_possibilities import possible_actions from .board_actions import ( diff --git a/test/cv_helper.py b/test/cv_helper.py deleted file mode 100644 index 10307ec..0000000 --- a/test/cv_helper.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Contains function to manually test the visual detection of a board""" - -import numpy as np -import cv2 - -from shenzhen_solitaire.cv import adjustment -from shenzhen_solitaire.cv import board_parser -from shenzhen_solitaire import board -from shenzhen_solitaire.cv.configuration import Configuration - - -def generate() -> None: - """Generate a configuration""" - with open("pictures/20190809172213_1.jpg", 'rb') as png_file: - img_str = png_file.read() - nparr = np.frombuffer(img_str, np.uint8) - image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) - - generated_config = Configuration.generate(image) - generated_config.save('test_config.zip') - - -def parse() -> board.Board: - """Parse a configuration""" - with open("pictures/20190809172213_1.jpg", 'rb') as png_file: - img_str = png_file.read() - nparr = np.frombuffer(img_str, np.uint8) - image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) - # image = cv2.resize(image, (1000, 629)) - - loaded_config = Configuration.load('test_config.zip') - # loaded_config.field_adjustment = adjustment.adjust_field(image) - return board_parser.parse_board(image, loaded_config) - - -if __name__ == "__main__": - # generate() - parse() diff --git a/test/test_chain.py b/test/test_chain.py index 38c00cc..2b12679 100644 --- a/test/test_chain.py +++ b/test/test_chain.py @@ -2,12 +2,12 @@ import unittest from shenzhen_solitaire.board import NumberCard, Position -from shenzhen_solitaire.board_actions import MoveAction, BunkerizeAction, GoalAction, HuaKillAction -from shenzhen_solitaire import board_possibilities +from shenzhen_solitaire.solver.board_actions import MoveAction, BunkerizeAction, GoalAction, HuaKillAction +from shenzhen_solitaire.solver import board_possibilities from .boards import TEST_BOARD -class ChainTestClass(unittest.TestCase): +class ChainTest(unittest.TestCase): """Tests the chain class""" def test_sequence(self) -> None: diff --git a/test/test_cv.py b/test/test_cv.py new file mode 100644 index 0000000..e07c982 --- /dev/null +++ b/test/test_cv.py @@ -0,0 +1,24 @@ +"""Contains function to manually test the visual detection of a board""" + +import unittest + +import cv2 +import numpy as np + +from shenzhen_solitaire import board +from shenzhen_solitaire.card_detection import adjustment, board_parser +from shenzhen_solitaire.card_detection.configuration import Configuration + + +class CardDetectionTest(unittest.TestCase): + def test_parse(self) -> None: + """Parse a configuration""" + with open("pictures/20190809172213_1.jpg", "rb") as png_file: + img_str = png_file.read() + nparr = np.frombuffer(img_str, np.uint8) + image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) + # image = cv2.resize(image, (1000, 629)) + + loaded_config = Configuration.load("test_config.zip") + # loaded_config.field_adjustment = adjustment.adjust_field(image) + print(board_parser.parse_board(image, loaded_config)) diff --git a/test/test_solver.py b/test/test_solver.py index be6b309..4fe0f95 100644 --- a/test/test_solver.py +++ b/test/test_solver.py @@ -2,7 +2,7 @@ import unittest import copy -from shenzhen_solitaire import solver +from shenzhen_solitaire.solver import solver from .boards import TEST_BOARD @@ -13,7 +13,7 @@ class SolverTest(unittest.TestCase): def test_solver(self) -> None: """Tests solver""" board_copy = copy.deepcopy(TEST_BOARD) - board_id = TEST_BOARD.state_identifier # type: ignore + board_id = TEST_BOARD.state_identifier board_solution_iterator = solver.solve(TEST_BOARD) for _, current_solution in zip(range(1), board_solution_iterator): self.assertEqual(board_id, board_copy.state_identifier) diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/generate_config.py b/tools/generate_config.py new file mode 100644 index 0000000..045e949 --- /dev/null +++ b/tools/generate_config.py @@ -0,0 +1,14 @@ +import numpy as np +import cv2 +from shenzhen_solitaire.card_detection.configuration import Configuration + +def main() -> None: + """Generate a configuration""" + with open("pictures/20190809172213_1.jpg", 'rb') as png_file: + img_str = png_file.read() + nparr = np.frombuffer(img_str, np.uint8) + image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) + + generated_config = Configuration.generate(image) + generated_config.save('test_config.zip') + \ No newline at end of file