diff --git a/calc.py b/calc.py new file mode 100644 index 0000000..35348cd --- /dev/null +++ b/calc.py @@ -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) diff --git a/site.py b/site.py index e4ea9bf..cc8cc44 100644 --- a/site.py +++ b/site.py @@ -44,6 +44,8 @@ html.Div([ ####### ЛОГИКА ########## +from calc import * + @callback( Output('output', 'children'), Input('reaction', 'value'), @@ -51,69 +53,8 @@ html.Div([ ) 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]: - # 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) + comps, res = calc(reaction, amount, main = True) + # Форматирование для HTML result = [] 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%'}) ) # Выходное вещество - 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%'}) ) - print(result) + return result + #########################