Initial commit: планирование эксперимента и оптимизация смесей
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
# 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("Неверный пункт.")
|
||||
Reference in New Issue
Block a user