Compare commits

...

4 Commits

Author SHA1 Message Date
s.steuer 6c31b9fbf3 siehe JIRA SUR-645 - Fehlendes Leerzeichen bei Ersetzung von Semikola in den Feldern 'Änderungstext' und 'Freigabevermerk' ergänzt / Logik der Feldprüfung hinsichtlich unzulässigen Zeichen überarbeitet. Konkret werden nun nicht mehr die Werte in der Spalte 'SIVAS-Werte' geprüft, wenn zusätzlich Eintragungen in der Spalte 'Überschriebene Werte' vorliegen / Ergänzend zu SUR-645 folgende Korrektur vorgenommen: Der korrigierte Text im Feld 'Freigabevermerk' (wenn Semikola im SIVAS-Text vorlagen) wurde bisher wieder gelöscht, sobald eine PDM-Kategorie ausgewählt wurde. Diese Löschung erfolgt nun nicht mehr, d.h. der überschriebene Text liegt nun auch nach Wahl der Kategorie weiterhin vor 2025-07-13 18:11:28 +02:00
s.steuer f5cc53253e siehe JIRA SUR-644 - Fehlt eine Nummer in der Blacklist wird nun bei jedem Klick auf 'Migrieren' in der GUI geprüft, ob die Nummer in der ERP_BOM.ini vorliegt. Fehlt sie, erscheint wie gewohnt die Fehlermeldung, dass die Nummer in der Datei fehlt - eine Migration erfolgt also nicht. Erst wenn die Meldung mit 'OK' bestätigt und die Nummer anschließend in die .ini-Datei hinzugefügt wurde kann die Migration mit dem nächsten Klick auf 'Migrieren' erfolgreich abgeschlossen werden. 2025-07-11 23:35:44 +02:00
s.steuer cf4b632cba Logik des Feldes 'Zusatzinformationen automatisch' überarbeitet. Konkret wurde die Erkennung der Fälle überarbeitet, bei denen Zusatzinformationen ausgegeben werden sollen. Es wird nun zunächst geprüft, ob die verschiedenen Einzelfälle, z.B. ob es sich um eine Trümmerbaugruppe handelt, auf die zu migrierende Nummer zutreffen. Ist dies der Fall wird der 'Treffer' gesammelt. Am Ende werden alle Treffer miteinander zu einem String kombiniert. Dieser kombinierte String wird anschließend in der 'Zusatzinformationen.cfg' gesucht. Bei Übereinstimmung wird der zugehörige Text aus der 'Zusatzinformationen.cfg' in das GUI-Textfeld geschrieben. Die Überarbeitung wurde durchgeführt, weil es immer mehr Fälle wurden und es mit der bisherigen Logik unübersichtlich wurde, wo der neue Fall eingefügt werden soll. Zudem entstanden Redundanzen. Die neue Logik sollte deutlich dynamischer, wartbarer und einfacher erweiterbar als die bisherige Variante sein. Es muss jedoch in der Zusatzinformationen.cfg darauf geachtet werden, dass die Optionen korrekt geschrieben werden, da das Programm sonst keine Übereinstimmung finden kann 2025-07-11 22:28:54 +02:00
s.steuer 95fb80dd57 Zeichenbegrenzung auf 45 Zeichen bei Baugruppen und Schweißbaugruppen wird nicht mehr benötigt, da Suffix '- BG' gem. Anordnung GF nicht mehr in Bezeichnungen vorliegen darf. 2025-07-11 16:38:13 +02:00
5 changed files with 125 additions and 71 deletions
+6 -6
View File
@@ -8,10 +8,10 @@ Dispoinaktiv=ACHTUNG BG mit dispoinaktiven Stücklistenpositionen. Es wird keine
[ComboTextblöcke]
KleinbuchstabeTruemmer=ACHTUNG Index in Sivas mit Kleinbuchstaben + Trümmerbaugruppe. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
KleinbuchstabeBlacklist=ACHTUNG Index in Sivas mit Kleinbuchstaben + BG mit Beistellungen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
KleinbuchstabeBlacklistBG=ACHTUNG Index in Sivas mit Kleinbuchstaben + BG mit Beistellungen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
KleinbuchstabeWerkstoffdiskrepanz=ACHTUNG Index in Sivas mit Kleinbuchstaben + Materialdiskrepanz. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
KleinbuchstabeDispoinaktiv=ACHTUNG Index in Sivas mit Kleinbuchstaben + BG mit Dispoinaktiven Stücklistenpositionen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
TruemmerBlacklist=ACHTUNG Trümmerbaugruppe + BG mit Beistellungen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
TruemmerBlacklistBG=ACHTUNG Trümmerbaugruppe + BG mit Beistellungen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
TruemmerWerkstoffdiskrepanz=ACHTUNG Trümmerbaugruppe + Materialdiskrepanz. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
TruemmerDispoinaktiv=ACHTUNG Trümmerbaugruppe + BG mit dispoinaktiven Stücklistenpositionen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
KleinbuchstabeTruemmerBlacklist=ACHTUNG Index in Sivas mit Kleinbuchstaben + Trümmerbaugruppe + BG mit Beistellungen. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien
@@ -20,8 +20,8 @@ BlacklistHZDispoinaktiv=ACHTUNG Bearbeitetes Halbzeug mit beigestellten und disp
BlacklistBGDispoinaktiv=ACHTUNG BG mit beigestellten und dispoinaktiven Stücklistenpositionen. Es wird keine Stückliste übergeben. Diese muss bei einer Änderung händisch angelegt und archiviert werden. Hierfür die Verantwortlichen für den Teilestamm informieren.
;Nachfolgende Kombinationen können nicht auftreten:
;- BlacklistWerkstoffdiskrepanz
;- BlacklistBGWerkstoffdiskrepanz
;- KleinbuchstabeTruemmerWerkstoffdiskrepanz
;- KleinbuchstabeBlacklistWerkstoffdiskrepanz
;- TruemmerBlacklistWerkstoffdiskrepanz=
;- KleinbuchstabeTruemmerBlacklistWerkstoffdiskrepanz=
;- KleinbuchstabeBlacklistBGWerkstoffdiskrepanz
;- TruemmerBlacklistBGWerkstoffdiskrepanz
;- KleinbuchstabeTruemmerBlacklistBGWerkstoffdiskrepanz
+94 -43
View File
@@ -242,6 +242,7 @@ class CadItem(DataModel):
self._read_only_items = {}
self._controller = None
self._logic = None
self._has_bom = None
def clear(self):
asm_id = self.get_asm_id() # das einzige was beim Löschen des Modells bleiben sollte, ist die übergeordnete Baugruppennummer
@@ -295,6 +296,14 @@ class CadItem(DataModel):
else:
return self._bom_properties[property_name]
def set_bom_existence(self, bom_status: bool) -> bool:
self._has_bom = bom_status
def has_bom(self) -> bool:
return self._has_bom
# Methoden um die Verwendbarkeit einzelner Schalter auszugrauen
def set_read_only_dict(self, data:dict):
for k,v in data:
@@ -651,6 +660,20 @@ class CadItem(DataModel):
if not self.get_gui_data(key_neu):
missing.append(self.key2label[key_neu])
def get_key_with_data(self, key_sivas: str, key_neu: str, key_list: list = []):
''' Vergleicht Inhalt von SIVAS-Feld und überschriebenem Feld:
- Sind nur das überschriebene oder das überschriebe und das SIVAS-Feld befüllt, wird das überschriebene zurückgegeben
- Ist nur das SIVAS-Feld befüllt, wird das SIVAS-Feld zurückgegeben
- Ist keines von beiden Feldern befüllt, wird None zurückgegeben '''
if not self.get_gui_data(key_neu):
if not self.get_gui_data(key_sivas):
return
key_list.append(key_sivas)
else:
key_list.append(key_neu)
return key_list
def check_pflichtfelder(self):
"""Allgemeine Prüfungen:
Solange nicht alle Pflichtfelder einen Wert aufweisen, muss beim Klick auf den Button "Migrieren" eine ERROR-Messagebox
@@ -754,13 +777,36 @@ class CadItem(DataModel):
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:
if key == "model3d_neu": # 3D Teil Pfad ausnehmen
continue
if key == "material_sivas": # Wert in GUI-Spalte "SIVAS-Werte in Feld "Material" nicht berücksichtigen
continue
"""
Überprüft, ob in den Eingabefeldern der GUI unzulässige Zeichen eingetragen wurden.
Die unzulässigen Zeichen sind in cfg/InvalidCharacters.txt aufgelistet.
Ursprung dieser Liste ist \\ruledesigner\RDF_Daten\Konfigurator\CustomVaulting\ERP_Item.ini -> Option "InvalidCharacters"
"""
wrongchars = {}
keys_to_check = []
# Bei diesen Feldern soll geprüft werden, ob sie einen Inhalt aufweisen. Wenn nicht, muss auch nicht geprüft werden, ob sich darin unzulässige Zeichen befinden.
check_key_for_data = ["halbzeugnummer_neu", "halbzeuglaenge_neu", "zusatzinfos_auto_text", "zusatzinfos_bendef_text"]
keys_with_data = list(filter(lambda key: self.get_gui_data(key) != "", check_key_for_data))
keys_to_check + keys_with_data
# Mapping SIVAS-Felder und Überschriebene Felder. Hier soll jeweils geprüft werden, welches der beiden einen Wert enthält.
# Wenn beide Felder einen Wert enthalten soll nur das überschriebene Feld nach unzulässigen Zeichen durchsucht werden, ansonsten das SIVAS-Feld
compare_keys_for_data = { "bezeichnung1_sivas": "bezeichnung1_neu",
"tosgruppe_sivas": "tosgruppe_neu",
"hersteller_sivas": "hersteller_neu",
"ersatzfuer_sivas": "ersatzfuer_neu",
"ersetztdurch_sivas": "ersetztdurch_neu",
"herstteilenr_sivas": "herstteilenr_neu",
"material_sivas": "material_neu",
"aenderungsindex_sivas": "aenderungsindex_neu",
"aenderungstext_sivas": "aenderungstext_neu",
"freigabevermerk_sivas": "freigabevermerk_neu",
}
for sivas_key, neu_key in compare_keys_for_data.items():
self.get_key_with_data(sivas_key, neu_key, keys_to_check)
for key in keys_to_check:
content = self.get_gui_data(key)
for c in invalid_chars:
if c in content:
@@ -787,18 +833,14 @@ class CadItem(DataModel):
def check_content(self):
"""Überprüfe die Inhalte nach Längen, Zeichenketten und korrekten Kombinationen der Eingaben"""
# Prüfung Bezeichnungslänge (darf max. 50 Zeichen betragen)
pdm_kategorie_neu = self.get_gui_data("pdm_kategorie_neu")
content = self.get_content('bezeichnung1_sivas', 'bezeichnung1_neu')
if pdm_kategorie_neu == "Baugruppe" or pdm_kategorie_neu == "Schweissbaugruppe":
if len(content) > 45:
self.message_error('Bezeichnung1 zu gross', 'bezeichnung_zu_gross_45')
return False
else:
if len(content) > 50:
self.message_error('Bezeichnung1 zu gross', 'bezeichnung_zu_gross_50')
return False
# Rüstcode und Sögeliste
# Rüstcode und Sägeliste
ruestcode = self.get_gui_data("ruestcode_sivas")
halbzeugOhneSaege_neu = self.get_gui_data("halbzeugOhneSaege_neu")
if ruestcode == "SRC Standard Rüstcode" and halbzeugOhneSaege_neu == "Sägeliste nicht benötigt":
@@ -2522,6 +2564,7 @@ class GuiLogic():
pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu")
version_sivas = str(self._model.get_gui_data("version_sivas"))
freigabe_sivas = self._model.get_gui_data("freigabevermerk_sivas")
freigabe_neu = self._model.get_gui_data("freigabevermerk_neu") # Brauchen wir für den Fall, dass der SIVAS-Freigabevermerk beim Einlesen bereits transformiert wurden, da er ein Semikolon enthielt.
if selected is None:
# Default Vorbelegung
@@ -2534,59 +2577,67 @@ class GuiLogic():
default = 'Anpassung an neues Indexsystem, Zeichnung mit Versionsnummer {version} weiterhin gültig'.format(version=version_sivas)
else:
default = '-'
else:
if freigabe_neu is not None:
default = freigabe_neu
ret['freigabevermerk_neu'] = default
else:
ret['freigabevermerk_neu'] = selected
return ret
def cb_zusatzinfos_auto_text(self, selected):
ret = dict()
ret = dict()
aenderungsindex_sivas = self._model.get_gui_data("aenderungsindex_sivas")
truemmer = self._model.get_gui_data("truemmer")
ruestcode = self._model.get_gui_data("ruestcode_sivas")
teilenummer = str(self._model.get_gui_data("teilenummer"))
werkstoffdiskr_neu = self._model.get_gui_data("werkstoffdiskr_neu")
aus_halbzeug_neu = self._model.get_gui_data("aus_halbzeug_neu")
aus_halbzeug = self._model.get_gui_data("aus_halbzeug_neu")
bom_exists = self._model.has_bom()
beistellungen = False
dispoinaktiv = False
if bom_exists:
beistellungen = "True" in self._model.get_bom_properties("Lieferantenbeistellung").values()
dispoinaktiv = "False" in self._model.get_bom_properties("Dispoaktiv").values()
# Liest Optionsnamen aus 'Zusatzinformationen.cfg'
cfg_single_options = dict.fromkeys(self._config.Zusatz.get_section_options("EinzelTextblöcke"), "EinzelTextblöcke")
cfg_combo_options = dict.fromkeys(self._config.Zusatz.get_section_options("ComboTextblöcke"), "ComboTextblöcke")
all_cfg_options = cfg_single_options | cfg_combo_options
if selected is None:
text = ''
try:
blacklist = self._config.get_blacklist()
self._config.get_blacklist()
except:
self._model.message_error('Blacklist nicht vorhanden', 'blacklist_not_exist')
return {}
# Prüft, ob einer der nachfolgenden Fälle auf die Teilenummer zutrifft, die im Moment migriert wird
matches = []
if aenderungsindex_sivas and aenderungsindex_sivas.islower():
matches.append("Kleinbuchstabe")
if truemmer == 'J' or ruestcode is None:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeTruemmer')
if teilenummer in blacklist:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeTruemmerBlacklist')
elif teilenummer in blacklist:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeBlacklist')
elif werkstoffdiskr_neu == True:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeWerkstoffdiskrepanz')
matches.append("Truemmer")
if werkstoffdiskr_neu:
matches.append("Werkstoffdiskrepanz")
if dispoinaktiv:
matches.append("Dispoinaktiv")
if beistellungen:
if aus_halbzeug:
matches.append("BlacklistHZ")
else:
text = self._config.Zusatz.get('EinzelTextblöcke', 'Kleinbuchstabe')
text = text.format(aenderungsindex=aenderungsindex_sivas)
elif truemmer == 'J' or ruestcode is None:
if teilenummer in blacklist:
text = self._config.Zusatz.get('ComboTextblöcke', 'TruemmerBlacklist')
elif werkstoffdiskr_neu == True:
text = self._config.Zusatz.get('ComboTextblöcke', 'TruemmerWerkstoffdiskrepanz')
else:
text = self._config.Zusatz.get('EinzelTextblöcke', 'Truemmer')
elif teilenummer in blacklist:
if aus_halbzeug_neu:
text = self._config.Zusatz.get('EinzelTextblöcke', 'BlacklistHZ')
else:
text = self._config.Zusatz.get('EinzelTextblöcke', 'BlacklistBG')
elif werkstoffdiskr_neu == True:
text = self._config.Zusatz.get('EinzelTextblöcke', 'Werkstoffdiskrepanz')
else:
pass
matches.append("BlacklistBG")
# Sucht sich die zutreffende Option aus der "Zusatzinformationen.cfg", die mit den gefundenen Fällen übereinstimmen
# heraus und gibt den Optionstext zurück. Bei fehlender Übereinstimmung wird kein Text geschrieben
if len(matches) > 0:
match_len = len("".join(matches))
for option in all_cfg_options:
if all(match in option for match in matches) and len(option) == match_len:
text = self._config.Zusatz.get(all_cfg_options[option], option)
break
ret['zusatzinfos_auto_text'] = text
else:
+13 -6
View File
@@ -121,9 +121,12 @@ class Controller(Observer):
data_dir = self.get_env("data")
rd_dbase_filename = self.get_env("rd_dbase_filename")
excluded_bom_ids = self._config.bom_config.get_excluded_ids("ExcludedPartnumbersInBOM")
excluded_bom_ids = self._config.bom_config.get_excluded_ids("ExcludedPartnumbersInBOM") # Artikelnummern wie z.B. "MA0000006" sollen nicht im Baum dargestellt werden
sivas_bom = SivasBOM(asm_id, data_dir, asm_id + '.json', load_local_bom, excluded_bom_ids)
bom_existence = False if not sivas_bom.bom_data else True
sivas_bom.extend_asm_bom(asm_id, {"Parent": None, "Position": "10/0"}) # Ergänzt Stücklistendaten um eine fiktive Baugruppe "None", in der die Haupt-Teilenummer als Pos. 1 vorliegt. Dadurch können auch Teilenummern ohne Stückliste korrekt abgebildet werden
rd_data = RuleDesignerDatabaseConfig(data_dir, rd_dbase_filename, load_local_rd_ids)
@@ -137,6 +140,7 @@ class Controller(Observer):
self._model.set_red_ids(pending_ids)
self._model.set_parent_children(sivas_bom.parent_children)
self._model.set_asm_id(asm_id)
self._model.set_bom_existence(bom_existence)
self._model.set_bom_properties(sivas_bom.all_bom_properties)
def set_model(self, model):
@@ -184,8 +188,8 @@ class Controller(Observer):
# falls eine .json Datei davon im Work Ordner existiert, dann diese zuerst versuchen ins Modell zu laden
self._view.clear_rightframes()
self._model.clear()
isok = self._model.from_json_file(self.get_env("out"), cid)
if isok == False:
saved_json_exists = self._model.from_json_file(self.get_env("out"), cid)
if saved_json_exists == False:
# ansonsten die .csv Datei mit den SIVAS Infos aus data holen
loaded = self._model.sivas_data_from_csv(cid)
if loaded == None:
@@ -283,14 +287,16 @@ class Controller(Observer):
elif key == 'cb_zurücksetzen':
self.zuruecksetzen()
elif key == 'cb_suche_asm':
# kopiere Blacklist von Server
# hole dir die in die GUI eingetragene Nummer
update_database.get_blacklist(self.get_env("data"))
# hole dir den in die gui eingetragene Nummer
current_asmid = self.data_from_view('asm_id')
if current_asmid != '':
self.set_current_asm_id(current_asmid)
elif key == 'cb_ladelokal_asm':
# hole dir nur die lokalen Daten. Keine Datenbankabfrage außer Blacklist
update_database.get_blacklist(self.get_env("data"))
current_asmid = self.data_from_view('asm_id')
# hole dir nur die lokalen Daten. Keine Datenbankabfrage
if current_asmid != '':
self.set_current_asm_id(current_asmid, load_local_bom=True, load_local_teilestamm=True, load_local_rd_ids=True)
elif key == 'cb_3dsuchen':
self.suche_3d()
@@ -318,6 +324,7 @@ class Controller(Observer):
return
# Pruefung ob assembly-id in Blacklist fehlt
update_database.get_blacklist(self.get_env("data"))
(ok, missing_blacklist_id) = self._model.check_blacklist_completeness()
if ok == False:
id = ''.join(missing_blacklist_id)
+1 -3
View File
@@ -595,10 +595,8 @@ class RightFrameBezeichnung(AllFrames):
def trace_bezeichnung_neu(self, var, index, mode):
""" Spezial: Bei zu langem Eintrag die Farbe des Textes auffällig machen """
text = self.bezeichnung1_neu.get()
if len(text) < 45:
if len(text) < 51:
self.bezeichnung1_neu_entry.configure(foreground='black')
elif len(text) < 51:
self.bezeichnung1_neu_entry.configure(foreground='orange')
else:
self.bezeichnung1_neu_entry.configure(foreground='red')
-2
View File
@@ -806,7 +806,6 @@ class Configs:
self.Materialien = MaterialTransConfig(cfg_dir)
self.bom_config = BOMConfig(cfg_dir)
self._teilenummern = None
self._blacklist = None
def get_cfg_path(self):
return self._cfg_dir
@@ -826,7 +825,6 @@ class Configs:
def get_blacklist(self):
if not self._data_dir:
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()
self._blacklist = lines