json export gebaut. Weitere Ausgaben wie EMO hinzugefügt

This commit is contained in:
2023-06-29 14:31:43 +02:00
parent 7b4c761656
commit 844aedc02b
3 changed files with 145 additions and 58 deletions
+88 -44
View File
@@ -1,6 +1,7 @@
import rieter_ekalk as rek import rieter_ekalk as rek
import pandas as pd import pandas as pd
import argparse import argparse
import json
import os import os
import configparser import configparser
@@ -237,6 +238,22 @@ order_eas = [
'Summe Komponenten', 'Summe Komponenten',
'Summe Komponenten inkcl. Reserve', 'Summe Komponenten inkcl. Reserve',
] ]
order_emo = [
'Schaltschrank_aufstellen',
'Unterverteiler_montieren',
'Pritsche_montieren_umbauen_demontieren',
'Pritsche_in_RSM_montieren',
'Motor_verdrahten_und_anschliessen',
'Tableau_befestigen_und_anschliessen',
'Schnittstelle_Flyer_Putzmaschine',
'Sensoren_montieren',
'Seilzugschalter_installieren',
'Blitzleuchte_installieren',
'Weiche_Stopper_anschliessen',
'Erdung',
'Summe',
'Summe inkl. Mehraufwand',
]
class cfg(): class cfg():
""" """
Liest die config-Datei ein, in der Stückpreise und Zeiteinheiten pro Bauteil wie in der rieter_ekalk Excel-Datei verwendet angegeben sind, und schreibt sie in ein Dictionary. Liest die config-Datei ein, in der Stückpreise und Zeiteinheiten pro Bauteil wie in der rieter_ekalk Excel-Datei verwendet angegeben sind, und schreibt sie in ein Dictionary.
@@ -287,8 +304,60 @@ class cfg():
res[key] = val res[key] = val
return res return res
def to_dicts(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis):
dEas = eas.getSEAs(order_eas)
dEas['Summe Komponenten'] = [eas.gesamt_E(), eas.gesamt_A()]
dEas['Summe Komponenten inkcl. Reserve'] = [eas.gesamt_E_incl_reserve(), eas.gesamt_A_incl_reserve()]
def run_calc(infile, outfile, SivasConfig): dhardware = hw.to_dict()
hoursEMO = emo.to_dict()
dDienstleistung = dl.to_dict()
dSummary = erg.summary_costs(hw)
return (dEas, dhardware, hoursEMO, dDienstleistung, dSummary)
def to_json(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis, outfile):
(dEas, hardware, hoursEMO, dienstleistung, ergebnisse) = to_dicts(eas, hw, emo, dl, erg)
dOut = {
'ergebnisse': ergebnisse,
'hardware': hardware,
'eas': dEas,
'dienstleistung': dienstleistung,
'emo': hoursEMO,
}
with open(outfile, 'w', encoding ='utf8') as json_file:
json.dump(dOut, json_file, ensure_ascii=False, indent=2)
def to_excel(eas:rek.EA, hw:rek.HW, emo:rek.EMO, dl:rek.Dienstleistung, erg:rek.Ergebnis, outfile):
(dEas, hardware, hoursEMO, dienstleistung, ergebnisse) = to_dicts(eas, hw, emo, dl, erg)
df_temp = pd.DataFrame.from_dict(data=dEas, orient='index', columns=['S.E', 'S.A'])
df_eas = pd.DataFrame(data=df_temp, index=order_eas)
df_temp = pd.DataFrame.from_dict(data=hardware, orient='index', columns=['Strück'])
df_hardware = pd.DataFrame(data=df_temp, index=order_hardware)
df_temp = pd.DataFrame.from_dict(data=hoursEMO, orient='index', columns=['Aufwand [h]'])
df_emo = pd.DataFrame(data=df_temp, index=order_emo)
df_temp = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Aufwand [h]'])
df_dienst = pd.DataFrame(data=df_temp, index=order_dienstleistungen)
df_temp = pd.DataFrame.from_dict(data=ergebnisse, orient='index', columns=['Aufwand [€]'])
df_aufwand = pd.DataFrame(data=df_temp, index=order_ergebnisse)
#df = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Dienstleistungen'])
with pd.ExcelWriter(outfile) as writer:
df_aufwand.to_excel(writer, sheet_name='Kostenaufstellung')
df_hardware.to_excel(writer, sheet_name='Hardware')
df_dienst.to_excel(writer, sheet_name='Dienstleistungen')
df_eas.to_excel(writer, sheet_name='EAs')
df_emo.to_excel(writer, sheet_name='EMO')
# TODO Mengengerüst, ev. Anschlussleistung und Ausgangsstrom
def run_calc(infile, SivasConfig):
infileCfg = cfg(infile) infileCfg = cfg(infile)
@@ -330,69 +399,37 @@ def run_calc(infile, outfile, SivasConfig):
Anzahl_EAS = infileCfg.getTypedDict("EAS") Anzahl_EAS = infileCfg.getTypedDict("EAS")
eas = rek.EA(Anzahl_EAS, mg) eas = rek.EA(Anzahl_EAS, mg)
dEas = eas.getSEAs(order_eas)
dEas['Summe Komponenten'] = [eas.gesamt_E(), eas.gesamt_A()]
dEas['Summe Komponenten inkcl. Reserve'] = [eas.gesamt_E_incl_reserve(), eas.gesamt_A_incl_reserve()]
df_temp = pd.DataFrame.from_dict(data=dEas, orient='index', columns=['S.E', 'S.A'])
df_eas = pd.DataFrame(data=df_temp, index=order_eas)
Anzahl_HW = infileCfg.getTypedDict("HW")
hwep = SivasConfig.getTypedDict("HW_Einzelpreise") hwep = SivasConfig.getTypedDict("HW_Einzelpreise")
hwhp = SivasConfig.getTypedDict("HW_Zeiten Hardwareplanung") hwhp = SivasConfig.getTypedDict("HW_Zeiten Hardwareplanung")
hwzew = SivasConfig.getTypedDict("HW_Zeiten Elektro-Werkstatt") hwzew = SivasConfig.getTypedDict("HW_Zeiten Elektro-Werkstatt")
Anzahl_HW = infileCfg.getTypedDict("HW")
hw = rek.HW(hwep, hwhp, hwzew) hw = rek.HW(hwep, hwhp, hwzew)
hw.calc(Anzahl_HW, mg, eas) hw.calc(Anzahl_HW, mg, eas)
hardware = hw.get_anzahl()
hardware["Summe_vorOrt"] = hw.summe_vorort()
hardware["Summe_gesamt"] = hw.summe_gesamt()
hardware["Summe_Landsberg"] = hw.summe_in_LL()
hardware["Zeiten_Hardwareplanung"] = hw.summe_h_zeiten_hardwareplanung()
hardware["Zeiten_Unterverteiler_Werkstatt"] = hw.summe_h_unterverteiler_e_werkstatt()
df_temp = pd.DataFrame.from_dict(data=hardware, orient='index', columns=['Strück'])
df_hardware = pd.DataFrame(data=df_temp, index=order_hardware)
emoz = SivasConfig.getTypedDict("Elektro-Montagezeiten") emoz = SivasConfig.getTypedDict("ElektSro-Montagezeiten")
emo = rek.EMO(emoz) emo = rek.EMO(emoz)
emo.calc(eas, hw, mg) emo.calc(eas, hw, mg)
Anzahl_DL = infileCfg.getTypedDict("DL") Anzahl_DL = infileCfg.getTypedDict("DL")
dl = rek.Dienstleistung(Anzahl_DL, hw) dl = rek.Dienstleistung(Anzahl_DL, hw)
dienstleistung = dl.get_hours()
dienstleistung["Summe_Dienstleistungen_Hardwareplanung"] = dl.stunden_diensleistung_hardwareplanung()
dienstleistung["Summe_Dienstleistungen_Elektrowerkstatt"] = dl.stunden_elektrowerkstatt()
dienstleistung["Summe_Dienstleistungen_in_LL"] = dl.summe_stunden_dienstleistung_in_landsberg()
df_temp = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Aufwand [h]'])
df_dienst = pd.DataFrame(data=df_temp, index=order_dienstleistungen)
Anzahl_Ergebnis = infileCfg.getTypedDict("Ergebnis") Anzahl_Ergebnis = infileCfg.getTypedDict("Ergebnis")
kph = SivasConfig.getTypedDict("Kosten pro h") kph = SivasConfig.getTypedDict("Kosten pro h")
erg = rek.Ergebnis(kph) erg = rek.Ergebnis(kph)
erg.calc(Anzahl_Ergebnis, hw, dl, emo) erg.calc(Anzahl_Ergebnis, hw, dl, emo)
ergebnisse = erg.summary_costs(hw)
df_temp = pd.DataFrame.from_dict(data=ergebnisse, orient='index', columns=['Aufwand [€]'])
df_aufwand = pd.DataFrame(data=df_temp, index=order_ergebnisse)
return (eas, hw, emo, dl, erg)
#df = pd.DataFrame.from_dict(data=dienstleistung, orient='index', columns=['Dienstleistungen'])
with pd.ExcelWriter(outfile) as writer:
df_aufwand.to_excel(writer, sheet_name='Kostenaufstellung')
df_hardware.to_excel(writer, sheet_name='Hardware')
df_dienst.to_excel(writer, sheet_name='Dienstleistungen')
df_eas.to_excel(writer, sheet_name='EAs')
# TODO Mengengerüst, EMO, ev. Anschlussleistung und Ausgangsstrom
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description='calculation of a system according to Bös', prog='ecalc') parser = argparse.ArgumentParser(description='calculation of a system according to Bös', prog='ecalc')
parser.add_argument('-i', '--infile', action='store', help='name of the input file', default="jayjay.cfg") parser.add_argument('-i', '--infile', action='store', help='name of the input file', default="jayjay.cfg")
parser.add_argument('-o', '--outfile', action='store', help='name of the output .xlsx file. If none given, name of the input file is used.') parser.add_argument('-x', '--xlsx', action='store', help='name of the output .xlsx file. If none given, name of the input file is used.')
parser.add_argument('-c', '--config', action='store', help='name of the config file inside of cfg folder to use. Default is Sivas_Daten.cfg', default="Sivas_Daten.cfg") parser.add_argument('-c', '--config', action='store', help='name of the config file inside of cfg folder to use. Default is Sivas_Daten.cfg', default="Sivas_Daten.cfg")
parser.add_argument('-j', '--json', action='store', help='name of the json file as output. If none given, name of the input file is used. ')
args = parser.parse_args() args = parser.parse_args()
sivasCfgFilePath = os.path.join(os.environ.get('ECALC_CFG'), args.config) sivasCfgFilePath = os.path.join(os.environ.get('ECALC_CFG'), args.config)
@@ -400,12 +437,19 @@ if __name__ == '__main__':
inFilePath = os.path.join(os.environ.get('ECALC_WORK'), args.infile) inFilePath = os.path.join(os.environ.get('ECALC_WORK'), args.infile)
if os.path.isfile(inFilePath): if os.path.isfile(inFilePath):
if args.outfile: (fname, ext) = os.path.splitext(args.infile)
outPath = os.path.join(os.environ.get('ECALC_WORK'), args.outfile) (eas, hw, emo, dl, erg) = run_calc(inFilePath, RieterConfig)
if args.xlsx:
xlsPath = os.path.join(os.environ.get('ECALC_WORK'), args.xlsx)
else: else:
(fname, ext) = os.path.splitext(args.infile) xlsPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.xlsx')
outPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.xlsx') to_excel(eas, hw, emo, dl, erg, xlsPath)
run_calc(inFilePath, outPath, RieterConfig) if args.json:
jsonPath = os.path.join(os.environ.get('ECALC_WORK'), args.json)
else:
jsonPath = os.path.join(os.environ.get('ECALC_WORK'), fname + '.json')
to_json(eas, hw, emo, dl, erg, jsonPath)
else: else:
print("no such file in ECALC_WORK") print("no such file in ECALC_WORK")
# os.environ.get('ECALC_BIN') # os.environ.get('ECALC_BIN')
+56 -13
View File
@@ -2233,6 +2233,14 @@ class HW():
summe_h_schaltschrank_hardware = self.summe_h_schaltschrank_hardware() summe_h_schaltschrank_hardware = self.summe_h_schaltschrank_hardware()
summe_h_unterverteiler_hardware = self.summe_h_unterverteiler_hardware() summe_h_unterverteiler_hardware = self.summe_h_unterverteiler_hardware()
return (summe_h_schaltschrank_hardware + summe_h_unterverteiler_hardware) return (summe_h_schaltschrank_hardware + summe_h_unterverteiler_hardware)
def to_dict(self):
dhardware = self.get_anzahl()
dhardware["Summe_vorOrt"] = self.summe_vorort()
dhardware["Summe_Landsberg"] = self.summe_in_LL()
dhardware["Zeiten_Hardwareplanung"] = self.summe_h_zeiten_hardwareplanung()
dhardware["Zeiten_Unterverteiler_Werkstatt"] = self.summe_h_unterverteiler_e_werkstatt()
dhardware["Summe_gesamt"] = self.summe_gesamt()
return dhardware
class Dienstleistung(): class Dienstleistung():
# Angaben in h # Angaben in h
@@ -2356,6 +2364,12 @@ class Dienstleistung():
def stunden_elektro_Landsberg(self): def stunden_elektro_Landsberg(self):
return 0 return 0
def to_dict(self):
dDienstleistung = self.get_hours()
dDienstleistung["Summe_Dienstleistungen_Hardwareplanung"] = self.stunden_diensleistung_hardwareplanung()
dDienstleistung["Summe_Dienstleistungen_Elektrowerkstatt"] = self.stunden_elektrowerkstatt()
dDienstleistung["Summe_Dienstleistungen_in_LL"] = self.summe_stunden_dienstleistung_in_landsberg()
return dDienstleistung
#EMO #EMO
class EMO(): class EMO():
@@ -2379,6 +2393,7 @@ class EMO():
def __init__(self, emoz=None): def __init__(self, emoz=None):
if emoz: if emoz:
self.set_config_data("Elektro-Montagezeiten", emoz) self.set_config_data("Elektro-Montagezeiten", emoz)
self._Mengen = {}
def calc(self, ea: type[EA], hw: type[HW], mg: type[MG]): def calc(self, ea: type[EA], hw: type[HW], mg: type[MG]):
#für jede Zeile (Eintrag im dict 'mengen') muss ein Wert übergeben werden, der aus den Klassen HW(), MG() oder EA() stammt #für jede Zeile (Eintrag im dict 'mengen') muss ein Wert übergeben werden, der aus den Klassen HW(), MG() oder EA() stammt
@@ -2436,16 +2451,16 @@ class EMO():
self._mehraufwand = PS self._mehraufwand = PS
def dauer_emo_h(self): def dauer_emo_h(self):
keys_tätigkeiten_1 = [ keys_tätigkeiten_1 = [
"Unterverteiler_montieren", "Unterverteiler_montieren",
"Sensoren_montieren", "Sensoren_montieren",
"Seilzugschalter_installieren", "Seilzugschalter_installieren",
"Blitzleuchte_installieren", "Blitzleuchte_installieren",
"Weiche_Stopper_anschliessen", "Weiche_Stopper_anschliessen",
"Erdung", "Erdung",
"Schaltschrank_aufstellen", "Schaltschrank_aufstellen",
"Motor_verdrahten_und_anschliessen", "Motor_verdrahten_und_anschliessen",
"Tableau_befestigen_und_anschliessen", "Tableau_befestigen_und_anschliessen",
"Schnittstelle_Flyer_Putzmaschine" "Schnittstelle_Flyer_Putzmaschine"
] ]
keys_1 = 0 keys_1 = 0
for k in keys_tätigkeiten_1: for k in keys_tätigkeiten_1:
@@ -2460,10 +2475,38 @@ class EMO():
for k in keys_tätigkeiten_2: for k in keys_tätigkeiten_2:
dauer = self._Mengen.get(k) / self.montagezeiten.get(k) dauer = self._Mengen.get(k) / self.montagezeiten.get(k)
keys_2 += dauer keys_2 += dauer
return math.ceil((keys_1 + keys_2)) return math.ceil((keys_1 + keys_2))
def dauer_emo_h_incl_mehrauwand(self): def dauer_emo_h_incl_mehraufwand(self):
return (self.dauer_emo_h() * (1 + self._mehraufwand)) return (self.dauer_emo_h() * (1 + self._mehraufwand))
def get_dict_of_hours(self):
res = dict()
keys_tätigkeiten_1 = [
"Unterverteiler_montieren",
"Sensoren_montieren",
"Seilzugschalter_installieren",
"Blitzleuchte_installieren",
"Weiche_Stopper_anschliessen",
"Erdung",
"Schaltschrank_aufstellen",
"Motor_verdrahten_und_anschliessen",
"Tableau_befestigen_und_anschliessen",
"Schnittstelle_Flyer_Putzmaschine"
]
for k in keys_tätigkeiten_1:
res[k] = self.montagezeiten.get(k) * self._Mengen.get(k)
keys_tätigkeiten_2 = [
"Pritsche_montieren_umbauen_demontieren",
"Pritsche_in_RSM_montieren"
]
for k in keys_tätigkeiten_2:
res[k] = self._Mengen.get(k) / self.montagezeiten.get(k)
return res
def to_dict(self):
hoursEMO = self.get_dict_of_hours()
hoursEMO['Summe'] = self.dauer_emo_h()
hoursEMO['Summe inkl. Mehraufwand'] = self.dauer_emo_h_incl_mehraufwand()
return hoursEMO
class Anschlussl(): class Anschlussl():
""" """
@@ -2631,7 +2674,7 @@ class Ergebnis():
self._anzahl["Pflichtenheft"] = anzahl_h.get("Pflichtenheft", 0) self._anzahl["Pflichtenheft"] = anzahl_h.get("Pflichtenheft", 0)
self._anzahl["SPS_Programmierung"] = anzahl_h.get("SPS_Programmierung", 0) * (1 + self._Abweichung_softwareerstellung) self._anzahl["SPS_Programmierung"] = anzahl_h.get("SPS_Programmierung", 0) * (1 + self._Abweichung_softwareerstellung)
self._anzahl["PC_Programmierung_Visualisierung"] = anzahl_h.get("SPS_Programmierung", 0) * self._Anteil_PC_Visualisierung_an_SPS self._anzahl["PC_Programmierung_Visualisierung"] = anzahl_h.get("SPS_Programmierung", 0) * self._Anteil_PC_Visualisierung_an_SPS
self._anzahl["Montage_elektrisch"] = emo.dauer_emo_h_incl_mehrauwand() self._anzahl["Montage_elektrisch"] = emo.dauer_emo_h_incl_mehraufwand()
self._anzahl["Inbetriebnahmetest_Hardware_durch_Montage"] = anzahl_h.get("Montage_elektrisch", 0) * 0.1 self._anzahl["Inbetriebnahmetest_Hardware_durch_Montage"] = anzahl_h.get("Montage_elektrisch", 0) * 0.1
self._anzahl["SPS_Inbetriebsetzung"] = anzahl_h.get("SPS_Inbetriebsetzung", 0) self._anzahl["SPS_Inbetriebsetzung"] = anzahl_h.get("SPS_Inbetriebsetzung", 0)
self._anzahl["PC_Inbetriebsetzung"] = anzahl_h.get("PC_Inbetriebsetzung", 0) self._anzahl["PC_Inbetriebsetzung"] = anzahl_h.get("PC_Inbetriebsetzung", 0)
+1 -1
View File
@@ -1191,7 +1191,7 @@ class TestObjectMethods(unittest.TestCase):
hw = rek.HW(Anzahl_HW, mg, eas) hw = rek.HW(Anzahl_HW, mg, eas)
emo = rek.EMO(eas, hw, mg) emo = rek.EMO(eas, hw, mg)
self.assertAlmostEqual(emo.dauer_emo_h(), 241) self.assertAlmostEqual(emo.dauer_emo_h(), 241)
self.assertAlmostEqual(emo.dauer_emo_h_incl_mehrauwand(), 265.1) self.assertAlmostEqual(emo.dauer_emo_h_incl_mehraufwand(), 265.1)
def test_dienstleistung(self): def test_dienstleistung(self):
Anzahl_MG = { Anzahl_MG = {