From 0a9b1c50b8d5cabb7235c54c27c5b142a13f70d7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 4 Dec 2024 20:01:30 +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=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D1=8B=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=B0=D0=B6=D0=B4=D0=BE=D0=B9=20?= =?UTF-8?q?=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 --- params/operator_params.json | 238 ++++++++++++++++-- params/system_params.json | 38 +-- src/__pycache__/main.cpython-310.pyc | Bin 1045 -> 1145 bytes .../__pycache__/mediator.cpython-310.pyc | Bin 1237 -> 1350 bytes .../__pycache__/monitor.cpython-310.pyc | Bin 2132 -> 2145 bytes .../passportFormer.cpython-310.pyc | Bin 0 -> 3677 bytes src/controller/mediator.py | 11 +- src/controller/monitor.py | 4 +- src/controller/passportFormer.py | 63 +++++ src/gui/__pycache__/mainGui.cpython-310.pyc | Bin 2991 -> 2980 bytes src/gui/__pycache__/plotter.cpython-310.pyc | Bin 7490 -> 4523 bytes .../settings_window.cpython-310.pyc | Bin 2526 -> 3858 bytes src/gui/mainGui.py | 2 +- src/gui/plotter.py | 202 +++++++-------- src/gui/settings_window.py | 112 ++++++--- src/main.py | 4 +- .../base/__pycache__/base.cpython-310.pyc | Bin 13483 -> 13974 bytes src/utils/base/base.py | 59 +++-- 18 files changed, 526 insertions(+), 207 deletions(-) create mode 100644 src/controller/__pycache__/passportFormer.cpython-310.pyc create mode 100644 src/controller/passportFormer.py diff --git a/params/operator_params.json b/params/operator_params.json index 5a96d09..f1666e2 100644 --- a/params/operator_params.json +++ b/params/operator_params.json @@ -1,16 +1,226 @@ { - "dist_open_start_1": 0.005, - "dist_open_start_2": 0.005, - "dist_open_after_1": 0.006, - "dist_open_after_2": 0.006, - "dist_open_end_1": 0.01, - "dist_open_end_2": 0.05, - "dist_close_end_1": 0.005, - "dist_close_end_2": 0.005, - "time_wielding": 1, - "time_command": 0.0, - "time_robot_movement": 0.2, - "object_thickness": 0.0045, - "force_target": 5000, - "force_capture": 500 + "dist_open_start_1": [ + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005 + ], + "dist_open_start_2": [ + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005 + ], + "dist_open_after_1": [ + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006 + ], + "dist_open_after_2": [ + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006, + 0.006 + ], + "dist_open_end_1": [ + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01 + ], + "dist_open_end_2": [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + "dist_close_end_1": [ + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005 + ], + "dist_close_end_2": [ + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005, + 0.005 + ], + "time_wielding": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "time_command": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "time_robot_movement": [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + "object_thickness": [ + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045, + 0.0045 + ], + "force_target": [ + 4000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0, + 5000.0 + ], + "force_capture": [ + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0, + 500.0 + ] } \ No newline at end of file diff --git a/params/system_params.json b/params/system_params.json index b34adee..5060aa8 100644 --- a/params/system_params.json +++ b/params/system_params.json @@ -1,22 +1,22 @@ { - "trace_storage_path": "D:/downloads/a22", - "monitor_update_period": 100, - "a_max_1": 5.41, - "v_max_1": 0.278, - "a_max_2": 35.81, - "v_max_2": 0.7, - "mass_1": 270, - "mass_2": 1, - "k_hardness_1": 2148570, - "k_hardness_2": 0, - "torque_max_1": 20, - "torque_max_2": 0, - "transmission_ratio_1": 0.00125, - "transmission_ratio_2": 1, - "position_start_1": 0.08, - "position_start_2": 0.08, - "k_prop": 0.05, - "time_capture": 100000, - "UML_time_scaler": 1000 + "trace_storage_path": ["D:/downloads/a22"], + "monitor_update_period": [100], + "a_max_1": [5.41], + "v_max_1": [0.278], + "a_max_2": [35.81], + "v_max_2": [0.7], + "mass_1": [270], + "mass_2": [1], + "k_hardness_1": [2148570], + "k_hardness_2": [0], + "torque_max_1": [20], + "torque_max_2": [0], + "transmission_ratio_1": [0.00125], + "transmission_ratio_2": [1], + "position_start_1": [0.08], + "position_start_2": [0.08], + "k_prop": [0.05], + "time_capture": [100000], + "UML_time_scaler": [1000] } \ No newline at end of file diff --git a/src/__pycache__/main.cpython-310.pyc b/src/__pycache__/main.cpython-310.pyc index 443fd68e2c3878e94cbeea0bf6502b6536099a2d..73ed5990a079ccdbd4c5fe5b36562cea4c5a68c6 100644 GIT binary patch delta 454 zcmYjNO-sW-5Z&3f=_bur)0@z%5URZtJQYy{Z%U!JTw>@(Y0O92Mta$T5b<7u_tcwS z#Xr-d|G|SN-9%fQ;SKv{cji6ziF^?)(KH2#$PPv~pDV2kkE`BQ4^cTZBGWMeQH8c1 zkkj@ps@`ID>bEl_x-hO_Ypd7z(1wjZ^5*kd!qW4EMLwI9JGVi^K@vC!6e87!q#;lMF(@S5O_Ws^%qYb`W*Jx~jcOM$+IiW!161G8dMVU}-FT(mhVtTigT z6pfJ$mv$$Ag8|6-2LwR!3w*L~%>L}T*OfmJ@FLtHoVrm^eV9j4?~?LBq6b2jNuk~n2a82YTgRsH=GCX2D% nZ0tq8>#|brU(u`0!ziJ5p??g5RbGg2qhf(wk{anKQ2+h`{10b( delta 357 zcmYk0%}T>S5XW~mAKj$+Xaa&D;yHM{R+OFT|;Xy;4pzi0@IRqC{UBN;t4GEG;1xa1#Qmf4dCrLH!*Ot^$ zyMc}zBt3OI(rUMTQ_^}MN$oYHt#UFU0gMB`dWVC`qu0=@=Ja?=pCvgjW>c2MJc-Ie zybxhkpL8^|+OKS*S)gx{fdeRtPJJpIy!>Ecm_P&eZ|JCy-i^EW~gZ`P_ bb&axuKitJffYfbaxW}TXO)`b~CaB*(h*3wd diff --git a/src/controller/__pycache__/mediator.cpython-310.pyc b/src/controller/__pycache__/mediator.cpython-310.pyc index 5725fb29a5d7a912a5f697e851945fb69c06d251..32d6421762572c57b26e58593428d519c2427d85 100644 GIT binary patch delta 562 zcmY*XK}#D!6n<}J6F0lF8!Mtlg=$eS^d>E|MS}ET4u!H*df6Vrl9^~ik_|I!PXQ0+ z4}`h&Xm9o0|ImL>kkH@K`eqA3AG~jP-+c4&-eZ2(eg$zJMFCK>*OH5YH;;EQnZJCy zF$&WVp$)Pkt22;QwQ|E#G5@-cmHD^!^k{*$3>DEGs$&vmg|wyUFY>UYE+z3 znv_66iV{*LQE}y|iXz{h*8s_=_EoI`gux&zPrpRb0H^4Al1p#qrID;CKUOhOOjhLz zQFZ$P-{7U4Ve9x{3WM5hFlFBnp@1n4un2FMJ|KzALOK6nJ$(6b67*!Pg@rBv8*Zc@q?GOG6eS6Q3l5HpQWWQVJ=gXH*J+xc1 zOA{0Lz*vmz-yRG8Zq&=WX0)hIva!sJKD3GV`Lz>2YNWI)yYWv(xx5;x7CJlkH+&FG I;4WL|4-%et!T!$3)WV!P)SI#+eE}jrWc=F=`=5fwn-P z@$^0QtoXKyS^U`Y`>Oq~=`uK$9(5#e{=oR*7J zZNPv6TQJXtl&m^3LqLPH%w)s_AL6!H;%0egj;@U-b55QyMu097U*hwcC0x=FcjUk^ zArmWS5QKf+?fHHeMq!PFIYlff$giQ0bWUc` zRX5_(>1aHRisF;*;;hKBx;SCm?V@U7FzQdk%9{6IAyl8E=8DuPIwHizP^3s_@<#T>0B&p? ABme*a delta 110 zcmaDTa7BPOpO=@50SHX;ebe(c@}6g5w3vLCMbff{A)c{@IfY4*0mx#iVOYStkbx1% zUcdsPQy797G@1RPgi4AMlT+i1OY(~n(^KOM5=$~B+ptb&=3?a9e2w)HBbx@$=pyaO I``8x)03ib%%K!iX diff --git a/src/controller/__pycache__/passportFormer.cpython-310.pyc b/src/controller/__pycache__/passportFormer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d746267cf54edd16dc667f97533d7c929101693 GIT binary patch literal 3677 zcma)9OK%&=5$^7JaQL+3RU}J+y-Ki1mYYDa4dmqrj}*cq2k~} zDW0)*NLIl|GrlJ4;H%(ks=m&! zV?#Far6F5T;)Y!sToTZRTII)j)a4N8;-Nm7?lIbbRzM1NhIYs$U#GX2l1ap#4fAfA z8P)b|HSViCmeAaaKN{QWCTVy7&#=g2n(&TW->9_rj_D@0`|s|~gM*zx5^FU!2g&_| zKdDp>M*U~wEZ4Wit!MDaIwn>MQ2w1$c8<4mHWQCvJ zxvc2c!qjWk)gjiCYC+!D*{imvBYe)2~E0(#59ZD~p@#)M5@A%%igtm^8pCue9I$ znG1qdu#B8W5H=l~#HKkZ;hPa3=@g=YPtyVOB@1iX{luI6=nM08I+M)czU>)U5 zdHA8PLgn?mb%qMyyW&PQBcKsCXKn_@%bF6&2x~(X_TVbijjF7YcL8n(4q?3_hENH1AXq>WZAd$lUCk;; zA6WXLGQlDgAw=9i#0y}@S+vdVTKpxI+W4Y4n0TCZk5rCQEw=93Dn&z&;$tq^xKv%+ zCMO}yj2~{&QFQJqJH5B4=@u2E_nU8Rry0_id5F%%YMfM!he{3-gtZMvSw85UEP%IO z)>u~_OC-43;lyYy9zftSWW$>rsrdH)6h_~}yafl)js$w=fIG-X$a=_MWH(p3`BWUZ zoaZhY6r)`F>ntMgT7{*;{sQ)d1)V91oT24JH&#;i5$SD8e4 zSVXU}*O9M(Q$%k8ydo?r+w8^NBBI$dE-Zq+m{hS#C69`#4F4`BHNe4_{w;RI^ebdw zc37n~05s@Z+{@O`pVW(sY*IfWzA?vR-h_`t!6yv|xeBgPQQ?&`0(Q+poYjg(Q7f8# zkMjD9+b;h^d-}U%L(1G25800J_YBQYNDl~qRp<%$;!GiN`ac~8+uY@R=hAnczKhA$ zJ5nb$c$uWfYA)!{5hn-T5^4Qs7z6Q{9(3@@ZH3?qU9pO@j4aW(0g4-45!g2tX;RQ zxHm|1rDOFH*8pQH2qBWo27_GDODChgvi`t~66+;tYP}TqmgRHZ%e+jXTWVE_O`i0X z(YJ9*yH(Z&LVsuJa@^bS{K(drF6orGNBJN>>D(|U24}}cR*7^dMR)05_#>tJe{a}oR{S{aA~E}D9t&^dr!Q*x*YDcVDdHE&hUX^@INp6Z%)!b|C{$7NhnU&DC=tmc=g7YP!h-vcIO6 zC~ZjVFT?c4@fem@GpjtLt!PiW5?qq&($u|nO}A-FQdj?o$d8H4N+xb62m$?5`bf6X zzaw&0aooZHdD~FYi`d6vGuYVB^tD~FAK;(C)^R>a&DNLrkKu?W5j90G1;I!rraYFC asato|F*e#RtNcTXBzM*li};dQS^oy){a;}K literal 0 HcmV?d00001 diff --git a/src/controller/mediator.py b/src/controller/mediator.py index b32edd0..d7cd6ef 100644 --- a/src/controller/mediator.py +++ b/src/controller/mediator.py @@ -3,18 +3,21 @@ import pandas as pd from typing import Union from PyQt5.QtWidgets import QWidget -from src.utils.base.base import BaseMediator, BaseDirectoryMonitor, BaseDataConverter, BasePlotWidget +from src.utils.base.base import BaseMediator, BaseDirectoryMonitor, BaseDataConverter, BasePlotWidget, BasePointPassportFormer class Mediator(BaseMediator): def notify(self, - source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePlotWidget], - data: Union[list[str], list[pd.DataFrame], list[QWidget]]): + source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget], + data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget]]): if issubclass(source.__class__, BaseDirectoryMonitor): self._converter.convert_data(data) if issubclass(source.__class__, BaseDataConverter): + self._passportFormer.form_passports(data) + + if issubclass(source.__class__, BasePointPassportFormer): self._plot.build(data) if issubclass(source.__class__, BasePlotWidget): @@ -22,7 +25,7 @@ class Mediator(BaseMediator): def push_settings(self, settings: list[dict]): self._monitor.update_settings(settings) - self._plot.update_settings(settings) + self._passportFormer.update_settings(settings) self._monitor.force_all_dir() diff --git a/src/controller/monitor.py b/src/controller/monitor.py index 4e24920..bb3f9fc 100644 --- a/src/controller/monitor.py +++ b/src/controller/monitor.py @@ -29,8 +29,8 @@ class DirectoryMonitor(BaseDirectoryMonitor): def update_settings(self, data: list[dict]) -> None: self.stop() operator_params, system_params = data - self._directory_path = system_params['trace_storage_path'] - self._update_time = system_params['monitor_update_period'] + self._directory_path = system_params['trace_storage_path'][0] + self._update_time = system_params['monitor_update_period'][0] self._init_state() self.start() diff --git a/src/controller/passportFormer.py b/src/controller/passportFormer.py new file mode 100644 index 0000000..4561aa8 --- /dev/null +++ b/src/controller/passportFormer.py @@ -0,0 +1,63 @@ +from src.utils.base.base import BasePointPassportFormer, BaseIdealDataBuilder +import pandas as pd + +class idealDataBuilder(BaseIdealDataBuilder): + def get_closingDF(self) -> pd.DataFrame: + return self._get_data(self.Ts['tclose'], self.calcPhaseClose) + + def get_compressionDF(self) -> pd.DataFrame: + return self._get_data(self.Ts['tgrow'], self.calcPhaseGrow) + + def get_openingDF(self) -> pd.DataFrame: + return self._get_data(self.getMarkOpen(), self.calcPhaseOpen) + + def get_oncomingDF(self) -> pd.DataFrame: + return self._get_data(self.Ts['tmovement'], self.calcPhaseMovement) + + 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":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]: + data = self.Ts + ideal_timings = [data['tclose'], data['tgrow'], self.welding_time, self.getMarkOpen()] # TODO: add data['tmovement'], Oncoming не учитывается в производительности + return ideal_timings + +class PassportFormer(BasePointPassportFormer): + + def form_passports(self, data: list[pd.DataFrame]) -> list[list[pd.DataFrame, dict, list]]: + return_data = [self._build_passports_pocket(dataframe) for dataframe in data] + self._mediator.notify(self, return_data) + + + def _build_passports_pocket(self, dataframe: pd.DataFrame) -> list[pd.DataFrame, dict, list]: + passports_pocket = [] + events, point_quantity = self._filter_events(dataframe["time"], dataframe) + system_settings = {key: value[0] for key, value in self._params[1].items()} + + for i in range(0, point_quantity): + if not dataframe["time"].isna().all(): + operator_settings = {} + for key, value in self._params[0].items(): + if len(value) > i: + operator_settings[key] = value[i] + else: + operator_settings[key] = value[0] + params_list = [operator_settings, system_settings] + ideal_data = self._build_ideal_data(idealDataBuilder=idealDataBuilder, params=params_list) + + if i < point_quantity-1: + cut_time = events[self._stages[0]][0][i+1] + frame = dataframe[dataframe["time"] < cut_time] + dataframe = dataframe[dataframe["time"] >= cut_time] + else: + frame = dataframe + point_events = {key: [value[0][i], value[1][i]] for key, value in events.items()} + passports_pocket.append([frame, ideal_data, point_events]) + return passports_pocket + + def update_settings(self, params: list[dict, dict]): + self._params = params \ No newline at end of file diff --git a/src/gui/__pycache__/mainGui.cpython-310.pyc b/src/gui/__pycache__/mainGui.cpython-310.pyc index d52d6d030f50df913eeecfb0c7867a1f3deaa83e..e2297de3cdf6f5f661d6fe672dd625a582462639 100644 GIT binary patch delta 126 zcmZ24zC@fipO=@50SKy_0@4?3Nd8by!yO~Z-U^ii8n>>~M38UTQDvm|$w^);NQWJ|ND{@LR+Hbby V3}@uF0je(&0TK3_=W_`#0swx09=iYl delta 163 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 ZyZ$w*>oTgteAa=(kW+Qw7HzBJ{STV@Ows@V literal 7490 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 diff --git a/src/gui/__pycache__/settings_window.cpython-310.pyc b/src/gui/__pycache__/settings_window.cpython-310.pyc index 54347311b9a6c15414d7fd091d082e094ffc0e68..76e27e9a8b1ac64829ac6cb4313e5f6dbce54610 100644 GIT binary patch literal 3858 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 pd.DataFrame: - return self._get_data(self.Ts['tclose'], self.calcPhaseClose) - - def get_compressionDF(self) -> pd.DataFrame: - return self._get_data(self.Ts['tgrow'], self.calcPhaseGrow) - - def get_openingDF(self) -> pd.DataFrame: - return self._get_data(self.getMarkOpen(), self.calcPhaseOpen) - - def get_oncomingDF(self) -> pd.DataFrame: - return self._get_data(self.Ts['tmovement'], self.calcPhaseMovement) - - 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":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.welding_time, self.getMarkOpen()] # TODO: add data['tmovement'], Oncoming не учитывается в производительности - return ideal_timings - +from src.utils.base.base import BasePlotWidget class ProcessStage(NamedTuple): mean_value: floating[Any] @@ -40,16 +13,15 @@ class ProcessStage(NamedTuple): finish_index: int -class PlotWidget(BasePlotWidget, BasePointPassportFormer): +class PlotWidget(BasePlotWidget): def _create_curve_ideal(self, - stage: str, - signal: str, + signal: str, + ideal_data: pd.DataFrame, start_timestamp: float, finish_timestamp: float) -> Optional[pg.PlotDataItem]: - data = self._stage_ideals[stage] if start_timestamp and finish_timestamp: - plot = pg.PlotDataItem(x=start_timestamp+data["time"], y=data[signal["name"]], pen=signal["pen"]) + plot = pg.PlotDataItem(x=start_timestamp+ideal_data["time"], y=ideal_data[signal["name"]], pen=signal["pen"]) return plot return None @@ -76,104 +48,109 @@ class PlotWidget(BasePlotWidget, BasePointPassportFormer): stage: str, dataframe: pd.DataFrame, signal_name: str) -> Optional[ProcessStage]: - if stage in self._stages: - stage_diff = np.diff(dataframe[stage]) - start_index = np.where(stage_diff == 1)[0] - finish_index = np.where(stage_diff == -1)[0] - - data = dataframe[signal_name] if signal_name in dataframe.columns.tolist() else [] - - if data.size and start_index.size: - start = start_index[0] - finish = finish_index[0] if finish_index.size else (len(data) - 1) - data_slice = data[start:finish] - mean = np.mean(data_slice) - return ProcessStage(mean_value=mean, start_index=int(start), finish_index=int(finish)) - return None - def _build_widget(self, dataframe: pd.DataFrame) -> QWidget: + stage_diff = np.diff(dataframe[stage]) + start_index = np.where(stage_diff == 1)[0] + finish_index = np.where(stage_diff == -1)[0] + + data = dataframe[signal_name] if signal_name in dataframe.columns.tolist() else [] + + if data.size and start_index.size: + start = start_index[0] + finish = finish_index[0] if finish_index.size else (len(data) - 1) + data_slice = data[start:finish] + mean = np.mean(data_slice) + return ProcessStage(mean_value=mean, start_index=int(start), finish_index=int(finish)) + return None + + def _build_widget(self, data: list[pd.DataFrame, dict, list]) -> QWidget: widget = QWidget() layout = QVBoxLayout() - time_axis = dataframe["time"] - dataframe_headers = dataframe.columns.tolist() - for channel, description in self._plt_channels.items(): + performance_list = [] + df_continuous = pd.DataFrame({}) plot_widget, legend = self._init_plot_widget(title=channel) - settings = description["Settings"] - 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: + + for dataframe, ideal_data, events in data: + df_continuous = pd.concat([df_continuous, dataframe], axis=0) + dataframe_headers = dataframe.columns.tolist() + stages = events.keys() + + if settings["stages"] and all([stage in dataframe_headers for stage in stages]): + for stage in 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) + region = self._create_stage_region(stage, start_t, end_t) + if region: + plot_widget.addItem(region) + + if settings["ideals"]: + for stage in stages: + for signal in description["Ideal_signals"]: + curve = self._create_curve_ideal(signal, ideal_data[stage], events[stage][0], events[stage][1]) + if curve: + plot_widget.addItem(curve) 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) + ideal_delta = ideal_data["Ideal cycle"] + delta = 0 + for stage in stages: + delta += events[stage][1] - events[stage][0] + performance = ideal_delta/delta*100 + performance_list.append(performance) - if settings["zoom"]: - if max(time_axis) < 5.0: - stages = [self.get_stage_info("Welding", - dataframe, - signal["name"]) for signal in description["Real_signals"]] - if stages: - means_raw = [stage.mean_value for stage in stages] - mean = max(means_raw) - start = time_axis[stages[0].start_index] - finish = time_axis[stages[0].finish_index] + if settings["zoom"]: + pass + """if max(time_axis) < 5.0: + stages = [self.get_stage_info("Welding", + dataframe, + signal["name"]) for signal in description["Real_signals"]] + if stages: + means_raw = [stage.mean_value for stage in stages] + mean = max(means_raw) + start = time_axis[stages[0].start_index] + finish = time_axis[stages[0].finish_index] - overshoot = pg.BarGraphItem(x0=0, - y0=mean - mean * 0.05, - height=mean * 0.05 * 2, - width=start, + overshoot = pg.BarGraphItem(x0=0, + y0=mean - mean * 0.05, + height=mean * 0.05 * 2, + width=start, + brush=pg.mkBrush([0, 250, 0, 100])) + plot_widget.addItem(overshoot) + + stable = pg.BarGraphItem(x0=start, + y0=mean - mean * 0.015, + height=mean * 0.015 * 2, + width=finish - start, brush=pg.mkBrush([0, 250, 0, 100])) - plot_widget.addItem(overshoot) + plot_widget.addItem(stable) - stable = pg.BarGraphItem(x0=start, - y0=mean - mean * 0.015, - height=mean * 0.015 * 2, - width=finish - start, - brush=pg.mkBrush([0, 250, 0, 100])) - plot_widget.addItem(stable) + plot_widget.setYRange(mean - 260, mean + 260) + plot_widget.setInteractive(False) + else: + max_value = min([max(dataframe[signal["name"]]) for signal in description["Real_signals"]]) + region = pg.LinearRegionItem([max_value - max_value * 0.015, + max_value + max_value * 0.015], + movable=False, + orientation="horizontal") - plot_widget.setYRange(mean - 260, mean + 260) - plot_widget.setInteractive(False) - else: - max_value = min([max(dataframe[signal["name"]]) for signal in description["Real_signals"]]) - region = pg.LinearRegionItem([max_value - max_value * 0.015, - max_value + max_value * 0.015], - movable=False, - orientation="horizontal") - - region.setBrush(pg.mkBrush([0, 250, 0, 100])) - plot_widget.setYRange(max_value - 200, max_value + 200) - plot_widget.setXRange(3.5, 4.5) - plot_widget.addItem(region) - plot_widget.setInteractive(False) + region.setBrush(pg.mkBrush([0, 250, 0, 100])) + plot_widget.setYRange(max_value - 200, max_value + 200) + plot_widget.setXRange(3.5, 4.5) + plot_widget.addItem(region) + plot_widget.setInteractive(False)""" for signal in description["Real_signals"]: if signal["name"] in dataframe_headers: - plot = plot_widget.plot(time_axis, dataframe[signal["name"]], pen=signal["pen"]) + plot = plot_widget.plot(df_continuous["time"], df_continuous[signal["name"]], pen=signal["pen"]) legend.addItem(plot, signal["name"]) + if settings["performance"]: + performance_list = np.array(performance_list) + performance_label = QLabel(f"""Performance: best = {round(performance_list.max(),2)} %, worse = {round(performance_list.min(),2)} %, average = {round(performance_list.mean(),2)}%""") + layout.addWidget(performance_label) + layout.addWidget(plot_widget) widget.setLayout(layout) @@ -183,8 +160,5 @@ class PlotWidget(BasePlotWidget, BasePointPassportFormer): widgets = [self._build_widget(data_sample) for data_sample in data] self._mediator.notify(self, widgets) - def update_settings(self, params: list[dict]): - self._initIdealBuilder(idealDataBuilder=idealDataBuilder, params=params) - diff --git a/src/gui/settings_window.py b/src/gui/settings_window.py index c67ba93..cdda08e 100644 --- a/src/gui/settings_window.py +++ b/src/gui/settings_window.py @@ -1,55 +1,103 @@ import pyqtgraph as pg -from pyqtgraph.Qt import QtWidgets -from pyqtgraph.parametertree import Parameter, ParameterTree +from PyQt5.QtWidgets import QWidget, QTableWidget, QVBoxLayout, QTableWidgetItem, QLabel, QPushButton, QLineEdit, QHBoxLayout +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QIntValidator + from src.utils.json_tools import read_json, write_json from src.gui import qt_settings as qts -class settingsWindow(QtWidgets.QWidget): +class settingsWindow(QWidget): def __init__(self, path: str, name: str, upd_func): super(settingsWindow, self).__init__() - self.settingsPath = path - self.name = name - - self.data = {} - self.params = None + self._settingsPath = path + self._name = name + self._data = {} + self._upd_func = upd_func + self.load_settings() self._init_ui() - self.params.sigTreeStateChanged.connect(upd_func) def load_settings(self) -> None: - self.data = read_json(self.settingsPath) + self._data = read_json(self._settingsPath) def write_settings(self) -> None: - self.getParams() - write_json(self.settingsPath, self.data) + write_json(self._settingsPath, self._data) + + def getParams(self) -> dict: + return self._data - def _getTreeStructure(self) -> list: - params = [] - for key, value in self.data.items(): - params.append({'name': str(key), 'type': type(value).__name__, 'value': value}) - params.append({'name': 'Save', 'type': 'action'}) - return params def _init_ui(self) -> None: - temp = self._getTreeStructure() - self.params = Parameter.create(name=self.name, type='group', children=temp) - self.params.param('Save').sigActivated.connect(self.write_settings) + save_button = QPushButton() + restore_button = QPushButton() + save_button.setText("Save") + restore_button.setText("Restore") + self._num_points = QLineEdit() + self._num_points.setPlaceholderText("Enter the number of welding points") + self._num_points.setValidator(QIntValidator()) + control_layout = QHBoxLayout() + control_layout.addWidget(save_button) + control_layout.addWidget(restore_button) + control_layout.addWidget(self._num_points) - ParamsTree = ParameterTree() - ParamsTree.setParameters(self.params, showTop=True) - layout = QtWidgets.QGridLayout() - layout.addWidget(ParamsTree, 0,0) + save_button.pressed.connect(self._save) + restore_button.pressed.connect(self._restore) + self._num_points.editingFinished.connect(self._expand) + + self._param_table = QTableWidget() + self._param_table.setColumnCount(2) + self._param_table.setRowCount(len(self._data)) + for i, (key, items) in enumerate(self._data.items()): + self._param_table.setItem(i, 0, QTableWidgetItem(key)) + self._param_table.setItem(i, 1, QTableWidgetItem(str(items[0]))) + + layout = QVBoxLayout() + header = QLabel(self._name) + layout.addWidget(header) + layout.addLayout(control_layout) + layout.addWidget(self._param_table) self.setLayout(layout) self.setStyleSheet(qts.white_style) - # self.show() + #self.show() - def getParams(self) -> dict: - self.data = {} - for p in self.params: - if p.name() != 'Save': - self.data[p.name()] = p.value() - return self.data + def _save(self) -> dict: + self._data = {} + for i in range(self._param_table.rowCount()): + key = self._param_table.item(i, 0).text() + data = [] + for j in range(1, self._param_table.columnCount()): + param = self._param_table.item(i, j).text() + if key != "trace_storage_path": + param = float(param) + data.append(param) + self._data[key] = data + self.write_settings() + self._upd_func() + + + def _restore(self) -> None: + self._param_table.setRowCount(len(self._data)) + self._param_table.setColumnCount(len(self._data[self._data.keys()[0]])) + for i, (key, items) in enumerate(self._data.items()): + self._param_table.setItem(i, 0, QTableWidgetItem(key)) + for j, item in enumerate(items): + self._param_table.setItem(i, j+1, QTableWidgetItem(str(item))) + + def _expand(self) -> None: + param=int(self._num_points.text()) + prev_columns = self._param_table.columnCount() + self._param_table.setColumnCount(param+1) + if prev_columns < param+1: + for i in range(prev_columns, param+1): + for j, (key, items) in enumerate(self._data.items()): + self._param_table.setItem(j, i, QTableWidgetItem(str(items[-1]))) + + + + + + if __name__ == '__main__': app = pg.mkQApp("Parameter Tree Example") diff --git a/src/main.py b/src/main.py index 3d20261..d3ed19d 100644 --- a/src/main.py +++ b/src/main.py @@ -7,6 +7,7 @@ from src.controller.mediator import Mediator from src.controller.converter import DataConverter from src.gui.plotter import PlotWidget from src.controller.controller import Controller +from src.controller.passportFormer import PassportFormer def main(): @@ -15,8 +16,9 @@ def main(): data_converter = DataConverter() plot_widget_builder = PlotWidget() controller = Controller() + passport_former = PassportFormer() window = MainWindow(controller) - mediator = Mediator(monitor, data_converter, plot_widget_builder, controller) + mediator = Mediator(monitor, data_converter, passport_former, plot_widget_builder, controller) window.show() controller.signal_widgets.connect(window.show_plot_tabs) diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index 3854e03c24a8d450a41b19e120293f799ee6c83c..fc1ef8d9dcf20c4bb80cc7fa1ae763035f1de3ed 100644 GIT binary patch literal 13974 zcmcgzX^b4lb)G)v+}YXXiZ?}SL{hRwCMl5?C3&q_61iN*2UnyhOUj7EWH{Bk9BM9A z_lnx}ZX#!CJ5J&xMh?U=laO{UBA0{wh;snBfLu<1{K$`>5d;Ae1R(;)KZL}Knnu|$h?@n+1OH^`A|ZoRpx3!Wj4(6JxFC$4yhbcTalVjd8G14Z9{5O z6_6?*wH>J`HI3A?liRS$JCNR@W{{q7rjg!>^gU`T(p#NLq<0~`O>IYdJ8JJ%=D9>^ z$1QTAWcU-+R;%q*y?VRlE|g3^^IV5`wc#f}-U3px{PfuuE@`K#fIN5cvQzW?)Y%v6 zO-F+~efFigT5>!;clL$q#Q?`w^Z3fMjit7(dzYFuHr4-FNIXNvKMcf4lns>tvvq}q;7@AmU2s;+a|QT3|V)_%I#ZqFkDGMpQNLfhPNa01w zMkap`LISo~BEuHJMy)%wp1ShMlnseUO zwe!nfz2Tm}2&M`+(pm8{l}a5GR;lp2F29>fWsH>3|K^R=ZDe&g$w$IEe#&hx>zcFq zlE~#NBpRObLq*B$pXVSeW?s7m(Tra3ZH0=PPY0iG)Lrit*V7jc6$S06BXcO8*VU#I z=CL5eyX)Y>g&L(he25!(Is0!>-*Ddab|AvflBIVO-$zgkbEQb%i=>~z+N>|G902Z8 zifn83o&oLz<(oO_qpH`u3pLV(5Am>ly&s8Q+c(Xi?ILqIxqZz}c9z{s71!}ROs@ML z6uu>`8>_nqS|1==DCGkAndHYrh^B~%ByAxk;&cx&&b{6SP_l!;-^Yw1!TroN1NG`wpS{Ct^#RS%MIfBO69fXY9lDods&x!(hm~!1|%4nsV4x~4>tplN#u;&mVzz0 zHDnAt$slF8KMN$(P>!{cDBD>>-LLk4Cb4KJTP3efmXl6O9Z(sSy=re57pXQrSJa^~vZxaHla3$)`c>y~d}h1MwG;X^zW__wHgp)SKES2FZr zYwTDh{wEA&^p)O4Haq$Bz ze-dCd&}kvVyTci=XvSntXeq-Ev0s8^sx)Fy5lK7g*OwaPCL{Idfnb z-31cZY$|IHO9X;s-Z0h;X~BwGDA~T*cKtM`01_b*rk_HcQ1-uTv~hnTu!AoAF6W~t zcWD~(M$Q;B*?r^#9i^mWB?ld)cBQn3UFC}I8XGuq`96WsSj}Eldt)V0lQYlZb;*jE zuG$}w0{O^Dhr;=AX##={1?na2jH%~Q0*}LMcVdO&yHWf+UYVPMvAQdE{YmvA$TZEw zh**SLK<_6>WODTbOb!ZzKhm*y;Mdc>Mbz@O|I zhnfRUbPa?|(@~O$0jI5F%PviPCXq5tYx*5Cn>S3W_u9ZSR>sa)IcwSy`&a|{z{BPC z3@so)WZu;@OfyY-vTQlFnu$z$(n(%UVMjI5HStN9Y%%HB2^uiM+cf>0zzEAUjL2fR zBsAL#WO1xwq9b!2uPi-igg^oJyR?xR>`ml&35*O+pbBFoP(+}@j)}R6X)jd3n$mGs zgQF;LHuSRuA{~^;k#CM$Ky$1%w0QH~y-tPh`w|IcPLZa13|7w>V$@fCJ(E6)&{8&D!7J)811(QsrH~dZk(&|WjC{{as1^F2 z@H)4v9erLWMRezoi03bX{;0+U}dRO%XcuNK1{@|V44s~o-LYbJXszX)mY zcgdoM%m4<;m^Re5YZhvyrFKlsB@;C!MryDvzO1nw-NmEza$&`v?>Oa_L&$qGrAIJp?};*AotckG2^QQp8*JHlYaVSqwQiF=BLlSw(K~oj-T%Cy8YDiPNVKD`q}4N zwRW=!qWKr#kJzj2b`uI0tHE*o3Fzc-WA3Nw%BeQo)orI5h?VHJa*FdbKZlA7#nY#J zgCQN8J1XDmIIUQ+d5~RMo$2p$HfWTW*puEdnl% zII{Uun}xp0s5Y3M$7fa_iW&Zc#i1b`D!%&c>dYu*KUexXSW4Y z0v2G1h`V@|+9d?soQ4}XrDEH9x`K5Zc-G?XTy*wi-moqF~AY zg$d%a3QW*&W8Yc(^Y?6r_9qA%ir_J{b7HyPP|o=6WN#0Lt*l*Xcf2^~)wfXa57AI& zXob%7_{LgqqIAUK#kdIH2fA<Ve zCFpqtJ%^Dd?Nz)km2W0tns66YV0}X?JY$LBtASwPq5gV?)~*O7w8AQ{k}8Erj0LO3 zU_E2h6R@5I31<0es5u0~UCmMSJcv8xd8r$c6ZPL44=3BtyG~10y5IjdeqLr^59RA* z6v#c&PvvLA{mi@CA%(s8EE^f@g~Zl)au76r?@;4I;Xqr;F7y;7Lx=y0*G&N+lxM=3V&2F!+Q`IXxNiVP)3{F@DNET`^O(x}=!nQv z76X?F#|=d}VX@08U_4u~;p-RaEC9;@<9Ui*&H`hw&MxN=6x^-$0Gm+z;a=?pmKW!0 z65??{gxybdst6yuqqD(Y@`cbDF2h4>#(8tyT({ONW$a=^F0p1RQ!v9bHxkz^92{6T z%wUgSvKGpDhTbZ*Y6o#Kr#vaCEA=2e51+tlE;q{gD?wVqbUkZ@DUm4j524}m6!&mE zT|s1zoh?tgE3W4>yGb2mvA%(NZU!KO2u998xIp4K!-_Ss8U7?inLUJkYp-*Ybk{qYiWTQfmwk$WnD|%z^UMCdC$I{ z1lPIevlqmPtN%NujHf3Y&FaJ%cxpBDy*PiWFLC;mUPb@(3c+gtsF2jv){>*SIoCf7 z;HRn`cwEXiJIc>SCk>^EU~1?O=pQ90lGv#0&*QgjzI+t#v9kFheqTK18}oguMbt*N z0(~SqqyIt$HxFPNJ7tz0X1qyuNux6rRvN#r+>b8>nqF4r<4g`J3xASdsRiEa-2B_5 z5S=BFjgdA7i0`W1E%K>$v!fl?#ca&YGb9|e{UB9VeB1pM?y7wmH~+(hR{vGJ->o zSO)fL;QKThV$ez{En4bx%n()eW5mS7|2Qzvj^Mx0m(P0eqaI?V5&H z>}NrVNGV7kpkn?oNLF{!P46=S5s7R$@HH`AzXa0It)LacMpp8P2ewIK3wF@#&B5Gk ztgG=HiR2?^i2WMDSdZctQMw&{cIk|D!%L|kyaZo@r6axs-K%G~W2H~i=Sv(`N5Zp5 z^$5aDlZYSK>d|iOA*qgb4{TCd1D?k*^*$Wu+>4XSw0cbKQ}=;7qmCo;Z~$1=$*IS2 z?dU-{?3r*TF6Y$~xI`4DbLvU;uzIhQPCAn)eZM*srsYI)R&PP~Zg&_&UzGOUW#piH z>4JBLx<^33aFYlY(OS?BC@?c*g;oU2(2LBqL6V1r-R>agnY<;(>*y& zmeV~+!9BtC0J$I&bHgw4Q*ag{#|&~V?q_*UxX62antrJW%H}=^k_wQ0KzOY$NDN-; zW7C{R8UHL0xgKJ!AyR`2B8Wj;M{GtJukyNx-A$R2O0L<;LKG)SxX63B_QEZUCUNT> zJQ7jB8Hw5I;4Wf)aS_KRmmKZDvnH4IZxZ|#fS(Hv7KA1XTzi$edc)5x;(8@6?g1b2 zdvN%GGKG62%6Y?aUnU0`u_;&uaB$jKeSixtmWTcI{G>!}HnWJzoP(p`xSLys8F!&Z z-h>YuA-{xI7lB~MLU}>#3K1@w@tDiF=(-C$yOCH=Nh;Y*r9EpcwP66JH;kR|vtBjz z;kER2+e0nnnj3~f{x0l)=z*=J*3!aLb3y+$S_0dC4?n)uXxIFd2Mg8}C^qrqIMnqkz6*f4MN0dJkxvFmofm#k%&W!ffdw;H=~y*0Q- zGM>Fb)y;c_m%PRKieO#gJ5yT-%8Mlg&#tq{eR={eo z45z_hGH4JM+qIq+s&qdM1Qd+?6hn>45L<#cuce<#ytWI!DY7`w!nXc(GU_)7{*>U4 z07_k!M%?sM!RYiKljKhT%7qTES@ZU0%d2}hH573kW@~}B)No~_64ZZ{jHROG+4)v5 zm667MWUlO`$1u0=1OBvZt^1C8Hunwew1zjk7kZmpuE&};5PzhUr}2tp&jBGDH>d+; z5-87P^mVKIYj=N>-QQIAH+=(=eJ#aUuk0WowlS(wFQJ9i3F%@{HsE0No5<7OPte;O z%a-_y%#(fbmw|=x-M?Ti_v__+pg)8k?l9lCROA>3T7)OERF+rBdR{NfS-4pPmIr^S zO*^w%8ml;lzp{BygjzsZUBTyYV{0uQ>Q`|j?iQMWJb z7bhZv6?~h$i{E9A=|||OZNCbgbo)5-u zr{6@u=h*I(Kvw05C~oZU_AF9=k_`@xk!^jRZ9U6E2Ia@kV6W>RByr3P%7vPrin>15 zvWF+aBPVO2U!tF33yk#K{tD<9qOJ?=$4~(aP%Q0ZtSt5*auf7dSf1%C7d7_>F_eE8 zd}(a?pRwFrz<+RPS(kswZ-@{bBqpJ}N{~B>Sp!nN}g8r@k6v3wnP7^Euj0vRC z9tNuV&x!pt!QT*2QiB^!ZxTC0u!EpC+k#09g}&iO!ME-;Je;Jylbb*&ZNi*1jr_NB zQ#s4D`%hV?4e=*Sdw73;ahWGnxZ%gC(kB35oL4&7F>8xC)T=xxYpJTMf0Bv(nU%BN z@grxwlWpzjB#G!!$o)fqDl82CFUQq1jXDcZp2okS9D#<9{t-#%knJa1%gxS;{vFa$ zUge6QT*Z=;U^z#WH7Fju^gNCYe&(s*UlBeCRwP``T0W66r;Uuc6&@8XA`&BH literal 13483 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 list[QWidget]: ... - def update_settings(self, data: list[dict]) -> None: - ... class BaseController(QObject): @@ -231,6 +235,7 @@ class BaseController(QObject): class BaseIdealDataBuilder(OptAlgorithm): + def __init__(self, params: list[dict]): operator_params, system_params = params self.mul = system_params['time_capture'] @@ -324,14 +329,16 @@ class BaseMainWindow(QWidget): """) class BasePointPassportFormer: - - def __init__(self): + + def __init__(self, + mediator: Optional[BaseMediator] = None): + self._mediator = mediator self._clear_stage = "Welding" self._stages = [ "Closing", "Squeeze", "Welding", - "Relief", + "Relief" ] def _find_indexes(self, @@ -355,7 +362,7 @@ class BasePointPassportFormer: def _filter_events(self, times: pd.Series, - dataframe: pd.DataFrame) -> dict[list[float]]: + dataframe: pd.DataFrame) -> list[dict[list[float]], int]: events = {} if self._clear_stage in self._stages: start_list, end_list = self._find_events(self._clear_stage, times, dataframe) @@ -363,25 +370,29 @@ class BasePointPassportFormer: 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 + return events, point_quantity - def _initIdealBuilder(self, + def _build_ideal_data(self, idealDataBuilder: Optional[BaseIdealDataBuilder] = None, - params: list[dict] = None): + params: list[dict] = None) -> dict: self.opt = idealDataBuilder(params) - self._stage_ideals = { + 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() + "Oncomming": self._opt.get_oncomingDF(), + "Ideal cycle": self._opt.get_cycle_time() } + return stage_ideals - def _create_curve_ideal(self, - stage: str): - data = self._stage_ideals[stage] + def form_passports(self) -> list[list[pd.DataFrame, dict, list]]: ... + + def update_settings(self, params: list) -> None: + ... + @property def opt(self) -> BaseIdealDataBuilder: @@ -389,4 +400,12 @@ class BasePointPassportFormer: @opt.setter def opt(self, opt: BaseIdealDataBuilder): - self._opt = opt \ No newline at end of file + self._opt = opt + + @property + def mediator(self) -> BaseMediator: + return self._mediator + + @mediator.setter + def mediator(self, mediator: BaseMediator) -> None: + self._mediator = mediator \ No newline at end of file