From f7c3c39f513966074d42a4f8ab202accf460daf3 Mon Sep 17 00:00:00 2001 From: Paul Wolok Date: Mon, 8 Dec 2025 09:40:20 +0100 Subject: [PATCH] antriebskurve refactored --- lib/plant2dxf.py | 194 ++++++++++++++++++++++++----------------------- 1 file changed, 98 insertions(+), 96 deletions(-) diff --git a/lib/plant2dxf.py b/lib/plant2dxf.py index e481114..360966c 100644 --- a/lib/plant2dxf.py +++ b/lib/plant2dxf.py @@ -48,6 +48,52 @@ class Bt_element(BaseModel): drehung = drehung ) + +class Angetriebene_Kurve(BaseModel): + teileid: str + x: float + y:float + drehung: float = Field(default=0.0,description="Rotation der Kurve") + hoehe0: float = Field(default=0.0,description="Hoehe Anfang der Kurve") + hoehe1: float = Field(default=0.0,description="Hoehe Ende der Kurve") + kurvenrichtung: str = Field(description="Kurvenrichtung der Kurve") + antriebNebenStrecke: str =Field(description="wo die Angetriebene Strecke ist abhängig von der kurvenrichtung") + winkel: int = Field(description="Der Winkel der Kurve") + + @property + def antrieb(self): + if self.antriebNebenStrecke == "Aussen": + self.antriebNebenStrecke = "außen" + elif self.antriebNebenStrecke == "Innen": + self.antriebNebenStrecke = "innen" + return self.antriebNebenStrecke + @property + def hight_zwischen(self): + return ((self.hoehe0 + self.hoehe1) /2) + @classmethod + def from_merkmale(cls, teileid: str, x: float, y: float, merkmale: dict) -> 'Angetriebene_Kurve': + hoehe0 = float(merkmale.get("Höhe Anfang")) * 1000 + hoehe1 = float(merkmale.get("Höhe Ende")) * 1000 + winkel = int(merkmale.get("Kurvenwinkel")) + kurvenrichtung = merkmale.get("Kurvenrichtung") + antriebNebenstrecke = merkmale.get("AntriebNebenStrecke") + try: + drehung = float(merkmale.get("Drehung")) + except Exception as e: + drehung = 0.0 + + return cls( + teileid = teileid, + x = x, + y = y, + drehung = drehung, + hoehe0 = hoehe0, + hoehe1 = hoehe1, + kurvenrichtung = kurvenrichtung, + antriebNebenStrecke = antriebNebenstrecke, + winkel = winkel + + ) # --------------------------------------------------------- CFG-Leser für shapes.cfg def get_shape_cfg(teileart, cfg_path, logger=None): parser = configparser.ConfigParser() @@ -299,47 +345,7 @@ def handle_ils_2_0_gefaellestrecke(msp, teileid, merkmale, x, y, doc, lib_doc, v richtung2 ="DEFAULT" unterschiedlich = False - separatoren = gefaelle_objekt.anzahl_separatoren - scanner = gefaelle_objekt.anzahl_scanner - if rotation == 0 or rotation == -180: - ausrichtung = "V" - else: - ausrichtung = "H" - if ausrichtung == "V": - einsatz_fest = [x + 300, y,hoehe_gefaehlle] - modular = 2 - else: - einsatz_fest = [x,y - 150,hoehe_gefaehlle] - modular = 3 - block_scanner = "SCAN" - block_separatoren = "S-LP" - import_block(block_scanner,lib_doc,doc) - import_block(block_separatoren,lib_doc,doc) - layer_scan, color_scan = get_insert_color_layer(lib_doc, block_scanner) - layer_separatioren, color_separatioren = get_insert_color_layer(lib_doc, block_separatoren) - einsatz_zwischen =[ einsatz_fest[0],einsatz_fest[1],einsatz_fest[2]] - anzahl =0 - while anzahl < separatoren: - anzahl = anzahl + 1 - msp.add_blockref(block_separatoren,einsatz_zwischen, dxfattribs={"layer": layer_separatioren,"color": color_separatioren}) - if anzahl % modular == 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - else: - einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 - - if anzahl % modular != 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - anzahl =0 - while anzahl < scanner: - anzahl = anzahl + 1 - msp.add_blockref(block_scanner,einsatz_zwischen,dxfattribs={"layer": layer_scan,"color": color_scan}) - if anzahl % modular == 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - else: - einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 + anzahl_seperatoren_oder_scan(msp, x, y, doc, lib_doc, gefaelle_objekt, hoehe_gefaehlle, rotation) for nachbarn in strecken_nachbarn: if teileid == nachbarn.get("Id"): gefaellestrecke_nachbarn = nachbarn @@ -671,6 +677,49 @@ def handle_ils_2_0_gefaellestrecke(msp, teileid, merkmale, x, y, doc, lib_doc, v block.add_entity(line) msp.add_blockref(blockname,(x,y,hoehe_gefaehlle),dxfattribs={"rotation": rotation,"layer": gefaelle_layer}) +def anzahl_seperatoren_oder_scan(msp, x, y, doc, lib_doc, klassen_objekt, hoehe, rotation): + separatoren = klassen_objekt.anzahl_separatoren + scanner = klassen_objekt.anzahl_scanner + if rotation == 0 or rotation == -180: + ausrichtung = "V" + else: + ausrichtung = "H" + if ausrichtung == "V": + einsatz_fest = [x + 300, y,hoehe] + modular = 2 + else: + einsatz_fest = [x,y - 150,hoehe] + modular = 3 + block_scanner = "SCAN" + block_separatoren = "S-LP" + import_block(block_scanner,lib_doc,doc) + import_block(block_separatoren,lib_doc,doc) + layer_scan, color_scan = get_insert_color_layer(lib_doc, block_scanner) + layer_separatioren, color_separatioren = get_insert_color_layer(lib_doc, block_separatoren) + einsatz_zwischen =[ einsatz_fest[0],einsatz_fest[1],einsatz_fest[2]] + anzahl =0 + while anzahl < separatoren: + anzahl = anzahl + 1 + msp.add_blockref(block_separatoren,einsatz_zwischen, dxfattribs={"layer": layer_separatioren,"color": color_separatioren}) + if anzahl % modular == 0: + einsatz_fest[1] = einsatz_fest[1] - 150 + einsatz_zwischen = einsatz_fest.copy() + else: + einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 + + if anzahl % modular != 0: + einsatz_fest[1] = einsatz_fest[1] - 150 + einsatz_zwischen = einsatz_fest.copy() + anzahl =0 + while anzahl < scanner: + anzahl = anzahl + 1 + msp.add_blockref(block_scanner,einsatz_zwischen,dxfattribs={"layer": layer_scan,"color": color_scan}) + if anzahl % modular == 0: + einsatz_fest[1] = einsatz_fest[1] - 150 + einsatz_zwischen = einsatz_fest.copy() + else: + einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 + def add_attributes_to_block(block, attributes): @@ -721,47 +770,7 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve upper_hoehe_vario= foerderer.h1 lower_hoehe_vario = foerderer.h0 hoehe_vario= foerderer.hight_zwischen - separatoren = foerderer.anzahl_separatoren - scanner = foerderer.anzahl_scanner - if rotation == 0.0 or rotation == -180.0: - ausrichtung = "V" - else: - ausrichtung = "H" - if ausrichtung == "V": - einsatz_fest = [x + 300,y,hoehe_vario] - modular = 2 - else: - einsatz_fest = [x,y - 150,hoehe_vario] - modular = 3 - block_scanner = "SCAN" - block_separatoren = "S-LP" - import_block(block_scanner,lib_doc,doc) - import_block(block_separatoren,lib_doc,doc) - einsatz_zwischen =[ einsatz_fest[0],einsatz_fest[1],einsatz_fest[2]] - anzahl =0 - while anzahl < separatoren: - anzahl = anzahl + 1 - msp.add_blockref(block_separatoren,einsatz_zwischen) - if anzahl % modular == 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - else: - einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 - - - - if anzahl % modular != 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - anzahl =0 - while anzahl < scanner: - anzahl = anzahl + 1 - msp.add_blockref(block_scanner,einsatz_zwischen) - if anzahl % modular == 0: - einsatz_fest[1] = einsatz_fest[1] - 150 - einsatz_zwischen = einsatz_fest.copy() - else: - einsatz_zwischen[0] = einsatz_zwischen[0]+ 300 + anzahl_seperatoren_oder_scan(msp, x, y, doc, lib_doc, foerderer, hoehe_vario, rotation) # Umstellung der Höhen falls nötig für die Konsistenz der spätere Erstellung, ist nur notwendig für ab Vario Förderer if upper_hoehe_vario< lower_hoehe_vario: hight = upper_hoehe_vario @@ -1274,20 +1283,13 @@ def handle_ils_2_0_variofoerderer(msp, teileid, merkmale, x, y, doc, lib_doc, ve msp.add_blockref(blockname,(x,y,hoehe_vario),dxfattribs={"rotation": rotation}) def handle_ils_2_0_kurve_angetrieben(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols, strecken_nachbarn,config,config_allgemein): - kurvenrichtung = merkmale.get("Kurvenrichtung") - kurvenwinkel = int(merkmale.get("Kurvenwinkel")) - h0 = float(merkmale.get("Höhe Anfang"))* 1000 - h1 = float(merkmale.get("Höhe Ende")) * 1000 - h_zwischen = (h0 +h1)/2 - antriebNebenStrecke = merkmale.get("AntriebNebenStrecke") - if antriebNebenStrecke == "Aussen": - antriebstecke = "außen" - else: - antriebstecke = "innen" - - - rotation = float(merkmale.get("Drehung")) - blockname = (f"Vario_Kurve_{kurvenrichtung}_{kurvenwinkel}°_TEF_{antriebstecke}") + voerder_kurve = Angetriebene_Kurve.from_merkmale(teileid,x,y,merkmale) + kurvenwinkel = voerder_kurve.winkel + h_zwischen = voerder_kurve.hight_zwischen + antriebNebenStrecke = voerder_kurve.antrieb + kurvenrichtung = voerder_kurve.kurvenrichtung + rotation = voerder_kurve.drehung + blockname = (f"Vario_Kurve_{kurvenrichtung}_{kurvenwinkel}°_TEF_{antriebNebenStrecke}") import_block(blockname,lib_doc,doc) msp.add_blockref(blockname,(x,y,h_zwischen),dxfattribs={"rotation": rotation})