# 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