48 lines
2.1 KiB
Python
48 lines
2.1 KiB
Python
# core/fs.py
|
|
"""
|
|
Модуль для работы с файлами проекта (сохранение/загрузка в JSON).
|
|
"""
|
|
import json
|
|
from core.classes import Mixture
|
|
from core.experiment import ExperimentDesign
|
|
|
|
PROJECT_FILENAME = "project.json"
|
|
|
|
def load_project(filename: str = PROJECT_FILENAME):
|
|
"""
|
|
Загружает проект из JSON-файла.
|
|
Возвращает кортеж (mixture, design, responses).
|
|
Если файл отсутствует или повреждён, возвращает новые объекты по умолчанию.
|
|
"""
|
|
try:
|
|
with open(filename, "r", encoding="utf-8") as f:
|
|
data = json.load(f)
|
|
mixture = Mixture.from_dict(data.get("mixture", {})) if "mixture" in data else Mixture()
|
|
design = ExperimentDesign.from_dict(data.get("design", {})) if "design" in data else ExperimentDesign()
|
|
responses = data.get("responses", [])
|
|
if isinstance(responses, list) and responses and isinstance(responses[0], (int, float)):
|
|
responses = [{"name": "Отклик 1", "values": responses}]
|
|
return mixture, design, responses
|
|
except (FileNotFoundError, json.JSONDecodeError, KeyError):
|
|
return Mixture(), ExperimentDesign(), []
|
|
|
|
def save_project_partial(filename: str = PROJECT_FILENAME, mixture=None, design=None, responses=None):
|
|
"""
|
|
Сохраняет только переданные части проекта, остальные загружаются из существующего файла.
|
|
Используется для точечного сохранения (например, только смеси).
|
|
"""
|
|
cur_mixture, cur_design, cur_responses = load_project(filename)
|
|
if mixture is not None:
|
|
cur_mixture = mixture
|
|
if design is not None:
|
|
cur_design = design
|
|
if responses is not None:
|
|
cur_responses = responses
|
|
data = {
|
|
"mixture": cur_mixture.to_dict(),
|
|
"design": cur_design.to_dict(),
|
|
"responses": cur_responses
|
|
}
|
|
with open(filename, "w", encoding="utf-8") as f:
|
|
json.dump(data, f, ensure_ascii=False, indent=4)
|