Skip to content
Snippets Groups Projects
Commit 6b30c817 authored by Hock, Martin's avatar Hock, Martin
Browse files

Removed properties from constructor. Changed parameter order. Made name...

Removed properties from constructor. Changed parameter order. Made name optional. Added functionalities to accept datasheet dict and additional properties in form of dict type arguments and key-value arguments
parent cc0fba11
No related branches found
No related tags found
No related merge requests found
...@@ -4,32 +4,23 @@ File consists of several classes for the different elements of a device. ...@@ -4,32 +4,23 @@ File consists of several classes for the different elements of a device.
from __future__ import annotations from __future__ import annotations
from enum import Enum, auto from enum import Enum, auto
import uuid import uuid
from typing import List, Dict from typing import List, Dict, Optional
import json import json
# TODO # TODO
# - Docstrings # - Docstrings
# - Beschreibung von Teilen (-> properties) -> Raus aus dem Konstruktor rein in ein dict. (Deep-Copy) # - Beschreibung von Teilen (-> properties) -> Raus aus dem Konstruktor rein in ein dict. (Deep-Copy)
# - Erstmal als Shallow Copy umgesetzt, wir verwenden momentan keine nested dicts
# - Minimalbeispiel für KPIs -> halb umgesetzt -> mit get_components veranschaulichen # - Minimalbeispiel für KPIs -> halb umgesetzt -> mit get_components veranschaulichen
# - Erlaube Clone bei Assembly (jedes child muss durch durch Klon ersetzt werden) # - Erlaube Clone bei Assembly (jedes child muss durch durch Klon ersetzt werden)
# - Änderungen an Beispiel umsetzen # - Änderungen an Beispiel umsetzen
# -> Integriere AggregationLayer und die Funktionen in die Klassen (evtl. per Vererbung?) -> Nä Semester
# - Erlaube Listen bei add_component und add_assembly (-> Nä Semester) # - Erlaube Listen bei add_component und add_assembly (-> Nä Semester)
# - Gute String Darstellung -> Ist so schon ok bisher? -> Nä Semester # - Gute String Darstellung -> Ist so schon ok bisher? -> Nä Semester
# - Export als GraphViz -> Nä Semeseter # - Export als GraphViz -> Nä Semeseter
class ComponentCategory(Enum):
BATTERY = auto()
MOTOR = auto()
FRAME = auto()
WHEEL = auto()
AXLE = auto()
GEAR = auto()
class AggregationLayer(Enum): class AggregationLayer(Enum):
SYSTEM = auto() SYSTEM = auto()
ASSEMBLY = auto() ASSEMBLY = auto()
...@@ -38,38 +29,31 @@ class AggregationLayer(Enum): ...@@ -38,38 +29,31 @@ class AggregationLayer(Enum):
class LegoComponent: class LegoComponent:
def __init__( def __init__(self, name: Optional[str] = None, datasheet: Optional[dict] = None, *more_properties: dict, **kwargs) -> None:
self,
name: str,
category: ComponentCategory,
lego_id: str,
cost: float,
mass: float,
delivery_time: int,
layer: AggregationLayer = AggregationLayer.COMPONENT,
**properties,
) -> None:
self.uuid: uuid.UUID = uuid.uuid4() self.uuid: uuid.UUID = uuid.uuid4()
self.parent: None | LegoAssembly = None self.parent: None | LegoAssembly = None
self.name: str = name self.layer: AggregationLayer = AggregationLayer.COMPONENT
self.category: ComponentCategory = category self.properties: dict = {}
self.lego_id: str = lego_id if name is not None:
self.cost: float = cost self.properties['name'] = name
self.mass: float = mass if datasheet is not None:
self.delivery_time: int = delivery_time self.properties.update(datasheet)
self.layer: AggregationLayer = layer self.properties[]
self.properties: dict = properties for prop in more_properties:
if isinstance(prop, dict):
self.properties.update(prop)
else:
raise ValueError(f"Unexpected argument type: {type(more_properties)}")
for key, value in kwargs.items():
self.properties[key] = value
def clone(self) -> LegoComponent: def clone(self) -> LegoComponent:
clone = LegoComponent( clone = LegoComponent(
self.name, None,
self.category, self.properties,
self.lego_id,
self.cost,
self.mass,
self.delivery_time,
self.layer,
**self.properties,
) )
return clone return clone
...@@ -112,16 +96,18 @@ class LegoComponent: ...@@ -112,16 +96,18 @@ class LegoComponent:
# TODO good repr representation # TODO good repr representation
def __repr__(self): def __repr__(self):
return f"LegoComponent {self.name} [{self.uuid}]" return f"LegoComponent {self.properties['name']} [{self.uuid}]"
class LegoAssembly: class LegoAssembly:
def __init__(self, name: str, layer: AggregationLayer, **properties) -> None: def __init__(self, layer: AggregationLayer, name: Optional[str] = None, *properties: dict , **kwargs) -> None:
self.uuid: uuid.UUID = uuid.uuid4() self.uuid: uuid.UUID = uuid.uuid4()
self.parent: None | LegoAssembly = None self.parent: None | LegoAssembly = None
self.name: str = name self.properties: dict = {}
if name is not None:
self.properties['name'] = name
self.layer: AggregationLayer = layer self.layer: AggregationLayer = layer
self.properties: dict = properties self.properties.update(properties)
self.components: List[LegoComponent] = [] self.components: List[LegoComponent] = []
self.assemblies: List[LegoAssembly] = [] self.assemblies: List[LegoAssembly] = []
...@@ -199,7 +185,7 @@ class LegoAssembly: ...@@ -199,7 +185,7 @@ class LegoAssembly:
# TODO find good string representation # TODO find good string representation
def __repr__(self): def __repr__(self):
return f"LegoAssembly {self.name} [{self.uuid}]" return f"LegoAssembly {self.properties['name']} [{self.uuid}]"
def print_assembly_tree(root, level=0, is_last=False): def print_assembly_tree(root, level=0, is_last=False):
...@@ -222,11 +208,11 @@ def print_assembly_tree(root, level=0, is_last=False): ...@@ -222,11 +208,11 @@ def print_assembly_tree(root, level=0, is_last=False):
component_padding += "├── " if i < len(root.components) - 1 else "└── " component_padding += "├── " if i < len(root.components) - 1 else "└── "
print(f"{component_padding}{item}") print(f"{component_padding}{item}")
## TODO maybe add Components entry from dict?
class KPIEncoder(json.JSONEncoder): class KPIEncoder(json.JSONEncoder):
def default(self, o): def default(self, o):
if isinstance(o, uuid.UUID): if isinstance(o, uuid.UUID):
return "kpi-" + str(o) return "kpi-" + str(o)
if isinstance(o, (ComponentCategory, AggregationLayer)): if isinstance(o, (AggregationLayer)):
return "kpi-" + o.name return "kpi-" + o.name
return super().default(o) return super().default(o)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment