WeldingSpotPerformance/uml/creator.py

100 lines
4.1 KiB
Python

import os
from uml.request_generator import Request
class UMLCreator:
def __init__(self,
request_generator: Request,
ideal_time: list[float],
bool_dict: dict,
float_dict: dict):
self._request_generator = request_generator
self._ideal_time = ideal_time
self.bool_dict = bool_dict
self.float_dict = float_dict
def _build_data(self):
scaler = 1000 # TODO: external config?
sig = [
'Electrode Closing Algorithm Execute', # Начало закрытия
'Electrode Closing Algorithm Done',
'STEP 3: ME Hold P2 AND Condition Start Force Control', # Конец закрытия и Начало набора усилия
'STEP 4: ME Force Control',
'Position Control ME', # Начало разъезда или 'Posision Control Activated FE'
'Position Control FE', # Начало разъезда
'Position Control Completed ME', # Конец разъезда
'Position Control Completed FE', # Конец разъезда
'STEP 4: ME Force Control Complete', # Конец набора усилия
]
closure = self._get_time([sig[0], sig[1]])
compression = self._get_time([sig[2], sig[3]])
# opening = self.__getTime([sig[4], sig[5], sig[6], sig[7]])
real_data = [
[closure[0], 'closure #green'],
[closure[1], '{-}'],
[compression[0], 'compression #green'],
[compression[1], '{-}'],
# [max(opening[0:2]), 'opening #green'],
# [max(opening[2:4]), '{-}'],
]
client_data = [
[0.0 * scaler, 'closure'],
[0.165 * scaler, '{-}'],
[0.166 * scaler, 'compression'],
[0.176 * scaler, '{-}'],
# [0.180*scaler, 'welding'],
# [0.200*scaler, '{-}'],
[0.210 * scaler, 'opening'],
[0.300 * scaler, '{-}'],
]
ideal_data = [
[0.0 * scaler, 'closure #yellow'],
[self._ideal_time[0] * scaler, '{-}'],
[(self._ideal_time[0] + 0.0001) * scaler, 'compression #yellow'],
[(self._ideal_time[0] + self._ideal_time[1]) * scaler, '{-}'],
# [0.*scaler, 'welding #yellow'],
# [0.*scaler, '{-}'],
[(self._ideal_time[0] + self._ideal_time[1] + 0.0001) * scaler, 'opening #yellow'],
[(self._ideal_time[0] + self._ideal_time[1] + self._ideal_time[2]) * scaler, '{-}'],
]
return real_data, client_data, ideal_data, self.bool_dict
def _get_time(self, signals = '', states = ''):
res = []
for i, sig in enumerate(signals):
if states: state = states[i]
else: state = 'high'
index1 = next ((i for i, _ in enumerate(self.bool_dict[sig]) if _[1]==state), -1)
time = self.bool_dict[sig][index1][0]
res.append(time)
return res
def _generate_svg(self, real_data, client_data, ideal_data, bool_data) -> None:
try:
self._request_generator.clear()
self._request_generator.addLineStyle('biba', 'red', 2)
for i, [signal, changes] in enumerate(bool_data.items()):
name = 'bool_' + str(i)
self._request_generator.addBinary(name, str(signal), 'biba')
self._request_generator.setTimestamps(name, changes)
self._request_generator.addConcise('RD', 'Real data')
self._request_generator.setTimestamps('RD', real_data)
self._request_generator.addConcise('CD', 'Client data')
self._request_generator.setTimestamps('CD', client_data)
self._request_generator.addConcise('ID', 'Ideal data')
self._request_generator.setTimestamps('ID', ideal_data)
self._request_generator.generateSVG()
except Exception as e:
print(f"SVG generate error: {e}")
def update_uml(self) -> None:
real, client, ideal, bool_ = self._build_data()
self._generate_svg(real, client, ideal, bool_)