import os """ Contains the logic for the MVC of CreoMigrate Gui """ # Infos und Fehlermeldungen die ausgelöst werden können messages = { "rüstcode_infos": 'Bitte Rüstcode auswählen!', "beschaffungsart_infos": ' Komponenten der Schweißbaugruppe müssen eigene Teilenummern erhalten, falls diese aktuell als Underline-Nummern in der Creo-Baugruppe vorliegen, aber keine eigenen Teilenummern in SIVAS besitzen!', "mengeneinheit_infos":'Bitte prüfen, ob Mengeneinheit ≠ "M - Meter" korrekt ist!', "material_infos":'Werkstoffvorschlag nicht möglich, da das Material nicht in der Mappingdatei "Materialübersetzung.json" enthalten ist.\nBitte Werkstoff in dieser Datei nachfpflegen und prüfen, ob der Werkstoff in den nachfolgenden Systemen vorhanden ist:\n- RuleDesigner\n- SIVAS-Produktiv- und Schulungsdatenbank\n- Solid Edge\nWenn nicht, bitte in diesen Systemen ebenfalls nachpflegen!', "unzulaessige_zeichen":'Unzulässige Zeichen identifiziert:\nZeichen: {Zeichentyp} -> Feld: {Feldname}', "bezeichnung_zu_gross":'Bezeichnung besitzt mehr als 50 Zeichen. Bitte verkürzen!', "konflikt_ruestcode_saegeliste":'In Sivas prüfen, wieso Haken bei "Halbzeug ohne Sägeliste" trotz Rüstcode "SRC Standard Rüstcode" gesetzt ist.', "teilenummre_ohne_ruestcode":'Teilenummer darf nicht ohne Rüstcode migriert werden!', "fertigungsart":'Fertigungsart falsch. Bitte berichtigen!', "fos_gruppe":'FOS-Gruppe falsch. Bitte berichtigen!', "kalkulations_art":'Kalkulationsart falsch. Bitte berichtigen!', "beschaffungsart":'Beschaffungsart falsch. Bitte berichtigen!', "mengeneinheit":'Mengeneinheit falsch. Bitte berichtigen!', "teilenummer_halbzeug":'Teilenummer kann kein Halbzeug sein. Bitte berichtigen!', "tos_gruppe_not_exist":'TOS-Gruppe exisitert nicht. Bitte eingetragene Gruppennummer korrigieren oder ergänzen!', "dispo_not_exist":'Datensatz kann nicht ohne Dispogruppe migriert werden. Bitte nachpflegen!', "dispolauf_not_exist":'Datensatz kann nicht ohne Dispolaufgruppe migriert werden. Bitte nachpflegen!', "teilenummer_not_exist_infos":'Ersetzte Teilenummer {Ersetzte Teilenummer} exisitert noch nicht in RuleDesigner. Migration trotzdem durchführen?', "ersatzteilenummer_not_exist_infos":'Ersatz-Teilenummer {Ersatz-Teilenummer} exisitert noch nicht in RuleDesigner. Migration trotzdem durchführen?', "werkstofftyp_not_exist":'Eingetragener Werkstofftyp exisitert nicht. Bitte korrigeren!', "werkstoff_not_exist":'Werkstoff falsch. Bitte korrigieren!', "color_not_defined":'Teilenummer kann nicht ohne festgelegte Farbe migriert werden!', "aenderungstext_too_long":'Änderungstext_weist zu viele Zeichen auf. Bitte auf 400 Zeichen verkürzen!', } class Controller(): """ Class for manipulating the model and returning data for the view """ def __init__(self, model, view): self.set_model(model) self.set_view(view) self.logic = None self.env = None def set_env(self, env): self.environment = env def get_env(self, env_path): if self.environment == None: raise Exception("No environment set") if env_path == "lib": ret = self.environment.lib_dir elif env_path == "data": ret = self.environment.data_dir elif env_path == "out": ret = self.environment.out_dir elif env_path == "cfg": ret = self.environment.cfg_dir else: raise Exception("this path is not defined "+env_path) return ret def add_logic(self, logic): self.logic = logic def remove_logic(self): self.logic = None def set_model(self, model): self.model = model def set_view(self, view): self.view = view def refresh_gui(self): self.view.data_from_model() def data_from_model(self): self.view.data_from_model() def get_current_asm_id(self): self.model.get_current_asm_id() def set_current_asm_id(self, asm_id): self.model.set_current_asm_id(asm_id) def set_current_item_id(self, cid): """setze eine neue Item ID """ # 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 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') def set_red_ids(self, red_ids): self.model.set_red_ids(red_ids) def get_red_ids(self): return self.model.get_red_ids() def set_parent_children(self, parent_children_mapping): self.model.set_parent_children(parent_children_mapping) def get_parent_children(self): return self.model.get_parent_children() # merkt sich die reinen Daten zum Impfen def set_data_dict(self, data:dict): """merken der Daten zum Impfen""" for k,v in data: self.set_data(k,v) def set_data(self, key, value): """merken der Daten zum Impfen""" self.model.set_data(key, value) def get_data(self, key): return self.model.get_data(key) def get_all_data(self): return self.model.get_all_data() # merkt sich die Nutzereingaben, bzw. Daten für die GUI def set_gui_dict(self, data:dict): """merken der Eingaben des Nutzers der GUI """ for k,v in data.items(): self.set_gui_data(k,v) def set_gui_data(self, key, value): """merken der Eingaben des Nutzers der GUI """ self.model.set_gui_data(key, value) def get_gui_data(self, key): return self.model.get_gui_data(key) def get_all_gui_data(self): return self.model.get_all_gui_data() def callback(self, key, value): if not self.logic: return # Logik um neue Werte in Oberfläche oder Modell zu füllen model_values = self.logic.callback(key, value) if model_values: self.set_gui_dict(model_values) self.refresh_gui() # reine Aktionen if key == 'cb_speichern': self.save_to_file() elif key == 'cb_migrieren': pass elif key == 'cb_zurücksetzen': pass elif key == 'cb_suche_asm': pass def save_to_file(self): """speichert die bisherigen Eingaben beider Spalten in eine json Datei""" path = os.path.join(self.get_env("out"), str(self.get_current_item_id()) + '.json') # die Bauminfos und RedIds dazu werden standardmässig nicht mit gemerkt. self.model.save(path, False) class GuiLogic(): """ Class for business logic. implementing the dependencies between different user inputs """ def __init__(self, model, configs): # das Modell soll hier nur verwendet werden um aktuell Zustände abzufragen! # alles weitere zum Setzen von Daten etc. muss über den Controller laufen, also zurück gegeben werden. self.model = model # hier holt man die Daten der Configs self.config = configs # hier sind alle Callbacks bzw. deren Comboboxen 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) 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): """gibt ein dict zurück, welches neu im Modell gesetzt wird""" if key == 'cb_pdm_kategorie_neu': return self.cb_pdm_kategorie_neu(value) elif key == 'cb_neuaufbau': return self.cb_neuaufbau(value) elif key == 'cb_aus_halbzeug_neu': return self.cb_aus_halbzeug_neu(value) elif key == "cb_halbzeugoberflaeche": return self.cb_halbzeugoberflaeche(value) elif key == "cb_halbzeugfarbe": return self.cb_halbzeugfarbe(value) elif key == 'cb_lebenszyklus_status_neu': return self.cb_lebenszyklus_status_neu(value) elif key == 'cb_3Dmodel_neu': return self.cb_3Dmodel_neu(value) elif key == 'cb_halbzeugOhneSaege_neu': pass elif key == 'cb_ruestcode_neu': pass elif key == 'cb_fertigungsart_neu': pass elif key == 'cb_allgemeintoleranz_neu': pass elif key == 'cb_fosGruppe_neu': pass elif key == 'cb_kalkulationsart_neu': pass elif key == 'cb_beschaffungsart_neu': pass elif key == 'cb_mengeneinheit_neu': pass elif key == 'cb_halbzeug_neu': pass elif key == 'cb_dispogruppe_neu': pass elif key == 'cb_dispolaufgruppe_neu': pass elif key == 'cb_hersteller_neu': pass elif key == 'cb_werkstoffdiskrepanz': pass elif key == 'cb_werkstofftyp_neu': pass # return self.werkstofftyp(value) elif key == 'cb_material_neu': pass elif key == 'cb_oberflaeche_neu': pass elif key == 'cb_farbe_neu': return self.cb_farbe_neu(value) elif key == 'cb_speichern': pass elif key == 'cb_migrieren': pass elif key == 'cb_zurücksetzen': pass elif key == 'cb_suche_asm': pass else: raise Exception("this callback does not exist "+key) def cb_pdm_kategorie_neu(self, selected): ret = dict() categories = self.config.Allgemein.get_options("Kategorien") if selected is None: ret['pdm_kategorie_neu'] = categories[0] ret['cb_pdm_kategorie_neu'] = categories else: ret['pdm_kategorie_neu'] = selected return ret def cb_neuaufbau(self, trueOrfalse): ret = dict() pdm_kat = self.model.get_gui_data("pdm_kategorie_neu") if pdm_kat != "Einzelteil" or pdm_kat != "Kaufteil": ret["neuaufbau"] = False return ret def cb_aus_halbzeug_neu(self, trueOrfalse): ret = dict() pdm_kat = self.model.get_gui_data("pdm_kategorie_neu") if pdm_kat == "Einzelteil": pass else: ret["aus_halbzeug_neu"] = False return ret def cb_halbzeugoberflaeche(self, selected): ret = dict() aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") if aus_halbzeug == "True": oarten = self.config.Oberfläche.get_oberflächen_behandlungen() if selected is None: ret['halbzeugoberflaeche_neu'] = oarten[0] ret['cb_halbzeugoberflaeche'] = oarten else: ret['halbzeugoberflaeche_neu'] = selected else: ret = { 'halbzeugoberflaeche_neu': "", '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() halbzeugoberflaeche = self.model.get_gui_data("halbzeugoberflaeche_neu") aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") # setze die Inhalte der abhängigen Comboboxen neu ret = { 'halbzeugfarbe_neu': '', 'cb_halbzeugfarbe': '', } if aus_halbzeug == "True": if halbzeugoberflaeche == "eloxieren": farben_elox = self.config.Farben.get_farben_eloxieren() if selected is None: ret['halbzeugfarbe_neu'] = farben_elox[0] # Default, falls nichts gewählt ist ret['cb_halbzeugfarbe'] = farben_elox # Liste in der Combobox else: ret['halbzeugfarbe_neu'] = selected # vom Nutzer ausgewählter Wert elif halbzeugoberflaeche == "lackieren" or halbzeugoberflaeche == "pulverbeschichten": farbauswahl = self.config.Farben.get_farbauswahl() if selected is None: ret['halbzeugfarbe_neu'] = farbauswahl[0] ret['cb_halbzeugfarbe'] = farbauswahl else: ret['halbzeugfarbe_neu'] = selected else: 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""" # # Logik, die steuert, welcher Defaultwert gilt: # # In den nachfolgenden Fällen darf kein Defaultwert eingetragen # # werden (selbst wenn in from_siv.csv ein Wert in der Spalte # # "Werkstoff" eingetragen sein sollte): # # PDM-Kategorie == "Baugruppe" # # PDM-Kategorie == "Schweissbaugruppe" # # PDM-Kategorie == "Einzelteil" und Aus Halbzeug == True (Haken gesetzt) # # Gilt PDM-Kategorie == "Kaufteil" soll der Defaultwert "siehe # # Hersteller" eingetragen werden # # Gilt PDM-Kategorie == "Einzelteil" und Aus Halbzeug == False (kein # # Haken), dann wird der Defaultwert wie folgt bestimmt: # ret = dict() # # das Feld selbst mit dem Selektierten beschreiben # ret['werkstofftyp_neu']= selected_werkstoff # pdm_kat = self.model.get_gui_data("pdm_kategorie_neu") # aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") # if pdm_kat == 'Einzelteil' and aus_halbzeug is False: # wnamen = self.config.Werkstoffe.get_werkstoffe_of_name(selected_werkstoff) # # setze die Inhalte der abhängigen Comboboxen neu und den Wert im Modell # ret = { # # das Feld selbst mit dem Selektierten beschreiben # 'werkstofftyp_neu': selected_werkstoff, # # die neuen Inhalte der comboboxen setzen # 'cb_material_neu': wnamen, # # der angezeigte Wert der Combos sollte anfangs dem ersten der Liste entsprechen # 'material_neu': wnamen[0], # } # return ret # def oberfläche(self, selected): # ret = dict() # # das Feld selbst mit dem Selektierten beschreiben # ret['oberflaeche_neu']= selected # pdm_kat = self.model.get_gui_data("pdm_kategorie_neu") # aus_halbzeug = self.model.get_gui_data("aus_halbzeug_neu") # if pdm_kat == 'Einzelteil' and aus_halbzeug is False: # onamen = self.config.Oberfläche.get_oberfläche_of_type(selected) # # setze die Inhalte der abhängigen Comboboxen neu und den Wert im Modell # ret = { # # die neuen Inhalte der comboboxen setzen # 'cb_oberflaeche_neu': onamen, # # der angezeigte Wert der Combos sollte anfangs dem ersten der Liste entsprechen # 'oberflaeche_neu': onamen[0], # } # return ret def cb_farbe_neu(self, selected): farben_alle = self.config.Farben.get_farbauswahl() farben_elox = self.config.Farben.get_farben_eloxieren() # setze die Inhalte der abhängigen Comboboxen neu und den Wert im Modell ret = { # das Feld selbst mit dem Selektierten beschreiben 'farbe_neu': selected, # die neuen Inhalte der comboboxen setzen 'cb_farben': farben_alle, # der angezeigte Wert der Combos sollte anfangs dem ersten der Liste entsprechen 'farbe_neu': farben_alle[0], } return ret if __name__ == "__main__": pass