Доработка. Функция поиска пересечений частот для ЭМС.

This commit is contained in:
Vika
2026-03-26 14:57:53 +03:00
parent 1cb3985c70
commit fb7853a5be

View File

@@ -108,6 +108,7 @@ func on_data_received(data: Dictionary, nm: StringName):
var indexes: = cnames_table[nm] # Идексы строк в таблице
map_yems_data_to_table(unit_data, ctable, indexes)
map_yems_data_to_scale(unit_data, claster_scale)
#var yems_data_info1 = {}
var inters: = find_inters(yems_data_info)
map_inters_to_matrix(inters, $'матрица')
@@ -148,35 +149,59 @@ func map_yems_data_to_table(unit_data: Dictionary, ctable: GDTable, indexes: Dic
func find_inters(info: Dictionary) -> Array:
# info - словарь, его структура
# {
# "устройство": # имя устройства ("эмс-ор63")
# [
# {
# cname, # имя кластера ("Кластер-0")
# wfb, # ширина диапазона, МГЦ (800.0)
# cfb, # центр диапазона, МГЦ (2000.0)
# txe, # передатчик включен
# rxe # передатчик выключен
# },
# {
# cname, # имя кластера ("Кластер-1")
# wfb, # ширина диапазона, МГЦ (200.0)
# cfb, # центр диапазона, МГЦ (1000.0)
# txe, # передатчик включен
# rxe # передатчик выключен
# },
# ]
# }
var result = []
var all_clusters = []
# Собираем все кластеры из всех устройств в один массив
for nm in info:
# nm - имя устройства
var unit_data = info[nm]
if not unit_data: continue
for cls in unit_data.mcls:
# cls - один кластер
print_debug([cls.cname, cls.wfb, cls.cfb, cls.txe, cls.rxe])
# Добавлена проверка для совместимости
var clusters = unit_data if unit_data is Array else unit_data.mcls
# cls - один кластер
for cls in clusters:
var cfb = float(cls.cfb)
var wfb = float(cls.wfb)
# расчёт границ частотных диапазонов
var freq_min1 = cfb - wfb / 2.0
var freq_max1 = cfb + wfb / 2.0
all_clusters.append([nm, cls.cname, freq_min1, freq_max1, cls.txe, cls.rxe])
print([nm, cls.cname, freq_min1, freq_max1, cls.txe, cls.rxe])
for i in all_clusters.size():
var cl1 = all_clusters[i]
var dev1 = cl1[0]
var name1 = cl1[1]
var min1 = cl1[2]
var max1 = cl1[3]
var txe1 = cl1[4]
var rxe1 = cl1[5]
# Сравниваем текущий кластер со всеми последующими, чтобы избежать дублей и самопересечений
for j in range(0, all_clusters.size()):
var cl2 = all_clusters[j]
var dev2 = cl2[0]
var name2 = cl2[1]
var min2 = cl2[2]
var max2 = cl2[3]
var txe2 = cl2[4]
var rxe2 = cl2[5]
#Если нет пары 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 [['эмс-ор63', 'эмс-ор63', 'Кластер-0', 'Кластер-0', 1600.0, 2400.0]]
return result
## Отображает кластеры на шкале