dev: добавил возможность отражения графика по оси абсцисс

This commit is contained in:
Andrew 2024-12-16 13:59:42 +03:00
parent 16416d6011
commit f8c07e18fc
10 changed files with 42 additions and 11 deletions

View File

@ -55,5 +55,8 @@
], ],
"UML_time_scaler": [ "UML_time_scaler": [
1000.0 1000.0
],
"Range ME, mm": [
250
] ]
} }

View File

@ -41,8 +41,9 @@ class PassportFormer(BasePointPassportFormer):
return [] return []
system_settings = {key: value[0] for key, value in self._params[1].items()} system_settings = {key: value[0] for key, value in self._params[1].items()}
Range = system_settings["Range ME, mm"]
tesla_time = sum(self._params[0].get("Tesla summary time", [])) tesla_time = sum(self._params[0].get("Tesla summary time", []))
useful_data = {"tesla_time": tesla_time, "range_ME": Range}
points_pocket = [] points_pocket = []
@ -59,7 +60,7 @@ class PassportFormer(BasePointPassportFormer):
} }
params_list = [operator_settings, system_settings] params_list = [operator_settings, system_settings]
cache_key = self._generate_cache_key(params_list) cache_key = self._generate_cache_key(params_list)
if cache_key in self._ideal_data_cashe: if cache_key in self._ideal_data_cashe :
ideal_data = self._ideal_data_cashe[cache_key] ideal_data = self._ideal_data_cashe[cache_key]
print(f"Cache hit") print(f"Cache hit")
else: else:
@ -71,7 +72,7 @@ class PassportFormer(BasePointPassportFormer):
point_events = {key: [value[0][i], value[1][i]] for key, value in events.items()} point_events = {key: [value[0][i], value[1][i]] for key, value in events.items()}
points_pocket.append([point_timeframe, ideal_data, point_events]) points_pocket.append([point_timeframe, ideal_data, point_events])
return dataframe, points_pocket, tesla_time return dataframe, points_pocket, useful_data
def update_settings(self, params: list[dict, dict]): def update_settings(self, params: list[dict, dict]):
self._params = params self._params = params

View File

@ -1,5 +1,6 @@
import pandas as pd import pandas as pd
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel
import copy
import pyqtgraph as pg import pyqtgraph as pg
@ -192,15 +193,29 @@ class PlotWidget(BasePlotWidget):
layout.addWidget(performance_label) layout.addWidget(performance_label)
performance_label.update() performance_label.update()
def _mirror_shift_data(self,
valid_str: str,
signals: list[dict],
dataframe: pd.DataFrame,
shift: float) -> pd.DataFrame:
keys = dataframe.keys()
for signal in signals:
if valid_str in signal["name"] and signal["name"] in keys:
dataframe[signal["name"]] = dataframe[signal["name"]].apply(lambda x: shift-x)
return dataframe
def _build_widget(self, data: list[Any]) -> QWidget: def _build_widget(self, data: list[Any]) -> QWidget:
""" """
Собирает графический виджет для одного набора данных. Собирает графический виджет для одного набора данных.
Параметр `data` предполагается списком: [dataframe, points_pocket, tesla_time]. Параметр `data` предполагается списком: [dataframe, points_pocket, useful_data].
""" """
widget = QWidget() widget = QWidget()
layout = QVBoxLayout(widget) layout = QVBoxLayout(widget)
dataframe, points_pocket, tesla_time = data dataframe, points_pocket, useful_data = data
tesla_time = useful_data["tesla_time"]
range_ME = useful_data["range_ME"]
dataframe_headers = dataframe.columns.tolist() dataframe_headers = dataframe.columns.tolist()
for widget_num, (channel, description) in enumerate(self._plt_channels.items()): for widget_num, (channel, description) in enumerate(self._plt_channels.items()):
@ -211,10 +226,20 @@ class PlotWidget(BasePlotWidget):
ideal_time = 0.0 ideal_time = 0.0
worst_perf = 2 worst_perf = 2
if settings["mirror ME"]:
dataframe = self._mirror_shift_data("ME", description["Real_signals"], dataframe, range_ME)
# Итерация по точкам # Итерация по точкам
for cur_point, point_data in enumerate(points_pocket): for cur_point, point_data in enumerate(points_pocket):
# point_data структура: [point_timeframe, ideal_data, point_events] # point_data структура: [point_timeframe, ideal_data, point_events]
point_timeframe, ideal_data, point_events = point_data point_timeframe, ideal_dat, point_events = point_data
ideal_data = copy.deepcopy(ideal_dat)
# Модифицируем данные для отображения гарфика
if settings["ideals"] and settings["mirror ME"]:
for stage in point_events.keys():
ideal_data[stage] = self._mirror_shift_data("ME", description["Ideal_signals"], ideal_data[stage], range_ME)
# Добавляем реальные стадии # Добавляем реальные стадии
if settings["stages"]: if settings["stages"]:

View File

@ -112,7 +112,6 @@ class BasePlotWidget:
super().__init__() super().__init__()
self._mediator = mediator self._mediator = mediator
self._stage_colors = { self._stage_colors = {
"Closing": [220, 20, 60, 100], # Crimson "Closing": [220, 20, 60, 100], # Crimson
"Squeeze": [30, 144, 255, 100], # Dodger Blue "Squeeze": [30, 144, 255, 100], # Dodger Blue
@ -126,7 +125,8 @@ class BasePlotWidget:
"zoom": False, "zoom": False,
"stages": True, "stages": True,
"performance": True, "performance": True,
"ideals": True "ideals": True,
"mirror ME": False
}, },
"Real_signals": [ "Real_signals": [
{ {
@ -154,7 +154,8 @@ class BasePlotWidget:
"zoom": False, "zoom": False,
"stages": True, "stages": True,
"performance": False, "performance": False,
"ideals": True "ideals": True,
"mirror ME": True
}, },
"Real_signals": [ "Real_signals": [
{ {
@ -182,7 +183,8 @@ class BasePlotWidget:
"zoom": False, "zoom": False,
"stages": True, "stages": True,
"performance": False, "performance": False,
"ideals": True "ideals": True,
"mirror ME": False
}, },
"Real_signals": [ "Real_signals": [
{ {