chore: работа с uml вынесена в отдельный пакет
This commit is contained in:
parent
3646badd08
commit
c184397c6c
2
.gitignore
vendored
2
.gitignore
vendored
@ -3,3 +3,5 @@
|
||||
/.venv
|
||||
/.idea
|
||||
/venv
|
||||
*.txt
|
||||
*.svg
|
||||
1
UML.svg
1
UML.svg
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 22 KiB |
76
UML.txt
76
UML.txt
@ -1,76 +0,0 @@
|
||||
@startuml
|
||||
<style>
|
||||
timingDiagram {
|
||||
.biba {
|
||||
LineColor red
|
||||
LineThickness 2
|
||||
}
|
||||
}
|
||||
</style>
|
||||
binary "Electrode Closing Algorithm Done" as bool_0<<biba>>
|
||||
binary "Electrode Closing Algorithm Execute" as bool_1<<biba>>
|
||||
binary "STEP 1: ME Move to S1" as bool_2<<biba>>
|
||||
binary "STEP 1: ME Move to S1 Complete" as bool_3<<biba>>
|
||||
binary "STEP 2: ME Move to P2" as bool_4<<biba>>
|
||||
binary "STEP 2: ME Move to P2 Complete" as bool_5<<biba>>
|
||||
binary "STEP 3: ME Hold P2" as bool_6<<biba>>
|
||||
binary "STEP 3: ME Hold P2 AND Condition Start Force Control" as bool_7<<biba>>
|
||||
binary "STEP 4: ME Force Control" as bool_8<<biba>>
|
||||
concise "Real data" as RD
|
||||
concise "Client data" as CD
|
||||
concise "Ideal data" as ID
|
||||
@0.0
|
||||
bool_0 is low
|
||||
bool_1 is high
|
||||
bool_2 is high
|
||||
bool_3 is low
|
||||
bool_4 is low
|
||||
bool_5 is low
|
||||
bool_6 is low
|
||||
bool_7 is low
|
||||
bool_8 is low
|
||||
RD is closure #green
|
||||
CD is closure
|
||||
ID is closure #yellow
|
||||
@191.0000090720132
|
||||
bool_0 is high
|
||||
bool_1 is low
|
||||
RD is {-}
|
||||
@106.5000050584785
|
||||
bool_2 is low
|
||||
bool_3 is low
|
||||
bool_4 is high
|
||||
@106.0000050347298
|
||||
bool_3 is high
|
||||
@157.5000074808485
|
||||
bool_4 is low
|
||||
bool_6 is high
|
||||
@165.0000078370794
|
||||
bool_6 is low
|
||||
bool_7 is low
|
||||
bool_8 is high
|
||||
RD is {-}
|
||||
@164.5000078133307
|
||||
bool_7 is high
|
||||
RD is compression #green
|
||||
@165.0
|
||||
CD is {-}
|
||||
@166.0
|
||||
CD is compression
|
||||
@176.0
|
||||
CD is {-}
|
||||
@210.0
|
||||
CD is opening
|
||||
@300.0
|
||||
CD is {-}
|
||||
@56.27781200794141
|
||||
ID is {-}
|
||||
@56.37781200794141
|
||||
ID is compression #yellow
|
||||
@91.4562305565861
|
||||
ID is {-}
|
||||
@91.55623055658612
|
||||
ID is opening #yellow
|
||||
@220.34565355083035
|
||||
ID is {-}
|
||||
@enduml
|
||||
137
main.py
137
main.py
@ -1,23 +1,26 @@
|
||||
import pyqtgraph as pg
|
||||
import numpy as np
|
||||
|
||||
from utils import read_json, DataParser
|
||||
from Requestinator import Request
|
||||
from utils import read_json, DiagramParser
|
||||
from uml import Request, UMLCreator
|
||||
#нижний fe x1
|
||||
import qt_settings as qts
|
||||
from OptAlgorithm import OptAlgorithm
|
||||
|
||||
|
||||
class Application:
|
||||
def __init__(self, opt: OptAlgorithm):
|
||||
def __init__(self,
|
||||
opt: OptAlgorithm,
|
||||
bool_dict: dict,
|
||||
float_dict: dict):
|
||||
pg.setConfigOptions(antialias=True)
|
||||
self.opt = opt
|
||||
self.bool_dict = bool_dict
|
||||
self.float_dict = float_dict
|
||||
|
||||
self.scaler = 1000
|
||||
self.parser = DataParser(self.scaler)
|
||||
self.r = Request()
|
||||
self._getIdealTimings()
|
||||
self._init_app()
|
||||
self.updateUML()
|
||||
self.WeldTime = 0.5 #[sec]
|
||||
self.alpha = 100 #[0-255 прозрачность фона]
|
||||
|
||||
@ -56,102 +59,11 @@ class Application:
|
||||
legend1.setParentItem(p11)
|
||||
return p11, legend1
|
||||
|
||||
def updateUML(self, path = '2024_10_28-17_03_34.csv'):
|
||||
real, client, ideal, bool = self._form_UMLdata(path)
|
||||
self._requestSVG(real, client, ideal, bool)
|
||||
|
||||
def updatePlots(self):
|
||||
self._plotRealData()
|
||||
times = np.arange(20000)/10
|
||||
self._plotIdealData(times)
|
||||
|
||||
def _requestSVG(self, real_data, client_data, ideal_data, bool_data):
|
||||
try:
|
||||
|
||||
self.r.clear()
|
||||
self.r.addLineStyle('biba', 'red', 2)
|
||||
for i, [signal, changes] in enumerate(bool_data.items()):
|
||||
name = 'bool_'+str(i)
|
||||
self.r.addBinary(name, str(signal), 'biba')
|
||||
self.r.setTimestamps(name, changes)
|
||||
|
||||
self.r.addConcise('RD', 'Real data')
|
||||
self.r.setTimestamps('RD', real_data)
|
||||
self.r.addConcise('CD', 'Client data')
|
||||
self.r.setTimestamps('CD', client_data)
|
||||
self.r.addConcise('ID', 'Ideal data')
|
||||
self.r.setTimestamps('ID', ideal_data)
|
||||
|
||||
self.r.generateSVG()
|
||||
except Exception as e:
|
||||
print ('Ну, svg у нас нет')
|
||||
|
||||
|
||||
def _form_UMLdata(self, path):
|
||||
scaler = self.scaler
|
||||
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', #Конец набора усилия
|
||||
]
|
||||
|
||||
self.parser.setData(path)
|
||||
self.bool_dict = self.parser.getBoolDict()
|
||||
self.float_dict = self.parser.getFloatDict()
|
||||
|
||||
closure = self.__getTime([sig[0], sig[1]])
|
||||
compression = self.__getTime([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.idealTime[0]*scaler, '{-}'],
|
||||
[(self.idealTime[0] + 0.0001)*scaler, 'compression #yellow'],
|
||||
[(self.idealTime[0] + self.idealTime[1])*scaler, '{-}'],
|
||||
#[0.*scaler, 'welding #yellow'],
|
||||
#[0.*scaler, '{-}'],
|
||||
[(self.idealTime[0] + self.idealTime[1] + 0.0001)*scaler, 'opening #yellow'],
|
||||
[(self.idealTime[0] + self.idealTime[1] + self.idealTime[2])*scaler, '{-}'],
|
||||
]
|
||||
return real_data, client_data, ideal_data, self.bool_dict
|
||||
|
||||
def __getTime(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 _getIdealTimings(self):
|
||||
data = self.opt.Ts
|
||||
self.idealTime = [data['tclose'], data['tgrow'], self.opt.getMarkOpen()]
|
||||
@ -239,16 +151,37 @@ class Application:
|
||||
self.p13.setYRange(-400, 400)
|
||||
|
||||
|
||||
def get_ideal_timings(opt: OptAlgorithm) -> list[float]:
|
||||
data = opt.Ts
|
||||
ideal_time = [data['tclose'], data['tgrow'], opt.getMarkOpen()]
|
||||
return ideal_time
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
def main():
|
||||
operator_params = read_json("params/operator_params.json")
|
||||
system_params = read_json("params/system_params.json")
|
||||
opt_algorithm = OptAlgorithm(operator_config=operator_params, system_config=system_params)
|
||||
app = Application(opt_algorithm)
|
||||
ideal_times = get_ideal_timings(opt_algorithm)
|
||||
|
||||
parser = DiagramParser()
|
||||
parser.setData("2024_10_28-17_03_34.csv")
|
||||
bool_dict = parser.getBoolDict()
|
||||
float_dict = parser.getFloatDict()
|
||||
|
||||
request_generator = Request(server_url='http://www.plantuml.com/plantuml/svg/')
|
||||
uml_creator = UMLCreator(request_generator=request_generator,
|
||||
ideal_time=ideal_times,
|
||||
bool_dict=bool_dict,
|
||||
float_dict=float_dict)
|
||||
uml_creator.update_uml()
|
||||
|
||||
app = Application(opt=opt_algorithm,
|
||||
bool_dict=bool_dict,
|
||||
float_dict=float_dict)
|
||||
|
||||
app.updatePlots()
|
||||
pg.exec()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
2
uml/__init__.py
Normal file
2
uml/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
from .request_generator import Request
|
||||
from .creator import UMLCreator
|
||||
99
uml/creator.py
Normal file
99
uml/creator.py
Normal file
@ -0,0 +1,99 @@
|
||||
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_)
|
||||
@ -3,8 +3,13 @@ from os.path import abspath
|
||||
|
||||
|
||||
class Request:
|
||||
def __init__(self):
|
||||
self.server = PlantUML(url='http://www.plantuml.com/plantuml/svg/')
|
||||
def __init__(self, server_url: str):
|
||||
self._server_url = server_url
|
||||
|
||||
self._init_server()
|
||||
|
||||
def _init_server(self):
|
||||
self.server = PlantUML(url=self._server_url)
|
||||
self.clear()
|
||||
|
||||
def _startUML(self):
|
||||
@ -45,7 +50,7 @@ class Request:
|
||||
|
||||
def generateSVG(self):
|
||||
self._compileUML()
|
||||
filename = abspath('UML.txt')
|
||||
filename = abspath('../UML.txt')
|
||||
self.server.processes_file(filename, outfile='UML.svg')
|
||||
#result = self.server.processes(self.stringUML)
|
||||
#return result
|
||||
@ -1,2 +1,2 @@
|
||||
from .json_tools import read_json
|
||||
from .data_parser import DataParser
|
||||
from .diagram_parser import DiagramParser
|
||||
@ -1,7 +1,7 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
class DataParser:
|
||||
class DiagramParser:
|
||||
def __init__(self, scaler = 1):
|
||||
self.data = pd.DataFrame({})
|
||||
self.scaler = scaler
|
||||
Loading…
Reference in New Issue
Block a user