From 6b30c817b2354c3b252ea7643bbceda844f9145b Mon Sep 17 00:00:00 2001 From: "Hock, Martin" <martin.hock@fst.tu-darmstadt.de> Date: Wed, 1 Mar 2023 19:01:53 +0100 Subject: [PATCH] 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 --- functions/classes.py | 78 ++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/functions/classes.py b/functions/classes.py index 845ec8d..45081d5 100644 --- a/functions/classes.py +++ b/functions/classes.py @@ -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) -- GitLab