@tool class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd' @export var prefix_path: String = '' ## Должно быть в JSON @export var this_bpo1_name: String = '' ## Должно быть в JSON @export var this_bpo2_name: String = '' ## Должно быть в JSON @export var unit_name1: StringName = '' ## Должно быть в settings.gd @export var unit_name2: StringName = '' ## Должно быть в settings.gd @export var settings_path1_to_url: String = '' ## Должно быть в ProjectSettings @export var settings_path2_to_url: String = '' ## Должно быть в ProjectSettings @export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings static var json_conv: JSON = JSON.new() static var node_maper = load('res://scenes/контроль/node-maper.gd') var ctrl_pos = 110 var bort_to_node_name = {} var bort_to_unit_name = {} func _ready() -> void: scouting.response_received_bpo_left.connect(_on_response_received_left) scouting.response_received_bpo_right.connect(_on_response_received_right) on_settings_changed() find_labels(self) _on_press_device() func on_settings_changed(): bort_to_node_name.merge({this_bpo1_name: 'grid_bpo_a1', this_bpo2_name: 'grid_bpo_a2'}, true) bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}, true) # Обработка ответа от первого бпо func _on_response_received_left(response: String, success: bool) -> void: if not success: log.error('Ошибка запроса или нет связи (левый): %s' % response) _reset_grid('grid_bpo_a1') return _parse_and_update_ui(response) # Обработка ответа от второго бпо func _on_response_received_right(response: String, success: bool) -> void: if not success: log.error('Ошибка запроса или нет связи (правый): %s' % response) _reset_grid('grid_bpo_a2') return _parse_and_update_ui(response) # Оригинальный парсинг из _on_request_completed func _parse_and_update_ui(json_str: String) -> void: var rc: = json_conv.parse(json_str) if rc != Error.OK: var err = json_conv.get_error_message() push_error('разбор json прерван - %s' % err) return var pp: = [] tools.map_solid_to_array(prefix_path, pp) var ret_val = [null, false, 0] var pp_copy = pp.duplicate(true) tools.get_value_by_path(json_conv.data, pp, ret_val) if not ret_val[1]: push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]]) return var device_name: String = ret_val[0] if not bort_to_node_name.has(device_name): push_error('не известное устройство: %s' % device_name) return var node_name = bort_to_node_name[device_name] var bort_node = get_node(node_name) # Обновляем UI только для конкретного грида for item in bort_node.get_children(): node_maper.map_value_to_item(json_conv.data, item, 'state') # Обновляем групповые индикаторы _update_group_indicators_original() # Оригинальное обновление групповых индикаторов func _update_group_indicators_original() -> void: # Сначала сбрасываем все if has_node('yas_bpo_a1'): $yas_bpo_a1.state = 0 if has_node('yas_bpo_a2'): $yas_bpo_a2.state = 0 if has_node('mod_pit_g1'): $mod_pit_g1.state = 0 # Проверяем обе группы и устанавливаем если есть активные var items = get_tree().get_nodes_in_group('управляется-по-шине-1') for node in items: if node.has_method('get') and node.get('state') == 1: if has_node('yas_bpo_a1'): $yas_bpo_a1.state = 1 break items = get_tree().get_nodes_in_group('управляется-по-шине-2') for node in items: if node.has_method('get') and node.get('state') == 1: if has_node('yas_bpo_a2'): $yas_bpo_a2.state = 1 break items = get_tree().get_nodes_in_group('потребитель-питания') for node in items: if node.has_method('get') and node.get('state') == 1: if has_node('mod_pit_g1'): $mod_pit_g1.state = 1 break # Сброс конкретного грида func _reset_grid(grid_name: String) -> void: if has_node(grid_name): for item in get_node(grid_name).get_children(): _reset_item_value(item) _update_group_indicators_original() # Сброс всех UI элементов в 0 (при отсутствии данных) func _reset_ui_to_zero() -> void: _reset_grid('grid_bpo_a1') _reset_grid('grid_bpo_a2') # Сброс конкретного элемента в 0 func _reset_item_value(item) -> void: if item.has_method('set'): item.set('value0', 0) item.set('value1', 0) item.set('value2', 0) item.set('state', 0) # Отрисовывание при нажатии на прибор func _on_press_device() -> void: # Проверяем левый борт if scouting.has_bpo_left_success(): var response = scouting.get_bpo_left_response() if not response.is_empty(): _parse_and_update_ui(response) else: _reset_grid('grid_bpo_a1') # Проверяем правый борт if scouting.has_bpo_right_success(): var response = scouting.get_bpo_right_response() if not response.is_empty(): _parse_and_update_ui(response) else: _reset_grid('grid_bpo_a2') func find_labels(node1: Node): if node1 is Label: if node1.name in ['lbl_rname', 'rname']: if not node1.has_meta('tooltip_set'): ctrl_pos += 1 var box_number = ceili(float(ctrl_pos) / 10.0) var position_number = ctrl_pos % 10 if position_number == 0: position_number = 10 node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number] node1.mouse_filter = Control.MOUSE_FILTER_STOP node1.set_meta('tooltip_set', true) for child in node1.get_children(): find_labels(child) ## Вызывается при клике мыши на элементе. func _on_item_pressed(block_a: Control): var metas = block_a.get_meta_list() for n in metas: var _v = block_a.get_meta(n)