157 lines
7.1 KiB
Python
157 lines
7.1 KiB
Python
# 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
|