2019SZI-Projekt/UI/grid.py

241 lines
7.1 KiB
Python
Raw Normal View History

import pygame as pg
import numpy as np
2019-06-09 12:13:31 +02:00
import random as rd
from os import listdir
from os.path import isfile, join
2019-06-10 00:13:56 +02:00
# from Logic.TrashRecognition.ImageClassification import classify
2019-06-09 12:13:31 +02:00
# MODULE LEVEL VARIABLES
2019-06-10 00:13:56 +02:00
recognized_trash = {
}
# trash_files = classify()
########################
class Grid:
2019-04-08 01:15:47 +02:00
def __init__(self, cols: int, rows: int):
self.table = [[Node(row, col)
for col in range(cols)]
for row in range(rows)]
self.cols = cols
self.rows = rows
def draw_map(self, screen: "PyGame screen"):
"""Draws whole map"""
screen.fill(Node.BLACK)
for row in self.table:
for node in row:
node.draw(screen)
def change_field(self, row: int, col: int, f_type: int):
self.table[row][col].change_field_type(f_type)
2019-06-09 12:13:31 +02:00
def generate_trash(self,row: int, col: int):
self.table[row][col].generate_trash()
2019-04-08 01:15:47 +02:00
def draw_node(self, screen, row: int, col: int):
self.table[row][col].draw(screen)
2019-06-09 12:13:31 +02:00
def get_trash_possition(self, trash: int):
trash_possition = []
for row in self.table:
for node in row:
if node.field_type == trash and node.house.empty == False:
trash_possition.append((node.row,node.col))
return trash_possition
2019-06-09 15:32:10 +02:00
2019-06-09 18:15:22 +02:00
def garbage_to_collect(self):
garbage = []
field_types = []
d = rd.randint(1,7)
day = self.table[0][0].house.get_day_of_week(d)
for index, x in enumerate(day):
if index != 0 and index != 1:
garbage.append(x)
2019-06-09 23:23:00 +02:00
print("\n Today is:", day[1], ", garbage to collect: ",end = '')
2019-06-09 18:15:22 +02:00
for x in garbage:
print(x[2],", ",end='')
field_types.append(x[0])
return field_types
2019-06-09 12:13:31 +02:00
class House:
# define some basic colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SKYBLUE = (0,191,255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
ORANGE = (255, 165, 0)
PINK = (199,21,133)
GREY = (192,192,192)
#define trash
2019-06-10 00:13:56 +02:00
trash_dict = {
"paper": (5, WHITE, "paper"),
"glass": (6, SKYBLUE, "glass"),
"metal": (7, GREY, "metal"),
"plastic": (8, ORANGE, "plastic")
}
2019-06-09 12:13:31 +02:00
#define days of the week
2019-06-10 00:13:56 +02:00
MONDAY = (1, "Monday", trash_dict["paper"], trash_dict["metal"])
TUESDAY = (2, "Tuesday", trash_dict["glass"])
WEDNESDAY=(3, "Wednesday", trash_dict["plastic"], trash_dict["metal"])
THURSDAY = (4, "Thursday", trash_dict["glass"])
FRIDAY = (5, "Friday", trash_dict["paper"], trash_dict["metal"])
SATURDAY = (6, "Saturday", trash_dict["plastic"])
SUNDAY = (7, "Sunday", trash_dict["metal"])
2019-06-09 15:32:10 +02:00
DAYS = [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
2019-06-09 12:13:31 +02:00
def __init__(self):
self.empty = True
self.trash = None
self.trash_file = None
2019-06-09 12:13:31 +02:00
2019-06-10 00:13:56 +02:00
def find_trash_file(self):
# trash_files_list = []
2019-06-10 00:13:56 +02:00
from os.path import sep # culture and os invariant separator
file_names = [(join(f"Images{sep}TestImages", f))
for f in listdir(f"Images{sep}TestImages")
if isfile(join(f"Images{sep}TestImages", f))]
# #filter names
# for f in file_names:
# if trash[2] in f:
# trash_files_list.append(f)
2019-06-10 00:13:56 +02:00
file_name = file_names[rd.randint(0,len(file_names)) - 1]
from Logic.TrashRecognition.ImageClassification import classify_file
if file_name in recognized_trash:
rt = recognized_trash[file_name]
return (file_name, rt[0], rt[1])
else:
classification = classify_file(file_dir=file_name)
recognized_trash[file_name] = (classification[1], classification[2])
return classification
# trash_files_list = []
2019-06-09 12:13:31 +02:00
2019-06-10 00:13:56 +02:00
# # filter names
# for f in trash_files:
# if trash[2] in f[1]:
# trash_files_list.append(f[0])
2019-06-10 00:13:56 +02:00
# f = rd.randint(0,len(trash_files_list))
# return trash_files_list[f-1]
2019-06-09 12:13:31 +02:00
def generate_trash(self):
self.empty = False
2019-06-10 00:13:56 +02:00
classification = self.find_trash_file()
self.trash = self.trash_dict[classification[1]]
self.trash_file = classification[0]
# num = rd.randint(1, 4)
# if num == 1:
# self.trash = self.paper
# self.trash_file = self.find_trash_file(self.trash)
# elif num == 2:
# self.trash = self.glass
# self.trash_file = self.find_trash_file(self.trash)
# elif num == 3:
# self.trash = self.metal
# self.trash_file = self.find_trash_file(self.trash)
# elif num == 4:
# self.trash = self.plastic
# self.trash_file = self.find_trash_file(self.trash)
2019-04-08 01:15:47 +02:00
2019-06-09 15:32:10 +02:00
def get_day_of_week(self, d: int):
for day in self.DAYS:
if day[0] == d:
return day
2019-04-08 01:15:47 +02:00
class Node:
# define rectangles dimensions
r_width = 20
r_height = 20
r_margin = 5
# define some basic colors
# TODO: change to Enum
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
2019-06-09 12:13:31 +02:00
SKYBLUE = (0,191,255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
2019-04-25 18:25:37 +02:00
ORANGE = (255, 165, 0)
2019-04-27 18:23:33 +02:00
PINK = (199,21,133)
2019-06-09 12:13:31 +02:00
GREY = (192,192,192)
2019-04-08 01:15:47 +02:00
def __init__(self, row: int, col: int,
2019-04-27 18:04:06 +02:00
field_type: int = 0):
2019-04-08 01:15:47 +02:00
self.row = row
self.col = col
self.field_type = field_type
2019-06-09 12:13:31 +02:00
self.house = House()
self.house.generate_trash()
2019-04-08 01:15:47 +02:00
2019-04-27 18:04:06 +02:00
2019-04-08 01:15:47 +02:00
def draw(self, screen):
color = self.get_field_color()
col = self.col
row = self.row
width = self.r_width
height = self.r_height
margin = self.r_margin
# rect -> (left, top, width, height)
# draw.rect(surface, color, rect, margin)
pg.draw.rect(screen, color,
2019-04-08 01:15:47 +02:00
((col * (width + margin)) + margin,
(row * (height + margin)) + margin,
width, height))
pg.display.flip() # refresh screen
2019-06-09 12:13:31 +02:00
def generate_trash(self):
self.house.generate_trash()
self.field_type = self.house.trash[0]
2019-04-08 01:15:47 +02:00
def change_field_type(self, field_type: int):
self.field_type = field_type
2019-04-08 01:15:47 +02:00
def get_field_color(self) -> tuple:
"""Gets the color tuple of field"""
2019-06-09 12:13:31 +02:00
#base color
2019-04-08 01:15:47 +02:00
if self.field_type == 0:
return self.GREEN
2019-06-09 12:13:31 +02:00
#truck color
2019-04-08 01:15:47 +02:00
elif self.field_type == 1:
return self.RED
2019-06-09 12:13:31 +02:00
#end point
2019-04-08 01:15:47 +02:00
elif self.field_type == 2:
return self.BLUE
2019-06-09 12:13:31 +02:00
#obstacles color
2019-04-25 18:25:37 +02:00
elif self.field_type == 3:
return self.ORANGE
2019-06-09 12:13:31 +02:00
#path color
2019-04-27 18:23:33 +02:00
elif self.field_type == 4:
return self.PINK
2019-06-09 12:13:31 +02:00
#paper
elif self.field_type == 5:
return self.WHITE
#glass
elif self.field_type == 6:
return self.SKYBLUE
#metal
elif self.field_type == 7:
return self.GREY
#plastic
elif self.field_type == 8:
return self.ORANGE