From a0d6cba38689b2c7cd2e0659e0f838d1f54ef61b Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 3 Dec 2024 17:21:22 +0300 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=B8=D0=B7=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=B0=20plotterWidget=20=D0=B2=D1=8B=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=20=D0=BE=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=8F=D1=89=D0=B8=D0=B5=D1=81=D1=8F=20=D0=BA=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BC=D1=83=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B?= =?UTF-8?q?=20=D0=B2=20BasePointPassportFormer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/__pycache__/plotter.cpython-310.pyc | Bin 7787 -> 7490 bytes src/gui/plotter.py | 78 +++++--------- .../base/__pycache__/base.cpython-310.pyc | Bin 11502 -> 13483 bytes src/utils/base/base.py | 100 +++++++++++++----- 4 files changed, 105 insertions(+), 73 deletions(-) diff --git a/src/gui/__pycache__/plotter.cpython-310.pyc b/src/gui/__pycache__/plotter.cpython-310.pyc index 33158def9ef41b1670eca537db0c2047b9fb5b48..603d3c59da06b43c9ef864860916bac133839cc9 100644 GIT binary patch delta 3863 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 fuD94B%qTW~YKE0Obf@?cm4_ILlXM_Gl@I Optional[list[float]]: - stage_diff = np.diff(dataframe[stage]) - start_index = np.where(stage_diff == 1)[0] - finish_index = np.where(stage_diff == -1)[0] - if start_index.size: - start_timestamp = times[start_index[0]] - finish_timestamp = times[finish_index[0]] if finish_index.size else times[len(times) - 1] - return start_timestamp, finish_timestamp - return None @staticmethod def _init_plot_widget(title: str) -> tuple[pg.PlotWidget, pg.LegendItem]: @@ -116,38 +102,32 @@ class PlotWidget(BasePlotWidget): plot_widget, legend = self._init_plot_widget(title=channel) settings = description["Settings"] - if settings["stages"] and all([stage in dataframe_headers for stage in self._stages]): - for stage in self._stages: - start_timestamp, finish_timestamp = self._get_timestamp(stage, time_axis, dataframe) - region = self._create_stage_region(stage, start_timestamp, finish_timestamp) - if region: - plot_widget.addItem(region) - - for signal in description["Ideal_signals"]: - ideal_plot = self._create_curve_ideal(stage, signal, start_timestamp, finish_timestamp) - if ideal_plot: - plot_widget.addItem(ideal_plot) + if (settings["stages"] or settings["performance"]) and all([stage in dataframe_headers for stage in self._stages]): + events = self._filter_events(time_axis, dataframe) + point_quantity = len(events[self._clear_stage][0]) + if settings["stages"]: + for stage in self._stages: + start_t, end_t = events[stage] + for i in range(len(start_t)): + region = self._create_stage_region(stage, start_t[i], end_t[i]) + if region: + plot_widget.addItem(region) + for signal in description["Ideal_signals"]: + ideal_plot = self._create_curve_ideal(stage, signal, start_t[i], end_t[i]) + if ideal_plot: + plot_widget.addItem(ideal_plot) - end_timestamp = time_axis[len(time_axis) - 1] - region = self._create_stage_region("Oncoming", finish_timestamp, end_timestamp) - if region: - plot_widget.addItem(region) - - for signal in description["Ideal_signals"]: - ideal_plot = self._create_curve_ideal("Oncoming", signal, finish_timestamp, end_timestamp) - if ideal_plot: - plot_widget.addItem(ideal_plot) - - if settings["performance"] and all([stage in dataframe_headers for stage in self._stages]): - delta_timestamp = 0 - for stage in self._stages: - start_timestamp, finish_timestamp = self._get_timestamp(stage, time_axis, dataframe) - delta_timestamp += finish_timestamp - start_timestamp - - ideal_delta = self._opt.get_cycle_time() - performance = round(ideal_delta/delta_timestamp*100, 2) - performance_label = QLabel(f"Performance = {performance} %") - layout.addWidget(performance_label) + if settings["performance"]: + ideal_delta = self._opt.get_cycle_time() + delta = np.zeros(point_quantity) + for stage in self._stages: + try: + start_stage, stop_stage = events[stage] + delta += np.array(stop_stage)-np.array(start_stage) + except: print("Signal ", stage, " is abnormal..." ) + performance_list = ideal_delta/delta*100 + performance_label = QLabel(f"Performance: best = {performance_list.max()} %, worse = {performance_list.min()} %, average = {performance_list.mean()}") + layout.addWidget(performance_label) if settings["zoom"]: if max(time_axis) < 5.0: @@ -203,8 +183,8 @@ class PlotWidget(BasePlotWidget): widgets = [self._build_widget(data_sample) for data_sample in data] self._mediator.notify(self, widgets) - def update_settings(self, data: list[dict]): - self._initIdealBuilder(idealDataBuilder=idealDataBuilder, data=data) + def update_settings(self, params: list[dict]): + self._initIdealBuilder(idealDataBuilder=idealDataBuilder, params=params) diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index 693491064eb82ed6e641ba1530512bc451d72ae7..3854e03c24a8d450a41b19e120293f799ee6c83c 100644 GIT binary patch delta 5159 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 CBeI_W diff --git a/src/utils/base/base.py b/src/utils/base/base.py index 53d353e..abb97ac 100644 --- a/src/utils/base/base.py +++ b/src/utils/base/base.py @@ -8,6 +8,10 @@ from PyQt5.QtCore import QThread, QObject, QTimer from PyQt5.QtWidgets import QWidget, QTabWidget from src.OptAlgorithm import OptAlgorithm import pandas as pd +import pandas as pd +import numpy as np + + class BaseMediator: @@ -102,20 +106,14 @@ class BasePlotWidget: mediator: Optional[BaseMediator] = None): super().__init__() self._mediator = mediator - - self._stages = [ - "Closing", - "Squeeze", - "Welding", - "Relief" - ] + self._stage_colors = { "Closing": [208, 28, 31, 100], "Squeeze": [45, 51, 89, 150], "Welding": [247, 183, 24, 100], "Relief": [0, 134, 88, 100], - "Oncoming": [222, 184, 135, 100] + "Oncomming": [222, 184, 135, 100] } self._plt_channels = { "Electrode Force, N & Welding Current, kA": { @@ -200,18 +198,7 @@ class BasePlotWidget: ] }, } - def _initIdealBuilder(self, - idealDataBuilder: Optional[BaseIdealDataBuilder] = None, - data: list[dict] = None): - self.opt = idealDataBuilder(data) - - self._stage_ideals = { - "Closing": self._opt.get_closingDF(), - "Squeeze": self._opt.get_compressionDF(), - "Welding": self._opt.get_weldingDF(), - "Relief": self._opt.get_openingDF(), - "Oncoming": self._opt.get_oncomingDF() - } + @property def mediator(self) -> BaseMediator: return self._mediator @@ -243,10 +230,9 @@ class BaseController(QObject): ... -# FIXME: WeldingDF показывает только 1 секунду class BaseIdealDataBuilder(OptAlgorithm): - def __init__(self, data: list[dict]): - operator_params, system_params = data + def __init__(self, params: list[dict]): + operator_params, system_params = params self.mul = system_params['time_capture'] self.welding_time = operator_params['time_wielding'] super().__init__(operator_params, system_params) @@ -337,4 +323,70 @@ class BaseMainWindow(QWidget): } """) - \ No newline at end of file +class BasePointPassportFormer: + + def __init__(self): + self._clear_stage = "Welding" + self._stages = [ + "Closing", + "Squeeze", + "Welding", + "Relief", + ] + + def _find_indexes(self, + signal: str, + dataframe: pd.DataFrame) -> list[list[float], list[float]]: + stage_diff = np.diff(dataframe[signal]) + start_idx = np.where(stage_diff == 1) + finish_idx = np.where(stage_diff == -1) + return start_idx[0], finish_idx[0] + + def _find_events(self, + signal: str, + times:pd.Series, + dataframe: pd.DataFrame) -> list[list[float]]: + start_idx, finish_idx = self._find_indexes(signal, dataframe) + start_list = times.loc[start_idx].tolist() + end_list = times.loc[finish_idx].tolist() + if len(start_list) - len(end_list) == 1: + end_list.append(float(times[len(times)-1])) + return start_list, end_list + + def _filter_events(self, + times: pd.Series, + dataframe: pd.DataFrame) -> dict[list[float]]: + events = {} + if self._clear_stage in self._stages: + start_list, end_list = self._find_events(self._clear_stage, times, dataframe) + point_quantity = len(start_list) + for stage in self._stages: + start_list, end_list = self._find_events(stage, times, dataframe) + events[stage] = [start_list[:point_quantity], end_list[:point_quantity]] + return events + + def _initIdealBuilder(self, + idealDataBuilder: Optional[BaseIdealDataBuilder] = None, + params: list[dict] = None): + self.opt = idealDataBuilder(params) + + self._stage_ideals = { + "Closing": self._opt.get_closingDF(), + "Squeeze": self._opt.get_compressionDF(), + "Welding": self._opt.get_weldingDF(), + "Relief": self._opt.get_openingDF(), + "Oncomming": self._opt.get_oncomingDF() + } + + def _create_curve_ideal(self, + stage: str): + data = self._stage_ideals[stage] + ... + + @property + def opt(self) -> BaseIdealDataBuilder: + return self._opt + + @opt.setter + def opt(self, opt: BaseIdealDataBuilder): + self._opt = opt \ No newline at end of file