|
|
|
|
import streamlit as st
|
|
|
|
|
|
|
|
|
|
## LOAD DB ##
|
|
|
|
|
|
|
|
|
|
#{
|
|
|
|
|
# "Бикаридин": [0, [0, "Углерод", 1], [1, "Инапровалин"] ],
|
|
|
|
|
# "Инапровалин": [0, [0, "Кислород", 1], [0, "Сахар", 1], [0, "Углерод", 1] ]
|
|
|
|
|
#}
|
|
|
|
|
# Тип Название Часть (1 к 1)
|
|
|
|
|
#
|
|
|
|
|
# 0 - без нагрева и т.п., 1 - зависит от того-то
|
|
|
|
|
#
|
|
|
|
|
# 100 = 50 углерод + 50 инапровалин =
|
|
|
|
|
# = 50 углерод + round(50/3) * составные
|
|
|
|
|
# = 50 углерод + 16 кислород + 16 сахар + 16 углерод
|
|
|
|
|
# !!! 50 != 48 => делаем 48 !!!
|
|
|
|
|
# = 48 углерод + 16 кислород + 16 сахар + 16 углерод
|
|
|
|
|
# = 96 бикаридин
|
|
|
|
|
#
|
|
|
|
|
# Список составных: ["Кислород", "Сахар", "Углерод"]
|
|
|
|
|
|
|
|
|
|
from db import *
|
|
|
|
|
|
|
|
|
|
db = read_db()
|
|
|
|
|
els = list(db.keys())
|
|
|
|
|
|
|
|
|
|
#############
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### UI ####
|
|
|
|
|
|
|
|
|
|
# Set columns
|
|
|
|
|
react, star, amount = st.columns([73, 7, 20])
|
|
|
|
|
|
|
|
|
|
with react:
|
|
|
|
|
option_react = st.selectbox(
|
|
|
|
|
label = '0',
|
|
|
|
|
options = els,
|
|
|
|
|
index = None,
|
|
|
|
|
placeholder = 'Реакция',
|
|
|
|
|
label_visibility = 'collapsed',
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
with star:
|
|
|
|
|
st.button(':orange[:star:]')
|
|
|
|
|
|
|
|
|
|
with amount:
|
|
|
|
|
option_amount = st.selectbox(
|
|
|
|
|
label = '0',
|
|
|
|
|
options = [30, 50, 100, 300, 1000],
|
|
|
|
|
index = 2,
|
|
|
|
|
placeholder = 'Объём',
|
|
|
|
|
label_visibility = 'collapsed'
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### CALCULATE RECIPE ####
|
|
|
|
|
|
|
|
|
|
if option_react:
|
|
|
|
|
parts = 0
|
|
|
|
|
part = 0
|
|
|
|
|
vol = option_amount
|
|
|
|
|
|
|
|
|
|
# Определяем 1 часть
|
|
|
|
|
for i in db[option_react]:
|
|
|
|
|
parts += i[2]
|
|
|
|
|
part = vol // parts
|
|
|
|
|
|
|
|
|
|
# Название: количество (локальные части)
|
|
|
|
|
parted = {}
|
|
|
|
|
# Проверяем конфликты с сложными частями: 48 != 50
|
|
|
|
|
lparts = 0 ; lpart = 0
|
|
|
|
|
for i in db[option_react]:
|
|
|
|
|
if i[0] == 1:
|
|
|
|
|
# Перебираем составные
|
|
|
|
|
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["Инапровалин"] = 16
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comps = {}
|
|
|
|
|
# Распределяем (пока не учитывает части и глубину)
|
|
|
|
|
for i in db[option_react]:
|
|
|
|
|
if i[0] == 0:
|
|
|
|
|
comps[i[1]] = part
|
|
|
|
|
elif i[0] == 1:
|
|
|
|
|
# Перебираем составные
|
|
|
|
|
for el in db[i[1]]:
|
|
|
|
|
if el[1] not in comps:
|
|
|
|
|
print("############")
|
|
|
|
|
print(part)
|
|
|
|
|
print(parted[i[1]])
|
|
|
|
|
comps[el[1]] = parted[i[1]]
|
|
|
|
|
else:
|
|
|
|
|
comps[el[1]] += parted[i[1]]
|
|
|
|
|
|
|
|
|
|
comps
|