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.

126 lines
3.2 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.

import streamlit as st
## LOAD DB ##
#{
# "Бикаридин": [ [0, "Углерод", 1], [1, "Инапровалин"] ],
# "Инапровалин": [ [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
# Делаем около-кратным 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[option_react]:
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 - кол. частей
# Фикс для плазмы в составных частях
# for i in db[option_react]:
# if i[0] == True:
# for el in db[i[1]]:
# if el[1] == "Плазма":
# parted[i[1]][0]
# parted[i[1]][1] -= 2
comps = {}
# Распределяем (пока не учитывает большую глубину)
for i in db[option_react]:
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] )
# Выводим результат
for i in comps:
st.warning(f'{i}: {comps[i]}')
st.success(f'{option_react}: {part*parts}')