# Калькулятор питательных сред Программа для расчёта состава питательных сред с поддержкой разбавленных реагентов. ## 📋 Функционал - **Расчёт состава среды** по процентному содержанию компонентов - **Поддержка разных единиц измерения** (нг, мкг, мг, г, кг, нл, мкл, мл, л) - **Коэффициент пересчёта** для каждого реагента (например, для перевода объёма в массу) - **Разбавление реагентов** — возможность указать, во сколько раз разбавлен исходный реактив - **Автоматический расчёт растворителя** с учётом объёма вносимых разбавленных реагентов - **Сохранение и загрузка** состава в JSON-файл - **Интерактивная таблица** с возможностью добавления/удаления реагентов ## 🚀 Установка и запуск ### Требования - Python 3.6 или выше - PyQt5 ### Установка зависимостей ```bash pip install PyQt5 ``` ### Запуск программы ```bash python main.py ``` ## 📖 Использование ### Основные параметры 1. **Общее количество** — конечный объём/масса готовой среды 2. **Единица измерения** — нл, мкл, мл, л 3. **Растворитель** — название растворителя (отображается в первой строке таблицы) ### Таблица реагентов | Колонка | Описание | |---------|----------| | Название | Имя реагента | | % | Процентное содержание в конечной среде | | Единица | В каких единицах измеряется реагент | | Коэфф. | Коэффициент пересчёта (например, для перевода объёма в массу) | | Разбавление (x) | Во сколько раз разбавлен исходный реактив (1 = не разбавлен) | | Нужно взять (разб.) | Рассчитанное количество разбавленного реагента | ### Пример расчёта **Задача:** Приготовить 100 мл питательной среды с 10% соли. **Вариант 1 — соль не разбавлена:** - Разбавление = 1 - Нужно взять: 10 г соли - Растворителя: 100 мл **Вариант 2 — есть 10-кратно разбавленная соль:** - Разбавление = 10 - Нужно взять: 1 мл разбавленной соли (10 г / 10) - Растворителя: 99 мл (100 мл - 1 мл) ## 🧠 Особенности реализации ### Расчёт растворителя **Важное примечание:** При расчёте объёма растворителя учитываются только те реагенты, которые заданы в **объёмных единицах** (нл, мкл, мл, л). Реагенты в **единицах массы** (нг, мкг, мг, г, кг) считаются не имеющими объёма и не влияют на расчёт растворителя. Это сделано потому, что: 1. Массовые реагенты обычно добавляются в твёрдом виде и их объём пренебрежимо мал 2. Для корректного учёта объёма твёрдых веществ потребовалась бы плотность ```python # Пример из model.py if is_volume: # Реагент в объёмных единицах — учитываем его объём reagent_volume_base = diluted_amount * VOLUME_UNITS[reagent.unit] else: # Реагент в массовых единицах — не учитываем (объём = 0) reagent_volume_base = 0 ``` ### Алгоритм расчёта 1. **Расчёт неразбавленного состава** - Количество чистого вещества = (процент / 100) × общий объём 2. **Пересчёт с учётом разбавления** - Количество разбавленного реагента = чистое вещество / фактор разбавления 3. **Расчёт объёма вносимых реагентов** - Для объёмных реагентов: объём = количество разбавленного реагента - Для массовых реагентов: объём = 0 4. **Расчёт растворителя** - Объём растворителя = общий объём − сумма объёмов всех реагентов ## 📁 Структура проекта ``` nutrient_medium_pyqt/ ├── main.py # Точка входа, инициализация приложения ├── controller.py # Контроллер — связь между моделью и представлением ├── model.py # Модель — бизнес-логика и расчёты ├── view.py # Представление — GUI на PyQt5 ├── reagent.py # Класс Reagent для хранения данных └── README.md # Документация ``` ## 🔧 Описание кода ### main.py Инициализирует QApplication, создаёт экземпляр Controller и запускает главный цикл обработки событий. ### reagent.py ```python class Reagent: def __init__(self, name: str, percentage: float, unit: str, conversion_factor: float = 1.0) ``` Хранит данные о реагенте: - `name` — название - `percentage` — процентное содержание - `unit` — единица измерения - `conversion_factor` — коэффициент пересчёта - `dilution_factor` — коэффициент разбавления (добавляется динамически) ### model.py Содержит бизнес-логику программы: **Константы:** ```python VOLUME_UNITS = {'нл': 0.001, 'мкл': 1.0, 'мл': 1000.0, 'л': 1000000.0} MASS_UNITS = {'нг': 0.000001, 'мкг': 0.001, 'мг': 1.0, 'г': 1000.0, 'кг': 1000000.0} ``` **Основные методы:** - `convert_amount()` — пересчёт между единицами измерения через базовые (мкл для объёма, мкг для массы) - `calculate_amounts()` — главный расчётный метод - `save_to_file()` / `load_from_file()` — сериализация в JSON ### view.py Реализует графический интерфейс на PyQt5: **Основные компоненты:** - `QDoubleSpinBox` для общего количества - `QComboBox` для выбора единиц измерения - `QTableWidget` для таблицы реагентов (6 колонок) - Кнопки: Добавить, Удалить, Рассчитать, Сохранить, Загрузить **Ключевые методы:** - `add_solvent_row()` — создаёт нередактируемую строку растворителя - `add_new_row()` — добавляет строку реагента - `update_results()` — обновляет результаты расчёта - `update_solvent_result()` — обновляет количество растворителя ### controller.py Координирует взаимодействие Model и View: **Сигналы (слоты):** - `add_row_btn.clicked` → `add_reagent_row()` - `calculate_btn.clicked` → `_perform_calculation()` - `save_btn.clicked` → `save_composition()` - `load_btn.clicked` → `load_composition()` **Основные методы:** - `_update_model_from_view()` — переносит данные из таблицы в модель - `_update_view_from_model()` — заполняет таблицу из модели - `_perform_calculation()` — вызывает расчёт и обновляет интерфейс ## 📝 Формат JSON-файла ```json { "total_amount": 1000.0, "amount_unit": "мл", "solvent": "Вода", "reagents": [ { "name": "NaCl", "percentage": 0.9, "unit": "г", "conversion_factor": 1.0, "dilution_factor": 1.0 } ] } ``` ## 🤝 Вклад в проект При обнаружении ошибок или наличии предложений создавайте Issue или Pull Request. ## 📄 Лицензия MIT License ## 👨‍💻 Автор Kolobov Artem ```