Files
help_lab/README.md
T

9.5 KiB
Raw Blame History

Калькулятор питательных сред

Программа для расчёта состава питательных сред с поддержкой разбавленных реагентов.

📋 Функционал

  • Расчёт состава среды по процентному содержанию компонентов
  • Поддержка разных единиц измерения (нг, мкг, мг, г, кг, нл, мкл, мл, л)
  • Коэффициент пересчёта для каждого реагента (например, для перевода объёма в массу)
  • Разбавление реагентов — возможность указать, во сколько раз разбавлен исходный реактив
  • Автоматический расчёт растворителя с учётом объёма вносимых разбавленных реагентов
  • Сохранение и загрузка состава в JSON-файл
  • Интерактивная таблица с возможностью добавления/удаления реагентов

🚀 Установка и запуск

Требования

  • Python 3.6 или выше
  • PyQt5

Установка зависимостей

pip install PyQt5

Запуск программы

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. Для корректного учёта объёма твёрдых веществ потребовалась бы плотность
# Пример из 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

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

Содержит бизнес-логику программы:

Константы:

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.clickedadd_reagent_row()
  • calculate_btn.clicked_perform_calculation()
  • save_btn.clickedsave_composition()
  • load_btn.clickedload_composition()

Основные методы:

  • _update_model_from_view() — переносит данные из таблицы в модель
  • _update_view_from_model() — заполняет таблицу из модели
  • _perform_calculation() — вызывает расчёт и обновляет интерфейс

📝 Формат 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

👨‍💻 Автор

Artemka


Этот README.md:
- ✅ Кратко описывает функционал
- ✅ Содержит примеры использования
- ✅ Объясняет важную особенность — массовые компоненты не учитываются при расчёте растворителя
- ✅ Даёт подробное описание каждого файла и класса
- 👍 Понятен как новичкам, так и опытным разработчикам