122 lines
5.3 KiB
Python
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("Неверный пункт.")
|