Compare commits
No commits in common. "bd3ca921717cfc27c462d39a2b6fba15aa35d41a" and "8179a3396476e6e6f631d34a127bb48c2eab70a4" have entirely different histories.
bd3ca92171
...
8179a33964
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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()
|
||||
|
||||
|
||||
@ -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]]
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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))
|
||||
|
||||
|
||||
# Добавляем действия в меню "Режимы"
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
|
||||
@ -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:
|
||||
"""
|
||||
|
||||
@ -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")
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user