chore: доработал отображение коридоров (again nachui)
This commit is contained in:
parent
c74e55f98c
commit
7954ef2501
@ -1,19 +1,27 @@
|
|||||||
from typing import Optional
|
from typing import Optional, Any, NamedTuple
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout
|
||||||
import pyqtgraph as pg
|
import pyqtgraph as pg
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from numpy import floating
|
||||||
|
|
||||||
from base.base import BasePlotWidget
|
from base.base import BasePlotWidget
|
||||||
|
|
||||||
|
|
||||||
|
class ProcessStage(NamedTuple):
|
||||||
|
mean_value: floating[Any]
|
||||||
|
start_index: int
|
||||||
|
finish_index: int
|
||||||
|
|
||||||
|
|
||||||
class PlotWidget(BasePlotWidget):
|
class PlotWidget(BasePlotWidget):
|
||||||
|
|
||||||
def _create_stage_region(self,
|
def _create_stage_region(self,
|
||||||
stage: str,
|
stage: str,
|
||||||
times: pd.Series,
|
times: pd.Series,
|
||||||
dataframe: pd.DataFrame) -> Optional[pg.LinearRegionItem]:
|
dataframe: pd.DataFrame) -> Optional[pg.LinearRegionItem]:
|
||||||
|
# TODO: сделать фабрику регионов: вертикальный, горизонтальный...
|
||||||
stage_diff = np.diff(dataframe[stage])
|
stage_diff = np.diff(dataframe[stage])
|
||||||
start_index = np.where(stage_diff == 1)[0]
|
start_index = np.where(stage_diff == 1)[0]
|
||||||
finish_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 region
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _find_mid_in_stage(self,
|
def get_stage_info(self,
|
||||||
stage: str,
|
stage: str,
|
||||||
dataframe: pd.DataFrame,
|
dataframe: pd.DataFrame,
|
||||||
signal_name: str) -> float:
|
signal_name: str) -> Optional[ProcessStage]:
|
||||||
if stage in self._stages:
|
if stage in self._stages:
|
||||||
stage_diff = np.diff(dataframe[stage])
|
stage_diff = np.diff(dataframe[stage])
|
||||||
start_index = np.where(stage_diff == 1)[0]
|
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)
|
finish = finish_index[0] if finish_index.size else (len(data) - 1)
|
||||||
data_slice = data[start:finish]
|
data_slice = data[start:finish]
|
||||||
mean = np.mean(data_slice)
|
mean = np.mean(data_slice)
|
||||||
return mean
|
return ProcessStage(mean_value=mean, start_index=int(start), finish_index=int(finish))
|
||||||
return 0.0
|
return None
|
||||||
|
|
||||||
def _build_widget(self, dataframe: pd.DataFrame) -> QWidget:
|
def _build_widget(self, dataframe: pd.DataFrame) -> QWidget:
|
||||||
widget = QWidget()
|
widget = QWidget()
|
||||||
@ -66,24 +74,31 @@ class PlotWidget(BasePlotWidget):
|
|||||||
plot_widget.addItem(region)
|
plot_widget.addItem(region)
|
||||||
|
|
||||||
if settings["zoom"] and max(time_axis) < 5.0:
|
if settings["zoom"] and max(time_axis) < 5.0:
|
||||||
means_raw = [self._find_mid_in_stage("Welding",
|
stages = [self.get_stage_info("Welding",
|
||||||
dataframe,
|
dataframe,
|
||||||
signal["name"]) for signal in description["Signals"]]
|
signal["name"]) for signal in description["Signals"]]
|
||||||
mean = max(means_raw)
|
if stages:
|
||||||
region_stable = pg.LinearRegionItem([mean - mean * 0.015,
|
means_raw = [stage.mean_value for stage in stages]
|
||||||
mean + mean * 0.015],
|
mean = max(means_raw)
|
||||||
orientation='horizontal')
|
start = time_axis[stages[0].start_index]
|
||||||
region_stable.setBrush(pg.mkBrush([250, 250, 0, 25]))
|
finish = time_axis[stages[0].finish_index]
|
||||||
plot_widget.addItem(region_stable)
|
|
||||||
|
|
||||||
region_overshoot = pg.LinearRegionItem([mean - mean * 0.05,
|
overshoot = pg.BarGraphItem(x0=0,
|
||||||
mean + mean * 0.05],
|
y0=mean - mean * 0.05,
|
||||||
orientation='horizontal')
|
height=mean * 0.05 * 2,
|
||||||
region_overshoot.setBrush(pg.mkBrush([0, 250, 0, 30]))
|
width=start,
|
||||||
plot_widget.addItem(region_overshoot)
|
brush=pg.mkBrush([0, 250, 0, 100]))
|
||||||
|
plot_widget.addItem(overshoot)
|
||||||
|
|
||||||
plot_widget.setYRange(mean - 260, mean + 260)
|
stable = pg.BarGraphItem(x0=start,
|
||||||
plot_widget.setInteractive(False)
|
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"]:
|
for signal in description["Signals"]:
|
||||||
if signal["name"] in dataframe_headers:
|
if signal["name"] in dataframe_headers:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user