gui um Selectionsbox für Pfad zu 3D Modell ergänzt. callbacks der Knöpfe erfolgt jetzt nur noch im Controller. 3D-Modell Pflichtfeld implementiert

This commit is contained in:
2024-02-14 16:07:29 +01:00
parent 5f781c513b
commit b0b65f0614
5 changed files with 101 additions and 44 deletions
+4 -2
View File
@@ -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()
+37 -27
View File
@@ -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 ="<id not found>"
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
+29 -5
View File
@@ -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)
+21 -9
View File
@@ -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('<<ComboboxSelected>>', 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__":