diff --git a/doc/spezifikation.md b/doc/spezifikation.md index c57c902..73490f4 100644 --- a/doc/spezifikation.md +++ b/doc/spezifikation.md @@ -443,6 +443,7 @@ Der Wert aus der Spalte "HzOhneSaegeliste" in "from_siv.csv" muss in gemappter / **Nachfolgende Logik definiert:** - state der ComboBox je nach Situation (readonly / disabled) - Dropdownwerte (Quelle, wo die Dropdownwerte zu finden sind, bzw. direkt die Werte) +- IF PDM-Kategorie == "Baugruppe": Dropdownwerte = None (keine Werte) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index e8aff96..99d85de 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -4,11 +4,10 @@ import tkinter as tk from gui import App from caditem import CadItem, GuiLogic from controller import Controller -from manage_configs import Configs, SivasAssemblyData +from manage_configs import Configs import argparse import os import json -from get_teilestamm import FetchSivasTeilestamm demo_data = """ @@ -81,13 +80,14 @@ class Environment: self.cfg_dir = os.environ.get('CREMIG_CFG') self.ruledesigner_csv_filename = os.environ.get('RD_DATABASE_NAME') -def build_gui(model, configs): +def build_gui(model, configs, sivasid, uselocal=True): root = tk.Tk() #root = ttk.Window() app = App(root) controller = Controller(model, app) controller.set_env(configs.get_env()) + controller.get_csv_files_of_asm(sivasid, uselocal) logic = GuiLogic(model, configs) model.add_logic(logic) @@ -125,29 +125,14 @@ if __name__ == '__main__': elif args.sivasid: sivasid = args.sivasid.strip() - filename = sivasid + '.json' - assembl_path = os.path.join(output_dir, filename) + assembl_path = os.path.join(output_dir, sivasid + '.json') if os.path.exists(assembl_path): # wenn schon einmal das assembly als json abgespeichert wurde, dann dieses laden - model.load(demo_data) + model.load(assembl_path) else: - # ansonsten sich die Einzelteile als .csv und den Aufbau des Assemblies als .json holen - sivas_teilestamm = FetchSivasTeilestamm(sivasid, data_dir) - - sivas_teilestamm.fetch_from_db(args.uselocal) - if not args.uselocal: - sivas_teilestamm.get_unmigrated_teilstamm_csvs() - redids = sivas_teilestamm.get_red_ids() - sad = SivasAssemblyData(data_dir, filename) - parent_children = sad.get_parent_children() - - model.set_red_ids(redids) - model.set_parent_children(parent_children) - model.set_asm_id(sivasid) - - # dann die Gui damit aufbauen - build_gui(model, configs) + # die Gui aufbauen + build_gui(model, configs, sivasid, args.uselocal) else: parser.print_help() diff --git a/lib/caditem.py b/lib/caditem.py index cfa8571..4675db9 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -55,6 +55,7 @@ class CadItem(DataModel): "Freigabevermerk", "ZusaetzlicheInformationen"] gui_data_keys = [ + # Felder der Oberfläche um etwas einzugeben "asm_id", "teilenummer", "datenbank", @@ -96,6 +97,9 @@ class CadItem(DataModel): "freigabevermerk_sivas", "freigabevermerk_neu", "zusatzinfos_auto_text", "zusatzinfos_bendef_text", + # das wird nur zur Datenübergabe aus der csv verwendet, + # ist also eigentlich kein Teil der gui + "truemmer", # Felder der Comboboxen. benannt wie deren callbacks "cb_pdm_kategorie_neu", "cb_halbzeug_neu", @@ -146,7 +150,7 @@ class CadItem(DataModel): "HalbzeugExtern":"halbzeug_sivas", "Werkstoff":"werkstofftyp_sivas", "Oberfläche":"cb_oberflaeche_neu", - # "Truemmer":"truemmer", + "Truemmer":"truemmer", "HzOhneSaegeliste":"halbzeugOhneSaege_sivas", "Ruestcode":"ruestcode_sivas", "Fertigungsart":"fertigungsart_sivas", @@ -180,6 +184,8 @@ class CadItem(DataModel): def get_asm_id(self): return self.get_gui_data("asm_id") + def set_current_item_id(self, tid): + self.set_gui_data('teilenummer', tid) def get_current_item_id(self): return self.get_gui_data('teilenummer') @@ -465,36 +471,36 @@ class GuiLogic(): elif key == 'cb_halbzeugOhneSaege_neu': ret = self.cb_halbzeugOhneSaege_neu(value) elif key == 'cb_ruestcode_neu': - pass + ret = self.cb_ruestcode_neu(value) + ### elif key == 'cb_fertigungsart_neu': - pass + ret = self.cb_fertigungsart_neu(value) elif key == 'cb_allgemeintoleranz_neu': - pass + ret = self.cb_allgemeintoleranz_neu(value) elif key == 'cb_fosGruppe_neu': - pass + ret = self.cb_fosGruppe_neu(value) elif key == 'cb_kalkulationsart_neu': - pass + ret = self.cb_kalkulationsart_neu(value) elif key == 'cb_beschaffungsart_neu': - pass + ret = self.cb_beschaffungsart_neu(value) elif key == 'cb_mengeneinheit_neu': - pass + ret = self.cb_mengeneinheit_neu(value) elif key == 'cb_halbzeug_neu': - pass + ret = self.cb_halbzeug_neu(value) elif key == 'cb_dispogruppe_neu': - pass + ret = self.cb_dispogruppe_neu(value) elif key == 'cb_dispolaufgruppe_neu': - pass + ret = self.cb_dispolaufgruppe_neu(value) elif key == 'cb_hersteller_neu': - pass + ret = self.cb_hersteller_neu(value) elif key == 'cb_werkstoffdiskrepanz': - pass + ret = self.cb_werkstoffdiskrepanz(value) elif key == 'cb_werkstofftyp_neu': - pass - # ret = self.cb_werkstofftyp_neu(value) + ret = self.cb_werkstofftyp_neu(value) elif key == 'cb_material_neu': - pass + ret = self.cb_material_neu(value) elif key == 'cb_oberflaeche_neu': - pass + ret = self.cb_oberflaeche_neu(value) elif key == 'cb_farbe_neu': ret = self.cb_farbe_neu(value) else: @@ -584,9 +590,9 @@ class GuiLogic(): # Entry-Abhängigkeit der Bezeichnung 1. keine eigene Callback. Abhängig von der Kategorie pdm_kat = ret["pdm_kategorie_neu"] if pdm_kat == "Baugruppe" or pdm_kat == "Schweissbaugruppe": - maxlen = 5 # Längenbeschränkung = 45 Zeichen + maxlen = 45 # Längenbeschränkung = 45 Zeichen else: - maxlen = 10 # Längenbeschränkung = 50 Zeichen + maxlen = 50 # Längenbeschränkung = 50 Zeichen text = self._model.get_gui_data("bezeichnung1_sivas") if len(text) > maxlen: ret["bezeichnung1_neu"] = text[0:maxlen] @@ -765,6 +771,147 @@ class GuiLogic(): pass return ret + def cb_ruestcode_neu(self, selected): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_ruestcode_neu'] = '' + ret['ruestcode_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + lrstcodes = self._config.Allgemein.get_options("RuestcodeBaugruppe") + else: + lrstcodes = self._config.Allgemein.get_options("RuestcodeStandard") + + if selected is None: + ret['ruestcode_neu'] = lrstcodes[0] + ret['cb_ruestcode_neu'] = lrstcodes + else: + ret['ruestcode_neu'] = selected + + # self._controller.message_info('Rüstcodeinformationen', 'rüstcode_infos') + return ret + + def cb_fertigungsart_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_halbzeugOhneSaege_neu'] = '' + ret['fertigungsart_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_allgemeintoleranz_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_allgemeintoleranz_neu'] = '' + ret['allgemeintoleranz_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_fosGruppe_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_fosGruppe_neu'] = '' + ret['fosGruppe_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_kalkulationsart_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_kalkulationsart_neu'] = '' + ret['kalkulationsart_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_beschaffungsart_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_beschaffungsart_neu'] = '' + ret['beschaffungsart_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_mengeneinheit_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_mengeneinheit_neu'] = '' + ret['mengeneinheit_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_halbzeug_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_halbzeug_neu'] = '' + ret['halbzeug_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_dispogruppe_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_dispogruppe_neu'] = '' + ret['dispogruppe_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_dispolaufgruppe_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_dispolaufgruppe_neu'] = '' + ret['dispolaufgruppe_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_hersteller_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_hersteller_neu'] = '' + ret['hersteller_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_werkstoffdiskrepanz(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_werkstoffdiskrepanz'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + # def cb_werkstofftyp_neu(self, selected_werkstoff): # """bekommt Aluminium, Stahl etc. und setzt dann die anderen Felder der Oberfläche""" @@ -802,6 +949,29 @@ class GuiLogic(): # } # return ret + def cb_material_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_material_neu'] = '' + ret['material_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + def cb_oberflaeche_neu(self, value): + ret = dict() + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + + ret['cb_oberflaeche_neu'] = '' + ret['oberflaeche_neu'] = '' + if pdm_kategorie_neu == "Baugruppe": + pass + else: + pass + return ret + # def oberfläche(self, selected): # ret = dict() diff --git a/lib/controller.py b/lib/controller.py index 2e0bf3b..17223a0 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -1,4 +1,8 @@ import os + +from manage_configs import SivasAssemblyData +from get_teilestamm import FetchSivasTeilestamm + """ Contains the logic for the MVC of CreoMigrate Gui """ @@ -76,6 +80,24 @@ class Controller(Observer): raise Exception("this path is not defined "+env_path) return ret + + def get_csv_files_of_asm(self, asmid, uselocal): + """ sich die Einzelteile als .csv und den Aufbau des Assemblies als .json holen """ + sivas_teilestamm = FetchSivasTeilestamm(asmid, self.get_env("data")) + + # falls uselocal True, dann keine Serverabfrage, sondern mit den lokalen Daten arbeiten + sivas_teilestamm.fetch_from_db(uselocal) + if not uselocal: + sivas_teilestamm.get_unmigrated_teilstamm_csvs() + redids = sivas_teilestamm.get_red_ids() + + sad = SivasAssemblyData(self.get_env("data"), asmid + '.json') + parent_children = sad.get_parent_children() + + self._model.set_red_ids(redids) + self._model.set_parent_children(parent_children) + self._model.set_asm_id(asmid) + def set_model(self, model): self._model = model self.attach(model) @@ -89,9 +111,9 @@ class Controller(Observer): self._view.data_from_model() def get_current_asm_id(self): - self._model.get_current_asm_id() + self._model.get_asm_id() def set_current_asm_id(self, asm_id): - self._model.set_current_asm_id(asm_id) + self._model.set_asm_id(asm_id) def set_current_item_id(self, cid): @@ -103,10 +125,14 @@ class Controller(Observer): 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) + self._model.set_current_item_id(cid) + self._load_cid_data2model(cid) + + def _load_cid_data2model(self, cid): + """lädt alle nötigen Daten für diese ID """ # 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: @@ -162,6 +188,12 @@ class Controller(Observer): #self._view.set_widget_status(widgetname, status) pass + def message_info(self, title, key, questions='ok'): + return tkinter.messageBox.showinfo(title, message[key]) + + def message_error(self, title, key, type='error'): + pass + def callback(self, key, value): if not self._model: raise Exception("no model yet added") @@ -174,6 +206,7 @@ class Controller(Observer): elif key == 'cb_zurücksetzen': pass elif key == 'cb_suche_asm': + #self._model.save_to_file() pass elif key == 'cb_3dsuchen': self.suche_3d() diff --git a/lib/manage_configs.py b/lib/manage_configs.py index 121c8a8..75629de 100644 --- a/lib/manage_configs.py +++ b/lib/manage_configs.py @@ -459,7 +459,8 @@ class Configs: def set_data_dir(self, data_dir): self._data_dir = data_dir - self.TeileNummern = RuleDesignerDatabaseConfig(data_dir) + def get_data_dir(self, data_dir): + return self._data_dir def set_env(self, env): self._env = env