From 26bb36a3338884719f9c1b7718b96be789f50382 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 19 Mar 2026 16:33:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20WIP=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/эмс-тг/эмс-тг.gd | 95 ++++++++++++++++++++++++++++----------- scenes/эмс-тг/эмс-тг.tscn | 10 ++++- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/scenes/эмс-тг/эмс-тг.gd b/scenes/эмс-тг/эмс-тг.gd index c4b8164d..6a363daa 100644 --- a/scenes/эмс-тг/эмс-тг.gd +++ b/scenes/эмс-тг/эмс-тг.gd @@ -1,57 +1,102 @@ @tool extends Panel +#region Определяемое использованием +## Индекс -> Имя устройства. Нужен для предсказуемого +## порядка отображения: верх->вниз или лево->право. +## Имя устройства должно быть взято из settings.gd +@export var index_to_unit_names: Array[StringName] +#endregion -@export var matrix_conf: Array[Texture] ## [0] - чисто, нет конфликта, [1] - есть наложение частот -@export var index_to_unit_names: Array[StringName] ## Имена устройств (Индекс -> Имя устройства) +#region Загружаемые ресурсы +@export var matrix_conf: Array[Texture] @export_file('*.tscn') var table_headers: Array[String] @export_file('*.tscn') var table_cells: Array[String] @export_file('*.png') var image_file_rx: String @export_file('*.png') var image_file_tx: String +@export var table_rows_hight: int @export var table_column_widths: Array[int] @export var table_header_widths: Array[int] @export var table_header_text: Array[String] -var table_cell_row: Array -var name_to_index: Dictionary[StringName, int] ## Имена устройств (Имя устройства -> Индекс) -var yems_data_info: Dictionary -var yems_data_cmd: Dictionary +#endregion +#region Заполняется автоматически при запуске +var name_to_index: Dictionary[StringName, int] ## Имя устройства -> Индекс +var name_to_scale: Dictionary[StringName, Control] ## Имя устройства -> Шкала +var table_cell_row: Array +#endregion + +#region Заполняется во время работы +var yems_data_info: Dictionary[StringName, Dictionary] ## Доклады +var yems_data_cmd: Dictionary[StringName, Dictionary] ## Команды +## Порядок следования кластеров в таблице. +## {имя_устройства: { имя_кластера: индекс_в_таблице } } +var cnames_table: Dictionary[StringName, Dictionary] +#endregion func _ready() -> void: + # Инициализировать переменные for i in index_to_unit_names.size(): var nm: = index_to_unit_names[i] name_to_index[nm] = i yems_data_info[nm] = {} + cnames_table[nm] = {} + var yems_scales = get_tree().get_nodes_in_group('ряд-шкалы') + for node in yems_scales: + var nm = node.get_meta('unit_name') + name_to_scale[nm] = node + node.connect('pressed', map_yems_data_to_table.bind(nm)) var header_row: = [] for cell_scn in table_headers: header_row.append(load(cell_scn)) for cell_scn in table_cells: table_cell_row.append(load(cell_scn)) - $'таблица/сетка'.set_header(header_row) - $'таблица/сетка'.set_header_text(table_header_text) - $'таблица/сетка'.set_header_property(6, 'image_file', image_file_rx) - $'таблица/сетка'.set_header_property(7, 'image_file', image_file_tx) + # Настрить таблицу + var ctable: = $'таблица/сетка' + ctable.set_header(header_row) + ctable.set_header_text(table_header_text) + ctable.set_header_property(6, 'image_file', image_file_rx) + ctable.set_header_property(7, 'image_file', image_file_tx) + ctable.set_headers_min_size(table_header_widths) + ctable.set_columns_min_size(table_column_widths) + ctable.set_rows_min_hight(table_rows_hight) + ctable.set_header_min_hight(table_rows_hight) + ctable.pin_header2() - $'таблица/сетка'.set_headers_min_size(table_header_widths) - $'таблица/сетка'.set_columns_min_size(table_column_widths) - $'таблица/сетка'.set_rows_min_hight(32) - $'таблица/сетка'.set_header_min_hight(32) - $'таблица/сетка'.pin_header2() - - for nm in index_to_unit_names: + # Подключить обработчики + for nm in yems_data_info.keys(): var yems_unit = network.get_unit_instance(nm) yems_unit.connect('data_received', on_data_received.bind(nm)) -func on_data_received(data, nm): +func on_data_received(data: Dictionary, nm: StringName): yems_data_info[nm].merge(data, true) - map_yems_data() + map_yems_data_to_table(nm) -func map_yems_data(): - var yems_scales = get_tree().get_nodes_in_group('ряд-шкалы') - for node in yems_scales: - var unit_name = node.get_meta('unit_name') - var scale_data = yems_data_info.get(unit_name) - print_debug(scale_data) +## [param nm] - имя устройства +func map_yems_data_to_table(nm: StringName): + var unit_data = yems_data_info.get(nm) + if not unit_data: return # Данных ещё нет + var ctable: GDTable = $'таблица/сетка' + var indexes: = cnames_table[nm] # Идексы строк таблицы для кластеров заданного устройства + var rows_changed: = false + # Обойти все кластеры устройства + for cls in unit_data.mcls: + # Строка для заполнения + var row_text = [cls.cname, 'Активен', '%.1f' % cls.ttl, '%.1f' % cls.daa, '%.1f' % cls.dap, '%.1f' % cls.cfb] + # Если такой кластер уже есть, обновить его строку в таблице + if cls.cname in indexes: + # Получить индекс строки кластера в таблице + var i_row = indexes[cls.cname] + ctable.set_row_text(0, row_text) + # Если такого кластера нет, создать его строку в таблице + else: + # Создать новый ряд + ctable.add_row(table_cell_row) + rows_changed = true + # Записать индекс строки в таблице для кластера + indexes[cls.cname] = indexes.size() + if rows_changed: + ctable.set_rows_min_hight(table_rows_hight) diff --git a/scenes/эмс-тг/эмс-тг.tscn b/scenes/эмс-тг/эмс-тг.tscn index 2ecf61bb..79e5e991 100644 --- a/scenes/эмс-тг/эмс-тг.tscn +++ b/scenes/эмс-тг/эмс-тг.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=31 format=3 uid="uid://musb21x2u0xs"] +[gd_scene load_steps=32 format=3 uid="uid://musb21x2u0xs"] [ext_resource type="Script" uid="uid://bvlqgv7aapebl" path="res://scenes/эмс-тг/эмс-тг.gd" id="1_b7tfl"] [ext_resource type="Texture2D" uid="uid://djv8fkddcjucs" path="res://data/матрица-чисто.png" id="2_s28jr"] @@ -30,6 +30,8 @@ [ext_resource type="Texture2D" uid="uid://cx0f3wcx76u1k" path="res://data/РЛС2.png" id="27_3x2eg"] [ext_resource type="Texture2D" uid="uid://duu8q7sv0jwfh" path="res://data/ННВС.png" id="28_wh3ue"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_niy1n"] + [sub_resource type="ButtonGroup" id="ButtonGroup_vwsbs"] allow_unpress = true @@ -37,12 +39,13 @@ allow_unpress = true offset_top = 35.0 offset_bottom = 35.0 script = ExtResource("1_b7tfl") -matrix_conf = Array[Texture]([ExtResource("2_s28jr"), ExtResource("3_its7t")]) index_to_unit_names = Array[StringName]([&"эмс-ор63", &"эмс-454", &"эмс-го", &"эмс-рлс1", &"эмс-рлс2", &"эмс-ннвс", &"эмс-изделие7", &"эмс-изделие8"]) +matrix_conf = Array[Texture]([ExtResource("2_s28jr"), ExtResource("3_its7t")]) table_headers = Array[String](["uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://cymcld4mjmlhj", "uid://cymcld4mjmlhj"]) table_cells = Array[String](["uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://cixwl6xi22buo", "uid://cixwl6xi22buo"]) image_file_rx = "uid://c6etralq2tvxg" image_file_tx = "uid://c73tjrn8gr00o" +table_rows_hight = 32 table_column_widths = Array[int]([134, 134, 134, 134, 134, 134, 134, 134]) table_header_widths = Array[int]([136, 136, 136, 136, 136, 136, 136, 136]) table_header_text = Array[String](["Кластер", "Состояние", "Время", "Азимут", "Угол места", "Диапазон", "Приём", "Передача"]) @@ -53,6 +56,7 @@ offset_left = 20.0 offset_top = 800.0 offset_right = 1190.0 offset_bottom = 1150.0 +theme_override_styles/focus = SubResource("StyleBoxEmpty_niy1n") draw_focus_border = true vertical_scroll_mode = 2 @@ -118,6 +122,7 @@ size_flags_vertical = 7 toggle_mode = true button_group = SubResource("ButtonGroup_vwsbs") text = "454" +metadata/unit_name = &"эмс-454" [node name="sub1" type="GridContainer" parent="шкала"] layout_mode = 2 @@ -227,6 +232,7 @@ size_flags_vertical = 7 toggle_mode = true button_group = SubResource("ButtonGroup_vwsbs") text = "ННВС" +metadata/unit_name = &"" [node name="sub5" type="GridContainer" parent="шкала"] layout_mode = 2