From 32146a041900b80d9dab7ad4754a3d13ac1d58e9 Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 10 Jan 2024 13:46:36 +0100 Subject: [PATCH 01/12] =?UTF-8?q?erste=20Versuche=20f=C3=BCr=20die=20Gui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/gui.bat | 6 + lib/CreoMigrateGui.py | 251 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 257 insertions(+) create mode 100644 bin/gui.bat create mode 100644 lib/CreoMigrateGui.py diff --git a/bin/gui.bat b/bin/gui.bat new file mode 100644 index 0000000..3d01e5f --- /dev/null +++ b/bin/gui.bat @@ -0,0 +1,6 @@ +@echo off +CALL cremig_setenv.bat +IF NOT EXIST %CREMIG%\.venv CALL %CREMIG_BIN%\install_py.bat +CALL %CREMIG%\.venv\Scripts\activate.bat +python %CREMIG_LIB%\CreoMigrateGui.py %* +deactivate diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py new file mode 100644 index 0000000..b368b6a --- /dev/null +++ b/lib/CreoMigrateGui.py @@ -0,0 +1,251 @@ +import tkinter as tk +from tkinter import ttk +#import logging + + +#logger = logging.getLogger(__name__) + + +red_ids = ( '400102274', '400102275', '400102190', '400102198', + '400102161', '400102277', '400102163', '400102278', + '400102282', '400102284', '400102195', 'MA0000008', + 'MA0000004', '929055170', '400102267', '400102235', + '400102236', 'MA0000006', '400102237', '400102238', + '400102239', '400102268', '829416159', '924031058', + '924031081', '822064091', '822066199', '822066200') + +parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', + '400102161', '400102163', '400102165', + '400102166', '400102167', '400102168', + '400102190', '400102195', '400102198', + '400102246', '400102247', '400102267', + '400102272', '400102274', '400102275', + '400102277', '400102278', '400102282', + '400102284', '400102417', '720002003', + '721001034', '821114025', '822064091', + '822066085', '822996075', '829416061', + '829516004', '911021113', '911021181', + '911021259', '911091054', '911091096', + '911091097', '911251013', '912011009', + '919050006', '924031058', + '924031081'], + '400102282': ['822066026', '822066089', '919010052'], + '400102195': [ '822066075', '822066216', + '822066154', '822066101', '822064090', + '822066196', '400102129', '822066217', + '822066160', '822066215', '913041045', + '913011009', '911011057', '822064035', + '925011006', '911091041', '913051040', + '911021112', '911021166', '825006003', + '912041005', '911011014', '911011009', + '911021144', '911021001', '913011016', + '929055170', '913011010', '911021035', + '829416065', '712000151', + '712000100'], + '822066075': ['822066157', '822066162', '911261023'], + '822066162': [ '822064013'], + '822066196': ['MA0000008'], + '822066160': ['MA0000004'], + '822064035': ['822066065'], + '822064093': ['822066204', '822066205', '822066206', '822066207', '822066208'], + '822066220': ['924031033'], + '822064091': ['822066212', '822064093', '822066220', + '822066200', '912011010', '911021156', + '822066201', '911071027', '913011109', + '911011070', '913011001', '710005021', + '919010055', '720000008', '720000007'], + '400102267': ['400102235', '829416159', '829416077', + '829416079', '911021260', '911021147', + '911251014'], + '400102235': ['400102236', '400102237', '400102238', + '400102239', '400102268', '911021143', + '911021054', '911021055'], + '400102236': ['MA0000006'], + '829416159': ['829416089'], + '400102130': ['400102142'], + '821116004': ['822026004'], + '400102168': ['821116001'], + '821114025': ['911081007', '821116053'], + '400102167': ['821116004']} + + + +""" using the MVC Pattern + - The model is responsible for managing the data of the application. It + receives user input from the controller. + - The view renders presentation of the model in a particular format. + - The controller responds to the user input and performs interactions on the + data model objects. The controller receives the input, optionally validates + it and then passes the input to the model. +""" +class Model(): + def __init__(self): + pass + def set_tree_data(self, red_ids, parent_children_mapping): + self.red_ids = red_ids + self.parent_children_mapping = parent_children_mapping + def get_red_ids(self): + return self.red_ids + def get_parent_children(self): + return self.parent_children_mapping + def load(): + pass + def save(): + pass + +class Controller(): + def __init__(self): + pass + +class View(): + def __init__(self): + pass + + +class TreeView(): + def __init__(self, frame): + # a treeview + self.tree = ttk.Treeview(frame) + # TODO hier anstatt root die Statistik rein schreiben. + self.tree.heading('#0', text='root', anchor=tk.W) + + def set_red_ids(self, red_ids): + self.red_ids = red_ids + + def set_parent_children(self, parent_children_mapping): + self.parent_children_mapping = parent_children_mapping + + def clear(self): + self.tree.clipboard_clear() + + def create(self): + # adding data of first column after root + pool = set() + for parent,children in self.parent_children_mapping.items(): + if parent not in pool: + self.tree.insert('', tk.END, text=parent, iid=parent, open=True) + pool.add(parent) + cn = children + # sortiere die Zahlen im Baum immer aufsteigend + cn.sort(reverse=True) + for child_id in cn: + if child_id not in pool: + pool.add(child_id) + if child_id not in self.red_ids: rowtags = ('good') + else: rowtags = ('missing') + self.tree.insert('', tk.END, text=child_id, iid=child_id, tags=rowtags, open=True) + #self.tree.move(child_id, parent, 0) + + # einmal über alles gehen und alle keys an die richtige Stelle schieben + for parent,children in self.parent_children_mapping.items(): + for child_id in children: + self.tree.move(child_id, parent, 0) + + # https://www.askpython.com/python-modules/tkinter/tkinter-colors + #self.tree.tag_configure('good', background='LawnGreen') + self.tree.tag_configure('good', background='white') + self.tree.tag_configure('missing', background='red') + + # place the Treeview widget on the root window + self.tree.grid(row=0, column=0, sticky=tk.NSEW) + + +class PanedWindow(): + """Hauptfenster zweiteilen, um die Grösse rechts oder links zu verschieben""" + def __init__(self, frame): + self.pw = ttk.PanedWindow(frame, orient=tk.HORIZONTAL) + + # Left listbox + left_list = tk.Listbox(frame) + left_list.pack(side=tk.LEFT) + self.pw.add(left_list) + self.left_list = left_list + + # Right listbox + right_list = tk.Listbox(frame) + right_list.pack(side=tk.LEFT) + self.pw.add(right_list) + self.right_list = right_list + + def get_handle(self): + return self.pw + + def get_left(self): + return self.left_list + + def get_right(self): + return self.right_list + + +class App(): + def __init__(self, root): + + self.root = root + + self.root.geometry('500x700') + + style = ttk.Style(self.root) + style.theme_use('classic') + + # style.configure('Error.TLabel', foreground='white') + # style.configure('Error.TLabel', background='red') + # style.configure('Error.TLabel', font=('Helvetica', 12)) + # style.configure('Error.TLabel', padding=(10, 10)) + + # paned window + self.pw = PanedWindow(self.root) + self.tv = TreeView(self.root) + + left_list = self.pw.get_left() + right_list = self.pw.get_right() + # left_list.pack(side=tk.LEFT) + # right_list.pack(side=tk.LEFT) + + # place the panedwindow on the root window + pw = self.pw.get_handle() + pw.pack(fill=tk.BOTH, expand=True) + + message = 'This is an error message!' + label = ttk.Label(right_list, text=message, style='Error.TLabel') + label.pack(expand=True) + + def set_tree_data(self, red_ids, parent_children_mapping): + self.red_ids = red_ids + self.parent_children_mapping = parent_children_mapping + self.tv.set_red_ids(self.red_ids) + self.tv.set_parent_children(self.parent_children_mapping) + self.tv.create() + + def mainloop(self): + self.root.mainloop() + + +# class Navbar(tk.Frame): ... +# class Toolbar(tk.Frame): ... +# class Statusbar(tk.Frame): ... +# class Main(tk.Frame): ... + +# class MainApp(tk.Frame): + # def __init__(self, parent, *args, **kwargs): + # tk.Frame.__init__(self, parent, *args, **kwargs) + # self.statusbar = Statusbar(self, ...) + # self.toolbar = Toolbar(self, ...) + # self.navbar = Navbar(self, ...) + # self.main = Main(self, ...) + + # self.statusbar.pack(side="bottom", fill="x") + # self.toolbar.pack(side="top", fill="x") + # self.navbar.pack(side="left", fill="y") + # self.main.pack(side="right", fill="both", expand=True) + +if __name__ == "__main__": + #logging.basicConfig(level=logging.DEBUG) + model = Model() + model.set_tree_data(red_ids, parent_children_mapping) + + controller = Controller() + + root = tk.Tk() + app = App(root) + app.set_tree_data(model.get_red_ids(), model.get_parent_children()) + app.mainloop() From 75deb57548110b3fe6033541f73bb21dd36758db Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 10 Jan 2024 16:12:23 +0100 Subject: [PATCH 02/12] weiterer Protyp des gesamtfensters --- lib/CreoMigrateGui.py | 233 +++++++++++++++++++++++++----------------- 1 file changed, 139 insertions(+), 94 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index b368b6a..124bf12 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -70,37 +70,6 @@ parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', -""" using the MVC Pattern - - The model is responsible for managing the data of the application. It - receives user input from the controller. - - The view renders presentation of the model in a particular format. - - The controller responds to the user input and performs interactions on the - data model objects. The controller receives the input, optionally validates - it and then passes the input to the model. -""" -class Model(): - def __init__(self): - pass - def set_tree_data(self, red_ids, parent_children_mapping): - self.red_ids = red_ids - self.parent_children_mapping = parent_children_mapping - def get_red_ids(self): - return self.red_ids - def get_parent_children(self): - return self.parent_children_mapping - def load(): - pass - def save(): - pass - -class Controller(): - def __init__(self): - pass - -class View(): - def __init__(self): - pass - class TreeView(): def __init__(self, frame): @@ -109,19 +78,13 @@ class TreeView(): # TODO hier anstatt root die Statistik rein schreiben. self.tree.heading('#0', text='root', anchor=tk.W) - def set_red_ids(self, red_ids): - self.red_ids = red_ids - - def set_parent_children(self, parent_children_mapping): - self.parent_children_mapping = parent_children_mapping - def clear(self): self.tree.clipboard_clear() - def create(self): + def create(self, parent_children_mapping, red_ids): # adding data of first column after root pool = set() - for parent,children in self.parent_children_mapping.items(): + for parent,children in parent_children_mapping.items(): if parent not in pool: self.tree.insert('', tk.END, text=parent, iid=parent, open=True) pool.add(parent) @@ -131,13 +94,13 @@ class TreeView(): for child_id in cn: if child_id not in pool: pool.add(child_id) - if child_id not in self.red_ids: rowtags = ('good') + if child_id not in red_ids: rowtags = ('good') else: rowtags = ('missing') self.tree.insert('', tk.END, text=child_id, iid=child_id, tags=rowtags, open=True) #self.tree.move(child_id, parent, 0) # einmal über alles gehen und alle keys an die richtige Stelle schieben - for parent,children in self.parent_children_mapping.items(): + for parent,children in parent_children_mapping.items(): for child_id in children: self.tree.move(child_id, parent, 0) @@ -146,43 +109,24 @@ class TreeView(): self.tree.tag_configure('good', background='white') self.tree.tag_configure('missing', background='red') - # place the Treeview widget on the root window - self.tree.grid(row=0, column=0, sticky=tk.NSEW) - - -class PanedWindow(): - """Hauptfenster zweiteilen, um die Grösse rechts oder links zu verschieben""" - def __init__(self, frame): - self.pw = ttk.PanedWindow(frame, orient=tk.HORIZONTAL) - - # Left listbox - left_list = tk.Listbox(frame) - left_list.pack(side=tk.LEFT) - self.pw.add(left_list) - self.left_list = left_list - - # Right listbox - right_list = tk.Listbox(frame) - right_list.pack(side=tk.LEFT) - self.pw.add(right_list) - self.right_list = right_list - def get_handle(self): - return self.pw + return self.tree - def get_left(self): - return self.left_list - - def get_right(self): - return self.right_list class App(): - def __init__(self, root): + def __init__(self, root, controller): self.root = root + self.controller = controller - self.root.geometry('500x700') + # configure the grid + root.columnconfigure(0, weight=2) + root.columnconfigure(1, weight=1) + root.columnconfigure(2, weight=1) + root.columnconfigure(3, weight=1) + root.geometry('800x700') + root.resizable(0, 0) style = ttk.Style(self.root) style.theme_use('classic') @@ -192,29 +136,34 @@ class App(): # style.configure('Error.TLabel', font=('Helvetica', 12)) # style.configure('Error.TLabel', padding=(10, 10)) - # paned window - self.pw = PanedWindow(self.root) self.tv = TreeView(self.root) + self.tv.create(parent_children_mapping, red_ids) + gridhdl = self.tv.get_handle() + gridhdl.grid(row=0, column=0, rowspan=2, sticky=tk.NSEW) - left_list = self.pw.get_left() - right_list = self.pw.get_right() - # left_list.pack(side=tk.LEFT) - # right_list.pack(side=tk.LEFT) + # message = 'This is an error message!' + # label = ttk.Label(right_list, text=message, style='Error.TLabel') + self.create_widgets() - # place the panedwindow on the root window - pw = self.pw.get_handle() - pw.pack(fill=tk.BOTH, expand=True) - message = 'This is an error message!' - label = ttk.Label(right_list, text=message, style='Error.TLabel') - label.pack(expand=True) + def create_widgets(self): + # username + username_label = ttk.Label(self.root, text="Username:") + username_label.grid(column=1, row=0, sticky=tk.W, padx=5, pady=5, bg="green") - def set_tree_data(self, red_ids, parent_children_mapping): - self.red_ids = red_ids - self.parent_children_mapping = parent_children_mapping - self.tv.set_red_ids(self.red_ids) - self.tv.set_parent_children(self.parent_children_mapping) - self.tv.create() + username_entry = ttk.Entry(self.root) + username_entry.grid(column=2, row=0, sticky=tk.E, padx=5, pady=5) + + # password + password_label = ttk.Label(self.root, text="Password:") + password_label.grid(column=1, row=1, sticky=tk.W, padx=5, pady=5) + + password_entry = ttk.Entry(self.root, show="*") + password_entry.grid(column=2, row=1, sticky=tk.E, padx=5, pady=5) + + # login button + login_button = ttk.Button(self.root, text="Login") + login_button.grid(column=2, row=2, sticky=tk.E, padx=5, pady=5) def mainloop(self): self.root.mainloop() @@ -239,13 +188,109 @@ class App(): # self.main.pack(side="right", fill="both", expand=True) if __name__ == "__main__": - #logging.basicConfig(level=logging.DEBUG) - model = Model() - model.set_tree_data(red_ids, parent_children_mapping) - controller = Controller() + """ using the Model-View-Controller (MVC) Pattern + - The MODEL is responsible for managing the data of the application. It + receives user input from the CONTROLLER + - The VIEW renders presentation of the model in a particular format. + - The CONTROLLER responds to the user input and performs interactions on the + data model objects. The CONTROLLER receives the input, optionally validates + it and then passes the input to the model. + + MODEL + <-updates- ^--manipulates-- + VIEW CONTROLLER + --sees --> -- uses --> + USER + """ + class CadItem(): + """ + This item contains all data for writing all necessary data to the solid edg cad file + """ + def __init__(self, uid): + """ is initalized with its unique id""" + self.id = uid + self.red_ids = {} + self.parent_children_mapping = {} + + def set_parent_children(self, parent_children_mapping): + """ contains all id relations below, data of subassemblies etc. in + a dict of the kind parent-children + """ + self.parent_children_mapping = parent_children_mapping + def get_parent_children(self): + return self.parent_children_mapping + + def set_red_ids(self, red_ids): + """ these ids are not yet known by the PDM""" + self.red_ids = red_ids + + def get_red_ids(self): + return self.red_ids + + def load(): + pass + def save(): + pass + + + class CadItemRepository: + """ + container class for all CadItems in the local folder + also just managed by the controller + """ + def __init__(self): + self.caditems = [] + + def add(self, caditem): + self.caditems.append(caditem) + + def get(self, id): + for caditem in self.caditems: + if caditem.id == id: + return caditem + return None + + def get_all(self): + return self.caditems + + def update(self, old_item, new_item): + self.delete(old_item.id) + self.add(new_item) + raise Exception("CadItem not found") + + def delete(self, id): + for p in self.caditems: + if p.id == id: + self.caditems.remove(p) + return + raise Exception("CadItem not found") + + class Controller(): + """ + Class for manipulating the model and returning data for the view + """ + def __init__(self, model): + self.model = model + + def set_red_ids(self, red_ids): + self.red_ids = red_ids + def get_red_ids(self): + return self.red_ids + + def set_parent_children(self, parent_children_mapping): + self.parent_children_mapping = parent_children_mapping + def get_parent_children(self): + return self.parent_children_mapping + + + #logging.basicConfig(level=logging.DEBUG) + model = CadItem("400102196") + + controller = Controller(model) + controller.set_parent_children(parent_children_mapping) + controller.set_red_ids(red_ids) root = tk.Tk() - app = App(root) - app.set_tree_data(model.get_red_ids(), model.get_parent_children()) + app = App(root, controller) app.mainloop() From fcb392c2b88d2c5021ceb672f79b91f82ef989b3 Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 10 Jan 2024 18:33:16 +0100 Subject: [PATCH 03/12] =?UTF-8?q?aktueller=20Stand=20mit=20zwei=20Frames?= =?UTF-8?q?=20die=20beschickt=20werden=20k=C3=B6nnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 105 ++++++++++++++++++++-------- lib/{test.py => test_configread.py} | 0 2 files changed, 76 insertions(+), 29 deletions(-) rename lib/{test.py => test_configread.py} (100%) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 124bf12..ae9b16a 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -1,5 +1,6 @@ import tkinter as tk from tkinter import ttk +#from tkinter import messagebox #import logging @@ -74,12 +75,20 @@ parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', class TreeView(): def __init__(self, frame): # a treeview - self.tree = ttk.Treeview(frame) + # hier Anzahl der sichtbaren Zeilen des Baums angeben: + self.tree = ttk.Treeview(frame, height=40) # TODO hier anstatt root die Statistik rein schreiben. self.tree.heading('#0', text='root', anchor=tk.W) + # add a scrollbar + scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=self.tree.yview) + self.tree.configure(yscroll=scrollbar.set) + scrollbar.grid(row=0, column=1, sticky='ns') + + self.tree.bind('<>', self.item_selected) + def clear(self): - self.tree.clipboard_clear() + self.tree.delete() def create(self, parent_children_mapping, red_ids): # adding data of first column after root @@ -109,6 +118,17 @@ class TreeView(): self.tree.tag_configure('good', background='white') self.tree.tag_configure('missing', background='red') + def item_selected(self, event): + """callback if an item in the tree has been selected + """ + id = self.tree.selection()[0] + # for selected_item in self.tree.selection(): + # item = self.tree.item(selected_item) + # record = item['values'] + # messagebox.showinfo(title='Information', message=','.join(record)) + + + def get_handle(self): return self.tree @@ -121,49 +141,76 @@ class App(): self.controller = controller # configure the grid - root.columnconfigure(0, weight=2) - root.columnconfigure(1, weight=1) - root.columnconfigure(2, weight=1) - root.columnconfigure(3, weight=1) - root.geometry('800x700') - root.resizable(0, 0) + # self.root.columnconfigure(0, weight=2) + # self.root.columnconfigure(1, weight=1) + # self.root.columnconfigure(2, weight=1) + # self.root.columnconfigure(3, weight=1) + # self.root.columnconfigure(4, weight=1) + #self.root.geometry('800x800') + #self.root.resizable(0, 0) + + # Create left and right frames + left_frame = ttk.Frame(self.root, width=200, height=800) + left_frame.grid(row=0, column=0, padx=10, pady=5) + + right_frame = ttk.Frame(self.root, width=650, height=800) + right_frame.grid(row=0, column=1, padx=10, pady=5) + style = ttk.Style(self.root) style.theme_use('classic') + self.tv = TreeView(left_frame) + self.tv.create(parent_children_mapping, red_ids) + gridhdl = self.tv.get_handle() + gridhdl.grid(row=0, column=0, sticky=tk.NSEW) + + self.create_widgets(right_frame) + # style.configure('Error.TLabel', foreground='white') # style.configure('Error.TLabel', background='red') # style.configure('Error.TLabel', font=('Helvetica', 12)) # style.configure('Error.TLabel', padding=(10, 10)) - self.tv = TreeView(self.root) - self.tv.create(parent_children_mapping, red_ids) - gridhdl = self.tv.get_handle() - gridhdl.grid(row=0, column=0, rowspan=2, sticky=tk.NSEW) - # message = 'This is an error message!' - # label = ttk.Label(right_list, text=message, style='Error.TLabel') - self.create_widgets() + # error_label = ttk.Label(self.root, text=message, style='Error.TLabel') + # error_label.grid(column=2, row=3, sticky=tk.E, padx=5, pady=5) - def create_widgets(self): - # username - username_label = ttk.Label(self.root, text="Username:") - username_label.grid(column=1, row=0, sticky=tk.W, padx=5, pady=5, bg="green") + def create_widgets(self, frame): + rownum = 0 + col_left = 0 + # pdmkategorie + pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) + pdmkategorie_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + pdmkategorie_entry = ttk.Entry(frame) + pdmkategorie_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 - username_entry = ttk.Entry(self.root) - username_entry.grid(column=2, row=0, sticky=tk.E, padx=5, pady=5) + # Neuaufbau + neuaufbau_label = ttk.Label(frame, text="Neuaufbau:") + neuaufbau_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - # password - password_label = ttk.Label(self.root, text="Password:") - password_label.grid(column=1, row=1, sticky=tk.W, padx=5, pady=5) + self.neuaufbau = None + neuaufbau_checkbutton = ttk.Checkbutton(frame, + text='ja', + command=self.var_changed("neuaufbau"), + variable=self.neuaufbau, + onvalue=True, + offvalue=False) + neuaufbau_checkbutton.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 - password_entry = ttk.Entry(self.root, show="*") - password_entry.grid(column=2, row=1, sticky=tk.E, padx=5, pady=5) + # Lebenszyklusstatus + lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:") + lebenszyklusstatus_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + lebenszyklusstatus_entry = ttk.Entry(frame, show="*") + lebenszyklusstatus_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 - # login button - login_button = ttk.Button(self.root, text="Login") - login_button.grid(column=2, row=2, sticky=tk.E, padx=5, pady=5) + def var_changed(self, whichvar): + a = whichvar + b = self.neuaufbau def mainloop(self): self.root.mainloop() diff --git a/lib/test.py b/lib/test_configread.py similarity index 100% rename from lib/test.py rename to lib/test_configread.py From 95038416293f7f90abd942450e57d1ace388f482 Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 10 Jan 2024 20:42:51 +0100 Subject: [PATCH 04/12] weitere Entwiclung --- lib/CreoMigrateGui.py | 106 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 20 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index ae9b16a..52f4303 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -127,12 +127,72 @@ class TreeView(): # record = item['values'] # messagebox.showinfo(title='Information', message=','.join(record)) - - def get_handle(self): return self.tree +class RightFramePDM(): + def __init__(self, frame, controller): + self.controller = controller + rownum = 0 + col_left = 0 + # pdmkategorie + pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) + pdmkategorie_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + pdmkategorie_entry = ttk.Entry(frame) + pdmkategorie_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + + # Neuaufbau + neuaufbau_label = ttk.Label(frame, text="Neuaufbau:") + neuaufbau_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + + self.neuaufbau = None + neuaufbau_checkbutton = ttk.Checkbutton(frame, + text='ja', + command=self.var_changed("neuaufbau"), + variable=self.neuaufbau, + onvalue=True, + offvalue=False) + neuaufbau_checkbutton.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + + # Lebenszyklusstatus + lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:") + lebenszyklusstatus_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + lebenszyklusstatus_entry = ttk.Entry(frame, show="*") + lebenszyklusstatus_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + + halbzeug_label = ttk.Label(frame, text="Halbzeug:") + halbzeug_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + self.aus_halbzeug_sivas = None + aushalbzeug_checkbutton_sivas = ttk.Checkbutton(frame, + text='aus Sivas', + command=self.var_changed("aus_halbzeug_sivas"), + variable=self.aus_halbzeug_sivas, + onvalue=True, + offvalue=False) + aushalbzeug_checkbutton_sivas.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) + self.aus_halbzeug_neu = None + aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, + text='neu', + command=self.var_changed("aus_halbzeug_neu"), + variable=self.aus_halbzeug_neu, + onvalue=True, + offvalue=False) + aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + + def var_changed(self, whichvar): + if whichvar == "neuaufbau": + b = self.neuaufbau + elif whichvar == "aus_halbzeug_sivas": + b = self.aus_halbzeug_sivas + elif whichvar == "aus_halbzeug_sivas": + b = self.aus_halbzeug_neu + + class App(): def __init__(self, root, controller): @@ -141,13 +201,10 @@ class App(): self.controller = controller # configure the grid + # die erste Spalte mit Baum sollte unbeweglich bleiben bei Vergräßerung des Fensters. # self.root.columnconfigure(0, weight=2) - # self.root.columnconfigure(1, weight=1) - # self.root.columnconfigure(2, weight=1) - # self.root.columnconfigure(3, weight=1) - # self.root.columnconfigure(4, weight=1) + self.root.columnconfigure(1, weight=1) #self.root.geometry('800x800') - #self.root.resizable(0, 0) # Create left and right frames left_frame = ttk.Frame(self.root, width=200, height=800) @@ -165,16 +222,8 @@ class App(): gridhdl = self.tv.get_handle() gridhdl.grid(row=0, column=0, sticky=tk.NSEW) - self.create_widgets(right_frame) - - # style.configure('Error.TLabel', foreground='white') - # style.configure('Error.TLabel', background='red') - # style.configure('Error.TLabel', font=('Helvetica', 12)) - # style.configure('Error.TLabel', padding=(10, 10)) - - # message = 'This is an error message!' - # error_label = ttk.Label(self.root, text=message, style='Error.TLabel') - # error_label.grid(column=2, row=3, sticky=tk.E, padx=5, pady=5) + self.rf1 = RightFramePDM(right_frame, controller) + #self.create_widgets(right_frame) def create_widgets(self, frame): @@ -208,9 +257,26 @@ class App(): lebenszyklusstatus_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 - def var_changed(self, whichvar): - a = whichvar - b = self.neuaufbau + halbzeug_label = ttk.Label(frame, text="Halbzeug:") + halbzeug_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + self.aus_halbzeug_sivas = None + aushalbzeug_checkbutton_sivas = ttk.Checkbutton(frame, + text='aus Sivas', + command=self.var_changed("aus_halbzeug_sivas"), + variable=self.aus_halbzeug_sivas, + onvalue=True, + offvalue=False) + aushalbzeug_checkbutton_sivas.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) + self.aus_halbzeug_neu = None + aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, + text='neu', + command=self.var_changed("aus_halbzeug_neu"), + variable=self.aus_halbzeug_neu, + onvalue=True, + offvalue=False) + aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + def mainloop(self): self.root.mainloop() From 8e2061d8dbe544be9cb5b0ffa08ead1a9876d5c6 Mon Sep 17 00:00:00 2001 From: mistangl Date: Thu, 11 Jan 2024 11:44:20 +0100 Subject: [PATCH 05/12] =?UTF-8?q?Entries=20durch=20korrekte=20Comboboxen?= =?UTF-8?q?=20ersetzt.=20Aufruf=20des=20Controllers=20f=C3=BCr=20die=20Dat?= =?UTF-8?q?enr=C3=BCckgabe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 210 ++++++++++++++++++++++++------------------ 1 file changed, 118 insertions(+), 92 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 52f4303..0699b42 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -7,70 +7,6 @@ from tkinter import ttk #logger = logging.getLogger(__name__) -red_ids = ( '400102274', '400102275', '400102190', '400102198', - '400102161', '400102277', '400102163', '400102278', - '400102282', '400102284', '400102195', 'MA0000008', - 'MA0000004', '929055170', '400102267', '400102235', - '400102236', 'MA0000006', '400102237', '400102238', - '400102239', '400102268', '829416159', '924031058', - '924031081', '822064091', '822066199', '822066200') - -parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', - '400102161', '400102163', '400102165', - '400102166', '400102167', '400102168', - '400102190', '400102195', '400102198', - '400102246', '400102247', '400102267', - '400102272', '400102274', '400102275', - '400102277', '400102278', '400102282', - '400102284', '400102417', '720002003', - '721001034', '821114025', '822064091', - '822066085', '822996075', '829416061', - '829516004', '911021113', '911021181', - '911021259', '911091054', '911091096', - '911091097', '911251013', '912011009', - '919050006', '924031058', - '924031081'], - '400102282': ['822066026', '822066089', '919010052'], - '400102195': [ '822066075', '822066216', - '822066154', '822066101', '822064090', - '822066196', '400102129', '822066217', - '822066160', '822066215', '913041045', - '913011009', '911011057', '822064035', - '925011006', '911091041', '913051040', - '911021112', '911021166', '825006003', - '912041005', '911011014', '911011009', - '911021144', '911021001', '913011016', - '929055170', '913011010', '911021035', - '829416065', '712000151', - '712000100'], - '822066075': ['822066157', '822066162', '911261023'], - '822066162': [ '822064013'], - '822066196': ['MA0000008'], - '822066160': ['MA0000004'], - '822064035': ['822066065'], - '822064093': ['822066204', '822066205', '822066206', '822066207', '822066208'], - '822066220': ['924031033'], - '822064091': ['822066212', '822064093', '822066220', - '822066200', '912011010', '911021156', - '822066201', '911071027', '913011109', - '911011070', '913011001', '710005021', - '919010055', '720000008', '720000007'], - '400102267': ['400102235', '829416159', '829416077', - '829416079', '911021260', '911021147', - '911251014'], - '400102235': ['400102236', '400102237', '400102238', - '400102239', '400102268', '911021143', - '911021054', '911021055'], - '400102236': ['MA0000006'], - '829416159': ['829416089'], - '400102130': ['400102142'], - '821116004': ['822026004'], - '400102168': ['821116001'], - '821114025': ['911081007', '821116053'], - '400102167': ['821116004']} - - - class TreeView(): def __init__(self, frame): @@ -134,13 +70,22 @@ class TreeView(): class RightFramePDM(): def __init__(self, frame, controller): self.controller = controller + self.frame = frame + self.build_gui() + + def build_gui(self): + frame = self.frame rownum = 0 col_left = 0 # pdmkategorie pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) pdmkategorie_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - pdmkategorie_entry = ttk.Entry(frame) - pdmkategorie_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + self.pdm_category = tk.StringVar() + pdmkategorie_combo = ttk.Combobox(frame, textvariable=self.pdm_category) + pdmkategorie_combo['values'] = ["Baugruppe", "Einzelteil", "Kaufteil", "NichtSivas", "Normteil", "Schweissbaugruppe"] + pdmkategorie_combo['state'] = 'readonly' + pdmkategorie_combo.bind('<>', self.combo_callbacks) # falls nötig + pdmkategorie_combo.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 # Neuaufbau @@ -150,7 +95,6 @@ class RightFramePDM(): self.neuaufbau = None neuaufbau_checkbutton = ttk.Checkbutton(frame, text='ja', - command=self.var_changed("neuaufbau"), variable=self.neuaufbau, onvalue=True, offvalue=False) @@ -160,37 +104,56 @@ class RightFramePDM(): # Lebenszyklusstatus lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:") lebenszyklusstatus_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - lebenszyklusstatus_entry = ttk.Entry(frame, show="*") - lebenszyklusstatus_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + self.lebenszyklus_status_neu = tk.StringVar() + lebenszyklusstatus_combo = ttk.Combobox(frame, textvariable=self.lebenszyklus_status_neu) + lebenszyklusstatus_combo['values'] = ["Serie", "Prototyp"] + lebenszyklusstatus_combo['state'] = 'readonly' + lebenszyklusstatus_combo.bind('<>', self.combo_callbacks) + lebenszyklusstatus_combo.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 - halbzeug_label = ttk.Label(frame, text="Halbzeug:") + # aus Halbzeug + halbzeug_label = ttk.Label(frame, text="aus Halbzeug:") halbzeug_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - self.aus_halbzeug_sivas = None - aushalbzeug_checkbutton_sivas = ttk.Checkbutton(frame, - text='aus Sivas', - command=self.var_changed("aus_halbzeug_sivas"), - variable=self.aus_halbzeug_sivas, - onvalue=True, - offvalue=False) - aushalbzeug_checkbutton_sivas.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) self.aus_halbzeug_neu = None aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, text='neu', - command=self.var_changed("aus_halbzeug_neu"), variable=self.aus_halbzeug_neu, onvalue=True, offvalue=False) aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 - def var_changed(self, whichvar): - if whichvar == "neuaufbau": - b = self.neuaufbau - elif whichvar == "aus_halbzeug_sivas": - b = self.aus_halbzeug_sivas - elif whichvar == "aus_halbzeug_sivas": - b = self.aus_halbzeug_neu + # Zusatzinformationen + zusatzinfos_label = ttk.Label(frame, text="Zusatzinformationen:") + zusatzinfos_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + self.zusatzinfos_text = tk.StringVar() + zusatzinfos_entry = ttk.Entry(frame, textvariable=self.zusatzinfos_text) + zusatzinfos_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + return rownum + + def get_data(self): + return { + "pdm_kategorie_neu": self.pdm_category.get(), + "neuaufbau": self.neuaufbau, + "lebenszyklusstatus_neu": self.lebenszyklus_status_neu.get(), + "aus_halbzeug_neu": self.aus_halbzeug_neu, + "zusatzinfos_txt_neu": self.zusatzinfos_text.get(), + } + + def to_model(self): + data = self.get_data() + self.controller.set_data(data) + def from_model(self): + data = self.controller.get_data() + self.aus_halbzeug_neu = data["aus_halbzeug_neu"] + self.neuaufbau = data["neuaufbau"] + self.zusatzinfos_text.set(data["neuaufbau"]) + def combo_callbacks(self, event): + """ handle the changed event """ + # TODO falls nötig + pass @@ -217,6 +180,9 @@ class App(): style = ttk.Style(self.root) style.theme_use('classic') + current_id = self.controller.get_current_asm_id() + self.controller.get_parent_children() + self.controller.get_red_ids() self.tv = TreeView(left_frame) self.tv.create(parent_children_mapping, red_ids) gridhdl = self.tv.get_handle() @@ -319,12 +285,51 @@ if __name__ == "__main__": class CadItem(): """ This item contains all data for writing all necessary data to the solid edg cad file + """ - def __init__(self, uid): + # diese Daten bilden dann die Impfdaten + data_keys = [ "Author", "Teilenummer", "StartRevision", + "Bezeichnung1", "Bezeichnung2", "Bezeichnung4", "KategorieNE", + "BeschaffungsartNE", "TOS-Gruppe_ERP", "Dispogruppe", + "Dispolaufgruppe", "WerkstofftypNE", "WerkstoffNE", + "Oberflaechenbehandlung", "Farbe", "KalkulationsartNE", + "RuestcodeAusw", "Fertigungsart", "Allgemeintoleranz", + "HalbzeugInternAngabe", "Halbzeug", "HalbzeugOhneSaegeliste", + "EinheitNE", "FOS-GruppeNE", "Hersteller", "HerstellerTeilenummer", + "Serien-Status", "Kantennorm", "Oberflaechennorm", "Massnorm", + "Tolerierungsnorm", "TOS-Gruppe", "TOS_Schoenenberger_Produkt", + "TOS_Automation", "TOS_Maschinenelement", + "TOS_Schoenenberger_Komponenten", "TOS_Pneumatik", "TOS_Konfig", + "TOS_ILS", "TOS_MAS", "TOS_Spinnereikomponente", + "TOS_Betriebsmittel", "TOS_Geruest", "TOS_FremdTransport", + "TOS_MAS_Konfig", "TOS_Schaltschrank", "TOS_Schalt_Einbau", + "TOS_Dezentral", "TOS_Automation_Sensorik", "TOS_Kabel", + "TOS_Installation", "TOS_Automation_Sonstiges", + "TOS_Verbindungselement", "TOS_Lager", "TOS_Kraft_Drehmoment", + "TOS_Sicherungselement", "TOS_Bedienungselement", "TOS_ILS_2", + "TOS_ILS_Foerderer", "TOS_MAS_Fahrstecke", "TOS_Trolley", + "TOS_Trolley_Projekte", "TOS_Trolley_Omniflo", + "TOS_Trolley_Spinnerei", "TOS_Trolley_ILS", "Änderungsbeschreibung", + "Freigabevermerk", "ZusaetzlicheInformationen"] + + def __init__(self, asm_id): """ is initalized with its unique id""" - self.id = uid + self.set_asm_id(asm_id) self.red_ids = {} self.parent_children_mapping = {} + self.data = {} + self.gui_data = {} + + def set_asm_id(self, asm_id): + self.asm_id = asm_id + def get_current_asm_id(self): + return self.asm_id + + def get_current_part_id(self): + return self.prt_id + def set_part_id(self, prt_id): + self.prt_id = prt_id + def set_parent_children(self, parent_children_mapping): """ contains all id relations below, data of subassemblies etc. in @@ -341,6 +346,18 @@ if __name__ == "__main__": def get_red_ids(self): return self.red_ids + def set_data(self, data:dict): + for k,v in data: + self.set_data(k,v) + def set_data(self, key, val): + if key not in self.data_keys: + raise Exception("this data can not be set") + else: + self.data[key] = val + + def get_data(self, key): + return self.data[key] + def load(): pass def save(): @@ -386,15 +403,24 @@ if __name__ == "__main__": def __init__(self, model): self.model = model + def get_current_asm_id(self): + self.model.get_current_asm_id() + def set_current_asm_id(self, asm_id): + self.model.set_current_asm_id(asm_id) + def set_red_ids(self, red_ids): - self.red_ids = red_ids + self.model.set_red_ids(red_ids) def get_red_ids(self): - return self.red_ids + return self.model.get_red_ids() def set_parent_children(self, parent_children_mapping): - self.parent_children_mapping = parent_children_mapping + self.model.set_parent_children(parent_children_mapping) def get_parent_children(self): - return self.parent_children_mapping + return self.model.get_parent_children() + def set_data(self, key, value): + self.model.set_data(key, value) + + #logging.basicConfig(level=logging.DEBUG) From 0ce8a485e3f99c191805b10acc5dbd869075ec8f Mon Sep 17 00:00:00 2001 From: mistangl Date: Thu, 11 Jan 2024 12:14:03 +0100 Subject: [PATCH 06/12] Modul in Einzelteile zerlegt --- lib/CreoMigrateGui.py | 158 ++---------------------------------------- lib/caditem.py | 118 +++++++++++++++++++++++++++++++ lib/controller.py | 30 ++++++++ lib/test_gui.py | 79 +++++++++++++++++++++ 4 files changed, 231 insertions(+), 154 deletions(-) create mode 100644 lib/caditem.py create mode 100644 lib/controller.py create mode 100644 lib/test_gui.py diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 0699b42..88d7435 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -1,5 +1,7 @@ import tkinter as tk from tkinter import ttk +from controller import Controller +from caditem import CadItem #from tkinter import messagebox #import logging @@ -7,7 +9,6 @@ from tkinter import ttk #logger = logging.getLogger(__name__) - class TreeView(): def __init__(self, frame): # a treeview @@ -181,8 +182,8 @@ class App(): style.theme_use('classic') current_id = self.controller.get_current_asm_id() - self.controller.get_parent_children() - self.controller.get_red_ids() + parent_children_mapping = self.controller.get_parent_children() + red_ids = self.controller.get_red_ids() self.tv = TreeView(left_frame) self.tv.create(parent_children_mapping, red_ids) gridhdl = self.tv.get_handle() @@ -282,154 +283,3 @@ if __name__ == "__main__": --sees --> -- uses --> USER """ - class CadItem(): - """ - This item contains all data for writing all necessary data to the solid edg cad file - - """ - # diese Daten bilden dann die Impfdaten - data_keys = [ "Author", "Teilenummer", "StartRevision", - "Bezeichnung1", "Bezeichnung2", "Bezeichnung4", "KategorieNE", - "BeschaffungsartNE", "TOS-Gruppe_ERP", "Dispogruppe", - "Dispolaufgruppe", "WerkstofftypNE", "WerkstoffNE", - "Oberflaechenbehandlung", "Farbe", "KalkulationsartNE", - "RuestcodeAusw", "Fertigungsart", "Allgemeintoleranz", - "HalbzeugInternAngabe", "Halbzeug", "HalbzeugOhneSaegeliste", - "EinheitNE", "FOS-GruppeNE", "Hersteller", "HerstellerTeilenummer", - "Serien-Status", "Kantennorm", "Oberflaechennorm", "Massnorm", - "Tolerierungsnorm", "TOS-Gruppe", "TOS_Schoenenberger_Produkt", - "TOS_Automation", "TOS_Maschinenelement", - "TOS_Schoenenberger_Komponenten", "TOS_Pneumatik", "TOS_Konfig", - "TOS_ILS", "TOS_MAS", "TOS_Spinnereikomponente", - "TOS_Betriebsmittel", "TOS_Geruest", "TOS_FremdTransport", - "TOS_MAS_Konfig", "TOS_Schaltschrank", "TOS_Schalt_Einbau", - "TOS_Dezentral", "TOS_Automation_Sensorik", "TOS_Kabel", - "TOS_Installation", "TOS_Automation_Sonstiges", - "TOS_Verbindungselement", "TOS_Lager", "TOS_Kraft_Drehmoment", - "TOS_Sicherungselement", "TOS_Bedienungselement", "TOS_ILS_2", - "TOS_ILS_Foerderer", "TOS_MAS_Fahrstecke", "TOS_Trolley", - "TOS_Trolley_Projekte", "TOS_Trolley_Omniflo", - "TOS_Trolley_Spinnerei", "TOS_Trolley_ILS", "Änderungsbeschreibung", - "Freigabevermerk", "ZusaetzlicheInformationen"] - - def __init__(self, asm_id): - """ is initalized with its unique id""" - self.set_asm_id(asm_id) - self.red_ids = {} - self.parent_children_mapping = {} - self.data = {} - self.gui_data = {} - - def set_asm_id(self, asm_id): - self.asm_id = asm_id - def get_current_asm_id(self): - return self.asm_id - - def get_current_part_id(self): - return self.prt_id - def set_part_id(self, prt_id): - self.prt_id = prt_id - - - def set_parent_children(self, parent_children_mapping): - """ contains all id relations below, data of subassemblies etc. in - a dict of the kind parent-children - """ - self.parent_children_mapping = parent_children_mapping - def get_parent_children(self): - return self.parent_children_mapping - - def set_red_ids(self, red_ids): - """ these ids are not yet known by the PDM""" - self.red_ids = red_ids - - def get_red_ids(self): - return self.red_ids - - def set_data(self, data:dict): - for k,v in data: - self.set_data(k,v) - def set_data(self, key, val): - if key not in self.data_keys: - raise Exception("this data can not be set") - else: - self.data[key] = val - - def get_data(self, key): - return self.data[key] - - def load(): - pass - def save(): - pass - - - class CadItemRepository: - """ - container class for all CadItems in the local folder - also just managed by the controller - """ - def __init__(self): - self.caditems = [] - - def add(self, caditem): - self.caditems.append(caditem) - - def get(self, id): - for caditem in self.caditems: - if caditem.id == id: - return caditem - return None - - def get_all(self): - return self.caditems - - def update(self, old_item, new_item): - self.delete(old_item.id) - self.add(new_item) - raise Exception("CadItem not found") - - def delete(self, id): - for p in self.caditems: - if p.id == id: - self.caditems.remove(p) - return - raise Exception("CadItem not found") - - class Controller(): - """ - Class for manipulating the model and returning data for the view - """ - def __init__(self, model): - self.model = model - - def get_current_asm_id(self): - self.model.get_current_asm_id() - def set_current_asm_id(self, asm_id): - self.model.set_current_asm_id(asm_id) - - def set_red_ids(self, red_ids): - self.model.set_red_ids(red_ids) - def get_red_ids(self): - return self.model.get_red_ids() - - def set_parent_children(self, parent_children_mapping): - self.model.set_parent_children(parent_children_mapping) - def get_parent_children(self): - return self.model.get_parent_children() - def set_data(self, key, value): - self.model.set_data(key, value) - - - - - #logging.basicConfig(level=logging.DEBUG) - model = CadItem("400102196") - - controller = Controller(model) - controller.set_parent_children(parent_children_mapping) - controller.set_red_ids(red_ids) - - root = tk.Tk() - app = App(root, controller) - app.mainloop() diff --git a/lib/caditem.py b/lib/caditem.py new file mode 100644 index 0000000..592412b --- /dev/null +++ b/lib/caditem.py @@ -0,0 +1,118 @@ +class CadItem(): + """ + This item contains all data for writing all necessary data to the solid edg cad file + + """ + # diese Daten bilden dann die Impfdaten + data_keys = [ "Author", "Teilenummer", "StartRevision", + "Bezeichnung1", "Bezeichnung2", "Bezeichnung4", "KategorieNE", + "BeschaffungsartNE", "TOS-Gruppe_ERP", "Dispogruppe", + "Dispolaufgruppe", "WerkstofftypNE", "WerkstoffNE", + "Oberflaechenbehandlung", "Farbe", "KalkulationsartNE", + "RuestcodeAusw", "Fertigungsart", "Allgemeintoleranz", + "HalbzeugInternAngabe", "Halbzeug", "HalbzeugOhneSaegeliste", + "EinheitNE", "FOS-GruppeNE", "Hersteller", "HerstellerTeilenummer", + "Serien-Status", "Kantennorm", "Oberflaechennorm", "Massnorm", + "Tolerierungsnorm", "TOS-Gruppe", "TOS_Schoenenberger_Produkt", + "TOS_Automation", "TOS_Maschinenelement", + "TOS_Schoenenberger_Komponenten", "TOS_Pneumatik", "TOS_Konfig", + "TOS_ILS", "TOS_MAS", "TOS_Spinnereikomponente", + "TOS_Betriebsmittel", "TOS_Geruest", "TOS_FremdTransport", + "TOS_MAS_Konfig", "TOS_Schaltschrank", "TOS_Schalt_Einbau", + "TOS_Dezentral", "TOS_Automation_Sensorik", "TOS_Kabel", + "TOS_Installation", "TOS_Automation_Sonstiges", + "TOS_Verbindungselement", "TOS_Lager", "TOS_Kraft_Drehmoment", + "TOS_Sicherungselement", "TOS_Bedienungselement", "TOS_ILS_2", + "TOS_ILS_Foerderer", "TOS_MAS_Fahrstecke", "TOS_Trolley", + "TOS_Trolley_Projekte", "TOS_Trolley_Omniflo", + "TOS_Trolley_Spinnerei", "TOS_Trolley_ILS", "Änderungsbeschreibung", + "Freigabevermerk", "ZusaetzlicheInformationen"] + + def __init__(self, asm_id): + """ is initalized with its unique id""" + self.set_asm_id(asm_id) + self.red_ids = {} + self.parent_children_mapping = {} + self.data = {} + self.gui_data = {} + + def set_asm_id(self, asm_id): + self.asm_id = asm_id + def get_current_asm_id(self): + return self.asm_id + + def get_current_part_id(self): + return self.prt_id + def set_part_id(self, prt_id): + self.prt_id = prt_id + + + def set_parent_children(self, parent_children_mapping): + """ contains all id relations below, data of subassemblies etc. in + a dict of the kind parent-children + """ + self.parent_children_mapping = parent_children_mapping + def get_parent_children(self): + return self.parent_children_mapping + + def set_red_ids(self, red_ids): + """ these ids are not yet known by the PDM""" + self.red_ids = red_ids + + def get_red_ids(self): + return self.red_ids + + def set_data(self, data:dict): + for k,v in data: + self.set_data(k,v) + def set_data(self, key, val): + if key not in self.data_keys: + raise Exception("this data can not be set") + else: + self.data[key] = val + + def get_data(self, key): + return self.data[key] + + def load(): + pass + def save(): + pass + +class CadItemRepository: + """ + container class for all CadItems in the local folder + also just managed by the controller + """ + def __init__(self): + self.caditems = [] + + def add(self, caditem): + self.caditems.append(caditem) + + def get(self, id): + for caditem in self.caditems: + if caditem.id == id: + return caditem + return None + + def get_all(self): + return self.caditems + + def update(self, old_item, new_item): + self.delete(old_item.id) + self.add(new_item) + raise Exception("CadItem not found") + + def delete(self, id): + for p in self.caditems: + if p.id == id: + self.caditems.remove(p) + return + raise Exception("CadItem not found") + +if __name__ == "__main__": + pass + + + diff --git a/lib/controller.py b/lib/controller.py new file mode 100644 index 0000000..dc128fe --- /dev/null +++ b/lib/controller.py @@ -0,0 +1,30 @@ +""" +Contains the logic for the MVC of CreoMigrate Gui +""" + +class Controller(): + """ + Class for manipulating the model and returning data for the view + """ + def __init__(self, model): + self.model = model + + def get_current_asm_id(self): + self.model.get_current_asm_id() + def set_current_asm_id(self, asm_id): + self.model.set_current_asm_id(asm_id) + + def set_red_ids(self, red_ids): + self.model.set_red_ids(red_ids) + def get_red_ids(self): + return self.model.get_red_ids() + + def set_parent_children(self, parent_children_mapping): + self.model.set_parent_children(parent_children_mapping) + def get_parent_children(self): + return self.model.get_parent_children() + def set_data(self, key, value): + self.model.set_data(key, value) + +if __name__ == "__main__": + pass diff --git a/lib/test_gui.py b/lib/test_gui.py new file mode 100644 index 0000000..2fe2c42 --- /dev/null +++ b/lib/test_gui.py @@ -0,0 +1,79 @@ +import tkinter as tk +from caditem import CadItem +from CreoMigrateGui import App +from controller import Controller + + +red_ids = ( '400102274', '400102275', '400102190', '400102198', + '400102161', '400102277', '400102163', '400102278', + '400102282', '400102284', '400102195', 'MA0000008', + 'MA0000004', '929055170', '400102267', '400102235', + '400102236', 'MA0000006', '400102237', '400102238', + '400102239', '400102268', '829416159', '924031058', + '924031081', '822064091', '822066199', '822066200') + +parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', + '400102161', '400102163', '400102165', + '400102166', '400102167', '400102168', + '400102190', '400102195', '400102198', + '400102246', '400102247', '400102267', + '400102272', '400102274', '400102275', + '400102277', '400102278', '400102282', + '400102284', '400102417', '720002003', + '721001034', '821114025', '822064091', + '822066085', '822996075', '829416061', + '829516004', '911021113', '911021181', + '911021259', '911091054', '911091096', + '911091097', '911251013', '912011009', + '919050006', '924031058', + '924031081'], + '400102282': ['822066026', '822066089', '919010052'], + '400102195': ['822066075', '822066216', + '822066154', '822066101', '822064090', + '822066196', '400102129', '822066217', + '822066160', '822066215', '913041045', + '913011009', '911011057', '822064035', + '925011006', '911091041', '913051040', + '911021112', '911021166', '825006003', + '912041005', '911011014', '911011009', + '911021144', '911021001', '913011016', + '929055170', '913011010', '911021035', + '829416065', '712000151', + '712000100'], + '822066075': ['822066157', '822066162', '911261023'], + '822066162': ['822064013'], + '822066196': ['MA0000008'], + '822066160': ['MA0000004'], + '822064035': ['822066065'], + '822064093': ['822066204', '822066205', '822066206', '822066207', '822066208'], + '822066220': ['924031033'], + '822064091': ['822066212', '822064093', '822066220', + '822066200', '912011010', '911021156', + '822066201', '911071027', '913011109', + '911011070', '913011001', '710005021', + '919010055', '720000008', '720000007'], + '400102267': ['400102235', '829416159', '829416077', + '829416079', '911021260', '911021147', + '911251014'], + '400102235': ['400102236', '400102237', '400102238', + '400102239', '400102268', '911021143', + '911021054', '911021055'], + '400102236': ['MA0000006'], + '829416159': ['829416089'], + '400102130': ['400102142'], + '821116004': ['822026004'], + '400102168': ['821116001'], + '821114025': ['911081007', '821116053'], + '400102167': ['821116004']} + + + +model = CadItem("400102196") + +controller = Controller(model) +controller.set_parent_children(parent_children_mapping) +controller.set_red_ids(red_ids) + +root = tk.Tk() +app = App(root, controller) +app.mainloop() From b6a36bf135a16779dbbe66b04f2d90e851e22dc1 Mon Sep 17 00:00:00 2001 From: mistangl Date: Thu, 11 Jan 2024 13:54:27 +0100 Subject: [PATCH 07/12] =?UTF-8?q?data=20set=20und=20get=20f=C3=BCr=20GUI?= =?UTF-8?q?=20und=20Daten=20impl.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 88d7435..7194dee 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -73,6 +73,7 @@ class RightFramePDM(): self.controller = controller self.frame = frame self.build_gui() + self.from_model() def build_gui(self): frame = self.frame @@ -97,8 +98,8 @@ class RightFramePDM(): neuaufbau_checkbutton = ttk.Checkbutton(frame, text='ja', variable=self.neuaufbau, - onvalue=True, - offvalue=False) + onvalue="True", + offvalue="False") neuaufbau_checkbutton.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 @@ -120,8 +121,8 @@ class RightFramePDM(): aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, text='neu', variable=self.aus_halbzeug_neu, - onvalue=True, - offvalue=False) + onvalue="True", + offvalue="False") aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) rownum += 1 @@ -138,19 +139,28 @@ class RightFramePDM(): return { "pdm_kategorie_neu": self.pdm_category.get(), "neuaufbau": self.neuaufbau, - "lebenszyklusstatus_neu": self.lebenszyklus_status_neu.get(), + "lebenszyklus_status_neu": self.lebenszyklus_status_neu.get(), "aus_halbzeug_neu": self.aus_halbzeug_neu, "zusatzinfos_txt_neu": self.zusatzinfos_text.get(), } def to_model(self): data = self.get_data() - self.controller.set_data(data) + self.controller.set_gui_data(data) + def from_model(self): - data = self.controller.get_data() - self.aus_halbzeug_neu = data["aus_halbzeug_neu"] - self.neuaufbau = data["neuaufbau"] - self.zusatzinfos_text.set(data["neuaufbau"]) + data = self.controller.get_all_gui_data() + if 'pdm_kategorie_neu' in data: + self.pdm_category.set(data["pdm_kategorie_neu"]) + if 'neuaufbau' in data: + self.neuaufbau = data["neuaufbau"] + if 'lebenszyklus_status_neu' in data: + self.lebenszyklus_status_neu.set(data["lebenszyklus_status_neu"]) + if 'aus_halbzeug_neu' in data: + self.zusatzinfos_text.set(data["aus_halbzeug_neu"]) + if 'zusatzinfos_text_neu' in data: + self.aus_halbzeug_neu = data["zusatzinfos_text_neu"] + def combo_callbacks(self, event): """ handle the changed event """ # TODO falls nötig From f182b8d8063331a360a3f42131a9a16a165383ca Mon Sep 17 00:00:00 2001 From: mistangl Date: Thu, 11 Jan 2024 17:46:43 +0100 Subject: [PATCH 08/12] weiteren Abschnitt zur GUI gebaut --- lib/CreoMigrateGui.py | 140 +++++++++++++++++++----------------------- lib/caditem.py | 27 +++++++- lib/controller.py | 26 ++++++++ lib/test_gui.py | 12 +++- 4 files changed, 124 insertions(+), 81 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 7194dee..1cfa723 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -10,7 +10,7 @@ from caditem import CadItem class TreeView(): - def __init__(self, frame): + def __init__(self, frame, controller): # a treeview # hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=40) @@ -67,17 +67,72 @@ class TreeView(): def get_handle(self): return self.tree +class RightFrameLabels(): + def __init__(self, frame, controller): + self.controller = controller + self.frame = frame + self.build_gui() + self.data_from_model() + + def build_gui(self): + frame = self.frame + rownum = 0 + col_left = 0 + # Feld, SIVAS-Werte, Überschriebene Werte + feld_label = ttk.Label(frame, text="Feld" ) + feld_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + Sivas_label = ttk.Label(frame, text="SIVAS-Werte" ) + Sivas_label.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) + transwritten_label = ttk.Label(frame, text="Überschriebene Werte" ) + transwritten_label.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + + feld_label.configure(font=("Helvetica", 16)) + Sivas_label.configure(font=("Helvetica",16)) + transwritten_label.configure(font=("Helvetica",16)) + rownum += 1 + + separator = ttk.Separator(frame, orient='horizontal') + separator.grid(column=col_left, columnspan=3, row=rownum, sticky=tk.EW, padx=5, pady=5) + rownum += 1 + + # Teilenummer + teilenummer_label = ttk.Label(frame, text="Teilenummer:") + teilenummer_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + self.teilenummer_text = tk.StringVar() + teilenummer_entry = ttk.Entry(frame, textvariable=self.teilenummer_text) + teilenummer_entry.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) + rownum += 1 + separator2 = ttk.Separator(frame, orient='horizontal') + separator2.grid(column=col_left, columnspan=3, row=rownum, sticky=tk.EW, padx=5, pady=5) + rownum += 1 + + return rownum + + + def get_data(self): + return { + "teilennummer": self.teilenummer_text.get(), + } + + def data_to_model(self): + data = self.get_data() + self.controller.set_gui_data(data) + + def data_from_model(self): + data = self.controller.get_all_gui_data() + if 'teilenummer' in data: + self.teilenummer_text.set(data["teilenummer"]) class RightFramePDM(): def __init__(self, frame, controller): self.controller = controller self.frame = frame self.build_gui() - self.from_model() + self.data_from_model() def build_gui(self): frame = self.frame - rownum = 0 + rownum = 4 col_left = 0 # pdmkategorie pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) @@ -144,11 +199,11 @@ class RightFramePDM(): "zusatzinfos_txt_neu": self.zusatzinfos_text.get(), } - def to_model(self): + def data_to_model(self): data = self.get_data() self.controller.set_gui_data(data) - def from_model(self): + def data_from_model(self): data = self.controller.get_all_gui_data() if 'pdm_kategorie_neu' in data: self.pdm_category.set(data["pdm_kategorie_neu"]) @@ -187,96 +242,25 @@ class App(): right_frame = ttk.Frame(self.root, width=650, height=800) right_frame.grid(row=0, column=1, padx=10, pady=5) - style = ttk.Style(self.root) style.theme_use('classic') current_id = self.controller.get_current_asm_id() parent_children_mapping = self.controller.get_parent_children() red_ids = self.controller.get_red_ids() - self.tv = TreeView(left_frame) + self.tv = TreeView(left_frame, controller) self.tv.create(parent_children_mapping, red_ids) gridhdl = self.tv.get_handle() gridhdl.grid(row=0, column=0, sticky=tk.NSEW) + self.rf0 = RightFrameLabels(right_frame, controller) self.rf1 = RightFramePDM(right_frame, controller) - #self.create_widgets(right_frame) - - - def create_widgets(self, frame): - rownum = 0 - col_left = 0 - # pdmkategorie - pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) - pdmkategorie_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - pdmkategorie_entry = ttk.Entry(frame) - pdmkategorie_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 - - # Neuaufbau - neuaufbau_label = ttk.Label(frame, text="Neuaufbau:") - neuaufbau_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - - self.neuaufbau = None - neuaufbau_checkbutton = ttk.Checkbutton(frame, - text='ja', - command=self.var_changed("neuaufbau"), - variable=self.neuaufbau, - onvalue=True, - offvalue=False) - neuaufbau_checkbutton.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 - - # Lebenszyklusstatus - lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:") - lebenszyklusstatus_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - lebenszyklusstatus_entry = ttk.Entry(frame, show="*") - lebenszyklusstatus_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 - - halbzeug_label = ttk.Label(frame, text="Halbzeug:") - halbzeug_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) - self.aus_halbzeug_sivas = None - aushalbzeug_checkbutton_sivas = ttk.Checkbutton(frame, - text='aus Sivas', - command=self.var_changed("aus_halbzeug_sivas"), - variable=self.aus_halbzeug_sivas, - onvalue=True, - offvalue=False) - aushalbzeug_checkbutton_sivas.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) - self.aus_halbzeug_neu = None - aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, - text='neu', - command=self.var_changed("aus_halbzeug_neu"), - variable=self.aus_halbzeug_neu, - onvalue=True, - offvalue=False) - aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 def mainloop(self): self.root.mainloop() -# class Navbar(tk.Frame): ... -# class Toolbar(tk.Frame): ... -# class Statusbar(tk.Frame): ... -# class Main(tk.Frame): ... - -# class MainApp(tk.Frame): - # def __init__(self, parent, *args, **kwargs): - # tk.Frame.__init__(self, parent, *args, **kwargs) - # self.statusbar = Statusbar(self, ...) - # self.toolbar = Toolbar(self, ...) - # self.navbar = Navbar(self, ...) - # self.main = Main(self, ...) - - # self.statusbar.pack(side="bottom", fill="x") - # self.toolbar.pack(side="top", fill="x") - # self.navbar.pack(side="left", fill="y") - # self.main.pack(side="right", fill="both", expand=True) - if __name__ == "__main__": """ using the Model-View-Controller (MVC) Pattern diff --git a/lib/caditem.py b/lib/caditem.py index 592412b..7fc4433 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -27,6 +27,9 @@ class CadItem(): "TOS_Trolley_Projekte", "TOS_Trolley_Omniflo", "TOS_Trolley_Spinnerei", "TOS_Trolley_ILS", "Änderungsbeschreibung", "Freigabevermerk", "ZusaetzlicheInformationen"] + gui_data_keys = [ "pdm_kategorie_neu", "neuaufbau", + "lebenszyklus_status_neu", "aus_halbzeug_neu", + "zusatzinfos_txt_neu"] def __init__(self, asm_id): """ is initalized with its unique id""" @@ -62,7 +65,8 @@ class CadItem(): def get_red_ids(self): return self.red_ids - def set_data(self, data:dict): + # Daten zum Impfen merken + def set_data_dict(self, data:dict): for k,v in data: self.set_data(k,v) def set_data(self, key, val): @@ -72,7 +76,28 @@ class CadItem(): self.data[key] = val def get_data(self, key): + """ gibt ein Datenstück zurück """ return self.data[key] + def get_all_data(self): + """ gibt alle enthaltenen Daten zurück """ + return self.data + + # Daten in der GUI + def set_gui_dict(self, data:dict): + """ setzt die Daten der GUI """ + for k,v in data.items(): + self.set_gui_data(k,v) + def set_gui_data(self, key, val): + """ merkt sich ein Datenatom für die GUI """ + if key not in self.gui_data_keys: + raise Exception("this data can not be set"+ key) + else: + self.gui_data[key] = val + + def get_gui_data(self, key): + return self.gui_data[key] + def get_all_gui_data(self): + return self.gui_data def load(): pass diff --git a/lib/controller.py b/lib/controller.py index dc128fe..98ccf14 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -23,8 +23,34 @@ class Controller(): self.model.set_parent_children(parent_children_mapping) def get_parent_children(self): return self.model.get_parent_children() + + # merkt sich die reinen Daten zum Impfen + def set_data_dict(self, data:dict): + """merken der Daten zum Impfen""" + for k,v in data: + self.set_data(k,v) def set_data(self, key, value): + """merken der Daten zum Impfen""" self.model.set_data(key, value) + def get_data(self, key): + return self.model.get_data(key) + def get_all_data(self): + return self.model.get_all_data() + + # merkt sich die Nutzereingaben, bzw. Daten für die GUI + def set_gui_dict(self, data:dict): + """merken der Eingaben des Nutzers der GUI """ + for k,v in data: + self.set_gui_data(k,v) + def set_gui_data(self, key, value): + """merken der Eingaben des Nutzers der GUI """ + self.model.set_gui_data(key, value) + + def get_gui_data(self, key): + return self.model.get_gui_data(key) + def get_all_gui_data(self): + return self.model.get_all_gui_data() + if __name__ == "__main__": pass diff --git a/lib/test_gui.py b/lib/test_gui.py index 2fe2c42..f1b1c0e 100644 --- a/lib/test_gui.py +++ b/lib/test_gui.py @@ -69,10 +69,18 @@ parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', model = CadItem("400102196") +gui_data = { + "pdm_kategorie_neu":"Einzelteil", + "neuaufbau" :"False", + "lebenszyklus_status_neu" :"Serie", + "neuaufbau" :"", + "aus_halbzeug_neu" :"True", + } +model.set_gui_dict(gui_data) +model.set_parent_children(parent_children_mapping) +model.set_red_ids(red_ids) controller = Controller(model) -controller.set_parent_children(parent_children_mapping) -controller.set_red_ids(red_ids) root = tk.Tk() app = App(root, controller) From d4ecb88b334063f5afd38112b08cad23ff39f848 Mon Sep 17 00:00:00 2001 From: mistangl Date: Fri, 12 Jan 2024 18:44:29 +0100 Subject: [PATCH 09/12] erste callback methoden implementiert. --- lib/CreoMigrateGui.py | 104 +++++++++++++++++++++++++++--------------- lib/caditem.py | 27 +++++++++-- lib/controller.py | 3 ++ lib/test_gui.py | 1 + 4 files changed, 93 insertions(+), 42 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 1cfa723..5032811 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -11,6 +11,7 @@ from caditem import CadItem class TreeView(): def __init__(self, frame, controller): + self.controller = controller # a treeview # hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=40) @@ -58,7 +59,10 @@ class TreeView(): def item_selected(self, event): """callback if an item in the tree has been selected """ - id = self.tree.selection()[0] + cid = self.tree.selection()[0] + # trage es + self.controller.set_gui_data('teilenummer', cid) + self.controller.update_view() # for selected_item in self.tree.selection(): # item = self.tree.item(selected_item) # record = item['values'] @@ -68,45 +72,51 @@ class TreeView(): return self.tree class RightFrameLabels(): - def __init__(self, frame, controller): + def __init__(self, frame, controller, nrow=0): self.controller = controller self.frame = frame self.build_gui() self.data_from_model() + self.set_start_rwo(nrow) + + def get_rows(self): + return self.rownum + def set_start_rwo(self, nrow): + if nrow < 0: + raise Exception("this row can not be set") + self.rownum = nrow def build_gui(self): frame = self.frame - rownum = 0 + self.rownum = 0 col_left = 0 # Feld, SIVAS-Werte, Überschriebene Werte feld_label = ttk.Label(frame, text="Feld" ) - feld_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + feld_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) Sivas_label = ttk.Label(frame, text="SIVAS-Werte" ) - Sivas_label.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) + Sivas_label.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=5, pady=5) transwritten_label = ttk.Label(frame, text="Überschriebene Werte" ) - transwritten_label.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) + transwritten_label.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) feld_label.configure(font=("Helvetica", 16)) Sivas_label.configure(font=("Helvetica",16)) transwritten_label.configure(font=("Helvetica",16)) - rownum += 1 + self.rownum += 1 separator = ttk.Separator(frame, orient='horizontal') - separator.grid(column=col_left, columnspan=3, row=rownum, sticky=tk.EW, padx=5, pady=5) - rownum += 1 + separator.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=5, pady=5) + self.rownum += 1 # Teilenummer teilenummer_label = ttk.Label(frame, text="Teilenummer:") - teilenummer_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + teilenummer_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.teilenummer_text = tk.StringVar() teilenummer_entry = ttk.Entry(frame, textvariable=self.teilenummer_text) - teilenummer_entry.grid(column=col_left+1, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 + teilenummer_entry.grid(column=col_left+1, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 separator2 = ttk.Separator(frame, orient='horizontal') - separator2.grid(column=col_left, columnspan=3, row=rownum, sticky=tk.EW, padx=5, pady=5) - rownum += 1 - - return rownum + separator2.grid(column=col_left, columnspan=3, row=self.rownum, sticky=tk.EW, padx=5, pady=5) + self.rownum += 1 def get_data(self): @@ -116,7 +126,7 @@ class RightFrameLabels(): def data_to_model(self): data = self.get_data() - self.controller.set_gui_data(data) + self.controller.set_gui_dict(data) def data_from_model(self): data = self.controller.get_all_gui_data() @@ -124,30 +134,38 @@ class RightFrameLabels(): self.teilenummer_text.set(data["teilenummer"]) class RightFramePDM(): - def __init__(self, frame, controller): + def __init__(self, frame, controller, nrow=0): self.controller = controller self.frame = frame self.build_gui() self.data_from_model() + self.set_start_rwo(nrow) + def get_rows(self): + return self.rownum + def set_start_rwo(self, nrow): + if nrow < 0: + raise Exception("this row can not be set") + self.rownum = nrow + def build_gui(self): frame = self.frame - rownum = 4 + self.rownum = 4 col_left = 0 # pdmkategorie pdmkategorie_label = ttk.Label(frame, text="PDM-Kategorie:" ) - pdmkategorie_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + pdmkategorie_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.pdm_category = tk.StringVar() pdmkategorie_combo = ttk.Combobox(frame, textvariable=self.pdm_category) pdmkategorie_combo['values'] = ["Baugruppe", "Einzelteil", "Kaufteil", "NichtSivas", "Normteil", "Schweissbaugruppe"] pdmkategorie_combo['state'] = 'readonly' pdmkategorie_combo.bind('<>', self.combo_callbacks) # falls nötig - pdmkategorie_combo.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 + pdmkategorie_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 # Neuaufbau neuaufbau_label = ttk.Label(frame, text="Neuaufbau:") - neuaufbau_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + neuaufbau_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.neuaufbau = None neuaufbau_checkbutton = ttk.Checkbutton(frame, @@ -155,40 +173,39 @@ class RightFramePDM(): variable=self.neuaufbau, onvalue="True", offvalue="False") - neuaufbau_checkbutton.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 + neuaufbau_checkbutton.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 # Lebenszyklusstatus lebenszyklusstatus_label = ttk.Label(frame, text="Lebenszyklusstatus:") - lebenszyklusstatus_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + lebenszyklusstatus_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.lebenszyklus_status_neu = tk.StringVar() lebenszyklusstatus_combo = ttk.Combobox(frame, textvariable=self.lebenszyklus_status_neu) lebenszyklusstatus_combo['values'] = ["Serie", "Prototyp"] lebenszyklusstatus_combo['state'] = 'readonly' lebenszyklusstatus_combo.bind('<>', self.combo_callbacks) - lebenszyklusstatus_combo.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 + lebenszyklusstatus_combo.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 # aus Halbzeug halbzeug_label = ttk.Label(frame, text="aus Halbzeug:") - halbzeug_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + halbzeug_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.aus_halbzeug_neu = None aushalbzeug_checkbuttonr = ttk.Checkbutton(frame, text='neu', variable=self.aus_halbzeug_neu, onvalue="True", offvalue="False") - aushalbzeug_checkbuttonr.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 + aushalbzeug_checkbuttonr.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 # Zusatzinformationen zusatzinfos_label = ttk.Label(frame, text="Zusatzinformationen:") - zusatzinfos_label.grid(column=col_left, row=rownum, sticky=tk.W, padx=5, pady=5) + zusatzinfos_label.grid(column=col_left, row=self.rownum, sticky=tk.W, padx=5, pady=5) self.zusatzinfos_text = tk.StringVar() zusatzinfos_entry = ttk.Entry(frame, textvariable=self.zusatzinfos_text) - zusatzinfos_entry.grid(column=col_left+2, row=rownum, sticky=tk.W, padx=5, pady=5) - rownum += 1 - return rownum + zusatzinfos_entry.grid(column=col_left+2, row=self.rownum, sticky=tk.W, padx=5, pady=5) + self.rownum += 1 def get_data(self): return { @@ -201,7 +218,10 @@ class RightFramePDM(): def data_to_model(self): data = self.get_data() - self.controller.set_gui_data(data) + self.controller.set_gui_dict(data) + + def data_to_model(self, key, value): + self.controller.set_gui_data(key, value) def data_from_model(self): data = self.controller.get_all_gui_data() @@ -253,8 +273,16 @@ class App(): gridhdl = self.tv.get_handle() gridhdl.grid(row=0, column=0, sticky=tk.NSEW) - self.rf0 = RightFrameLabels(right_frame, controller) - self.rf1 = RightFramePDM(right_frame, controller) + self.rf0 = RightFrameLabels(right_frame, controller, 0) + nrows = self.rf0.get_rows() + self.rf1 = RightFramePDM(right_frame, controller, nrows) + nrows = self.rf1.get_rows() + #self.rf2 = RightFramePDM(right_frame, controller, nrows) + # TODO usw. + + def update_view(self): + self.rf0.update_view() + self.rf1.update_view() def mainloop(self): diff --git a/lib/caditem.py b/lib/caditem.py index 7fc4433..8543b8e 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -1,3 +1,4 @@ +import json class CadItem(): """ This item contains all data for writing all necessary data to the solid edg cad file @@ -27,9 +28,19 @@ class CadItem(): "TOS_Trolley_Projekte", "TOS_Trolley_Omniflo", "TOS_Trolley_Spinnerei", "TOS_Trolley_ILS", "Änderungsbeschreibung", "Freigabevermerk", "ZusaetzlicheInformationen"] - gui_data_keys = [ "pdm_kategorie_neu", "neuaufbau", - "lebenszyklus_status_neu", "aus_halbzeug_neu", - "zusatzinfos_txt_neu"] + gui_data_keys = [ "teilenummer", + "pdm_kategorie_neu", + "neuaufbau", + "lebenszyklus_status_neu", + "aus_halbzeug_neu", + "zusatzinfos_txt_neu", + "bezeichnung_sivas", "bezeichnung_neu", + "beschaffungsart_sivas","beschaffungsart_neu" + "mengeneinheit_sivas","mengeneinheit_neu" + "halbzeug_sivas","halbzeug_neu", + "tos_gruppe_sivas","tos_gruppe_neu" + # TODO siehe Layout Entwurf svg + ] def __init__(self, asm_id): """ is initalized with its unique id""" @@ -48,6 +59,7 @@ class CadItem(): return self.prt_id def set_part_id(self, prt_id): self.prt_id = prt_id + self.gui_data["teilenummer"] = prt_id def set_parent_children(self, parent_children_mapping): @@ -100,8 +112,15 @@ class CadItem(): return self.gui_data def load(): - pass + #try: + # with open('data.json', 'r') as f: + # self.model.todos = json.load(f) + #except Exception: + # pass + pass def save(): + #with open('data.json', 'w') as f: + # data = json.dump(self.model.data, f) pass class CadItemRepository: diff --git a/lib/controller.py b/lib/controller.py index 98ccf14..b22ccc4 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -9,6 +9,9 @@ class Controller(): def __init__(self, model): self.model = model + def update_view(self): + pass + def get_current_asm_id(self): self.model.get_current_asm_id() def set_current_asm_id(self, asm_id): diff --git a/lib/test_gui.py b/lib/test_gui.py index f1b1c0e..669cd95 100644 --- a/lib/test_gui.py +++ b/lib/test_gui.py @@ -69,6 +69,7 @@ parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', model = CadItem("400102196") +model.set_part_id("400102142") gui_data = { "pdm_kategorie_neu":"Einzelteil", "neuaufbau" :"False", From 9c7325440f8172a1554cd7d8e38d607b6b60f88f Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 15 Jan 2024 15:04:24 +0100 Subject: [PATCH 10/12] =?UTF-8?q?zwischenstand=20eingepflegt.=20Controller?= =?UTF-8?q?=20Funktionen=20soll=20in=20Zukunft=20=C3=BCber=20Events=20aufg?= =?UTF-8?q?erufen=20werden)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 77 ++++++++++++++++++++++++++----------------- lib/caditem.py | 8 ++++- lib/controller.py | 62 +++++++++++++++++++++++++++++++--- lib/test_gui.py | 10 ++++-- 4 files changed, 118 insertions(+), 39 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 5032811..0eaa4aa 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -7,11 +7,9 @@ from caditem import CadItem #logger = logging.getLogger(__name__) - - class TreeView(): - def __init__(self, frame, controller): - self.controller = controller + def __init__(self, frame): + self.controller = None # a treeview # hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=40) @@ -25,8 +23,16 @@ class TreeView(): self.tree.bind('<>', self.item_selected) + def set_controller(self, controller): + self.controller = controller + + def refresh(self, parent_children_mapping, red_ids): + self.clear() + self.create(parent_children_mapping, red_ids) + def clear(self): - self.tree.delete() + for c in self.tree.get_children(): + self.tree.delete(c) def create(self, parent_children_mapping, red_ids): # adding data of first column after root @@ -56,13 +62,18 @@ class TreeView(): self.tree.tag_configure('good', background='white') self.tree.tag_configure('missing', background='red') + def data_from_model(self): + parent_children_mapping = self.controller.get_parent_children() + red_ids = self.controller.get_red_ids() + self.create(parent_children_mapping, red_ids) + def item_selected(self, event): - """callback if an item in the tree has been selected + """callback of TK if an item in the tree has been selected """ cid = self.tree.selection()[0] - # trage es + # trage die neue ID ins Modell ein self.controller.set_gui_data('teilenummer', cid) - self.controller.update_view() + # for selected_item in self.tree.selection(): # item = self.tree.item(selected_item) # record = item['values'] @@ -71,14 +82,17 @@ class TreeView(): def get_handle(self): return self.tree + class RightFrameLabels(): - def __init__(self, frame, controller, nrow=0): - self.controller = controller + def __init__(self, frame, nrow=0): + self.controller = None self.frame = frame self.build_gui() - self.data_from_model() self.set_start_rwo(nrow) + def set_controller(self, controller): + self.controller = controller + def get_rows(self): return self.rownum def set_start_rwo(self, nrow): @@ -134,11 +148,10 @@ class RightFrameLabels(): self.teilenummer_text.set(data["teilenummer"]) class RightFramePDM(): - def __init__(self, frame, controller, nrow=0): - self.controller = controller + def __init__(self, frame, nrow=0): + self.controller = None self.frame = frame self.build_gui() - self.data_from_model() self.set_start_rwo(nrow) def get_rows(self): @@ -232,22 +245,24 @@ class RightFramePDM(): if 'lebenszyklus_status_neu' in data: self.lebenszyklus_status_neu.set(data["lebenszyklus_status_neu"]) if 'aus_halbzeug_neu' in data: - self.zusatzinfos_text.set(data["aus_halbzeug_neu"]) + self.aus_halbzeug_neu= data["aus_halbzeug_neu"] if 'zusatzinfos_text_neu' in data: - self.aus_halbzeug_neu = data["zusatzinfos_text_neu"] + self.zusatzinfos_text.set(data["zusatzinfos_text_neu"]) def combo_callbacks(self, event): - """ handle the changed event """ + """ handle the changed event of TK""" # TODO falls nötig pass + def set_controller(self, controller): + self.controller = controller + class App(): - def __init__(self, root, controller): + def __init__(self, root): self.root = root - self.controller = controller # configure the grid # die erste Spalte mit Baum sollte unbeweglich bleiben bei Vergräßerung des Fensters. @@ -265,25 +280,27 @@ class App(): style = ttk.Style(self.root) style.theme_use('classic') - current_id = self.controller.get_current_asm_id() - parent_children_mapping = self.controller.get_parent_children() - red_ids = self.controller.get_red_ids() - self.tv = TreeView(left_frame, controller) - self.tv.create(parent_children_mapping, red_ids) + self.tv = TreeView(left_frame) gridhdl = self.tv.get_handle() gridhdl.grid(row=0, column=0, sticky=tk.NSEW) - self.rf0 = RightFrameLabels(right_frame, controller, 0) + self.rf0 = RightFrameLabels(right_frame, 0) nrows = self.rf0.get_rows() - self.rf1 = RightFramePDM(right_frame, controller, nrows) + self.rf1 = RightFramePDM(right_frame, nrows) nrows = self.rf1.get_rows() - #self.rf2 = RightFramePDM(right_frame, controller, nrows) + #self.rf2 = RightFramePDM(right_frame, nrows) # TODO usw. - def update_view(self): - self.rf0.update_view() - self.rf1.update_view() + def data_from_model(self): + self.tv.set_controller(self.controller) + self.rf0.set_controller(self.controller) + self.rf1.set_controller(self.controller) + self.tv.data_from_model() + self.rf0.data_from_model() + self.rf1.data_from_model() + def set_controller(self, controller): + self.controller = controller def mainloop(self): self.root.mainloop() diff --git a/lib/caditem.py b/lib/caditem.py index 8543b8e..378a183 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -1,4 +1,10 @@ import json +from controller import Controller, Event + + + + + class CadItem(): """ This item contains all data for writing all necessary data to the solid edg cad file @@ -33,7 +39,7 @@ class CadItem(): "neuaufbau", "lebenszyklus_status_neu", "aus_halbzeug_neu", - "zusatzinfos_txt_neu", + "zusatzinfos_text_neu", "bezeichnung_sivas", "bezeichnung_neu", "beschaffungsart_sivas","beschaffungsart_neu" "mengeneinheit_sivas","mengeneinheit_neu" diff --git a/lib/controller.py b/lib/controller.py index b22ccc4..1ac0d18 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -2,15 +2,66 @@ Contains the logic for the MVC of CreoMigrate Gui """ -class Controller(): +class Observer(): + _observers = [] + def __init__(self): + self._observers.append(self) + self._observables = {} + + def observe(self, event_name, callback): + """If the observer is not in the list, + append it into the list""" + if event_name not in self._observables: + self._observables[event_name] = callback + + def detach(self, observer): + """Remove the observer from the observer list""" + try: + self._observers.remove(observer) + except ValueError: + pass + + def attach(self, observer): + """If the observer is not in the list, + append it into the list""" + if observer not in self._observers: + self._observers.append(observer) + + def notify(self, modifier = None): + """Alert the observers""" + for observer in self._observers: + if modifier != observer: + observer.update(self) + +class Event(): + def __init__(self, name, data, autofire = True): + self.name = name + self.data = data + if autofire: + self.fire() + def fire(self): + for observer in Observer._observers: + if self.name in observer._observables: + observer._observables[self.name](self.data) + +class Controller(Observer): """ Class for manipulating the model and returning data for the view """ - def __init__(self, model): - self.model = model + def __init__(self): + self.model = None + self.view = None # currently just one gui/view + Observer.__init__(self) - def update_view(self): - pass + def set_model(self, model): + self.model = model + def set_view(self, view): + self.view = view + + def data_to_gui(self): + self.view.data_from_model() + def data_from_model(self): + self.view.data_from_model() def get_current_asm_id(self): self.model.get_current_asm_id() @@ -49,6 +100,7 @@ class Controller(): def set_gui_data(self, key, value): """merken der Eingaben des Nutzers der GUI """ self.model.set_gui_data(key, value) + self.notify() def get_gui_data(self, key): return self.model.get_gui_data(key) diff --git a/lib/test_gui.py b/lib/test_gui.py index 669cd95..78bfea8 100644 --- a/lib/test_gui.py +++ b/lib/test_gui.py @@ -74,15 +74,19 @@ gui_data = { "pdm_kategorie_neu":"Einzelteil", "neuaufbau" :"False", "lebenszyklus_status_neu" :"Serie", - "neuaufbau" :"", "aus_halbzeug_neu" :"True", + "zusatzinfos_text_neu": 'Dies sind neue Zusatzinfos', } model.set_gui_dict(gui_data) model.set_parent_children(parent_children_mapping) model.set_red_ids(red_ids) -controller = Controller(model) +controller = Controller() root = tk.Tk() -app = App(root, controller) +app = App(root) +app.set_controller(controller) +controller.set_view(app) +controller.set_model(model) +controller.data_to_gui() app.mainloop() From 26f1820a724b91e6ec47b5c499637ccbbd7fdf19 Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 15 Jan 2024 17:12:38 +0100 Subject: [PATCH 11/12] =?UTF-8?q?erste=20Fassung=20mit=20Refresh=20der=20G?= =?UTF-8?q?ui=20und=20R=C3=BCckmeldung=20an=20User?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 77 ++++++++++++++++++++++--------------------- lib/caditem.py | 9 ++--- lib/controller.py | 30 +++-------------- lib/test_gui.py | 14 ++++---- 4 files changed, 57 insertions(+), 73 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 0eaa4aa..914a15b 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -9,7 +9,6 @@ from caditem import CadItem #logger = logging.getLogger(__name__) class TreeView(): def __init__(self, frame): - self.controller = None # a treeview # hier Anzahl der sichtbaren Zeilen des Baums angeben: self.tree = ttk.Treeview(frame, height=40) @@ -62,10 +61,10 @@ class TreeView(): self.tree.tag_configure('good', background='white') self.tree.tag_configure('missing', background='red') - def data_from_model(self): - parent_children_mapping = self.controller.get_parent_children() - red_ids = self.controller.get_red_ids() - self.create(parent_children_mapping, red_ids) + def data_from_model(self, controller): + parent_children_mapping = controller.get_parent_children() + red_ids = controller.get_red_ids() + self.refresh(parent_children_mapping, red_ids) def item_selected(self, event): """callback of TK if an item in the tree has been selected @@ -73,26 +72,34 @@ class TreeView(): cid = self.tree.selection()[0] # trage die neue ID ins Modell ein self.controller.set_gui_data('teilenummer', cid) - - # for selected_item in self.tree.selection(): - # item = self.tree.item(selected_item) - # record = item['values'] - # messagebox.showinfo(title='Information', message=','.join(record)) + self.controller.refresh_gui() def get_handle(self): return self.tree +class AllRightFrames(): + def __init__(self, frame, nrow=0): + self.frame = frame + self.build_widgets() + self.set_start_rwo(nrow) + + def get_rows(self): + return self.rownum + def set_start_rwo(self, nrow): + if nrow < 0: + raise Exception("this row can not be set") + self.rownum = nrow + + def data_to_model(self, controller): + data = self.get_data() + controller.set_gui_dict(data) class RightFrameLabels(): def __init__(self, frame, nrow=0): - self.controller = None self.frame = frame - self.build_gui() + self.build_widgets() self.set_start_rwo(nrow) - def set_controller(self, controller): - self.controller = controller - def get_rows(self): return self.rownum def set_start_rwo(self, nrow): @@ -100,7 +107,7 @@ class RightFrameLabels(): raise Exception("this row can not be set") self.rownum = nrow - def build_gui(self): + def build_widgets(self): frame = self.frame self.rownum = 0 col_left = 0 @@ -138,20 +145,19 @@ class RightFrameLabels(): "teilennummer": self.teilenummer_text.get(), } - def data_to_model(self): + def data_to_model(self, controller): data = self.get_data() - self.controller.set_gui_dict(data) + controller.set_gui_dict(data) - def data_from_model(self): - data = self.controller.get_all_gui_data() + def data_from_model(self, controller): + data = controller.get_all_gui_data() if 'teilenummer' in data: self.teilenummer_text.set(data["teilenummer"]) class RightFramePDM(): def __init__(self, frame, nrow=0): - self.controller = None self.frame = frame - self.build_gui() + self.build_widgets() self.set_start_rwo(nrow) def get_rows(self): @@ -161,7 +167,7 @@ class RightFramePDM(): raise Exception("this row can not be set") self.rownum = nrow - def build_gui(self): + def build_widgets(self): frame = self.frame self.rownum = 4 col_left = 0 @@ -229,15 +235,15 @@ class RightFramePDM(): "zusatzinfos_txt_neu": self.zusatzinfos_text.get(), } - def data_to_model(self): + def data_to_model(self, controller): data = self.get_data() - self.controller.set_gui_dict(data) + controller.set_gui_dict(data) - def data_to_model(self, key, value): - self.controller.set_gui_data(key, value) + def data_to_model(self, controller, key, value): + controller.set_gui_data(key, value) - def data_from_model(self): - data = self.controller.get_all_gui_data() + def data_from_model(self, controller): + data = controller.get_all_gui_data() if 'pdm_kategorie_neu' in data: self.pdm_category.set(data["pdm_kategorie_neu"]) if 'neuaufbau' in data: @@ -254,9 +260,6 @@ class RightFramePDM(): # TODO falls nötig pass - def set_controller(self, controller): - self.controller = controller - class App(): @@ -292,15 +295,13 @@ class App(): # TODO usw. def data_from_model(self): - self.tv.set_controller(self.controller) - self.rf0.set_controller(self.controller) - self.rf1.set_controller(self.controller) - self.tv.data_from_model() - self.rf0.data_from_model() - self.rf1.data_from_model() + self.tv.data_from_model(self.controller) + self.rf0.data_from_model(self.controller) + self.rf1.data_from_model(self.controller) def set_controller(self, controller): self.controller = controller + self.tv.set_controller(controller) def mainloop(self): self.root.mainloop() diff --git a/lib/caditem.py b/lib/caditem.py index 378a183..3e517e2 100644 --- a/lib/caditem.py +++ b/lib/caditem.py @@ -55,6 +55,10 @@ class CadItem(): self.parent_children_mapping = {} self.data = {} self.gui_data = {} + self.controller = None + + def set_controller(self, controller): + self.controller = controller def set_asm_id(self, asm_id): self.asm_id = asm_id @@ -62,10 +66,7 @@ class CadItem(): return self.asm_id def get_current_part_id(self): - return self.prt_id - def set_part_id(self, prt_id): - self.prt_id = prt_id - self.gui_data["teilenummer"] = prt_id + return self.get_gui_data("teilenummer") def set_parent_children(self, parent_children_mapping): diff --git a/lib/controller.py b/lib/controller.py index 1ac0d18..82d61fb 100644 --- a/lib/controller.py +++ b/lib/controller.py @@ -13,25 +13,6 @@ class Observer(): append it into the list""" if event_name not in self._observables: self._observables[event_name] = callback - - def detach(self, observer): - """Remove the observer from the observer list""" - try: - self._observers.remove(observer) - except ValueError: - pass - - def attach(self, observer): - """If the observer is not in the list, - append it into the list""" - if observer not in self._observers: - self._observers.append(observer) - - def notify(self, modifier = None): - """Alert the observers""" - for observer in self._observers: - if modifier != observer: - observer.update(self) class Event(): def __init__(self, name, data, autofire = True): @@ -48,17 +29,17 @@ class Controller(Observer): """ Class for manipulating the model and returning data for the view """ - def __init__(self): - self.model = None - self.view = None # currently just one gui/view - Observer.__init__(self) + def __init__(self, model, view): + self.set_model(model) + self.set_view(view) + #Observer.__init__(self) def set_model(self, model): self.model = model def set_view(self, view): self.view = view - def data_to_gui(self): + def refresh_gui(self): self.view.data_from_model() def data_from_model(self): self.view.data_from_model() @@ -100,7 +81,6 @@ class Controller(Observer): def set_gui_data(self, key, value): """merken der Eingaben des Nutzers der GUI """ self.model.set_gui_data(key, value) - self.notify() def get_gui_data(self, key): return self.model.get_gui_data(key) diff --git a/lib/test_gui.py b/lib/test_gui.py index 78bfea8..77df455 100644 --- a/lib/test_gui.py +++ b/lib/test_gui.py @@ -69,8 +69,8 @@ parent_children_mapping = {'400102196': ['400102125', '400102126', '400102130', model = CadItem("400102196") -model.set_part_id("400102142") gui_data = { + "teilenummer":"400102142", "pdm_kategorie_neu":"Einzelteil", "neuaufbau" :"False", "lebenszyklus_status_neu" :"Serie", @@ -81,12 +81,14 @@ model.set_gui_dict(gui_data) model.set_parent_children(parent_children_mapping) model.set_red_ids(red_ids) -controller = Controller() root = tk.Tk() app = App(root) -app.set_controller(controller) -controller.set_view(app) -controller.set_model(model) -controller.data_to_gui() +controller = Controller(model, app) +# um ohne Observer pattern auch Rückmeldungen geben zu können +app.set_controller(controller) +model.set_controller(controller) + +# Daten des Modells in der Oberfläche darstellen +controller.refresh_gui() app.mainloop() From 404e241ba01d7df53e052d0ad1542234c74db539 Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 15 Jan 2024 17:31:55 +0100 Subject: [PATCH 12/12] =?UTF-8?q?Abstrakte=20Klasse=20hinzugef=C3=BCgt=20u?= =?UTF-8?q?m=20nur=20noch=20die=20unterschiedlichen=20Widgets=20in=20den?= =?UTF-8?q?=20Klassen=20bauen=20zu=20m=C3=BCssen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/CreoMigrateGui.py | 48 +++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/lib/CreoMigrateGui.py b/lib/CreoMigrateGui.py index 914a15b..274dcd7 100644 --- a/lib/CreoMigrateGui.py +++ b/lib/CreoMigrateGui.py @@ -78,13 +78,14 @@ class TreeView(): return self.tree class AllRightFrames(): - def __init__(self, frame, nrow=0): - self.frame = frame - self.build_widgets() + """ enthält alle gleichen Methoden für die Widgets in der rechte Spalte + """ + def __init__(self, nrow=0): self.set_start_rwo(nrow) def get_rows(self): return self.rownum + def set_start_rwo(self, nrow): if nrow < 0: raise Exception("this row can not be set") @@ -94,19 +95,15 @@ class AllRightFrames(): data = self.get_data() controller.set_gui_dict(data) -class RightFrameLabels(): + def data_to_model(self, controller, key, value): + controller.set_gui_data(key, value) + +class RightFrameLabels(AllRightFrames): def __init__(self, frame, nrow=0): + AllRightFrames.__init__(self, nrow) self.frame = frame self.build_widgets() - self.set_start_rwo(nrow) - def get_rows(self): - return self.rownum - def set_start_rwo(self, nrow): - if nrow < 0: - raise Exception("this row can not be set") - self.rownum = nrow - def build_widgets(self): frame = self.frame self.rownum = 0 @@ -145,28 +142,17 @@ class RightFrameLabels(): "teilennummer": self.teilenummer_text.get(), } - def data_to_model(self, controller): - data = self.get_data() - controller.set_gui_dict(data) - def data_from_model(self, controller): data = controller.get_all_gui_data() if 'teilenummer' in data: self.teilenummer_text.set(data["teilenummer"]) -class RightFramePDM(): +class RightFramePDM(AllRightFrames): def __init__(self, frame, nrow=0): + AllRightFrames.__init__(self, nrow) self.frame = frame self.build_widgets() - self.set_start_rwo(nrow) - def get_rows(self): - return self.rownum - def set_start_rwo(self, nrow): - if nrow < 0: - raise Exception("this row can not be set") - self.rownum = nrow - def build_widgets(self): frame = self.frame self.rownum = 4 @@ -235,13 +221,6 @@ class RightFramePDM(): "zusatzinfos_txt_neu": self.zusatzinfos_text.get(), } - def data_to_model(self, controller): - data = self.get_data() - controller.set_gui_dict(data) - - def data_to_model(self, controller, key, value): - controller.set_gui_data(key, value) - def data_from_model(self, controller): data = controller.get_all_gui_data() if 'pdm_kategorie_neu' in data: @@ -264,6 +243,7 @@ class RightFramePDM(): class App(): def __init__(self, root): + """Standardgui mit Baum zur Anwahl der Teile des Assemblies""" self.root = root @@ -295,12 +275,16 @@ class App(): # TODO usw. def data_from_model(self): + """ methode zum auslesen aller Daten der Oberfläche aus dem Modell + """ self.tv.data_from_model(self.controller) self.rf0.data_from_model(self.controller) self.rf1.data_from_model(self.controller) def set_controller(self, controller): + # merken des Handels auf den Controller self.controller = controller + # der Tree braucht aufgrund des Callbacks der Selektion auch einen Verweis self.tv.set_controller(controller) def mainloop(self):