2024-01-26 15:20:30 +00:00
from db import *
# Загружаем элементы БД
db = read_db ( )
els = list ( db . keys ( ) )
###### ОФОРМЛЕНИЕ #######
2024-01-25 21:48:18 +00:00
from dash import Dash , dcc , html , Input , Output , callback
2024-01-24 09:39:30 +00:00
2024-01-25 21:48:18 +00:00
app = Dash ( __name__ )
2024-01-24 09:39:30 +00:00
2024-01-25 21:48:18 +00:00
app . layout = html . Div ( [
2024-01-26 15:20:30 +00:00
# Название + объём
html . Div ( [
# Реакция
html . Div ( [
2024-01-26 18:11:43 +00:00
dcc . Dropdown ( els , id = ' reaction ' , placeholder = " Реакция " , maxHeight = 500 , style = { ' font-size ' : ' 120 % ' } )
2024-01-26 15:20:30 +00:00
] , style = { ' flex ' : 4 } ) ,
# Объём
html . Div ( [
2024-01-26 18:11:43 +00:00
dcc . Dropdown ( [ 30 , 50 , 100 , 300 , 1000 ] , 100 , id = ' amount ' , clearable = False , searchable = False
, style = { ' font-family ' : ' " Source Sans Pro " , sans-serif ' , ' font-size ' : ' 120 % ' } )
2024-01-26 15:20:30 +00:00
] , style = { ' flex ' : 1 , ' padding-left ' : 25 } )
] , style = { ' display ' : ' flex ' , ' flexDirection ' : ' row ' } ) ,
# Вывод
2024-01-26 18:11:43 +00:00
html . Div ( id = ' output ' , style = { ' text-align ' : ' center ' , ' padding-left ' : ' 15 % ' , ' padding-right ' : ' 15 % ' } )
2024-01-26 15:20:30 +00:00
2024-01-26 18:11:43 +00:00
] , style = { ' padding ' : ' 5 % ' , ' margin-left ' : ' 30 % ' , ' margin-right ' : ' 30 % ' } )
2024-01-26 15:20:30 +00:00
# padding - отступ
# [#####]
# margin - сужение
# [###]
#########################
2024-01-24 09:39:30 +00:00
2024-01-24 12:20:02 +00:00
2024-01-26 15:20:30 +00:00
####### ЛОГИКА ##########
2024-01-25 21:48:18 +00:00
@callback (
2024-01-26 15:20:30 +00:00
Output ( ' output ' , ' children ' ) ,
Input ( ' reaction ' , ' value ' ) ,
Input ( ' amount ' , ' value ' )
2024-01-25 21:48:18 +00:00
)
2024-01-26 15:20:30 +00:00
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
2024-01-26 18:11:43 +00:00
2024-01-26 15:20:30 +00:00
# Название: количество (локальные части)
parted = { }
# Проверяем конфликты с составными частями: 48 != 50
lparts = 0 ; lpart = 0
for i in db [ reaction ] :
2024-01-26 18:11:43 +00:00
# TODO: только i[1] in db ?
if i [ 0 ] == True and i [ 1 ] in db :
2024-01-26 15:20:30 +00:00
# Перебираем составные
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 - кол. частей
2024-01-26 18:11:43 +00:00
2024-01-26 15:20:30 +00:00
comps = { }
# Распределяем (пока не учитывает большую глубину)
for i in db [ reaction ] :
if i [ 0 ] == False :
if i [ 1 ] == " Плазма " :
comps [ i [ 1 ] ] = 1
else :
comps [ i [ 1 ] ] = part * i [ 2 ]
2024-01-26 18:11:43 +00:00
elif i [ 0 ] == True and i [ 1 ] not in db :
# Фикс Вестина и т.п. (нету крафта, но отмечено как есть)
comps [ i [ 1 ] ] = part * i [ 2 ]
elif i [ 0 ] == True and i [ 1 ] in db :
2024-01-26 15:20:30 +00:00
# Перебираем составные
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 ] )
2024-01-26 18:11:43 +00:00
2024-01-26 15:20:30 +00:00
print ( comps )
# Форматирование для HTML
result = [ ]
for i in comps :
2024-01-26 18:11:43 +00:00
result . append ( html . Div ( i + ' : ' + str ( comps [ i ] )
, style = { ' background-color ' : ' #3f3b17 ' , ' margin-top ' : 10 , ' border-radius ' : 10 , ' padding ' : 15 , ' font-family ' : ' " Source Sans Pro " , sans-serif ' , ' font-size ' : ' 120 % ' } ) )
2024-01-26 15:20:30 +00:00
# Выходное вещество
2024-01-26 18:11:43 +00:00
result . append ( html . Div ( f ' { reaction } : { part * parts } '
, style = { ' background-color ' : ' #183929 ' , ' margin-top ' : 10 , ' border-radius ' : 10 , ' padding ' : 15 , ' font-family ' : ' " Source Sans Pro " , sans-serif ' , ' font-size ' : ' 120 % ' } ) )
2024-01-26 15:20:30 +00:00
print ( result )
return result
#########################
2024-01-24 12:20:02 +00:00
2024-01-24 09:39:30 +00:00
2024-01-25 21:48:18 +00:00
if __name__ == ' __main__ ' :
2024-01-26 15:20:30 +00:00
app . run ( debug = True )
# app.run(debug=False)