From 3c7040692e8d948f7588498cd58e7074cfdb4818 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 18 Dec 2024 14:54:40 +0300 Subject: [PATCH] =?UTF-8?q?dev:=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D0=B6=D0=B5=D1=82=D0=B0=20=D1=81=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src - Ярлык.lnk | Bin 0 -> 1164 bytes src/gui/__pycache__/plotter.cpython-310.pyc | Bin 9849 -> 9862 bytes src/gui/plotter.py | 75 ++++++++++-------- .../base/__pycache__/base.cpython-310.pyc | Bin 20032 -> 20001 bytes src/utils/base/base.py | 30 ++++--- 5 files changed, 54 insertions(+), 51 deletions(-) create mode 100644 src - Ярлык.lnk diff --git a/src - Ярлык.lnk b/src - Ярлык.lnk new file mode 100644 index 0000000000000000000000000000000000000000..5985c315788f7e9f9cc41bed374a6f9ffd4f37c0 GIT binary patch literal 1164 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 T{<*S9-;)2X tuple[pg.PlotWidget, pg.LegendItem]: - plot_widget = pg.PlotWidget(title=title) + def _init_plot_item(title: str) -> tuple[pg.PlotItem, pg.LegendItem]: + plot_item = pg.PlotItem(title=title) # Оптимизация отображения графиков - plot_widget.setDownsampling(auto=True, mode='peak') - plot_widget.showGrid(x=True, y=True) - plot_widget.setClipToView(True) - legend = pg.LegendItem((80, 60), offset=(70, 20)) - legend.setParentItem(plot_widget.graphicsItem()) - return plot_widget, legend + plot_item.setDownsampling(auto=True, mode='peak') + plot_item.showGrid(x=True, y=True) + plot_item.setClipToView(True) + legend = plot_item.addLegend(offset=(70, 20)) + return plot_item, legend def _add_stage_regions(self, - plot_widget: pg.PlotWidget, + plot_item: pg.PlotItem, point_events: dict[str, list[float]], dataframe_headers: list[str], reg_items: dict, @@ -71,12 +70,12 @@ class PlotWidget(BasePlotWidget): region = self._create_stage_region(stage, start_t, end_t, transparency) if region is not None: region.setZValue(-20) - plot_widget.addItem(region) + plot_item.addItem(region) reg_items["real"].setdefault(stage, []) reg_items["real"][stage].append(region) def _add_ideal_stage_regions(self, - plot_widget: pg.PlotWidget, + plot_item: pg.PlotItem, ideal_data: dict[str, Any], point_events: dict[str, list[float]], reg_items: dict, @@ -92,12 +91,12 @@ class PlotWidget(BasePlotWidget): region = self._create_stage_region(stage, start_t, end_t, transparency) if region: region.setZValue(-10) - plot_widget.addItem(region) + plot_item.addItem(region) reg_items["ideal"].setdefault(stage, []) reg_items["ideal"][stage].append(region) def _add_ideal_signals(self, - plot_widget: pg.PlotWidget, + plot_item: pg.PlotItem, ideal_data: dict[str, Any], point_events: dict[str, list[float]], ideal_signals: list[dict[str, Any]], @@ -115,13 +114,13 @@ class PlotWidget(BasePlotWidget): ) if curve: curve.setZValue(10) - plot_widget.addItem(curve) + plot_item.addItem(curve) curve_items["ideal"].setdefault(signal["name"], {}) curve_items["ideal"][signal["name"]].setdefault(stage, []) curve_items["ideal"][signal["name"]][stage].append(curve) def _add_real_signals(self, - plot_widget: pg.PlotWidget, + plot_item: pg.PlotItem, dataframe: pd.DataFrame, real_signals: list[dict[str, Any]], legend: pg.LegendItem, @@ -132,7 +131,7 @@ class PlotWidget(BasePlotWidget): dataframe_headers = dataframe.columns.tolist() for signal in real_signals: if signal["name"] in dataframe_headers: - plot = plot_widget.plot(dataframe["time"], dataframe[signal["name"]], pen=signal["pen"], fast=True) + plot = plot_item.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"], {}) @@ -163,8 +162,9 @@ class PlotWidget(BasePlotWidget): Собирает графический виджет для одного набора данных. Параметр `data` предполагается списком: [dataframe, points_pocket, useful_data]. """ - widget = QWidget() - layout = QVBoxLayout(widget) + result_widget = QWidget() + result_layout = QVBoxLayout(result_widget) + plot_layout = pg.GraphicsLayoutWidget() reg_items = {"real":{}, "ideal":{}} curve_items = {"real":{}, "ideal":{}} @@ -175,7 +175,7 @@ class PlotWidget(BasePlotWidget): dataframe_headers = dataframe.columns.tolist() for widget_num, (channel, description) in enumerate(self._plt_channels.items()): - plot_widget, legend = self._init_plot_widget(title=channel) + plot_item, legend = self._init_plot_item(title=channel) settings = description["Settings"] TWC_time = 0.0 @@ -184,7 +184,12 @@ class PlotWidget(BasePlotWidget): # TODO: рассчитать корректный параметр range if settings["mirror ME"]: - dataframe = self._mirror_shift_data("ME", description["Real_signals"], dataframe, range_ME) + dataframe = self._mirror_shift_data( + "ME", + description["Real_signals"], + dataframe, + range_ME + ) # Итерация по точкам for cur_point, point_data in enumerate(points_pocket): @@ -207,7 +212,7 @@ class PlotWidget(BasePlotWidget): # Добавляем реальные стадии if settings["stages"]: - self._add_stage_regions(plot_widget, point_events, dataframe_headers, reg_items, 75) + self._add_stage_regions(plot_item, point_events, dataframe_headers, reg_items, 75) # TODO: подобрать не вырвеглазные цвета, возможно ограничить зону if settings["workpiece"]: @@ -220,7 +225,7 @@ class PlotWidget(BasePlotWidget): rect_item.setZValue(-5) rect_item.setBrush(pg.mkBrush('grey')) rect_item.setPen(pg.mkPen('black', width=3)) - plot_widget.addItem(rect_item) + plot_item.addItem(rect_item) if settings["force accuracy"]: modifier = 0.05 @@ -235,12 +240,12 @@ class PlotWidget(BasePlotWidget): rect_item.setZValue(-5) rect_item.setBrush(pg.mkBrush((0,255,0, 50))) rect_item.setPen(pg.mkPen('black', width=0)) - plot_widget.addItem(rect_item) + plot_item.addItem(rect_item) # Добавляем идеальные стадии и идеальные сигналы if settings["ideals"]: - 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) + self._add_ideal_stage_regions(plot_item, ideal_data, point_events, reg_items, 100) + self._add_ideal_signals(plot_item, ideal_data, point_events, description["Ideal_signals"], curve_items) # Подсчёт производительности if settings["performance"]: @@ -259,26 +264,26 @@ class PlotWidget(BasePlotWidget): worst_timeframe = point_timeframe # Добавляем реальные сигналы - self._add_real_signals(plot_widget, dataframe, description["Real_signals"], legend, curve_items) + self._add_real_signals(plot_item, dataframe, description["Real_signals"], legend, curve_items) if widget_num == 0: - main_plot = plot_widget + main_plot = plot_item else: # Связываем остальные графики с основным графиком - plot_widget.setXLink(main_plot) + plot_item.setXLink(main_plot) - # Если есть настройка производительности, добавляем label if settings["performance"]: - self._add_performance_label(layout, TWC_time, ideal_time, tesla_time) - navigator, ROI_region = self._create_navigator(worst_timeframe, main_plot, dataframe, description["Real_signals"]) + self._add_performance_label(result_layout, TWC_time, ideal_time, tesla_time) - layout.addWidget(plot_widget) + navigator, ROI_region = self._create_navigator(worst_timeframe, main_plot) + + plot_layout.addItem(plot_item, widget_num, 0) - layout.addWidget(navigator) + plot_layout.addItem(navigator, widget_num+1, 0) self._sync_main_plot_with_navigator(main_plot, ROI_region) 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, reg_items, curve_items + result_layout.addWidget(plot_layout) + return result_widget, reg_items, curve_items def build(self, data: list[list[Any]]) -> None: """ diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index a931dec68ffc26b70d69814c015e91d93fe50438..37ad3b95907af2bbb47674873123bba7f43a9998 100644 GIT binary patch delta 2351 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 diff --git a/src/utils/base/base.py b/src/utils/base/base.py index 7b9a6a7..b48e234 100644 --- a/src/utils/base/base.py +++ b/src/utils/base/base.py @@ -240,27 +240,25 @@ class BasePlotWidget: def _create_navigator(self, time_region:tuple[float, float], - main_plot: pg.PlotWidget, - dataframe: pd.DataFrame, - real_signals: list[dict[str, Any]]) -> list[pg.PlotWidget, pg.LinearRegionItem]: + main_plot: pg.PlotItem) -> list[pg.PlotWidget, pg.LinearRegionItem]: """ Создаёт график-навигатор, отображающий все данные в уменьшенном масштабе. """ - navigator = pg.PlotWidget(title="Navigator") + navigator = pg.PlotItem(title="Navigator") navigator.setFixedHeight(100) - - for signal in real_signals: - if signal["name"] in dataframe.columns: - x = dataframe["time"] - y = dataframe[signal["name"]] - - x_downsampled, y_downsampled = self._downsample_data(x, y, max_points=1000) - navigator.plot(x_downsampled, y_downsampled, pen=signal["pen"], name=signal["name"]) + # Получение кривых из main_plot + for curve in main_plot.listDataItems(): + # Извлекаем данные из кривой + x, y = curve.getData() + curve_name = curve.opts.get("name", None) + signal_pen = curve.opts.get("pen", None) + x_downsampled, y_downsampled = self._downsample_data(x, y, max_points=1000) + navigator.plot(x_downsampled, y_downsampled, pen=signal_pen, name=curve_name) ROI_region = pg.LinearRegionItem(values=time_region, movable=True, brush=pg.mkBrush(0, 0, 255, 100), pen=pg.mkPen(width=4)) - ROI_region.setBounds([0, x.iloc[-1]]) + ROI_region.setBounds([0, x[-1]]) navigator.addItem(ROI_region) - navigator.getPlotItem().getViewBox().setLimits(xMin=0, xMax=x.iloc[-1]) + navigator.getViewBox().setLimits(xMin=0, xMax=x[-1]) # Связываем изменение региона навигатора с обновлением области просмотра основного графика ROI_region.sigRegionChanged.connect(lambda: self._sync_main_plot_with_navigator(main_plot, ROI_region)) @@ -268,7 +266,7 @@ class BasePlotWidget: return navigator, ROI_region def _sync_main_plot_with_navigator(self, - main_plot: pg.PlotWidget, + main_plot: pg.PlotItem, region: pg.LinearRegionItem): """ Синхронизирует область просмотра основного графика с регионом навигатора. @@ -301,7 +299,7 @@ class BasePlotWidget: dataframe[signal["name"]] = dataframe[signal["name"]].apply(lambda x: x + shift) return dataframe - def _sync_navigator_with_main(self, main_plot: pg.PlotWidget, region:pg.LinearRegionItem): + def _sync_navigator_with_main(self, main_plot: pg.PlotItem, region:pg.LinearRegionItem): """ Синхронизирует регион навигатора с областью просмотра основного графика. """