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.
from __future__ import annotations
from enum import Enum, auto
import uuid
from typing import List, Dict
from typing import List, Dict, Optional
import json
# TODO
# - Docstrings
# - 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
# - Erlaube Clone bei Assembly (jedes child muss durch durch Klon ersetzt werden)
# - Ä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)
# - Gute String Darstellung -> Ist so schon ok bisher? -> Nä Semester
# - Export als GraphViz -> Nä Semeseter
class ComponentCategory(Enum):
BATTERY = auto()
MOTOR = auto()
FRAME = auto()
WHEEL = auto()
AXLE = auto()
GEAR = auto()
class AggregationLayer(Enum):
SYSTEM = auto()
ASSEMBLY = auto()
......@@ -38,38 +29,31 @@ class AggregationLayer(Enum):
class LegoComponent:
def __init__(
self,
name: str,
category: ComponentCategory,
lego_id: str,
cost: float,
mass: float,
delivery_time: int,
layer: AggregationLayer = AggregationLayer.COMPONENT,
**properties,
) -> None:
def __init__(self, name: Optional[str] = None, datasheet: Optional[dict] = None, *more_properties: dict, **kwargs) -> None:
self.uuid: uuid.UUID = uuid.uuid4()
self.parent: None | LegoAssembly = None
self.name: str = name
self.category: ComponentCategory = category
self.lego_id: str = lego_id
self.cost: float = cost
self.mass: float = mass
self.delivery_time: int = delivery_time
self.layer: AggregationLayer = layer
self.properties: dict = properties
self.layer: AggregationLayer = AggregationLayer.COMPONENT
self.properties: dict = {}
if name is not None:
self.properties['name'] = name
if datasheet is not None:
self.properties.update(datasheet)
self.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:
clone = LegoComponent(
self.name,
self.category,
self.lego_id,
self.cost,
self.mass,
self.delivery_time,
self.layer,
**self.properties,
None,
self.properties,
)
return clone
......@@ -112,16 +96,18 @@ class LegoComponent:
# TODO good repr representation
def __repr__(self):
return f"LegoComponent {self.name} [{self.uuid}]"
return f"LegoComponent {self.properties['name']} [{self.uuid}]"
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.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.properties: dict = properties
self.properties.update(properties)
self.components: List[LegoComponent] = []
self.assemblies: List[LegoAssembly] = []
......@@ -199,7 +185,7 @@ class LegoAssembly:
# TODO find good string representation
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):
......@@ -222,11 +208,11 @@ def print_assembly_tree(root, level=0, is_last=False):
component_padding += "├── " if i < len(root.components) - 1 else "└── "
print(f"{component_padding}{item}")
## TODO maybe add Components entry from dict?
class KPIEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, uuid.UUID):
return "kpi-" + str(o)
if isinstance(o, (ComponentCategory, AggregationLayer)):
if isinstance(o, (AggregationLayer)):
return "kpi-" + o.name
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