From 384d52309f322ad266282adb994a03631810b1e7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 2 Dec 2024 11:04:15 +0300 Subject: [PATCH] =?UTF-8?q?dev:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=BE=D0=B9=20=D1=82=D0=BE=D1=87=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__pycache__/main.cpython-310.pyc | Bin 1146 -> 1092 bytes src/gui/__pycache__/plotter.cpython-310.pyc | Bin 7176 -> 7658 bytes src/gui/plotter.py | 72 ++++++++++-------- src/main.py | 2 - .../base/__pycache__/base.cpython-310.pyc | Bin 11271 -> 11308 bytes src/utils/base/base.py | 19 +++-- 6 files changed, 54 insertions(+), 39 deletions(-) diff --git a/src/__pycache__/main.cpython-310.pyc b/src/__pycache__/main.cpython-310.pyc index e844a7e807a5cea455e0d40f7ff16170fb5d5dbe..03f720e8b37eadff800b62f68b03dc11fad279ff 100644 GIT binary patch delta 184 zcmeyxafE|6pO=@50SNxQa7|w_kynL3qzDps&EQVHdB#ns!%fnBSQ*f zFc@p{PCQk%*_W}Ck&$=ubtW4|zR4oYibDKAQ*Lp@$LA(y=EcWriWG58c4s~kR0I>x zOUzA;k1yf{Dnlapz`AU5^HWN5QtcRlykZ$3!NI`8$ic|N$ioE0P{_f|A;iVV@*e=E CqbI5W delta 239 zcmX@Y@r#2upO=@50SFGia8183kyn;+)-GbsuQ z0L{O}5g(tMn3)$JuPIi)IYlrnd5O8H y@$p4`ATb2N4>r&yH$SB`C)JJ-$Salu5*!RXj2w(Sj66(042K-d970@-EdK${_Bf#c diff --git a/src/gui/__pycache__/plotter.cpython-310.pyc b/src/gui/__pycache__/plotter.cpython-310.pyc index 7fb0c8ff774c18b0eccefde41ddee9a08cee7464..9fb8f4cbb1ecd9793abed92b9b2b8375aecb70a4 100644 GIT binary patch literal 7658 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 a_ZcKYvMn3`lG*s>85{u5)5-Hn+4_Gvv*A+! literal 7176 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 pd.DataFrame: return self._get_data(self.Ts['tmovement'], self.calcPhaseMovement) - def get_weldingDF(self, end_time: float) -> pd.DataFrame: + def get_weldingDF(self) -> pd.DataFrame: data = [] X1, X2, V1, V2, F = self.calcPhaseGrow(self.Ts['tgrow']) data.append({"time":0, "Posicion FE":X1,"Posicion ME":X2, "Rotor Speed FE":V1, "Rotor Speed ME":V2, "Force":F}) - data.append({"time":end_time, "Posicion FE":X1,"Posicion ME":X2, "Rotor Speed FE":V1, "Rotor Speed ME":V2, "Force":F}) + data.append({"time":self.welding_time, "Posicion FE":X1,"Posicion ME":X2, "Rotor Speed FE":V1, "Rotor Speed ME":V2, "Force":F}) return pd.DataFrame(data) def get_ideal_timings(self) -> list[float, float, float, float]: data = self.Ts - ideal_timings = [data['tclose'], data['tgrow'], self.getMarkOpen(), data["tmovement"]] + ideal_timings = [data['tclose'], data['tgrow'], self.welding_time, self.getMarkOpen()] return ideal_timings - + class ProcessStage(NamedTuple): mean_value: floating[Any] @@ -42,38 +42,41 @@ class ProcessStage(NamedTuple): class PlotWidget(BasePlotWidget): - def _create_stage_ideal(self, + def _create_curve_ideal(self, stage: str, signal: str, - times: pd.Series, - dataframe: pd.DataFrame) -> Optional[pg.LinearRegionItem]: - stage_diff = np.diff(dataframe[stage]) - start_index = np.where(stage_diff == 1)[0] - finish_index = np.where(stage_diff == -1)[0] + start_timestamp: float, + finish_timestamp: float) -> Optional[pg.PlotDataItem]: data = self._stage_ideals[stage] - 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] + if start_timestamp and finish_timestamp: plot = pg.PlotDataItem(x=start_timestamp+data["time"], y=data[signal["name"]], pen=signal["pen"]) return plot return None def _create_stage_region(self, stage: str, - times: pd.Series, - dataframe: pd.DataFrame) -> Optional[pg.LinearRegionItem]: - stage_diff = np.diff(dataframe[stage]) - start_index = np.where(stage_diff == 1)[0] - finish_index = np.where(stage_diff == -1)[0] + start_timestamp: float, + finish_timestamp: float) -> Optional[pg.LinearRegionItem]: - 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] + if start_timestamp and finish_timestamp: region = pg.LinearRegionItem([start_timestamp, finish_timestamp], movable=False) region.setBrush(pg.mkBrush(self._stage_colors[stage])) return region return None + + def _get_timestamp(self, + stage: str, + times: pd.Series, + dataframe: pd.DataFrame) -> 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]: @@ -115,15 +118,26 @@ class PlotWidget(BasePlotWidget): settings = description["Settings"] if settings["stages"] and all([stage in dataframe_headers for stage in self._stages]): for stage in self._stages: - region = self._create_stage_region(stage, time_axis, dataframe) - for signal in description["Ideal_signals"]: - ideal_plot = self._create_stage_ideal(stage, signal ,time_axis, dataframe) - if ideal_plot: - plot_widget.addItem(ideal_plot) - + 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["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["zoom"]: if max(time_axis) < 5.0: @@ -170,8 +184,6 @@ class PlotWidget(BasePlotWidget): plot = plot_widget.plot(time_axis, dataframe[signal["name"]], pen=signal["pen"]) legend.addItem(plot, signal["name"]) - - layout.addWidget(plot_widget) widget.setLayout(layout) diff --git a/src/main.py b/src/main.py index 5a0228c..3d20261 100644 --- a/src/main.py +++ b/src/main.py @@ -1,7 +1,5 @@ import sys from PyQt5 import QtWidgets -import json -from os import path from src.gui.mainGui import MainWindow from src.controller.monitor import DirectoryMonitor diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index 3c45168424a855997e6cb2d4e58044b17fa24ec7..6d8394a08f4936c2c0a4b2d98bb1f0a00627e2c9 100644 GIT binary patch delta 1111 zcmZXTU5Fc16vyY>nM`K0lWaEMnPijAW-HAGYH8Vu`lNyntuB>XC_xD8-q|$E&ZgcZ zEse9b(#3rcTg2fr`pWpeo zckchdtRA{>DAEdtLkc~Y55L@aZu`Z^_fhx_e~msLF!<2AicgL14g`I2MyvnQN29m% zs;Bi@EyvT_o!N%n_J)txV!kDu*`+xf-;G_;n{=jFz`gOig?9);Ob1$q4)Qe~uptHv zw7*yoUrFSuKe4e#F=hW|0bl=QrXiz;+I^ONR7Xsd)t}9)cq!3>Jy=PWa(!)}xXJ?b z0|SM_y5=f%oht{F3Y)>x$)?_ucPZe&h+{kzi+)34+mx454b=bxr&9uM;Mr6IZelb& z3*VtgH{mwkN-x13+?T1t4|qQF^wv3V;*Xh&FpulmD{v1FTQ1zkJJu@PMJM-6BfqN5 z16R4WV%AhX#)rANqSZ8B;9(vi3J{I(D3MMy%40-9qBu_w8AM5*A{ydFp5a-d5Fh6j z&k+r;DwM~ayFi`w~s53RQ z({$|m-0YD~SJ<_%A02Dji@dqisA!(*bQeAI*j8MZRZ*4W%aK$xk&#>=sg2-TewXA`sFyznn+{Stk``L!G~4pi>ydcV{u}PwoQ9;gKT?S zyC{_1#jhTO1-}|y#Rq*TeG+^Z@j>Z>LO?-95T%NWsOYYqx$!~pUgkf)ne#t$XU?6g z+o!jCs~(Sw(R2LS#`0e)=Dbh*@DktnHz;jqIQDh)I{j!z-su}1k9@qTj#aBeO}%Cf zluI={7r3tPqXo^e z*3yE*Y?j;HRvH|bQzhPCa61LsGcaP+%~DQjDns=_{5!G9^;Q-`Co$$9B_hyXCp0Z7 zgQz5b4jz?wTuPFp2^Dh&Hz$9B4`?Ur!0<*_20K%mK*8OqQP7?7yVN#l!!2E_xH&!( z?}c%kiv+bP%6C)zEcnQq!HI4U-t~s@gc`xgXbb|BkrMS0F<_O7wUTAgpRAe7DJ!R& z&Nhw_xAt;E(i$lzWt@M*`oGe9(K%y)uxoxHJEp-UdEIb#j|;MRpl3B) zz|%b|^-I!w8E^IU!WCM58C__`Ix&@xK?D2pYvB}* pd.DataFrame: @@ -265,14 +269,15 @@ class BaseIdealDataBuilder(OptAlgorithm): def get_tmovementDF(self) -> pd.DataFrame: ... - def get_weldingDF(self, end_time: float) -> pd.DataFrame: + def get_weldingDF(self) -> pd.DataFrame: ... def get_ideal_timings(self) -> list[float, float, float, float]: ... - def update_settings(self, data: list[dict]) -> None: - ... + def get_cycle_time(self) -> float: + result = sum(self.get_ideal_timings()) + return result class BaseMainWindow(QWidget): def __init__(self,