Compare commits
No commits in common. "45b28f2e15b68e8bbb22e90e26f55bb9e5aba5e1" and "16416d60110f0bbb035491fd14314ab388a99adb" have entirely different histories.
45b28f2e15
...
16416d6011
@ -80,8 +80,8 @@
|
|||||||
0.02
|
0.02
|
||||||
],
|
],
|
||||||
"distance_l_2": [
|
"distance_l_2": [
|
||||||
0.0275,
|
0.033,
|
||||||
0.03,
|
0.033,
|
||||||
0.033,
|
0.033,
|
||||||
0.033,
|
0.033,
|
||||||
0.033,
|
0.033,
|
||||||
@ -176,7 +176,7 @@
|
|||||||
0.5
|
0.5
|
||||||
],
|
],
|
||||||
"object_thickness": [
|
"object_thickness": [
|
||||||
0.0045,
|
0.0,
|
||||||
0.0045,
|
0.0045,
|
||||||
0.0045,
|
0.0045,
|
||||||
0.0045,
|
0.0045,
|
||||||
|
|||||||
@ -55,8 +55,5 @@
|
|||||||
],
|
],
|
||||||
"UML_time_scaler": [
|
"UML_time_scaler": [
|
||||||
1000.0
|
1000.0
|
||||||
],
|
|
||||||
"Range ME, mm": [
|
|
||||||
115.0
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -8,13 +8,9 @@ class Controller(BaseController):
|
|||||||
|
|
||||||
signal_widgets = pyqtSignal(list)
|
signal_widgets = pyqtSignal(list)
|
||||||
signal_settings = pyqtSignal(list)
|
signal_settings = pyqtSignal(list)
|
||||||
signal_monitor = pyqtSignal(str)
|
|
||||||
|
|
||||||
def send_widgets(self, widgets: list[QWidget]) -> None:
|
def send_widgets(self, widgets: list[QWidget]) -> None:
|
||||||
self.signal_widgets.emit(widgets)
|
self.signal_widgets.emit(widgets)
|
||||||
|
|
||||||
def push_settings(self, settings: list[dict]) -> None:
|
def push_settings(self, settings: list[dict]) -> None:
|
||||||
self.signal_settings.emit(settings)
|
self.signal_settings.emit(settings)
|
||||||
|
|
||||||
def open_custom_file (self, filepath: str) -> None:
|
|
||||||
self.signal_monitor.emit(filepath)
|
|
||||||
@ -47,9 +47,5 @@ class DirectoryMonitor(BaseDirectoryMonitor):
|
|||||||
else:
|
else:
|
||||||
logger.info(f"Failed pushing {str(all_files)}")
|
logger.info(f"Failed pushing {str(all_files)}")
|
||||||
|
|
||||||
def custom_dir_extract(self, dict_path:str ):
|
|
||||||
files = os.listdir(dict_path)
|
|
||||||
if files is not None:
|
|
||||||
all_files = [os.path.join(dict_path, file) for file in files]
|
|
||||||
self._mediator.notify(self, all_files)
|
|
||||||
|
|
||||||
|
|||||||
@ -43,10 +43,6 @@ class PassportFormer(BasePointPassportFormer):
|
|||||||
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()}
|
||||||
|
|
||||||
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": system_settings["Range ME, mm"],
|
|
||||||
"k_hardness": system_settings["k_hardness_1"]
|
|
||||||
}
|
|
||||||
|
|
||||||
points_pocket = []
|
points_pocket = []
|
||||||
|
|
||||||
@ -63,7 +59,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:
|
||||||
@ -73,12 +69,9 @@ class PassportFormer(BasePointPassportFormer):
|
|||||||
idx = i+1 if idx_shift else i
|
idx = i+1 if idx_shift else i
|
||||||
point_timeframe = [events[self._stages[0]][0][i], events[self._stages[-1]][1][idx]]
|
point_timeframe = [events[self._stages[0]][0][i], events[self._stages[-1]][1][idx]]
|
||||||
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()}
|
||||||
useful_p_data = {"thickness": operator_settings["object_thickness"],
|
|
||||||
"L2": operator_settings["distance_l_2"],
|
|
||||||
"force": operator_settings["force_target"]}
|
|
||||||
|
|
||||||
points_pocket.append([point_timeframe, ideal_data, point_events, useful_p_data])
|
points_pocket.append([point_timeframe, ideal_data, point_events])
|
||||||
return dataframe, points_pocket, useful_data
|
return dataframe, points_pocket, tesla_time
|
||||||
|
|
||||||
def update_settings(self, params: list[dict, dict]):
|
def update_settings(self, params: list[dict, dict]):
|
||||||
self._params = params
|
self._params = params
|
||||||
Binary file not shown.
Binary file not shown.
@ -14,7 +14,6 @@ class MainWindow(BaseMainWindow):
|
|||||||
self.initUI()
|
self.initUI()
|
||||||
self.set_style(self)
|
self.set_style(self)
|
||||||
self.settings_button.clicked.connect(self._show_settings)
|
self.settings_button.clicked.connect(self._show_settings)
|
||||||
self.select_dir_button.clicked.connect(self._select_dir)
|
|
||||||
self.operSettings = settingsWindow("params/operator_params.json", 'Operator', self._updater_trigger)
|
self.operSettings = settingsWindow("params/operator_params.json", 'Operator', self._updater_trigger)
|
||||||
self.sysSettings = settingsWindow("params/system_params.json", 'System', self._updater_trigger)
|
self.sysSettings = settingsWindow("params/system_params.json", 'System', self._updater_trigger)
|
||||||
|
|
||||||
@ -24,17 +23,9 @@ class MainWindow(BaseMainWindow):
|
|||||||
self.tabWidget.tabCloseRequested.connect(self._close_tab)
|
self.tabWidget.tabCloseRequested.connect(self._close_tab)
|
||||||
layout = QtWidgets.QVBoxLayout()
|
layout = QtWidgets.QVBoxLayout()
|
||||||
layout.addWidget(self.tabWidget)
|
layout.addWidget(self.tabWidget)
|
||||||
|
|
||||||
self.settings_button = QtWidgets.QPushButton("Show settings")
|
self.settings_button = QtWidgets.QPushButton("Show settings")
|
||||||
self.settings_button.setFixedWidth(160)
|
self.settings_button.setFixedWidth(160)
|
||||||
self.select_dir_button = QtWidgets.QPushButton("Open directory")
|
layout.addWidget(self.settings_button)
|
||||||
self.select_dir_button.setFixedWidth(175)
|
|
||||||
button_layout = QtWidgets.QHBoxLayout()
|
|
||||||
button_layout.setSpacing(2)
|
|
||||||
button_layout.addWidget(self.settings_button)
|
|
||||||
button_layout.addWidget(self.select_dir_button)
|
|
||||||
|
|
||||||
layout.addLayout(button_layout)
|
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
def show_plot_tabs(self, plot_widgets: list[QtWidgets.QWidget]) -> None:
|
def show_plot_tabs(self, plot_widgets: list[QtWidgets.QWidget]) -> None:
|
||||||
@ -72,10 +63,6 @@ class MainWindow(BaseMainWindow):
|
|||||||
def _close_tab(self, index:int) -> None:
|
def _close_tab(self, index:int) -> None:
|
||||||
self.tabWidget.removeTab(index)
|
self.tabWidget.removeTab(index)
|
||||||
|
|
||||||
def _select_dir(self):
|
|
||||||
folder_path = QtWidgets.QFileDialog.getExistingDirectory(self, 'Select directory', "")
|
|
||||||
if folder_path:
|
|
||||||
self._controller.open_custom_file(folder_path)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import pandas as pd
|
import pandas as pd
|
||||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QGraphicsRectItem
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel
|
||||||
import copy
|
|
||||||
|
|
||||||
|
|
||||||
import pyqtgraph as pg
|
import pyqtgraph as pg
|
||||||
@ -193,41 +192,15 @@ 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 _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: x + shift)
|
|
||||||
return dataframe
|
|
||||||
|
|
||||||
|
|
||||||
def _build_widget(self, data: list[Any]) -> QWidget:
|
def _build_widget(self, data: list[Any]) -> QWidget:
|
||||||
"""
|
"""
|
||||||
Собирает графический виджет для одного набора данных.
|
Собирает графический виджет для одного набора данных.
|
||||||
Параметр `data` предполагается списком: [dataframe, points_pocket, useful_data].
|
Параметр `data` предполагается списком: [dataframe, points_pocket, tesla_time].
|
||||||
"""
|
"""
|
||||||
widget = QWidget()
|
widget = QWidget()
|
||||||
layout = QVBoxLayout(widget)
|
layout = QVBoxLayout(widget)
|
||||||
|
|
||||||
dataframe, points_pocket, useful_data = data
|
dataframe, points_pocket, tesla_time = data
|
||||||
tesla_time = useful_data["tesla_time"]
|
|
||||||
range_ME = useful_data["range_ME"]
|
|
||||||
k_hardness = useful_data["k_hardness"]
|
|
||||||
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()):
|
||||||
@ -238,45 +211,15 @@ class PlotWidget(BasePlotWidget):
|
|||||||
ideal_time = 0.0
|
ideal_time = 0.0
|
||||||
worst_perf = 2
|
worst_perf = 2
|
||||||
|
|
||||||
# TODO: рассчитать корректный параметр range
|
|
||||||
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_dat, point_events, useful_p_data = point_data
|
point_timeframe, ideal_data, point_events = point_data
|
||||||
ideal_data = copy.deepcopy(ideal_dat)
|
|
||||||
|
|
||||||
# TODO: проверить корректность расчетов
|
|
||||||
if settings["force compensation FE"]:
|
|
||||||
force = useful_p_data["force"]
|
|
||||||
F_comp = - force/k_hardness
|
|
||||||
point_idxs = dataframe[(dataframe["time"] >= point_timeframe[0]) & (dataframe["time"] <= point_timeframe[1])].index
|
|
||||||
|
|
||||||
dataframe.loc[point_idxs] = self._shift_data("FE", description["Real_signals"], dataframe.loc[point_idxs], F_comp)
|
|
||||||
|
|
||||||
# Модифицируем данные для отображения гарфика
|
|
||||||
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"]:
|
||||||
self._add_stage_regions(plot_widget, point_events, dataframe_headers, 75)
|
self._add_stage_regions(plot_widget, point_events, dataframe_headers, 75)
|
||||||
|
|
||||||
# TODO: подобрать не вырвеглазные цвета, возможно ограничить зону
|
|
||||||
if settings["workpiece"]:
|
|
||||||
x1 = point_timeframe[0]
|
|
||||||
dx = point_timeframe[1] - x1
|
|
||||||
y1 = useful_p_data["L2"]*1000
|
|
||||||
dy = useful_p_data["thickness"]*1000
|
|
||||||
|
|
||||||
rect_item = QGraphicsRectItem(x1, y1, dx, dy)
|
|
||||||
rect_item.setBrush(pg.mkBrush('blue'))
|
|
||||||
rect_item.setPen(pg.mkPen('red', width=2))
|
|
||||||
plot_widget.addItem(rect_item)
|
|
||||||
|
|
||||||
# Добавляем идеальные стадии и идеальные сигналы
|
# Добавляем идеальные стадии и идеальные сигналы
|
||||||
if settings["ideals"]:
|
if settings["ideals"]:
|
||||||
self._add_ideal_stage_regions(plot_widget, ideal_data, point_events, 100)
|
self._add_ideal_stage_regions(plot_widget, ideal_data, point_events, 100)
|
||||||
|
|||||||
@ -25,7 +25,6 @@ def main():
|
|||||||
|
|
||||||
controller.signal_widgets.connect(window.show_plot_tabs)
|
controller.signal_widgets.connect(window.show_plot_tabs)
|
||||||
controller.signal_settings.connect(mediator.push_settings)
|
controller.signal_settings.connect(mediator.push_settings)
|
||||||
controller.signal_monitor.connect(monitor.custom_dir_extract)
|
|
||||||
|
|
||||||
window.push_settings()
|
window.push_settings()
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@ -112,6 +112,7 @@ 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
|
||||||
@ -125,10 +126,7 @@ class BasePlotWidget:
|
|||||||
"zoom": False,
|
"zoom": False,
|
||||||
"stages": True,
|
"stages": True,
|
||||||
"performance": True,
|
"performance": True,
|
||||||
"ideals": True,
|
"ideals": True
|
||||||
"mirror ME": False,
|
|
||||||
"workpiece": False,
|
|
||||||
"force compensation FE": False
|
|
||||||
},
|
},
|
||||||
"Real_signals": [
|
"Real_signals": [
|
||||||
{
|
{
|
||||||
@ -156,10 +154,7 @@ class BasePlotWidget:
|
|||||||
"zoom": False,
|
"zoom": False,
|
||||||
"stages": True,
|
"stages": True,
|
||||||
"performance": False,
|
"performance": False,
|
||||||
"ideals": True,
|
"ideals": True
|
||||||
"mirror ME": True,
|
|
||||||
"workpiece": True,
|
|
||||||
"force compensation FE": True
|
|
||||||
},
|
},
|
||||||
"Real_signals": [
|
"Real_signals": [
|
||||||
{
|
{
|
||||||
@ -187,10 +182,7 @@ class BasePlotWidget:
|
|||||||
"zoom": False,
|
"zoom": False,
|
||||||
"stages": True,
|
"stages": True,
|
||||||
"performance": False,
|
"performance": False,
|
||||||
"ideals": True,
|
"ideals": True
|
||||||
"mirror ME": False,
|
|
||||||
"workpiece": False,
|
|
||||||
"force compensation FE": False
|
|
||||||
},
|
},
|
||||||
"Real_signals": [
|
"Real_signals": [
|
||||||
{
|
{
|
||||||
@ -255,9 +247,6 @@ class BaseController(QObject):
|
|||||||
def push_settings(self, settings: list[dict]) -> None:
|
def push_settings(self, settings: list[dict]) -> None:
|
||||||
...
|
...
|
||||||
|
|
||||||
def open_custom_file (self, filepath: str) -> None:
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
class BaseIdealDataBuilder(OptAlgorithm):
|
class BaseIdealDataBuilder(OptAlgorithm):
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user