mirror of
https://github.com/Justuser3310/ss14_chemistry_site.git
synced 2025-02-08 09:07:38 +00:00
Глобальное изменение алгоритма, вынос его в calc.py
This commit is contained in:
parent
3ee9a64742
commit
b18496e57b
77
calc.py
Normal file
77
calc.py
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
from db import *
|
||||||
|
from math import floor
|
||||||
|
|
||||||
|
db = read_db()
|
||||||
|
|
||||||
|
# Составные
|
||||||
|
recipe = {}
|
||||||
|
|
||||||
|
# Функция для спец. округления
|
||||||
|
# 16.666...8 => 15
|
||||||
|
def sround(num):
|
||||||
|
num = floor(num)
|
||||||
|
|
||||||
|
# Подмены
|
||||||
|
rep = [[16,15], [33,30]]
|
||||||
|
|
||||||
|
for i in rep:
|
||||||
|
if num == i[0]:
|
||||||
|
num = i[1]
|
||||||
|
# Делаем около-кратным 10 и 15
|
||||||
|
# if abs(num - round(num/10)*10) <= 1:
|
||||||
|
# num = round(num/10)*10
|
||||||
|
# if abs(num - round(num/15)*15) <= 1:
|
||||||
|
# num = round(num/15)*15
|
||||||
|
|
||||||
|
return num
|
||||||
|
|
||||||
|
def calc(el, amount, main = False):
|
||||||
|
global db, recipe
|
||||||
|
if main:
|
||||||
|
recipe = {}
|
||||||
|
|
||||||
|
comps = db[el][1:] # Получаем составные
|
||||||
|
|
||||||
|
# Считаем количество частей
|
||||||
|
parts = 0
|
||||||
|
for i in comps:
|
||||||
|
parts += i[1]
|
||||||
|
# Считаем 1 часть
|
||||||
|
part = sround(amount/parts)
|
||||||
|
|
||||||
|
# Перебираем составные и делаем рекурсию
|
||||||
|
for i in comps:
|
||||||
|
if i[0] in db:
|
||||||
|
lpart = calc(i[0], part*i[1])
|
||||||
|
# lpart - количество составного в итоге
|
||||||
|
# 50/3, часть = 16, ИТОГ: 16*3=48 <
|
||||||
|
try:
|
||||||
|
if lpart < part:
|
||||||
|
part = lpart
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Перебираем элементарные вещества
|
||||||
|
for i in comps:
|
||||||
|
if i[0] not in db:
|
||||||
|
if i[0] == 'Плазма':
|
||||||
|
recipe[i[0]] = 1
|
||||||
|
else:
|
||||||
|
if i[0] not in recipe:
|
||||||
|
recipe[i[0]] = part*i[1]
|
||||||
|
else:
|
||||||
|
recipe[i[0]] += part*i[1]
|
||||||
|
|
||||||
|
if main:
|
||||||
|
return [recipe, parts*part]
|
||||||
|
else:
|
||||||
|
return part*parts
|
||||||
|
|
||||||
|
#calc("Бикаридин", 100)
|
||||||
|
#calc("Эпинефрин", 100)
|
||||||
|
#print( calc("Лексорин", 100, True))
|
||||||
|
#calc("Амбузол", 100)
|
||||||
|
#calc("Амбузол плюс", 100)
|
||||||
|
#print( calc("Аммиак", 100, True) )
|
||||||
|
|
||||||
|
#print(recipe)
|
70
site.py
70
site.py
@ -44,6 +44,8 @@ html.Div([
|
|||||||
|
|
||||||
####### ЛОГИКА ##########
|
####### ЛОГИКА ##########
|
||||||
|
|
||||||
|
from calc import *
|
||||||
|
|
||||||
@callback(
|
@callback(
|
||||||
Output('output', 'children'),
|
Output('output', 'children'),
|
||||||
Input('reaction', 'value'),
|
Input('reaction', 'value'),
|
||||||
@ -51,69 +53,8 @@ html.Div([
|
|||||||
)
|
)
|
||||||
def update_output(reaction, amount):
|
def update_output(reaction, amount):
|
||||||
if reaction:
|
if reaction:
|
||||||
print(reaction)
|
comps, res = calc(reaction, amount, main = True)
|
||||||
# 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]:
|
|
||||||
# TODO: только i[1] in db ?
|
|
||||||
if i[0] == True and i[1] in db:
|
|
||||||
# Перебираем составные
|
|
||||||
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 and i[1] not in db:
|
|
||||||
# Фикс Вестина и т.п. (нету крафта, но отмечено как есть)
|
|
||||||
comps[i[1]] = part * i[2]
|
|
||||||
elif i[0] == True and i[1] in db:
|
|
||||||
# Перебираем составные
|
|
||||||
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
|
# Форматирование для HTML
|
||||||
result = []
|
result = []
|
||||||
for i in comps:
|
for i in comps:
|
||||||
@ -121,12 +62,13 @@ def update_output(reaction, amount):
|
|||||||
, style={'background-color': '#3f3b17', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
|
, style={'background-color': '#3f3b17', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
|
||||||
|
|
||||||
# Выходное вещество
|
# Выходное вещество
|
||||||
result.append( html.Div(f'{reaction}: {part*parts}'
|
result.append( html.Div(f'{reaction}: {res}'
|
||||||
, style={'background-color': '#183929', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
|
, style={'background-color': '#183929', 'margin-top': 10, 'border-radius': 10, 'padding': 15, 'font-family': '"Source Sans Pro", sans-serif', 'font-size': '120%'}) )
|
||||||
|
|
||||||
print(result)
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user