Initial commit: планирование эксперимента и оптимизация смесей
This commit is contained in:
+156
@@ -0,0 +1,156 @@
|
||||
# response.py
|
||||
"""
|
||||
Ввод и управление откликами эксперимента.
|
||||
"""
|
||||
from core.fs import save_project_partial
|
||||
from core.table_io import handle_table_output
|
||||
|
||||
def response_menu(design, responses):
|
||||
if not design.plan:
|
||||
print("План эксперимента пуст. Сначала создайте или загрузите дизайн.")
|
||||
input("Нажмите Enter для продолжения...")
|
||||
return responses
|
||||
|
||||
num_experiments = len(design.plan)
|
||||
|
||||
while True:
|
||||
print("\n" + "=" * 50)
|
||||
print("ВВОД ЗНАЧЕНИЙ ОТКЛИКА")
|
||||
print(f"Количество опытов: {num_experiments}")
|
||||
print("1. Показать все отклики")
|
||||
print("2. Добавить новый отклик")
|
||||
print("3. Редактировать отклик")
|
||||
print("4. Переименовать отклик")
|
||||
print("5. Удалить отклик")
|
||||
print("6. Сохранить отклики в проект")
|
||||
print("(Enter - выход в главное меню)")
|
||||
print("=" * 50)
|
||||
choice = input("Выберите пункт: ").strip()
|
||||
|
||||
if choice == "":
|
||||
break
|
||||
|
||||
if choice == "1":
|
||||
if not responses:
|
||||
print("Отклики не введены.")
|
||||
continue
|
||||
headers = ["Опыт"] + [resp["name"] for resp in responses]
|
||||
rows = []
|
||||
for i in range(num_experiments):
|
||||
row = [str(i + 1)]
|
||||
for resp in responses:
|
||||
values = resp["values"]
|
||||
if i < len(values):
|
||||
row.append(f"{values[i]:.3f}")
|
||||
else:
|
||||
row.append("—")
|
||||
rows.append(row)
|
||||
handle_table_output(headers, rows, title="Таблица откликов")
|
||||
|
||||
elif choice == "2":
|
||||
name = input("Введите название нового отклика: ").strip()
|
||||
if not name:
|
||||
print("Название не может быть пустым.")
|
||||
continue
|
||||
if any(r["name"].lower() == name.lower() for r in responses):
|
||||
print("Отклик с таким названием уже существует.")
|
||||
continue
|
||||
|
||||
print(f"Введите {num_experiments} значений для отклика '{name}':")
|
||||
values = []
|
||||
for i in range(num_experiments):
|
||||
while True:
|
||||
val = input(f" Опыт {i+1}: ").strip()
|
||||
try:
|
||||
values.append(float(val))
|
||||
break
|
||||
except ValueError:
|
||||
print("Введите число.")
|
||||
responses.append({"name": name, "values": values})
|
||||
print(f"Отклик '{name}' добавлен.")
|
||||
|
||||
elif choice == "3":
|
||||
if not responses:
|
||||
print("Нет откликов для редактирования.")
|
||||
continue
|
||||
print("Список откликов:")
|
||||
for idx, resp in enumerate(responses, start=1):
|
||||
print(f"{idx}. {resp['name']} (значений: {len(resp['values'])})")
|
||||
try:
|
||||
idx = int(input("Выберите номер отклика для редактирования: ")) - 1
|
||||
if idx < 0 or idx >= len(responses):
|
||||
print("Неверный номер.")
|
||||
continue
|
||||
resp = responses[idx]
|
||||
print(f"Редактирование отклика '{resp['name']}'. Введите новые значения.")
|
||||
new_values = []
|
||||
for i in range(num_experiments):
|
||||
while True:
|
||||
val = input(f" Опыт {i+1} (было {resp['values'][i] if i < len(resp['values']) else '—'}): ").strip()
|
||||
if val == "":
|
||||
if i < len(resp['values']):
|
||||
new_values.append(resp['values'][i])
|
||||
else:
|
||||
print("Значение обязательно.")
|
||||
continue
|
||||
break
|
||||
try:
|
||||
new_values.append(float(val))
|
||||
break
|
||||
except ValueError:
|
||||
print("Введите число.")
|
||||
resp["values"] = new_values
|
||||
print(f"Отклик '{resp['name']}' обновлён.")
|
||||
except ValueError:
|
||||
print("Ошибка ввода.")
|
||||
|
||||
elif choice == "4":
|
||||
if not responses:
|
||||
print("Нет откликов для переименования.")
|
||||
continue
|
||||
print("Список откликов:")
|
||||
for idx, resp in enumerate(responses, start=1):
|
||||
print(f"{idx}. {resp['name']}")
|
||||
try:
|
||||
idx = int(input("Выберите номер отклика для переименования: ")) - 1
|
||||
if idx < 0 or idx >= len(responses):
|
||||
print("Неверный номер.")
|
||||
continue
|
||||
new_name = input(f"Введите новое название для '{responses[idx]['name']}': ").strip()
|
||||
if not new_name:
|
||||
print("Название не может быть пустым.")
|
||||
continue
|
||||
if any(r["name"].lower() == new_name.lower() for r in responses if r != responses[idx]):
|
||||
print("Отклик с таким названием уже существует.")
|
||||
continue
|
||||
old_name = responses[idx]["name"]
|
||||
responses[idx]["name"] = new_name
|
||||
print(f"Отклик '{old_name}' переименован в '{new_name}'.")
|
||||
except ValueError:
|
||||
print("Ошибка ввода.")
|
||||
|
||||
elif choice == "5":
|
||||
if not responses:
|
||||
print("Нет откликов для удаления.")
|
||||
continue
|
||||
print("Список откликов:")
|
||||
for idx, resp in enumerate(responses, start=1):
|
||||
print(f"{idx}. {resp['name']} (значений: {len(resp['values'])})")
|
||||
try:
|
||||
idx = int(input("Выберите номер отклика для удаления: ")) - 1
|
||||
if idx < 0 or idx >= len(responses):
|
||||
print("Неверный номер.")
|
||||
continue
|
||||
deleted = responses.pop(idx)
|
||||
print(f"Отклик '{deleted['name']}' удалён.")
|
||||
except ValueError:
|
||||
print("Ошибка ввода.")
|
||||
|
||||
elif choice == "6":
|
||||
save_project_partial(responses=responses)
|
||||
print("Отклики сохранены в проект.")
|
||||
|
||||
else:
|
||||
print("Неверный пункт.")
|
||||
|
||||
return responses
|
||||
Reference in New Issue
Block a user