Compare commits
4 Commits
b7fd1da5b8
...
6c31b9fbf3
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c31b9fbf3 | |||
| f5cc53253e | |||
| cf4b632cba | |||
| 95fb80dd57 |
@@ -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
|
||||
|
||||
+96
-45
@@ -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:
|
||||
@@ -389,7 +398,7 @@ class CadItem(DataModel):
|
||||
text_neu = None
|
||||
# semikolon müssen rausfliegen
|
||||
if re.search(';', text):
|
||||
text_neu = re.sub(r"\s*;\s*", " /", text, flags=re.I)
|
||||
text_neu = re.sub(r"\s*;\s*", " / ", text, flags=re.I)
|
||||
if author:
|
||||
if text_neu:
|
||||
text_neu = '{aenderungstext} (von {author})'.format(aenderungstext=text_neu, author=author)
|
||||
@@ -477,7 +486,7 @@ class CadItem(DataModel):
|
||||
if "freigabevermerk_sivas" in translated_data:
|
||||
text = translated_data["freigabevermerk_sivas"]
|
||||
if re.search(';', text):
|
||||
translated_data["freigabevermerk_neu"] = re.sub(r"\s*;\s*", " /", text, flags=re.I)
|
||||
translated_data["freigabevermerk_neu"] = re.sub(r"\s*;\s*", " / ", text, flags=re.I)
|
||||
|
||||
# Spezial Hersteller: aus "80312 - Rehau AG & Co." wird "Rehau AG & Co."
|
||||
if "hersteller_sivas" in translated_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
@@ -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
@@ -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')
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user