From f8d82c3e6d91fef61db6156c19115f5f0ee3ccb6 Mon Sep 17 00:00:00 2001 From: Simon Schmutzler Date: Wed, 23 Mar 2022 14:19:12 +0100 Subject: [PATCH] =?UTF-8?q?Klasse=20'Mengenger=C3=BCst'=20fertiggestellt,?= =?UTF-8?q?=20Ausgabe=20in=20zwei=20json=20Files:=20Zusammenfassung=20und?= =?UTF-8?q?=20detailliert=20mit=20allen=20Werten=20aller=20Klassen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + rieter_ekalk.py | 562 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 532 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 55be276..8e43369 100644 --- a/.gitignore +++ b/.gitignore @@ -152,3 +152,7 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# rieter ekalk json outputs +json_mengengeruest.json +zusammenfassung_mengengeruest.json diff --git a/rieter_ekalk.py b/rieter_ekalk.py index e962658..cfdc8a6 100644 --- a/rieter_ekalk.py +++ b/rieter_ekalk.py @@ -1,13 +1,14 @@ #from distutils.log import debug import math +import sys #from pickle import FALSE import unittest - - +import json +JSON_IDENT =5 # Press Umschalt+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. class MG(): - def __init__(self, deckblatt:dict, rsm_direct:dict, rsm_fa:dict, flyer_f40:dict, neuenhauser:dict, flyer:dict, puffer:dict, turm:dict): + def __init__(self, deckblatt:dict, rsm_direct:dict, rsm_fa:dict, flyer_f40:dict, neuenhauser:dict, flyer:dict, verbindungsstrecken_w:dict, puffer:dict, turm:dict): mengen = { #"SYSTEM":"", #"RSM":0, @@ -28,6 +29,12 @@ class MG(): #"Turm":0, #"Turm_Anzahl_Wendlungen":0, } + # wenn Flyer Electrojet 1, dann sollten Vor- und Nachpuffer größer 1 sein + # wenn Neuenhauser 1, dann sollten Vor- und Nachpuffer größer 1 sein + # wenn Cason 1, dann sollten Vor- und Nachpuffer größer 1 sein + # wenn Puffer, dann mindestens 2 Strecken + # Bypass, wenn mindestens 2 Flyer oder 2 RSM + # Turm: kein Kriterium self._RSM_Anzahl = deckblatt.get("RSM", 0) rsm_direct_mengen = rsm_direct rsm_direct_mengen["Anzahl"] = self._RSM_Anzahl #übernahme aus deckblatt @@ -51,17 +58,186 @@ class MG(): turm_mengen = turm turm_mengen["Turm"] = deckblatt.get("Turm", 0) turm_mengen["Anzahl_Wendlungen"] = deckblatt.get("Turm_Anzahl_Wendlungen", 0) - print(turm_mengen["Anzahl_Wendlungen"]) + verbindungsstrecken_w_mengen = verbindungsstrecken_w - self._rsm_direct = RSM_direct(rsm_direct_mengen) - self._rsm_fa = RSM_FA(rsm_fa_mengen) + #überprüfe welche Art von System, setze dict der unrelevanten klasse = 0 + system = deckblatt.get("SYSTEM", "") + self._rsm_direct = RSM_direct({}) + self._rsm_fa = RSM_FA({}) + if(system.lower() == "direct"): + self._rsm_direct = RSM_direct(rsm_direct_mengen) + elif(system.lower() == "fa"): + self._rsm_fa = RSM_FA(rsm_fa_mengen) + self._flyer_f40 = Flyer_F40_EJet_inc_Putz(flyer_f40_mengen) self._neuenhauser = Putzmaschine_Neuenhauser(neuenhauser_mengen) self._flyer = Flyer_EJet(flyer_mengen) + self._verbindungsstrecken_w = Verbindungsstrecken_Wechsel(verbindungsstrecken_w_mengen) self._puffer = Puffer(puffer_mengen) self._turm = Turm(turm_mengen) + + def getresult(self): + res = { + "RSM direct": self._rsm_direct._Mengen, + "RSM FA": self._rsm_fa._Mengen, + "Flyer F40 (Electrojet) incl. Putzmaschine": self._flyer_f40._Mengen, + "Putzmaschine (Neuenhauser)": self._neuenhauser._Mengen, + "Flyer (Electrojet)": self._flyer._Mengen, + "Verbindungsstrecken/Wechsel": self._verbindungsstrecken_w._Mengen, + "Puffer": self._puffer._Mengen, + "Turm": self._turm._Mengen, + } + return res + + def tojson(self, input:dict): + return json.dumps(input, sort_keys=False, indent=4) + + def tofile(self): + json = self.tojson(self.getresult()) + with open("json_mengengeruest.json", "w") as file: + file.write(json) + + def ztofile(self): + json = self.tojson(self.zusammenfassung()) + with open("zusammenfassung_mengengeruest.json", "w") as file: + file.write(json) + + def zusammenfassung(self): + #in Excel Zellwerte und Bezüge der Spalte "G" können ignoriert werden + zmengen = { + "Sensor_optisch_Traverse": 0, + "Sensor_induktiv_Spulenalter_(Zug_positionierung)": 0, + "Sensor_Spulenprüfung_voll/leer": 0, + "Seilzugsschalter": 0, + "Drucktaster_automatische_Umfahrung": 0, + "Bedientableau_1-fach": 0, + "Bedientableau_2-fach": 0, + "Bedientableau_14-fach": 0, + "Interface_Putzmaschine": 0, + "Interface_Doffer": 0, + "Weiche": 0, + "Dreifachweiche": 0, + "Wechsel": 0, + "Stopper": 0, + "Meldelampe_Überstrom": 0, + "Hauptschalter_Ein-Meldung": 0, + "Werma_Rundumleuchte_Störung": 0, + "Weiche_nach_PM_(bipolar)": 0, + "Kreuzungsweiche": 0, + "RA_uni": 0, + "RA_uni_abhebbar": 0, + "RA_uni_ohne_SPS-Ansteuerung": 0, + "RA_bi": 0, + "RA_bi_ohne_SPS-Ansteuerung": 0, + "RA_bi_abhebbar": 0, + "Doppelstreckenantrieb": 0, + "gemeinsame_Wendung": 0, + "Gesamtanzahl_Antriebe": 0, + } + zmengen["Sensor_optisch_Traverse"] = self._rsm_direct._Mengen.get("Sensor_optisch_Traverse", 0) +\ + self._rsm_fa._Mengen.get("Sensor_optisch_Traverse", 0) +\ + self._flyer_f40._Mengen.get("Sensor_optisch_Traverse", 0) +\ + self._neuenhauser._Mengen.get("Sensor_optisch_Traverse", 0) +\ + self._flyer._Mengen.get("Sensor_optisch_Traverse", 0) +\ + self._verbindungsstrecken_w._Mengen.get("Sensor_optisch_Traverse",0) +\ + self._verbindungsstrecken_w._Mengen.get("Dreifachweiche",0) * 2 +\ + self._verbindungsstrecken_w._Mengen.get("Kreuzungsweiche",0) * 4 +\ + self._puffer._Mengen.get("Sensor_optisch_Traverse",0) +\ + self._turm._Mengen.get("Sensor_optisch_Traverse",0) + + + zmengen["Sensor_induktiv_Spulenalter_(Zug_positionierung)"] = self._flyer_f40._Mengen.get("Sensor_induktiv_Spulenhalter",0) +\ + self._neuenhauser._Mengen.get("Sensorik_Zugpositionierung",0) + + zmengen["Sensor_Spulenprüfung_voll/leer"] = self._neuenhauser._Mengen.get("Sensor_WT18_Spulenprüfung_voll/leer",0) + zmengen["Seilzugsschalter"] = self._rsm_fa._Mengen.get("Seilzugsschalter", 0) + zmengen["Drucktaster_automatische_Umfahrung"] = self._rsm_fa._Mengen.get("Mit_Drucktaster", 0) + zmengen["Bedientableau_1-fach"] = self._rsm_fa._Mengen.get("Bedientableau_1-fach", 0) + self._verbindungsstrecken_w._Mengen.get("Bedientableau_1-fach", 0) + zmengen["Bedientableau_2-fach"] = self._rsm_direct._Mengen.get("Bedientableau_2-fach", 0) +\ + self._rsm_fa._Mengen.get("Bedientableau_2-fach", 0) +\ + self._flyer_f40._Mengen.get("Bedientableau_2-fach", 0) +\ + self._neuenhauser._Mengen.get("Bedientableau_2-fach", 0) +\ + self._flyer._Mengen.get("Bedientableau_2-fach", 0) +\ + self._verbindungsstrecken_w._Mengen.get("Bedientableau_2-fach", 0) +\ + self._turm._Mengen.get("Bedientableau_2-fach", 0) + zmengen["Bedientableau_14-fach"] = self._verbindungsstrecken_w._Mengen.get("Bedientableau_14-fach", 0) + zmengen["Interface_Putzmaschine"] = self._neuenhauser._Mengen.get("Interface_Putzmaschine", 0) + zmengen["Interface_Doffer"] = self._flyer_f40._Mengen.get("Interface_Doffer", 0) + self._flyer._Mengen.get("Interface_Doffer", 0) + zmengen["Weiche"] = self._rsm_direct._Mengen.get("Weiche", 0) +\ + self._rsm_fa._Mengen.get("Weiche", 0) +\ + self._flyer_f40._Mengen.get("Weiche", 0) +\ + self._neuenhauser._Mengen.get("Weiche", 0) +\ + self._flyer._Mengen.get("Weiche", 0) +\ + self._verbindungsstrecken_w._Mengen.get("Weiche", 0) +\ + self._puffer._Mengen.get("Weiche", 0) +\ + self._turm._Mengen.get("Weiche", 0) + zmengen["Dreifachweiche"] = self._rsm_direct._Mengen.get("Weiche_Gemeinsame_Rückstellung", 0) +\ + self._flyer_f40._Mengen.get("Dreifachweiche", 0) +\ + self._flyer._Mengen.get("Dreifachweiche", 0) #TODO: ist "Weiche_Gemeinsame_Rückstellung" == "Dreifachweiche"? + zmengen["Wechsel"] = self._flyer_f40._Mengen.get("Wechsel", 0) +\ + self._flyer._Mengen.get("Wechsel", 0) + zmengen["Stopper"] = self._flyer_f40._Mengen.get("Stopper", 0) + zmengen["Meldelampe_Überstrom"] = self._rsm_direct._Mengen.get("Meldelampe_Überstrom", 0) +\ + self._rsm_fa._Mengen.get("Meldelampe_Überstrom", 0) +\ + self._flyer_f40._Mengen.get("Meldelampe_Überstrom", 0) +\ + self._neuenhauser._Mengen.get("Meldelampe_Überstrom", 0) +\ + self._flyer._Mengen.get("Meldelampe_Überstrom", 0) +\ + self._puffer._Mengen.get("Meldelampe_Überstrom", 0) + zmengen["Hauptschalter_Ein-Meldung"] = self._rsm_direct._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ + self._rsm_fa._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ + self._flyer_f40._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ + self._neuenhauser._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ + self._flyer._Mengen.get("Hauptschalter_Ein-Meldung", 0) +\ + self._puffer._Mengen.get("Hauptschalter_Ein-Meldung", 0) + zmengen["Werma_Rundumleuchte_Störung"] = self._rsm_direct._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ + self._rsm_fa._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ + self._flyer_f40._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ + self._neuenhauser._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ + self._flyer._Mengen.get("Werma_Rundumleuchte_Störung", 0) +\ + self._verbindungsstrecken_w._Mengen.get("Werma_Rundumleuchte_Störung", 0) + zmengen["Weiche_nach_PM_(bipolar)"] = self._flyer_f40._Mengen.get("Weiche_nach_PM_(bipolar)", 0) +\ + self._neuenhauser._Mengen.get("Weiche_nach_PM_(bipolar)", 0) + zmengen["Kreuzungsweiche"] = self._verbindungsstrecken_w._Mengen.get("Kreuzungsweiche", 0) + zmengen["RA_uni"] = self._verbindungsstrecken_w._Mengen.get("RA_uni", 0) +\ + self._flyer_f40._Mengen.get("RA_uni", 0) + zmengen["RA_uni_abhebbar"] = self._flyer_f40._Mengen.get("RA_uni_abhebbar", 0) +\ + self._neuenhauser._Mengen.get("RA_uni_abhebbar", 0) + zmengen["RA_uni_ohne_SPS-Ansteuerung"] = self._flyer_f40._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ + self._neuenhauser._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ + self._verbindungsstrecken_w._Mengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) + zmengen["RA_bi"] = self._rsm_fa._Mengen.get("RRA_bi", 0) +\ + self._flyer_f40._Mengen.get("RA_bi", 0) +\ + self._flyer._Mengen.get("RA_bi", 0) +\ + self._verbindungsstrecken_w._Mengen.get("RA_bi", 0) +\ + self._puffer._Mengen.get("RA_bi", 0) +\ + self._turm._Mengen.get("RA_bi", 0) + zmengen["RA_bi_ohne_SPS-Ansteuerung"] = self._rsm_fa._Mengen.get("RRA_bi_ohne_SPS-Ansteuerung", 0) +\ + self._flyer_f40._Mengen.get("RRA_bi_ohne_SPS-Ansteuerung", 0) +\ + self._flyer._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ + self._verbindungsstrecken_w._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ + self._turm._Mengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) #TODO: Notation beachten: RA_bi, RRA_bi + zmengen["RA_bi_abhebbar"] = self._rsm_direct._Mengen.get("RA_bi_abhebbar", 0) +\ + self._flyer_f40._Mengen.get("RRA_BI_abhebbar", 0) +\ + self._flyer._Mengen.get("RA_bi_abhebbar", 0) #TODO: Notation beachten: RA_bi, RRA_bi + zmengen["Doppelstreckenantrieb"] = self._rsm_direct._Mengen.get("Doppelstreckenantrieb", 0) +\ + self._flyer_f40._Mengen.get("Doppelstreckenantrieb", 0) +\ + self._neuenhauser._Mengen.get("Doppelstreckenantrieb", 0) +\ + self._flyer._Mengen.get("Doppelstreckenantrieb", 0) +\ + self._verbindungsstrecken_w._Mengen.get("Doppelstreckenantrieb", 0) +\ + self._puffer._Mengen.get("Doppelstreckenantrieb", 0) + zmengen["gemeinsame_Wendung"] = self._rsm_direct._Mengen.get("gemeinsame_Wendung", 0) +\ + self._rsm_fa._Mengen.get("gemeinsame_Wendung", 0) + zmengen["Gesamtanzahl_Antriebe"] = zmengen.get("RA_uni", 0) +\ + zmengen.get("RA_uni_abhebbar", 0) +\ + zmengen.get("RA_uni_ohne_SPS-Ansteuerung", 0) +\ + zmengen.get("RA_bi", 0) +\ + zmengen.get("RA_bi_ohne_SPS-Ansteuerung", 0) +\ + zmengen.get("RA_bi_abhebbar", 0) +\ + zmengen.get("Doppelstreckenantrieb", 0) + return zmengen + # RSM_direct: class RSM_direct(): def __init__(self, anzahl:dict): @@ -117,6 +293,11 @@ class RSM_direct(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen # RSM_FA: class RSM_FA(): def __init__(self, anzahl:dict): @@ -129,7 +310,6 @@ class RSM_FA(): "RSM-Einfahrt_Ein-/Beidseitig":False, #"Sensor_optisch_Traverse":0, "Sensor_optisch_Traverse_zusätzlich":0, - "Sensor_optisch_Traverse_Korrektur":0, #"Bedientableau_1-fach":0, "Bedientableau_1-fach_Korrektur":0, #"Bedientableau_2-fach":0, @@ -143,7 +323,6 @@ class RSM_FA(): "gemeinsame_Wendung":0, #"Seilzugschalter":0, #"Mit_Drucktaster":0, - "Mit_Drucktaster_Korrektur":0, #"Meldelampe_Überstrom":0, "Meldelampe_Überstrom_Korrektur":0, #"Hauptschalter_Ein-Meldung":0, @@ -164,9 +343,9 @@ class RSM_FA(): sensorfaktor_premium = 4 if(anzahl.get("RSM-Einfahrt_Ein-/Beidseitig", False)): sensorfaktor_beidseitig = 1 - self._Mengen["Sensor_optisch_Traverse"] = self._RSM_Anzahl*(sensorfaktor_premium + sensorfaktor_beidseitig) + anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) + anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) # TODO Korrekturfaktor hier auch anwenden, da in Excel Zelle (C30) nicht grau, wird aber addiert? + self._Mengen["Sensor_optisch_Traverse"] = self._RSM_Anzahl*(sensorfaktor_premium + sensorfaktor_beidseitig) + anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) self._Mengen["Sensor_optisch_Traverse_zusätzlich"] = anzahl.get("Sensor_optisch_Traverse_zusätzlich", 0) - self._Mengen["Sensor_optisch_Traverse_Korrektur"] = anzahl.get("Sensor_optisch_Traverse_Korrektur", 0) #TODO: hier auch Korrektur anwenden? Zelle nicht ausgegraut + #hier keine Korrektur, dafür "Zusätzlich" vorgesehen tableaufaktor_premium = 1 tableaufaktor_beidseitig = 0 @@ -214,9 +393,9 @@ class RSM_FA(): self._Mengen["Seilzugschalter"] = self._RSM_Anzahl * (seilzfaktor_premium + seilzfaktor_getriebe_mitte) if(anzahl.get("Flex-A_Premium", False)): - self._Mengen["Mit_Drucktaster"] = self._RSM_Anzahl * 8 + anzahl.get("Mit_Drucktaster_Korrektur",0)# TODO + C40 in excel, allerdings gelbe Zelle ohne Bezüge, Korrektur? + self._Mengen["Mit_Drucktaster"] = self._RSM_Anzahl * 8 else: - self._Mengen["Mit_Drucktaster"] = anzahl.get("Mit_Drucktaster_Korrektur",0) # + C40 (s.o.) + self._Mengen["Mit_Drucktaster"] = 0 self._Mengen["Mit_Drucktaster_Korrektur"] = anzahl.get("Mit_Drucktaster_Korrektur",0) self._Mengen["Meldelampe_Überstrom"] = math.ceil(self._RSM_Anzahl/10) + anzahl.get("Meldelampe_Überstrom_Korrektur", 0) self._Mengen["Meldelampe_Überstrom_Korrektur"] = anzahl.get("Meldelampe_Überstrom_Korrektur", 0) @@ -227,7 +406,12 @@ class RSM_FA(): def anzahl(self, partname): return self._Mengen.get(partname, 0) - + + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen # Flyer_F40_(Electrojet)_incl._Putzmaschine: class Flyer_F40_EJet_inc_Putz(): def __init__(self, anzahl:dict): @@ -290,10 +474,6 @@ class Flyer_F40_EJet_inc_Putz(): self._Mengen["Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer"] = anzahl.get("Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer", 0) self._Mengen["Single-Line_/_Durchfahrt"] = anzahl.get("Single-Line_/_Durchfahrt", False) self._Mengen["Nachpuffer"] = anzahl.get("Nachpuffer", False) - print(self._Mengen.get("Anzahl_Schienen", 0)) - #SensoroptTraverse=WENN(B49="ja";B46*(B47*1)+(B46*5)+C50+(B56*2);B46*(B47*1)+(B46*7)+(B56*2))+C50 TODO: Achtung, hier wird C50 zweimal addiert, wenn Nachpuffer==True - # nachpuffer == True: B46*(B47*1)+(B56*2)+(B46*5)+C50 - #else: B46*(B47*1)+(B56*2)+(B46*7)) +C50 sensorfaktor_nachpuffer = 7 if(anzahl.get("Nachpuffer", False)): sensorfaktor_nachpuffer = 5 @@ -315,7 +495,7 @@ class Flyer_F40_EJet_inc_Putz(): self._Mengen["Weiche_nach_Flyer_(bipolar)_Korrektur"] = anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) self._Mengen["Dreifachweiche"] = anzahl.get("Dreifachweiche", 0) self._Mengen["Wechsel"] = anzahl.get("Wechsel", 0) - self._Mengen["Stopper"] = anzahl.get("Stopper", 0) # TODO: Korrekturfaktor überflüssig da manuelle Eingabe? + self._Mengen["Stopper"] = anzahl.get("Stopper", 0) self._Mengen["RA_uni"] = anzahl.get("RA_uni", 0) rraunifaktor_durchfahrt = 0 @@ -328,18 +508,18 @@ class Flyer_F40_EJet_inc_Putz(): self._Mengen["RA_uni_abhebbar_Korrektur"] = anzahl.get("RA_uni_abhebbar_Korrektur", 0) if(anzahl.get("Single-Line_/_Durchfahrt", False)): - self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl # TODO: Korrekturfaktor nur wenn Durchfahrt==False? + self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl else: self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = anzahl.get("RA_uni_ohne_SPS-Ansteuerung_Korrektur", 0) self._Mengen["RA_uni_ohne_SPS-Ansteuerung_Korrektur"] = anzahl.get("RA_uni_ohne_SPS-Ansteuerung_Korrektur", 0) - if(anzahl.get("Single-Line_/_Durchfahrt", False)): # TODO: =WENN($B$48="nein";$B$46*1;0+C62)+WENN($B$48="ja";$B$46*1;0) -> etwas kompliziert ausgedrückt... - self._Mengen["RRA_BI_abhebbar"] = self._Flyer_Anzahl + anzahl.get("RRA_BI_abhebbar_Korrektur", 0) - else: + if(anzahl.get("Single-Line_/_Durchfahrt", False)): self._Mengen["RRA_BI_abhebbar"] = self._Flyer_Anzahl + else: + self._Mengen["RRA_BI_abhebbar"] = anzahl.get("RRA_BI_abhebbar_Korrektur", 0) self._Mengen["RRA_BI_abhebbar_Korrektur"] = anzahl.get("RRA_BI_abhebbar_Korrektur", 0) - self._Mengen["RRA_bi"] = anzahl.get("RRA_bi", 0) # TODO: Rote Zelle? + self._Mengen["RRA_bi"] = anzahl.get("RRA_bi", 0) if(anzahl.get("Single-Line_/_Durchfahrt", False)): self._Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = anzahl.get("RRA_bi_ohne_SPS-Ansteuerung_Korrektur", 0) @@ -347,9 +527,9 @@ class Flyer_F40_EJet_inc_Putz(): self._Mengen["RRA_bi_ohne_SPS-Ansteuerung"] = self._Flyer_Anzahl if(anzahl.get("Single-Line_/_Durchfahrt", False)): - self._Mengen["Doppelstreckenantrieb"] = (self._Flyer_Anzahl * self._Mengen.get("Anzahl_Schienen", 0))/4 + self._Flyer_Anzahl + self._Mengen["Doppelstreckenantrieb"] = self._Flyer_Anzahl * math.floor(self._Mengen.get("Anzahl_Schienen", 0)/2) + self._Flyer_Anzahl else: - self._Mengen["Doppelstreckenantrieb"] = (self._Flyer_Anzahl * self._Mengen.get("Anzahl_Schienen", 0))/4 + anzahl.get("Doppelstreckenantrieb_Korrektur", 0) + self._Mengen["Doppelstreckenantrieb"] = self._Flyer_Anzahl * math.floor(self._Mengen.get("Anzahl_Schienen", 0)/2) + anzahl.get("Doppelstreckenantrieb_Korrektur", 0) self._Mengen["Doppelstreckenantrieb_Korrektur"] = anzahl.get("Doppelstreckenantrieb_Korrektur", 0) self._Mengen["RA_bi_abhebbar_(unger._Schiene)"] = anzahl.get("RA_bi_abhebbar_(unger._Schiene)", 0) @@ -363,6 +543,11 @@ class Flyer_F40_EJet_inc_Putz(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen # Putzmaschine_(Neuenhauser): class Putzmaschine_Neuenhauser(): def __init__(self, anzahl:dict): @@ -415,13 +600,13 @@ class Putzmaschine_Neuenhauser(): self._Mengen["Sensorik_Zugpositionierung"] = self._Putze_Anzahl * 4 self._Mengen["Sensor_WT18_Spulenprüfung_voll/leer"] = self._Putze_Anzahl * 2 - self._Mengen["Bedientableau_2-fach"] = self._Putze_Anzahl + anzahl.get("Bedientableau_2-fach_Korrektur", 0)#=Mengengerüst!B72+Mengengerüst!G72 TODO: ist G72 Korrektur? + self._Mengen["Bedientableau_2-fach"] = self._Putze_Anzahl + anzahl.get("Bedientableau_2-fach_Korrektur", 0) self._Mengen["Bedientableau_2-fach_Korrektur"] = anzahl.get("Bedientableau_2-fach_Korrektur", 0) self._Mengen["Interface_Putzmaschine"] = self._Putze_Anzahl self._Mengen["Weiche"] = self._Putze_Anzahl * self._Vorpuffer_Anzahl + anzahl.get("Weiche_Korrektur", 0) self._Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) - self._Mengen["Weiche_nach_PM_(bipolar)"] = self._Putze_Anzahl * (self._Nachpuffer_Anzahl-1) # TODO: Wert kann negativ sein... + self._Mengen["Weiche_nach_PM_(bipolar)"] = self._Putze_Anzahl * (self._Nachpuffer_Anzahl-1) self._Mengen["RA_uni_abhebbar"] = self._Putze_Anzahl + anzahl.get("RA_uni_abhebbar_Korrektur", 0) self._Mengen["RA_uni_abhebbar_Korrektur"] = anzahl.get("RA_uni_abhebbar_Korrektur", 0) self._Mengen["RA_uni_ohne_SPS-Ansteuerung"] = self._Putze_Anzahl @@ -438,6 +623,11 @@ class Putzmaschine_Neuenhauser(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + def mengengeruest(self): + return self._Mengen + # Flyer_(Electrojet): class Flyer_EJet(): def __init__(self, anzahl:dict): @@ -454,7 +644,6 @@ class Flyer_EJet(): #"Weiche":0, "Weiche_Korrektur":0, #"Weiche_nach_Flyer_(bipolar)":0, - "Weiche_nach_Flyer_(bipolar)_Korrektur":0, "Dreifachweiche":0, #"Wechsel":0, "Wechsel_Korrektur":0, @@ -486,8 +675,7 @@ class Flyer_EJet(): self._Mengen["Interface_Doffer"] = self._Flyer_Anzahl self._Mengen["Weiche"] = self._Flyer_Anzahl * self._Schienen_Anzahl + anzahl.get("Weiche_Korrektur", 0) self._Mengen["Weiche_Korrektur"] = anzahl.get("Weiche_Korrektur", 0) - self._Mengen["Weiche_nach_Flyer_(bipolar)"] = self._Flyer_Anzahl # + anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) TODO: Kein Korrekturfaktor? - #self._Mengen["Weiche_nach_Flyer_(bipolar)_Korrektur"] = anzahl.get("Weiche_nach_Flyer_(bipolar)_Korrektur", 0) + self._Mengen["Weiche_nach_Flyer_(bipolar)"] = self._Flyer_Anzahl self._Mengen["Dreifachweiche"] = anzahl.get("Dreifachweiche", 0) self._Mengen["Wechsel"] = self._Flyer_Anzahl + anzahl.get("Wechsel_Korrektur", 0) self._Mengen["Wechsel_Korrektur"] = anzahl.get("Wechsel_Korrektur", 0) @@ -507,6 +695,10 @@ class Flyer_EJet(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + def mengengeruest(self): + return self._Mengen # Verbindungsstrecken/_Wechsel: class Verbindungsstrecken_Wechsel(): def __init__(self, anzahl:dict): @@ -541,6 +733,11 @@ class Verbindungsstrecken_Wechsel(): self._Mengen["RA_bi_ohne_SPS-Ansteuerung"] = anzahl.get("RA_bi_ohne_SPS-Ansteuerung", 0) self._Mengen["Doppelstreckenantrieb"] = anzahl.get("Doppelstreckenantrieb", 0) + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen # Puffer class Puffer(): def __init__(self, anzahl:dict): @@ -582,6 +779,11 @@ class Puffer(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen # Turm class Turm(): mengen = { @@ -605,7 +807,7 @@ class Turm(): self._Staustrecken_Anzahl = anzahl.get("Anzahl_Wendlungen", 0) self._Mengen["Anzahl_Staustrecken"] = self._Staustrecken_Anzahl - self._Mengen["Sensor_optisch_Traverse"] = self._Turm_Anzahl*5 #TODO: kein Korrekturfaktor? + self._Mengen["Sensor_optisch_Traverse"] = self._Turm_Anzahl*5 self._Mengen["Weiche"] = self._Turm_Anzahl*3 self._Mengen["RA_bi"] = self._Turm_Anzahl*2 + anzahl.get("RA_bi_Korrektur", 0) self._Mengen["RA_bi_Korrektur"] = anzahl.get("RA_bi_Korrektur", 0) @@ -616,8 +818,47 @@ class Turm(): def anzahl(self, partname): return self._Mengen.get(partname, 0) + def tojson(self): + return json.dumps(self._Mengen) + + def mengengeruest(self): + return self._Mengen +#EMO +class EMO(): + montagezeiten = { + "Schaltschrank_aufstellen": 6.0, #(h/St) + "Unterverteiler_montieren": 3.0, #(h/St) + "Pritsche_montieren_umbauen_demontieren": 6.0, #(m/h) + "Pritsche_in_RSM_montieren": 21.0, + "Motor_verdrahten_und_anschliessen": 0.9, #(h/Motor) + "Tableau_befestigen_und_anschliessen": 1.0, #(h/St) + "Schnittstelle_Flyer_Putzmaschine": 1.5, #(h/St) + "Sensoren_montieren": 0.45, #(h/St) + "Seilzugschalter_installieren": 4.0, #(h/St) + "Blitzleuchte_installieren": 0.5, #(h/St) + "Weiche_Stopper_anschliessen": 0.45, #(h/St) + "Erdung": 0.5, #(h) + } + def __init__(self, anzahl:dict): + #für jede Zeile (Eintrag im dict 'mengen') muss ein Wert übergeben werden, der aus den Klassen HW(), MG() oder EA() stammt + mengen = { + "Schaltschrank_aufstellen": 0, + "Unterverteiler_montieren": 0, + "Pritsche_montieren_umbauen_demontieren": 0, + "Pritsche_in_RSM_montieren": 0, + "Motor_verdrahten_und_anschliessen": 0, + "Tableau_befestigen_und_anschliessen": 0, + "Schnittstelle_Flyer_Putzmaschine": 0, + "Sensoren_montieren": 0, + "Seilzugschalter_installieren": 0, + "Blitzleuchte_installieren": 0, + "Weiche_Stopper_anschliessen": 0, + "Erdung": 0, + } + self._Mengen = {} #TODO: Formeln... + print(self._Mengen) class EA(): @@ -1592,7 +1833,7 @@ class TestObjectMethods(unittest.TestCase): self.assertEqual(deckblatt._flyer_f40.anzahl("Anzahl"), 6) self.assertEqual(deckblatt._flyer_f40.anzahl("Anzahl_Schienen"), 5) - #self.assertEqual(deckblatt._flyer_f40.anzahl("Sensor_optisch_Traverse"), 80) # TODO: Wenn Nachpuffer == True, dann wird Sensor_optisch_Traverse_Korrektur doppelt addiert + #self.assertEqual(deckblatt._flyer_f40.anzahl("Sensor_optisch_Traverse"), 80) # TODO: Wenn Nachpuffer == True, dann wird Sensor_optisch_Traverse_Korrektur doppelt addiert => =WENN(B49="ja";B46*(B47*1)+(B46*5)+(B56*2);B46*(B47*1)+(B46*7)+(B56*2))+C50 self.assertEqual(deckblatt._flyer_f40.anzahl("Sensor_induktiv_Spulenhalter"), 14) self.assertEqual(deckblatt._flyer_f40.anzahl("Bedientableau_2-fach"), 9) self.assertEqual(deckblatt._flyer_f40.anzahl("Interface_Doffer"), 8) @@ -1663,7 +1904,12 @@ class TestObjectMethods(unittest.TestCase): self.assertEqual(deckblatt._turm.anzahl("RA_bi_ohne_SPS"), 26) self.assertEqual(deckblatt._turm.anzahl("Bedientableau_2-fach"), 4) ''' - + self.assertEqual(deckblatt._turm.anzahl("Anzahl"), 2) + self.assertEqual(deckblatt._turm.anzahl("Anzahl_Staustrecken"), 5) + self.assertEqual(deckblatt._turm.anzahl("Weiche"), 6) + self.assertEqual(deckblatt._turm.anzahl("RA_bi"), 9) + self.assertEqual(deckblatt._turm.anzahl("RA_bi_ohne_SPS"), 26) + self.assertEqual(deckblatt._turm.anzahl("Bedientableau_2-fach"), 4) @@ -1975,5 +2221,253 @@ class TestObjectMethods(unittest.TestCase): # } # eas +#if __name__ == '__main__': +# unittest.main() + if __name__ == '__main__': - unittest.main() \ No newline at end of file + # Anzahl der für das Projekt benutzten + Anzahl_MG = { + "SYSTEM":"DIRECT", + "RSM":11, + "Flyer":0, + "Flyer_Puffer":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine":1, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, + "Neuenhauser-Putzmaschine":0, + "Neuenhauser-Putzmaschine_Vorpuffer":0, + "Neuenhauser-Putzmaschine_Nachpuffer":0, + "Cason-Putzmaschine":0, + "Cason-Putzmaschine_Vorpuffer":0, + "Cason-Putzmaschine_Nachpuffer":0, + "Puffer":1, + "Anzahl_der_Pufferstrecken_pro_Puffer":2, + "Begegnungsstrecke_Bypass":0, + "Turm":0, + "Turm_Anzahl_Wendlungen":0, + } + + rsm_direct_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, # wird in deckblatt-Klasse berechnet + #"Anzahl_Strecken/RSM":8, + "Sensor_optisch_Traverse":0, + #"Lichtschranke_Traverse":0, + #"Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + #"Bedientableau_2-fach_Direct":0, + #"Weiche":0, + "Weiche_Korrektur":0, + #"Weiche_Gemeinsame_Rückstellung":0, + "Weiche_Gemeinsame_Rückstellung_Korrektur":0, + #"RA_bi_abhebbar":0, + "RA_bi_abhebbar_Korrektur":0, + #"Doppelstreckenantrieb":0, + #"gemeinsame_Wendung":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + #"Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + rsm_fa_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl_RSM":0, + #"Automatische_Umfahrung":0, # 'Automatische_Umfahrung' und 'Flex-A_Premium' sind eine Zelle -> identischer Wert + "Flex-A_Premium":False, + "Getriebe_in_der_Mitte":False, + "RSM-Einfahrt_Ein-/Beidseitig":False, + #"Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_zusätzlich":0, + #"Bedientableau_1-fach":0, + "Bedientableau_1-fach_Korrektur":0, + #"Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + #"Weiche":0, + "Weiche_Korrektur":0, + #"RRA_bi":0, + "RRA_bi_Korrektur":0, + "RRA_bi_auf_Haupstrecke":0, + #"RRA_bi_ohne_SPS-Ansteuerung":0, + "gemeinsame_Wendung":0, + #"Seilzugschalter":0, + #"Mit_Drucktaster":0, + "Mit_Drucktaster_Korrektur":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + #"Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + flyer_f40_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, + #"Flyer_Electrojet_incl_intergrierte_Putzmaschine":0, #wird in deckblatt-Klasse berechnet + "Flyer_Electrojet_incl_intergrierte_Putzmaschine_Korrektur":0, + #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Vorpuffer":2, #wird in deckblatt-Klasse berechnet + #"Flyer_Electrojet_incl_intergrierte_Putzmaschine_Nachpuffer":2, #wird in deckblatt-Klasse berechnet + #"Anzahl_Schienen":0, + "Single-Line_/_Durchfahrt":False, + "Nachpuffer":False, + #"Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + #"Sensor_induktiv_Spulenhalter":0, + "Sensor_induktiv_Spulenhalter_Korrektur":0, + #"Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + #"Interface_Doffer":0, + "Interface_Doffer_Korrektur":0, + #"Weiche":0, + "Weiche_Korrektur":0, + #"Weiche_nach_Flyer_(bipolar)":0, + "Weiche_nach_Flyer_(bipolar)_Korrektur":0, + "Dreifachweiche":0, + "Wechsel":0, + "Stopper":0, + "RA_uni":0, + #"RA_uni_abhebbar":0, + "RA_uni_abhebbar_Korrektur":0, + #"RA_uni_ohne_SPS-Ansteuerung":0, + "RA_uni_ohne_SPS-Ansteuerung_Korrektur":0, + #"RRA_BI_abhebbar":0, + "RRA_BI_abhebbar_Korrektur":0, + "RRA_bi":0, + #"RRA_bi_Korrektur":0, + #"RRA_bi_ohne_SPS-Ansteuerung":0, + "RRA_bi_ohne_SPS-Ansteuerung_Korrektur":0, + #"Doppelstreckenantrieb":0, + "Doppelstreckenantrieb_Korrektur":0, + "RA_bi_abhebbar_(unger._Schiene)":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + #"Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + neuenhauser_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, + #"Neuenhauser-Putzmaschine":0, #wird in deckblatt-Klasse zugewiesen + #"Neuenhauser-Putzmaschine_Vorpuffer":0, #wird in deckblatt-Klasse zugewiesen + #"Neuenhauser-Putzmaschine_Nachpuffer":0, #wird in deckblatt-Klasse zugewiesen + #"Anzahl_Vorstaustrecken":0, + #"Anzahl_Nachstaustrecken":0, + #"Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + #"Sensorik_Zugpositionierung":0, + #"Sensor_WT18_Spulenprüfung_voll/leer":0, + #"Bedientableau_2-fach":0, + "Bedientableau_2-fach_Korrektur":0, + #"Interface_Putzmaschine":0, + #"Weiche":0, + "Weiche_Korrektur":0, + #"Weiche_nach_PM_(bipolar)":0, + #"RA_uni_abhebbar":0, + "RA_uni_abhebbar_Korrektur":0, + #"RA_uni_ohne_SPS-Ansteuerung":0, + #"RA_uni_abhebbar_(unger._Sch.)":0, + #"Doppelstreckenantrieb":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + #"Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + flyer_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, + #"Flyer":0, # äquivalent zu 'Anzahl' + #"Anzahl_Schienen:":0, + #"Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + #"Sensor_induktiv_Spulenalter_(Zug_positionierung)":0, + #"Bedientableau_2-fach":0, + #"Interface_Doffer":0, + #"Weiche":0, + "Weiche_Korrektur":0, + #"Weiche_nach_Flyer_(bipolar)":0, + "Dreifachweiche":0, + #"Wechsel":0, + "Wechsel_Korrektur":0, + #"RA_bi_ohne_SPS-Ansteuerung":0, + #"RA_bi_abhebbar":0, + "RA_bi_abhebbar_Korrektur":0, + "RA_bi":0, + #"Doppelstreckenantrieb":0, + "RA_bi_abhebbar_(unger._Schiene)":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + #"Werma_Rundumleuchte_Störung":0, + "Werma_Rundumleuchte_Störung_Korrektur":0, + } + verbindungsstrecken_w_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + "Sensor_optisch_Traverse":0, + "Bedientableau_1-fach":0, + "Bedientableau_2-fach":0, + "Bedientableau_14-fach":0, + "Weiche":0, + "Dreifachweiche":0, + "Kreuzungsweiche":0, + "Werma_Rundumleuchte_Störung":0, + "RA_uni":0, + "RA_uni_ohne_SPS-Ansteuerung":0, + "RA_bi":0, + "RA_bi_ohne_SPS-Ansteuerung":0, + "Doppelstreckenantrieb":0 + } + puffer_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, + #"Puffer":0, #äquivalent zu Anzahl + #"Anzahl_Pufferstrecken":0, #äquivalent zu Anzahl_Staustrecken + #"Anzahl_Staustrecken":0, + #"Sensor_optisch_Traverse":0, + "Sensor_optisch_Traverse_Korrektur":0, + #"Weiche":0, + "Weiche_Korrektur":0, + "RA_bi_(ungerade_Schiene)":0, + #"Doppelstreckenantrieb":0, + #"Meldelampe_Überstrom":0, + "Meldelampe_Überstrom_Korrektur":0, + #"Hauptschalter_Ein-Meldung":0, + "Hauptschalter_Ein-Meldung_Korrektur":0, + } + turm_eingabe = { + #auskommentiert => kein Übergabeparameter, wird in Klasse berechnet + #"Anzahl":0, + #"Turm":0, #äquivalent zu Anzahl + #"Anzahl_Wendlungen":0, #äquivalent zu Anzahl_Staustrecken + #"Anzahl_Staustrecken":0, + #"Sensor_optisch_Traverse":0, + #"Weiche":0, + #"RA_bi":0, + "RA_bi_Korrektur":0, + #"RA_bi_ohne_SPS":0, + "RA_bi_ohne_SPS_Korrektur":0, + #"Bedientableau_2-fach":0, + } + #mg = MG(Anzahl_MG, rsm_direct_eingabe, rsm_fa_eingabe, flyer_f40_eingabe, neuenhauser_eingabe, flyer_eingabe, verbindungsstrecken_w_eingabe, puffer_eingabe, turm_eingabe) + #mg.tofile() + #mg.ztofile() + emo_eingabe = { + "Schaltschrank_aufstellen": 1, + "Unterverteiler_montieren": 4, + "Pritsche_montieren_umbauen_demontieren": 66, + "Pritsche_in_RSM_montieren": 0, + "Motor_verdrahten_und_anschliessen": 97, + "Tableau_befestigen_und_anschliessen": 15, + "Schnittstelle_Flyer_Putzmaschine": 1, + "Sensoren_montieren": 84, + "Seilzugschalter_installieren": 0, + "Blitzleuchte_installieren": 3, + "Weiche_Stopper_anschliessen": 244, + "Erdung": 40, + } + emo = EMO(emo_eingabe)