Доработка. Теперь пути загрузки сцен управляются редактором

This commit is contained in:
sasha80
2026-01-28 13:53:50 +03:00
parent 23acb2703e
commit 416e93c4e4
6 changed files with 112 additions and 77 deletions

View File

@@ -1,28 +1,28 @@
class_name PRDConfigManager
extends RefCounted
## Менеджер конфигурации для системы контроля ПРД
## Загружает и управляет настройками из JSON-конфигурации
## Менеджер конфигурации для системы контроля ПРД.
## Загружает и управляет настройками из JSON-конфигурации.
#region CONSTANTS
const CONFIG_PATH = "user://config/setting_prd_control.json"
const DEFAULT_CONFIG_PATH = "res://config/setting_prd_control.json"
const CONFIG_VERSION = "1.0.0" # Версия конфигурации - увеличивать при изменениях
const CONFIG_PATH = 'user://config/setting_prd_control.json'
const DEFAULT_CONFIG_PATH = 'res://config/setting_prd_control.json'
const CONFIG_VERSION = '1.0.0' # Версия конфигурации - увеличивать при изменениях
#endregion
#region PRIVATE_VARIABLES
var _config_data: Dictionary # Все данные конфигурации
var _device_constants: Dictionary # Константы устройств
var _base_configs: Dictionary # Базовые конфигурации
var _device_configs: Dictionary # Конфигурации устройств
var _data_indices: Dictionary # Индексы данных
var _fs_keys: Dictionary # Ключи ФС (функциональных систем)
var _temperature_constants: Dictionary # Константы температуры
var _ems_input_bits_config: Dictionary # Конфигурация битов ввода ЭМС
var _fs_rules: Array # Правила ФС
var _config_data: Dictionary ## Все данные конфигурации
var _device_constants: Dictionary ## Константы устройств
var _base_configs: Dictionary ## Базовые конфигурации
var _device_configs: Dictionary ## Конфигурации устройств
var _data_indices: Dictionary ## Индексы данных
var _fs_keys: Dictionary ## Ключи ФС (функциональных систем)
var _temperature_constants: Dictionary ## Константы температуры
var _ems_input_bits_config: Dictionary ## Конфигурация битов ввода ЭМС
var _fs_rules: Array ## Правила ФС
var _is_loaded: bool = false # Флаг успешной загрузки
var _current_version: String = "" # Текущая версия загруженной конфигурации
var _is_loaded: bool = false ## Флаг успешной загрузки
var _current_version: String ## Текущая версия загруженной конфигурации
#endregion
#region INITIALIZATION
@@ -101,27 +101,27 @@ func _load_configuration() -> void:
var parse_result = json.parse(json_text)
if parse_result == OK:
_config_data = json.data
_current_version = _config_data.get("config_version", "0.0.0")
_current_version = _config_data.get('config_version', '0.0.0')
_parse_config_data()
_is_loaded = true
else:
push_error("Ошибка разбора JSON конфигурации: " + json.get_error_message())
push_error('Ошибка разбора JSON конфигурации: ' + json.get_error_message())
_is_loaded = false
else:
push_error("Ошибка загрузки файла конфигурации: " + CONFIG_PATH)
push_error('Ошибка загрузки файла конфигурации: ' + CONFIG_PATH)
_is_loaded = false
## Парсит данные конфигурации по секциям
func _parse_config_data() -> void:
_device_constants = _convert_numbers(_config_data.get("device_constants", {}))
_base_configs = _convert_numbers(_config_data.get("base_configs", {}))
_device_configs = _convert_numbers(_config_data.get("device_configs", {}))
_data_indices = _convert_numbers(_config_data.get("data_indices", {}))
_fs_keys = _convert_numbers(_config_data.get("fs_keys", {}))
_temperature_constants = _convert_numbers(_config_data.get("temperature_constants", {}))
_ems_input_bits_config = _convert_numbers(_config_data.get("ems_input_bits_config", {}))
_fs_rules = _convert_numbers(_config_data.get("fs_rules", []))
_device_constants = _convert_numbers(_config_data.get('device_constants', {}))
_base_configs = _convert_numbers(_config_data.get('base_configs', {}))
_device_configs = _convert_numbers(_config_data.get('device_configs', {}))
_data_indices = _convert_numbers(_config_data.get('data_indices', {}))
_fs_keys = _convert_numbers(_config_data.get('fs_keys', {}))
_temperature_constants = _convert_numbers(_config_data.get('temperature_constants', {}))
_ems_input_bits_config = _convert_numbers(_config_data.get('ems_input_bits_config', {}))
_fs_rules = _convert_numbers(_config_data.get('fs_rules', []))
## Конвертирует числовые значения в правильные типы (float -> int если возможно)
@@ -149,7 +149,7 @@ static func _convert_numbers(value):
## Создает папку и копирует дефолтный файл если нужно
func _ensure_config_exists() -> bool:
# Создаем папку конфигурации если не существует
DirAccess.make_dir_recursive_absolute("user://config")
DirAccess.make_dir_recursive_absolute('user://config')
# Проверяем, нужно ли обновить конфигурацию
if _should_update_config():
@@ -181,7 +181,7 @@ func _should_update_config() -> bool:
var json = JSON.new()
if json.parse(json_text) == OK:
var existing_version = json.data.get("config_version", "0.0.0")
var existing_version = json.data.get('config_version', '0.0.0')
# Сравниваем версии
return _compare_versions(existing_version, CONFIG_VERSION) < 0
else:
@@ -194,8 +194,8 @@ func _should_update_config() -> bool:
## Сравнивает две версии (semantic versioning)
## Возвращает -1 если version1 < version2, 0 если равны, 1 если version1 > version2
static func _compare_versions(version1: String, version2: String) -> int:
var v1_parts = version1.split(".")
var v2_parts = version2.split(".")
var v1_parts = version1.split('.')
var v2_parts = version2.split('.')
for i in range(max(v1_parts.size(), v2_parts.size())):
var v1_part = int(v1_parts[i]) if i < v1_parts.size() else 0
@@ -213,9 +213,8 @@ static func _compare_versions(version1: String, version2: String) -> int:
func _update_config() -> bool:
# Создаем резервную копию старой конфигурации
if FileAccess.file_exists(CONFIG_PATH):
var backup_path = CONFIG_PATH + ".backup_v" + _current_version
var backup_path = CONFIG_PATH + '.backup_v' + _current_version
DirAccess.copy_absolute(CONFIG_PATH, backup_path)
print("Создана резервная копия: ", backup_path)
# Копируем актуальную конфигурацию
return _copy_default_config()
@@ -224,13 +223,13 @@ func _update_config() -> bool:
## Копирует дефолтную конфигурацию в user директорию
func _copy_default_config() -> bool:
if not FileAccess.file_exists(DEFAULT_CONFIG_PATH):
push_error("Дефолтный файл конфигурации не найден: " + DEFAULT_CONFIG_PATH)
push_error('Файл конфигурации не найден: ' + DEFAULT_CONFIG_PATH)
return false
var src := FileAccess.open(DEFAULT_CONFIG_PATH, FileAccess.READ)
var dst := FileAccess.open(CONFIG_PATH, FileAccess.WRITE)
if src == null or dst == null:
push_error("Ошибка копирования конфигурации")
push_error('Ошибка копирования конфигурации')
return false
dst.store_string(src.get_as_text())