From eaec12d3ff0eadfc31855d7099c4b5a4ec8ad7f1 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 17 Dec 2024 20:40:04 +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=D0=BA=D0=BD=D0=BE,=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D1=8E=D1=89=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=B6=D0=B4=D0=BE=D0=B3=D0=BE=20=D1=8D=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- params/operator_params.json | 26 +++--- .../__pycache__/controller.cpython-310.pyc | Bin 1086 -> 1086 bytes .../__pycache__/mediator.cpython-310.pyc | Bin 1346 -> 1346 bytes src/controller/controller.py | 3 +- src/gui/__pycache__/mainGui.cpython-310.pyc | Bin 3434 -> 4278 bytes src/gui/__pycache__/plotter.cpython-310.pyc | Bin 9205 -> 9580 bytes src/gui/__pycache__/reportGui.cpython-310.pyc | Bin 0 -> 2965 bytes src/gui/mainGui.py | 34 +++++++- src/gui/plotter.py | 36 +++++--- src/gui/reportGui.py | 77 ++++++++++++++++++ .../base/__pycache__/base.cpython-310.pyc | Bin 19913 -> 19913 bytes src/utils/base/base.py | 4 +- 12 files changed, 152 insertions(+), 28 deletions(-) create mode 100644 src/gui/__pycache__/reportGui.cpython-310.pyc create mode 100644 src/gui/reportGui.py diff --git a/params/operator_params.json b/params/operator_params.json index 16046d2..7be03f3 100644 --- a/params/operator_params.json +++ b/params/operator_params.json @@ -81,19 +81,19 @@ ], "distance_l_2": [ 0.0275, - 0.03, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033, - 0.033 + 0.0255, + 0.0242, + 0.0245, + 0.0228, + 0.0236, + 0.0229, + 0.0248, + 0.024, + 0.0235, + 0.025, + 0.0276, + 0.0234, + 0.0215 ], "distance_h_end1": [ 0.003, diff --git a/src/controller/__pycache__/controller.cpython-310.pyc b/src/controller/__pycache__/controller.cpython-310.pyc index f7576ab22bae9fe7ccc44faafb0916df3415da4b..bab4ee2f2dbee4a544bbf001187bc79764878d80 100644 GIT binary patch delta 22 ccmdnTv5$i{pO=@50SGMDC8kGh diff --git a/src/controller/__pycache__/mediator.cpython-310.pyc b/src/controller/__pycache__/mediator.cpython-310.pyc index 6717f3d71eea6aa759aa4488c6b22ec16ef92a4a..d79c2051dbab1108db779f942ca6bb43d907db66 100644 GIT binary patch delta 19 ZcmX@ab%={ApO=@50SG>?-N None: - self.signal_monitor.emit(filepath) \ No newline at end of file + self.signal_monitor.emit(filepath) + \ 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 01f607126225decb25e3e04eea70dc6ec76a7056..fb783bc236d75512b9ed4ccd15071b167062f03e 100644 GIT binary patch delta 2139 zcmZ`)-ES0C6u)=Ac0P7yw;xJrODSNGrKU&;6bzOafubpGDMfH2Zl-&OWnj8n@61wZ zruLytT1-r=^Q@V^$(zxHe?k)zA1Cq2#6%PS20Z6Zw`noX=AL`*Ip>~x?m54E_V4}| z$DEdJn*_e^U$~91yzLCqV0&cdI3uhO*o#ipp=6RUof#X18J@8&S4+&iO)A#**X(kI zX3m_q)Z)=?FN*wTBdnvZ{hzwK2)_ZwBUQ>sRWc~+Plo6rI*?qTXRQHNV&x5`YO{fa z)8pN&j~(71)$UEAkZKPcHkf=z&(SZE-{`fAF?nP?($WIV#T`mXWHZVnSUKx*Oll=q z%S_o@m!qzA0`l%;T$-aj$(Pc`(ah!|=-NU%idxOgsqLcEv_xJi)X$d!Shi|{QV zCM`nJbf85E#(^KE6eP*->i8O>REP0CZu|jAOs|srmoPV<$gA?IvZ_WTrI0Nx)>4Vl zSlN*vN61UDiah9L&==xDs>HI$m6ob8)Bx;=0F}n%NKcI&lA27}p@)d@0lNFC6+;mz z`3$k9rA2V0$2wCVD|{X>rvYE+BkK|bWvm)8NuAgb_ET5}Q3`!JGq~5N`H{C6W>&q; zpLqEqd7)L_ISH4ll(+&@R=5S}Zg^2 zv2bOrg4<0#gp%_>GHWSlMYZMJkCxB;0;U6c$tGx@O)zln!ulKb|nKJ3Td(^>9?;k74TGrF4G(Q9Kj zz_udu0o=*8|D2V;L}JBT4wfAJAAl@%c-Pcw9kt@ z1%3+5GqoOgF3*oOAj7jRcNar(HZP&S86XhXP|{_-(RpZ{-Q9P4u@`NMopOUYMO-$~3>)q2nhn8#~NF1)Q*4m$(}_mZEjQ)_h! zZ0Eygid|KP5#9r`B|XZ4Ph*O}-=WWP4%)#p63JU+9dHXX#Tl%XRAmDG$Rq4G$tK;D z9zfq@>V{}M0Rs!>L$USchi=g=cp^wfkiBrOta%m$=`I_$c`1XOLj{92<70P*+hPV)__4(Vh+icOQnhCmx-ZsC4!bv1kND$frbOK$Oj1ePNIM$zI zFqvJe)dM#S>s}DlYWr|<6ir0X*dB3&_=t2ONycX#USI+4jYspRn6^*8a*ZwpcsxCJ>e(cJm_1+jm*C?_TL& DfLq^6 delta 1327 zcmZWoO>ERg6rLIXtbf+tg`|*O0&Qtp;vy6_6s0OH5rGKQ(v&}`(n^(Mc4m_$&N>-; zK}e2}nn*}Jphk1;!FxpNxf1sZ_1vQ`z4X#@N0m6ho7o5@#g^Z^_vZb4@AJ%WAO73) z6VG!HJTLpv$_sbbpTx_%r@uRL710W{b`Z6gy{)x9YTrhIv-=BO=*Z~(kFjT@KY_wf z8&lLKHl`DlFpcRA)FqEm7gLSuJ6_wM4RHsz+y<@D`i>5j8{%ht(s_(@)IJPNn&NkS z4tK?Wc=3bGrI?Z&-K%bEISM_np~_p^7Xxw&*Tf%WN33bHPC!aMWpS4~;+gjCqz8E9 zY-wF8#KabMa9zFQ;uHOI@+%U{dUDAdqAik>!l&jCV+5K7Eu4LNRq42>U4klOPgw$#vWJD@0 z2Uh`|1+q%ugBK8sSLWQK3hY|&U6!FwK;-xe`eAyDWT?OZUxSsvs^@y4?Sa$^utsq2 z8HJf^6layf8lu9cFvd|dBrq(3Jtx;>+@@sOC|syx3W0_ImP3f5dQMwy(l7$acs`$%letM9x(oa{D2cZheqPyudQI+@+)Fcc5_n5Gzmj4>3Q43IQO#0ny?&;UsnVqvhMhP{(+-Q{Fx=Pum`pn%g$+V} zqyLTw(O;X`f9<#vlVeuR(jDE=4x4pN1unsPlvk5~CPh8&yUkoXYdahJ z?sZVZTy1DvHK0ZU4XPkQ)m>G*A)(4rg-}64@X7-(JgfvfBO$>{Bt+7}H?ted$*%6X zXU>^(=FE4`IWrH>{_|YwW-=Mm@cY}Z>T5rF;ltFw2#JbM$#g6U;Ub>aZ^Qz9i!6u_ z=~!XF)mhX{GLz+26Ks$T?V2k?(P4H}6!gi=)7m^Mh(Ud(U33Rs-8Ecul@_#u#!B$f zvmarjyT(eMIc{t{%gU~`9${n8%&tH;aKL7qO~9tWCfy>Na&2}9&omzCF~(-tEVLz7 zg%=ZRneNEks=?;iVTebSSSh3m1_qmFN1!RQ+An-KgiT)f&EgqqTg^0xC~_aWD})I-b@KK{ySyjuu!xc}H6%j4--ub8AVvOYRcy zl;o}+4$ct<@Q;wfy>;TLUPKo6Xiskhh8; zc65l?Btaa|82%2)5_-q@k61{|v=722lS{&OMq0iL!YLyK37f|CkaPf75b*)aT>`+K z?*patC_WsrNP@&IZWpv+ErrC4)+G(EA}72m$=AhilgB5eypN_t zGNJG^p2jnodam7#U)%9+xxK7>Dk-DzARmS99WcNYNeLuh3@mQo{TxzI3klMWatjdX zlFBd8=YTO%(dM>ylG`EOM^fju!qjBOF`#Dfh)l;uFBNSLFV-HZce#mIB3i zY*;eca`@9b^r84&dhw}blThp@+b#y2u4D7EO1Ta&J_|4+YV+1D&3l=Xb&7NZ1hPt{ zT)Ym!`-q#^!3@H%-{Eaon?k3b+{Q*CV*)YtB60rd%|s7$?qPtM5C zX<+PgCMQ?)zzQNVYgCO!@djw9Ra>S7>eO1Np$^y+zHyJNo1rD^d`bHexw?f4PvS`h zX=oyCjyk+gAaH^VPctNEkY$lz08ftD!645vRIPX69tmw0!;HAhH#9&4Ed*KFcbkHT zp4LUl z?vEUd$RZMAJsy;?c!J6B)Z*(&UWUbJ$G|?ppVY8G77KjT5B8&bT9{H*=mcZ?fe*l@ z#K%ApyyTD{zi7iG2h%@bTADleG@d}CAMBXuVOcg*0AwEN1s7ECMp(R(*Mf2EWf*yy z&uPH~_(Gqb^c`N|6MURc-Zg?LJ{4wIQRVMcnDqz394mE5e>~_9tha|4&SqA=PnFOK zhxwG^)Q+%t5rO5o!%GOwU}G{cND6&Pn#o<6{ctNP-0OVEFUk+YoV>O{gG2lf{4Dw< zbxg`r-DZ=$V=|a-`z2mtQ;0szM&CvyBI#zDiT+O2N5O8VG3OAz+zcP!(@c>vQgx}{t++A-Ar$9R>`J#p4CkbH-OdGy{2cckt1g5nQL9@gWS zJFl9?-1jBWho|-q$N2cmWmbf58)OslJnx@qEDDOUYev95f@9R z<8R10vekMQ#RsJ;jy&$XZ%ATFa!#a2CQhl7?vfmT2c)ZSy3MZM+PUGma%kgnap{#t zbHm%ha3xc_hO39~)|&NOjkUUe)AO3b8#y<1q}SQDrH%F723vD|Pcc;#GlK2Bp;#P3oZ4u+$iR8{?oROQE6A&?nxE;n?G$ lTzSLGAfjq!#oDSjS-s`GCtjVblD2qrvK5sV8=9gy^Z(hz#Hs)Q delta 2832 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 None: self.tabWidget = QtWidgets.QTabWidget() @@ -29,19 +32,30 @@ class MainWindow(BaseMainWindow): self.settings_button.setFixedWidth(160) self.select_dir_button = QtWidgets.QPushButton("Open directory") self.select_dir_button.setFixedWidth(175) + self.report_button = QtWidgets.QPushButton("Generate report") + self.report_button.setFixedWidth(175) + self.rep_settings_button = QtWidgets.QPushButton("Report settings") + self.rep_settings_button.setFixedWidth(175) + self.rep_settings_button.setVisible(False) button_layout = QtWidgets.QHBoxLayout() button_layout.setSpacing(2) button_layout.addWidget(self.settings_button) button_layout.addWidget(self.select_dir_button) + button_layout.addWidget(self.report_button) + button_layout.addWidget(self.rep_settings_button) layout.addLayout(button_layout) self.setLayout(layout) def show_plot_tabs(self, plot_widgets: list[QtWidgets.QWidget]) -> None: for plot_widget in plot_widgets: + widget, reg_items, curve_items = plot_widget + tab = QtWidgets.QWidget() + tab.setProperty("reg_items", reg_items) + tab.setProperty("curve_items", curve_items) grid = QtWidgets.QGridLayout() - grid.addWidget(plot_widget) + grid.addWidget(widget) tab.setLayout(grid) self.tabWidget.addTab(tab, "SF_trace_" + dt.now().strftime('%Y_%m_%d-%H_%M_%S')) self.tabWidget.setCurrentWidget(tab) @@ -51,7 +65,6 @@ class MainWindow(BaseMainWindow): for i in range(0, tab_count-2): self._close_tab(i) - def keyPressEvent(self, a0): if a0.key() == Qt.Key_F5: pass @@ -77,5 +90,22 @@ class MainWindow(BaseMainWindow): if folder_path: self._controller.open_custom_file(folder_path) + def _report_window(self): + tab = self.tabWidget.currentWidget() + reg_items = tab.property("reg_items") + curve_items = tab.property("curve_items") + print(curve_items) + print(reg_items) + + self.rep_settings_button.setVisible(True) + self.rep_settings_button.clicked.connect(lambda:self.repSettings.build(reg_items, curve_items)) + + + + + + + + diff --git a/src/gui/plotter.py b/src/gui/plotter.py index 29e99c5..4b51da3 100644 --- a/src/gui/plotter.py +++ b/src/gui/plotter.py @@ -59,6 +59,7 @@ class PlotWidget(BasePlotWidget): plot_widget: pg.PlotWidget, point_events: dict[str, list[float]], dataframe_headers: list[str], + reg_items: dict, transparency: int = 75) -> None: """ Добавляет регионы для реальных этапов, если все стадии есть в заголовках датафрейма. @@ -71,11 +72,14 @@ class PlotWidget(BasePlotWidget): if region is not None: region.setZValue(-20) plot_widget.addItem(region) + reg_items["real"].setdefault(stage, []) + reg_items["real"][stage].append(region) def _add_ideal_stage_regions(self, plot_widget: pg.PlotWidget, ideal_data: dict[str, Any], point_events: dict[str, list[float]], + reg_items: dict, transparency: int = 125) -> None: """ Добавляет регионы для идеальных этапов. @@ -89,12 +93,15 @@ class PlotWidget(BasePlotWidget): if region: region.setZValue(-10) plot_widget.addItem(region) + reg_items["ideal"].setdefault(stage, []) + reg_items["ideal"][stage].append(region) def _add_ideal_signals(self, plot_widget: pg.PlotWidget, ideal_data: dict[str, Any], point_events: dict[str, list[float]], - ideal_signals: list[dict[str, Any]]) -> None: + ideal_signals: list[dict[str, Any]], + curve_items: dict) -> None: """ Добавляет идеальные сигналы для каждого этапа. """ @@ -109,12 +116,15 @@ class PlotWidget(BasePlotWidget): if curve: curve.setZValue(10) plot_widget.addItem(curve) - + curve_items["ideal"].setdefault(signal["name"], {}) + curve_items["ideal"][signal["name"]][stage] = curve + def _add_real_signals(self, plot_widget: pg.PlotWidget, dataframe: pd.DataFrame, real_signals: list[dict[str, Any]], - legend: pg.LegendItem) -> None: + legend: pg.LegendItem, + curve_items: dict) -> None: """ Добавляет реальные сигналы из dataframe на виджет. """ @@ -124,6 +134,8 @@ class PlotWidget(BasePlotWidget): plot = plot_widget.plot(dataframe["time"], dataframe[signal["name"]], pen=signal["pen"], fast=True) plot.setZValue(0) legend.addItem(plot, signal["name"]) + curve_items["real"].setdefault(signal["name"], {}) + curve_items["real"][signal["name"]] = plot def _add_performance_label(self, layout: QVBoxLayout, @@ -152,6 +164,8 @@ class PlotWidget(BasePlotWidget): """ widget = QWidget() layout = QVBoxLayout(widget) + reg_items = {"real":{}, "ideal":{}} + curve_items = {"real":{}, "ideal":{}} dataframe, points_pocket, useful_data = data tesla_time = useful_data["tesla_time"] @@ -192,7 +206,7 @@ class PlotWidget(BasePlotWidget): # Добавляем реальные стадии if settings["stages"]: - self._add_stage_regions(plot_widget, point_events, dataframe_headers, 75) + self._add_stage_regions(plot_widget, point_events, dataframe_headers, reg_items, 75) # TODO: подобрать не вырвеглазные цвета, возможно ограничить зону if settings["workpiece"]: @@ -209,8 +223,8 @@ class PlotWidget(BasePlotWidget): # Добавляем идеальные стадии и идеальные сигналы if settings["ideals"]: - self._add_ideal_stage_regions(plot_widget, ideal_data, point_events, 100) - self._add_ideal_signals(plot_widget, ideal_data, point_events, description["Ideal_signals"]) + self._add_ideal_stage_regions(plot_widget, ideal_data, point_events, reg_items, 100) + self._add_ideal_signals(plot_widget, ideal_data, point_events, description["Ideal_signals"], curve_items) # Подсчёт производительности if settings["performance"]: @@ -229,7 +243,7 @@ class PlotWidget(BasePlotWidget): worst_timeframe = point_timeframe # Добавляем реальные сигналы - self._add_real_signals(plot_widget, dataframe, description["Real_signals"], legend) + self._add_real_signals(plot_widget, dataframe, description["Real_signals"], legend, curve_items) if widget_num == 0: main_plot = plot_widget else: @@ -248,7 +262,7 @@ class PlotWidget(BasePlotWidget): main_plot.sigXRangeChanged.connect(lambda _, plot=main_plot, region=ROI_region: self._sync_navigator_with_main(main_plot=plot, region=region)) widget.setLayout(layout) - return widget + return widget, reg_items, curve_items def build(self, data: list[list[Any]]) -> None: """ @@ -260,6 +274,8 @@ class PlotWidget(BasePlotWidget): ... ] """ - widgets = [self._build_widget(data_sample) for data_sample in data] - self._mediator.notify(self, widgets) + widgets_datapack = [self._build_widget(data_sample) for data_sample in data] + self._mediator.notify(self, widgets_datapack) + + \ No newline at end of file diff --git a/src/gui/reportGui.py b/src/gui/reportGui.py new file mode 100644 index 0000000..c4ccf49 --- /dev/null +++ b/src/gui/reportGui.py @@ -0,0 +1,77 @@ +import pyqtgraph as pg +from pyqtgraph.parametertree import Parameter, ParameterTree +from typing import Union +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt + + +class ReportSettings(QtWidgets.QWidget): + + def build(self, reg_items: dict, curve_items: dict) -> None: + param_tree = ParameterTree() + layout = QtWidgets.QVBoxLayout() + layout.addWidget(param_tree) + self.setLayout(layout) + + body= [ + self._generate_reg_params(reg_items), + self._generate_curve_params(curve_items) + ] + # Добавляем параметры в дерево + params = Parameter.create(name='params', type='group', children=body) + param_tree.setParameters(params, showTop=False) + self.show() + + def _generate_reg_params(self, reg_items: dict) -> dict: + + res = {'name': 'Sectors', 'type': 'group', 'children': [ + {'name': 'Real sectors', 'type': 'group', 'children': self._create_samples(reg_items["real"])}, + {'name': 'Ideal sectors', 'type': 'group', 'children': self._create_samples(reg_items["ideal"])}, + ]} + return res + + def _generate_curve_params(self, curve_items: dict) -> dict: + + res = {'name': 'Plots', 'type': 'group', 'children': [ + {'name': 'Real plots', 'type': 'group', 'children': self._create_samples(curve_items["real"])}, + {'name': 'Ideal plots', 'type': 'group', 'children': self._create_ideal_curves(curve_items["ideal"])}, + ]} + return res + + def _create_ideal_curves(self, curve: dict) -> list[dict]: + """Создаем секторы с этапами циклограммы""" + res = [] + for key, item in curve.items(): + param = {'name': key, 'type': 'group', 'children': self._create_samples(item)} + res.append(param) + return res + + def _create_samples(self, sector: dict) -> list[dict]: + res = [] + for key, item in sector.items(): + sample = item[0] if type(item) == list else item + param = {'name': key, 'type': 'group', 'children': self._create_settings(sample)} + res.append(param) + return res + + def _create_settings(self, item: Union[pg.LinearRegionItem, pg.PlotDataItem]) -> list[dict]: + """Настройки для элемента""" + if type(item) == pg.LinearRegionItem: + pen = item.lines[0].pen + brush = item.brush + fill_color = brush.color().getRgb() + else: + pen = pg.mkPen(item.opts.get("pen")) + fill_color = None + line_color = pen.color().getRgb() + line_thickness = pen.width() + visibility = item.isVisible() + + return [ + {'name': 'Line color', 'type': 'color', 'value': line_color}, + {'name': 'Line thickness', 'type': 'int', 'value': line_thickness, 'limits': (1, 10)}, + {'name': 'Visibility', 'type': 'bool', 'value': visibility}, + {'name': 'Fill color', 'type': 'color', 'value': fill_color}, + ] + + diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index 5a76e8b45513882274453a9f8b8daa92bc41a632..9d579a80e2e1d608175121174ade7e1c4c36854c 100644 GIT binary patch delta 37 rcmX>(oAKmqM&5j0UM>b8P~DQ4K5-*2pAaMaWEmlQM)u7yLb=uezX1tU delta 37 rcmX>(oAKmqM&5j0UM>b8*k6&D-oKHTPl%CYvW$>DBgf_#p