From f41c0ee75c9dd060af2354c1f5dbec0a7bc7d589 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 31 Mar 2026 11:30:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/эмс-тг/эмс-тг.gd | 84 +++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/scenes/эмс-тг/эмс-тг.gd b/scenes/эмс-тг/эмс-тг.gd index 2bd32703..b26b9819 100644 --- a/scenes/эмс-тг/эмс-тг.gd +++ b/scenes/эмс-тг/эмс-тг.gd @@ -1,6 +1,8 @@ @tool extends Panel +## Выполнение функций информационного ЭМС (ЭМС-ТГ) + #region Определяемое при использовании ## Индекс -> Имя устройства. Нужен для предсказуемого ## порядка отображения: верх->вниз или лево->право. @@ -53,11 +55,8 @@ var table_cell_row: Array var yems_info: Dictionary[StringName, Dictionary] ## Доклады var yems_cmd: Dictionary[StringName, Dictionary] ## Команды ## Порядок следования кластеров в таблице. -## {имя_устройства: { имя_кластера: индекс_в_таблице } } +## {имя_устройства: {имя_кластера: индекс_в_таблице}} var cnames_table: Dictionary[StringName, Dictionary] -## Порядок следования кластеров на шкале. -## {имя_устройства: { индекс_на_шкале } } -var pnames_scale: Dictionary[StringName, int] ## Текущее выбранное оператором устройство на шкале var selected_unit: Dictionary[StringName, bool] ## Состояния кластеров в соответствии с докладами и командами @@ -79,7 +78,8 @@ enum ClasterMode { } -## Состояние кластера. Значения должны соответствовать состояниям [b]six-state-button[/b] +## Состояние кластера. Значения должны соответствовать +## состояниям [b]six-state-button[/b] enum ClasterResult { WAITING = 0, ## Ожидание даннных DONE = 1, ## Выполнено @@ -129,8 +129,8 @@ func _ready() -> void: 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_header_property(column_cmd_rx, 'image_file', image_file_rx) + ctable.set_header_property(column_cmd_tx, '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) @@ -139,6 +139,7 @@ func _ready() -> void: ## Вызывается при выборе оператором устройства на шкале +## [param val] - состояние кнопки переключателя устройств ## [param nm] - имя выбранного устройства func _on_scale_selected(val: bool, nm: StringName): selected_unit[nm] = val @@ -157,12 +158,13 @@ func _on_scale_selected(val: bool, nm: StringName): var indexes = cnames_table[nm] update_cvi(nm) var new_indexes = update_indexes(unit_info, indexes) - update_table(new_indexes, ctable, unit_info) + update_table(unit_info, ctable, new_indexes) map_yems_info_to_table(unit_info, ctable, indexes) - connect_cmd_handlers(new_indexes, ctable, nm) + connect_cmd_handlers(nm, ctable, new_indexes) ## Обновляет состояние выполнения команды оператора +## [param nm] - имя устройства func update_cvi(nm: StringName): var unit_info = yems_info[nm] var unit_cmd = yems_cmd[nm] @@ -188,10 +190,10 @@ func update_cvi(nm: StringName): ## Подключает обработчики команд к таблице кластеров +## [param nm] - имя устройства ## [param new_indexes] - новые индексы рядов таблицы ## [param cls_table] - таблица для отображения кластеров -## [param nm] - имя устройства -func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName): +func connect_cmd_handlers(nm: StringName, ctable: GDTable, new_indexes: Array): for icls in new_indexes: var i_row = icls[0] # Имя устройства и имя кластера @@ -204,6 +206,7 @@ func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName): node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'txe')) +## Вызывается при перключении оператором разрешений func _on_user_cmd(val: bool, nm: StringName, cname: String, param_name: StringName): var unit_cmd = yems_cmd[nm] if cname in unit_cmd: @@ -213,30 +216,35 @@ func _on_user_cmd(val: bool, nm: StringName, cname: String, param_name: StringNa ## Обрабатывает событие [b]data_received[/b] +## [param data] - данные принятые от устройства +## [param nm] - имя устройства func on_data_received(data: Dictionary, nm: StringName): set_timeouts(nm, data) var unit_info: = yems_info[nm] unit_info_merge(unit_info, data) if not unit_info: + # для устройства нет данных return var ctable: GDTable = $'таблица/сетка' - var claster_scale: = name_to_scale[nm] as GridContainer - var indexes: = cnames_table[nm] # Индексы строк в таблице + var cscale: = name_to_scale[nm] as GridContainer # Шкала устройства + var indexes: = cnames_table[nm] # Индексы строк устройства в таблице update_cvi(nm) + # Если текущее устройство отображается в таблице, + # обновить таблицу новыми данными if selected_unit[nm]: var new_indexes = update_indexes(unit_info, indexes) - update_table(new_indexes, ctable, unit_info) + update_table(unit_info, ctable, new_indexes) map_yems_info_to_table(unit_info, ctable, indexes) - connect_cmd_handlers(new_indexes, ctable, nm) - map_yems_info_to_scale(unit_info, claster_scale) - var inters: = find_inters(yems_info) + connect_cmd_handlers(nm, ctable, new_indexes) + map_yems_info_to_scale(unit_info, cscale) + var inters: = find_inters() reset_matrix() map_inters_to_matrix(inters, $'матрица') cmd_to_unit(nm) ## Создаёт новые ряды в таблице -func update_table(new_indexes: Array, ctable: GDTable, unit_info: Dictionary): +func update_table(unit_info: Dictionary, ctable: GDTable, new_indexes: Array): # Добавить новые ряды. Два прохода нужно для того, # что порядок элементов в словаре не определён. for icls in new_indexes: @@ -254,7 +262,8 @@ func update_table(new_indexes: Array, ctable: GDTable, unit_info: Dictionary): ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe) -func update_indexes(unit_info, indexes) -> Array: +## Обновляет индексы строк в таблице +func update_indexes(unit_info: Dictionary, indexes: Dictionary) -> Array: var new_indexes: = [] for cls in unit_info.mcls: # Проверить, есть ли уже такой индекс @@ -356,7 +365,9 @@ func map_inters_to_matrix(inters: Array, matrix: GridContainer) -> void: ## Отображает кластеры в таблицу -## [param nm] - имя устройства +## [param unit_info] - доклад от устройства +## [param ctable] - таблица +## [param indexes] - индексы в таблице func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dictionary): # Обойти все кластеры устройства for cls in unit_info.mcls: @@ -372,16 +383,17 @@ func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dic ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe) -## Находит пересечения диапазонов -func find_inters(info: Dictionary) -> Array: +## Находит пересечения диапазонов всех устройств и кластеров +func find_inters() -> Array: var result = [] var all_clusters = [] # Собираем все кластеры из всех устройств в один массив - for nm in info: + for nm in yems_info: # nm - имя устройства - var unit_data = info[nm] + var unit_data = yems_info[nm] if not unit_data: continue - var clasters = unit_data.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING) + var clasters = unit_data.mcls.filter \ + (func(c): return c.status == ClasterStatus.RUNNING) for cls in clasters: # cls - один кластер var cfb = float(cls.cfb) @@ -399,8 +411,8 @@ func find_inters(info: Dictionary) -> Array: var max1 = cl1[3] var txe1 = cl1[4] var rxe1 = cl1[5] - - # Сравниваем текущий кластер со всеми последующими, чтобы избежать дублей и самопересечений + # Сравниваем текущий кластер со всеми последующими, + # чтобы избежать дублей и самопересечений for j in all_clusters.size(): var cl2 = all_clusters[j] var dev2 = cl2[0] @@ -409,26 +421,24 @@ func find_inters(info: Dictionary) -> Array: var max2 = cl2[3] var txe2 = cl2[4] var rxe2 = cl2[5] - - #Если нет пары TR(RT) то пропускаем эту комбинацию + # Если нет пары TR(RT) то пропускаем эту комбинацию if not ((txe1 and rxe2) or (rxe1 and txe2)): continue - - # Проверка на пересечение диапазонов, пересечение есть если начало одного диапазона меньше конца другого + # Проверка на пересечение диапазонов, пересечение + # есть если начало одного диапазона меньше конца другого if max1 > min2 and max2 > min1: #Вычисляем точные границы пересечения var inter_start = max(min1, min2) var inter_end = min(max1, max2) - # Формируем результат в требуемом формате result.append([dev1, dev2, name1, name2, inter_start, inter_end]) - # заглушка для возвращаемых данных return result ## Отображает кластеры на шкале -## [param nm] - имя устройства -func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer): +## [param unit_info] - доклад устройства +## [param cscale] - шкала кластера +func map_yems_info_to_scale(unit_info: Dictionary, cscale: GridContainer): # Обойти все кластеры устройства for cls in unit_info.mcls: # Преобразовать диапазоны частот в диапазоны отображения @@ -440,9 +450,9 @@ func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer) var l: = clampf(c - w, 0.0, 1.0) var h: = clampf(c + w, 0.0, 1.0) # Получить шкалу приёмника - var scale_rx: = claster_scale.get_node('panel_rx') + var scale_rx: = cscale.get_node('panel_rx') # Получить шкалу передатчика - var scale_tx: = claster_scale.get_node('panel_tx') + var scale_tx: = cscale.get_node('panel_tx') # Диапазон работает (информация обновляется) if cls.status == ClasterStatus.RUNNING: # Отобразить диапазон приёмника, в соответствии с разрешением