From bd4b8d297eec0a8769f613f3745773011550c79b Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 7 Feb 2024 10:41:23 +0100 Subject: [PATCH] =?UTF-8?q?gui=20Aufruf=20mit=20einem=20Assembly=20holt=20?= =?UTF-8?q?sich=20alle=20n=C3=B6tigen=20Infos=20von=20den=20DAtenbanken.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 11 +++ bin/cremig_setenv.bat | 2 +- lib/caditem.py | 68 +++++++++++++--- lib/controller.py | 177 ++++++++++++++++++++++-------------------- lib/get_teilestamm.py | 3 + lib/gui.py | 3 + 6 files changed, 170 insertions(+), 94 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index f2bac7f..a900aee 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -60,5 +60,16 @@ "-d" ], } + { + "name": "Python: Build Real Gui", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": true, + "args": [ + "-s 400102196" + ], + } ] } diff --git a/bin/cremig_setenv.bat b/bin/cremig_setenv.bat index 28bf8ed..592ccdb 100644 --- a/bin/cremig_setenv.bat +++ b/bin/cremig_setenv.bat @@ -29,7 +29,7 @@ set BLACKLIST_DATABASE_NAME=ERP_BOM.ini set VBA_MACRO_NAME=vba_format_excel.xlsm set SIVAS_DATABASE_QUERY=Y:\jit\programme\Sivas2json.exe set SIVAS_TEILESTAMM=\\195.243.223.3\sivas\jit\programme\KSbExcelExportSivasTeilestamm.exe -set SIVAS_EXCEL_EXPORT_DIR=%CREMIG_WORK% +set SIVAS_EXCEL_EXPORT_DIR=%CREMIG_DATA% rem Um den Python-Interpreter auf U:\ zu nutzen, Kommentar (rem) in nachfolgender Zeile entfernen rem set NETWORK_INTERPRETER_PATH=\\ssg.local\freigaben\Allgemein\Programmierumgebung\Python312 diff --git a/lib/caditem.py b/lib/caditem.py index 8ea38f4..3dde553 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -44,6 +44,7 @@ class CadItem(): "halbzeugoberflaeche_neu", "halbzeugfarbe_neu", "lebenszyklus_status_neu", + "model3d_neu", "bezeichnung1_sivas", "bezeichnung1_neu", "bezeichnung2_sivas", "bezeichnung2_neu", "halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", @@ -102,6 +103,38 @@ class CadItem(): "cb_zurücksetzen", ] + # dies sind die Excel Headel der SIVAS csv Export Datei + # und wie diese in das Datenmodell der Gui integriert werden kann + excel_to_gui = { + "Teilenummer":"teilenummer", + "Bezeichnung1":"bezeichnung1_sivas", + "Bezeichnung2":"bezeichnung2_sivas", + "Beschaffungsart":"beschaffungsart_sivas", + "Mengeneinheit":"mengeneinheit_sivas", + "Halbzeug":"halbzeug_sivas", + "TOS_Gruppe":"tosgruppe_sivas", + "Dispogruppe":"dispolaufgruppe_sivas", + "Dispolaufgruppe":"dispolaufgruppe_sivas", + "ErsatzFuer":"ersatzfuer_neu", + "ErsetztDurch":"ersetztdurch_neu", + "AktuellerIndex":"aenderungsindex_sivas", + "Hersteller":"hersteller_sivas", + "HerstellerTeilenummer":"herstteilenr_sivas", + "Version":"version_sivas", + "HalbzeugExtern":"halbzeug_sivas", + "Werkstoff":"werkstofftyp_sivas", + "Oberfläche":"cb_oberflaeche_neu", + # "Truemmer":"truemmer", + # "HzOhneSaegeliste":"", + "Ruestcode":"ruestcode_sivas", + "Fertigungsart":"fertigungsart_sivas", + "FosGruppe":"fosGruppe_sivas", + "Kalkulationsart":"kalkulationsart_sivas", + #"Indexerfasser":"", + "Aenderungstext":"aenderungstext_sivas", + "Freigabevermerk":"freigabevermerk_sivas", + # "Indexbearbeiter":"in" + } def __init__(self): """ is initalized with its unique id""" @@ -190,20 +223,29 @@ class CadItem(): def get_all_gui_data(self): return self.gui_data + def csv2guidata(self, data): + translated_data = dict() + for k,v in data.items(): + if k in self.excel_to_gui and v is not None: + translated_data[self.excel_to_gui[k]] = v + + # Spezial: Befüllung von Änderungstext mit dem Author, falls in der .csv vorhanden + if "Indexerfasser" in data and "Aenderungstext" in data: + translated_data["aenderungstext_sivas"] = '{aenderungstext} (von {author})'.format(aenderungstext=data["Aenderungstext"], author=data["Indexerfasser"]) + # Indexerfasser wird nicht in der gui verwaltet. Deshalb Modifikation aus den Rohdaten + self.set_gui_dict(translated_data) + return translated_data + + def sivas_data_from_csv(self, cid): path = os.path.join(self.controller.get_env("data"), cid + '.csv') if os.path.exists(path): - data = self.load_csv(path) - return data - return None - def sivas_data_from_json(self, cid): - path = os.path.join(self.controller.get_env("out"), cid + '.json') - if os.path.exists(path): - data = self.load(path) + data = self._load_csv(path) return data return None + - def load_csv(self, path): + def _load_csv(self, path): """lädt die SIVAS csv Datei in die Felder für die Oberfläche """ if not os.path.exists(path): return None @@ -218,7 +260,13 @@ class CadItem(): value = None ret[k] = value return ret - + + def from_json_file(self, subpath, cid): + path = os.path.join(subpath, cid + '.json') + if os.path.exists(path): + self.load(path) + return False + def from_json(self, json_str): jsonobj = json.loads(json_str) @@ -236,6 +284,7 @@ class CadItem(): if "red_ids" in jsonobj: red_ids = jsonobj["red_ids"] self.set_red_ids(red_ids) + return True def to_dict(self, tree=False ): jsonobj = dict() @@ -266,6 +315,7 @@ class CadItem(): except Exception: raise Exception("guid_data, data, parent_children_mapping or red_ids not found") + def save(self, path, tree=False): """saves all data of model to a json string""" with open(path, 'w') as f: diff --git a/lib/controller.py b/lib/controller.py index de7ae1c..d319839 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -84,29 +84,25 @@ class Controller(): # check before. change to given item just in case it is valid, e.g. name is a number of 9 digits if not cid.isnumeric(): return + # nur die red-id Daten können geladen werden. + red_ids = self.model.get_red_ids() + if not cid in red_ids: + return # TODO save current given data. In case, ask whether you should save or drop self.set_gui_data('teilenummer', cid) - # falls eine .json Datei davon existiert, dann diese zuerst versuchen zu laden - #self.model.load(demo_data) - gui_dict = None - loaded_json = self.model.sivas_data_from_json(cid) - if loaded_json: - # falls eine .json Datei dieser ID existiert, dann diese laden - gui_dict = self.logic.csv2guidata(loaded_csv) - self.model.set_gui_dict(gui_dict) - else: - # ansonsten die .csv Datei mit den SIVAS Infos holen - # TODO - loaded_csv = self.model.sivas_data_from_csv(cid) - if loaded_csv: - # und dann diese laden - gui_dict = self.logic.csv2guidata(loaded_csv) - if not gui_dict: - print("no file found "+ cid) - else: - self.refresh_gui() + # falls eine .json Datei davon im Work Ordner existiert, dann diese zuerst versuchen ins Modell zu laden + isok = self.model.from_json_file(self.get_env("out"), cid) + if isok == False: + # ansonsten die .csv Datei mit den SIVAS Infos aus data holen + loaded = self.model.sivas_data_from_csv(cid) + if loaded == None: + print("no file found "+ cid) + else: + # und diese in der Gui setzen + set_data = self.model.csv2guidata(loaded) + self.refresh_gui() def get_current_item_id(self): return self.get_gui_data('teilenummer') @@ -188,70 +184,34 @@ class GuiLogic(): self.config = configs # hier sind alle Callbacks bzw. deren Comboboxen - # dies sind die Excel Headel der SIVAS csv Export Datei - # und wie diese in das Datenmodell der Gui integriert werden kann - self.excel_to_gui = { - "Teilenummer":"teilenummer", - "Bezeichnung1":"bezeichnung1_sivas", - "Bezeichnung2":"bezeichnung2_sivas", - "Beschaffungsart":"beschaffungsart_sivas", - "Mengeneinheit":"mengeneinheit_sivas", - "Halbzeug":"halbzeug_sivas", - "TOS_Gruppe":"tosgruppe_sivas", - "Dispogruppe":"dispolaufgruppe_sivas", - "Dispolaufgruppe":"dispolaufgruppe_sivas", - "ErsatzFuer":"ersatzfuer_neu", - "ErsetztDurch":"ersetztdurch_neu", - "AktuellerIndex":"aenderungsindex_sivas", - "Hersteller":"hersteller_sivas", - "HerstellerTeilenummer":"herstteilenr_sivas", - "Version":"version_sivas", - "HalbzeugExtern":"halbzeug_sivas", - "Werkstoff":"werkstofftyp_sivas", - "Oberfläche":"cb_oberflaeche_neu", - # "Truemmer":"truemmer", - # "HzOhneSaegeliste":"", - "Ruestcode":"ruestcode_sivas", - "Fertigungsart":"fertigungsart_sivas", - "FosGruppe":"fosGruppe_sivas", - "Kalkulationsart":"kalkulationsart_sivas", - #"Indexerfasser":"", - "Aenderungstext":"aenderungstext_sivas", - "Freigabevermerk":"freigabevermerk_sivas", - # "Indexbearbeiter":"in" - } - - def csv2guidata(self, data): - ret = dict() - for k,v in data.items(): - if k in self.excel_to_gui and v is not None: - ret[self.excel_to_gui[k]] = v - - # Spezial: Befüllung von Änderungstext mit dem Author, falls in der .csv vorhanden - if "Indexerfasser" in data and "Aenderungstext" in data: - ret["aenderungstext_sivas"] = '{aenderungstext} (von {author})'.format(aenderungstext=data["Aenderungstext"], author=data["Indexerfasser"]) - # Indexerfasser wird nicht in der gui verwaltet. Deshalb Modifikation aus den Rohdaten - self.model.set_gui_dict(ret) - + def create_gui_dependencies(self, data): # set defaults from given logic - r0 = self.callback("cb_pdm_kategorie_neu", None) - self.model.set_gui_dict(r0) - r1 = self.callback("cb_neuaufbau", None) - self.model.set_gui_dict(r1) - r2 = self.callback("cb_aus_halbzeug_neu", None) - self.model.set_gui_dict(r2) - r3 = self.callback("cb_halbzeugoberflaeche", None) - self.model.set_gui_dict(r3) - r4 = self.callback("cb_halbzeugfarbe", None) - self.model.set_gui_dict(r4) + # r0 = self.callback("cb_pdm_kategorie_neu", None) + # self.model.set_gui_dict(r0) + # r1 = self.callback("cb_neuaufbau", None) + # self.model.set_gui_dict(r1) + # r2 = self.callback("cb_aus_halbzeug_neu", None) + # self.model.set_gui_dict(r2) + # r3 = self.callback("cb_halbzeugoberflaeche", None) + # self.model.set_gui_dict(r3) + # r4 = self.callback("cb_halbzeugfarbe", None) + # self.model.set_gui_dict(r4) - # add entry dependencies - dep = self.entry_dependencies(ret) - self.model.set_gui_dict(dep) - return ret - - def entry_dependencies(self, data): - return {} + value = None + r = self.cb_pdm_kategorie_neu(value) + self.model.set_gui_dict(r) + r= self.cb_neuaufbau(value) + self.model.set_gui_dict(r) + r= self.cb_aus_halbzeug_neu(value) + self.model.set_gui_dict(r) + r= self.cb_halbzeugoberflaeche(value) + self.model.set_gui_dict(r) + r= self.cb_halbzeugfarbe(value) + self.model.set_gui_dict(r) + r= self.cb_lebenszyklus_status_neu(value) + self.model.set_gui_dict(r) + r= self.cb_3Dmodel_neu(value) + self.model.set_gui_dict(r) def callback(self, key, value): @@ -268,9 +228,9 @@ class GuiLogic(): elif key == "cb_halbzeugfarbe": return self.cb_halbzeugfarbe(value) elif key == 'cb_lebenszyklus_status_neu': - pass + return self.cb_lebenszyklus_status_neu(value) elif key == 'cb_3Dmodel_neu': - pass + return self.cb_3Dmodel_neu(value) elif key == 'cb_halbzeugOhneSaege_neu': pass elif key == 'cb_ruestcode_neu': @@ -344,7 +304,6 @@ class GuiLogic(): return ret - def cb_halbzeugoberflaeche(self, selected): ret = dict() aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") @@ -361,6 +320,16 @@ class GuiLogic(): 'cb_halbzeugoberflaeche': "", } return ret + + def cb_lebenszyklus_status_neu(self, selected): + ret = dict() + lstatus = self.config.Allgemein.get_options("Lebenszyklus") # Serie, Prototyp + if selected is None: + ret['lebenszyklus_status_neu'] = lstatus[0] + ret['cb_lebenszyklus_status_neu'] = lstatus + else: + ret['cb_lebenszyklus_status_neu'] = selected + return ret def cb_halbzeugfarbe(self, selected): ret = dict() @@ -391,6 +360,46 @@ class GuiLogic(): pass return ret + def cb_3Dmodel_neu(self, selected): + ret = dict() + pdm_kategorie_neu = self.model.get_gui_data("pdm_kategorie_neu") + if pdm_kategorie_neu == "Baugruppe" or pdm_kategorie_neu == "Schweissbaugruppe": + # Defaultwert = \\ssg.local\freigaben\Abteilungen\Entwicklung\CAD\Standards\SolidEdge\Template\DIN Metric\baugruppe.asm + # Dropdownwerte = keine + # state_ComboBox = disabled + # state_Button = disabled + # ret = { + # '': '', + # '': '', + # } + pass + elif pdm_kategorie_neu == "Kaufteil": + # Defaultwert = \\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par + # Dropdownwerte = keine + # state_ComboBox = disabled + # state_Button = disabled + pass + elif pdm_kategorie_neu == "Einzelteil": + aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") + neuaufbau = self.model.get_gui_data("neuaufbau") + if aus_halbzeug == "True" or neuaufbau == "True": + # Defaultwert = \\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par + # Dropdownwerte = keine + # state_ComboBox = disabled + # state_Button = disabled + pass + else: + # Defaultwert = "" + # Dropdownwerte = Dateipfade von allen .par-Dateien, die die aktuelle Teilenummer im Dateinamen aufweisen und sich gleichzeitig in einem der rekursiv durchsuchten Pfade aus der Sektion "3D-Modelle" in "Zielpfade.cfg" befinden. + # state_ComboBox = readonly + # state_Button = keiner + + # IF Button "Durchsuchen" geklickt und benutzerdefinierte Solid Edge-Datei gewählt: + # Defaultwert = Dateipfad der gewählten Solid Edge-Datei + pass + return ret + + # def werkstofftyp(self, selected_werkstoff): # """bekommt Aluminium, Stahl etc. und setzt dann die anderen Felder der Oberfläche""" diff --git a/lib/get_teilestamm.py b/lib/get_teilestamm.py index 2376fb1..42688e9 100644 --- a/lib/get_teilestamm.py +++ b/lib/get_teilestamm.py @@ -13,6 +13,9 @@ class FetchSivasTeilestamm: unmigrated_ids = self.migration.get_unmigrated_ids() update_database.get_sivas_teilestamm(unmigrated_ids, self.csv_out_dir) + def get_red_ids(self): + return self.migration.get_unmigrated_ids() + if __name__ == '__main__': parser = argparse.ArgumentParser(description='fetches data from sivas or ruledesigner fusion', prog='update_database') diff --git a/lib/gui.py b/lib/gui.py index 09e82ac..d3d5f83 100644 --- a/lib/gui.py +++ b/lib/gui.py @@ -364,6 +364,7 @@ class RightFramePDM(AllFrames): "halbzeugoberflaeche_neu": self.halbzeugoberflaeche_neu.get(), "halbzeugfarbe_neu": self.halbzeugfarbe_neu.get(), "lebenszyklus_status_neu": self.lebenszyklus_status_neu.get(), + "model3d_neu": self.model3d_neu.get(), # ab hier die Dropdowns der Oberfläche auslesen. "cb_pdm_kategorie_neu": self.pdmkategorie_combo['values'], "cb_lebenszyklus_status_neu": self.lebenszyklusstatus_combo['values'], @@ -391,6 +392,8 @@ class RightFramePDM(AllFrames): self.halbzeugfarbe_neu.set(data["halbzeugfarbe_neu"]) if 'lebenszyklus_status_neu' in data: self.lebenszyklus_status_neu.set(data["lebenszyklus_status_neu"]) + if 'model3d_neu' in data: + self.model3d_neu.set(data["model3d_neu"]) if 'aus_halbzeug_neu' in data: self.aus_halbzeug_neu= data["aus_halbzeug_neu"] # ab hier die Dropdowns der Oberfläche befüllen.