From b0b65f0614cde6ae7a9e9209e4d115bcf0a55a3e Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 14 Feb 2024 16:07:29 +0100 Subject: [PATCH] =?UTF-8?q?gui=20um=20Selectionsbox=20f=C3=BCr=20Pfad=20zu?= =?UTF-8?q?=203D=20Modell=20erg=C3=A4nzt.=20callbacks=20der=20Kn=C3=B6pfe?= =?UTF-8?q?=20erfolgt=20jetzt=20nur=20noch=20im=20Controller.=203D-Modell?= =?UTF-8?q?=20Pflichtfeld=20implementiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cfg/Zielpfade.cfg | 11 +++++++- lib/CreoMigrateGui.py | 6 ++-- lib/caditem.py | 64 +++++++++++++++++++++++++------------------ lib/controller.py | 34 +++++++++++++++++++---- lib/gui.py | 30 ++++++++++++++------ 5 files changed, 101 insertions(+), 44 deletions(-) diff --git a/cfg/Zielpfade.cfg b/cfg/Zielpfade.cfg index e6e4378..a17768e 100644 --- a/cfg/Zielpfade.cfg +++ b/cfg/Zielpfade.cfg @@ -2,5 +2,14 @@ \\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\02_Bedarfspool \\ssg.local\freigaben\SIVAS_CAD_EDM\Schulung\Migration\02_Bedarfspool +# [3D-Modelle] +# BaugruppeSchweissbaugruppe=\\ssg.local\freigaben\Abteilungen\Entwicklung\CAD\Standards\SolidEdge\Template\DIN Metric\baugruppe.asm +# Kaufteil=\\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par +# Einzelteil=\\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par +# EinzelteilDefault=\\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\01_Rohdatenpool\ + [3D-Modelle] -\\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\01_Rohdatenpool \ No newline at end of file +BaugruppeSchweissbaugruppe=Baugruppe +Kaufteil=Kaufteil +Einzelteil=Einzelteil +EinzelteilDefault=C:\Users\m.stangl\Documents\10-Develop\CreoMigrate\work\test \ No newline at end of file diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 1743fa0..60ee142 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -7,6 +7,7 @@ from controller import Controller from manage_configs import Configs, SivasAssemblyData import argparse import os +import json from get_teilestamm import FetchSivasTeilestamm @@ -117,7 +118,7 @@ if __name__ == '__main__': model = CadItem() if args.demo: - model.from_json(demo_data) + model.from_json(json.loads(demo_data)) build_gui(model, configs) elif args.sivasid: @@ -133,7 +134,8 @@ if __name__ == '__main__': sivas_teilestamm = FetchSivasTeilestamm(sivasid, data_dir) sivas_teilestamm.fetch_from_db(args.uselocal) - sivas_teilestamm.get_unmigrated_teilstamm_csvs() + if not args.uselocal: + sivas_teilestamm.get_unmigrated_teilstamm_csvs() redids = sivas_teilestamm.get_red_ids() sad = SivasAssemblyData(data_dir, filename) parent_children = sad.get_parent_children() diff --git a/lib/caditem.py b/lib/caditem.py index 771f4b9..8683297 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -1,6 +1,7 @@ import json import pandas as pd import os +import glob class DataModel: def __init__(self): @@ -417,6 +418,9 @@ class GuiLogic(): self.call_and_set_data('cb_neuaufbau') self.call_and_set_data('cb_aus_halbzeug_neu') self.call_and_set_data('cb_halbzeugoberflaeche') + self.call_and_set_data('cb_lebenszyklus_status_neu') + self.call_and_set_data('cb_3Dmodel_neu') + def call_and_set_data(self, callbackfunc): eval('self._model.set_gui_dict(self.'+callbackfunc+'(None))') @@ -474,25 +478,17 @@ class GuiLogic(): pass elif key == 'cb_farbe_neu': ret = self.cb_farbe_neu(value) - # Aktionen - elif key == 'cb_speichern': - self._model.save_to_file() - pass - elif key == 'cb_migrieren': - pass - elif key == 'cb_zurücksetzen': - pass - elif key == 'cb_suche_asm': - pass else: raise Exception("this callback does not exist "+key) return ret def get_dependent(self, key): - """gibt die Namen der Callbacks zurück, welche nach dem Aufruf der ursprünglichen Methode wegen der Abhängigkeiten der Comboboxen anschliessend folgen sollen""" + """ gibt die Namen der Callbacks zurück, welche nach dem Aufruf der ursprünglichen Methode + wegen der Abhängigkeiten der Comboboxen anschliessend folgen sollen + """ ret = list() if key == 'cb_pdm_kategorie_neu': - ret = ['cb_neuaufbau', 'cb_aus_halbzeug_neu'] + ret = ['cb_neuaufbau', 'cb_aus_halbzeug_neu', 'cb_3Dmodel_neu'] elif key == 'cb_neuaufbau': ret = [] elif key == 'cb_aus_halbzeug_neu': @@ -539,6 +535,7 @@ class GuiLogic(): ret = [] elif key == 'cb_farbe_neu': ret = [] + # Aktionen der Knöpfe werden vom Controller verarbeitet elif key == 'cb_speichern': ret = [] elif key == 'cb_migrieren': @@ -547,6 +544,8 @@ class GuiLogic(): ret = [] elif key == 'cb_suche_asm': ret = [] + elif key == 'cb_3dsuchen': + ret = [] else: raise Exception("this callback does not exist "+key) return ret @@ -611,7 +610,7 @@ class GuiLogic(): ret['lebenszyklus_status_neu'] = lstatus[0] ret['cb_lebenszyklus_status_neu'] = lstatus else: - ret['cb_lebenszyklus_status_neu'] = selected + ret['lebenszyklus_status_neu'] = selected return ret def cb_halbzeugfarbe(self, selected): @@ -646,40 +645,51 @@ class GuiLogic(): def cb_3Dmodel_neu(self, selected): ret = dict() pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + pfad = self._config.Pfade.get('3D-Modelle', 'BaugruppeSchweissbaugruppe') + + pfad = '' if pdm_kategorie_neu == "Baugruppe" or pdm_kategorie_neu == "Schweissbaugruppe": - # Defaultwert = \\ssg.local\freigaben\Abteilungen\Entwicklung\CAD\Standards\SolidEdge\Template\DIN Metric\baugruppe.asm + pfad = self._config.Pfade.get('3D-Modelle', 'BaugruppeSchweissbaugruppe') + ret['cb_3Dmodel_neu'] = [pfad] # Dropdownwerte = keine # state_ComboBox = disabled # state_Button = disabled - # ret = { - # '': '', - # '': '', - # } - pass elif pdm_kategorie_neu == "Kaufteil": - # Defaultwert = \\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par + pfad = self._config.Pfade.get('3D-Modelle', 'Kaufteil') + ret['cb_3Dmodel_neu'] = [pfad] # Dropdownwerte = keine # state_ComboBox = disabled # state_Button = disabled - pass elif pdm_kategorie_neu == "Einzelteil": aus_halbzeug = self._model.get_gui_data("aus_halbzeug_neu") neuaufbau = self._model.get_gui_data("neuaufbau") if aus_halbzeug == "True" or neuaufbau == "True": - # Defaultwert = \\ssg.local\freigaben\SIVAS_CAD_EDM\Migration\06_3D_Vorlagen\ET_mit_Volumen.par + pfad = self._config.Pfade.get('3D-Modelle', 'Einzelteil') + ret['cb_3Dmodel_neu'] = [pfad] # Dropdownwerte = keine # state_ComboBox = disabled # state_Button = disabled - pass else: - # Defaultwert = "" + search_path = self._config.Pfade.get('3D-Modelle', 'EinzelteilDefault') + itemid = str(self._model.get_current_item_id()) + pfade = [] + for root, dirnames, filenames in os.walk(search_path): + pfade.extend(glob.glob(root + "/"+itemid+".par")) + for root, dirnames, filenames in os.walk(search_path): + pfade.extend(glob.glob(root + "/"+itemid+".asm")) # Dropdownwerte = Dateipfade von allen .par-Dateien, die die aktuelle Teilenummer im Dateinamen aufweisen und sich gleichzeitig in einem der rekursiv durchsuchten Pfade aus der Sektion "3D-Modelle" in "Zielpfade.cfg" befinden. # state_ComboBox = readonly # state_Button = keiner + ret['cb_3Dmodel_neu'] = pfade + if len(pfade) == 0: + pfad ="" + else: + pfad = pfade[0] - # IF Button "Durchsuchen" geklickt und benutzerdefinierte Solid Edge-Datei gewählt: - # Defaultwert = Dateipfad der gewählten Solid Edge-Datei - pass + if selected is None: + ret['model3d_neu'] = pfad + else: + ret['model3d_neu'] = selected return ret diff --git a/lib/controller.py b/lib/controller.py index d61db4f..0b1ec78 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -161,16 +161,40 @@ class Controller(Observer): def callback(self, key, value): if not self._model: raise Exception("no model yet added") + + # Aktionen der Knöpfe + if key == 'cb_speichern': + self._model.save_to_file() + elif key == 'cb_migrieren': + pass + elif key == 'cb_zurücksetzen': + pass + elif key == 'cb_suche_asm': + pass + elif key == 'cb_3dsuchen': + self.suche_3d() - # Logik um neue Werte in Oberfläche oder Modell zu füllen - model_values = self._model.callback(key, value) - if model_values: - self.set_gui_dict(model_values) - self.refresh_gui() + # callbacks der gui zur + else: + # Logik um neue Werte in Oberfläche oder Modell zu füllen + model_values = self._model.callback(key, value) + if model_values: + self.set_gui_dict(model_values) + self.refresh_gui() # gib dem observer Bescheid, was aufgerufen wurde self.notify(self._model, key,value) self.refresh_gui() + + def suche_3d(self): + pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu") + aus_halbzeug = self._model.get_gui_data("aus_halbzeug_neu") + neuaufbau = self._model.get_gui_data("neuaufbau") + # Suche Knopf darf nur bei Einzelteilen funktionieren und wenn Halbzeug/NEuaufbau nicht angehakt sind + if pdm_kategorie_neu == "Einzelteil" and aus_halbzeug == "False" or neuaufbau == "False": + newpath = self._view.suche_3d() + self._model.set_gui_data('model3d_neu', newpath) + diff --git a/lib/gui.py b/lib/gui.py index a8c7665..cfde27d 100644 --- a/lib/gui.py +++ b/lib/gui.py @@ -52,6 +52,8 @@ class AllFrames(): def set_button_content(self, adict): pass + + class TreeView(): def __init__(self, frame, nrow=0): # a treeview @@ -325,23 +327,21 @@ class RightFramePDM(AllFrames): model3d_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=3, pady=3) self.model3d_neu = tk.StringVar() self.model3d_combo = ttk.Combobox(frame, textvariable=self.model3d_neu) - self.model3d_combo['values'] = ['pfad1 Teilenummer in Dateinamen','pfad2 Teilenummer in Dateinamen'] self.model3d_combo['state'] = 'readonly' self.model3d_combo.bind('<>', lambda event:self.callback('cb_3Dmodel_neu', self.model3d_neu.get())) - self.model3d_combo.grid(column=col_left+1, columnspan=2, row=self.rownum, sticky=tk.W, padx=3, pady=3) - #toplevel = tk.Toplevel() - #toplevel.title("search Window") - #filename = filedialog.askopenfilename( - # parent=toplevel, - # title="Browse File" - #) + self.model3d_combo.grid(column=col_left+1, columnspan=2, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 + #lambda: self.callback("cb_speichern", None) + suche3d_button = ttk.Button(frame, text="Durchsuchen..", command=lambda: self.callback("cb_3dsuchen", None)) + suche3d_button.grid(column=col_left+2, row=self.rownum, sticky=tk.EW) + self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=3, pady=3) self.rownum += 1 + def get_database_str(self): if self.datenbank.get() == 1: datenbank = "produktiv" @@ -1281,7 +1281,19 @@ class App(): def OnMouseWheel(self,event): self.canvas.yview("scroll", event.delta, "units") return "break" - + + def suche_3d(self): + """create a new window with the file search dialog""" + toplevel = tk.Toplevel() + toplevel.title("search Window") + selected = filename = filedialog.askopenfilename( + parent=toplevel, + initialdir= os.getcwd(), + title="please select .par or .asm file", + filetypes=[("Part-Dokumente", ".par"), ("Assembly-Dokumente", ".asm")] + ) + toplevel.destroy() + return selected if __name__ == "__main__":