Files
mixture_optimizer/editor.py
T

122 lines
5.3 KiB
Python

# editor.py
"""
Редактор состава смеси.
Позволяет добавлять, изменять ингредиенты и сохранять состав в проект.
"""
from core.classes import Ingredient
from core.fs import save_project_partial
from core.table_io import handle_table_output
def safe_float(prompt, default=None):
"""Безопасный ввод числа с возможностью значения по умолчанию."""
while True:
val = input(prompt)
if val.strip() == "" and default is not None:
return default
try:
return float(val)
except ValueError:
print("Ошибка! Введите число.")
def display_ingredients(mixture):
"""Выводит список ингредиентов в виде таблицы."""
if not mixture.ings:
print("Список ингредиентов пуст.")
return
headers = ["", "Название", "%", "Разбавление", "Плотность"]
rows = []
for i, info in enumerate(mixture.ings, start=1):
rows.append([
str(i),
info.name + (" (растворитель)" if i == 1 else ""),
f"{info.value:.1f}",
f"{info.dilution:.2f}",
f"{info.density:.2f}"
])
handle_table_output(headers, rows, title="Список ингредиентов")
def editor_menu(mixture):
"""
Подменю редактора состава.
Изменяет объект mixture напрямую.
"""
while True:
print("\n" + "=" * 50)
print("РЕДАКТОР СОСТАВА")
print("1. Добавить ингредиент")
print("2. Показать все ингредиенты")
print("3. Изменить количество ингредиента (%)")
print("4. Изменить разбавление и плотность")
print("5. Сохранить состав в проект")
print("(Enter - выход в главное меню)")
print("=" * 50)
choice = input("Выберите пункт: ").strip()
if choice == "":
break
if choice == "1":
name = input("Название: ")
unit = input("Единица: ")
value = safe_float("Количество (%): ")
if value < 0:
print("Процент не может быть отрицательным!")
continue
dilution = safe_float("Разбавление (по умолчанию 1): ", default=1.0)
density = safe_float("Плотность (по умолчанию 1): ", default=1.0)
ing = Ingredient(name, unit, value)
mixture.add_ingredient(ing, dilution, density)
print(f"Добавлено: {ing.name} = {ing.value:.1f}%")
elif choice == "2":
display_ingredients(mixture)
elif choice == "3":
if len(mixture.ings) <= 1:
print("Нельзя изменить единственный ингредиент (растворитель) напрямую.")
continue
display_ingredients(mixture)
try:
idx = int(input("Номер ингредиента: ")) - 1
if idx == 0:
print("Нельзя менять растворитель напрямую.")
continue
if idx < 0 or idx >= len(mixture.ings):
print("Неверный номер!")
continue
new_val = safe_float(f"Новое количество для {mixture.ings[idx].name} (%): ")
if new_val < 0:
print("Процент не может быть отрицательным!")
continue
mixture.ings[idx].value = new_val
mixture.comp_solvent_percent()
print(f"Обновлено! Растворитель теперь: {mixture.ings[0].value:.1f}%")
except ValueError:
print("Ошибка!")
elif choice == "4":
if not mixture.ings:
print("Список пуст.")
continue
display_ingredients(mixture)
try:
idx = int(input("Номер ингредиента: ")) - 1
if idx < 0 or idx >= len(mixture.ings):
print("Неверный номер!")
continue
info = mixture.ings[idx]
new_dil = safe_float(f"Новое разбавление для {info.name} (было {info.dilution:.2f}): ", default=info.dilution)
new_den = safe_float(f"Новая плотность для {info.name} (было {info.density:.2f}): ", default=info.density)
info.dilution = new_dil
info.density = new_den
print("Параметры обновлены!")
except ValueError:
print("Ошибка!")
elif choice == "5":
save_project_partial(mixture=mixture)
print("Состав сохранён в проект.")
else:
print("Неверный пункт.")