add 2 graphs if data is available
update calculations and values update diameter from float (mm) to int (um)
This commit is contained in:
parent
625ea6c511
commit
226f4469f8
123
BlockStackApp.py
123
BlockStackApp.py
@ -155,21 +155,6 @@ class BlockStackApp(QWidget):
|
||||
if confirmation == QMessageBox.Yes:
|
||||
self.close()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def change_button_color(self, block_id, button_name, color):
|
||||
block = self.blocks.get(block_id)
|
||||
if block:
|
||||
@ -200,17 +185,17 @@ class BlockStackApp(QWidget):
|
||||
# Handle the data received from the serial port
|
||||
print(f"Data received: {data}")
|
||||
|
||||
def update_block(self, is_running, diameter_value, position_value):
|
||||
def update_block(self, is_running, dial_number, diameter_value, position_value):
|
||||
ts = round(time.time() * 1000)
|
||||
|
||||
# Update the block with diameter_value and position_value
|
||||
worker = self.sender()
|
||||
diameter_avg = 0.0000
|
||||
est_wgh = 0
|
||||
worker.block.dia_label.setText(f"{diameter_value:.3f} ")
|
||||
if dial_number == 0:
|
||||
worker.block.len_label.setText(f"{position_value/1000:.3f}")
|
||||
|
||||
if is_running:
|
||||
if True:
|
||||
if worker.reset_data:
|
||||
worker.diameter_total = diameter_value
|
||||
worker.diameter_count = 1
|
||||
@ -220,24 +205,20 @@ class BlockStackApp(QWidget):
|
||||
worker.data_list.clear()
|
||||
worker.reset_data = False
|
||||
else:
|
||||
if is_running:
|
||||
worker.diameter_total += diameter_value # to calc average diameter
|
||||
worker.diameter_count += 1
|
||||
|
||||
if diameter_value < worker.diameter_min: # process min/max
|
||||
worker.diameter_min = diameter_value
|
||||
if diameter_value > worker.diameter_max:
|
||||
worker.diameter_max = diameter_value
|
||||
|
||||
worker.block.min_label.setText(f"{worker.diameter_min:.3f} ")
|
||||
worker.block.max_label.setText(f"{worker.diameter_max:.3f} ")
|
||||
|
||||
# push data to memory for report
|
||||
worker.data_list.append((ts, position_value, diameter_value))
|
||||
worker.data_list.append((ts, dial_number, position_value, diameter_value))
|
||||
|
||||
# push data to graph and update it
|
||||
self.update_graph(worker, diameter_value)
|
||||
self.update_graph(worker, dial_number, diameter_value)
|
||||
|
||||
# calculate and display average diameter
|
||||
if is_running:
|
||||
diameter_avg = worker.diameter_total / worker.diameter_count if worker.diameter_count > 0 else 0.0
|
||||
worker.block.avg_label.setText(f"{diameter_avg:.4f}")
|
||||
|
||||
@ -247,23 +228,87 @@ class BlockStackApp(QWidget):
|
||||
worker.block.wht_label.setText(f"{est_wgh/1000:.3f} ")
|
||||
|
||||
|
||||
def update_graph(self, worker, diameter_value):
|
||||
# Update the graph with the new diameter value
|
||||
x_data = worker.line.get_xdata()
|
||||
y_data = worker.line.get_ydata()
|
||||
x_data = list(x_data)
|
||||
y_data = list(y_data)
|
||||
def update_graph(self, worker, dial_number,diameter_value):
|
||||
# def update_graph(self, worker, dial_number, diameter_value, diameter_value2, diameter_value3):
|
||||
|
||||
# Append new data point
|
||||
x_data.append(len(x_data))
|
||||
y_data.append(diameter_value)
|
||||
|
||||
# Update the line with the new data
|
||||
worker.line.set_data(x_data, y_data)
|
||||
# diameter_value2 = diameter_value + random.randrange(-300, 300, 10)/1000
|
||||
# diameter_value3 = diameter_value + random.randrange(-300, 300, 10)/1000
|
||||
|
||||
# Update the graph with the new diameter values
|
||||
x_data1 = worker.line1.get_xdata()
|
||||
y_data1 = worker.line1.get_ydata()
|
||||
x_data2 = worker.line2.get_xdata()
|
||||
y_data2 = worker.line2.get_ydata()
|
||||
x_data3 = worker.line3.get_xdata()
|
||||
y_data3 = worker.line3.get_ydata()
|
||||
|
||||
x_data1 = list(x_data1)
|
||||
y_data1 = list(y_data1)
|
||||
x_data2 = list(x_data2)
|
||||
y_data2 = list(y_data2)
|
||||
x_data3 = list(x_data3)
|
||||
y_data3 = list(y_data3)
|
||||
|
||||
# Append new data points
|
||||
match dial_number:
|
||||
case 0:
|
||||
x_data1.append(len(x_data1))
|
||||
y_data1.append(diameter_value)
|
||||
worker.diameter_value1 = diameter_value
|
||||
case 1:
|
||||
x_data2.append(len(x_data2))
|
||||
y_data2.append(diameter_value)
|
||||
worker.diameter_value2 = diameter_value
|
||||
case 2:
|
||||
x_data3.append(len(x_data3))
|
||||
y_data3.append(diameter_value)
|
||||
worker.diameter_value3 = diameter_value
|
||||
|
||||
|
||||
# Keep only the last 100 values
|
||||
if not worker.is_running:
|
||||
# Keep only the last 100 values
|
||||
if len(y_data1) > 100:
|
||||
y_data1 = y_data1[-100:]
|
||||
y_data2 = y_data2[-100:]
|
||||
y_data3 = y_data3[-100:]
|
||||
|
||||
# Update x-axis values to reflect the rolling window
|
||||
x_data1 = list(range(len(y_data1)))
|
||||
x_data2 = list(range(len(y_data2)))
|
||||
x_data3 = list(range(len(y_data3)))
|
||||
|
||||
all_y_data = y_data1 + y_data2 + y_data3
|
||||
|
||||
worker.diameter_min = min(all_y_data)
|
||||
worker.diameter_max = max(all_y_data)
|
||||
|
||||
worker.block.min_label.setText(f"{worker.diameter_min:.3f} ")
|
||||
worker.block.max_label.setText(f"{worker.diameter_max:.3f} ")
|
||||
|
||||
diameter_avg = sum(all_y_data) / len(all_y_data) if all_y_data else 0
|
||||
worker.block.avg_label.setText(f"{diameter_avg:.4f}")
|
||||
|
||||
diameter_calc = worker.diameter_value1
|
||||
diameter_n = 1
|
||||
# Update the lines with the new data
|
||||
worker.line1.set_data(x_data1, y_data1)
|
||||
if len(y_data2) > 0:
|
||||
worker.line2.set_data(x_data2, y_data2)
|
||||
diameter_calc += worker.diameter_value2
|
||||
diameter_n += 1
|
||||
if len(y_data3) > 0:
|
||||
worker.line3.set_data(x_data3, y_data3)
|
||||
diameter_calc += worker.diameter_value3
|
||||
diameter_n += 1
|
||||
|
||||
worker.diameter_value = diameter_calc / diameter_n
|
||||
worker.block.dia_label.setText(f"{worker.diameter_value:.3f} ")
|
||||
|
||||
# Rescale the graph
|
||||
worker.line.axes.relim()
|
||||
worker.line.axes.autoscale_view()
|
||||
worker.line1.axes.relim()
|
||||
worker.line1.axes.autoscale_view()
|
||||
|
||||
# Redraw the canvas
|
||||
worker.canvas.draw()
|
||||
|
||||
@ -16,7 +16,7 @@ from datetime import datetime
|
||||
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
||||
|
||||
class UpdateWorker(QThread):
|
||||
update_signal = pyqtSignal(bool, float, float, float, float)
|
||||
update_signal = pyqtSignal(bool, int, float, float)
|
||||
data_received = pyqtSignal(str)
|
||||
stop_signal = pyqtSignal()
|
||||
mode_signal = pyqtSignal(int)
|
||||
@ -39,6 +39,9 @@ class UpdateWorker(QThread):
|
||||
self.diameter_total = 0.0 # for average calculation
|
||||
self.diameter_count = 0
|
||||
self.diameter_value = 0.0
|
||||
self.diameter_value1 = 0.0
|
||||
self.diameter_value2 = 0.0
|
||||
self.diameter_value3 = 0.0
|
||||
self.diameter_min = 0.0
|
||||
self.diameter_max = 0.0
|
||||
self.density = 1.0
|
||||
@ -161,11 +164,20 @@ class UpdateWorker(QThread):
|
||||
|
||||
def parse_data(self, data):
|
||||
|
||||
match = re.match(r"^[#d]:(-?[\d\.]+),p:(-?[\d\.]+)$", data)
|
||||
match = re.match(r"^[#d](\d):(-?[\d]+),p:(-?[\d\.]+)$", data)
|
||||
if match:
|
||||
self.diameter_value = float(match.group(1))
|
||||
self.position_value = float(match.group(2))
|
||||
self.update_signal.emit(self.is_running, self.diameter_value, self.position_value, self.diameter_min, self.diameter_max)
|
||||
diameter_int = int(match.group(2))
|
||||
if diameter_int<65000:
|
||||
dial_number = int(match.group(1))
|
||||
position_value = float(match.group(3))
|
||||
diameter_value = float(diameter_int)/1000
|
||||
|
||||
if diameter_value < self.diameter_min: # process min/max
|
||||
self.diameter_min = diameter_value
|
||||
if diameter_value > self.diameter_max:
|
||||
self.diameter_max = diameter_value
|
||||
|
||||
self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value)
|
||||
self.reset_flag = True
|
||||
|
||||
offset_match = re.match(r"^#h:(\d+)", data)
|
||||
@ -272,7 +284,9 @@ class UpdateWorker(QThread):
|
||||
|
||||
|
||||
def clear_graph(self):
|
||||
self.line.set_data([], [])
|
||||
self.line1.set_data([], [])
|
||||
self.line2.set_data([], [])
|
||||
self.line3.set_data([], [])
|
||||
self.canvas.draw()
|
||||
|
||||
def add_block(self, serial_number, bench_id, port, block_id, main_app):
|
||||
@ -505,7 +519,11 @@ class UpdateWorker(QThread):
|
||||
ax.set_xticks([]) # Hide x-axis values
|
||||
ax.set_frame_on(True)
|
||||
# ax.set_ylabel('Diameter (mm)') # Show y-axis label
|
||||
self.line, = ax.plot([], [], '#ff5000', linewidth=0.5)
|
||||
|
||||
self.line2, = ax.plot([], [], '#00ff50', linewidth=0.5)
|
||||
self.line3, = ax.plot([], [], '#fffb00', linewidth=0.5)
|
||||
self.line1, = ax.plot([], [], '#ff5000', linewidth=1.5)
|
||||
|
||||
self.canvas = FigureCanvas(fig)
|
||||
self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored)
|
||||
center_layout.addWidget(self.canvas)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user