chore: доработал отображение коридоров (again nachui)

This commit is contained in:
Андрей Скирченко 2024-11-16 12:30:18 +03:00
parent c74e55f98c
commit 7954ef2501

View File

@ -1,19 +1,27 @@
from typing import Optional
from typing import Optional, Any, NamedTuple
import pandas as pd
from PyQt5.QtWidgets import QWidget, QVBoxLayout
import pyqtgraph as pg
import numpy as np
from numpy import floating
from base.base import BasePlotWidget
class ProcessStage(NamedTuple):
mean_value: floating[Any]
start_index: int
finish_index: int
class PlotWidget(BasePlotWidget):
def _create_stage_region(self,
stage: str,
times: pd.Series,
dataframe: pd.DataFrame) -> Optional[pg.LinearRegionItem]:
# TODO: сделать фабрику регионов: вертикальный, горизонтальный...
stage_diff = np.diff(dataframe[stage])
start_index = np.where(stage_diff == 1)[0]
finish_index = np.where(stage_diff == -1)[0]
@ -26,10 +34,10 @@ class PlotWidget(BasePlotWidget):
return region
return None
def _find_mid_in_stage(self,
stage: str,
dataframe: pd.DataFrame,
signal_name: str) -> float:
def get_stage_info(self,
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]
@ -42,8 +50,8 @@ class PlotWidget(BasePlotWidget):
finish = finish_index[0] if finish_index.size else (len(data) - 1)
data_slice = data[start:finish]
mean = np.mean(data_slice)
return mean
return 0.0
return ProcessStage(mean_value=mean, start_index=int(start), finish_index=int(finish))
return None
def _build_widget(self, dataframe: pd.DataFrame) -> QWidget:
widget = QWidget()
@ -66,24 +74,31 @@ class PlotWidget(BasePlotWidget):
plot_widget.addItem(region)
if settings["zoom"] and max(time_axis) < 5.0:
means_raw = [self._find_mid_in_stage("Welding",
dataframe,
signal["name"]) for signal in description["Signals"]]
mean = max(means_raw)
region_stable = pg.LinearRegionItem([mean - mean * 0.015,
mean + mean * 0.015],
orientation='horizontal')
region_stable.setBrush(pg.mkBrush([250, 250, 0, 25]))
plot_widget.addItem(region_stable)
stages = [self.get_stage_info("Welding",
dataframe,
signal["name"]) for signal in description["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]
region_overshoot = pg.LinearRegionItem([mean - mean * 0.05,
mean + mean * 0.05],
orientation='horizontal')
region_overshoot.setBrush(pg.mkBrush([0, 250, 0, 30]))
plot_widget.addItem(region_overshoot)
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)
plot_widget.setYRange(mean - 260, mean + 260)
plot_widget.setInteractive(False)
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)
for signal in description["Signals"]:
if signal["name"] in dataframe_headers: