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

This commit is contained in:
2025-07-11 22:28:54 +02:00
parent 95fb80dd57
commit cf4b632cba
3 changed files with 58 additions and 40 deletions
+6 -6
View File
@@ -8,10 +8,10 @@ Dispoinaktiv=ACHTUNG BG mit dispoinaktiven Stücklistenpositionen. Es wird keine
[ComboTextblöcke] [ComboTextblöcke]
KleinbuchstabeTruemmer=ACHTUNG Index in Sivas mit Kleinbuchstaben + Trümmerbaugruppe. Ausführliche Informationen zu erforderlichen Tätigkeiten / potentiellen Fehlern vgl. Konstruktionsrichtlinien 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 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 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 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 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 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. 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: ;Nachfolgende Kombinationen können nicht auftreten:
;- BlacklistWerkstoffdiskrepanz ;- BlacklistBGWerkstoffdiskrepanz
;- KleinbuchstabeTruemmerWerkstoffdiskrepanz ;- KleinbuchstabeTruemmerWerkstoffdiskrepanz
;- KleinbuchstabeBlacklistWerkstoffdiskrepanz ;- KleinbuchstabeBlacklistBGWerkstoffdiskrepanz
;- TruemmerBlacklistWerkstoffdiskrepanz= ;- TruemmerBlacklistBGWerkstoffdiskrepanz
;- KleinbuchstabeTruemmerBlacklistWerkstoffdiskrepanz= ;- KleinbuchstabeTruemmerBlacklistBGWerkstoffdiskrepanz
+44 -30
View File
@@ -242,6 +242,7 @@ class CadItem(DataModel):
self._read_only_items = {} self._read_only_items = {}
self._controller = None self._controller = None
self._logic = None self._logic = None
self._has_bom = None
def clear(self): def clear(self):
asm_id = self.get_asm_id() # das einzige was beim Löschen des Modells bleiben sollte, ist die übergeordnete Baugruppennummer 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: else:
return self._bom_properties[property_name] 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 # Methoden um die Verwendbarkeit einzelner Schalter auszugrauen
def set_read_only_dict(self, data:dict): def set_read_only_dict(self, data:dict):
for k,v in data: for k,v in data:
@@ -2536,53 +2545,58 @@ class GuiLogic():
return ret return ret
def cb_zusatzinfos_auto_text(self, selected): def cb_zusatzinfos_auto_text(self, selected):
ret = dict()
ret = dict()
aenderungsindex_sivas = self._model.get_gui_data("aenderungsindex_sivas") aenderungsindex_sivas = self._model.get_gui_data("aenderungsindex_sivas")
truemmer = self._model.get_gui_data("truemmer") truemmer = self._model.get_gui_data("truemmer")
ruestcode = self._model.get_gui_data("ruestcode_sivas") 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") 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: if selected is None:
text = '' text = ''
try: try:
blacklist = self._config.get_blacklist() self._config.get_blacklist()
except: except:
self._model.message_error('Blacklist nicht vorhanden', 'blacklist_not_exist') self._model.message_error('Blacklist nicht vorhanden', 'blacklist_not_exist')
return {} 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(): if aenderungsindex_sivas and aenderungsindex_sivas.islower():
matches.append("Kleinbuchstabe")
if truemmer == 'J' or ruestcode is None: if truemmer == 'J' or ruestcode is None:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeTruemmer') matches.append("Truemmer")
if teilenummer in blacklist: if werkstoffdiskr_neu:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeTruemmerBlacklist') matches.append("Werkstoffdiskrepanz")
elif teilenummer in blacklist: if dispoinaktiv:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeBlacklist') matches.append("Dispoinaktiv")
elif werkstoffdiskr_neu == True: if beistellungen:
text = self._config.Zusatz.get('ComboTextblöcke', 'KleinbuchstabeWerkstoffdiskrepanz') if aus_halbzeug:
matches.append("BlacklistHZ")
else: else:
text = self._config.Zusatz.get('EinzelTextblöcke', 'Kleinbuchstabe') matches.append("BlacklistBG")
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
# 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 ret['zusatzinfos_auto_text'] = text
else: else:
+7 -3
View File
@@ -121,9 +121,12 @@ class Controller(Observer):
data_dir = self.get_env("data") data_dir = self.get_env("data")
rd_dbase_filename = self.get_env("rd_dbase_filename") 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) 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 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) 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_red_ids(pending_ids)
self._model.set_parent_children(sivas_bom.parent_children) self._model.set_parent_children(sivas_bom.parent_children)
self._model.set_asm_id(asm_id) self._model.set_asm_id(asm_id)
self._model.set_bom_existence(bom_existence)
self._model.set_bom_properties(sivas_bom.all_bom_properties) self._model.set_bom_properties(sivas_bom.all_bom_properties)
def set_model(self, model): 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 # falls eine .json Datei davon im Work Ordner existiert, dann diese zuerst versuchen ins Modell zu laden
self._view.clear_rightframes() self._view.clear_rightframes()
self._model.clear() self._model.clear()
isok = self._model.from_json_file(self.get_env("out"), cid) saved_json_exists = self._model.from_json_file(self.get_env("out"), cid)
if isok == False: if saved_json_exists == False:
# ansonsten die .csv Datei mit den SIVAS Infos aus data holen # ansonsten die .csv Datei mit den SIVAS Infos aus data holen
loaded = self._model.sivas_data_from_csv(cid) loaded = self._model.sivas_data_from_csv(cid)
if loaded == None: if loaded == None: