Skip to content

Commit

Permalink
Merge pull request #8 from OSLL/ente
Browse files Browse the repository at this point in the history
added new layers
  • Loading branch information
afdaniele committed Jun 5, 2023
2 parents c506f6c + 32b16fb commit 1841491
Show file tree
Hide file tree
Showing 17 changed files with 838 additions and 7 deletions.
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ rednose==1.3.0
numpy==1.19.5
networkx==2.6.3
coverage==5.0.3
codecov==2.0.16

sphinx
sphinx-rtd-theme
Expand Down
21 changes: 17 additions & 4 deletions src/dt_maps/Map.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,24 @@
from dt_maps.types.frames import Frame
from dt_maps.types.tile_maps import TileMap
from dt_maps.types.watchtowers import Watchtower
from dt_maps.types.vehicles import Vehicle
from dt_maps.types.citizens import Citizen
from dt_maps.types.traffic_signs import TrafficSign
from dt_maps.types.ground_tags import GroundTag

logging.basicConfig()

REGISTER = {
"frames": Frame,
"tiles": Tile,
"watchtowers": Watchtower,
"tile_maps": TileMap,
"citizens": Citizen,
"vehicles": Vehicle,
"traffic_signs": TrafficSign,
"ground_tags": GroundTag
}


class Map:
"""
Expand Down Expand Up @@ -145,9 +160,7 @@ def from_disk(cls, name: str, map_dir: str) -> 'Map':

# register type converters for known layers
register = lambda l, t: m.layers.get(l).register_entity_helper(t) if m.layers.has(l) else 0
register("frames", Frame)
register("tile_maps", TileMap)
register("tiles", Tile)
register("watchtowers", Watchtower)
for layer_name in REGISTER:
register(layer_name, REGISTER[layer_name])
# ---
return m
57 changes: 57 additions & 0 deletions src/dt_maps/types/citizens.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from enum import Enum
from typing import Union, Iterable, Optional, Any

from dt_maps.types.commons import EntityHelper, FieldPath
from dt_maps.types.frames import Frame

COLOR = "color"


class CitizenType(Enum):
YELLOW = "yellow"
RED = "red"
GREEN = "green"
GRAY = "grey"


class Citizen(EntityHelper):

def _get_property_values(self, name: str) -> Optional[Iterable[Any]]:
return {
COLOR: [w.value for w in CitizenType]
}[name]

def _get_property_types(self, name: str) -> Union[type, Iterable[type]]:
return {
COLOR: str
}[name]

def _get_layer_name(self) -> str:
return "citizens"

def _set_property(self, name: FieldPath, types: Union[type, Iterable[type]], value: Any):
# CitizenType -> str
if name == COLOR and isinstance(value, CitizenType):
value = value.value
# ---
super(Citizen, self)._set_property(name, types, value)

def _get_property(self, name: FieldPath) -> Any:
value = super(Citizen, self)._get_property(name)
# str -> CitizenType
if name == COLOR:
value = CitizenType(value)
# ---
return value

@property
def frame(self) -> Frame:
return Frame.create(self._map, self._key)

@property
def color(self) -> CitizenType:
return CitizenType(self._get_property(COLOR))

@color.setter
def color(self, value: Union[str, CitizenType]):
self._set_property(COLOR, str, value)
63 changes: 63 additions & 0 deletions src/dt_maps/types/ground_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from typing import Union, Iterable, Optional, Any

from dt_maps.types.commons import EntityHelper, FieldPath
from dt_maps.types.frames import Frame

SIZE = "size"
ID = "id"
FAMILY = "family"


class GroundTag(EntityHelper):

def _get_property_values(self, name: str) -> Optional[Iterable[Any]]:
return {
SIZE: None,
ID: None,
FAMILY: None
}[name]

def _get_property_types(self, name: str) -> Union[type, Iterable[type]]:
return {
SIZE: float,
ID: int,
FAMILY: str
}[name]

def _get_layer_name(self) -> str:
return "ground_tags"

def _set_property(self, name: FieldPath, types: Union[type, Iterable[type]], value: Any):
super(GroundTag, self)._set_property(name, types, value)

def _get_property(self, name: FieldPath) -> Any:
value = super(GroundTag, self)._get_property(name)
return value

@property
def frame(self) -> Frame:
return Frame.create(self._map, self._key)

@property
def size(self) -> float:
return self._get_property(SIZE)

@property
def id(self) -> int:
return self._get_property(ID)

@property
def family(self) -> str:
return self._get_property(FAMILY)

@size.setter
def size(self, value: float):
self._set_property(SIZE, float, value)

@id.setter
def id(self, value: int):
self._set_property(ID, int, value)

@family.setter
def family(self, value: str):
self._set_property(FAMILY, str, value)
20 changes: 20 additions & 0 deletions src/dt_maps/types/map.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
from dt_maps.types.tile_maps import TileMap
from dt_maps.types.tiles import Tile
from dt_maps.types.watchtowers import Watchtower
from dt_maps.types.traffic_signs import TrafficSign
from dt_maps.types.vehicles import Vehicle
from dt_maps.types.citizens import Citizen
from dt_maps.types.ground_tags import GroundTag


class MapAsset:
Expand Down Expand Up @@ -256,6 +260,22 @@ def tiles(self) -> MapLayer[Tile]:
@property
def watchtowers(self) -> MapLayer[Watchtower]:
return self.__getitem__("watchtowers")

@property
def traffic_signs(self) -> MapLayer[TrafficSign]:
return self.__getitem__("traffic_signs")

@property
def ground_tags(self) -> MapLayer[GroundTag]:
return self.__getitem__("ground_tags")

@property
def vehicles(self) -> MapLayer[Vehicle]:
return self.__getitem__("vehicles")

@property
def citizens(self) -> MapLayer[Citizen]:
return self.__getitem__("citizens")

# known layers <==

Expand Down
90 changes: 90 additions & 0 deletions src/dt_maps/types/traffic_signs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from enum import Enum
from typing import Union, Iterable, Optional, Any

from dt_maps.types.commons import EntityHelper, FieldPath
from dt_maps.types.frames import Frame

TYPE = "type"
ID = "id"
FAMILY = "family"


class TrafficSignType(Enum):
FOUR_WAY_INTERSECT = "four_way_intersect"
DO_NOT_ENTER = "do_not_enter"
DUCK_CROSSING = "duck_crossing"
LEFT_T_INTERSECT = "left_t_intersect"
NO_LEFT_TURN = "no_left_turn"
NO_RIGHT_TURN = "no_right_turn"
ONEWAY_LEFT = "oneway_left"
ONEWAY_RIGHT = "oneway_right"
PARKING = "parking"
PEDESTRIAN = "pedestrian"
RIGHT_T_INTERSECT = "right_t_intersect"
STOP = "stop"
T_INTERSECTION = "t_intersection"
T_LIGHT_AHEAD = "t_light_ahead"
YIELD = "yield"


class TrafficSign(EntityHelper):

def _get_property_values(self, name: str) -> Optional[Iterable[Any]]:
return {
TYPE: [w.value for w in TrafficSignType],
ID: None,
FAMILY: None
}[name]

def _get_property_types(self, name: str) -> Union[type, Iterable[type]]:
return {
TYPE: str,
ID: int,
FAMILY: str
}[name]

def _get_layer_name(self) -> str:
return "traffic_signs"

def _set_property(self, name: FieldPath, types: Union[type, Iterable[type]], value: Any):
# TrafficSignType -> str
if name == TYPE and isinstance(value, TrafficSignType):
value = value.value
# ---
super(TrafficSign, self)._set_property(name, types, value)

def _get_property(self, name: FieldPath) -> Any:
value = super(TrafficSign, self)._get_property(name)
# str -> TrafficSignType
if name == TYPE:
value = TrafficSignType(value)
# ---
return value

@property
def frame(self) -> Frame:
return Frame.create(self._map, self._key)

@property
def type(self) -> TrafficSignType:
return TrafficSignType(self._get_property(TYPE))

@property
def id(self) -> int:
return self._get_property(ID)

@property
def family(self) -> str:
return self._get_property(FAMILY)

@type.setter
def type(self, value: Union[str, TrafficSignType]):
self._set_property(TYPE, str, value)

@id.setter
def id(self, value: int):
self._set_property(ID, int, value)

@family.setter
def family(self, value: str):
self._set_property(FAMILY, str, value)
96 changes: 96 additions & 0 deletions src/dt_maps/types/vehicles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
from enum import Enum
from typing import Union, Iterable, Optional, Any

from dt_maps.types.commons import EntityHelper, FieldPath
from dt_maps.types.frames import Frame

CONFIGURATION = "configuration"
ID = "id"
COLOR = "color"


class ColorType(Enum):
BLUE = "blue"
RED = "red"
GREEN = "green"
GRAY = "grey"


class VehicleType(Enum):
# duckie-bot
DB18: str = "DB18"
DB19: str = "DB19"
DB20: str = "DB20"
DB21M: str = "DB21M"
DB21J: str = "DB21J"
DB21R: str = "DB21R"
# duckie-drone
DD18: str = "DD18"
DD21: str = "DD21"


class Vehicle(EntityHelper):

def _get_property_values(self, name: str) -> Optional[Iterable[Any]]:
return {
CONFIGURATION: [w.value for w in VehicleType],
ID: None,
COLOR: [w.value for w in ColorType]
}[name]

def _get_property_types(self, name: str) -> Union[type, Iterable[type]]:
return {
CONFIGURATION: str,
ID: (type(None), str),
COLOR: str
}[name]

def _get_layer_name(self) -> str:
return "vehicles"

def _set_property(self, name: FieldPath, types: Union[type, Iterable[type]], value: Any):
# VehicleType -> str or ColorType -> str
if (name == CONFIGURATION and isinstance(value, VehicleType)) or \
(name == COLOR and isinstance(value, ColorType)):
value = value.value
# ---
super(Vehicle, self)._set_property(name, types, value)

def _get_property(self, name: FieldPath) -> Any:
value = super(Vehicle, self)._get_property(name)
# str -> VehicleType
if name == CONFIGURATION:
value = VehicleType(value)
# str -> ColorType
if name == COLOR:
value = ColorType(value)
# ---
return value

@property
def frame(self) -> Frame:
return Frame.create(self._map, self._key)

@property
def configuration(self) -> VehicleType:
return VehicleType(self._get_property(CONFIGURATION))

@property
def id(self) -> Optional[str]:
return self._get_property(ID)

@property
def color(self) -> ColorType:
return ColorType(self._get_property(COLOR))

@configuration.setter
def configuration(self, value: Union[str, VehicleType]):
self._set_property(CONFIGURATION, str, value)

@id.setter
def id(self, value: Optional[str]):
self._set_property(ID, (type(None), str), value)

@color.setter
def color(self, value: Union[str, ColorType]):
self._set_property(COLOR, str, value)
2 changes: 1 addition & 1 deletion src/dt_maps/types/watchtowers.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ def configuration(self, value: Union[str, WatchtowerType]):

@id.setter
def id(self, value: Optional[str]):
self._set_property(ID, Optional[str], value)
self._set_property(ID, (type(None), str), value)
Loading

0 comments on commit 1841491

Please sign in to comment.