Compare commits

..

No commits in common. "bd3ca921717cfc27c462d39a2b6fba15aa35d41a" and "8179a3396476e6e6f631d34a127bb48c2eab70a4" have entirely different histories.

16 changed files with 56 additions and 152 deletions

View File

@ -51,6 +51,7 @@ class DirectoryMonitor(BaseDirectoryMonitor):
def update_plots(self):
if self._files is not None:
print("updPlot")
self._mediator.notify(self, self._files)
def custom_csv_extract_only(self, path: str):
@ -61,12 +62,15 @@ class DirectoryMonitor(BaseDirectoryMonitor):
self._mediator.notify(self, [None])
def start_raport(self) -> None:
print("startRaport")
self.stop()
self._files = ['']
self._files = []
print(self._files)
self._mediator.notify(self, [None])
def start_seeking(self) -> None:
print("startSeeking")
self._init_state()
self.start()

View File

@ -1,7 +1,4 @@
import pandas as pd
import traceback
import sys
from loguru import logger
from utils.base.base import BasePointPassportFormer, BaseIdealDataBuilder
@ -35,16 +32,8 @@ class idealDataBuilder(BaseIdealDataBuilder):
class PassportFormer(BasePointPassportFormer):
def form_passports(self, data: list[pd.DataFrame]) -> list[list[pd.DataFrame, dict, int]]:
try:
return_data = [self._build_passports_pocket(dataframe) for dataframe in data]
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
return_data = []
finally:
self._mediator.notify(self, return_data)
return_data = [self._build_passports_pocket(dataframe) for dataframe in data]
self._mediator.notify(self, return_data)
def _build_passports_pocket(self, dataframe: pd.DataFrame) -> list[pd.DataFrame, dict, int]:
@ -75,9 +64,11 @@ class PassportFormer(BasePointPassportFormer):
cache_key = self._generate_cache_key(params_list)
if cache_key in self._ideal_data_cashe :
ideal_data = self._ideal_data_cashe[cache_key]
print(f"Cache hit")
else:
ideal_data = self._build_ideal_data(idealDataBuilder=idealDataBuilder, params=params_list)
self._ideal_data_cashe[cache_key] = ideal_data
print(f"Cache miss. Computed and cached.")
if events is not None:
idx = i+1 if idx_shift else i
point_timeframe = [events[self._stages[0]][0][i], events[self._stages[-1]][1][idx]]

View File

@ -30,7 +30,6 @@ class MainWindow(BaseMainWindow):
self.operSettings = OperatorSettings("params/operator_params.json", 'Operator', self._upd_settings)
self.sysSettings = SystemSettings("params/system_params.json", 'System', self._upd_settings)
self.repSettings = ReportSettings()
self.statusBar().showMessage("Ready")
self._clear()
self.resize(800,800)
@ -121,7 +120,6 @@ class MainWindow(BaseMainWindow):
view_settings = QtWidgets.QAction("View settings", self)
view_settings.setIcon(QIcon('resources/view_ico.png'))
view_settings.triggered.connect(lambda: self._toggle_visibility(self.report_dock))
view_settings.triggered.connect(lambda: self._on_tab_changed(0))
# Добавляем действия в меню "Режимы"

View File

@ -1,8 +1,5 @@
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QGraphicsRectItem
import copy
import traceback
import sys
from loguru import logger
import pyqtgraph as pg
import pandas as pd
from typing import Optional, Any
@ -311,16 +308,8 @@ class PlotWidget(BasePlotWidget):
...
]
"""
try:
widgets_datapack = [self._build_widget(data_sample) for data_sample in data]
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
widgets_datapack = [QLabel(pymsg)]
finally:
self._mediator.notify(self, widgets_datapack)
widgets_datapack = [self._build_widget(data_sample) for data_sample in data]
self._mediator.notify(self, widgets_datapack)

View File

@ -2,10 +2,7 @@ import pyqtgraph as pg
from pyqtgraph.parametertree import Parameter, ParameterTree
from typing import Union
from PyQt5 import QtWidgets
import traceback
import sys
from loguru import logger
from cachetools import LRUCache
class ReportSettings(QtWidgets.QWidget):
@ -15,34 +12,28 @@ class ReportSettings(QtWidgets.QWidget):
def build(self, index, reg_items: dict, curve_items: dict) -> None:
"""Создает ParameterTree для элементов всех графиков выбранной вкладки"""
try:
self._clear()
param_tree = ParameterTree()
layout = self.layout()
layout.addWidget(param_tree)
"""if index in self._tab_cashe:
body = self._tab_cashe[index]
else:
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
self._tab_cashe[index] = body"""
self._clear()
param_tree = ParameterTree()
layout = self.layout()
layout.addWidget(param_tree)
"""if index in self._tab_cashe:
body = self._tab_cashe[index]
else:
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
# Добавляем параметры в дерево
params = Parameter.create(name='params', type='group', children=body)
params.sigTreeStateChanged.connect(
lambda: self._update_settings(reg_items, curve_items, params)
)
param_tree.setParameters(params, showTop=False)
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
self._tab_cashe[index] = body"""
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
# Добавляем параметры в дерево
params = Parameter.create(name='params', type='group', children=body)
params.sigTreeStateChanged.connect(
lambda: self._update_settings(reg_items, curve_items, params)
)
param_tree.setParameters(params, showTop=False)
def _clear(self) -> None:
"""

View File

@ -2,15 +2,14 @@ from typing import Callable, Optional, Any
from PyQt5.QtWidgets import (QWidget, QPushButton,
QLineEdit, QHBoxLayout,
QVBoxLayout, QLabel,
QTableWidget, QTableWidgetItem,
QStyledItemDelegate)
from PyQt5.QtGui import QIntValidator, QDoubleValidator
QTableWidget, QTableWidgetItem)
from PyQt5.QtGui import QIntValidator
from utils.json_tools import read_json, write_json
from utils import qt_settings as qts
class settingsWindow(QWidget):
def __init__(self, path: str, name: str, upd_func: Callable[[], None], names: dict):
def __init__(self, path: str, name: str, upd_func: Callable[[], None]):
"""
Окно настроек для редактирования параметров.
:param path: Путь к файлу настроек (JSON).
@ -25,7 +24,6 @@ class settingsWindow(QWidget):
self._num_points: Optional[QLineEdit] = None
self._param_table: Optional[QTableWidget] = None
self._assosiated_names = names
self.load_settings()
self._init_ui()
@ -90,35 +88,33 @@ class settingsWindow(QWidget):
self._param_table.setColumnCount(0)
return
column_count = len(self._data[first_key])
column_count = len(self._data[first_key]) + 1
self._param_table.setRowCount(len(self._data))
self._param_table.setColumnCount(column_count)
headers = [self._assosiated_names[key] for key in self._data.keys()]
self._param_table.setVerticalHeaderLabels(headers)
int_delegate = ValidatorDelegate(data_type='int', parent=self._param_table)
float_delegate = ValidatorDelegate(data_type='float', parent=self._param_table)
str_delegate = ValidatorDelegate(data_type='str', parent=self._param_table)
for i, (_, items) in enumerate(self._data.items()):
for i, (key, items) in enumerate(self._data.items()):
self._param_table.setItem(i, 0, QTableWidgetItem(key))
for j, item in enumerate(items):
self._param_table.setItem(i, j, QTableWidgetItem(str(item)))
self._param_table.setItem(i, j+1, QTableWidgetItem(str(item)))
if type(item) == int:
self._param_table.setItemDelegateForRow(i, int_delegate)
elif type(item) == float:
self._param_table.setItemDelegateForRow(i, float_delegate)
else:
self._param_table.setItemDelegateForRow(i, str_delegate)
def _save(self) -> None:
"""Сохраняет текущие параметры из таблицы в self._data и вызывает _upd_func()."""
new_data = {}
row_count = self._param_table.rowCount()
col_count = self._param_table.columnCount()
for i, key in enumerate(self._data.keys()):
for i in range(row_count):
key_item = self._param_table.item(i, 0)
if key_item is None:
continue
key = key_item.text()
# Если ключ пустой, пропускаем
if not key:
continue
row_data = []
for j in range(col_count):
for j in range(1, col_count):
cell_item = self._param_table.item(i, j)
if cell_item is None:
continue
@ -158,9 +154,9 @@ class settingsWindow(QWidget):
return
prev_columns = self._param_table.columnCount()
desired_columns = num_points
desired_columns = num_points + 1
if desired_columns <= 0:
if desired_columns <= prev_columns:
return
self._param_table.setColumnCount(desired_columns)
@ -182,81 +178,16 @@ class settingsWindow(QWidget):
class SystemSettings(settingsWindow):
def __init__(self, path, name, upd_func):
assosiated_names = {
"trace_storage_path": "trace path",
"monitor_update_period": "Monitoring period",
"a_max_1": "Max lin accel FE, m/s^2",
"v_max_1": "Max lin speed FE, m/s",
"a_max_2":"Max lin accel ME, m/s^2",
"v_max_2": "Max lin speed FE, m/s",
"mass_1": "Mass FE, kg",
"mass_2": "Mass ME, kg",
"k_hardness_1": "Hardness coef FE, N/m",
"k_hardness_2": "Hardness coef ME, N/m",
"torque_max_1": "Max torque FE, N*m",
"torque_max_2": "Max torque ME, N*m",
"transmission_ratio_1": "Transmission ratio FE",
"transmission_ratio_2": "Transmission ratio ME",
"contact_distance_1": "Contact distance FE, m",
"contact_distance_2": "Contact distance ME, m",
"k_prop": "Proportionality factor",
"time_capture": "Calculated points per sec",
"UML_time_scaler": "UML_time_scaler",
"Range ME, mm": "Range ME, mm"
}
super().__init__(path, name, upd_func, assosiated_names)
super().__init__(path, name, upd_func)
self._num_points.setVisible(False)
def _expand(self):
pass
class OperatorSettings(settingsWindow):
def __init__(self, path, name, upd_func):
assosiated_names = {
"distance_h_start_1": "Closing start dist FE, m" ,
"distance_h_start_2": "Closing start dist ME, m",
"distance_s_1": "Rob movement start dist FE, m",
"distance_s_2": "Rob movement start dist ME, m",
"distance_l_1": "Max oncoming dist FE, m",
"distance_l_2": "Max oncoming dist ME, m",
"distance_h_end1": "Oncoming end dist FE, m",
"distance_h_end2": "Oncoming end dist FE, m",
"time_wielding": "Time of welding, sec",
"time_command": "Communication time compensator, sec",
"time_robot_movement": "Rob movement time, sec",
"object_thickness": "Workpiece thickness, m",
"force_target": "Target force, N",
"force_capture": "Capture force, N",
"Tesla closing": "Client closing time, sec",
"Tesla squeeze": "Client squeeze time, sec",
"Tesla welding": "Client welding time, sec",
"Tesla oncomming_relief": "Client moving to next point time, sec",
"Tesla summary time": "Client summary time, sec"
}
super().__init__(path, name, upd_func, assosiated_names)
pass
class ValidatorDelegate(QStyledItemDelegate):
def __init__(self, data_type='str', parent=None):
super().__init__(parent)
self.data_type = data_type
if self.data_type == 'int':
self.validator = QIntValidator()
elif self.data_type == 'float':
self.validator = QDoubleValidator()
self.validator.setNotation(QDoubleValidator.StandardNotation)
else:
self.validator = None
def createEditor(self, parent, option, index):
editor = QLineEdit(parent)
if self.validator:
editor.setValidator(self.validator)
return editor
if __name__ == '__main__':
import pyqtgraph as pg
app = pg.mkQApp("Parameter Tree Example")