diff --git a/cfg/ERP_Item.ini b/cfg/ERP_Item.ini deleted file mode 100644 index fe7e4ab..0000000 --- a/cfg/ERP_Item.ini +++ /dev/null @@ -1,51 +0,0 @@ -[Settings] -DoWriteLogfile=True -ExportFolder=\\ruledesigner\RDF_Daten\ERP\ITEM -WorkingFolder=\\ruledesigner\RDF_Daten\ERP\Working -#ExportFolder=\\ssg.local\freigaben\SIVAS_CAD_EDM\Austausch\Item -DoExportTextfile=False -DoExportXML=False -DoExportCSV=True -ExportSeparator=; -#Es wird geprüft welche Zeichen für Attributswerte nicht erlaubt sind -# Original: InvalidCharacters=/,\,&,%,°,?,|,!,@,à,è,ì,ò,ù,[,],£,$,%,&,; -InvalidCharacters=\,%,?,|,!,@,à,è,ì,ò,ù,£,$,%,; - -[Values] -Value01=Teilenummer -Value02=Bezeichnung Kombiniert -Value03=Ersteller -Value04=Abgeändert -Value05=Revision -Value06=Beschaffungsart -Value07=TOS-Gruppe_ERP -Value08=Dispogruppe_ERP -Value09=Dispolaufgruppe_ERP -Value10=Einheit_ERP -Value11=Ersetzt -Value12=Ersetzt von -Value13=Werkstoff -Value14=Oberflächenbehandlung -Value15=Farbe -Value16=Alternativwerkstoff -Value17=Alternativfarbe -Value18=Fertigungsart_ERP -Value19=FOS-Gruppe_ERP -Value20=Änderungsbeschreibung -Value21=Freigabevermerk -Value22=Halbzeug_ERP -Value23=Halbzeug Bezeichnung -Value24=HalbzeugOhneSaegeliste_ERP -Value25=Hersteller -Value26=Hersteller Teilenummer -Value27=Kalkulationsart_ERP -Value28=Ruestcode_ERP -Value29=Serien-Status -Value30=Kategorie - - -[History] -#Attribute werden aus der Datenbank abgelesen (Autor,Änderungsdatum,Änderungsbeschreibung,Freigabevermerk,Ersetzt, Ersetzt von) - -AddHistoryInformation=False -ExportDetail= \ No newline at end of file diff --git a/cfg/InvalidCharacters.txt b/cfg/InvalidCharacters.txt new file mode 100644 index 0000000..b0a815e --- /dev/null +++ b/cfg/InvalidCharacters.txt @@ -0,0 +1 @@ +\,?,|,!,@,à,è,ì,ò,ù,£,$,%,; diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index b805815..e7a03e2 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -80,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, sivasid, uselocal=True): +def build_gui(model, configs, env, sivasid, uselocal=True): root = tk.Tk() #root = ttk.Window() app = App(root) controller = Controller(model, app) - controller.set_env(configs.get_env()) + controller.set_env(env) + controller.set_config(configs) controller.get_csv_files_of_asm(sivasid, uselocal) logic = GuiLogic(model, configs) @@ -111,28 +112,28 @@ if __name__ == '__main__': args = parser.parse_args() environment = Environment() - output_dir = environment.out_dir + data_dir = environment.data_dir configs = Configs(environment.cfg_dir) - configs.set_env(environment) configs.set_data_dir(data_dir) model = CadItem() if args.demo: model.from_json(json.loads(demo_data)) - build_gui(model, configs, "400102196", True) + build_gui(model, configs, environment, "400102196", True) elif args.sivasid: sivasid = args.sivasid.strip() + output_dir = environment.out_dir 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(assembl_path) else: # die Gui aufbauen - build_gui(model, configs, sivasid, args.uselocal) + build_gui(model, configs, environment, sivasid, args.uselocal) else: parser.print_help() diff --git a/lib/caditem.py b/lib/caditem.py index d5995fd..cf7c871 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -69,7 +69,7 @@ class CadItem(DataModel): "lebenszyklus_status_neu", "model3d_neu", "bezeichnung1_sivas", "bezeichnung1_neu", - "bezeichnung2_sivas", "bezeichnung2_neu", + "bezeichnung2_sivas", "halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", "ruestcode_sivas", "ruestcode_neu", "fertigungsart_sivas", "fertigungsart_neu", @@ -87,7 +87,7 @@ class CadItem(DataModel): "ersetztdurch_sivas", "ersetztdurch_neu", "herstteilenr_sivas", "herstteilenr_neu", "werkstoffdiskr_neu", - "werkstofftyp_sivas", "werkstofftyp_neu", + "werkstofftyp_neu", "material_sivas", "material_neu", "oberflaeche_neu", "farbe_neu", @@ -166,6 +166,67 @@ class CadItem(DataModel): # "Indexbearbeiter":"in" } + key2label = { + "asm_id": "Baugruppennummer", + "teilenummer": "Teilenummer", + "pdm_kategorie_neu": "PDM-Kategorie", + "halbzeugnummer_neu": "Halbzeugnummer", + "halbzeuglaenge_neu": "Halbzeuglänge", + "halbzeugoberflaeche_neu": "Halbzeugoberfläche", + "halbzeugfarbe_neu": "Halbzeugfarbe", + "lebenszyklus_status_neu": "Lebenzyklusstatus", + "model3d_neu": "3D-Modell", + "bezeichnung1_sivas": "Bezeichnung 1", + "bezeichnung1_neu": "Bezeichnung 1", + "bezeichnung2_sivas": "Bezeichnung 2", + "halbzeugOhneSaege_sivas": "Halbzeug ohne Sägeliste", + "halbzeugOhneSaege_neu": "Halbzeug ohne Sägeliste", + "ruestcode_sivas": "Rüstcode", + "ruestcode_neu": "Rüstcode", + "fertigungsart_sivas": "Fertigungsart", + "fertigungsart_neu": "Fertigungsart", + "allgemeintoleranz_sivas": "Allgemeintoleranz", + "allgemeintoleranz_neu": "Allgemeintoleranz", + "fosGruppe_sivas": "FOS-Gruppe", + "fosGruppe_neu": "FOS-Gruppe", + "kalkulationsart_sivas": "Kalkulationsart", + "kalkulationsart_neu": "Kalkulationsart", + "beschaffungsart_sivas": "Beschaffungsart", + "beschaffungsart_neu": "Beschaffungsart", + "mengeneinheit_sivas": "Mengeneinheit", + "mengeneinheit_neu": "Mengeneinheit", + "halbzeug_sivas": "Halbzeug", + "halbzeug_neu": "Halbzeug", + "tosgruppe_sivas": "TOS-Gruppe", + "tosgruppe_neu": "TOS-Gruppe", + "dispogruppe_sivas": "Dispogruppe", + "dispogruppe_neu": "Dispogruppe", + "dispolaufgruppe_sivas": "Dispolaufgruppe", + "dispolaufgruppe_neu": "Dispolaufgruppe", + "hersteller_sivas": "Hersteller", + "hersteller_neu": "Hersteller", + "ersatzfuer_sivas": "Ersatz für", + "ersatzfuer_neu": "Ersatz für", + "ersetztdurch_sivas": "Ersetzt durch", + "ersetztdurch_neu": "Ersetzt durch", + "herstteilenr_sivas": "Hersteller Teilenummer", + "herstteilenr_neu": "Hersteller Teilenummer", + "werkstofftyp_neu": "Werkstofftyp", + "material_sivas": "Material", + "material_neu": "Material", + "oberflaeche_neu": "Oberfläche", + "farbe_neu": "Farbe", + "version_sivas": "Version", + "aenderungsindex_sivas": "Änderungsindex", + "aenderungsindex_neu": "Änderungsindex", + "aenderungstext_sivas": "Änderungstext", + "aenderungstext_neu": "Änderungstext", + "freigabevermerk_sivas": "Freigabevermerk", + "freigabevermerk_neu": "Freigabevermerk", + "zusatzinfos_auto_text": "Zusatzinformationen automatisch", + "zusatzinfos_bendef_text": "Zusatzinformationen Benutzerdefiniert", + } + def __init__(self): """ is initalized with its unique id""" super().__init__() @@ -495,22 +556,15 @@ class CadItem(DataModel): def message_error(self, title, key): return self._controller.message_error(title, key) - - def check(self): - res = self.check_pflichtfelder() - if len(res) > 0: - return (False, res) - else: - return (True, []) - def check_key_existence(self, mess, key, missing): + def check_key_existence(self, key, missing): if not self.get_gui_data(key): - missing.append(mess) + missing.append(self.key2label[key]) - def check_key_both_columns(self, mess, key_sivas, key_neu, missing): + def check_key_both_columns(self, key_sivas, key_neu, missing): if not self.get_gui_data(key_sivas): if not self.get_gui_data(key_neu): - missing.append(mess) + missing.append(self.key2label[key_neu]) def check_pflichtfelder(self): """Allgemeine Prüfungen: @@ -519,11 +573,11 @@ class CadItem(DataModel): missing = list() # Teilenummer - self.check_key_existence( 'Teilenummer', "teilenummer", missing) + self.check_key_existence("teilenummer", missing) # Datenbank - self.check_key_existence("Datenbank", "datenbank", missing) + self.check_key_existence("datenbank", missing) # PDM-Kategorie - self.check_key_existence("PDM-Kategorie", "pdm_kategorie_neu", missing) + self.check_key_existence("pdm_kategorie_neu", missing) # Halbzeugfarbe hblzeug_oberfläche = self.get_gui_data("oberflaeche_neu") @@ -532,54 +586,75 @@ class CadItem(DataModel): missing.append("Halbzeugfarbe") # Lebenszyklusstatus - self.check_key_existence("Lebenszyklusstatus", "lebenszyklus_status_neu", missing) + self.check_key_existence("lebenszyklus_status_neu", missing) # 3D-Modell - self.check_key_existence("3D-Model", "model3d_neu", missing) + self.check_key_existence("model3d_neu", missing) # Bezeichnung 1 - self.check_key_both_columns("Bezeichnung 1", "bezeichnung1_sivas", "bezeichnung1_neu", missing) + self.check_key_both_columns("bezeichnung1_sivas", "bezeichnung1_neu", missing) # Halbzeug ohne Sägeliste - self.check_key_both_columns("Halbzeug ohne Sägeliste", "halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", missing) + self.check_key_both_columns("halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", missing) # Rüstcode - self.check_key_both_columns("Rüstcode", "ruestcode_sivas", "ruestcode_neu", missing) + self.check_key_both_columns("ruestcode_sivas", "ruestcode_neu", missing) pdm_kategorie_neu = self.get_gui_data("pdm_kategorie_neu") # Fertigungsart if pdm_kategorie_neu == "Einzelteil" or pdm_kategorie_neu == "Schweissbaugruppe": - self.check_key_both_columns("Fertigungsart", "fertigungsart_sivas", "fertigungsart_neu", missing) + self.check_key_both_columns("fertigungsart_sivas", "fertigungsart_neu", missing) # Allgemeintoleranz - self.check_key_both_columns("Allgemeintoleranz", "allgemeintoleranz_sivas", "allgemeintoleranz_neu", missing) + self.check_key_both_columns("allgemeintoleranz_sivas", "allgemeintoleranz_neu", missing) # FOS-Gruppe - self.check_key_both_columns("FOS-Gruppe", "fosGruppe_sivas", "fosGruppe_neu", missing) + self.check_key_both_columns("fosGruppe_sivas", "fosGruppe_neu", missing) # Kalkulationsart - self.check_key_both_columns("Kalkulationsart", "kalkulationsart_sivas", "kalkulationsart_neu", missing) + self.check_key_both_columns("kalkulationsart_sivas", "kalkulationsart_neu", missing) # Beschaffungsart - self.check_key_both_columns("Beschaffungsart", "beschaffungsart_sivas", "beschaffungsart_neu", missing) + self.check_key_both_columns("beschaffungsart_sivas", "beschaffungsart_neu", missing) # Mengeneinheit - self.check_key_both_columns("Mengeneinheit", "mengeneinheit_sivas", "mengeneinheit_neu", missing) + self.check_key_both_columns("mengeneinheit_sivas", "mengeneinheit_neu", missing) # Halbzeug - self.check_key_both_columns("Halbzeug", "halbzeug_sivas", "halbzeug_neu", missing) + self.check_key_both_columns("halbzeug_sivas", "halbzeug_neu", missing) # TOS-Gruppe - self.check_key_both_columns("Tosgruppe", "tosgruppe_sivas", "tosgruppe_neu", missing) + self.check_key_both_columns("tosgruppe_sivas", "tosgruppe_neu", missing) # Dispogruppe - self.check_key_both_columns("Dispogruppe", "dispogruppe_sivas", "dispogruppe_neu", missing) + self.check_key_both_columns("dispogruppe_sivas", "dispogruppe_neu", missing) # Dispolaufgruppe - self.check_key_both_columns("Dispolaufgruppe", "dispolaufgruppe_sivas", "dispolaufgruppe_neu", missing) + self.check_key_both_columns("dispolaufgruppe_sivas", "dispolaufgruppe_neu", missing) # Werkstofftyp aus_halbzeug = self.get_gui_data("aus_halbzeug_neu") if aus_halbzeug is False: - self.check_key_both_columns("Werkstofftyp", "werkstofftyp_sivas", "werkstofftyp_neu", missing) + self.check_key_existence("werkstofftyp_neu", missing) # Änderungstext - self.check_key_both_columns("Änderungstext", "aenderungstext_sivas", "aenderungstext_neu", missing) + self.check_key_both_columns("aenderungstext_sivas", "aenderungstext_neu", missing) # Freigabevermerk - self.check_key_both_columns("Freigabevermerk", "freigabevermerk_sivas", "freigabevermerk_neu", missing) + self.check_key_both_columns("freigabevermerk_sivas", "freigabevermerk_neu", missing) # Automatische Zusatzinformationen - self.check_key_existence("Automatische Zusatzinformationen", "zusatzinfos_auto_text", missing) - return missing + self.check_key_existence("zusatzinfos_auto_text", missing) + if len(missing) > 0: + return (False, missing) + else: + return (True, []) + + def check_improper_chars(self, invalid_chars): + """ überprüft ob inder Oberfläche nicht erlaubte Zeichen eingetragen wurden""" + wrongchars = dict() + for key in self.key2label: + content = self.get_gui_data(key) + for c in invalid_chars: + if c in content: + Label = self.key2label[key] + if Label in wrongchars: + wrongchars[Label].append(c) + else: + wrongchars[Label] = [c] + + if len(wrongchars.keys()) > 0: + return (False, wrongchars) + else: + return (True, {}) class CadItemRepository: """ diff --git a/lib/controller.py b/lib/controller.py index 15fa398..614be5e 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -13,7 +13,7 @@ messages = { "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}', + "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!', @@ -61,6 +61,7 @@ class Controller(Observer): """ def __init__(self, model, view): self._environment = None + self._config = None self.set_model(model) self.set_view(view) @@ -82,6 +83,9 @@ class Controller(Observer): raise Exception("this path is not defined "+env_path) return ret + def set_config(self, config): + self._config = config + def get_csv_files_of_asm(self, asmid, uselocal): """ sich die Einzelteile als .csv und den Aufbau des Assemblies als .json holen """ @@ -213,9 +217,7 @@ class Controller(Observer): if 'Labels' in values: text = text.format(Labels=values['Labels']) if 'Zeichentyp' in values: - text = text.format(Zeichentyp=values['Zeichentyp']) - if 'Feldname' in values: - text = text.format(Feldname=values['Feldname']) + text = text.format(Zeichentyp=values['Zeichentyp'], Feldname=values['Feldname'] ) return messagebox.showerror(title, text) def callback(self, key, value): @@ -256,24 +258,29 @@ class Controller(Observer): self.refresh_gui() def migrieren(self): - (ok, missing) = self._model.check() + (ok, missing) = self._model.check_pflichtfelder() if ok == False: labels = ', '.join(missing) self.message_error('Fehlende Angaben', 'missing_data', {'Labels':labels}) + return + invalid_chars = self._config.InvalidChars.get() + (ok, wrongchars) = self._model.check_improper_chars(invalid_chars) + if ok == False: + for label,achars in wrongchars.items(): + chars = ''.join(achars) + self.message_error('Unzulässige Zeichen', 'unzulaessige_zeichen', {'Zeichentyp': chars, 'Feldname':label}) + return def zuruecksetzen(self): - data = dict() - data['halbzeugnummer_neu'] = {'background':'red', 'foreground':'white'} - self._view.configure(data) - # cid = self.get_current_item_id() - # self._model.clear() - # self._view.clear_rightframes() - # csv_data = self._model.sivas_data_from_csv(str(cid)) - # # transform the csv keys into keys used behind the gui - # gui_data = self._model.csv2guidata(csv_data) - # self.set_gui_dict(gui_data) - # # create dropdown and other defaults - # self._model.set_gui_defaults() + cid = self.get_current_item_id() + self._model.clear() + self._view.clear_rightframes() + csv_data = self._model.sivas_data_from_csv(str(cid)) + # transform the csv keys into keys used behind the gui + gui_data = self._model.csv2guidata(csv_data) + self.set_gui_dict(gui_data) + # create dropdown and other defaults + self._model.set_gui_defaults() def suche_3d(self): pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") diff --git a/lib/manage_configs.py b/lib/manage_configs.py index 94d3086..f24081e 100644 --- a/lib/manage_configs.py +++ b/lib/manage_configs.py @@ -1,6 +1,6 @@ import os import json -from configparser import ConfigParser +from configparser import ConfigParser, RawConfigParser import pandas as pd import update_database @@ -447,10 +447,21 @@ class ZusatzConfig(IniBasedConfig): def __init__(self, config_dir='.', config_file='Zusatzinformationen.cfg'): super().__init__(config_dir, config_file) -class ERPConfig(IniBasedConfig): +class InvaldCharsConfig(): """Auslesen der Zusatzinformationen die aus dem Änderungsindex abgeleitet werden""" - def __init__(self, config_dir='.', config_file='ERP_Item.ini'): - super().__init__(config_dir, config_file) + def __init__(self, config_dir='.', config_file='InvalidCharacters.txt'): + self.config_path = os.path.join(config_dir, config_file) + if not os.path.exists(self.config_path): + raise Exception("path does not exist") + self._isInitalized = False + file = open(self.config_path,'r') + line = file.read() + line = line.rstrip() + self._characters = line.split(',') + + def get(self): + return self._characters + class Configs: """Sammlung aller Configdateien """ @@ -466,13 +477,12 @@ class Configs: self.Pfade = PfadConfig(cfg_dir) self.Werkstoffe = WerkstoffeConfig(cfg_dir) self.Zusatz = ZusatzConfig(cfg_dir) - self.ERP = ERPConfig(cfg_dir) + self.InvalidChars = InvaldCharsConfig(cfg_dir) self.TOSGruppen = TOSGroupsConfig(cfg_dir) self.Materialien = MaterialTransConfig(cfg_dir) self._TeileNummern = None self._blacklist = None - self._env = None def get_cfg_path(self): return self._cfg_dir @@ -482,23 +492,16 @@ class Configs: def get_data_dir(self): return self._data_dir - def set_env(self, env): - self._env = env - - def get_env(self): - if self._env: - return self._env - return None - def get_ruledesigner_ids(self): + if not self._data_dir: + raise Exception("set_data_dir not called. path not set") if not self._TeileNummern: - self._TeileNummern = RuleDesignerDatabaseConfig(self._env.data_dir).get_ruledesigner_ids() + self._TeileNummern = RuleDesignerDatabaseConfig(self._data_dir).get_ruledesigner_ids() return self._TeileNummern def get_blacklist(self): if not self._data_dir: - return None - + raise Exception("set_data_dir not called. path not set") if not self._blacklist: with open(os.path.join(self._data_dir, 'blacklist.txt')) as f: lines = f.read().splitlines()