In CreoMigrate (GUI-Applikation) können nun auch Teilenummern ohne Stückliste migriert werden. Hierfür wurde in Methode 'get_csv_files_of_asm' von 'controller.py' ein Aufruf der Methode 'extend_asm_bom' aus der Klasse 'SivasBOM' in 'manage_configs.py' ergänzt. Innerhalb der Methode wird die angegebene Teilenummer aus dem Eingabefeld in der GUI, d.h. die Hauptnummer in die Stücklistendaten aufgenommen - standardmäßig ist sie nicht enthalten. Als Oberbaugruppe dieser Nummer wird dabei die fiktive Baugruppe 'None' definiert. Durch diese Ergänzung in den Stücklistendaten wird eine Teilenummer ohne Stückliste also selbst zu einem Bestandteil der fiktiven Baugruppe 'None'. Somit wird also wie bisher nur mit Baugruppen gearbeitet, wodurch die Grundlogik zur Erstellung des Treeviews im Programm gleich bleibt. Lediglich die Vorgehensweise, wenn parent = 'None' gilt musste in den Treeview-Methoden angepasst werden. Im Zuge dessen wurde auch die Methode '_has_childs' der Treeview-Klasse in 'gui.py' angepasst, um sie effizienter zu machen. Konkret wird nun nicht mehr jedes mal durch das parent_children_mapping-dict gelooped werden, um herauszufinden, ob die angegebene Nummer enthalten ist. Da alle Nummern, die als Key in genanntem Dict vorliegen immer Kinder haben muss stattdessen nur geprüft werden, ob die Nummer als Key vorliegt.

This commit is contained in:
2025-04-20 17:40:52 +02:00
parent f01f08cda9
commit 2a601ec3c1
2 changed files with 26 additions and 26 deletions
+14 -13
View File
@@ -2,7 +2,7 @@ import os
from tkinter import messagebox from tkinter import messagebox
import update_database import update_database
from manage_configs import SivasBOM, RuleDesignerDatabaseConfig, MigrationStatus from manage_configs import SivasBOM, SivasTeilestamm, RuleDesignerDatabaseConfig, MigrationStatus
""" """
Contains the logic for the MVC of CreoMigrate Gui Contains the logic for the MVC of CreoMigrate Gui
@@ -115,26 +115,27 @@ class Controller(Observer):
orange[red] = True orange[red] = True
return orange return orange
def get_csv_files_of_asm(self, asm_id, load_local_asm_json, load_local_rd_dbase): def get_csv_files_of_asm(self, asm_id, load_local_asm_json=False, load_local_rd_dbase=False):
""" Holt sich die Metadaten der Stücklistenpositionen als CSV""" """ Holt sich die Metadaten der Stücklistenpositionen als CSV"""
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")
asm_data = SivasBOM(data_dir, asm_id + '.json', load_local_asm_json) sivas_bom = SivasBOM(data_dir, asm_id + '.json', load_local_asm_json)
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_dbase) rd_data = RuleDesignerDatabaseConfig(data_dir, rd_dbase_filename, load_local_rd_dbase)
migration_status = MigrationStatus(asm_data.child_ids, rd_data.ids)
if not load_local_asm_json: migration_status = MigrationStatus(sivas_bom.child_ids, rd_data.ids)
try: pending_ids = migration_status.ids_pending
update_database.get_sivas_teilestamm(migration_status.ids_pending, data_dir)
except:
self.message_error('Abfrage hat nicht funktioniert', 'sivas_db_error')
return
self._model.set_red_ids(migration_status.ids_pending) sivas_teilestamm = SivasTeilestamm(data_dir, asm_id + '.csv')
self._model.set_parent_children(asm_data.parent_children) sivas_teilestamm.create_csvs(pending_ids)
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_asm_id(asm_id)
self._model.set_bom_properties(asm_data.all_bom_properties) self._model.set_bom_properties(sivas_bom.all_bom_properties)
def set_model(self, model): def set_model(self, model):
self._model = model self._model = model
+11 -12
View File
@@ -55,10 +55,7 @@ class AllFrames():
class TreeView(): class TreeView():
def __init__(self, frame, nrow=0): def __init__(self, frame, nrow=0):
# a treeview # a treeview
# hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=65) # 'height' steuert Anzahl der sichtbaren Zeilen im Baum
self.tree = ttk.Treeview(frame, height=65)
# TODO hier anstatt root die Statistik rein schreiben.
#self.tree.heading('#0', text='root', anchor=tk.W)
self.tree.grid(row=nrow, column=0, sticky=tk.NSEW) self.tree.grid(row=nrow, column=0, sticky=tk.NSEW)
# add a scrollbar # add a scrollbar
@@ -75,7 +72,9 @@ class TreeView():
done_items = set() done_items = set()
undone_items = set() undone_items = set()
for parent,children in parent_children_mapping.items(): for parent,children in parent_children_mapping.items():
if parent in red_ids: if parent is None:
pass
elif parent in red_ids:
undone_items.add(parent) undone_items.add(parent)
else: else:
done_items.add(parent) done_items.add(parent)
@@ -108,18 +107,16 @@ class TreeView():
self.tree.delete(c) self.tree.delete(c)
def _has_childs(self, sid, parent_children_mapping): def _has_childs(self, sid, parent_children_mapping):
'''gibt zurück ob sid ein ein Zwischenknoten eines Baume ist, also kein Blatt hat''' '''gibt zurück ob sivas-id ein Zwischenknoten eines Baume ist, also kein Blatt hat'''
for parent,children in parent_children_mapping.items(): return True if sid in parent_children_mapping else False
if sid == parent:
return True
return False
def create(self, parent_children_mapping, red_ids, orange_ids): def create(self, parent_children_mapping, red_ids, orange_ids):
pool = dict() pool = dict()
self.set_heading_text(parent_children_mapping, red_ids)
for parent, children in parent_children_mapping.items(): for parent, children in parent_children_mapping.items():
# parent erzeugen, falls es diese nicht schon gibt (check der pool ids) # parent erzeugen, falls es diese nicht schon gibt (check der pool ids)
if parent not in pool: if parent is None:
parent_id = None
elif parent not in pool:
if parent not in red_ids: rowtags = ('good') if parent not in red_ids: rowtags = ('good')
elif parent in orange_ids: rowtags = ('orange') elif parent in orange_ids: rowtags = ('orange')
else: rowtags = ('missing') else: rowtags = ('missing')
@@ -148,6 +145,8 @@ class TreeView():
child_id = self.tree.insert('', tk.END, text=child, tags=rowtags, open=True) child_id = self.tree.insert('', tk.END, text=child, tags=rowtags, open=True)
pool[child] = child_id # hier werden die keys - sivas Nummern auch überschrieben pool[child] = child_id # hier werden die keys - sivas Nummern auch überschrieben
self.trid2sivasId[child_id] = child # merken der eindeutigen Zuordnung für den späteren Doppelklick self.trid2sivasId[child_id] = child # merken der eindeutigen Zuordnung für den späteren Doppelklick
if parent_id is not None:
self.tree.move(child_id, parent_id, 'end') self.tree.move(child_id, parent_id, 'end')
# https://www.askpython.com/python-modules/tkinter/tkinter-colors # https://www.askpython.com/python-modules/tkinter/tkinter-colors