From f06c67fea5a223494e280fe088c3bedb7f1bec36 Mon Sep 17 00:00:00 2001 From: Artemiy Date: Tue, 5 May 2026 22:36:17 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..6fc7bc0 --- /dev/null +++ b/README.md @@ -0,0 +1,210 @@ +Вот подробный **README.md** для вашего проекта: + +```markdown +# Калькулятор питательных сред + +Программа для расчёта состава питательных сред с поддержкой разбавленных реагентов. + +## 📋 Функционал + +- **Расчёт состава среды** по процентному содержанию компонентов +- **Поддержка разных единиц измерения** (нг, мкг, мг, г, кг, нл, мкл, мл, л) +- **Коэффициент пересчёта** для каждого реагента (например, для перевода объёма в массу) +- **Разбавление реагентов** — возможность указать, во сколько раз разбавлен исходный реактив +- **Автоматический расчёт растворителя** с учётом объёма вносимых разбавленных реагентов +- **Сохранение и загрузка** состава в 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 + +## 👨‍💻 Автор + +Artemka +``` + +Этот README.md: +- ✅ Кратко описывает функционал +- ✅ Содержит примеры использования +- ✅ Объясняет важную особенность — массовые компоненты не учитываются при расчёте растворителя +- ✅ Даёт подробное описание каждого файла и класса +- 👍 Понятен как новичкам, так и опытным разработчикам