-
Notifications
You must be signed in to change notification settings - Fork 1
/
xvc_util.py
134 lines (102 loc) · 3.48 KB
/
xvc_util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from abc import abstractmethod, ABCMeta
from typing import List
class Point(object):
"""
Simple class to store x and y coordinates.
"""
def __init__(self, x: int, y: int) -> None:
"""
Initialize an object of class Point.
:param x: Value of x coordinate.
:param y: Value of y coordinate.
"""
self.x = x
self.y = y
def get_list(self) -> List[int]:
"""
Returns a list with essential data.
:return: List with essential data.
"""
return [self.x, self.y]
def __str__(self) -> str:
return '({}, {})'.format(self.x, self.y)
class XVCListable(metaclass=ABCMeta):
"""
Abstract class to provide function to generate compatible list for zone cleaning.
"""
@abstractmethod
def get_list(self) -> List[int]:
"""
Returns a list with essential data.
:return: List with essential data.
"""
raise NotImplementedError()
class Rectangle(XVCListable, metaclass=ABCMeta):
"""
Abstract class to store coordinates of an rectangle.
"""
def __init__(self, bottom_left: Point, top_right: Point, name: str = None) -> None:
"""
Initialize an object of class Rectangle.
:param bottom_left: Bottom left point.
:param top_right: Top right point.
:param name: Name of rectangle, default is None.
"""
self.bottom_left = bottom_left
self.top_right = top_right
self.name = name
def get_list(self) -> List[int]:
"""
Returns a list with essential data.
:return: List with essential data.
"""
return self.bottom_left.get_list() + self.top_right.get_list()
def __str__(self) -> str:
string_builder = '{}: {{'.format(self.__class__.__name__)
if self.name is not None:
string_builder += '{}: '.format(self.name)
string_builder += '[{}, {}]}}'.format(self.bottom_left, self.top_right)
return string_builder
class Door(Rectangle):
"""
Class to represent a door for zone cleaning.
"""
def __init__(self, bottom_left: Point, top_right: Point, name: str) -> None:
"""
Initialize an object of class Door.
:param bottom_left: Bottom left point.
:param top_right: Top right point.
:param name: Name of rectangle.
"""
super().__init__(bottom_left, top_right, name)
def get_list(self) -> List[int]:
"""
Returns a list with essential data.
:return: List with essential data.
"""
return self.bottom_left.get_list() + self.top_right.get_list() + [1]
class Room(Rectangle):
"""
Class to represent a room for zone cleaning.
"""
def __init__(self, bottom_left: Point, top_right: Point, name: str, number: int = 1) -> None:
"""
Initialize an object of class Rectangle.
:param bottom_left: Bottom left point.
:param top_right: Top right point.
:param name: Name of rectangle.
:param number: Number of cleaning cycles.
"""
super().__init__(bottom_left, top_right, name)
self.number = number
def get_list(self) -> List[int]:
"""
Returns a list with essential data.
:return: List with essential data.
"""
return self.bottom_left.get_list() + self.top_right.get_list() + [self.number]
class Area(Room):
"""
Class to represent a area for zone cleaning.
"""
pass