From 0afbfb9732528f96c77600f4f5eeeb6ed308e1f1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 30 Jan 2025 16:08:42 +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=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D1=8F,=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=82=D1=80=D0=B5=D0=B9=D1=81=D0=BE=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0=20(=D0=B2=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=20=D0=BB=D1=8E=D0=B1=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=B9=D1=81=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AutoConfigClass.cpython-310.pyc | Bin 829 -> 829 bytes .../ConstantCalculator.cpython-310.pyc | Bin 1349 -> 1349 bytes .../__pycache__/OptAlgorithm.cpython-310.pyc | Bin 15519 -> 15519 bytes .../OptTimeCalculator.cpython-310.pyc | Bin 9745 -> 9745 bytes .../__pycache__/PhaseCalc.cpython-310.pyc | Bin 1128 -> 1128 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 190 -> 190 bytes src/base/__pycache__/base.cpython-310.pyc | Bin 22952 -> 19075 bytes src/base/base.py | 95 +++++++++++++++++- .../__pycache__/controller.cpython-310.pyc | Bin 2125 -> 2268 bytes .../__pycache__/converter.cpython-310.pyc | Bin 1578 -> 1578 bytes .../__pycache__/file_manager.cpython-310.pyc | Bin 3469 -> 3975 bytes .../__pycache__/mediator.cpython-310.pyc | Bin 1367 -> 1686 bytes .../passport_former.cpython-310.pyc | Bin 0 -> 9032 bytes src/controller/controller.py | 3 + src/controller/file_manager.py | 27 ++++- src/controller/mediator.py | 13 ++- src/gui/__pycache__/__init__.cpython-310.pyc | Bin 244 -> 244 bytes src/gui/__pycache__/main_gui.cpython-310.pyc | Bin 6025 -> 6777 bytes src/gui/__pycache__/plotter.cpython-310.pyc | Bin 11777 -> 20562 bytes .../__pycache__/report_gui.cpython-310.pyc | Bin 7557 -> 7557 bytes .../settings_window.cpython-310.pyc | Bin 9308 -> 9303 bytes .../__pycache__/start_widget.cpython-310.pyc | Bin 9991 -> 10987 bytes src/gui/main_gui.py | 26 ++++- src/gui/plotter.py | 30 +++++- src/gui/start_widget.py | 42 +++++++- src/main.py | 5 +- .../__pycache__/roboter.cpython-310.pyc | Bin 6470 -> 10828 bytes src/performance/roboter.py | 74 ++++++++------ .../__pycache__/__init__.cpython-310.pyc | Bin 267 -> 267 bytes .../diagram_parser.cpython-310.pyc | Bin 2877 -> 2877 bytes .../__pycache__/json_tools.cpython-310.pyc | Bin 867 -> 867 bytes .../__pycache__/qt_settings.cpython-310.pyc | Bin 10685 -> 10685 bytes 32 files changed, 265 insertions(+), 50 deletions(-) create mode 100644 src/controller/__pycache__/passport_former.cpython-310.pyc diff --git a/src/OptAlgorithm/__pycache__/AutoConfigClass.cpython-310.pyc b/src/OptAlgorithm/__pycache__/AutoConfigClass.cpython-310.pyc index accac8649d2e8929150a52a8f40c6be3f3e9ff03..8b08778b352364ee570a61a0aa3464b6a2d04186 100644 GIT binary patch delta 20 acmdnXwwH}NpO=@50SK-&PT$CF#0&s6Aq4~g delta 20 acmdnXwwH}NpO=@50SGc#`!;eLF#`ZE5d;zd diff --git a/src/OptAlgorithm/__pycache__/ConstantCalculator.cpython-310.pyc b/src/OptAlgorithm/__pycache__/ConstantCalculator.cpython-310.pyc index 0c2a312491df4609ca3a296c277eb62fb067e613..6cc3eab38fe175de079b768c75bc429b6300a3d1 100644 GIT binary patch delta 20 acmX@gb(D)cpO=@50SK-&PT$CF#R>p6^93dV delta 20 acmX@gb(D)cpO=@50SGc#`!;f0u>t@v;{-GS diff --git a/src/OptAlgorithm/__pycache__/OptAlgorithm.cpython-310.pyc b/src/OptAlgorithm/__pycache__/OptAlgorithm.cpython-310.pyc index 7b03fe1727eb6e4edfa8ffcb114d5c067def180b..8f016f604574dfad7f152c3596e935be476004e1 100644 GIT binary patch delta 20 acmbPVIlq!SpO=@50SK-&PT$Bq#RdRD)&@xc delta 20 acmbPVIlq!SpO=@50SGc#`!;ek-(#syaZ diff --git a/src/OptAlgorithm/__pycache__/OptTimeCalculator.cpython-310.pyc b/src/OptAlgorithm/__pycache__/OptTimeCalculator.cpython-310.pyc index cc1f6525493a39e0cfa592029c80b8091d57b82a..ed3bd38fe5e0ebd8bcc3a416398daeb230f0f2f9 100644 GIT binary patch delta 324 zcmbQ}Gtq}TpO=@50SK-&PT$CVNRaW?I^Q3|Y}79^|> zBEVV=L9Cj|^>Sa>ih<11&dKv-Ehncd3QayDpDBRQ0aa(K@ETQJ31i*lJBn$-^+3&< ztbRobAoCbOMDgTVvVM~nD><<>fVg#&Un|M5H3FGcij&vNiA|PMVw urF@$k!UXYaCo8BNk&OZ|L2kIkT2fk&lX{CKC$qSus1PKav6)d-fDr&bUQ{6f delta 324 zcmbQ}Gtq}TpO=@50SGc#`!;eP5@d{;d`|EdW8~(QLY?f4F`JF0j2YQdf$~MklXIk1 z#Iu0RDAwS#(wv;4Jdm&fh{&J3T)I^>8pITX6XGCN`ea9$TE^(j`(>6fN`V#BfQ0oy z1X!yfh*dqgUhWH95s+EhIeEUU<>Yilp~*+&GX)Sjpz3TDUZbijVXU2eM=?#f4yaj^ z)vrhaWF8}kD4IM=)^GA+B`3Ce5Vv;nYb6=B1|YLaaq@aOvB`2uY?C#Wx!I~gvQ?9< uly7rGm>_=5WCfKYvXLMr$PKqxOG*oJQg5;3WEPhc6@Y}(H#4dVFaiK>2vUv! diff --git a/src/OptAlgorithm/__pycache__/PhaseCalc.cpython-310.pyc b/src/OptAlgorithm/__pycache__/PhaseCalc.cpython-310.pyc index 990f3c75975df91b41b9027c5773d762d42273cb..086747eee374a119bc4f15dfebae96a279371f42 100644 GIT binary patch delta 20 acmaFC@q&XppO=@50SK-&PT$BK%K`vAA_a;7 delta 20 acmaFC@q&XppO=@50SGc#`!;gNvH$=!5(Jn4 diff --git a/src/OptAlgorithm/__pycache__/__init__.cpython-310.pyc b/src/OptAlgorithm/__pycache__/__init__.cpython-310.pyc index a0c6fbc3cb49d84c5d1a8874f1ec7988db851aca..7af8d689c1da79586714ddeb8eae8b2172d6a0f7 100644 GIT binary patch delta 19 ZcmdnTxQ~%LpO=@50SK-&PM^rV82~T11zG?A delta 19 ZcmdnTxQ~%LpO=@50SGc#`zCU41^_CW1ZV&N diff --git a/src/base/__pycache__/base.cpython-310.pyc b/src/base/__pycache__/base.cpython-310.pyc index bbb4e2098877c7e34ab15b5b285caf14c98b7262..985530a5c98389e6e12a049eca7e1384508a317a 100644 GIT binary patch literal 19075 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 q None: + ... class BaseDirectoryMonitor: @@ -265,7 +299,7 @@ class BasePlotWidget: font-weight: bold; font-family: "Segoe UI", sans-serif; }""") - + @property def controller(self) -> BaseController: return self._controller @@ -281,6 +315,8 @@ class BasePlotWidget: def build(self, data: list[pd.DataFrame]) -> list[QWidget]: ... + def build_raw_trace(self, data:pd.DataFrame) -> None: + ... class BaseController(QObject): @@ -303,6 +339,9 @@ class BaseController(QObject): def open_file(self, filepath: str) -> None: ... + def open_dir(self, dirpath:str) -> None: + ... + def update_plots(self) -> None: ... @@ -363,6 +402,9 @@ class BaseFileManager: def open_custom_file(self, path:str) -> None: ... + + def open_raw_traces_dir(self, path:str) -> None: + ... def set_mode(self, num:int) -> None: ... @@ -500,4 +542,47 @@ class BasePointPassportFormer: @mediator.setter def mediator(self, mediator: BaseMediator) -> None: - self._mediator = mediator \ No newline at end of file + self._mediator = mediator + + +class BaseRawTraceProcessor: + + def __init__(self, + dataparser:BaseKukaDataParser, + textparser:BaseKukaTextParser, + mediator:Optional[BaseMediator] = None): + self._mediator = mediator + self._dataparser = dataparser + self._textparser = textparser + self._trace_df = None + self._text_data = None + + def prerender(self, data:list[str]) -> None: + ... + + @property + def mediator(self) -> BaseMediator: + return self._mediator + + @mediator.setter + def mediator(self, mediator: BaseMediator) -> None: + self._mediator = mediator + + +class BaseKukaDataParser: + + def __init__(self): + self._ch_name = None + + def parse(self, head_path: str) -> pd.DataFrame: + ... + + +class BaseKukaTextParser: + + def __init__(self): + self._in_msg = None + self._datapacks = None + + def parse(self, path:str ) -> list[KukaTXT]: + ... diff --git a/src/controller/__pycache__/controller.cpython-310.pyc b/src/controller/__pycache__/controller.cpython-310.pyc index 1238a76347d56005791ddb7c286991aa9dc1add9..d8ed8dd9189787aa152be102250c1cce20c4b240 100644 GIT binary patch delta 608 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 WPx-JX9#9OEnwvvx=Fn9(@BRk6h^&$T delta 461 zcmZ9I&r8EF6vvY^josFEa~tB+!=@q*LHq-Ts0SyABIs!fQkGOY=Q`5vFd0m6Ck3Gd zJjy%@{t5mI;!)_yzhs(BgyDmH^76j#7kRWkleTYJNg(aRj4tl=$Xf+GnAYLJ2&qL66}Go8tDX1IC*P$VM>mMj3t zRKpzKi7~A)?E+AFE~XmA16)f}{TP%I8gMq{-e!QHK8Yi;c>aPdiPv38fhPb~lg- IizrWi04=v*uK)l5 diff --git a/src/controller/__pycache__/passport_former.cpython-310.pyc b/src/controller/__pycache__/passport_former.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0be034b40dc5e79547fe2223c223bb5c334875a GIT binary patch literal 9032 zcma)C>u(&_b)UI2J3G7FU6M;$6eU?&+p?k+9LjbPr*#GSp@(50qE*YWlZD;sYVY0U zQv1@KS;<@sTP2iZ0fm#MX%e(G60$`Ls3_3XsL}L+{s{&3u^0W+eyPxp1`5=zrT)&n z`zDo!i+kt3=iKu?XV}hW(-!`gKKOC%e@|G}zf))Y&qe2Dl<*cRZgIO|mCVyF+32$d zYdR&T>6TpEj3-K-UY9KScsh+#GhIsSIkz#>%#*>XyG^po62-xpc*7r1@JDyHrO3Tw5bI2s<&I^hH_qMZ4_5z6#{1bZw8&0QNr)omL)7gP>FF{IKo{|ECX3+dCOMS z$CK!#L>iZ!;VD{;wHc9J&rzu|?D2S-&)jym?9!}WmBFgHv9*qv zU$$^QYQ5g)S)RkGc|N^zLCj#CUTM~f#r_*+`5bmUmYPq^^CHiS17ZnKF9;vdEC7N< z{@CqA>0o~(0|+xXYngWQ161!F(I>lni66wthlcQaz`-&53Q=rZO(4{v3=g!vNzc~R_j^YqF-cf+dE+L zWoy%k*tQcpJ2rRGb9o|mm%z+RR^;|qC6}>#$=XariES@V?AW$dvo_f`t#_`Mm)lIADuU5cl!#}!80%ZXuJbJE{e5T4Ixhtjt*#nkSm=Hl|Iv`hf$^7?3|q=UDg#&A=hS&QKSFS@FaPjoh#VND}X=4tsN9h#fG8KG7a%(V~Lo}FPicEnEG zzMW_6zn)C@9{+`SQGVFhP!r5dn4xlx4kxaT?br%5bKSL9!2+pZu&>C>RgPno0hJ&! zpw4zXxRe;KJwnIPxoNw1bPBGirOFHIHK=GgkL44v5tkBnHEb`UK_Wu%En7PfF!Wdq z#d(dP=k$9__uSYaaf_isNqIrQ-Br1S6Yf96pXP+3qgbn>TwbqMRpREFkfNB7C$UBY zQc8zWxh4WVokCkiL7l&^($#va9P-<==)QwL+D$mn_x}WqSW76>2YZ)ox=;~z3{?*dxbi8q6N5JHZR7R{s`VTx z9gJ~%$Junpc0C)jbvK48+D`0PEgOo)8$0JEJqwdGoK0fZ+p*jDVt$pPL;qBQbl5v`&xPvfDShG@xC)bi@BP{>HRbx1BmqD^wEymF@_ zT3jWnjdnT0E-glyKF`vD#4Ym6RIShZ}qWHx27qSF(?-|L@Nrvgl!?|l{xn$ z%h^ZqTg1<2y~Fzw%IvC;)*t+(&>(A|3G{O`>d^4q-gIMY9mHCmhAR5zs8+zLT z;SxZyL&U;55CteaT7xd9_2;ekUf4|P9Z4|yXuWH8pa%MD414|9kKJpQ{EY}+0LTH0 zKm@OWC1U@ewP<}6HYE1AGcf{-5_>fkJ8|-ib^QrE-ElJY<|^e@R3JVsh*rB>ThoMt zyOaqk4N;bXmI{?L&rtpvE-jx!rJQEHr4k(phpLz|#2V5`c?NkZ*CB^1xZcHE>d}V$ zDsBH&+MX~6yOC&irpcBA*&30MfjQ*`tPcyQT*tLDL^AwbmS%a~PTP6>a?H2)XvE2L zR@Gd6+Rf_&I8b>L)F#m+k<`@w8X82QEv+tzcH3-6({S7AKi&QlqNV4({xjKs`tS+t zkCU752cV$XYB8yj=Nj!0wo)apT<;3e6Ds+Rv7X9%Q#9(Ls#0&XU=e}rT5m>ssfEf0 zNYl%j4zvi_T3E1byAuWFMy)OD(OOgGg2{fiCL+*OzwZ1+HLtrcwNiv3TxJaE6@BA9 z=(Zt~I3L{{ZDY=_fSpYQt~<_t2K zm#`-!%b0e2kazU+{@YFU3e!?+T$j=Il?mfQ)TBc49KMVyvc`QlLr?PL$d~KSImW+R zcZk;gIVXlR85!!d7i`$^&6 z2bj3C`}2FZXvywB-uvC%zbowi{q8^9`|iCD3%h@V#`n;__YoHTY-M=eb^6XWt{EQ~pE!Xm30=)+wb074+ zGEFDifVYUCQm(9t0B4W+aD&qxd0Y7wUNLcp!;^P_BL}6@zkz(4R%;h)2($bq#;P=4 zLREC(;mLMSz$it^A7DTw>Nq8Yv!ahH_IX*eac;0Eh`ODI09%_^>YicikyE!2?7i>1 zcyCDXWIQnS!;DL{@ARJh|4}u;({#kp9{npiF=ETEEgv(EgLVpR?L08jI@)|MlI>|N za>N)g>()90cSCc*l|ZBhXCYz6$Vq@Cz^y_|O8Shgd)v@tI@U=y7lpxcS=(7iO;SUW+DxOLi+wn8v~D)`*AX9WW}>+`6{q8w zIJ4z$W@B%Cemfs$$+@`xO6);nCRUY8sz$qWd-#JKrzKQl#>YmA5@DZ-JhZVMdz(zsYqI)`FzB=^*F+@0g0W)GsCMm?oyCBBiK=&K`D|Yr z2H>c<>1a~fb!`t2Wr3VJo-Cz0?Y_BJ=`qM=#-J(njdiCVluj8CIg7VnLkW+g@)`LF zuFW30&LX_=1Mn6yY|frzY4{NE(3xxZPW*C2l}#KtA$Vj+hMxK}=tLwU_B#A-xMbE2 zIczL)!Sq_JP?M+Z^i99J+RMKs!bZ6ecAL$z+$azpdYLzgw1rC-o+&h&DswGZD@)#j zc@CZ{CJ=jen`6x5fb^2$w}ECN7)$Ahj@1TPN(@Y+h_v2q6s>#~ZHAwRpZkTI=$)KK zhUSR@?Z)V!=J&AN1ainO5rWRqi^$60`V^jwp@O>~JDUjRj8xCHuda&^b$M1pb z?B#_01!Cf!bVm{peNXazq0Mkh3RQ_2C|JeQ0UO}{A0dZB8wW|tJ8Wc#P_;{INV}=I*QZ?A0sYU@Y-(sy<#pOJsoUf_#(sbjQg(te2^rgc zm?lYhdSBuj^%VS3#dJlVN zr?2~HMY^v>cSe$^)%JkzZqX|>^J&a~i@F+&HMIT+MT3#H(+pha_D=osU`W!k6X6Nr zjaZOyX!7tj@P>FF>_$$&85lm0fXq4)vCu!JApBguV{xP*TW}E(GMZJGH!BFs6FcDu z#K;NMaJD8c<>O)gDaEOs0pwo#L1l9FE?ZsIQNJ;=l!4h}sE70>w^h@7en4+STMYs7 zJj+Oc(tC~JhQ~TeENJW!!KFsA?heWQ=Y$Y4+o!C(&gYn18>6@{eVP1qI-D%>AfczN z+$|dIpi-G}!&*u~E`o5aUX2XvjR;R6!VZcSIf`IT*v}xHhhX)IY2xnzO@132i%%#& z2wKRw27yWkL9@-f4QgisimMxDMsfm*b+}5MN91&oaE0IGbTf8h~dBfyvyemT1MJQjOGbr?@^jRfR4uX2^(?~+IB#LV7B#9Tb z64S<5R;f!WS8EM-vMs{VedO`c_lAA*r6xJ-`#gntf7sXGXi6#c(_)4alsv<; zSdrm5eAzLly4-wc$?ESDdHLG_L}pP<2oQ+?!FmqmGvat{bD(Fng@u>CLpGJIBCSTT zz94IMmi#^j;8&1`~j-ollucPp2Bz}AR)zL234fD zpcgfwOc-gPQZu;IrLw&C22vhl&{20^=-$AQpP*<}lYbPF;3}B}$|GSLA}JL$+c!iL zxylJd%?}ZEsXx6hIF|v+rzi$l$M!|mD19>l4LLCsP!LmT0YF|DRsqgTpRqVQhz$I@ ziA`-^D4_{W?JUBH(KYhGXeX$yy6?J!Rj?6^lMf90Kxs&x_}J6AVsee(810>j+-=yS z9r~v0t;!z)oZ6Sq9r@3Hd*RSa_x}UBMO%Qoo-AXgH**=eEc)78xOic#bLm1a_huV8 zjKY8rkpb^nZ_)9Ub~8L4aXsono^laCPCi33%ZQuh@7z$`U86aEe9=`@Pw%D+GZT#2tf zoW4eo&%zdU(qhTlVn{n2r{p?~9wwiLQMw)c>TM=B{Y^?aIQSx>)8pXOq~=#&*C}16 z5s+x!yq?2eB+vHj#di?B@)zvY+>2C(4r<1n6>>l2$Ed(@HEMqs74qlZhGsiCVze2< zXn#iYZnfL0Xd=iqZ6cnRKc#A$D)K4hpHTIuRB5HDE6szXX8#2xdcxaE}7@Ch&ME$qvWgk%W9jb<)OEMXf6t*P2C`lX1RjSA_F%ATA zi!lHrXh$HEy(21XUh=IuHs_dM{=mT*Z4HZyl5#upAS&3mjSiB`#sMLLP>EKz+1coS zV(Q>qbUD=U>Hh)g%C7lvo4N|iw?dUn&|%tlNm9$FiqxPEtF@b8jPO3tD*ue}!_JaH X);Vh5@{wksJaxt{0C?+n7LWZOSzenr literal 0 HcmV?d00001 diff --git a/src/controller/controller.py b/src/controller/controller.py index c7ed62e..679dc23 100644 --- a/src/controller/controller.py +++ b/src/controller/controller.py @@ -31,6 +31,9 @@ class Controller(BaseController): def open_file(self, filepath: str) -> None: self._file_manager.open_custom_file(filepath) + + def open_dir(self, dirpath:str) -> None: + self._file_manager.open_raw_traces_dir(dirpath) def save_file(self, data:list[str, QTabWidget]) -> None: filepath, tab = data diff --git a/src/controller/file_manager.py b/src/controller/file_manager.py index 0b18f49..3064fb8 100644 --- a/src/controller/file_manager.py +++ b/src/controller/file_manager.py @@ -21,12 +21,15 @@ class FileManager(BaseFileManager): self._monitor.stop() self._paths_library.clear() self._paths_library.add('') - print(self._paths_library) self._mediator.notify(self, list(self._paths_library)) case 2: # Режим онлайн-мониторинга папки self._monitor.init_state() self._monitor.start() + + case 3: # Режим работы с трейсами клиента + self._monitor.stop() + self._paths_library.clear() def update_monitor_settings(self, settings:Settings) -> None: directory_path = settings.system['trace_storage_path'][0] @@ -44,12 +47,32 @@ class FileManager(BaseFileManager): self._monitor._update_time = update_time if self._monitor.isActive: self._monitor.start() - def add_new_paths(self, paths): + def add_new_paths(self, paths:list) -> None: paths_set = set(paths) new = self._paths_library.difference(paths_set) self._paths_library.update(new) self._mediator.notify(list(new)) + def open_raw_traces_dir(self, path:str) -> None: + dat_file, txt_file = None, None + for entry in os.listdir(path): + full_path = os.path.join(path, entry) + + if os.path.isfile(full_path): + _, ext = os.path.splitext(entry) + ext = ext.lower() + if ext == '.dat' and dat_file is None: + dat_file = full_path + elif ext == '.txt' and txt_file is None: + txt_file = full_path + if dat_file and txt_file: + break + + if dat_file and txt_file: + self._mediator.prerender([dat_file, txt_file]) + + + class DirectoryMonitor(BaseDirectoryMonitor): diff --git a/src/controller/mediator.py b/src/controller/mediator.py index 7bfb7cd..591c233 100644 --- a/src/controller/mediator.py +++ b/src/controller/mediator.py @@ -11,15 +11,16 @@ from base.base import ( BasePointPassportFormer, BaseController, GraphicPassport, - Settings + Settings, + BaseRawTraceProcessor ) class Mediator(BaseMediator): def notify(self, - source: Union[BaseFileManager, BaseDataConverter, BasePointPassportFormer, BasePlotWidget, BaseController], - data: Union[list[str], list[pd.DataFrame], list[GraphicPassport], list[QWidget], Settings]): + source: Union[BaseFileManager, BaseDataConverter, BasePointPassportFormer, BasePlotWidget, BaseController, BaseRawTraceProcessor], + data: Union[list[str], list[pd.DataFrame], list[GraphicPassport], list[QWidget], Settings, pd.DataFrame]): if issubclass(source.__class__, BaseFileManager): self._controller.update_status("CSV found! Calculating...") @@ -41,5 +42,11 @@ class Mediator(BaseMediator): self._file_manager.update_monitor_settings(data) self._passport_former.update_settings(data) + if issubclass(source.__class__, BaseRawTraceProcessor): + self._plot.build_raw_trace(data) + + def prerender(self, data:list[str]) -> None: + self._trace_processor.prerender(data) + diff --git a/src/gui/__pycache__/__init__.cpython-310.pyc b/src/gui/__pycache__/__init__.cpython-310.pyc index 70d82539eb3678dc883bccd79ed3c8b378c6a1e7..a51f118be2f5c96bf043feca003466e8248b424f 100644 GIT binary patch delta 34 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 IMK9U^1)peGaR2}S delta 2529 zcmZuz&2Jk;6yII1*X#BABmQWb5{sN4XU;GdmB*GGdUJvpwfkyIj3ku9Dg{L)rP`9aa<sN_m?+z_83%+KWitUNN;E)8Krx~NN&$+K1fVvOB<|OarHl zq=AzGlp$F_SwJ~*08oy!J2DZ8v?7xZ(g~acr0cSyIPGg4okCO4O?p7k35R+~9#9v* zSRd)%R?TkU4v<0M_5d0pF97NVG)xWx$^#l9hXD265oE#aUlNQ__C)$2oB_Y)*vFv( zww~z{7g;_s$397>l{VlTI=dU05LNa~2L0VIQjBS~{$QxK-aEmgo3>xmxmqn78RIH5U{Q1TpGt>~iAB(Q6wH-DTx~ z)oQXEc!TU-bY8r|9!F1Sxl_QC+v)>R6z&RZ@_n7nYBMLkkP1|U&4w5xtyOt`gO1AS~J>M&e_yV+k`ASv|?AC zs(-QJ`5`z$pQ-18;OcupFwUlQGS7n;rcqQLYjKKw6z`qGiwEK5df6q0LNOzPFcgn-JqUqA=`mC?jbsK%OM0M*6J0|M#l=-H)1o9$tfK4K^d##{o)SHFIk~hjj@ooO z2VX%H6U?gAh(po8bP9+Whcv2MD`nTQmi;QtqW~WrXx6U8WPc^|(}O5N-x?Bs-ELT) zpYQ{)^9(zix;=o#={%Ac5;RNqDPzBHZ5*=cJy_gp3-9T%Wp!v#74yWfp9(yX7qaDj7bRkvJqILDCbB>OWxG=dJKXOOg*#4El5 zA1?(&VhfpJ_I>Elk%phNB6V!v!CaxUAP>S63nYjZ-I~{6PXe1gl)Dvf;T-!>?(5rc zB1m|vwQJUfTk}zocbP@Q_iWk>d1&3)q#@L;oO3pAfuIS&M$!81UzC+Ta* zTtd=fCJvewspEO4uR<=bv46rh3OwZ%dI+{dQsJfdRBRf#8t3vO%@EUzsJwmG0o8nEWBw^nn5Hi}VKYp1gbjwAX z+7*vqC`fwcQq^{MyCHoAG#jDDvy<5MY`;dW4SNR9KyTRee5V3yu42C@=u2?+DttU_ zQJScUS=OGd4RiY{mr@Ly8RKz-D>^Ns9wc1MfDQ>@XrJKm}ufUFn$EItw_E-LmJ?OL)k} zbqH3J;If1S2Ou9?6bA{#-b}HB(xXU5k?_jKLg#(HQR5OUgUE$uFMb_`Zy~|7X*hgX z*aC>±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 diff --git a/src/gui/__pycache__/report_gui.cpython-310.pyc b/src/gui/__pycache__/report_gui.cpython-310.pyc index a34c32eebad7a3b8dd66033fda93aee535bfb19a..8db590308bf0e2c109edf910bf740b9ad43a914c 100644 GIT binary patch delta 949 zcmZ{i%WD%+6vlfSGi_&@CZ=gajKPRT91x*eLFmJzCe`{F6WhibqiI4X&CtAhXWC#X zN{}vG--TPZu4)knsSEB+pEe|LNfO2(Mduy_SQE!oaGm& zgEYrJ`YxQy@B{V#LjYESBM;*t$6kWPRl!TRH zvi}sx+X?>_Legw4aCUBu>*`Q1y5NfDM@KTtjdoq9kKuEble3Ql8A5KeUni%=mqc{k zXc(4B7ZH7nC4IGmxz)&kmbWK*~DhG|szd}^!|jxFyXXctHVqPwTC+8mBtH=25> zV{BM8DjIFU)$1O957jr_&2QUZ!yWR{Re6VpYwAef8fgSKKLMTtdmO6L8~FcNkdG9SYx#f&z>n$r?w#rME-k?P|JwO!L1}I>%i>H5(D)YvYiy%H~u@tK!eaJ}1KD{%wK8VVq z3pZ}=7jUU7B$Key=)$!NcM}u8h%w&(Oms1US^V<9=bU@bV@`j%KdrP?RUQyuVe0LU zvLlVyl3CST58Jl&P1^O5Ild`pNQQrrO~LcZQIfI>$~i(7tT&?*gyi@;bz=CIcz_PF zJpZhoJiZ_fEbt#esHDIO#InHiBu~guo;diG&cl`$u%$|;qqWwl#1z=>0M1Kks0^0_ zhe^>&2F?;P&x^rhm+lHX9de^rJ<;N5OGc&HX=v;oe4cXh)^6}JAy@hDLz83Ioalz$ z)J=n3LG&U|g{IUp?EWh28Z}nsTcKp+y0Fk;H)RHa2w`>pDRg@L2Bas=n)N5NMJBUw z-2|3^0^kheHqdJ`73Oaw6#3GO;#)LKLDHpH-!2y$f_`O00JZg zvQ%cyP-kF4Ypez|1?-__J&ks3+0e`t-O#IIK96`Q63_P#^b~OC4OIe|fGs!lmR9QN z>t>BPjXs8}4AkNGF>S-!ykUKh^vEku<i!_F-d!^Xx_jdWk*b{PrZ^vjZg^MQu zth(Dk5em!g{sLVndoSqTkq6xTJ+xi-ac^O3O~J68pj!u{mG7nu)Cnq^ElF2gz8*os<2fwlQ9w%qp!a zl?D<{2N4+{LJ~xngNV$@dzBuTNerUm}XlT!@hkKsDEZ7;Yqocu~XVLOu1>^*zIYc;sF~h~k I!^rXn04y?m{r~^~ delta 500 zcmZus&npB`9G~wPyVLFrGi%1$nbz7tQjUsJq#V`(r_Jvl+pd;fwLBxq7E*HB@J&$; zT-=bRh+O;y9EjxR=!S5RytgNZeXsX<-#(wu_w&B*A@UrNGqUXA=!!Syk}aol!s{6W zj$7wa+^mWx-XQLHub>s9Qgh8J*h-owJ5+>yHS5j_2Rv{y8M`#=rJ9dwht8372d*c< zUYH)owUQf2;uVlU0fiU7oLK1vKp&cFryiwml6DFMBFW5;CSrDs^x}fr2y@P{DgbOa zj_(@eerl;#NF}om;fm&m0o>JsFo@^c2t=`5?|^L_)IZ&|9@AG$%5cgI;#~O$^gAj4 zBJWycomqSh48tXM8fS2~W!4%=#!fJpWDsD`#2|%jW`&-nbXK9CVYJ^6_|U3GjyZ)~~`w&L@)|RwePJI<7V-m5M29B6#SQK=}Cs)Q5Vq diff --git a/src/gui/__pycache__/start_widget.cpython-310.pyc b/src/gui/__pycache__/start_widget.cpython-310.pyc index ba9185ecb8e1ceb676fca14a6d5a95e319cb19f3..c51b6d34957714671a4916f7ebfbeb296cbb0aa9 100644 GIT binary patch delta 4333 zcmb7HU2Gf25x%|S@#n}pQ8Z2cQxs(>rkcu41OLT}99gklx3%P04w49M4kY(PpF)xH z-pRHUDRLq=aT=tJy9k29{h^xHZH%@K;HRQRVW0*2(3he`5#aJr6b1Scpf5omYV@Hq zdldC!rg0?PaA$XBZf|Dxo7vYUK6=`y>bfSu-v`g%DE(vKb)#Djkn0b>x=JM)E_cp# zO?MILq(mcByDCx5Qr48|Zs4Od27FBLJ;3YK0N$`PSWg4rLgT>4Efx4);9F?|_=J$p z0KbbSflms)5BS|Q1$;{IS=u(GNV#_2PChnr#EYCMSKU*tHRlwswKa*=Om$hBRci`W)(Mf^ z;F`2TmPsu{gUG`u4D0fiabU|>#jzU!9eG)+^0!0)P*r1?N_|32Y|hBH_1DlyywM6<*ooD+9G(#nKP z@MmKKxkpeMJ;{zE`3jOKk~2WW*3afEC5t`9Z^ka2`XWwhc}k~TX1T@l>`|PE9KSrD zuTZ;E%E=7(FdeOb%wl!H-LZXk6a=2;Gy1vJ!!XJb_JsdK@JDBl!4ErvWCY2MBtc&> z@!em=(Ik?yNYE-1QQY*_X3mVlD%x}mAb!pym2gr`s)-OAh19uu^8SPYQLoi3EZAjg zy7@x=i2D%GB!w=5JfzTYOFGa7L;jS~G0Yw?nU+v@kiXON-Hs**!-}xH!cWCdt*S5z z!Gnq8ECT@mkto2zitG}E1vv9E1+bV^)@6YJGF5;JG`Ik8Dslpf5I#aatO&FS2q2Ma zk!6Ldu2ze#OSKq6Rhxu5eali!-vT6|3D1~cyx^L}YQ@dl6^rq7>)27l3q!KaTg+V) z2i%K7{++4Mcp+w$>}tjFg2e@P(Q?=A_R*|ZU! zJq1GH1xn1OI}*#&ipo z`^l-jV#AAQUS!CNIBJr5Z}axuCms~IYG`DTzp?uj04^hCXT(ch#@X#&@l=S~!u-2; z-bvjet5-q5i@?k?qS7%;K2HaJvM_5E-HH61zjuo2<96#9LJ*6*5~~rh1J`i#ZhApP2#p`9LjPl4|RS$`Vf3M+lwT}XFH!86#qHe-KQLEsbTEklDm~&QTVHy)m$oXuGv*-W{G_e3m%c zSHR@&;c@m#z-ub>AW96=N;XKcPGfSMq{KWodj2*f4#W+y72EOsUAA@{4&ldt-f2ts z6LNze=^aXLKRoPB(Ek@->^&&TobUa_PF&dqLM(v&O4daLC5W|W&V?%Bi+zJcgn?+k9s)2$m zwi)clKwzgLN1}63ZJ=8c4aNanJ&0sS41NN00m6^=AA5F3TY;dw)7>cD+=aMM19A_Z zkFi+_O9|Of;|i;xAKTdvVJ;W(^eM}F0kXOdk?UOF({uVqu;%xZ@8aktk|vJrL=XKG z7MD`ntPGo`U9nwghCg#x(d#??w|ib69|FU<5X07Ci-R|PD_o5ZW^5w-Pi*5DJxd-&l7aHE_X=dzxCyhO5 z>$P7v2{ygdyWKLst)%&X`gHO>4`mO)buO^&Iw$T`qKCq(S%`|O8jLotbN+Y(>T!Pa zI){ClR==D1SHLKi0Vo;adYQl*o2Y2w#ui+iU_V38VsTuGPQr=F%v8%zZI|@%e7U$# zhR!E*Zu}W0A|3N19YBp+NW?*F@ei6%!=pB>`^_z=ed@_u{p8Fz1RiuS34-@u_hf`x zF%QMtAWPZpKK4^#xZY%6@;i&BIhMh%cpu1cBgv4P$n`TBm*)Au2VNv!;}-@GUiKn| zykiX`VY_iLg=7>-0SSVkIL{2TR#@GV@qIXlp957CD$zpO8iiNZI}+)T91G$%#l@G! Rm3S_GINlpC#nZ{u{{ZI#hRgr} delta 3461 zcma)8TWlQF8J;sUyE}XJ?s|RA+8M`}WKBqEX>P_fxio}8Z~(WWSX9H>GjY~kd)+f* z5+`d+F(QG|R@M=zxMowS1uBH7+_%02^?|oOP^nT!t>j9509y5-ARbz^>i?Z_#;$8< zY|Xdlzn*jc^Pm4efBEL+(M&C!PAK$u)>xSu9bCy2)en`Gz0WS4RBXeJKcm=jM_bm$ zJBd!%NuraI-a&NAP7|GW5+pAYow1vUZgL_-cM+Ynb42H)emBv1yP4=_N$<1^V@j#z zBTQXlzG0U=$E(aZrIa6g=#h#o9$-G3T*(zyPpJtO=_Ivg@h$DdU^|Vt2`GjmN%j!w zC#D?FI$yErr%k-C4YPNJt`9FomX$?TXN{;Gxz3nEqgY*;RyU1xj6H+&)VkV;*O{af zL~CBsjxMuBy{

c1+r6)3LhlrKdBt@dK6oY2+{PrjV@$9b2LO#YZcqrYPc1dNH?` zDat?650~d^+%p}!;)#LC`>aX)EpoRQiH@@_@lteuNp2^Y<|v~n6FfA%k|3MylYLAd2k%ky9qTp1#}OC z+9hrn2XF7i@Cy%6?%-=s>lc0T@3MArHGWrb7Z@V|GX#0uhD*miQ?s2T;?wxC2k(Yd zt~J7sV0@IoPg=7z&#|iI38%`BgZ*{D34j^GhCgUa;YnI_i+CmRBs(HHlYP78GVTj4 zq^&edVHtD0HpLy+y>Hb?RvEire30rd?SnSr%Z~x>1tb9v5cpXB!{ym2hmQ&~eg4#! zz)X~Fd(7jGH+hcV0Y?19g}L&qU74LKsT^w}qfK!0efHMGi}seYvE(XfC-N5$K@qdODwdizPrmj`)m z&f(qyN31zAhTkFf=D$2{$lTzQ#POp+3FJ1!4&W@<8U@(br+CHQbc`~C6O-Jb3T%bEbP4t|4-Htn2F2H+7SnbW_m1qFBZiW!jLw(}6zd(1Q9Mc|RVsP;wu( zP>f~Ulg)Euq|4<|LxmfR?IvoA+4+;=aQhzd*UmemXl#797~Jvbh&)%-&s$z?YO3m3 zPgLB>M5S7xWS6lrp}KK(W$caNYI$bDE|2_1ytm_fho6H=;D~TTx-UeogYU6 zcvQgy(r9(&1(gMZ*M~wI#0$MWY_E8yxBay2{jxx7utG2A*9d5lGCz_t<;pBQOJoH7SBJzF59^2BpQ5?4h8`|3k5Q0|-KBe!I;Ki3$Gm)$&xricCT;VSh zl;VDR%yGU$3A7$FI^a5Bo6r^*@qZ!)`-@?GZ?))lz_eei^gnle z4|y-eI2tjJ0%SZlLMbDQc=DeC%n-t`6~(s)4(xv;6i5}hUa9gH3G$flO=y4`Ety;e zQ4u#vm)N6Xc<`Vl-^ub7!)3&gbTVerWYfGR1n}$|!*uoMtIh~{SKLm5lyXQ-MbS;O RDt%gZAbU8wGwT$({{uW1wax$l diff --git a/src/gui/main_gui.py b/src/gui/main_gui.py index 45ec21d..1a05e3f 100644 --- a/src/gui/main_gui.py +++ b/src/gui/main_gui.py @@ -4,7 +4,8 @@ from PyQt5.QtCore import Qt, pyqtSignal from base.base import BaseMainWindow, Settings from gui.start_widget import (CustomMenuBar, CustomStatusBar, StartWidget, CustomTabWidget, - RaportWidget, SeekingWidget) + RaportWidget, SeekingWidget, + ClientAnalyzerWidget) from gui.settings_window import SystemSettings, OperatorSettings from gui.report_gui import ReportSettings @@ -17,6 +18,7 @@ class MainWindow(BaseMainWindow): signal_replot_all = pyqtSignal() signal_open_file = pyqtSignal(str) signal_save_file = pyqtSignal(list) + signal_open_dir = pyqtSignal(str) def __init__(self) -> None: super().__init__() @@ -53,6 +55,7 @@ class MainWindow(BaseMainWindow): start_widget = StartWidget() start_widget.seeking_mode_btn.clicked.connect(self._init_seekingUI) start_widget.raport_mode_btn.clicked.connect(self._init_raportUI) + start_widget.client_mode_btn.clicked.connect(self._init_client_UI) self.setCentralWidget(start_widget.get_widget()) def _init_settings(self) -> None: @@ -64,6 +67,7 @@ class MainWindow(BaseMainWindow): self.menu = CustomMenuBar(self.sysSettings, self.repSettings, self.operSettings) self.menu.seeking_action.triggered.connect(self._init_seekingUI) self.menu.raport_action.triggered.connect(self._init_raportUI) + self.menu.client_action.triggered.connect(self._init_client_UI) self.menu.view_settings.triggered.connect(lambda: self._on_tab_changed(0)) self.menu.setup(self) @@ -105,6 +109,17 @@ class MainWindow(BaseMainWindow): self._set_mode(2) seeking_widget = SeekingWidget(self._tab_widget) self.setCentralWidget(seeking_widget.get_widget()) + + def _init_client_UI(self) -> None: + self._clear() + self._set_mode(3) + client_widget = ClientAnalyzerWidget(self._tab_widget) + #TODO: привязать действия к кнопкам + client_widget.open_folder_btn.clicked.connect(self._open_folder) + client_widget.save_screen_btn.clicked.connect(self._save_plots) + self.setCentralWidget(client_widget.get_widget()) + #client_widget.build_TCW_btn.clicked.connect() + def _set_mode(self, num:int) -> None: match num: @@ -114,6 +129,9 @@ class MainWindow(BaseMainWindow): case 2: self.status_widget.set_mode("online mode") self.signal_mode.emit(2) + case 3: + self.status_widget.set_mode("client processor mode") + self.signal_mode.emit(3) def _transfer_settings(self) -> None: settings = Settings(self.operSettings.getParams(), self.sysSettings.getParams()) @@ -129,6 +147,12 @@ class MainWindow(BaseMainWindow): CSV_path, _ = QtWidgets.QFileDialog.getOpenFileName(self,"Select csv file", "", "CSV Files (*.csv)") if CSV_path: self.signal_open_file.emit(CSV_path) + + def _open_folder(self) -> None: + dir_path = QtWidgets.QFileDialog.getExistingDirectory(self,"Select folder with traces","", + QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontResolveSymlinks) + if dir_path: + self.signal_open_dir.emit(dir_path) def _save_plots(self) -> None: filepath, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", "", "Image Files (*.png *.jpeg)") diff --git a/src/gui/plotter.py b/src/gui/plotter.py index 9b9975a..a745e5b 100644 --- a/src/gui/plotter.py +++ b/src/gui/plotter.py @@ -19,6 +19,7 @@ import pyqtgraph as pg import pandas as pd from base.base import BasePlotWidget, GraphicPassport, PlotItems, PointPassport, UsefulGraphData +from utils import qt_settings as qts @dataclass @@ -54,6 +55,31 @@ class PlotWidget(BasePlotWidget): finally: self._mediator.notify(self, widgets_datapack) + def build_raw_trace(self, data:pd.DataFrame) -> None: + """ + Создаёт один виджет с одним графиком, где представлены все данные + """ + container_widget, container_layout, pyqt_container = self._generate_widget_container() + plot = self._build_raw_plotitem(data, pyqt_container) + container_layout.addWidget(plot) + container_widget.setProperty("pyqt_container", pyqt_container) + + self._mediator.notify(self, [container_widget]) + + def _build_raw_plotitem(self, + dataframe:pd.DataFrame, + pyqt_container:PlotItems) -> pg.GraphicsLayoutWidget: + plot_item, legend = PlotItemGenerator._init_plot_item("Customer data") + channels = dataframe.columns.to_list() + for i, channel in enumerate(channels): + plot = plot_item.plot(dataframe.index.values, dataframe[channel], pen = qts.colors[i], fast = True) + legend.addItem(plot, channel) + pyqt_container.curves["real"].setdefault(channel, {}) + pyqt_container.curves["real"][channel] = plot + plot_layout = pg.GraphicsLayoutWidget() + plot_layout.addItem(plot_item) + return plot_layout + def _build_performance_label(self, timings: ChannelTimings, qt_items: dict) -> QWidget: @@ -132,7 +158,8 @@ class CustomPlotLayout(pg.GraphicsLayoutWidget): def __init__(self, graphic_passport: GraphicPassport, widget_steps: int, - colors: dict, parent: PlotWidget = None) -> None: + colors: dict, + parent: PlotWidget = None) -> None: super().__init__() self._plotter = PlotItemGenerator(graphic_passport, widget_steps, colors, parent) self.setProperty("performance", None) @@ -155,7 +182,6 @@ class CustomPlotLayout(pg.GraphicsLayoutWidget): if navigator is not None: self.addItem(navigator, widget_num+1, 0) - class PlotItemGenerator: def __init__(self, diff --git a/src/gui/start_widget.py b/src/gui/start_widget.py index 60a992a..f627172 100644 --- a/src/gui/start_widget.py +++ b/src/gui/start_widget.py @@ -27,14 +27,17 @@ class StartWidget(QWidget): def _build_main_layout(self) -> None: self.resize(800,800) self.seeking_mode_btn = QPushButton("Real time folder scanning") - self.seeking_mode_btn.setFixedWidth(300) + self.seeking_mode_btn.setFixedWidth(350) self.raport_mode_btn = QPushButton("Raport editor") - self.raport_mode_btn.setFixedWidth(300) + self.raport_mode_btn.setFixedWidth(350) + self.client_mode_btn = QPushButton("Client trace processor") + self.client_mode_btn.setFixedWidth(350) button_layout = QHBoxLayout() button_layout.setSpacing(2) button_layout.addWidget(self.seeking_mode_btn) button_layout.addWidget(self.raport_mode_btn) + button_layout.addWidget(self.client_mode_btn) button_widget = QWidget() button_widget.setLayout(button_layout) @@ -201,6 +204,7 @@ class CustomMenuBar(QMenuBar): # Создаем действия для меню self.seeking_action = QAction("Real time folder scanning", self) self.raport_action = QAction("Raport editor", self) + self.client_action = QAction("Client trace processor", self) system_settings = QAction("System settings", self) system_settings.setIcon(QIcon('resources/system_ico.png')) @@ -217,6 +221,7 @@ class CustomMenuBar(QMenuBar): # Добавляем действия в меню "Режимы" modes_menu.addAction(self.seeking_action) modes_menu.addAction(self.raport_action) + modes_menu.addAction(self.client_action) settings_menu.addAction(system_settings) settings_menu.addAction(operator_settings) @@ -293,4 +298,35 @@ class SeekingWidget(QWidget): main_layout.addWidget(button_widget) self.setLayout(main_layout) - \ No newline at end of file + +class ClientAnalyzerWidget(QWidget): + + def __init__(self, tabWidget:CustomTabWidget): + super().__init__() + self._tabWidget = tabWidget + self._build_widget() + + def get_widget(self) -> QWidget: + return self + + def _build_widget(self): + main_layout = QVBoxLayout() + self.save_screen_btn = QPushButton("Save state") + self.save_screen_btn.setFixedWidth(185) + self.open_folder_btn = QPushButton("Open folder") + self.open_folder_btn.setFixedWidth(185) + self.build_TCW_btn = QPushButton("Calculate TCW") + self.build_TCW_btn.setFixedWidth(185) + + button_layout = QHBoxLayout() + button_layout.setSpacing(2) + + button_layout.addWidget(self.save_screen_btn) + button_layout.addWidget(self.open_folder_btn) + button_layout.addWidget(self.build_TCW_btn) + button_widget = QWidget() + button_widget.setLayout(button_layout) + + main_layout.addWidget(self._tabWidget) + main_layout.addWidget(button_widget) + self.setLayout(main_layout) \ No newline at end of file diff --git a/src/main.py b/src/main.py index ffd240c..254de46 100644 --- a/src/main.py +++ b/src/main.py @@ -10,6 +10,7 @@ from controller.converter import DataConverter from gui.plotter import PlotWidget from controller.controller import Controller from controller.passport_former import PassportFormer +from performance.roboter import TraceProcessor def main(): @@ -22,13 +23,15 @@ def main(): plot_widget_builder = PlotWidget(controller=controller) passport_former = PassportFormer() window = MainWindow() - mediator = Mediator(data_converter, passport_former, plot_widget_builder, controller, file_manager) + trace_processor = TraceProcessor() + mediator = Mediator(data_converter, passport_former, plot_widget_builder, controller, file_manager, trace_processor) window.show() window.signal_mode.connect(controller.set_working_mode) window.signal_settings.connect(controller.update_settings) window.signal_replot_all.connect(controller.update_plots) window.signal_open_file.connect(controller.open_file) + window.signal_open_dir.connect(controller.open_dir) window.signal_save_file.connect(controller.save_file) controller.signal_widgets.connect(window.show_plot_tabs) diff --git a/src/performance/__pycache__/roboter.cpython-310.pyc b/src/performance/__pycache__/roboter.cpython-310.pyc index 69dca3ea2da70ed3e3798adb72a2f800224435b3..421c14bbb4c17b9f7f9dafda25a819d654fa2122 100644 GIT binary patch literal 10828 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 literal 6470 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 diff --git a/src/performance/roboter.py b/src/performance/roboter.py index d854cf0..72c3d2b 100644 --- a/src/performance/roboter.py +++ b/src/performance/roboter.py @@ -1,43 +1,15 @@ from __future__ import annotations import os -from typing import Tuple, Union +from typing import Tuple, Union, Optional from dataclasses import dataclass, field import numpy as np import pandas as pd - -@dataclass -class KukaDataHead: - rob_ID: int - filename: str - channels: dict +from base.base import BaseKukaDataParser, BaseKukaTextParser, BaseRawTraceProcessor, KukaDataHead, KukaTXT -@dataclass -class KukaTXT: - time: float = 0 - endtime: float = 0 - #module: str - func: str = "" - type_: str = "" - signal: str = "" - #line: int = 0 - #point_name: str = "" - #point_coord: dict = field(default_factory=lambda: {}) - #blending: str = "" - #blending_param: float = 0 - #velocities: dict = field(default_factory=lambda: {}) - #accelerarions: dict = field(default_factory=lambda: {}) - #base: dict = field(default_factory=lambda: {}) - #tool: dict = field(default_factory=lambda: {}) - #ipo_mode: str = "" - #motion_mode: str = "" - #load: dict = field(default_factory=lambda: {}) - #load_a3: dict = field(default_factory=lambda: {}) - - -class KukaDataParser: +class KukaDataParser(BaseKukaDataParser): def parse(self, head_path: str) -> pd.DataFrame: head = self._parse_dat_file(head_path) @@ -120,8 +92,9 @@ class KukaDataParser: return floats -class TextParser: +class KukaTextParser(BaseKukaTextParser): def __init__(self): + super().__init__() self._in_msg = False self._datapacks = [] @@ -290,6 +263,41 @@ class TextStageDetector: return stages +class TraceProcessor(BaseRawTraceProcessor): + + def __init__(self): + dataparser = KukaDataParser() + textparser = KukaTextParser() + super().__init__(dataparser, textparser) + + def prerender(self, data:list[str]) -> None: + if data: + dat_filepath = data[0] + txt_filepath = None + elif len(data) == 2: + dat_filepath = data[0] + txt_filepath = data[1] + else: + dat_filepath = None + txt_filepath = None + + self._trace_df = self._unpack_trace(dat_filepath) + self._text_data = self._unpack_text(txt_filepath) + + self._mediator.notify(self, self._trace_df) + + + def _unpack_trace(self, dat_filepath:str = None) -> Optional[pd.DataFrame]: + if dat_filepath: + return self._dataparser.parse(dat_filepath) + return None + + def _unpack_text(self, txt_filepath:str = None) -> Optional[list[KukaTXT]]: + if txt_filepath: + return self._textparser.parse(txt_filepath) + return None + + "Перемещение" @@ -330,7 +338,7 @@ class TextStageDetector: if __name__ == '__main__': roboreader = KukaDataParser() - txt_reader = TextParser() + txt_reader = KukaTextParser() detector_traces = TraceStageDetector(region_of_focus=[7.7, 42]) detector_weldings = TextStageDetector() diff --git a/src/utils/__pycache__/__init__.cpython-310.pyc b/src/utils/__pycache__/__init__.cpython-310.pyc index a4bdb2abc957f18862b74c63c5feb32a399c31e7..78b7dc958221a0372beec12a7592967ed7cb1f6e 100644 GIT binary patch delta 19 ZcmeBX>Sp53=jG*M0D|j{(-(3x0sts71XTb4 delta 19 YcmeBX>Sp53=jG*M0D?@`zJ=V303!|qVgLXD diff --git a/src/utils/__pycache__/diagram_parser.cpython-310.pyc b/src/utils/__pycache__/diagram_parser.cpython-310.pyc index c4db8c1ba301e1e0b2ad7974993ea698d921527d..3b2b1ac826a3a739cdb9788ed9a9d42b38a0d6ef 100644 GIT binary patch delta 20 acmdlhwpWZhpO=@50SK-)PT$CF#0>y9a0M*@ delta 20 acmdlhwpWZhpO=@50SGc#`!;eLaRUG`Sp+%& diff --git a/src/utils/__pycache__/json_tools.cpython-310.pyc b/src/utils/__pycache__/json_tools.cpython-310.pyc index 052e62fa840c34d4f63c200eb65e01d214799848..2f9d5f2ae369b74cfb7f9651775c6f38b37d01bd 100644 GIT binary patch delta 20 acmaFN_Lz-3pO=@50SK-)PT$BK!3+R97zK9# delta 20 acmaFN_Lz-3pO=@50SGc#`!;e%FarQJ0R)5q diff --git a/src/utils/__pycache__/qt_settings.cpython-310.pyc b/src/utils/__pycache__/qt_settings.cpython-310.pyc index 55e5b8f919355c7f47f41c5afcaa5e724f1cc34c..437a443521f583f045c9e0b70e08cf21255d2ee5 100644 GIT binary patch delta 20 acmdlRyf>ITpO=@50SK-)PT$DANfQ7;A_heO delta 20 acmdlRyf>ITpO=@50SGc#`!;fK(gXlI3k6aD