diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e231dc6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+saved_frames/
+archive
+__pycache__
+.~lock*
+*.log
diff --git a/.~lock.Messungen des Einzelteile.ods# b/.~lock.Messungen des Einzelteile.ods#
deleted file mode 100644
index 82b0e94..0000000
--- a/.~lock.Messungen des Einzelteile.ods#
+++ /dev/null
@@ -1 +0,0 @@
-,clemens,cps-aio-001,01.07.2024 13:17,file:///home/clemens/.config/libreoffice/4;
\ No newline at end of file
diff --git a/CameraStream.py b/CameraStream.py
new file mode 100644
index 0000000..274fbaf
--- /dev/null
+++ b/CameraStream.py
@@ -0,0 +1,149 @@
+import cv2
+import os
+from datetime import datetime
+from ultralytics import YOLO
+
+class YOLOv8CameraStream:
+ def __init__(self, model_path: str, camera_source=0, confidence_threshold=0.5, save_threshold=0.9,
+ log_file="detections.log", logging_level="high"):
+ self.model = YOLO(model_path)
+ self.camera_source = camera_source
+ self.confidence_threshold = confidence_threshold
+ self.default_confidence_threshold = confidence_threshold
+ self.save_threshold = save_threshold
+ self.default_save_threshold = save_threshold
+ self.log_file = log_file
+ self.logging_level = logging_level
+ self.cap = cv2.VideoCapture(camera_source)
+
+ # Create directories for saved frames and archived logs if they don't exist
+ os.makedirs("saved_frames", exist_ok=True)
+ os.makedirs("archive", exist_ok=True)
+
+ # Initialize display settings
+ self.show_thresholds = True
+
+ def log_detection(self, label, confidence):
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ self.check_log_size() # Check log size before logging
+ with open(self.log_file, "a") as log:
+ log.write(f"{timestamp} - Detected: {label} with confidence {confidence:.2f}\n")
+
+ def check_log_size(self):
+ """Checks the size of the log file and archives it if it exceeds 5 MB."""
+ if os.path.exists(self.log_file) and os.path.getsize(self.log_file) > 5 * 1024 * 1024: # 5 MB
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ archived_log_file = f"archive/{self.log_file}_{timestamp}.log"
+ os.rename(self.log_file, archived_log_file) # Rename the old log file
+ print(f"Archived old log file to {archived_log_file}")
+ # Create a new log file
+ open(self.log_file, 'w').close() # Create an empty log file
+
+ def save_frame(self, frame, label):
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ filename = f"saved_frames/{label}_{timestamp}.jpg"
+ cv2.imwrite(filename, frame)
+ print(f"Frame saved: {filename}")
+
+ def get_color_for_confidence(self, confidence):
+ if confidence > 0.75:
+ return (0, 255, 0)
+ elif confidence > 0.5:
+ return (0, 255, 255)
+ else:
+ return (0, 0, 255)
+
+ def process_frame(self, frame):
+ results = self.model.predict(frame)
+ for result in results:
+ for box in result.boxes:
+ confidence = float(box.conf.item())
+ if self.logging_level == "high" and confidence < self.save_threshold:
+ continue
+
+ if confidence > self.confidence_threshold:
+ x1, y1, x2, y2 = map(int, box.xyxy[0])
+ class_id = int(box.cls.item())
+ label = f"{result.names[class_id]} {confidence:.2f}"
+ color = self.get_color_for_confidence(confidence)
+ cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)
+ cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
+
+ self.log_detection(result.names[class_id], confidence)
+
+ if confidence > self.save_threshold:
+ self.save_frame(frame, result.names[class_id])
+
+ if self.show_thresholds:
+ self.display_thresholds(frame)
+ self.display_keyboard_options(frame)
+
+ return frame
+
+ def display_thresholds(self, frame):
+ text = f"Confidence Threshold: {self.confidence_threshold:.2f} | Save Threshold: {self.save_threshold:.2f}"
+ cv2.putText(frame, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
+
+ def display_keyboard_options(self, frame):
+ options = [
+ "Keyboard Controls:",
+ "'c' - Increase Confidence Threshold | 'v' - Decrease Confidence Threshold",
+ "'s' - Increase Save Threshold | 'x' - Decrease Save Threshold",
+ "'t' - Toggle Threshold Display | 'r' - Reset Thresholds to Default",
+ "'q' - Quit"
+ ]
+ for i, option in enumerate(options):
+ cv2.putText(frame, option, (10, 50 + i * 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
+
+ def adjust_thresholds(self):
+ print("\nPress 'c' to increase confidence threshold, 'v' to decrease it.")
+ print("Press 's' to increase save threshold, 'x' to decrease it.")
+ print("Press 't' to toggle threshold display, 'r' to reset thresholds to default.")
+ print("Press 'q' to quit the program.\n")
+
+ def start(self):
+ if not self.cap.isOpened():
+ print("Error: Could not open video source.")
+ return
+
+ self.adjust_thresholds()
+
+ while True:
+ ret, frame = self.cap.read()
+ if not ret:
+ print("Error: Failed to capture frame.")
+ break
+
+ processed_frame = self.process_frame(frame)
+ cv2.imshow("YOLOv8 Camera Stream", processed_frame)
+
+ key = cv2.waitKey(1) & 0xFF
+ if key == ord('q'):
+ break
+ elif key == ord('c'):
+ self.confidence_threshold = min(self.confidence_threshold + 0.05, 1.0)
+ print(f"Confidence threshold increased to {self.confidence_threshold:.2f}")
+ elif key == ord('v'):
+ self.confidence_threshold = max(self.confidence_threshold - 0.05, 0.0)
+ print(f"Confidence threshold decreased to {self.confidence_threshold:.2f}")
+ elif key == ord('s'):
+ self.save_threshold = min(self.save_threshold + 0.05, 1.0)
+ print(f"Save threshold increased to {self.save_threshold:.2f}")
+ elif key == ord('x'):
+ self.save_threshold = max(self.save_threshold - 0.05, 0.0)
+ print(f"Save threshold decreased to {self.save_threshold:.2f}")
+ elif key == ord('t'):
+ self.show_thresholds = not self.show_thresholds
+ print(f"Threshold display toggled to {'on' if self.show_thresholds else 'off'}")
+ elif key == ord('r'):
+ self.confidence_threshold = self.default_confidence_threshold
+ self.save_threshold = self.default_save_threshold
+ print("Thresholds reset to default values.")
+
+ self.cap.release()
+ cv2.destroyAllWindows()
+
+# Run the object detection stream
+if __name__ == "__main__":
+ yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ yolo_stream.start()
diff --git a/GUI_16_10_staticWorkflow_Multithreading.py b/GUI_16_10_staticWorkflow_Multithreading.py
index 699ba65..776caf1 100644
--- a/GUI_16_10_staticWorkflow_Multithreading.py
+++ b/GUI_16_10_staticWorkflow_Multithreading.py
@@ -24,14 +24,23 @@ import time
import threading
+# db_config = {
+# 'user': 'dbUser',
+# 'password': 'dbPassword',
+# 'host': '127.0.0.1', # 'host': 'localhost',
+# 'database': 'projectGeislinger',
+# 'port': 3306 # Standard port for MariaDB
+# }
+
db_config = {
'user': 'dbUser',
'password': 'dbPassword',
- 'host': 'localhost',
+ 'host': '127.0.0.1', # 'host': 'localhost',
'database': 'projectGeislinger',
'port': 3306 # Standard port for MariaDB
}
+
# Establishing the connection
conn = mariadb.connect(**db_config)
# Create a cursor to execute queries
diff --git a/GUI_26_09_staticWorkflow_Multithreading.py b/GUI_26_09_staticWorkflow_Multithreading.py
index 9dc102f..462b7f3 100644
--- a/GUI_26_09_staticWorkflow_Multithreading.py
+++ b/GUI_26_09_staticWorkflow_Multithreading.py
@@ -27,7 +27,7 @@ import threading
db_config = {
'user': 'dbUser',
'password': 'dbPassword',
- 'host': 'localhost',
+ 'host': '127.0.0.1', # 'host': 'localhost',
'database': 'projectGeislinger',
'port': 3306 # Standard port for MariaDB
}
diff --git a/bjoerntest10.py b/bjoerntest10.py
new file mode 100644
index 0000000..b54e5a9
--- /dev/null
+++ b/bjoerntest10.py
@@ -0,0 +1,1117 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'test.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+########## beim Static workflow funktionieren die Threads ab dem zweiten nicht mehr
+
+#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtWidgets import QApplication, QComboBox
+from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject, Qt
+from PyQt5.QtGui import QColor
+
+import serial
+import binascii
+import math
+import mariadb
+import time
+import threading
+
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+import cv2
+
+import os
+
+import sainsmartrelay
+
+# db_config = {
+# 'user': 'dbUser',
+# 'password': 'dbPassword',
+# 'host': '127.0.0.1', # 'host': 'localhost',
+# 'database': 'projectGeislinger',
+# 'port': 3306 # Standard port for MariaDB
+# }
+
+db_config = {
+ 'user': 'dbUser',
+ 'password': 'dbPassword',
+ 'host': '127.0.0.1', # 'host': 'localhost',
+ 'database': 'projectGeislinger',
+ 'port': 3306 # Standard port for MariaDB
+}
+
+
+# Establishing the connection
+conn = mariadb.connect(**db_config)
+# Create a cursor to execute queries
+cursor = conn.cursor()
+
+# Configuration of the serial port
+try:
+ ser = serial.Serial('/dev/serial/by-path/pci-0000:00:14.0-usbv2-0:3:1.0-port0', 9600)
+ print("Serial port connected successfully.")
+except serial.SerialException:
+ ser = None
+ print("Warning: Serial port not found. Continuing without serial connection. Only working for demo-purposes.")
+#ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 9600) #dadurch garantiert immer die gleiche Schnittstelle verwendet
+# und nicht die Schnittstelle, welche die Bezeichnung ttyUSB0 verwendet (welche sich ändern könnte)
+# um die ID der USB-Schnittstelle heraus zu finden im Terminal folgendes eingeben: ls -l /dev/serial/by-id/
+
+
+waageEingeschwungen = False
+
+
+def wahrscheinlichkeitsDichte(x,mue, var):
+ # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
+ standardabweichung = var**0.5
+
+ result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
+
+ return result
+
+def calcWahrscheinlichkeitFromDichte(x,mue, var):
+ # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
+ p1 = wahrscheinlichkeitsDichte(x,mue, var)
+ p_max = wahrscheinlichkeitsDichte(mue,mue, var)
+
+ return p1/p_max
+
+
+
+#class Worker(QThread):
+class Worker(QObject):
+ #progress = pyqtSignal(int)
+ objectDetectionStartSignal = pyqtSignal(str)
+ objectDetectionFinishedSignal = pyqtSignal(int, object)
+
+ checkWaageStartSignal = pyqtSignal(int, int, str)
+ checkWaageUpdateSignal = pyqtSignal(int, int)
+ checkWaageFinishedSignal = pyqtSignal(int)
+
+ waageStoppedSignal = pyqtSignal(int)
+ stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
+
+ stopLoop = False
+ btTypeIsSet = False
+ correctBtNr = False
+
+
+ def __init__(self):
+ super(Worker, self).__init__()
+ stopLoop = False
+
+
+ def getDataOfArticleType(self, allArticles, articleType):
+ # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
+ for i in allArticles:
+ if i[1] == articleType:
+ return i
+
+ return -1
+
+ def waageNichtEingeschwungenOutput(self):
+ print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
+
+ def readWaage(self):
+ # in folgender Funktion wird die Waage ausgelesen
+
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+ #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
+
+
+ if ser.is_open == False:
+ ser.open()
+
+
+ #an die Waage den Befehl senden, dass sie ausgelesen werden soll
+ ser.write(b'getWeight\n')
+ #ser.write(b'tare\n')
+ serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
+
+ # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
+ lenString = len(serialString)-1
+ if serialString[lenString] == "g" and serialString[lenString-1] == "k":
+ #print("ist eingeschwungen") #Debuggingausgabe
+ waageEingeschwungen = True
+ else:
+ print("die Waage ist noch nicht eingeschwungen")
+ waageEingeschwungen = False
+
+ #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
+ intString = ""
+ for i in serialString:
+ if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
+ intString = intString + i
+ print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
+ ## Waage auslesen - ENDE
+
+ ser.close()
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+
+ return waageEingeschwungen, intString
+
+ def objectTypeDetectionThread(self, auftragsnummer):
+ # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
+
+ #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
+
+ # Parameterdefinition
+ propDensVect = []
+
+ self.btTypeIsSet = False
+
+ while(self.btTypeIsSet == False and self.stopLoop == False):
+
+ # Auslesen der Waage
+ waageEingeschwungen, intString = self.readWaage()
+ if waageEingeschwungen == False:
+ self.waageNichtEingeschwungenOutput()
+ else:
+
+ # Datenbankabfrage
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
+ cursor.execute(sql_query)
+ auftragEinzelteilDaten = cursor.fetchall()
+
+ '''
+ # Display data #Debugausgabe
+ print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
+ for row in auftragEinzelteilDaten:
+ print(row)
+ '''
+
+ # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
+ for row in auftragEinzelteilDaten:
+ propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
+
+ # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
+ maxpropDens = 0
+ einzelteilID = 0
+ rowData = None
+ for row in propDensVect:
+ if row[0] > maxpropDens:
+ maxpropDens = row[0]
+ einzelteilID = row[1]
+ rowData = row
+
+ # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
+ if(einzelteilID == 0):
+ print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
+ else:
+ print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
+
+ # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
+ prop = 0
+ for row in auftragEinzelteilDaten:
+ if row[1] == einzelteilID:
+ prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
+ break
+ print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
+
+ # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
+ self.btTypeIsSet = True
+
+ if(self.stopLoop == False):
+ # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
+ self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
+ else:
+ self.waageStoppedSignal.emit(einzelteilID)
+
+ def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
+
+ self.correctBtNr = False
+ prevAnzahl = 0
+ anzahl = 0
+ einzelteilID = einzelteilID
+
+ while (self.correctBtNr == False and self.stopLoop == False):
+
+ #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
+ waageEingeschwungen, intString = self.readWaage()
+ if waageEingeschwungen == False:
+ self.waageNichtEingeschwungenOutput()
+ else:
+
+ # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
+ cursor.execute(sql_query)
+ auftragDaten = cursor.fetchall()
+
+ '''
+ # Display data - zum Debuggen
+ print("Ausgabe der Auftragsdetails:")
+ print("id|EinzelteilID|Auftragsnummer|Anzahl")
+ for row in auftragDaten:
+ print(row)
+ '''
+
+ #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
+ anzBauteile_soll = 0
+ idVorhanden = False
+
+ for row in auftragDaten:
+ if row[1] == einzelteilID:
+ anzBauteile_soll = row[3]
+ idVorhanden = True
+
+ if(idVorhanden == False):
+ print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
+ return
+
+ # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
+ propDensVect = []
+ articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
+ for i in range(1,anzBauteile_soll+teileZuViel+1):
+ # Mathematische Sätze, auf welchen die Berechnung basiert:
+ # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
+ mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
+ varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
+ propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
+
+ # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
+ maxpropDens = 0
+ for row in propDensVect:
+ if row[0] > maxpropDens:
+ maxpropDens = row[0]
+ anzahl = row[1]
+
+ # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
+ if prevAnzahl != anzahl:
+ prevAnzahl = anzahl
+
+ # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
+ if anzahl > 0:
+ for row in auftragDaten:
+ if row[1] == einzelteilID:
+ prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
+ break
+ print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
+
+ # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
+ if (anzahl == anzBauteile_soll):
+ self.correctBtNr = True
+
+ # Konsolenausgabe
+ if maxpropDens > 0:
+ print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
+ self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
+
+ else:
+ print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
+ print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
+
+ if(self.stopLoop == False):
+ self.checkWaageFinishedSignal.emit(einzelteilID)
+ else:
+ self.waageStoppedSignal.emit(einzelteilID)
+
+
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ self.auftragsnummer = ""
+ self.teileZuViel = 100 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
+ self.correctBtNr = False
+ self.btTypeIsSet = False
+
+
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1400, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
+ self.btn1.setObjectName("btn1")
+ # Tabelle zur Darstellung der Auftragsdetails
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 100, 661, 400))
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(7)
+ self.AuftragsdetailsTable.setRowCount(0)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
+
+ # Tabelle zur Darstellung der Arbeitsschritte
+ self.ArbeitsschrittTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.ArbeitsschrittTable.setGeometry(QtCore.QRect(1000, 50, 395, 400))
+ self.ArbeitsschrittTable.setObjectName("AuftragsdetailsTable")
+ self.ArbeitsschrittTable.setColumnCount(2)
+ self.ArbeitsschrittTable.setRowCount(4)
+ self.ArbeitsschrittTable.setColumnWidth(0, 100)
+ self.ArbeitsschrittTable.setColumnWidth(1, 280)
+ self.ArbeitsschrittTable.setRowHeight(0, 80)
+ self.ArbeitsschrittTable.setRowHeight(1, 180)
+ self.ArbeitsschrittTable.setRowHeight(2, 50)
+ self.ArbeitsschrittTable.setRowHeight(3, 50)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.ArbeitsschrittTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.ArbeitsschrittTable.setHorizontalHeaderItem(1, item)
+
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.checkWaageBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
+ self.checkWaageBtn.setObjectName("checkWaageBtn")
+ self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.stopLoopBtn.setGeometry(QtCore.QRect(700, 350, 161, 25))
+ self.stopLoopBtn.setObjectName("stopLoopBtn")
+ self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.waageTareBtn.setGeometry(QtCore.QRect(700, 400, 161, 25))
+ self.waageTareBtn.setObjectName("waageTareBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
+ self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
+ self.BezeichnungLabel.setObjectName("BezeichnungLabel")
+ self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
+ self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
+ self.PosNrLabel.setObjectName("PosNrLabel")
+ self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
+ self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
+ self.PosNrTxtFeld.setObjectName("PosNrTxtFeld")
+ self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
+ self.teileZuVielLabel.setGeometry(QtCore.QRect(1000, 560, 350, 17))
+ self.teileZuVielLabel.setObjectName("teileZuVielLabel")
+ self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
+ self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(1000, 580, 191, 31))
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(1000, 480, 151, 23))
+ self.checkBox.setObjectName("checkBox")
+ self.checkBoxAutoTare = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBoxAutoTare.setGeometry(QtCore.QRect(1000, 520, 180, 23))
+ self.checkBoxAutoTare.setObjectName("checkBoxAutoTare")
+
+ # button and checkbox for camera workflow + graphicsview widget
+ self.camWorkFlowcheckBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.camWorkFlowcheckBox.setGeometry(QtCore.QRect(700, int(1080/2), 151, 23))
+ self.camWorkFlowcheckBox.setObjectName("camWorkFlowcheckBox")
+ self.modelComboBox = QtWidgets.QComboBox(self.centralwidget)
+ self.modelComboBox.setGeometry(QtCore.QRect(700, int(1080/2)+50, 161, 25))
+ self.modelComboBox.setObjectName("modelComboBox")
+ self.startCamBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.startCamBtn.setGeometry(QtCore.QRect(700, int(1080/2)+100, 161, 25)) #int(1080/2)+100
+ self.startCamBtn.setObjectName("startCamBtn")
+ self.stopCamBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.stopCamBtn.setGeometry(QtCore.QRect(700, int(1080/2)+150, 161, 25))
+ self.stopCamBtn.setObjectName("stopCamBtn")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(10, int(1080/2), 661, int(480*1.05))) # position and size of camera frame # int(640*1.05)
+ self.graphicsView.setObjectName("graphicsView")
+
+ # relay control
+ self.startSpotlightBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.startSpotlightBtn.setGeometry(QtCore.QRect(700+200, int(1080/2)+100, 161, 25)) #int(1080/2)+100
+ self.startSpotlightBtn.setObjectName("startSpotlightBtn")
+ self.stopSpotlightBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.stopSpotlightBtn.setGeometry(QtCore.QRect(700+200, int(1080/2)+150, 161, 25))
+ self.stopSpotlightBtn.setObjectName("stopSpotlightBtn")
+
+ #self.myTestLambda = lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)
+
+ '''
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
+ '''
+
+ # Maximize the window on startup
+ MainWindow.showMaximized()
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.btn1.clicked.connect(self.auftragsBtnClicked)
+
+ # Tabelle zur Darstellung der Auftragsdetails
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Soll-Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Ist-Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
+ item.setText(_translate("MainWindow", "Lgort"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(6)
+ item.setText(_translate("MainWindow", "set Farbe"))
+
+ # Tabelle zur Darstellung der Arbeitsschritte
+ item = self.ArbeitsschrittTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Arbeitsschritt"))
+ item = self.ArbeitsschrittTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "ToDo:"))
+
+ # Befüllen der Arbeisschritttabelle mit Text
+ #item = self.ArbeitsschrittTable.
+ # Ein neues QTableWidgetItem erstellen und den Text setzen
+ item = QtWidgets.QTableWidgetItem("Auftrag laden")
+ self.ArbeitsschrittTable.setItem(0, 0, item)
+ item = QtWidgets.QTableWidgetItem("--> Auftragsnummer eingeben \n--> \"load Auftrag\" Buttonclick")
+ self.ArbeitsschrittTable.setItem(0, 1, item)
+ item = QtWidgets.QTableWidgetItem("Bauteiltyp erkennen")
+ self.ArbeitsschrittTable.setItem(1, 0, item)
+ item = QtWidgets.QTableWidgetItem("visuell: \n--> ein Bauteil in die Kamera halten\n\nWaage: \n--> ein Bauteil auf die Waage legen\n--> \"Bauteiltyp erkennen\" Buttonclick\n\nmanuell:\n--> Bauteiltypen auswählen\n-->\"ckeck Waage\" Button click")
+ self.ArbeitsschrittTable.setItem(1, 1, item)
+ item = QtWidgets.QTableWidgetItem("Bauteilanzahl erkennen")
+ self.ArbeitsschrittTable.setItem(2, 0, item)
+ item = QtWidgets.QTableWidgetItem("--> Bauteile auflegen")
+ self.ArbeitsschrittTable.setItem(2, 1, item)
+ item = QtWidgets.QTableWidgetItem("Prozess beendet")
+ self.ArbeitsschrittTable.setItem(3, 0, item)
+ self.ArbeitsschrittTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+
+ #self.ArbeitsschrittTable.item(0,0).setText("test")
+
+ #einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
+ #self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
+ #self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
+
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
+ self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
+ self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
+ #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+ #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ #item.setText(_translate("MainWindow", "test"))
+ self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
+ self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
+ self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
+ self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
+ self.checkWaageBtn.clicked.connect(self.checkWaage)
+ self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
+ self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
+ self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
+ self.waageTareBtn.clicked.connect(self.onTareClick)
+ self.checkBox.setText(_translate("MainWindow", "static workflow"))
+ self.checkBox.clicked.connect(self.onCheckboxCheck)
+ self.checkBoxAutoTare.setText(_translate("MainWindow", "automatisches Tarieren"))
+ self.checkBoxAutoTare.clicked.connect(self.autoTareCheck)
+
+ self.setRowColor(self.ArbeitsschrittTable, 0,255,165,0) # zum setzen der ersten Spalte der Arbeitsschrittetabelle auf orange
+ self.checkBoxAutoTare.setCheckState(Qt.Checked)
+ self.checkBox.setCheckState(Qt.Unchecked)
+
+ # new camera workflow
+ self.startCamBtn.setText(_translate("MainWindow", "Start Camera"))
+ # self.startCamBtn.clicked.connect(self.startCamBtnClicked)
+ self.stopCamBtn.setText(_translate("MainWindow", "Stop Camera"))
+ self.camWorkFlowcheckBox.setText(_translate("MainWindow", "Camera Workflow"))
+ # self.camWorkFlowcheckBox.clicked.connect(self.onCheckboxCheck)
+ self.modelComboBox
+
+ # relay control
+ self.startSpotlightBtn.setText(_translate("MainWindow", "Turn on light"))
+ self.stopSpotlightBtn.setText(_translate("MainWindow", "Turn off light"))
+
+
+
+ def mousePressEvent(self, event):
+ print("Das MainWindow wurde angeklickt.")
+ self.setFocus()
+ super().mousePressEvent(event)
+
+
+ def onTareClick(self):
+ #Tarieren der Waage
+ if ser.is_open == False:
+ ser.open()
+ ser.write(b'tare\n')
+ ser.close()
+
+
+ def onCheckboxCheck(self):
+ if self.checkBox.isChecked() == True:
+ print("static workflow activated")
+ else:
+ print("static workflow deactivated")
+
+ def autoTareCheck(self):
+ if self.checkBoxAutoTare.isChecked() == True:
+ print("automatisches Tarieren ist aktiviert")
+ else:
+ print("automatisches Tarieren ist deaktiviert")
+
+ def getRowNr(self, posNr):
+ for i in range(0,self.AuftragsdetailsTable.rowCount()):
+ if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
+ return i
+# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
+ def waageNichtEingeschwungenOutput(self):
+ print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
+
+ def onTableCellClick(self):
+ self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
+ self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
+
+ def setAuftragsnummer(self):
+ self.auftragsnummer = self.textEdit.toPlainText()
+ if(not self.auftragsnummer):
+ self.auftragsnummer = ""
+ self.textEdit.setText("")
+
+ def checkAuftragsnummerEmpty(self):
+ if self.auftragsnummer == "":
+ print("Das Auftragsnummernfeld ist leer.")
+ return True
+ else:
+ return False
+
+ def checkPosNrEmpty(self):
+ if self.PosNrTxtFeld.toPlainText() == "":
+ return True
+ else:
+ return False
+
+
+# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
+ def getDataOfArticleType(self, allArticles, articleType):
+ # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
+ for i in allArticles:
+ if i[1] == articleType:
+ return i
+ return -1
+
+ def updateGUI(self):
+ self.PosNrLabel.repaint() #GUI aktualisieren
+ QApplication.processEvents() #GUI aktualisieren
+
+
+ def setRowColor(self, tableObject, rowID,r,g,b):
+ for col in range(tableObject.columnCount()-1):
+ tableObject.item(rowID, col).setBackground(QtGui.QColor(r,g,b))
+ '''
+ die alte Version der Programmierung
+ tableObject.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
+ tableObject.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
+ tableObject.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
+ tableObject.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
+ tableObject.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
+ tableObject.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
+ '''
+
+#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
+ def readWaage(self):
+ # in folgender Funktion wird die Waage ausgelesen
+
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+ #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
+ self.checkPosNrEmpty()
+
+ if ser.is_open == False:
+ ser.open()
+
+
+ #an die Waage den Befehl senden, dass sie ausgelesen werden soll
+ ser.write(b'getWeight\n')
+ #ser.write(b'tare\n')
+ serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
+
+ # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
+ lenString = len(serialString)-1
+ if serialString[lenString] == "g" and serialString[lenString-1] == "k":
+ #print("ist eingeschwungen") #Debuggingausgabe
+ waageEingeschwungen = True
+ else:
+ print("die Waage ist noch nicht eingeschwungen")
+ waageEingeschwungen = False
+
+ #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
+ intString = ""
+ for i in serialString:
+ if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
+ intString = intString + i
+ print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
+ ## Waage auslesen - ENDE
+
+ ser.close()
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+
+ return waageEingeschwungen, intString
+
+ def auftragsBtnClicked(self):
+ databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
+ auftragEinzelteilDaten = []
+
+ self.setAuftragsnummer()
+ if(not self.checkAuftragsnummerEmpty()):
+
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
+ try:
+ cursor.execute(sql_query)
+ # Fetch results
+ auftragEinzelteilDaten = cursor.fetchall()
+ databaseQueryWorking = True
+ except:
+ print("Fehler in der Datenbankabfrage.")
+
+
+
+ if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
+ '''
+ # Display data
+ print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
+ for row in auftragEinzelteilDaten:
+ if str(row[2]) == self.auftragsnummer:
+ print("passt")
+ print(row)
+ '''
+
+ ### die Auftragsdaten in die Tabelle laden
+ self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
+ self.item = QtWidgets.QTableWidgetItem()
+ counter = 0
+ for row in auftragEinzelteilDaten:
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 0, self.item)
+ self.item.setText(str(row[1]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 1, self.item)
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 2, self.item)
+ self.item.setText(str(row[5]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 3, self.item)
+ self.item.setText(str(row[3]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 4, self.item)
+ self.item.setText(str("0"))
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 5, self.item)
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+
+ # Dropdown für Farben in die 6. Spalte einfügen
+ #self.item = QtWidgets.QTableWidgetItem()
+ #self.AuftragsdetailsTable.setItem(counter, 6, self.item)
+ combo = QComboBox()
+ combo.addItems(["Farbe", "Weiß", "Orange", "Grün"])
+ combo.currentIndexChanged.connect(lambda index, rowId =counter: self.change_row_color(rowId, index))
+ self.AuftragsdetailsTable.setCellWidget(counter, 6, combo)
+ counter = counter +1
+
+ self.setRowColor(self.ArbeitsschrittTable, 0,0,255,0) #zum setzen der ersten Zeile der Auftragstabelle auf grün
+ self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) #zum setzen der zweiten Zeile der Auftragstabelle auf orange
+ self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) #zum setzen der dritten Zeile der Auftragstabelle auf weiß
+ self.setRowColor(self.ArbeitsschrittTable, 3,255,255,255) #zum setzen der vierten Zeile der Auftragstabelle auf weiß
+
+ # setzen der beiden Felder auf einen leeren String, um Fehler zu Vermeiden, wenn ein neuer Auftrag geladen wird
+ self.bauteiltypTextbox.setText("")
+ self.PosNrTxtFeld.setText("")
+
+
+ elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
+ print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
+
+ def change_row_color(self, row, color_index):
+ if(color_index == 1):
+ self.setRowColor(self.AuftragsdetailsTable, row,255,255,255)
+ if(color_index == 2):
+ self.setRowColor(self.AuftragsdetailsTable, row,255,165,0)
+ if(color_index == 3):
+ self.setRowColor(self.AuftragsdetailsTable, row,0,255,0)
+
+ def stopLoopClicked(self):
+ # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
+ if hasattr(self, 'objectDetectionWorker'):
+ self.objectDetectionWorker.stopLoopSignal.emit(True)
+
+ if hasattr(self, 'checkWaageWorker'):
+ self.checkWaageWorker.stopLoopSignal.emit(True)
+
+ def checkFinished(self):
+ #die Funktion geht alle Zeilen der Auftragsliste durch und schaut, ob die richtige Anzahl an Teilen vorhanden sind
+ for i in range(0,self.AuftragsdetailsTable.rowCount()):
+ if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
+ return False
+ return True
+
+
+ def checkWaage(self):
+ #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
+ QApplication.processEvents()
+
+ # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
+ #self.checkWaageWorker.stopLoopSignal.emit(False)
+
+ # überprüfen, ob der Auftrag geladen wurde
+ if(self.AuftragsdetailsTable.item(0,0) == None):
+ print("Der Auftrag muss zuerst geladen werden.")
+ return
+
+ # überprüfen, ob ein Bauteiltyp gesetzt wurde
+ if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
+ print("Das Pos.-Nr.-Feld ist leer.")
+ return
+
+ # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
+ self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
+ self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
+
+ einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
+ if (self.checkBox.isChecked() == False):
+ #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
+ einzelteilID = int(self.PosNrTxtFeld.toPlainText())
+ else:
+ # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
+ for i in range(0,self.AuftragsdetailsTable.rowCount()):
+ if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
+ einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
+ self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
+ self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
+ break
+
+ if einzelteilID == -1:
+ # den Thread beenden
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+ try:
+ self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
+ print("Der Thread wurde beendet.")
+ except:
+ print("Disconnecting the thread did not work.")
+ return
+
+
+ #zum setzen den Farbe der gesamten Reihe auf Orange
+ self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
+ self.setRowColor(self.ArbeitsschrittTable, 1,0,255,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf grün
+ self.setRowColor(self.ArbeitsschrittTable, 2,255,165,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf orange
+
+ # den Thread starten, welcher die Bauteilanzahl überprüft
+ self.checkWaageWorker = Worker()
+ self.checkWaageThread = QThread()
+
+ self.checkWaageWorker.moveToThread(self.checkWaageThread)
+
+ self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
+ self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
+ self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
+ self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
+ self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
+
+ self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
+ self.checkWaageThread.start()
+
+ def checkWaageUpdate(self, einzelteilID, anzahl):
+ # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
+ self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
+
+ def checkWaageFinished(self, einzelteilID):
+ self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
+
+ if self.checkFinished(): # wenn alle Bauteile auf der Waage liegen, soll folgender Code ausgeführt werden
+ self.setRowColor(self.ArbeitsschrittTable, 2,0,255,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf orange
+ self.setRowColor(self.ArbeitsschrittTable, 3,0,255,0) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf weiß
+ else: # wenn noch nicht alle Bauteile des Auftrags auf der Waage liegen, soll folgernder Code ausgeführt werden
+ self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0) # zum setzen der zweiten Spalte der Arbeitsschrittetabelle auf orange
+ self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255) # zum setzen der dritten Spalte der Arbeitsschrittetabelle auf weiß
+ if self.checkBoxAutoTare.isChecked():
+ self.onTareClick()
+
+ # den Thread beenden
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+
+ # auch wenn die Länge der Liste überschritten wurde
+ # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
+ if(self.checkBox.isChecked() == True):
+ self.checkWaage()
+
+ # GUI updaten
+ #self.updateGUI()
+
+ def objectTypeDetection(self):
+ # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
+
+ # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
+ if self.checkBox.isChecked() == True:
+ self.checkWaage()
+ return
+
+ '''
+ if(self.checkPosNrEmpty()==True):
+ print("Das Pos.-Nr.-Feld ist leer.")
+ return
+ '''
+
+ # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
+ #self.objectDetectionWorker.stopLoopSignal.emit(False)
+
+ # überprüfen, ob der Auftrag in die Tabelle geladen wurde
+ if(self.AuftragsdetailsTable.item(0,0) == None):
+ print("Der Auftrag muss zuerst geladen werden.")
+ return
+
+ # speichert den Wert, welcher im Textfeld steht in Variablen im Code
+ self.setAuftragsnummer()
+
+ # starten des Threats, welcher den Bauteiltyp zurück gibt
+ self.objectDetectionWorker = Worker()
+ self.objectDetectionThread = QThread()
+
+ self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
+
+ self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
+ self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
+ self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
+ self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
+
+ self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
+ self.objectDetectionThread.start()
+
+ def objectTypeDetectionFinished(self, einzelteilID, rowData):
+ # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
+
+ # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
+ self.PosNrTxtFeld.setText(str(rowData[1]))
+ self.bauteiltypTextbox.setText(rowData[2])
+
+ # setzt den Boolean, um aus der Schleife raus zu gehen
+ self.btTypeIsSet = True
+
+ #zum setzen den Farbe der gesamten Reihe auf Orange
+ self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,165,0)
+
+ # den Thread beenden
+ self.objectDetectionThread.quit()
+ self.objectDetectionThread.wait()
+
+ '''
+ try:
+ self.objectDetectionThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
+ except:
+ print(f"Error while disconnecting: {e}")
+ print("Disconnecting the thread did not work.")
+ '''
+
+ # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
+ self.updateGUI()
+ self.checkWaage()
+
+ def threadStopped(self, einzelteilID):
+ # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
+ if self.checkFinished() == False:
+ if(einzelteilID > 0):
+ self.setRowColor(self.AuftragsdetailsTable, self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
+ self.setRowColor(self.ArbeitsschrittTable, 2,255,255,255)
+ self.setRowColor(self.ArbeitsschrittTable, 1,255,165,0)
+
+ # den Thread beenden
+ if hasattr(self, 'objectDetectionThread'):
+ self.objectDetectionThread.quit()
+ self.objectDetectionThread.wait()
+ print("Der ObjektDetection-Thread wurde beendet.")
+
+ if hasattr(self, 'checkWaageThread'):
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+ print("Der CheckWaage-Thread wurde beendet.")
+
+
+# new class for Camera Object detection with YOLOv8
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+
+ # Populate the model dropdown menu
+ self.populate_model_dropdown()
+
+ self.ui.startCamBtn.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.ui.stopCamBtn.clicked.connect(self.stop_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def populate_model_dropdown(self):
+ """Populate the dropdown menu with model files from the models directory."""
+ models_dir = "models"
+ model_files = [f for f in os.listdir(models_dir) if f.endswith(".pt")]
+ self.ui.modelComboBox.clear()
+ self.ui.modelComboBox.addItems(model_files)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ # self.yolo_stream.start() # Start the YOLOv8 stream
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def stop_camera(self):
+ # Stop the camera stream and processing
+ if self.yolo_stream is not None:
+ self.timer.stop() # Stop the timer
+ self.yolo_stream.cap.release() # Release the camera resource
+ self.yolo_stream = None # Reset the YOLOv8 stream object
+ self.scene.clear() # Clear the displayed frame from the graphicsView
+ print("Camera stream stopped and resources released.")
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # new part including processing via yolo model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+# new class for relay control
+class RelayControl(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+
+ self.ui.startSpotlightBtn.clicked.connect(self.spot_on)
+ self.ui.stopSpotlightBtn.clicked.connect(self.spot_off)
+ self.r = sainsmartrelay.SainsmartRelay()
+
+ def spot_on(self):
+ print("Turn on light clicked")
+ self.r.turn_on(1)
+
+ def spot_off(self):
+ print("Turn off light clicked")
+ self.r.turn_off(1)
+
+ def red_on(self):
+ print("Red light is on")
+ self.r.turn_on(2)
+
+ def red_off(self):
+ print("Red light is off")
+ self.r.turn_off(2)
+
+ def yellow_on(self):
+ print("Yellow light is on")
+ self.r.turn_on(3)
+
+ def yellow_off(self):
+ print("Yellow light is off")
+ self.r.turn_off(3)
+
+ def green_on(self):
+ print("Green light is on")
+ self.r.turn_on(4)
+
+ def green_off(self):
+ print("Green light is off")
+ self.r.turn_off(4)
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+ # initialize relay app
+ relay_app = RelayControl(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
\ No newline at end of file
diff --git a/bjoerntest2.py b/bjoerntest2.py
new file mode 100644
index 0000000..e7c38dc
--- /dev/null
+++ b/bjoerntest2.py
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'testbjoern2.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.11
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ item.setText(_translate("MainWindow", "T1"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Lgort"))
+ __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
+ self.AuftragsdetailsTable.setSortingEnabled(False)
+ item = self.AuftragsdetailsTable.item(0, 0)
+ item.setText(_translate("MainWindow", "I1"))
+ self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.textEdit.setHtml(_translate("MainWindow", "\n"
+"
\n"
+"
"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+
+
+import sys
+import cv2
+#from PyQt5 import QtCore, QtWidgets, QtGui
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self):
+ super().__init__()
+ self.initUI()
+
+ # OpenCV video capture (0 for the default camera)
+ self.cap = None # Initialize capture as None (stream starts on button click)
+
+ # Timer for updating the frame
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+
+ def initUI(self):
+ self.setWindowTitle("Camera Stream")
+
+ # Create a QGraphicsView widget
+ self.graphicsView = QtWidgets.QGraphicsView(self)
+ self.graphicsView.setGeometry(QtCore.QRect(50, 50, 640, 480))
+ self.graphicsView.setObjectName("graphicsView")
+
+ # Create a QGraphicsScene to hold the frame
+ self.scene = QtWidgets.QGraphicsScene()
+ self.graphicsView.setScene(self.scene)
+
+ # Create a button to start the camera stream
+ self.startButton = QtWidgets.QPushButton('Start Camera', self)
+ self.startButton.setGeometry(QtCore.QRect(50, 550, 120, 40)) # Position the button below the view
+ self.startButton.clicked.connect(self.start_camera)
+
+ # Show the main window
+ self.setGeometry(100, 100, 800, 600)
+ self.show()
+
+ def start_camera(self):
+ # Start OpenCV video capture (only if not already started)
+ if self.cap is None:
+ self.cap = cv2.VideoCapture(0)
+ if not self.cap.isOpened():
+ print("Error: Unable to open the camera.")
+ return
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ if self.cap:
+ ret, frame = self.cap.read() # Capture frame from the camera
+ if ret:
+ # Convert the frame from BGR (OpenCV format) to RGB
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Update the scene with the new pixmap
+ self.scene.clear()
+ self.scene.addPixmap(pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.cap is not None:
+ self.cap.release()
+ event.accept()
+
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest3.py b/bjoerntest3.py
new file mode 100644
index 0000000..14b0b6f
--- /dev/null
+++ b/bjoerntest3.py
@@ -0,0 +1,181 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.cap = None # Initialize capture as None (stream starts on button click)
+
+ # Timer for updating the frame
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+
+ # Set up the camera stream button
+ self.ui.btn1.clicked.connect(self.start_camera)
+
+ # Set up the graphics view and scene
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start OpenCV video capture (only if not already started)
+ if self.cap is None:
+ self.cap = cv2.VideoCapture(0)
+ if not self.cap.isOpened():
+ print("Error: Unable to open the camera.")
+ return
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ # def update_frame(self):
+ # if self.cap:
+ # ret, frame = self.cap.read() # Capture frame from the camera
+ # if ret:
+ # # Convert the frame from BGR (OpenCV format) to RGB
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+
+ # # Convert the frame to QImage
+ # h, w, ch = frame.shape
+ # bytes_per_line = ch * w
+ # qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # # Add the QImage to a QPixmap
+ # pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # # Update the scene with the new pixmap
+ # self.scene.clear()
+ # self.scene.addPixmap(pixmap)
+
+ def update_frame(self):
+ if self.cap:
+ ret, frame = self.cap.read() # Capture frame from the camera
+ if ret:
+ # Convert the frame from BGR (OpenCV format) to RGB
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.cap is not None:
+ self.cap.release()
+ event.accept()
+
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest4.py b/bjoerntest4.py
new file mode 100644
index 0000000..b4fa25c
--- /dev/null
+++ b/bjoerntest4.py
@@ -0,0 +1,154 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ # self.yolo_stream.start() # Start the YOLOv8 stream
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+ if ret:
+ # Convert the frame from BGR (OpenCV format) to RGB
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest5.py b/bjoerntest5.py
new file mode 100644
index 0000000..9603fe8
--- /dev/null
+++ b/bjoerntest5.py
@@ -0,0 +1,159 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ # self.yolo_stream.start() # Start the YOLOv8 stream
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # new part including processing via yolo model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest6.py b/bjoerntest6.py
new file mode 100644
index 0000000..645fde0
--- /dev/null
+++ b/bjoerntest6.py
@@ -0,0 +1,138 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+
+ # Create a vertical layout
+ self.layout = QtWidgets.QVBoxLayout(self.centralwidget)
+
+ # Add your widgets to the layout
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ self.layout.addWidget(self.AuftragsdetailsTable)
+
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.layout.addWidget(self.label)
+
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.layout.addWidget(self.textEdit)
+
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.layout.addWidget(self.bauteilTypBtn)
+
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.layout.addWidget(self.bauteiltypTextbox)
+
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.layout.addWidget(self.label_3)
+
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.layout.addWidget(self.label_4)
+
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.layout.addWidget(self.textEdit_3)
+
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.layout.addWidget(self.checkBox)
+
+ # Create the QGraphicsView
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.layout.addWidget(self.graphicsView)
+
+ # Add a button to the layout
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.layout.addWidget(self.btn1)
+
+ # Set the layout for the central widget
+ self.centralwidget.setLayout(self.layout)
+
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # Process frame via YOLO model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB)
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest7.py b/bjoerntest7.py
new file mode 100644
index 0000000..e4e27fa
--- /dev/null
+++ b/bjoerntest7.py
@@ -0,0 +1,142 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+
+ # Create a horizontal layout for the main window
+ self.layout = QtWidgets.QHBoxLayout(self.centralwidget)
+
+ # Left Column (Can be empty or have some widgets)
+ self.left_column = QtWidgets.QWidget(self.centralwidget)
+ self.left_layout = QtWidgets.QVBoxLayout(self.left_column)
+
+ # You can add more widgets to the left column here if needed
+ self.label = QtWidgets.QLabel("Left Column (Empty)", self.left_column)
+ self.left_layout.addWidget(self.label)
+
+ # Add left column widget to the main layout
+ self.layout.addWidget(self.left_column)
+
+ # Right Column
+ self.right_column = QtWidgets.QWidget(self.centralwidget)
+ self.right_layout = QtWidgets.QVBoxLayout(self.right_column)
+
+ # Add your widgets to the right layout
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.right_column)
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ self.right_layout.addWidget(self.AuftragsdetailsTable)
+
+ self.textEdit = QtWidgets.QTextEdit(self.right_column)
+ self.right_layout.addWidget(self.textEdit)
+
+ self.bauteilTypBtn = QtWidgets.QPushButton("Bauteiltype erkennen", self.right_column)
+ self.right_layout.addWidget(self.bauteilTypBtn)
+
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.right_column)
+ self.right_layout.addWidget(self.bauteiltypTextbox)
+
+ self.label_3 = QtWidgets.QLabel("Bezeichnung", self.right_column)
+ self.right_layout.addWidget(self.label_3)
+
+ self.label_4 = QtWidgets.QLabel("Pos.-Nr:", self.right_column)
+ self.right_layout.addWidget(self.label_4)
+
+ self.textEdit_3 = QtWidgets.QTextEdit(self.right_column)
+ self.right_layout.addWidget(self.textEdit_3)
+
+ self.checkBox = QtWidgets.QCheckBox("Bauteiltype locked", self.right_column)
+ self.right_layout.addWidget(self.checkBox)
+
+ # Create the QGraphicsView
+ self.graphicsView = QtWidgets.QGraphicsView(self.right_column)
+ self.right_layout.addWidget(self.graphicsView)
+
+ # Add right column widget to the main layout
+ self.layout.addWidget(self.right_column)
+
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ # Add more translations as needed
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.bauteilTypBtn.clicked.connect(self.start_camera) # Connect the button to start the camera
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # Process frame via YOLO model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB)
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest8.py b/bjoerntest8.py
new file mode 100644
index 0000000..249c756
--- /dev/null
+++ b/bjoerntest8.py
@@ -0,0 +1,159 @@
+from PyQt5 import QtCore, QtGui, QtWidgets
+import cv2
+import sys
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(1100, 20, int(640*1.2), int(480*1.2))) # position and size of camera frame
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.btn1.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ # self.yolo_stream.start() # Start the YOLOv8 stream
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # new part including processing via yolo model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/bjoerntest9.py b/bjoerntest9.py
new file mode 100644
index 0000000..3fb7269
--- /dev/null
+++ b/bjoerntest9.py
@@ -0,0 +1,910 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'test.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.9
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+########## beim Static workflow funktionieren die Threads ab dem zweiten nicht mehr
+
+#from PyQt5 import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QProgressBar
+from PyQt5 import QtCore, QtGui, QtWidgets
+from PyQt5.QtWidgets import QApplication, QComboBox
+from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject
+from PyQt5.QtGui import QColor
+
+import serial
+import binascii
+import math
+import mariadb
+import time
+import threading
+
+from CameraStream import YOLOv8CameraStream # Import the YOLOv8CameraStream class
+import cv2
+
+
+db_config = {
+ 'user': 'dbUser',
+ 'password': 'dbPassword',
+ 'host': '127.0.0.1', # 'host': 'localhost',
+ 'database': 'projectGeislinger',
+ 'port': 3306 # Standard port for MariaDB
+}
+
+# Establishing the connection
+conn = mariadb.connect(**db_config)
+# Create a cursor to execute queries
+cursor = conn.cursor()
+
+# # Konfiguration der seriellen Schnittstelle
+# ser = serial.Serial('/dev/ttyUSB0', 9600)
+
+# Configuration of the serial port
+try:
+ ser = serial.Serial('/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0', 9600)
+ print("Serial port connected successfully.")
+except serial.SerialException:
+ ser = None
+ print("Warning: Serial port not found. Continuing without serial connection. Only working for demo-purposes.")
+
+waageEingeschwungen = False
+
+
+def wahrscheinlichkeitsDichte(x,mue, var):
+ # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet
+ standardabweichung = var**0.5
+
+ result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2)
+
+ return result
+
+def calcWahrscheinlichkeitFromDichte(x,mue, var):
+ # in der Funktion wird die Wahrscheinlichkeit via der Wahrscheinlichkeitsdichte berechnet, indem das Verhältnis aus der dem Bauteil zugehörigen Wahrscheinlichkeitsdichte zu der maximalen Wahrscheinlichkeitsdichte berechnet wird
+ p1 = wahrscheinlichkeitsDichte(x,mue, var)
+ p_max = wahrscheinlichkeitsDichte(mue,mue, var)
+
+ return p1/p_max
+
+
+
+#class Worker(QThread):
+class Worker(QObject):
+ #progress = pyqtSignal(int)
+ objectDetectionStartSignal = pyqtSignal(str)
+ objectDetectionFinishedSignal = pyqtSignal(int, object)
+
+ checkWaageStartSignal = pyqtSignal(int, int, str)
+ checkWaageUpdateSignal = pyqtSignal(int, int)
+ checkWaageFinishedSignal = pyqtSignal(int)
+
+ waageStoppedSignal = pyqtSignal(int)
+ stopLoopSignal = pyqtSignal(bool) #das Signal wird verwendet um direkt den stopLoop-Wert zu ändern (also kein Funktionsaufruf)
+
+ stopLoop = False
+ btTypeIsSet = False
+ correctBtNr = False
+
+
+ def __init__(self):
+ super(Worker, self).__init__()
+ stopLoop = False
+
+
+ def getDataOfArticleType(self, allArticles, articleType):
+ # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
+ for i in allArticles:
+ if i[1] == articleType:
+ return i
+
+ return -1
+
+ def waageNichtEingeschwungenOutput(self):
+ print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
+
+ def readWaage(self):
+ # in folgender Funktion wird die Waage ausgelesen
+
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+ #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
+
+
+ if ser.is_open == False:
+ ser.open()
+
+
+ #an die Waage den Befehl senden, dass sie ausgelesen werden soll
+ ser.write(b'getWeight\n')
+ #ser.write(b'tare\n')
+ serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
+
+ # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
+ lenString = len(serialString)-1
+ if serialString[lenString] == "g" and serialString[lenString-1] == "k":
+ #print("ist eingeschwungen") #Debuggingausgabe
+ waageEingeschwungen = True
+ else:
+ print("die Waage ist noch nicht eingeschwungen")
+ waageEingeschwungen = False
+
+ #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
+ intString = ""
+ for i in serialString:
+ if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
+ intString = intString + i
+ print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
+ ## Waage auslesen - ENDE
+
+ ser.close()
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+
+ return waageEingeschwungen, intString
+
+ def objectTypeDetectionThread(self, auftragsnummer):
+ # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
+
+ #print("objectTypeDetectionThread - Running in thread:", threading.current_thread().name) #Debuggausgabe
+
+ # Parameterdefinition
+ propDensVect = []
+
+ self.btTypeIsSet = False
+
+ while(self.btTypeIsSet == False and self.stopLoop == False):
+
+ # Auslesen der Waage
+ waageEingeschwungen, intString = self.readWaage()
+ if waageEingeschwungen == False:
+ self.waageNichtEingeschwungenOutput()
+ else:
+
+ # Datenbankabfrage
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
+ cursor.execute(sql_query)
+ auftragEinzelteilDaten = cursor.fetchall()
+
+ '''
+ # Display data #Debugausgabe
+ print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
+ for row in auftragEinzelteilDaten:
+ print(row)
+ '''
+
+ # in der Folge werden alle Wahrscheinlichkeitsdichten der Auftragsbauteile berechnet und in dem Vektor gesammelt
+ for row in auftragEinzelteilDaten:
+ propDensVect.append([wahrscheinlichkeitsDichte(float(intString),float(row[6]), float(row[7])), row[1], row[5]])
+
+ # Jenen Eintrag des propDensVect raussuchen, welcher die größte Wahrscheinlichkeitsdichte beinhaltet
+ maxpropDens = 0
+ einzelteilID = 0
+ rowData = None
+ for row in propDensVect:
+ if row[0] > maxpropDens:
+ maxpropDens = row[0]
+ einzelteilID = row[1]
+ rowData = row
+
+ # überprüfen, ob das aufliegende Bauteil in der Auftragstabelle vorhanden ist
+ if(einzelteilID == 0):
+ print("Es wurde kein Bauteil aus der Auftragsliste (Tabelle) erkannt.")
+ else:
+ print("Bei dem Bauteil" , einzelteilID , "wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
+
+ # Wahrscheinlichkeit berechnen, dass das angegebene Bauteil auch wirklich diesem entspricht
+ prop = 0
+ for row in auftragEinzelteilDaten:
+ if row[1] == einzelteilID:
+ prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6]), float(row[7]))
+ break
+ print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
+
+ # den Bool auf true setzen, damit die Schleife beendet wird - dieser wird auf True gesetzt, wenn ein Bauteiltyp erkannt wird
+ self.btTypeIsSet = True
+
+ if(self.stopLoop == False):
+ # ein Signal zurück an den MainThreat senden, mit den Infos/Ergebnissen, der Typenbestimmung
+ self.objectDetectionFinishedSignal.emit(einzelteilID, rowData)
+ else:
+ self.waageStoppedSignal.emit(einzelteilID)
+
+ def checkWaageThread(self, einzelteilID, teileZuViel, auftragsnummer):
+
+ self.correctBtNr = False
+ prevAnzahl = 0
+ anzahl = 0
+ einzelteilID = einzelteilID
+
+ while (self.correctBtNr == False and self.stopLoop == False):
+
+ #überprüfen, ob die Waage eingeschwungen ist (und damit korrekte Ergebnisse liefert)
+ waageEingeschwungen, intString = self.readWaage()
+ if waageEingeschwungen == False:
+ self.waageNichtEingeschwungenOutput()
+ else:
+
+ # Datenbankabfrage - holen der Auftrags- und Bauteilinfos
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + auftragsnummer
+ cursor.execute(sql_query)
+ auftragDaten = cursor.fetchall()
+
+ '''
+ # Display data - zum Debuggen
+ print("Ausgabe der Auftragsdetails:")
+ print("id|EinzelteilID|Auftragsnummer|Anzahl")
+ for row in auftragDaten:
+ print(row)
+ '''
+
+ #auslesen, wie viele Bauteile des Types laut Auftrag vorhanden sein sollen
+ anzBauteile_soll = 0
+ idVorhanden = False
+
+ for row in auftragDaten:
+ if row[1] == einzelteilID:
+ anzBauteile_soll = row[3]
+ idVorhanden = True
+
+ if(idVorhanden == False):
+ print("Die gewählte Pos.Nr ist nicht in der Auftragsliste (Tabelle) vorhanden.")
+ return
+
+ # Berechnen der Wahrscheinlichkeitsdichten - der Betrag aller Wahrscheinlichkeitsdichten werden im propDensVect gespeichert
+ propDensVect = []
+ articleData = self.getDataOfArticleType(auftragDaten, einzelteilID)
+ for i in range(1,anzBauteile_soll+teileZuViel+1):
+ # Mathematische Sätze, auf welchen die Berechnung basiert:
+ # seien X1,..., Xn unabhängige Zufallsvariablen die N(mue_i, sigma_i^2) verteilt sind, dann ist X = X1+...+Xn - N(mue, sigma^2) verteilt mit mue=mue1+...+mue_n, sigma^2 = sigma_1^2+...+sigma_n^2
+ mueGes = float(articleData[6])*i # Berechnen des äquivalenten Mittelwert
+ varGes = float(articleData[7])*i # Berechnen der äquivalenten Varianz
+ propDensVect.append([wahrscheinlichkeitsDichte(float(intString),mueGes, varGes), i])
+
+ # durch den propDensVect iterieren und jenen Eintrag mit der höchsten Wahrscheinlichkeitsdichte raussuchen
+ maxpropDens = 0
+ for row in propDensVect:
+ if row[0] > maxpropDens:
+ maxpropDens = row[0]
+ anzahl = row[1]
+
+ # damit nur etwas gemacht wird (zb ein Updatesignal an den Hauptthread zurücksenden), wenn sich die berechnete Anzahl ändert
+ if prevAnzahl != anzahl:
+ prevAnzahl = anzahl
+
+ # Die Wahrscheinlichkeit berechnen, dass das obige Ergebnis auch dem Bauteil entspricht
+ if anzahl > 0:
+ for row in auftragDaten:
+ if row[1] == einzelteilID:
+ prop = calcWahrscheinlichkeitFromDichte(float(intString),float(row[6])*anzahl, float(row[7])*anzahl)
+ break
+ print("Die Wahrscheinlichkeit, dass es das Bauteil ist, beträgt: ", prop)
+
+ # wenn genug Bauteile vorhanden sind, dann soll die Schleife beendet werden
+ if (anzahl == anzBauteile_soll):
+ self.correctBtNr = True
+
+ # Konsolenausgabe
+ if maxpropDens > 0:
+ print("Bei der Anzahl" , anzahl , "des Bauteiltypes", einzelteilID, ",wurde die höchste Wahrscheinlichkeitsdichte berechnet.")
+ self.checkWaageUpdateSignal.emit(einzelteilID, anzahl)
+
+ else:
+ print("Von der ausgewählten Bauteiltype liegt die berechnete Wahrscheinlichkeit bei 0, dass zwischen 0 und", anzBauteile_soll+teileZuViel, "Bauteilen auf der Waage liegen.")
+ print("Falls die korrekte Anzhl an Bauteilen auf der Waage liegt, könnte der Fehler in einer falschen Kalibrierung der Waage liegen (TARE).")
+
+ if(self.stopLoop == False):
+ self.checkWaageFinishedSignal.emit(einzelteilID)
+ else:
+ self.waageStoppedSignal.emit(einzelteilID)
+
+
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ self.auftragsnummer = ""
+ self.teileZuViel = 0 # Anzahl an Bauteilen, welche zu viel drinnen sein können - der Parameter kann selbst gesetzt werden #####
+ self.correctBtNr = False
+ self.btTypeIsSet = False
+
+
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(700, 45, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 300, 661, 192))
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(7)
+ self.AuftragsdetailsTable.setRowCount(0)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(5, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(6, item)
+
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(500, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(450, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(700, 150, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.checkWaageBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.checkWaageBtn.setGeometry(QtCore.QRect(700, 460, 161, 25))
+ self.checkWaageBtn.setObjectName("checkWaageBtn")
+ self.stopLoopBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.stopLoopBtn.setGeometry(QtCore.QRect(700, 500, 161, 25))
+ self.stopLoopBtn.setObjectName("stopLoopBtn")
+ self.waageTareBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.waageTareBtn.setGeometry(QtCore.QRect(700, 100, 161, 25))
+ self.waageTareBtn.setObjectName("waageTareBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(700, 290, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.BezeichnungLabel = QtWidgets.QLabel(self.centralwidget)
+ self.BezeichnungLabel.setGeometry(QtCore.QRect(700, 270, 181, 20))
+ self.BezeichnungLabel.setObjectName("BezeichnungLabel")
+ self.PosNrLabel = QtWidgets.QLabel(self.centralwidget)
+ self.PosNrLabel.setGeometry(QtCore.QRect(700, 200, 67, 17))
+ self.PosNrLabel.setObjectName("PosNrLabel")
+ self.PosNrTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
+ self.PosNrTxtFeld.setGeometry(QtCore.QRect(700, 220, 191, 31))
+ self.BezeichnungLabel.setObjectName("BezeichnungLabel")
+ self.teileZuVielLabel = QtWidgets.QLabel(self.centralwidget)
+ self.teileZuVielLabel.setGeometry(QtCore.QRect(700, 350, 350, 17))
+ self.teileZuVielLabel.setObjectName("teileZuVielLabel")
+ self.teileZuVielTxtFeld = QtWidgets.QTextEdit(self.centralwidget)
+ self.teileZuVielTxtFeld.setGeometry(QtCore.QRect(700, 370, 191, 31))
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(700, 10, 151, 23))
+ self.checkBox.setObjectName("checkBox")
+
+ # button and checkbox for camera workflow + graphicsview widget
+ self.startCamBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.startCamBtn.setGeometry(QtCore.QRect(900, 45, 161, 25))
+ self.startCamBtn.setObjectName("startCamBtn")
+ self.stopCamBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.stopCamBtn.setGeometry(QtCore.QRect(900, 45+25, 161, 25))
+ self.stopCamBtn.setObjectName("stopCamBtn")
+ self.camWorkFlowcheckBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.camWorkFlowcheckBox.setGeometry(QtCore.QRect(900, 10, 151, 23))
+ self.camWorkFlowcheckBox.setObjectName("camWorkFlowcheckBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(1100, 20, int(640*1.2), int(480*1.2))) # position and size of camera frame
+ self.graphicsView.setObjectName("graphicsView")
+
+ #self.myTestLambda = lambda: self.worker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer)
+
+ '''
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0,item)
+ '''
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ self.btn1.clicked.connect(self.auftragsBtnClicked)
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Soll-Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Ist-Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(5)
+ item.setText(_translate("MainWindow", "Lgort"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(6)
+ item.setText(_translate("MainWindow", "set Farbe"))
+
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltyp erkennen"))
+ self.bauteilTypBtn.clicked.connect(self.objectTypeDetection)
+ self.AuftragsdetailsTable.cellClicked.connect(self.onTableCellClick)
+ #self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
+ #item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ #item.setText(_translate("MainWindow", "test"))
+ self.BezeichnungLabel.setText(_translate("MainWindow", "Bezeichnung"))
+ self.PosNrLabel.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.teileZuVielLabel.setText(_translate("MainWindow", "Zu prüfende Teileanzahl über Auftragsanzahl:"))
+ self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
+ self.checkWaageBtn.setText(_translate("MainWindow", "check Waage"))
+ self.checkWaageBtn.clicked.connect(self.checkWaage)
+ self.stopLoopBtn.setText(_translate("MainWindow", "stop loop"))
+ self.stopLoopBtn.clicked.connect(self.stopLoopClicked)
+ self.waageTareBtn.setText(_translate("MainWindow", "Waage tarieren"))
+ self.waageTareBtn.clicked.connect(self.onTareClick)
+ self.checkBox.setText(_translate("MainWindow", "static workflow"))
+ self.checkBox.clicked.connect(self.onCheckboxCheck)
+
+ # new camera workflow
+ self.startCamBtn.setText(_translate("MainWindow", "Start Camera"))
+ # self.startCamBtn.clicked.connect(self.startCamBtnClicked)
+ self.stopCamBtn.setText(_translate("MainWindow", "Stop Camera"))
+ self.camWorkFlowcheckBox.setText(_translate("MainWindow", "Camera Workflow"))
+ # self.camWorkFlowcheckBox.clicked.connect(self.onCheckboxCheck)
+
+ def onTareClick(self):
+ #Tarieren der Waage
+ if ser.is_open == False:
+ ser.open()
+ ser.write(b'tare\n')
+ ser.close()
+
+
+ def onCheckboxCheck(self):
+ if self.checkBox.isChecked() == True:
+ print("static workflow activated")
+ else:
+ print("static workflow deactivated")
+
+ def getRowNr(self, posNr):
+ for i in range(0,self.AuftragsdetailsTable.rowCount()):
+ if(self.AuftragsdetailsTable.item(i,0).text() == str(posNr)):
+ return i
+# brauche ich hier vermutlich nicht mehr - ist in den Worker Thread kopiert worden
+ def waageNichtEingeschwungenOutput(self):
+ print("Die Waage ist noch nicht eingeschwungen - Ergebnisse sind dadurch noch fehlerhaft.")
+
+ def onTableCellClick(self):
+ self.PosNrTxtFeld.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),0).text())
+ self.bauteiltypTextbox.setText(self.AuftragsdetailsTable.item(self.AuftragsdetailsTable.currentRow(),2).text())
+
+ def setAuftragsnummer(self):
+ self.auftragsnummer = self.textEdit.toPlainText()
+ if(not self.auftragsnummer):
+ self.auftragsnummer = ""
+ self.textEdit.setText("")
+
+ def checkAuftragsnummerEmpty(self):
+ if self.auftragsnummer == "":
+ print("Das Auftragsnummernfeld ist leer.")
+ return True
+ else:
+ return False
+
+ def checkPosNrEmpty(self):
+ if self.PosNrTxtFeld.toPlainText() == "":
+ return True
+ else:
+ return False
+
+
+# eventuell benötigt man die Funktion hier nicht mehr, da sie zu den Threads kopiert wurde
+ def getDataOfArticleType(self, allArticles, articleType):
+ # die Funktion geht die Liste mit allen Artikeln durch und gibt jenen Eintrag, welcher mit dem "articleType" übereinstimmt zurück
+ for i in allArticles:
+ if i[1] == articleType:
+ return i
+ return -1
+
+ def updateGUI(self):
+ self.PosNrLabel.repaint() #GUI aktualisieren
+ QApplication.processEvents() #GUI aktualisieren
+
+ def setRowColor(self, rowID,r,g,b):
+ self.AuftragsdetailsTable.item(rowID, 0).setBackground(QtGui.QColor(r,g,b))
+ self.AuftragsdetailsTable.item(rowID, 1).setBackground(QtGui.QColor(r,g,b))
+ self.AuftragsdetailsTable.item(rowID, 2).setBackground(QtGui.QColor(r,g,b))
+ self.AuftragsdetailsTable.item(rowID, 3).setBackground(QtGui.QColor(r,g,b))
+ self.AuftragsdetailsTable.item(rowID, 4).setBackground(QtGui.QColor(r,g,b))
+ self.AuftragsdetailsTable.item(rowID, 5).setBackground(QtGui.QColor(r,g,b))
+
+#wird hier vermutlich nicht mehr benötigt - wurde in die Workerklasse kopiert
+ def readWaage(self):
+ # in folgender Funktion wird die Waage ausgelesen
+
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+ #print("port to which it is connected: ", ser.portstr) #Debuggingausgabe
+ self.checkPosNrEmpty()
+
+ if ser.is_open == False:
+ ser.open()
+
+
+ #an die Waage den Befehl senden, dass sie ausgelesen werden soll
+ ser.write(b'getWeight\n')
+ #ser.write(b'tare\n')
+ serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage
+
+ # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft
+ lenString = len(serialString)-1
+ if serialString[lenString] == "g" and serialString[lenString-1] == "k":
+ #print("ist eingeschwungen") #Debuggingausgabe
+ waageEingeschwungen = True
+ else:
+ print("die Waage ist noch nicht eingeschwungen")
+ waageEingeschwungen = False
+
+ #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt
+ intString = ""
+ for i in serialString:
+ if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9":
+ intString = intString + i
+ print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg")
+ ## Waage auslesen - ENDE
+
+ ser.close()
+ #print("connection is open: ", ser.is_open) #Debuggingausgabe
+
+ return waageEingeschwungen, intString
+
+ def auftragsBtnClicked(self):
+ databaseQueryWorking = False #wird für die Überprüfung, ob die Datenbankabfrage fehlerhaft ist, verwendet
+ auftragEinzelteilDaten = []
+
+ self.setAuftragsnummer()
+ if(not self.checkAuftragsnummerEmpty()):
+
+ sql_query = "SELECT Auftraege.id, EinzelteilID, Auftragsnummer, Anzahl, Einzelteile.id, Bezeichnung, CAST(projectGeislinger.Einzelteile.GewichtMittelwert AS CHAR), CAST(projectGeislinger.Einzelteile.GewichtVarianz AS CHAR) FROM projectGeislinger.Auftraege, projectGeislinger.Einzelteile where projectGeislinger.Auftraege.EinzelteilID = projectGeislinger.Einzelteile.id AND projectGeislinger.Auftraege.Auftragsnummer = " + self.auftragsnummer
+ try:
+ cursor.execute(sql_query)
+ # Fetch results
+ auftragEinzelteilDaten = cursor.fetchall()
+ databaseQueryWorking = True
+ except:
+ print("Fehler in der Datenbankabfrage.")
+
+
+
+ if databaseQueryWorking==True and len(auftragEinzelteilDaten)>0:
+ '''
+ # Display data
+ print("Ausgabe der Auftragsdetails des obigen Auftrags, inklusive Einzelteildetails:")
+ for row in auftragEinzelteilDaten:
+ if str(row[2]) == self.auftragsnummer:
+ print("passt")
+ print(row)
+ '''
+
+ ### die Auftragsdaten in die Tabelle laden
+ self.AuftragsdetailsTable.setRowCount(len(auftragEinzelteilDaten))
+ self.item = QtWidgets.QTableWidgetItem()
+ counter = 0
+ for row in auftragEinzelteilDaten:
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 0, self.item)
+ self.item.setText(str(row[1]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 1, self.item)
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 2, self.item)
+ self.item.setText(str(row[5]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 3, self.item)
+ self.item.setText(str(row[3]))
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 4, self.item)
+ self.item.setText(str("0"))
+ self.item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(counter, 5, self.item)
+ self.item.setFlags(self.item.flags() & ~QtCore.Qt.ItemIsEditable)
+
+ # Dropdown für Farben in die 6. Spalte einfügen
+ #self.item = QtWidgets.QTableWidgetItem()
+ #self.AuftragsdetailsTable.setItem(counter, 6, self.item)
+ combo = QComboBox()
+ combo.addItems(["Farbe", "Weiß", "Orange", "Grün"])
+ combo.currentIndexChanged.connect(lambda index, rowId =counter: self.change_row_color(rowId, index))
+ self.AuftragsdetailsTable.setCellWidget(counter, 6, combo)
+ counter = counter +1
+
+ elif(databaseQueryWorking==True and len(auftragEinzelteilDaten)==0):
+ print("Es wurde in der Datenbank kein Auftrag mit dieser Auftragsnummer gefunden.")
+
+ def change_row_color(self, row, color_index):
+ if(color_index == 1):
+ self.setRowColor(row,255,255,255)
+ if(color_index == 2):
+ self.setRowColor(row,255,165,0)
+ if(color_index == 3):
+ self.setRowColor(row,0,255,0)
+
+
+
+
+ def stopLoopClicked(self):
+ # damit wird beim Klick auf den Stopbutton der stopLoop-boolWert in der Workerklasse auf true gesetzt -> der Stop des Threads wird initiiert
+ if hasattr(self, 'objectDetectionWorker'):
+ self.objectDetectionWorker.stopLoopSignal.emit(True)
+
+ if hasattr(self, 'checkWaageWorker'):
+ self.checkWaageWorker.stopLoopSignal.emit(True)
+
+ def checkWaage(self):
+ #print("Running in thread:", threading.current_thread().name) # Debuggingausgabe
+ QApplication.processEvents()
+
+ # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
+ #self.checkWaageWorker.stopLoopSignal.emit(False)
+
+ # überprüfen, ob der Auftrag geladen wurde
+ if(self.AuftragsdetailsTable.item(0,0) == None):
+ print("Der Auftrag muss zuerst geladen werden.")
+ return
+
+ # überprüfen, ob ein Bauteiltyp gesetzt wurde
+ if(self.checkPosNrEmpty()==True and self.checkBox.isChecked() == False):
+ print("Das Pos.-Nr.-Feld ist leer.")
+ return
+
+ # den GUI Wert von Textfeld TeileZuViel in die Variable schreiben
+ self.teileZuViel = int(float(self.teileZuVielTxtFeld.toPlainText()))
+ self.teileZuVielTxtFeld.setText(str(self.teileZuViel))
+
+ einzelteilID = -1 # Initialisieren der Variable mit einem Defaultwert, welcher nie eingenommen werden können sollte
+ if (self.checkBox.isChecked() == False):
+ #übernehmen der BauteilID aus dem Feld Pos.-Nr - wenn der Workflow dynamisch gewählt wurde
+ einzelteilID = int(self.PosNrTxtFeld.toPlainText())
+ else:
+ # wenn der Workflow statisch gesetzt wurde, dann soll das erste Item aus der Auftragsliste geladen werden, von welchem noch nicht genug Bauteile auf der Waage liegen
+ for i in range(0,self.AuftragsdetailsTable.rowCount()):
+ if self.AuftragsdetailsTable.item(i,3).text() != self.AuftragsdetailsTable.item(i,4).text():
+ einzelteilID = int(self.AuftragsdetailsTable.item(i,0).text())
+ self.PosNrTxtFeld.setText(str(self.AuftragsdetailsTable.item(i,0).text()))
+ self.bauteiltypTextbox.setText(str(self.AuftragsdetailsTable.item(i,2).text()))
+ break
+
+ if einzelteilID == -1:
+ # den Thread beenden
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+ try:
+ self.checkWaageThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
+ print("Der Thread wurde beendet.")
+ except:
+ print("Disconnecting the thread did not work.")
+ return
+
+
+ #zum setzen den Farbe der gesamten Reihe auf Orange
+ self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
+
+ # den Thread starten, welcher die Bauteilanzahl überprüft
+ self.checkWaageWorker = Worker()
+ self.checkWaageThread = QThread()
+
+ self.checkWaageWorker.moveToThread(self.checkWaageThread)
+
+ self.checkWaageWorker.checkWaageStartSignal.connect(self.checkWaageWorker.checkWaageThread)
+ self.checkWaageWorker.checkWaageUpdateSignal.connect(self.checkWaageUpdate)
+ self.checkWaageWorker.checkWaageFinishedSignal.connect(self.checkWaageFinished)
+ self.checkWaageWorker.waageStoppedSignal.connect(self.threadStopped)
+ self.checkWaageWorker.stopLoopSignal.connect(lambda status: setattr(self.checkWaageWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
+
+ self.checkWaageThread.started.connect(lambda: self.checkWaageWorker.checkWaageStartSignal.emit(einzelteilID, self.teileZuViel, self.auftragsnummer))
+ self.checkWaageThread.start()
+
+ def checkWaageUpdate(self, einzelteilID, anzahl):
+ # die Funktion updated die (vom Thread) berechnete Bauteilanzahl in der GUI
+ self.AuftragsdetailsTable.item(self.getRowNr(einzelteilID), 4).setText(str(anzahl)) # in die Tabelle die Anzahl an berechneten Bauteilen reinschreiben
+
+ def checkWaageFinished(self, einzelteilID):
+ self.setRowColor(self.getRowNr(einzelteilID),0,255,0) #zum setzen den Farbe der gesamten Reihe auf Grün
+
+ # den Thread beenden
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+
+ # auch wenn die Länge der Liste überschritten wurde
+ # wenn der statische Workflow aktiviert ist, dann soll die checkwaage-funktion erneut aufgerufen werden
+ if(self.checkBox.isChecked() == True):
+ self.checkWaage()
+
+ # GUI updaten
+ #self.updateGUI()
+
+ def objectTypeDetection(self):
+ # in dieser Funktion wird der Typ des Bauteils automatisch erkannt
+
+ # wenn der statische Workflow ausgewählt wurde, dann soll die checkWaage Funktion aufgerufen werden, auch wenn die detectBauteiltyp-Funkion aufgerufen wurde
+ if self.checkBox.isChecked() == True:
+ self.checkWaage()
+ return
+
+ '''
+ if(self.checkPosNrEmpty()==True):
+ print("Das Pos.-Nr.-Feld ist leer.")
+ return
+ '''
+
+ # die Loopvariable des Workers auf False setzten, damit die Schleife durchgelaufen wird (diese wird zum Abbruch der Schleife benötigt -> siehe stopLoop)
+ #self.objectDetectionWorker.stopLoopSignal.emit(False)
+
+ # überprüfen, ob der Auftrag in die Tabelle geladen wurde
+ if(self.AuftragsdetailsTable.item(0,0) == None):
+ print("Der Auftrag muss zuerst geladen werden.")
+ return
+
+ # speichert den Wert, welcher im Textfeld steht in Variablen im Code
+ self.setAuftragsnummer()
+
+ # starten des Threats, welcher den Bauteiltyp zurück gibt
+ self.objectDetectionWorker = Worker()
+ self.objectDetectionThread = QThread()
+
+ self.objectDetectionWorker.moveToThread(self.objectDetectionThread)
+
+ self.objectDetectionWorker.objectDetectionStartSignal.connect(self.objectDetectionWorker.objectTypeDetectionThread)
+ self.objectDetectionWorker.objectDetectionFinishedSignal.connect(self.objectTypeDetectionFinished)
+ self.objectDetectionWorker.waageStoppedSignal.connect(self.threadStopped)
+ self.objectDetectionWorker.stopLoopSignal.connect(lambda status: setattr(self.objectDetectionWorker, 'stopLoop', status)) #wird fürs aktive Stoppen des Threads benötigt
+
+ self.objectDetectionThread.started.connect(lambda: self.objectDetectionWorker.objectDetectionStartSignal.emit(self.auftragsnummer))
+ self.objectDetectionThread.start()
+
+ def objectTypeDetectionFinished(self, einzelteilID, rowData):
+ # wenn der Typ des Objektes erkannt wurde, dann soll die Funktion aufgerufen werden
+
+ # Schreiben der Bauteiltype und Pos.-Nr in die jeweiligen Felder
+ self.PosNrTxtFeld.setText(str(rowData[1]))
+ self.bauteiltypTextbox.setText(rowData[2])
+
+ # setzt den Boolean, um aus der Schleife raus zu gehen
+ self.btTypeIsSet = True
+
+ #zum setzen den Farbe der gesamten Reihe auf Orange
+ self.setRowColor(self.getRowNr(einzelteilID),255,165,0)
+
+ # den Thread beenden
+ self.objectDetectionThread.quit()
+ self.objectDetectionThread.wait()
+
+ '''
+ try:
+ self.objectDetectionThread.started.disconnect() # Trenne das Signal, damit es beim nächsten Start keine Konflikte gibt
+ except:
+ print(f"Error while disconnecting: {e}")
+ print("Disconnecting the thread did not work.")
+ '''
+
+ # wenn der Bauteiltyp erkannt wurde, dann soll die GUI aktualisiert werden und anschließend die CheckWaage-Funktion aufgerufen werden
+ self.updateGUI()
+ self.checkWaage()
+
+ def threadStopped(self, einzelteilID):
+ # wenn kein Bauteil erkannt wurde, dann ist die EinzenteilID = 0
+ if(einzelteilID > 0):
+ self.setRowColor(self.getRowNr(einzelteilID),255,255,255) #zum setzen den Farbe der gesamten Reihe auf Weiß
+
+ # den Thread beenden
+ if hasattr(self, 'objectDetectionThread'):
+ self.objectDetectionThread.quit()
+ self.objectDetectionThread.wait()
+ print("Der ObjektDetection-Thread wurde beendet.")
+
+ if hasattr(self, 'checkWaageThread'):
+ self.checkWaageThread.quit()
+ self.checkWaageThread.wait()
+ print("Der CheckWaage-Thread wurde beendet.")
+
+# new class for Camera Object detection with YOLOv8
+class CameraStreamApp(QtWidgets.QMainWindow):
+ def __init__(self, ui):
+ super().__init__()
+ self.ui = ui
+ self.yolo_stream = None # Initialize YOLOv8CameraStream as None
+ self.timer = QtCore.QTimer(self)
+ self.timer.timeout.connect(self.update_frame)
+ self.ui.startCamBtn.clicked.connect(self.start_camera) # start camera if button LoadAuftrag is clicked
+ self.scene = QtWidgets.QGraphicsScene(self)
+ self.ui.graphicsView.setScene(self.scene)
+
+ def start_camera(self):
+ # Start the YOLOv8 camera stream (only if not already started)
+ if self.yolo_stream is None:
+ self.yolo_stream = YOLOv8CameraStream(model_path="models/yolov8m_seg_e300.pt", logging_level="high")
+ # self.yolo_stream.start() # Start the YOLOv8 stream
+ self.timer.start(30) # Start the timer to update the frame every 30ms (about 33 FPS)
+
+ def update_frame(self):
+ # Update the frame from YOLOv8 stream
+ if self.yolo_stream:
+ ret, frame = self.yolo_stream.cap.read() # Capture frame from YOLOv8 stream
+
+ if ret:
+ # new part including processing via yolo model
+ processed_frame = self.yolo_stream.process_frame(frame)
+
+ # Convert the frame from BGR (OpenCV format) to RGB
+ # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB) # might change nomenclature later?
+
+ # Convert the frame to QImage
+ h, w, ch = frame.shape
+ bytes_per_line = ch * w
+ qt_image = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
+
+ # Add the QImage to a QPixmap
+ pixmap = QtGui.QPixmap.fromImage(qt_image)
+
+ # Get the size of the graphicsView and scale the pixmap to fit
+ view_size = self.ui.graphicsView.size()
+ scaled_pixmap = pixmap.scaled(view_size, QtCore.Qt.KeepAspectRatio)
+
+ # Update the scene with the scaled pixmap
+ self.scene.clear()
+ self.scene.addPixmap(scaled_pixmap)
+
+ def closeEvent(self, event):
+ # Release the camera when the application is closed
+ if self.yolo_stream is not None:
+ self.yolo_stream.cap.release()
+ event.accept()
+
+
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+
+ # Initialize the CameraStreamApp with the UI
+ camera_app = CameraStreamApp(ui)
+
+ MainWindow.show()
+ sys.exit(app.exec_())
+
+
+
+
+
diff --git a/compose.yml b/compose.yml
new file mode 100644
index 0000000..8898dfc
--- /dev/null
+++ b/compose.yml
@@ -0,0 +1,24 @@
+# Use root/example as user/password credentials
+version: '3.1'
+
+services:
+
+ db:
+ image: mariadb
+ restart: always
+ environment:
+ MARIADB_ROOT_PASSWORD: example
+ MARIADB_USER: dbUser
+ MARIADB_PASSWORD: dbPassword
+ MARIADB_DATABASE: projectGeislinger
+ ports:
+ - 3306:3306
+ # network_mode: host
+ # volumes:
+ # - /tmp/mysql.sock:/tmp/mysql.sock
+
+ adminer:
+ image: adminer
+ restart: always
+ ports:
+ - 8082:8080
diff --git a/environment.yaml b/environment.yaml
new file mode 100644
index 0000000..1d562d3
--- /dev/null
+++ b/environment.yaml
@@ -0,0 +1,17 @@
+name: geislinger
+channels:
+ - conda-forge
+ - nvidia
+ - pytorch
+dependencies:
+ - pip=24.2
+ - python=3.11
+ - ultralytics=8
+ - mariadb
+ - pytorch
+ - torchvision
+ - torchaudio
+ - pytorch-cuda=11.8
+ - opencv
+ - pyqt
+ - pyserial
\ No newline at end of file
diff --git a/mariadb-test.py b/mariadb-test.py
new file mode 100644
index 0000000..5171a04
--- /dev/null
+++ b/mariadb-test.py
@@ -0,0 +1,47 @@
+import mariadb
+import sys
+
+# # Database connection parameters
+# host = "127.0.0.1" # host = "localhost" # or the IP of the machine if accessed remotely
+# port = 3306
+# user = "root"
+# password = "my-secret-pw" # Update with your password
+# database = "mydatabase" # Replace with your actual database name
+
+db_config = {
+ 'user': 'dbUser',
+ 'password': 'dbPassword',
+ 'host': '127.0.0.1', # 'host': 'localhost',
+ 'database': 'projectGeislinger',
+ 'port': 3306 # Standard port for MariaDB
+}
+
+try:
+ # Establish a connection
+ # conn = mariadb.connect(
+ # user=user,
+ # password=password,
+ # host=host,
+ # port=port,
+ # database=database
+ # )
+
+ conn = mariadb.connect(**db_config)
+
+ print("Connection successful!")
+
+ # Create a cursor object
+ cur = conn.cursor()
+
+ # Example query
+ cur.execute("SELECT VERSION()")
+ result = cur.fetchone()
+ print(f"MariaDB version: {result[0]}")
+
+except mariadb.Error as e:
+ print(f"Error connecting to MariaDB: {e}")
+ sys.exit(1)
+
+finally:
+ if conn:
+ conn.close()
diff --git a/models/best_8n.pt b/models/best_8n.pt
new file mode 100644
index 0000000..feb8582
Binary files /dev/null and b/models/best_8n.pt differ
diff --git a/models/yolov10n_e300.pt b/models/yolov10n_e300.pt
new file mode 100644
index 0000000..1d966f4
Binary files /dev/null and b/models/yolov10n_e300.pt differ
diff --git a/models/yolov10n_e300_openvino_model/best.bin b/models/yolov10n_e300_openvino_model/best.bin
new file mode 100644
index 0000000..43a2d3c
Binary files /dev/null and b/models/yolov10n_e300_openvino_model/best.bin differ
diff --git a/models/yolov10n_e300_openvino_model/best.xml b/models/yolov10n_e300_openvino_model/best.xml
new file mode 100644
index 0000000..99288f5
--- /dev/null
+++ b/models/yolov10n_e300_openvino_model/best.xml
@@ -0,0 +1,10826 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 3
+ 640
+ 640
+
+
+ 16
+ 3
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 320
+ 320
+
+
+ 32
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 32
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 16
+ 16
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+ 1
+ 16
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 48
+ 160
+ 160
+
+
+ 32
+ 48
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 160
+ 160
+
+
+ 64
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 128
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 512
+ 20
+ 20
+
+
+ 256
+ 512
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 128
+ 400
+
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+ 1
+ 1
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+ 1
+ 2
+ 32
+ 400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 1
+ 2
+ 400
+ 400
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 64
+ 400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 40
+ 40
+
+
+ 128
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 2
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 80
+ 80
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 80
+ 80
+
+
+ 64
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 32
+ 32
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+ 1
+ 32
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 96
+ 80
+ 80
+
+
+ 64
+ 96
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 20
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 20
+ 80
+ 80
+
+
+ 1
+ 20
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 1
+ 20
+ 80
+ 80
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 84
+ 80
+ 80
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 80
+ 80
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 192
+ 40
+ 40
+
+
+ 128
+ 192
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 64
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 20
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 20
+ 40
+ 40
+
+
+ 1
+ 20
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 40
+ 40
+
+
+ 1
+ 20
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 84
+ 40
+ 40
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 40
+ 40
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 256
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 1
+ 1
+ 7
+ 7
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 128
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 128
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+ 1
+ 128
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 384
+ 20
+ 20
+
+
+ 256
+ 384
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 256
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 1
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 256
+ 20
+ 20
+
+
+ 64
+ 256
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 1
+ 1
+ 3
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 64
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 20
+ 64
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 20
+ 20
+ 20
+
+
+ 1
+ 20
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 20
+ 20
+
+
+ 1
+ 20
+ 20
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 84
+ 20
+ 20
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 84
+ 6400
+
+
+ 1
+ 84
+ 1600
+
+
+ 1
+ 84
+ 400
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 84
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 64
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 16
+ 8400
+
+
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 16
+ 4
+ 8400
+
+
+ 1
+ 16
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 4
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 8400
+
+
+ 1
+ 2
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 1
+ 8400
+
+
+
+
+
+
+
+ 1
+ 20
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 4
+ 8400
+
+
+ 1
+ 20
+ 8400
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 24
+ 8400
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8400
+ 24
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8400
+ 20
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 8400
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 1
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 8400
+ 4
+
+
+ 1
+ 300
+ 4
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 4
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 1
+
+
+ 3
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 20
+
+
+
+
+
+
+
+
+ 1
+ 8400
+ 20
+
+
+ 1
+ 300
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 20
+
+
+ 2
+
+
+
+
+
+
+
+
+ 1
+ 6000
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4
+
+
+ 1
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+ 300
+ 4
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 4
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+ 300
+ 4
+
+
+ 3
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+ 1
+ 1
+
+
+
+
+
+
+
+ 1
+ 300
+
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 1
+
+
+
+
+
+
+
+
+ 1
+ 300
+ 4
+
+
+ 1
+ 300
+ 1
+
+
+ 1
+ 300
+ 1
+
+
+
+
+
+
+
+ 1
+ 300
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/models/yolov10n_e300_openvino_model/metadata.yaml b/models/yolov10n_e300_openvino_model/metadata.yaml
new file mode 100644
index 0000000..c2ac264
--- /dev/null
+++ b/models/yolov10n_e300_openvino_model/metadata.yaml
@@ -0,0 +1,33 @@
+description: Ultralytics YOLOv10n model trained on rf_version2/geisi2-4/data.yaml
+author: Ultralytics
+date: '2024-09-24T13:16:48.802051'
+version: 8.2.100
+license: AGPL-3.0 License (https://ultralytics.com/license)
+docs: https://docs.ultralytics.com
+stride: 32
+task: detect
+batch: 1
+imgsz:
+- 640
+- 640
+names:
+ 0: box
+ 1: hand
+ 2: oring_100_b
+ 3: oring_40_b
+ 4: oring_d105
+ 5: oring_d300_b
+ 6: oring_l1150
+ 7: oring_l380_b
+ 8: oring_l500
+ 9: oring_l600
+ 10: oring_l650_b
+ 11: ring_40mm
+ 12: ring_45mm
+ 13: ring_58mm
+ 14: schraube_sk_m10x25
+ 15: schraube_sk_m10x30
+ 16: schraube_sk_m10x45
+ 17: schraube_sk_m12x20
+ 18: schraube_sk_m12x50
+ 19: table
diff --git a/models/yolov8m_seg_e300.pt b/models/yolov8m_seg_e300.pt
new file mode 100644
index 0000000..d5351b3
Binary files /dev/null and b/models/yolov8m_seg_e300.pt differ
diff --git a/models/yolov8n.pt b/models/yolov8n.pt
new file mode 100644
index 0000000..0db4ca4
Binary files /dev/null and b/models/yolov8n.pt differ
diff --git a/sainsmartrelay.py b/sainsmartrelay.py
new file mode 100644
index 0000000..2a930d8
--- /dev/null
+++ b/sainsmartrelay.py
@@ -0,0 +1,53 @@
+import subprocess
+
+class SainsmartRelay:
+ def __init__(self, executable="sainsmartrelay"):
+ self.executable = executable
+
+ def _run_command(self, args):
+ try:
+ result = subprocess.run(
+ [self.executable] + args,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ check=True
+ )
+ return result.stdout.strip()
+ except subprocess.CalledProcessError as e:
+ print(f"Error: {e.stderr.strip()}")
+ return None
+
+ def turn_on(self, relays):
+ """Turn on specified relays."""
+ relays_str = ','.join(map(str, relays)) if isinstance(relays, (list, tuple)) else str(relays)
+ return self._run_command(["--on", relays_str])
+
+ def turn_off(self, relays):
+ """Turn off specified relays."""
+ relays_str = ','.join(map(str, relays)) if isinstance(relays, (list, tuple)) else str(relays)
+ return self._run_command(["--off", relays_str])
+
+ def get_status(self, relays="all"):
+ """Get the status of specified relays."""
+ return self._run_command(["--status", str(relays)])
+
+ def find_all_devices(self):
+ """Find all connected FTDI devices."""
+ return self._run_command(["--findall"])
+
+# Example usage:
+if __name__ == "__main__":
+ relay = SainsmartRelay()
+
+ # Turn on relay 1
+ print(relay.turn_on(1))
+
+ # Turn off all relays
+ print(relay.turn_off("all"))
+
+ # Get the status of all relays
+ print(relay.get_status())
+
+ # Find all FTDI devices
+ print(relay.find_all_devices())
diff --git a/saved_frames/hand_20241025_105036.jpg b/saved_frames/hand_20241025_105036.jpg
new file mode 100644
index 0000000..bfd43ef
Binary files /dev/null and b/saved_frames/hand_20241025_105036.jpg differ
diff --git a/saved_frames/hand_20241025_105916.jpg b/saved_frames/hand_20241025_105916.jpg
new file mode 100644
index 0000000..006733c
Binary files /dev/null and b/saved_frames/hand_20241025_105916.jpg differ
diff --git a/saved_frames/hand_20241025_105917.jpg b/saved_frames/hand_20241025_105917.jpg
new file mode 100644
index 0000000..0874518
Binary files /dev/null and b/saved_frames/hand_20241025_105917.jpg differ
diff --git a/saved_frames/hand_20241025_105918.jpg b/saved_frames/hand_20241025_105918.jpg
new file mode 100644
index 0000000..8053a19
Binary files /dev/null and b/saved_frames/hand_20241025_105918.jpg differ
diff --git a/saved_frames/hand_20241025_105919.jpg b/saved_frames/hand_20241025_105919.jpg
new file mode 100644
index 0000000..0d1d516
Binary files /dev/null and b/saved_frames/hand_20241025_105919.jpg differ
diff --git a/saved_frames/hand_20241025_105920.jpg b/saved_frames/hand_20241025_105920.jpg
new file mode 100644
index 0000000..c7e8dc7
Binary files /dev/null and b/saved_frames/hand_20241025_105920.jpg differ
diff --git a/saved_frames/hand_20241025_105921.jpg b/saved_frames/hand_20241025_105921.jpg
new file mode 100644
index 0000000..3625894
Binary files /dev/null and b/saved_frames/hand_20241025_105921.jpg differ
diff --git a/saved_frames/hand_20241025_110016.jpg b/saved_frames/hand_20241025_110016.jpg
new file mode 100644
index 0000000..df9ec14
Binary files /dev/null and b/saved_frames/hand_20241025_110016.jpg differ
diff --git a/saved_frames/hand_20241025_110017.jpg b/saved_frames/hand_20241025_110017.jpg
new file mode 100644
index 0000000..867b261
Binary files /dev/null and b/saved_frames/hand_20241025_110017.jpg differ
diff --git a/saved_frames/hand_20241025_110018.jpg b/saved_frames/hand_20241025_110018.jpg
new file mode 100644
index 0000000..e8bada3
Binary files /dev/null and b/saved_frames/hand_20241025_110018.jpg differ
diff --git a/saved_frames/hand_20241025_110021.jpg b/saved_frames/hand_20241025_110021.jpg
new file mode 100644
index 0000000..17f67a9
Binary files /dev/null and b/saved_frames/hand_20241025_110021.jpg differ
diff --git a/saved_frames/hand_20241025_110028.jpg b/saved_frames/hand_20241025_110028.jpg
new file mode 100644
index 0000000..42b53cc
Binary files /dev/null and b/saved_frames/hand_20241025_110028.jpg differ
diff --git a/saved_frames/hand_20241025_110031.jpg b/saved_frames/hand_20241025_110031.jpg
new file mode 100644
index 0000000..7c5736c
Binary files /dev/null and b/saved_frames/hand_20241025_110031.jpg differ
diff --git a/saved_frames/hand_20241025_110032.jpg b/saved_frames/hand_20241025_110032.jpg
new file mode 100644
index 0000000..bc5c6a2
Binary files /dev/null and b/saved_frames/hand_20241025_110032.jpg differ
diff --git a/saved_frames/hand_20241025_114821.jpg b/saved_frames/hand_20241025_114821.jpg
new file mode 100644
index 0000000..6758f42
Binary files /dev/null and b/saved_frames/hand_20241025_114821.jpg differ
diff --git a/saved_frames/hand_20241025_114826.jpg b/saved_frames/hand_20241025_114826.jpg
new file mode 100644
index 0000000..128bf45
Binary files /dev/null and b/saved_frames/hand_20241025_114826.jpg differ
diff --git a/saved_frames/hand_20241025_114827.jpg b/saved_frames/hand_20241025_114827.jpg
new file mode 100644
index 0000000..a9192a5
Binary files /dev/null and b/saved_frames/hand_20241025_114827.jpg differ
diff --git a/saved_frames/hand_20241025_120810.jpg b/saved_frames/hand_20241025_120810.jpg
new file mode 100644
index 0000000..c92a8ef
Binary files /dev/null and b/saved_frames/hand_20241025_120810.jpg differ
diff --git a/saved_frames/hand_20241025_120811.jpg b/saved_frames/hand_20241025_120811.jpg
new file mode 100644
index 0000000..92f767c
Binary files /dev/null and b/saved_frames/hand_20241025_120811.jpg differ
diff --git a/saved_frames/hand_20241025_120813.jpg b/saved_frames/hand_20241025_120813.jpg
new file mode 100644
index 0000000..915bc66
Binary files /dev/null and b/saved_frames/hand_20241025_120813.jpg differ
diff --git a/saved_frames/hand_20241025_121052.jpg b/saved_frames/hand_20241025_121052.jpg
new file mode 100644
index 0000000..1c52200
Binary files /dev/null and b/saved_frames/hand_20241025_121052.jpg differ
diff --git a/saved_frames/hand_20241028_081631.jpg b/saved_frames/hand_20241028_081631.jpg
new file mode 100644
index 0000000..217c759
Binary files /dev/null and b/saved_frames/hand_20241028_081631.jpg differ
diff --git a/saved_frames/hand_20241028_090057.jpg b/saved_frames/hand_20241028_090057.jpg
new file mode 100644
index 0000000..7e63002
Binary files /dev/null and b/saved_frames/hand_20241028_090057.jpg differ
diff --git a/saved_frames/hand_20241028_090058.jpg b/saved_frames/hand_20241028_090058.jpg
new file mode 100644
index 0000000..2df34ee
Binary files /dev/null and b/saved_frames/hand_20241028_090058.jpg differ
diff --git a/saved_frames/hand_20241028_095023.jpg b/saved_frames/hand_20241028_095023.jpg
new file mode 100644
index 0000000..cd4e74c
Binary files /dev/null and b/saved_frames/hand_20241028_095023.jpg differ
diff --git a/saved_frames/hand_20241028_095024.jpg b/saved_frames/hand_20241028_095024.jpg
new file mode 100644
index 0000000..60b4a13
Binary files /dev/null and b/saved_frames/hand_20241028_095024.jpg differ
diff --git a/saved_frames/hand_20241028_095025.jpg b/saved_frames/hand_20241028_095025.jpg
new file mode 100644
index 0000000..684fcb4
Binary files /dev/null and b/saved_frames/hand_20241028_095025.jpg differ
diff --git a/saved_frames/hand_20241028_095026.jpg b/saved_frames/hand_20241028_095026.jpg
new file mode 100644
index 0000000..a549477
Binary files /dev/null and b/saved_frames/hand_20241028_095026.jpg differ
diff --git a/saved_frames/hand_20241028_095027.jpg b/saved_frames/hand_20241028_095027.jpg
new file mode 100644
index 0000000..9ec6b47
Binary files /dev/null and b/saved_frames/hand_20241028_095027.jpg differ
diff --git a/saved_frames/hand_20241028_095028.jpg b/saved_frames/hand_20241028_095028.jpg
new file mode 100644
index 0000000..602af33
Binary files /dev/null and b/saved_frames/hand_20241028_095028.jpg differ
diff --git a/saved_frames/hand_20241028_095029.jpg b/saved_frames/hand_20241028_095029.jpg
new file mode 100644
index 0000000..0f79999
Binary files /dev/null and b/saved_frames/hand_20241028_095029.jpg differ
diff --git a/saved_frames/hand_20241028_095030.jpg b/saved_frames/hand_20241028_095030.jpg
new file mode 100644
index 0000000..48f8a7d
Binary files /dev/null and b/saved_frames/hand_20241028_095030.jpg differ
diff --git a/saved_frames/hand_20241028_095031.jpg b/saved_frames/hand_20241028_095031.jpg
new file mode 100644
index 0000000..0dfe8b5
Binary files /dev/null and b/saved_frames/hand_20241028_095031.jpg differ
diff --git a/saved_frames/oring_d300_b_20241028_095016.jpg b/saved_frames/oring_d300_b_20241028_095016.jpg
new file mode 100644
index 0000000..a15991b
Binary files /dev/null and b/saved_frames/oring_d300_b_20241028_095016.jpg differ
diff --git a/saved_frames/ring_58mm_20241025_114822.jpg b/saved_frames/ring_58mm_20241025_114822.jpg
new file mode 100644
index 0000000..429f7e2
Binary files /dev/null and b/saved_frames/ring_58mm_20241025_114822.jpg differ
diff --git a/saved_frames/ring_58mm_20241025_114823.jpg b/saved_frames/ring_58mm_20241025_114823.jpg
new file mode 100644
index 0000000..a2d526d
Binary files /dev/null and b/saved_frames/ring_58mm_20241025_114823.jpg differ
diff --git a/saved_frames/ring_58mm_20241025_114824.jpg b/saved_frames/ring_58mm_20241025_114824.jpg
new file mode 100644
index 0000000..1af5a41
Binary files /dev/null and b/saved_frames/ring_58mm_20241025_114824.jpg differ
diff --git a/saved_frames/ring_58mm_20241025_114825.jpg b/saved_frames/ring_58mm_20241025_114825.jpg
new file mode 100644
index 0000000..719b657
Binary files /dev/null and b/saved_frames/ring_58mm_20241025_114825.jpg differ
diff --git a/saved_frames/schraube_sk_m10x45_20241025_110317.jpg b/saved_frames/schraube_sk_m10x45_20241025_110317.jpg
new file mode 100644
index 0000000..b3dc37d
Binary files /dev/null and b/saved_frames/schraube_sk_m10x45_20241025_110317.jpg differ
diff --git a/test.ui b/test.ui
new file mode 100644
index 0000000..fb22795
--- /dev/null
+++ b/test.ui
@@ -0,0 +1,230 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1090
+ 675
+
+
+
+ MainWindow
+
+
+
+
+
+ 900
+ 80
+ 111
+ 25
+
+
+
+ load Auftrag
+
+
+
+
+
+ 10
+ 10
+ 661
+ 192
+
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+
+ T1
+
+
+
+
+ Pos.-Nr
+
+
+
+ 8
+
+
+
+
+
+ Matnr mit hoechster Version
+
+
+
+ 8
+
+
+
+
+
+ Bezeichnung + Werkstoff
+
+
+
+ 8
+
+
+
+
+
+ Menge
+
+
+
+ 8
+
+
+
+
+
+ Lgort
+
+
+
+ 8
+
+
+
+ -
+
+ I1
+
+
+
+
+
+
+ 900
+ 20
+ 121
+ 17
+
+
+
+ Auftragsnummer:
+
+
+
+
+
+ 860
+ 40
+ 221
+ 31
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
+
+
+
+
+
+ 450
+ 350
+ 161
+ 25
+
+
+
+ Bauteiltype erkennen
+
+
+
+
+
+ 620
+ 350
+ 221
+ 31
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>
+
+
+
+
+
+ 640
+ 330
+ 181
+ 20
+
+
+
+ Bezeichnung
+
+
+
+
+
+ 910
+ 330
+ 67
+ 17
+
+
+
+ Pos.-Nr:
+
+
+
+
+
+ 850
+ 350
+ 191
+ 31
+
+
+
+
+
+
+ 460
+ 420
+ 151
+ 23
+
+
+
+ Bauteiltype locked
+
+
+ false
+
+
+
+
+
+
+
+
+
diff --git a/test2.ui.py b/test2.ui.py
new file mode 100644
index 0000000..21a878b
--- /dev/null
+++ b/test2.ui.py
@@ -0,0 +1,274 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1374
+ 725
+
+
+
+ MainWindow
+
+
+
+ true
+
+
+
+
+ 30
+ 200
+ 591
+ 371
+
+
+
+ false
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+
+ T1
+
+
+
+
+ Pos.-Nr
+
+
+
+ 8
+
+
+
+
+
+ Matnr mit hoechster Version
+
+
+
+ 8
+
+
+
+
+
+ Bezeichnung + Werkstoff
+
+
+
+ 8
+
+
+
+
+
+ Menge
+
+
+
+ 8
+
+
+
+
+
+ Lgort
+
+
+
+ 8
+
+
+
+ -
+
+ I1
+
+
+
+
+
+
+ 9
+ 9
+ 611
+ 151
+
+
+
+ Bauteile
+
+
+
+
+ 170
+ 30
+ 221
+ 71
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 31
+ 34
+ 269
+ 76
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
+
+
+
+
+
+ 31
+ 11
+ 73
+ 17
+
+
+
+ Bezeichnung
+
+
+
+
+
+
+ 420
+ 40
+ 171
+ 71
+
+
+
+ -
+
+
+ Pos.-Nr:
+
+
+
+ -
+
+
+
+
+
+
+
+ 20
+ 40
+ 161
+ 81
+
+
+
+ -
+
+
+ Bauteiltype erkennen
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+ -
+
+
+ Bauteiltype locked
+
+
+ false
+
+
+
+
+
+
+
+
+
+ 640
+ 20
+ 351
+ 571
+
+
+
+ -
+
+
+ Auftrag
+
+
+
+
+ 10
+ 32
+ 331
+ 481
+
+
+
+
-
+
+
+ Auftragsnummer:
+
+
+
+ -
+
+
+ load Auftrag
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_ui.py b/test_ui.py
new file mode 100644
index 0000000..7866ec7
--- /dev/null
+++ b/test_ui.py
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/bjoern/git/GeislingerProject/test.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.11
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(450, 350, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(620, 350, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(640, 330, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(910, 330, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(850, 350, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(460, 420, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ item.setText(_translate("MainWindow", "T1"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Lgort"))
+ __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
+ self.AuftragsdetailsTable.setSortingEnabled(False)
+ item = self.AuftragsdetailsTable.item(0, 0)
+ item.setText(_translate("MainWindow", "I1"))
+ self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.textEdit.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
diff --git a/testbjoern.py b/testbjoern.py
new file mode 100644
index 0000000..38fb692
--- /dev/null
+++ b/testbjoern.py
@@ -0,0 +1,189 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'test2.ui.py'
+#
+# Created by: PyQt5 UI code generator 5.15.11
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+import signal
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1374, 725)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setEnabled(True)
+ self.centralwidget.setObjectName("centralwidget")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(30, 200, 591, 371))
+ self.AuftragsdetailsTable.setAutoFillBackground(False)
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
+ self.groupBox.setGeometry(QtCore.QRect(9, 9, 611, 151))
+ self.groupBox.setObjectName("groupBox")
+ self.frame = QtWidgets.QFrame(self.groupBox)
+ self.frame.setGeometry(QtCore.QRect(170, 30, 221, 71))
+ self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.frame)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(31, 34, 269, 76))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.frame)
+ self.label_3.setGeometry(QtCore.QRect(31, 11, 73, 17))
+ self.label_3.setObjectName("label_3")
+ self.widget = QtWidgets.QWidget(self.groupBox)
+ self.widget.setGeometry(QtCore.QRect(420, 40, 171, 71))
+ self.widget.setObjectName("widget")
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)
+ self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.label_4 = QtWidgets.QLabel(self.widget)
+ self.label_4.setObjectName("label_4")
+ self.verticalLayout_2.addWidget(self.label_4)
+ self.textEdit_3 = QtWidgets.QTextEdit(self.widget)
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.verticalLayout_2.addWidget(self.textEdit_3)
+ self.widget1 = QtWidgets.QWidget(self.groupBox)
+ self.widget1.setGeometry(QtCore.QRect(20, 40, 161, 81))
+ self.widget1.setObjectName("widget1")
+ self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.widget1)
+ self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout_3.setObjectName("verticalLayout_3")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.widget1)
+ self.bauteilTypBtn.setCheckable(False)
+ self.bauteilTypBtn.setAutoDefault(False)
+ self.bauteilTypBtn.setDefault(False)
+ self.bauteilTypBtn.setFlat(False)
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.verticalLayout_3.addWidget(self.bauteilTypBtn)
+ self.checkBox = QtWidgets.QCheckBox(self.widget1)
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.verticalLayout_3.addWidget(self.checkBox)
+ self.widget2 = QtWidgets.QWidget(self.centralwidget)
+ self.widget2.setGeometry(QtCore.QRect(640, 20, 351, 571))
+ self.widget2.setObjectName("widget2")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.widget2)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.groupBox_2 = QtWidgets.QGroupBox(self.widget2)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.widget3 = QtWidgets.QWidget(self.groupBox_2)
+ self.widget3.setGeometry(QtCore.QRect(10, 32, 331, 481))
+ self.widget3.setObjectName("widget3")
+ self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.widget3)
+ self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout_4.setObjectName("verticalLayout_4")
+ self.label = QtWidgets.QLabel(self.widget3)
+ self.label.setObjectName("label")
+ self.verticalLayout_4.addWidget(self.label)
+ self.btn1 = QtWidgets.QPushButton(self.widget3)
+ self.btn1.setObjectName("btn1")
+ self.verticalLayout_4.addWidget(self.btn1)
+ self.graphicsView = QtWidgets.QGraphicsView(self.widget3)
+ self.graphicsView.setObjectName("graphicsView")
+ self.verticalLayout_4.addWidget(self.graphicsView)
+ self.verticalLayout.addWidget(self.groupBox_2)
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ item.setText(_translate("MainWindow", "T1"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Lgort"))
+ __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
+ self.AuftragsdetailsTable.setSortingEnabled(False)
+ item = self.AuftragsdetailsTable.item(0, 0)
+ item.setText(_translate("MainWindow", "I1"))
+ self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
+ self.groupBox.setTitle(_translate("MainWindow", "Bauteile"))
+ self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
+ self.groupBox_2.setTitle(_translate("MainWindow", "Auftrag"))
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+
+def signal_handler(sig, frame):
+ QtWidgets.QApplication.quit()
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+
+ # Handle Ctrl+C (SIGINT) to close the application
+ signal.signal(signal.SIGINT, signal_handler)
+
+ # Create a timer that runs in the background to process signals
+ timer = QtCore.QTimer()
+ timer.start(100) # Timer set to trigger every 100 ms
+ timer.timeout.connect(lambda: None) # No-op to keep the event loop running
+
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/testbjoern2.ui b/testbjoern2.ui
new file mode 100644
index 0000000..40da592
--- /dev/null
+++ b/testbjoern2.ui
@@ -0,0 +1,246 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1090
+ 675
+
+
+
+ MainWindow
+
+
+
+
+
+ 900
+ 80
+ 111
+ 25
+
+
+
+ load Auftrag
+
+
+
+
+
+ 10
+ 10
+ 661
+ 192
+
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+
+ T1
+
+
+
+
+ Pos.-Nr
+
+
+
+ 8
+
+
+
+
+
+ Matnr mit hoechster Version
+
+
+
+ 8
+
+
+
+
+
+ Bezeichnung + Werkstoff
+
+
+
+ 8
+
+
+
+
+
+ Menge
+
+
+
+ 8
+
+
+
+
+
+ Lgort
+
+
+
+ 8
+
+
+
+ -
+
+ I1
+
+
+
+
+
+
+ 900
+ 20
+ 121
+ 17
+
+
+
+ Auftragsnummer:
+
+
+
+
+
+ 860
+ 40
+ 221
+ 31
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
+
+
+
+
+
+ 60
+ 340
+ 161
+ 25
+
+
+
+ Bauteiltype erkennen
+
+
+
+
+
+ 230
+ 340
+ 221
+ 31
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+hr { height: 1px; border-width: 0; }
+li.unchecked::marker { content: "\2610"; }
+li.checked::marker { content: "\2612"; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"><br /></p></body></html>
+
+
+
+
+
+ 250
+ 320
+ 181
+ 20
+
+
+
+ Bezeichnung
+
+
+
+
+
+ 520
+ 320
+ 67
+ 17
+
+
+
+ Pos.-Nr:
+
+
+
+
+
+ 460
+ 340
+ 191
+ 31
+
+
+
+
+
+
+ 70
+ 410
+ 151
+ 23
+
+
+
+ Bauteiltype locked
+
+
+ false
+
+
+
+
+
+ 800
+ 280
+ 256
+ 192
+
+
+
+
+
+
+
+
+
+
diff --git a/testbjoern2_ui.py b/testbjoern2_ui.py
new file mode 100644
index 0000000..014d94f
--- /dev/null
+++ b/testbjoern2_ui.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/bjoern/git/GeislingerProject/testbjoern2.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.11
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(1090, 675)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.btn1 = QtWidgets.QPushButton(self.centralwidget)
+ self.btn1.setGeometry(QtCore.QRect(900, 80, 111, 25))
+ self.btn1.setObjectName("btn1")
+ self.AuftragsdetailsTable = QtWidgets.QTableWidget(self.centralwidget)
+ self.AuftragsdetailsTable.setGeometry(QtCore.QRect(10, 10, 661, 192))
+ self.AuftragsdetailsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.AuftragsdetailsTable.setObjectName("AuftragsdetailsTable")
+ self.AuftragsdetailsTable.setColumnCount(5)
+ self.AuftragsdetailsTable.setRowCount(1)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setVerticalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(3, item)
+ item = QtWidgets.QTableWidgetItem()
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ item.setFont(font)
+ self.AuftragsdetailsTable.setHorizontalHeaderItem(4, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.AuftragsdetailsTable.setItem(0, 0, item)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setGeometry(QtCore.QRect(900, 20, 121, 17))
+ self.label.setObjectName("label")
+ self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit.setGeometry(QtCore.QRect(860, 40, 221, 31))
+ self.textEdit.setObjectName("textEdit")
+ self.bauteilTypBtn = QtWidgets.QPushButton(self.centralwidget)
+ self.bauteilTypBtn.setGeometry(QtCore.QRect(60, 340, 161, 25))
+ self.bauteilTypBtn.setObjectName("bauteilTypBtn")
+ self.bauteiltypTextbox = QtWidgets.QTextEdit(self.centralwidget)
+ self.bauteiltypTextbox.setGeometry(QtCore.QRect(230, 340, 221, 31))
+ self.bauteiltypTextbox.setObjectName("bauteiltypTextbox")
+ self.label_3 = QtWidgets.QLabel(self.centralwidget)
+ self.label_3.setGeometry(QtCore.QRect(250, 320, 181, 20))
+ self.label_3.setObjectName("label_3")
+ self.label_4 = QtWidgets.QLabel(self.centralwidget)
+ self.label_4.setGeometry(QtCore.QRect(520, 320, 67, 17))
+ self.label_4.setObjectName("label_4")
+ self.textEdit_3 = QtWidgets.QTextEdit(self.centralwidget)
+ self.textEdit_3.setGeometry(QtCore.QRect(460, 340, 191, 31))
+ self.textEdit_3.setObjectName("textEdit_3")
+ self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
+ self.checkBox.setGeometry(QtCore.QRect(70, 410, 151, 23))
+ self.checkBox.setChecked(False)
+ self.checkBox.setObjectName("checkBox")
+ self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
+ self.graphicsView.setGeometry(QtCore.QRect(800, 280, 256, 192))
+ self.graphicsView.setObjectName("graphicsView")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.btn1.setText(_translate("MainWindow", "load Auftrag"))
+ item = self.AuftragsdetailsTable.verticalHeaderItem(0)
+ item.setText(_translate("MainWindow", "T1"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Pos.-Nr"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Matnr mit hoechster Version"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Bezeichnung + Werkstoff"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Menge"))
+ item = self.AuftragsdetailsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Lgort"))
+ __sortingEnabled = self.AuftragsdetailsTable.isSortingEnabled()
+ self.AuftragsdetailsTable.setSortingEnabled(False)
+ item = self.AuftragsdetailsTable.item(0, 0)
+ item.setText(_translate("MainWindow", "I1"))
+ self.AuftragsdetailsTable.setSortingEnabled(__sortingEnabled)
+ self.label.setText(_translate("MainWindow", "Auftragsnummer:"))
+ self.textEdit.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.bauteilTypBtn.setText(_translate("MainWindow", "Bauteiltype erkennen"))
+ self.bauteiltypTextbox.setHtml(_translate("MainWindow", "\n"
+"\n"
+"
"))
+ self.label_3.setText(_translate("MainWindow", "Bezeichnung"))
+ self.label_4.setText(_translate("MainWindow", "Pos.-Nr:"))
+ self.checkBox.setText(_translate("MainWindow", "Bauteiltype locked"))
diff --git a/untitled/.gitignore b/untitled/.gitignore
new file mode 100644
index 0000000..4a0b530
--- /dev/null
+++ b/untitled/.gitignore
@@ -0,0 +1,74 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+CMakeLists.txt.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+
diff --git a/untitled/build/Desktop-Debug/.qmake.stash b/untitled/build/Desktop-Debug/.qmake.stash
new file mode 100644
index 0000000..a741931
--- /dev/null
+++ b/untitled/build/Desktop-Debug/.qmake.stash
@@ -0,0 +1,23 @@
+QMAKE_CXX.QT_COMPILER_STDCXX = 201703L
+QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 13
+QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 2
+QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
+QMAKE_CXX.COMPILER_MACROS = \
+ QT_COMPILER_STDCXX \
+ QMAKE_GCC_MAJOR_VERSION \
+ QMAKE_GCC_MINOR_VERSION \
+ QMAKE_GCC_PATCH_VERSION
+QMAKE_CXX.INCDIRS = \
+ /usr/include/c++/13 \
+ /usr/include/x86_64-linux-gnu/c++/13 \
+ /usr/include/c++/13/backward \
+ /usr/lib/gcc/x86_64-linux-gnu/13/include \
+ /usr/local/include \
+ /usr/include/x86_64-linux-gnu \
+ /usr/include
+QMAKE_CXX.LIBDIRS = \
+ /usr/lib/gcc/x86_64-linux-gnu/13 \
+ /usr/lib/x86_64-linux-gnu \
+ /usr/lib \
+ /lib/x86_64-linux-gnu \
+ /lib
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx
new file mode 100644
index 0000000..9d496f7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/FILE.h.79AEFC497861DFC5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx
new file mode 100644
index 0000000..c6b0f6c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QApplication.A474B06CEF58703F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx
new file mode 100644
index 0000000..f43a73a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QLocale.01F1E8743C4251DF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx
new file mode 100644
index 0000000..fcadecd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QMainWindow.78DB6FD40CBCC891.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx
new file mode 100644
index 0000000..cc15856
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/QTranslator.BF3534267250AC30.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx
new file mode 100644
index 0000000..892b411
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__FILE.h.3324F85E382E036A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx
new file mode 100644
index 0000000..2c2dfba
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos64_t.h.23C43F442076149A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx
new file mode 100644
index 0000000..799b102
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__fpos_t.h.ECFBE9EEDAAB6648.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx
new file mode 100644
index 0000000..80ca39b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__locale_t.h.40EA38A2DCA58618.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx
new file mode 100644
index 0000000..f46650e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__mbstate_t.h.6C32CF66236653D7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx
new file mode 100644
index 0000000..5048503
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__sigset_t.h.72131E8056C7E284.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx
new file mode 100644
index 0000000..422cc8f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___gnuc_va_list.h.957EE2B4DB6A5247.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx
new file mode 100644
index 0000000..223304d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg___va_copy.h.11ED534E7AF4A856.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx
new file mode 100644
index 0000000..4c057f1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_arg.h.C38675C0D160CE4C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx
new file mode 100644
index 0000000..bee0079
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_copy.h.5812F997B3F780A9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx
new file mode 100644
index 0000000..3f10a76
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stdarg_va_list.h.A20C0FFDA235CCCC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx
new file mode 100644
index 0000000..17f9e8d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_max_align_t.h.9A696B9ACA5AF69C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx
new file mode 100644
index 0000000..78cfd33
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_null.h.46DACB2AE1FCBB57.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx
new file mode 100644
index 0000000..7f1e60d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_nullptr_t.h.BB76DF7F0265238C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx
new file mode 100644
index 0000000..345432b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_offsetof.h.F032B8137362A473.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx
new file mode 100644
index 0000000..114645e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_ptrdiff_t.h.244B2A4B8AE5E0B4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx
new file mode 100644
index 0000000..949c5e6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_size_t.h.747ED4A2DA41774B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx
new file mode 100644
index 0000000..eca5437
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/__stddef_wchar_t.h.E89E65F6312D18C8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx
new file mode 100644
index 0000000..09c7a80
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithm.4283CE8E04B88D2A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx
new file mode 100644
index 0000000..a5ed3db
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/algorithmfwd.h.B52ADC7A074104CF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx
new file mode 100644
index 0000000..c51d02a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/align.h.80C2512B8F842646.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx
new file mode 100644
index 0000000..cb7b880
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/aligned_buffer.h.A18F22CAB29234EA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx
new file mode 100644
index 0000000..74daa95
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.5CF5F0A69C036EAA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx
new file mode 100644
index 0000000..c39f157
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloc_traits.h.72E7C35C664767C1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx
new file mode 100644
index 0000000..2d5f581
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/alloca.h.793370BF9878CFB6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx
new file mode 100644
index 0000000..c14842a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocated_ptr.h.8214ECF4C56E78C2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx
new file mode 100644
index 0000000..dc4a45e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/allocator.h.D31E7B8BEFD5AE94.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx
new file mode 100644
index 0000000..318f265
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/array.184FFFD3B962987A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx
new file mode 100644
index 0000000..a25d70b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assert.h.9895EEC17E1D2A2B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx
new file mode 100644
index 0000000..a22b002
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/assertions.h.266799074BAB8854.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx
new file mode 100644
index 0000000..e395f47
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic.46821F82D327FD81.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx
new file mode 100644
index 0000000..06a8a70
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_base.h.9272BFEE4EE55D68.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx
new file mode 100644
index 0000000..898545e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_lockfree_defines.h.2A0580E3C1CF977D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx
new file mode 100644
index 0000000..ea46575
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_wide_counter.h.397D66B6BECC0AA2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx
new file mode 100644
index 0000000..f25658a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomic_word.h.0B7FB187C2532DE8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx
new file mode 100644
index 0000000..da09b46
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/atomicity.h.D4655A6FAF2C5588.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx
new file mode 100644
index 0000000..268879c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/auto_ptr.h.D1AF7143391B211D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx
new file mode 100644
index 0000000..159e054
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.h.636F8FA9AD80474A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx
new file mode 100644
index 0000000..e5ff0a0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/basic_string.tcc.2D0C76EB3099AFF8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx
new file mode 100644
index 0000000..8aa56c7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/binders.h.C589B2454DC21565.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx
new file mode 100644
index 0000000..d4c0990
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/bit.E77EA5629EB3D467.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx
new file mode 100644
index 0000000..3fd541f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/byteswap.h.E57FF553A16DFAFC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx
new file mode 100644
index 0000000..8e4373a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++allocator.h.20AC450864A96F4F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx
new file mode 100644
index 0000000..7615cde
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++config.h.BF2F33665D7EB4A5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx
new file mode 100644
index 0000000..c700618
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/c++locale.h.53918663E9B050A1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx
new file mode 100644
index 0000000..8e21cb5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cctype.7A2E5B928BCF3845.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx
new file mode 100644
index 0000000..748f2cc
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cdefs.h.E4D450DF98C1338F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx
new file mode 100644
index 0000000..894a1dc
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cerrno.B65C14291DEB12F2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx
new file mode 100644
index 0000000..a411a5c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/char_traits.h.263114DAEE0F7CAC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx
new file mode 100644
index 0000000..90e50f3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/charconv.h.45DC5854263DB0A4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx
new file mode 100644
index 0000000..20d8636
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.F95978433952CB73.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx
new file mode 100644
index 0000000..478326e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/chrono.h.E832445DA3CBDA93.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx
new file mode 100644
index 0000000..0ddc981
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clocale.8BFEF3D6DA37B94B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx
new file mode 100644
index 0000000..8c93363
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clock_t.h.65AFE5BA7329BCD4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx
new file mode 100644
index 0000000..7f0ebde
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/clockid_t.h.5545878511E5BAF1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx
new file mode 100644
index 0000000..68074f8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/compare.EDA7854AE5DA59D4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx
new file mode 100644
index 0000000..bfd55dc
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concept_check.h.39429B249CB86886.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx
new file mode 100644
index 0000000..dcafa82
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/concurrence.h.368FF763D62F871B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx
new file mode 100644
index 0000000..54cae7c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cookie_io_functions_t.h.5A08066DC7F05542.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx
new file mode 100644
index 0000000..7334605
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpp_type_traits.h.D80F5D0FD57269EA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx
new file mode 100644
index 0000000..6dbe681
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu-set.h.B40F3E2869BE4FF9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx
new file mode 100644
index 0000000..700f1d2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cpu_defines.h.4E18A129B41E38AC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx
new file mode 100644
index 0000000..cd269f0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstddef.06546D6D9FEED08D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx
new file mode 100644
index 0000000..d0f7501
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdint.91EF72212746155E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx
new file mode 100644
index 0000000..b0d2d69
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdio.E3D7014BBC7C7170.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx
new file mode 100644
index 0000000..ad5a625
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cstdlib.73317090CF3984CF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx
new file mode 100644
index 0000000..f9b6e22
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctime.FD7CD791ADF7455F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx
new file mode 100644
index 0000000..c15c43d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ctype.h.B268CEA0CECCFC59.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx
new file mode 100644
index 0000000..74d94a8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cwchar.415F3E4D1314A235.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx
new file mode 100644
index 0000000..9c04d3e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_forced.h.260618EE85312CAA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx
new file mode 100644
index 0000000..5f55095
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/cxxabi_init_exception.h.CA78BEA70589FE17.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx
new file mode 100644
index 0000000..261cf7e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/debug.h.E107AF16C7F0CBAA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx
new file mode 100644
index 0000000..7d00b63
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/enable_special_members.h.D0E1B0D83298787A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx
new file mode 100644
index 0000000..6351802
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.1FC6A4D6D2846204.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx
new file mode 100644
index 0000000..0ddeaa8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endian.h.20F8E286A486EE09.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx
new file mode 100644
index 0000000..8b68010
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/endianness.h.F2D2CC6251A4EAFA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx
new file mode 100644
index 0000000..bed83fb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/erase_if.h.52AC17D898D2345C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx
new file mode 100644
index 0000000..06e3d50
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno-base.h.23FC55A99C73A727.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx
new file mode 100644
index 0000000..d6f1b50
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.063064A523A47758.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx
new file mode 100644
index 0000000..bc7b404
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.10013861918E601A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx
new file mode 100644
index 0000000..610ef91
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.19BCCCD58DA5623E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx
new file mode 100644
index 0000000..37312f7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.33F6986A3C61A3BF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx
new file mode 100644
index 0000000..5f43f38
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/errno.h.3F8ECD84FB880B64.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx
new file mode 100644
index 0000000..d8343de
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_constants.h.FAB62781508B6283.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx
new file mode 100644
index 0000000..d1ac19e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/error_t.h.58D3895A591B592D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx
new file mode 100644
index 0000000..7d089dc
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.9BD9E09A0A7198C6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx
new file mode 100644
index 0000000..df37c47
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception.h.60232BC787A23EFB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx
new file mode 100644
index 0000000..35f81b4
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_defines.h.E3E83F3521CDDF95.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx
new file mode 100644
index 0000000..27ce461
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/exception_ptr.h.A3D4E42C18D066BB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx
new file mode 100644
index 0000000..a4612c2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/execution_defs.h.EA0BF88CD36110B9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx
new file mode 100644
index 0000000..bee52f7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features-time64.h.BFBA8D3CA0316037.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx
new file mode 100644
index 0000000..85d9c52
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/features.h.5A4ED7C80201A723.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx
new file mode 100644
index 0000000..0afe620
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn-common.h.0FE8C4DDCB84E088.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx
new file mode 100644
index 0000000..78afe87
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/floatn.h.DA21C738CC1B6ABF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx
new file mode 100644
index 0000000..8cee638
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functexcept.h.206192DEF17B89F8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx
new file mode 100644
index 0000000..6ed34af
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional.1ABC5CEB1A730878.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx
new file mode 100644
index 0000000..905ff36
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/functional_hash.h.1DDE07C659671E5C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx
new file mode 100644
index 0000000..00111a0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_algorithm_defs.h.400B86BACA15F86C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx
new file mode 100644
index 0000000..3a074a6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_memory_defs.h.29B5F90E12B4C61C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx
new file mode 100644
index 0000000..b86069c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/glue_numeric_defs.h.6191E3EBAF802F7C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx
new file mode 100644
index 0000000..380d122
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr-default.h.7F136A8E758182CE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx
new file mode 100644
index 0000000..c670e95
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/gthr.h.70C66586E0E99D6D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx
new file mode 100644
index 0000000..a05481a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hash_bytes.h.878C140FA90D5822.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx
new file mode 100644
index 0000000..a40ffe3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable.h.44D7678B598CA27C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx
new file mode 100644
index 0000000..8a928ad
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/hashtable_policy.h.02AE91A05F6E02C7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx
new file mode 100644
index 0000000..7759100
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/initializer_list.AFC06A41CFC1543D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx
new file mode 100644
index 0000000..fbd09b3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/invoke.h.2B1ACA2407CB05E3.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx
new file mode 100644
index 0000000..48eae73
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ios_base.h.0442D829AE4A2428.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx
new file mode 100644
index 0000000..db99012
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iosfwd.163CBDA627BDB3A3.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx
new file mode 100644
index 0000000..8d1442a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/iterator.1BD365EA5EDE5210.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx
new file mode 100644
index 0000000..a1d897e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/libc-header-start.h.E88219B53B0B0BF5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx
new file mode 100644
index 0000000..b8bfda4
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.507F66A5F268FCAA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx
new file mode 100644
index 0000000..ab0fc2d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1DFE7D0FE6434B13.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx
new file mode 100644
index 0000000..9c2538f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.1E7D7771EC751FFB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx
new file mode 100644
index 0000000..2839b1a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/limits.h.C293B8934AC926BB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx
new file mode 100644
index 0000000..f8d6b49
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.7909E1D6E2B739A0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx
new file mode 100644
index 0000000..69af85b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/list.tcc.FF41A54BBD49B033.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx
new file mode 100644
index 0000000..a608ffd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/local_lim.h.2CFD657F256B117E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx
new file mode 100644
index 0000000..68d4145
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.E3C63D05A4E78516.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx
new file mode 100644
index 0000000..98c08c3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale.h.F1B51844858762D2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx
new file mode 100644
index 0000000..0b1fbb0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.h.03600D2B458E75FA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx
new file mode 100644
index 0000000..dda8c1a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_classes.tcc.69A59E265193CBC8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx
new file mode 100644
index 0000000..2fb7c4b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/locale_t.h.557516A6B361170F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx
new file mode 100644
index 0000000..241d412
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/localefwd.h.8D507D2D246F7EFC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx
new file mode 100644
index 0000000..df07314
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/long-double.h.ACD735A1862B6BF8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx
new file mode 100644
index 0000000..9ad5c25
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/main.cpp.2D227B92B66939DB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx
new file mode 100644
index 0000000..bce5988
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.cpp.5DBE48AB22A3742A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx
new file mode 100644
index 0000000..119b2a7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mainwindow.h.2DEFA841ACD26463.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx
new file mode 100644
index 0000000..706e7fa
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/map.67F74A10898EA76A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx
new file mode 100644
index 0000000..436c554
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/mbstate_t.h.F9237FB65FF84D5A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx
new file mode 100644
index 0000000..5d40b25
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory.DEB7D2B4EBB93631.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx
new file mode 100644
index 0000000..0c69ce3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memory_resource.h.8CBC2A2935956F47.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx
new file mode 100644
index 0000000..f73b428
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/memoryfwd.h.8339F1696DAE3C08.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx
new file mode 100644
index 0000000..95de148
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/move.h.82CE505FF4CFACB8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx
new file mode 100644
index 0000000..606ae6d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/nested_exception.h.5EE3E7707B4F93EB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx
new file mode 100644
index 0000000..ae0de57
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new.41D56A2D69E57DED.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx
new file mode 100644
index 0000000..e3b79db
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/new_allocator.h.FD7B7B64B2A2207B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx
new file mode 100644
index 0000000..6702e10
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/node_handle.h.F46F9F3F43861006.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx
new file mode 100644
index 0000000..a8d1ebb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric.F93D8B803F42F31D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx
new file mode 100644
index 0000000..4bb72e1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/numeric_traits.h.8FEF7D9B8E9913D8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx
new file mode 100644
index 0000000..784c8c2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/os_defines.h.5BE086DD68F6A410.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx
new file mode 100644
index 0000000..0575c1a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ostream_insert.h.D2F22116BE7D73E6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx
new file mode 100644
index 0000000..884cf7d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/parse_numbers.h.EC5583E0556FCEF1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx
new file mode 100644
index 0000000..6312e36
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix1_lim.h.D94E4687FC9359FF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx
new file mode 100644
index 0000000..dccb77d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/posix2_lim.h.430DA38A1F301F29.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx
new file mode 100644
index 0000000..573a900
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/postypes.h.BE1513ED32E6A399.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx
new file mode 100644
index 0000000..40d189b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/predefined_ops.h.B15CDC54361DCC11.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx
new file mode 100644
index 0000000..3ad6e78
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pstl_config.h.78EC065511725BA3.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx
new file mode 100644
index 0000000..5e88da1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread.h.022320E0CE01A46D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx
new file mode 100644
index 0000000..c1b51a2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthread_stack_min-dynamic.h.6F432801F0DF58B7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx
new file mode 100644
index 0000000..976528f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes-arch.h.9E138C411BE448A0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx
new file mode 100644
index 0000000..77a5037
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/pthreadtypes.h.BAA8217B62BB6E86.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx
new file mode 100644
index 0000000..e1cffa1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ptr_traits.h.BC3863E4C7FECDA0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx
new file mode 100644
index 0000000..c422245
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qalgorithms.h.FD2ECFF5676E6790.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx
new file mode 100644
index 0000000..9b41d07
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qapplication.h.A93E4553FB9CB7A2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx
new file mode 100644
index 0000000..469e2ad
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qarraydata.h.59BE31F3BBA8ED3E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx
new file mode 100644
index 0000000..a5d4c43
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic.h.F27F4B16AB53D9F8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx
new file mode 100644
index 0000000..d8fd807
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qatomic_cxx11.h.69F2114361242273.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx
new file mode 100644
index 0000000..60b74bf
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbasicatomic.h.A2BFD15B643C1404.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx
new file mode 100644
index 0000000..bd6da89
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbrush.h.D44E532BF6C7C41E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx
new file mode 100644
index 0000000..80d1dcb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearray.h.3E258E5BF8C780EA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx
new file mode 100644
index 0000000..cf5c782
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qbytearraylist.h.E2E8090DE1F836AD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx
new file mode 100644
index 0000000..e29b8d8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qchar.h.AA0A3CD3BD472DA0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx
new file mode 100644
index 0000000..83ee86e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcolor.h.5684E01578882E86.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx
new file mode 100644
index 0000000..51df47d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcompilerdetection.h.7273FAC81D36B620.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx
new file mode 100644
index 0000000..9d0b8b0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qconfig.h.F68B1AFB5E4EF498.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx
new file mode 100644
index 0000000..89a72f5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainerfwd.h.A8D45E2A7296D1C8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx
new file mode 100644
index 0000000..d90c63e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcontainertools_impl.h.7644E4C51B877567.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx
new file mode 100644
index 0000000..f9749f5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreapplication.h.0A5B8B7796FFF62E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx
new file mode 100644
index 0000000..6178589
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcoreevent.h.F3CEEB53B346C550.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx
new file mode 100644
index 0000000..da76d56
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qcursor.h.69E8ABF61EB150EC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx
new file mode 100644
index 0000000..ed2993a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qdatastream.h.911D7CBB33217000.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx
new file mode 100644
index 0000000..0917c4d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qeventloop.h.634AE2F88E9E40CC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx
new file mode 100644
index 0000000..fbdd605
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qflags.h.759D8986082A8255.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx
new file mode 100644
index 0000000..b979b8d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfont.h.A1BC5EA710C0475E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx
new file mode 100644
index 0000000..d6883a9
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontinfo.h.2B115D24EC8E4A62.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx
new file mode 100644
index 0000000..de5eb60
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qfontmetrics.h.1E754D652EDBD45C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx
new file mode 100644
index 0000000..7fbcfe5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qgenericatomic.h.D2595E9059CE3E6F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx
new file mode 100644
index 0000000..f8ba586
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobal.h.80C5986D0C867ACE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx
new file mode 100644
index 0000000..3c66b5b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qglobalstatic.h.B90F9758F0EF15A9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx
new file mode 100644
index 0000000..98911be
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qguiapplication.h.B71C26C78EAD409D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx
new file mode 100644
index 0000000..6c7f8c1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhash.h.C345BB5A3DCF91DD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx
new file mode 100644
index 0000000..28cf550
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qhashfunctions.h.7524BE336D4E70AF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx
new file mode 100644
index 0000000..bb9acfd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qicon.h.F590370864B9ACC9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx
new file mode 100644
index 0000000..3ccdca0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qimage.h.B98B60217EC4C94F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx
new file mode 100644
index 0000000..1900169
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qinputmethod.h.62638013DB836F5C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx
new file mode 100644
index 0000000..ddc1726
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiodevice.h.86919C8F00908C87.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx
new file mode 100644
index 0000000..7b1fbc5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qiterator.h.A52C38FD59FD21C6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx
new file mode 100644
index 0000000..e9ad6c6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qkeysequence.h.EC0D1C6B79C0D9AF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx
new file mode 100644
index 0000000..4c90a42
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qline.h.08A4D350D9C9644B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx
new file mode 100644
index 0000000..16f1bff
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlist.h.A54757BEE4315CE6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx
new file mode 100644
index 0000000..5d9bb2c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlocale.h.7E7DB33F1A299A16.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx
new file mode 100644
index 0000000..548a1a6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qlogging.h.88C32C1FE85F3443.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx
new file mode 100644
index 0000000..9d01a19
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmainwindow.h.2825B14DFE1FF1B4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx
new file mode 100644
index 0000000..eee87bf
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmap.h.8CA468BD1FBCE665.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx
new file mode 100644
index 0000000..7820ca5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmargins.h.C0D077F7860E1277.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx
new file mode 100644
index 0000000..8e064b2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmatrix.h.00820805EF576E4B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx
new file mode 100644
index 0000000..6411576
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qmetatype.h.541E34D6E6760512.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx
new file mode 100644
index 0000000..579d201
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnamespace.h.EC3FC28536503AF1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx
new file mode 100644
index 0000000..37d79a4
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qnumeric.h.A66D4612F55B13BE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx
new file mode 100644
index 0000000..3e717bb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject.h.8D479A7B3FDCD700.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx
new file mode 100644
index 0000000..766d3c0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobject_impl.h.310F998ABFD21C29.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx
new file mode 100644
index 0000000..5121f8e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.598B10433A0B063A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx
new file mode 100644
index 0000000..143f314
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs.h.A64CF055117FDFF7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx
new file mode 100644
index 0000000..1c5aa0a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qobjectdefs_impl.h.7990AFD078F8EA35.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx
new file mode 100644
index 0000000..02502e0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpaintdevice.h.4748152C3010F1F9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx
new file mode 100644
index 0000000..5ed0b47
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpair.h.9DEE0C3D7A14D2D0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx
new file mode 100644
index 0000000..3f6a7c1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpalette.h.4842B06684DDBDAE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx
new file mode 100644
index 0000000..b391194
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixelformat.h.620C90AEA27BFC2A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx
new file mode 100644
index 0000000..b3f4fcd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpixmap.h.D73E0EAB31C7D791.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx
new file mode 100644
index 0000000..a674219
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpoint.h.A7DD7B4CA031A3A7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx
new file mode 100644
index 0000000..37d807d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qpolygon.h.4000A0F75B81224E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx
new file mode 100644
index 0000000..d564584
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qprocessordetection.h.F5198DD5442AFC6E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx
new file mode 100644
index 0000000..d38d234
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrect.h.F6CF1537A0B18D4C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx
new file mode 100644
index 0000000..7784970
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrefcount.h.6BCA9FE7BAF3DF25.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx
new file mode 100644
index 0000000..035b12b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregexp.h.8088EF7E18743A13.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx
new file mode 100644
index 0000000..4a676c5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qregion.h.56C430EE51273A95.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx
new file mode 100644
index 0000000..f9f4d23
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgb.h.2B6D1755758FF0DF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx
new file mode 100644
index 0000000..94c5dcf
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qrgba64.h.A8C3238E8B988F3B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx
new file mode 100644
index 0000000..d766713
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qscopedpointer.h.447CA7EB36AE21C6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx
new file mode 100644
index 0000000..e09cb28
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qshareddata.h.1613C0F5A4F18669.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx
new file mode 100644
index 0000000..8345b43
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer.h.9FB2460B773F76C5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx
new file mode 100644
index 0000000..90441af
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsharedpointer_impl.h.901DC4E517036607.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx
new file mode 100644
index 0000000..2127909
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsize.h.BEC23C243EFEF7A4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx
new file mode 100644
index 0000000..e12a254
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsizepolicy.h.118596B94F6E5633.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx
new file mode 100644
index 0000000..38bf730
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstring.h.D18E3F7143B0C176.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx
new file mode 100644
index 0000000..87928e6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringalgorithms.h.BCB989669B8CD32D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx
new file mode 100644
index 0000000..58a863e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringlist.h.B03A2F9985D050E5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx
new file mode 100644
index 0000000..87b83c8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringliteral.h.0A066A3902B9CE30.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx
new file mode 100644
index 0000000..d26fd1c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringmatcher.h.7D870B6147C84076.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx
new file mode 100644
index 0000000..d6965e0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qstringview.h.A67B8B8FF41BFF55.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx
new file mode 100644
index 0000000..3cfff0c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsysinfo.h.8EF4D5AF4D751B51.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx
new file mode 100644
index 0000000..eb60234
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qsystemdetection.h.8329D2CD97522D7C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx
new file mode 100644
index 0000000..c74fb86
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtabwidget.h.C4E9E0C72F6941B1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx
new file mode 100644
index 0000000..36eec6c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtcore-config.h.0C11AA7F7C9F0EA4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx
new file mode 100644
index 0000000..c30a855
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtgui-config.h.0898F0E1544AC047.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx
new file mode 100644
index 0000000..360788a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtguiglobal.h.80A0DFCC7763ABCB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx
new file mode 100644
index 0000000..8a2ec72
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtransform.h.97E922D9DE075E31.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx
new file mode 100644
index 0000000..b6b8bb8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtranslator.h.E43F40A38E0AFDC4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx
new file mode 100644
index 0000000..e237400
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgets-config.h.3C31FF7C5B82440C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx
new file mode 100644
index 0000000..0cfe638
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtwidgetsglobal.h.0D7FCF3A707EDF44.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx
new file mode 100644
index 0000000..5cd6017
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qtypeinfo.h.5160790443A251D4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx
new file mode 100644
index 0000000..8d80472
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvariant.h.4C476E0F61671237.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx
new file mode 100644
index 0000000..f649dbd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvarlengtharray.h.7FE8B531C3A3B76F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx
new file mode 100644
index 0000000..67b3084
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qvector.h.D123A02691F2B7AD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx
new file mode 100644
index 0000000..e6eef91
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qversiontagging.h.3C43080618F516BF.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx
new file mode 100644
index 0000000..0caf566
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwidget.h.5A43191B86718350.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx
new file mode 100644
index 0000000..5e11b6d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/qwindowdefs.h.434E87C4F63B3C91.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx
new file mode 100644
index 0000000..44b27ae
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/range_access.h.F2D342D0170A00E0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx
new file mode 100644
index 0000000..f6bc45d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/ratio.637BCEE78C1EAF1F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx
new file mode 100644
index 0000000..2364fb9
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/refwrap.h.F7E25ED78261BCB2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx
new file mode 100644
index 0000000..abca3eb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/requires_hosted.h.26268E021F0ECE3C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx
new file mode 100644
index 0000000..33bcae0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.A585A48500495348.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx
new file mode 100644
index 0000000..1928bbe
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sched.h.E8530EF262253892.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx
new file mode 100644
index 0000000..43d71b0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.BA57472D13519767.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx
new file mode 100644
index 0000000..269c2db
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/select.h.E19325D0BE3592A0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx
new file mode 100644
index 0000000..0c012ea
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/setjmp.h.71DEFB3DCC800794.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx
new file mode 100644
index 0000000..ad11036
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr.h.58B2A3F1F22B1E10.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx
new file mode 100644
index 0000000..32164d5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_atomic.h.D4122DD7C624F18E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx
new file mode 100644
index 0000000..ded6a35
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/shared_ptr_base.h.BE69034022EA8FA4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx
new file mode 100644
index 0000000..261f145
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/sigset_t.h.32273C537A103809.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx
new file mode 100644
index 0000000..56f4651
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/single_threaded.h.918E7314A6EC8DC0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx
new file mode 100644
index 0000000..7156559
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_abs.h.B5BC80B73AA8AA04.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx
new file mode 100644
index 0000000..3f3641b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/std_function.h.1DBFFD209E231917.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx
new file mode 100644
index 0000000..8d9fd72
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdarg.h.32EA7B95DAFCCF99.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx
new file mode 100644
index 0000000..30de0be
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdc-predef.h.9EA93D70716BF84B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx
new file mode 100644
index 0000000..5f48782
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stddef.h.B10142B5B6E10391.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx
new file mode 100644
index 0000000..7d24b76
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdexcept.FC9481857B4FA9B4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx
new file mode 100644
index 0000000..242bbed
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-intn.h.EE0939E700184847.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx
new file mode 100644
index 0000000..8e71d66
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-least.h.A0CB5BC401DAC650.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx
new file mode 100644
index 0000000..2029c24
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint-uintn.h.B3EA113168048B57.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx
new file mode 100644
index 0000000..0bed224
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.08597F86630FDE5E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx
new file mode 100644
index 0000000..d9cfbe4
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdint.h.22B451C129B23D79.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx
new file mode 100644
index 0000000..671fc1e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio.h.6919C07CB89D47AD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx
new file mode 100644
index 0000000..a1140d2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdio_lim.h.09E79B5FC5C8DF86.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx
new file mode 100644
index 0000000..e1df232
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib-float.h.126E8959FAE2A511.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx
new file mode 100644
index 0000000..bf6b0f1
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.42D90B865E21AB50.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx
new file mode 100644
index 0000000..c00952b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stdlib.h.61AA7B9EED10C430.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx
new file mode 100644
index 0000000..2f2d499
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algo.h.336B2A99E112B831.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx
new file mode 100644
index 0000000..61034c4
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_algobase.h.555E5AB59D1CE434.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx
new file mode 100644
index 0000000..05d0f35
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_bvector.h.8AE3CEBB0EAAE7AC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx
new file mode 100644
index 0000000..c9910ec
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_construct.h.675F3C756D2CDDFB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx
new file mode 100644
index 0000000..1a377bb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_function.h.4312324AADC9200E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx
new file mode 100644
index 0000000..1234551
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_heap.h.A0022ED15B79087D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx
new file mode 100644
index 0000000..90a7dd3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator.h.70D88ADB523A155E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx
new file mode 100644
index 0000000..ba2ef37
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_funcs.h.0D39D2E36115557E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx
new file mode 100644
index 0000000..acae06b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_iterator_base_types.h.1C2D9B2B05C1363B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx
new file mode 100644
index 0000000..c1045ac
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_list.h.063E636C37F12734.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx
new file mode 100644
index 0000000..a3f6ee8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_map.h.EC07165BB825159E.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx
new file mode 100644
index 0000000..22fda43
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_multimap.h.5B0E5766E75F4152.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx
new file mode 100644
index 0000000..3a05359
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_numeric.h.936BC0F7F7FAE23C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx
new file mode 100644
index 0000000..4611b65
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_pair.h.33E007C18AD1880F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx
new file mode 100644
index 0000000..81c6bad
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_raw_storage_iter.h.E907E48D11449F0C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx
new file mode 100644
index 0000000..2e6b9f6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_relops.h.8CD880CC32BA3E47.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx
new file mode 100644
index 0000000..449c352
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tempbuf.h.1CFD178B11157DBE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx
new file mode 100644
index 0000000..2cad7b0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_tree.h.C190197022C6FA1F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx
new file mode 100644
index 0000000..efa0781
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_uninitialized.h.54EDC68402026771.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx
new file mode 100644
index 0000000..c9543d8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stl_vector.h.5BE0DC1E083D4239.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx
new file mode 100644
index 0000000..ed6db6c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stream_iterator.h.61B56BA0B3239EDE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx
new file mode 100644
index 0000000..3fa2d26
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.7FD2D3A2B827E078.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx
new file mode 100644
index 0000000..c7a4b37
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf.tcc.FB7963A391C77967.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx
new file mode 100644
index 0000000..83f7a1b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/streambuf_iterator.h.2D64BA51BC9EC9AD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx
new file mode 100644
index 0000000..b1e5e8c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.7B4FE7410F5C09C9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx
new file mode 100644
index 0000000..68cfd0c
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string.h.979B97B48AB27554.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx
new file mode 100644
index 0000000..103daa5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_conversions.h.FEDA0A74BBD67E42.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx
new file mode 100644
index 0000000..744aabd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.808DF2D0BB7723EB.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx
new file mode 100644
index 0000000..29f0428
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/string_view.tcc.3D79C5B861AFBD05.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx
new file mode 100644
index 0000000..742e33f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stringfwd.h.557FE983BB1E2646.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx
new file mode 100644
index 0000000..8c2a66d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/strings.h.9EB46A34EB89BB5D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx
new file mode 100644
index 0000000..748d8ff
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_FILE.h.2B6C435DE91D3DF8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx
new file mode 100644
index 0000000..c5191c0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct___jmp_buf_tag.h.C41AC0386D4A06C8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx
new file mode 100644
index 0000000..1c8422d
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_itimerspec.h.7F2AA6FE7224B30F.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx
new file mode 100644
index 0000000..c78433a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_mutex.h.A62EF32C01DB3505.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx
new file mode 100644
index 0000000..6d3c2f6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_rwlock.h.76DF445C3AA414C9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx
new file mode 100644
index 0000000..d1dd9c0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_sched_param.h.B3F662015F7067C8.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx
new file mode 100644
index 0000000..88d168f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timespec.h.0E09B6677A8D6A08.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx
new file mode 100644
index 0000000..c439849
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_timeval.h.4A17C4CCB9EE5883.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx
new file mode 100644
index 0000000..bf1eef3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/struct_tm.h.472DDF26D5924DB0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx
new file mode 100644
index 0000000..143de8f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs-64.h.C743FD695F310B00.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx
new file mode 100644
index 0000000..ca6ae11
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/stubs.h.07D09A29AEBA877C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx
new file mode 100644
index 0000000..7afe64a
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/system_error.8A12E1E8FFB1D44A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx
new file mode 100644
index 0000000..2f14b99
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/thread-shared-types.h.D988ADBA7666A8DD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx
new file mode 100644
index 0000000..69b1b1b
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.E3714B647728C2FE.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx
new file mode 100644
index 0000000..3e7dc08
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time.h.EDC06F0AFB6EC7EC.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx
new file mode 100644
index 0000000..00b9e17
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time64.h.1807D6F5124100A2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx
new file mode 100644
index 0000000..5a04bd0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/time_t.h.CAA645D29A7A0EF9.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx
new file mode 100644
index 0000000..5de8fe7
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timer_t.h.3EFB88CBA2B5B801.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx
new file mode 100644
index 0000000..7205ec2
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timesize.h.44719E86E09400E4.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx
new file mode 100644
index 0000000..7f6c68f
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/timex.h.F2D36E17192C32F0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx
new file mode 100644
index 0000000..076ea1e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/tuple.778CE823941F84F0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx
new file mode 100644
index 0000000..3849d36
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.DE435E04D8184E0C.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx
new file mode 100644
index 0000000..46a22cb
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/type_traits.h.833B6807C34CC271.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx
new file mode 100644
index 0000000..ab8a385
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typeinfo.0065C4A406A05D71.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx
new file mode 100644
index 0000000..1761d10
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5A59583DBE28918.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx
new file mode 100644
index 0000000..2ea54c9
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/types.h.E5E7FE6DA0F78AF5.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx
new file mode 100644
index 0000000..a21e087
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/typesizes.h.A6E116B64E63B90B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx
new file mode 100644
index 0000000..7e840c3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uintn-identity.h.CB86545C6FF94BB3.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx
new file mode 100644
index 0000000..032d3bf
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uio_lim.h.DF584C6AE54BEA07.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx
new file mode 100644
index 0000000..d73262e
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uniform_int_dist.h.C54B19F2B43B693B.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx
new file mode 100644
index 0000000..0a55f05
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unique_ptr.h.A3AB02F93B77F5A0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx
new file mode 100644
index 0000000..5f901e6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.CA82C61ED27DA8D6.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx
new file mode 100644
index 0000000..9a99891
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/unordered_map.h.917859E405C5B5EA.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx
new file mode 100644
index 0000000..42459c0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator.h.258C17386C08195D.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx
new file mode 100644
index 0000000..1835ff6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/uses_allocator_args.h.DD2424DE20F3F1C7.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx
new file mode 100644
index 0000000..1e92279
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.5D04E6A553B4780A.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx
new file mode 100644
index 0000000..ca928f8
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/utility.h.15845B2F303871C2.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx
new file mode 100644
index 0000000..5e6bcdd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/variant.0361674085D4F5FD.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx
new file mode 100644
index 0000000..f003bd9
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.04C1B55C46383484.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx
new file mode 100644
index 0000000..e61b076
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/vector.tcc.9925CCCCF876B8E0.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx
new file mode 100644
index 0000000..bb37595
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitflags.h.8046C5530CD87302.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx
new file mode 100644
index 0000000..86c09ac
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/waitstatus.h.D7C4F06852D51050.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx
new file mode 100644
index 0000000..85f48dd
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.27C0562D93BBAA12.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx
new file mode 100644
index 0000000..6215da3
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wchar.h.83BD995621576773.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx
new file mode 100644
index 0000000..c0eb7f0
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wint_t.h.DAC5928CF0BA7895.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx
new file mode 100644
index 0000000..7adf2a5
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/wordsize.h.23D8030BEC81E6F1.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx
new file mode 100644
index 0000000..f5114a6
Binary files /dev/null and b/untitled/build/Desktop-Debug/.qtc_clangd/.cache/clangd/index/xopen_lim.h.E4E4BC8C11167D14.idx differ
diff --git a/untitled/build/Desktop-Debug/.qtc_clangd/compile_commands.json b/untitled/build/Desktop-Debug/.qtc_clangd/compile_commands.json
new file mode 100644
index 0000000..f112847
--- /dev/null
+++ b/untitled/build/Desktop-Debug/.qtc_clangd/compile_commands.json
@@ -0,0 +1 @@
+[{"arguments":["clang","-Wno-documentation-unknown-command","-Wno-unknown-warning-option","-Wno-unknown-pragmas","-nostdinc","-nostdinc++","-pipe","-g","-std=gnu++1z","-Wall","-Wextra","-D_REENTRANT","-fPIC","-fsyntax-only","-m64","--target=x86_64-linux-gnu","-DQT_QML_DEBUG","-DQT_WIDGETS_LIB","-DQT_GUI_LIB","-DQT_CORE_LIB","-DQ_CREATOR_RUN","-DQT_ANNOTATE_FUNCTION(x)=__attribute__((annotate(#x)))","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders/QtCore","-I/home/bjoern/git/GeislingerProject/untitled","-I/usr/include/x86_64-linux-gnu/qt5","-I/usr/include/x86_64-linux-gnu/qt5/QtWidgets","-I/usr/include/x86_64-linux-gnu/qt5/QtGui","-I/usr/include/x86_64-linux-gnu/qt5/QtCore","-I/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug","-I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++","-isystem","/usr/include/c++/13","-isystem","/usr/include/x86_64-linux-gnu/c++/13","-isystem","/usr/include/c++/13/backward","-isystem","/usr/local/include","-isystem","/usr/lib/llvm-18/lib/clang/18/include","-isystem","/usr/include/x86_64-linux-gnu","-isystem","/usr/include","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fretain-comments-from-system-headers","-fmacro-backtrace-limit=0","-ferror-limit=1000","-x","c++","/home/bjoern/git/GeislingerProject/untitled/main.cpp"],"directory":"/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/.qtc_clangd","file":"/home/bjoern/git/GeislingerProject/untitled/main.cpp"},{"arguments":["clang","-Wno-documentation-unknown-command","-Wno-unknown-warning-option","-Wno-unknown-pragmas","-nostdinc","-nostdinc++","-pipe","-g","-std=gnu++1z","-Wall","-Wextra","-D_REENTRANT","-fPIC","-fsyntax-only","-m64","--target=x86_64-linux-gnu","-DQT_QML_DEBUG","-DQT_WIDGETS_LIB","-DQT_GUI_LIB","-DQT_CORE_LIB","-DQ_CREATOR_RUN","-DQT_ANNOTATE_FUNCTION(x)=__attribute__((annotate(#x)))","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders/QtCore","-I/home/bjoern/git/GeislingerProject/untitled","-I/usr/include/x86_64-linux-gnu/qt5","-I/usr/include/x86_64-linux-gnu/qt5/QtWidgets","-I/usr/include/x86_64-linux-gnu/qt5/QtGui","-I/usr/include/x86_64-linux-gnu/qt5/QtCore","-I/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug","-I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++","-isystem","/usr/include/c++/13","-isystem","/usr/include/x86_64-linux-gnu/c++/13","-isystem","/usr/include/c++/13/backward","-isystem","/usr/local/include","-isystem","/usr/lib/llvm-18/lib/clang/18/include","-isystem","/usr/include/x86_64-linux-gnu","-isystem","/usr/include","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fretain-comments-from-system-headers","-fmacro-backtrace-limit=0","-ferror-limit=1000","-x","c++","/home/bjoern/git/GeislingerProject/untitled/mainwindow.cpp"],"directory":"/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/.qtc_clangd","file":"/home/bjoern/git/GeislingerProject/untitled/mainwindow.cpp"},{"arguments":["clang","-Wno-documentation-unknown-command","-Wno-unknown-warning-option","-Wno-unknown-pragmas","-nostdinc","-nostdinc++","-pipe","-g","-std=gnu++1z","-Wall","-Wextra","-D_REENTRANT","-fPIC","-fsyntax-only","-m64","--target=x86_64-linux-gnu","-DQT_QML_DEBUG","-DQT_WIDGETS_LIB","-DQT_GUI_LIB","-DQT_CORE_LIB","-DQ_CREATOR_RUN","-DQT_ANNOTATE_FUNCTION(x)=__attribute__((annotate(#x)))","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders/QtCore","-I/home/bjoern/git/GeislingerProject/untitled","-I/usr/include/x86_64-linux-gnu/qt5","-I/usr/include/x86_64-linux-gnu/qt5/QtWidgets","-I/usr/include/x86_64-linux-gnu/qt5/QtGui","-I/usr/include/x86_64-linux-gnu/qt5/QtCore","-I/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug","-I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++","-isystem","/usr/include/c++/13","-isystem","/usr/include/x86_64-linux-gnu/c++/13","-isystem","/usr/include/c++/13/backward","-isystem","/usr/local/include","-isystem","/usr/lib/llvm-18/lib/clang/18/include","-isystem","/usr/include/x86_64-linux-gnu","-isystem","/usr/include","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fretain-comments-from-system-headers","-fmacro-backtrace-limit=0","-ferror-limit=1000","-x","c++-header","/home/bjoern/git/GeislingerProject/untitled/mainwindow.h"],"directory":"/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/.qtc_clangd","file":"/home/bjoern/git/GeislingerProject/untitled/mainwindow.h"},{"arguments":["clang","-Wno-documentation-unknown-command","-Wno-unknown-warning-option","-Wno-unknown-pragmas","-nostdinc","-nostdinc++","-pipe","-g","-std=gnu++1z","-Wall","-Wextra","-D_REENTRANT","-fPIC","-fsyntax-only","-m64","--target=x86_64-linux-gnu","-DQT_QML_DEBUG","-DQT_WIDGETS_LIB","-DQT_GUI_LIB","-DQT_CORE_LIB","-DQ_CREATOR_RUN","-DQT_ANNOTATE_FUNCTION(x)=__attribute__((annotate(#x)))","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders","-I/usr/share/qtcreator/cplusplus/wrappedQtHeaders/QtCore","-I/home/bjoern/git/GeislingerProject/untitled","-I/usr/include/x86_64-linux-gnu/qt5","-I/usr/include/x86_64-linux-gnu/qt5/QtWidgets","-I/usr/include/x86_64-linux-gnu/qt5/QtGui","-I/usr/include/x86_64-linux-gnu/qt5/QtCore","-I/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug","-I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++","-isystem","/usr/include/c++/13","-isystem","/usr/include/x86_64-linux-gnu/c++/13","-isystem","/usr/include/c++/13/backward","-isystem","/usr/local/include","-isystem","/usr/lib/llvm-18/lib/clang/18/include","-isystem","/usr/include/x86_64-linux-gnu","-isystem","/usr/include","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fretain-comments-from-system-headers","-fmacro-backtrace-limit=0","-ferror-limit=1000","-x","c++-header","/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/ui_mainwindow.h"],"directory":"/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/.qtc_clangd","file":"/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/ui_mainwindow.h"}]
\ No newline at end of file
diff --git a/untitled/build/Desktop-Debug/qmake_qmake_qm_files.qrc b/untitled/build/Desktop-Debug/qmake_qmake_qm_files.qrc
new file mode 100644
index 0000000..bbbcbde
--- /dev/null
+++ b/untitled/build/Desktop-Debug/qmake_qmake_qm_files.qrc
@@ -0,0 +1,5 @@
+
+
+/home/bjoern/git/GeislingerProject/untitled/build/Desktop-Debug/.qm/untitled_en_US.qm
+
+
diff --git a/untitled/main.cpp b/untitled/main.cpp
new file mode 100644
index 0000000..59aa77d
--- /dev/null
+++ b/untitled/main.cpp
@@ -0,0 +1,23 @@
+#include "mainwindow.h"
+
+#include
+#include
+#include
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+
+ QTranslator translator;
+ const QStringList uiLanguages = QLocale::system().uiLanguages();
+ for (const QString &locale : uiLanguages) {
+ const QString baseName = "untitled_" + QLocale(locale).name();
+ if (translator.load(":/i18n/" + baseName)) {
+ a.installTranslator(&translator);
+ break;
+ }
+ }
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
diff --git a/untitled/mainwindow.cpp b/untitled/mainwindow.cpp
new file mode 100644
index 0000000..2740a6e
--- /dev/null
+++ b/untitled/mainwindow.cpp
@@ -0,0 +1,14 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent)
+ , ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
diff --git a/untitled/mainwindow.h b/untitled/mainwindow.h
new file mode 100644
index 0000000..f7a3da3
--- /dev/null
+++ b/untitled/mainwindow.h
@@ -0,0 +1,23 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include
+
+QT_BEGIN_NAMESPACE
+namespace Ui {
+class MainWindow;
+}
+QT_END_NAMESPACE
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(QWidget *parent = nullptr);
+ ~MainWindow();
+
+private:
+ Ui::MainWindow *ui;
+};
+#endif // MAINWINDOW_H
diff --git a/untitled/mainwindow.ui b/untitled/mainwindow.ui
new file mode 100644
index 0000000..8fe2c68
--- /dev/null
+++ b/untitled/mainwindow.ui
@@ -0,0 +1,61 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 800
+ 600
+
+
+
+ MainWindow
+
+
+
+
+
+ 250
+ 100
+ 401
+ 371
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 210
+ 180
+ 80
+ 25
+
+
+
+ PushButton
+
+
+
+
+
+
+
+
+
+
diff --git a/untitled/mainwindow_ui.py b/untitled/mainwindow_ui.py
new file mode 100644
index 0000000..cc95a87
--- /dev/null
+++ b/untitled/mainwindow_ui.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/bjoern/git/GeislingerProject/untitled/mainwindow.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.11
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again. Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+ def setupUi(self, MainWindow):
+ MainWindow.setObjectName("MainWindow")
+ MainWindow.resize(800, 600)
+ self.centralwidget = QtWidgets.QWidget(MainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.frame = QtWidgets.QFrame(self.centralwidget)
+ self.frame.setGeometry(QtCore.QRect(250, 100, 401, 371))
+ self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.pushButton = QtWidgets.QPushButton(self.frame)
+ self.pushButton.setGeometry(QtCore.QRect(210, 180, 80, 25))
+ self.pushButton.setObjectName("pushButton")
+ MainWindow.setCentralWidget(self.centralwidget)
+ self.menubar = QtWidgets.QMenuBar(MainWindow)
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
+ self.menubar.setObjectName("menubar")
+ MainWindow.setMenuBar(self.menubar)
+ self.statusbar = QtWidgets.QStatusBar(MainWindow)
+ self.statusbar.setObjectName("statusbar")
+ MainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(MainWindow)
+ QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+ def retranslateUi(self, MainWindow):
+ _translate = QtCore.QCoreApplication.translate
+ MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
+ self.pushButton.setText(_translate("MainWindow", "PushButton"))
diff --git a/untitled/untitled.pro b/untitled/untitled.pro
new file mode 100644
index 0000000..8d58fe5
--- /dev/null
+++ b/untitled/untitled.pro
@@ -0,0 +1,29 @@
+QT += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++17
+
+# You can make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+ main.cpp \
+ mainwindow.cpp
+
+HEADERS += \
+ mainwindow.h
+
+FORMS += \
+ mainwindow.ui
+
+TRANSLATIONS += \
+ untitled_en_US.ts
+CONFIG += lrelease
+CONFIG += embed_translations
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
diff --git a/untitled/untitled_en_US.ts b/untitled/untitled_en_US.ts
new file mode 100644
index 0000000..edd0d34
--- /dev/null
+++ b/untitled/untitled_en_US.ts
@@ -0,0 +1,3 @@
+
+
+
diff --git a/vaapitest.py b/vaapitest.py
new file mode 100644
index 0000000..c3eea25
--- /dev/null
+++ b/vaapitest.py
@@ -0,0 +1,43 @@
+import cv2
+import numpy as np
+import subprocess
+
+# Define the FFmpeg command to read from the camera
+ffmpeg_command = [
+ 'ffmpeg',
+ '-f', 'v4l2', # Input format
+ '-i', '/dev/video0', # Camera device
+ '-f', 'rawvideo', # Output format
+ '-pix_fmt', 'bgr24', # Pixel format
+ '-an', # Disable audio
+ '-sn', # Disable subtitles
+ '-'
+]
+
+# Start the FFmpeg process
+process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, bufsize=10**8)
+
+# Set the width and height for the camera resolution
+width = 1920
+height = 1080
+
+while True:
+ # Read a frame from the FFmpeg output
+ raw_frame = process.stdout.read(width * height * 3) # 3 bytes per pixel for BGR
+ if not raw_frame:
+ break # Exit the loop if no more frames
+
+ # Convert the byte data to a numpy array and reshape it to an image
+ frame = np.frombuffer(raw_frame, np.uint8).reshape((height, width, 3))
+
+ # Display the frame using OpenCV
+ cv2.imshow('Camera Stream', frame)
+
+ # Break the loop on 'q' key press
+ if cv2.waitKey(1) & 0xFF == ord('q'):
+ break
+
+# Clean up
+process.stdout.close()
+process.wait()
+cv2.destroyAllWindows()
diff --git a/wledControl.py b/wledControl.py
new file mode 100644
index 0000000..4046e53
--- /dev/null
+++ b/wledControl.py
@@ -0,0 +1,90 @@
+import serial
+import time
+
+class WLEDController:
+ def __init__(self, port: str, baud_rate: int = 115200, timeout: float = 1.0):
+ """
+ Initialize the WLEDController.
+
+ :param port: The serial port to which the ESP32 is connected (e.g., '/dev/ttyUSB0').
+ :param baud_rate: The baud rate for the serial connection.
+ :param timeout: The timeout for serial communication in seconds.
+ """
+ self.port = port
+ self.baud_rate = baud_rate
+ self.timeout = timeout
+ self.connection = None
+
+ def connect(self):
+ """Establish the serial connection."""
+ try:
+ self.connection = serial.Serial(
+ self.port, self.baud_rate, timeout=self.timeout
+ )
+ print(f"Connected to {self.port}")
+ except serial.SerialException as e:
+ print(f"Failed to connect to {self.port}: {e}")
+
+ def disconnect(self):
+ """Close the serial connection."""
+ if self.connection and self.connection.is_open:
+ self.connection.close()
+ print(f"Disconnected from {self.port}")
+
+ def send_command(self, command: str):
+ """
+ Send a command to the WLED device.
+
+ :param command: The JSON command string to send.
+ """
+ if not self.connection or not self.connection.is_open:
+ raise ConnectionError("Serial connection is not open.")
+ try:
+ self.connection.write(command.encode('utf-8'))
+ print(f"Sent command: {command}")
+ except serial.SerialException as e:
+ print(f"Failed to send command: {e}")
+
+ def switch_to_red(self):
+ """Switch the light to red."""
+ self.send_command('{"ps":"1"}')
+
+ def switch_to_yellow(self):
+ """Switch the light to yellow."""
+ self.send_command('{"ps":"2"}')
+
+ def switch_to_green(self):
+ """Switch the light to green."""
+ self.send_command('{"ps":"3"}')
+
+ def turn_off_all(self):
+ """Turn off all lights."""
+ self.send_command('{"ps":"4"}')
+
+ def change_effect(self):
+ """Change the color effect."""
+ self.send_command('{"ps":"5"}')
+
+# Example usage:
+if __name__ == "__main__":
+ controller = WLEDController(port="/dev/serial/by-path/pci-0000:00:14.0-usbv2-0:1:1.0-port0")
+ controller.connect()
+
+ try:
+ controller.switch_to_red()
+ time.sleep(2) # Wait for 2 seconds
+
+ controller.switch_to_yellow()
+ time.sleep(2) # Wait for 2 seconds
+
+ controller.switch_to_green()
+ time.sleep(2) # Wait for 2 seconds
+
+ controller.change_effect()
+ time.sleep(2) # Wait for 2 seconds
+
+ controller.turn_off_all()
+ time.sleep(2) # Wait for 2 seconds
+
+ finally:
+ controller.disconnect()
\ No newline at end of file