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

from db import *
# Загружаем элементы БД
db = read_db()
els = list(db.keys())
###### ОФОРМЛЕНИЕ #######
from dash import Dash, dcc, html, Input, Output,callback
9 months ago
app = Dash(__name__)
9 months ago
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 - сужение
# [###]
#########################
9 months ago
####### ЛОГИКА ##########
@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
#########################
9 months ago
if __name__ == '__main__':
app.run(debug=True)
# app.run(debug=False)