Доработка. WIP Отображение кластера в таблице

This commit is contained in:
sasha80
2026-03-19 16:33:29 +03:00
parent 8c4a966654
commit 26bb36a333
2 changed files with 78 additions and 27 deletions

View File

@@ -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)

View File

@@ -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