You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from db import *
# Загружаем элементы БД
db = read_db()
els = list(db.keys())
###### ОФОРМЛЕНИЕ #######
from dash import Dash, dcc, html, Input, Output,callback
app = Dash(__name__)
app.layout = html.Div([
# Название + объём
html.Div([
# Реакция
html.Div([
dcc.Dropdown(els, id='reaction', placeholder="Реакция", maxHeight=500)
], style={'flex': 4}),
# Объём
html.Div([
dcc.Dropdown([30, 50, 100, 300, 1000], 100, id='amount', clearable=False, searchable=False)
], style={'flex': 1, 'padding-left': 25})
], style={'display': 'flex', 'flexDirection': 'row'}),
# Вывод
html.Div(id='output', style={'padding': 10, 'padding-left': 15})
], style={'padding': 80, 'margin-left': 250, 'margin-right': 250})
# padding - отступ
# [#####]
# margin - сужение
# [###]
#########################
####### ЛОГИКА ##########
@callback(
Output('output', 'children'),
Input('reaction', 'value'),
Input('amount', 'value')
)
def update_output(reaction, amount):
if reaction:
print(reaction)
# return f'You have selected {tt}'
parts = 0
part = 0
vol = amount
# Определяем 1 часть
for i in db[reaction]:
parts += i[2]
part = vol // parts
# Делаем около-кратным 10 и 15
# !!ЭКСПЕРЕМЕНТАЛЬНОЕ!!
part = round(part/10)*10
if part%10 != 0:
part = round(part/15)*15
# Название: количество (локальные части)
parted = {}
# Проверяем конфликты с составными частями: 48 != 50
lparts = 0 ; lpart = 0
for i in db[reaction]:
if i[0] == True:
# Перебираем составные
for el in db[i[1]]:
lparts += el[2]
# 50//3 ~ 16 16 * 3 = 48
lpart = (part//lparts) * lparts
if lpart < part:
part = lpart
parted[i[1]] = [part, lparts]
# part = 48
# parted["Инапровалин"] = [48, 3]
# 48 - 1 часть, 3 - кол. частей
comps = {}
# Распределяем (пока не учитывает большую глубину)
for i in db[reaction]:
if i[0] == False:
if i[1] == "Плазма":
comps[i[1]] = 1
else:
comps[i[1]] = part * i[2]
elif i[0] == True:
# Перебираем составные
for el in db[i[1]]:
if el[1] == "Плазма":
comps[el[1]] = 1
else:
if el[1] not in comps:
comps[el[1]] = int( parted[i[1]][0]/parted[i[1]][1] * el[2] )
else:
comps[el[1]] += int( parted[i[1]][0]/parted[i[1]][1] * el[2] )
print(comps)
# Форматирование для HTML
result = []
for i in comps:
result.append( html.Div(i + ': ' + str(comps[i]), style={'background-color': '#efdd12', 'margin-top': 10}) )
# Выходное вещество
result.append( html.Div(f'{reaction}: {part*parts}', style={'background-color': '#57ff00', 'margin-top': 10}) )
print(result)
return result
#########################
if __name__ == '__main__':
app.run(debug=True)
# app.run(debug=False)