From 336ae30eaf98614eaf0943d05c622710ddf602b1 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 1 Oct 2025 12:13:44 +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.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=B5=D1=82=D0=B0=20=D0=BE?= =?UTF-8?q?=D1=82=20=D0=9A=D0=90=D0=9F=D0=A1=D0=A0=D0=9F=D0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/diagram/diagram.gd | 50 ++++++++++++++++++++++++++++++++------- scripts/interfer.gd | 28 +++++++++++++--------- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/scenes/diagram/diagram.gd b/scenes/diagram/diagram.gd index 1ba8af5f..e8280394 100644 --- a/scenes/diagram/diagram.gd +++ b/scenes/diagram/diagram.gd @@ -37,14 +37,48 @@ func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', va ## Добавляет сектор запрета[br] -## [param fc] - Центральная частота[br] -## [param fw] - Ширина диапазона[br] -## [param ac] - Угол центра[br] -## [param aw] - Ширина по углу[br] -func add_seczap(id: int, fc: float, fw: float, ac: float, aw: float): - var sec_zap = SecZap.instantiate() - sec_zap.name = 'SECZAP%d' % id - add_child(sec_zap) +## [param id] - Индекс сектора запрета.[br] +## [param szv.x] - Центральная частота (198...546).[br] +## [param szv.w] - Ширина диапазона (198...546).[br] +## [param szv.y] - Угол центра (0...360).[br] +## [param szv.z] - Ширина по углу (0...360).[br] +func add_seczap(id: int, szv: Vector4): + var seczap: = SecZap.instantiate() + seczap.name = StringName('SECZAP%d' % id) + seczap.position = $строб.position + seczap.set_instance_shader_parameter('dir', szv.y - 90.0) + seczap.set_instance_shader_parameter('width', szv.z) + seczap.set_instance_shader_parameter('band', sv(szv.w)) + seczap.set_instance_shader_parameter('radius', sv(szv.x)) + add_child(seczap) + + +## Удаляет сектор запрета[br] +## [param id] - Индекс сектора запрета[br] +func remove_seczap(id: int): + var seczap: = get_node_or_null('SECZAP%d' % id) + if not seczap: return + remove_child(seczap) + seczap.queue_free() + + +## Изменяет сектор запрета[br] +## [param id] - Индекс сектора запрета[br] +## [param szv.x] - Центральная частота[br] +## [param szv.w] - Ширина диапазона[br] +## [param szv.y] - Угол центра[br] +## [param szv.z] - Ширина по углу[br] +func set_seczap(id: int, szv: Vector4): + var seczap: = get_node('SECZAP%d' % id) + seczap.set_instance_shader_parameter('dir', szv.y) + seczap.set_instance_shader_parameter('width', szv.z) + seczap.set_instance_shader_parameter('band', sv(szv.w)) + seczap.set_instance_shader_parameter('radius', sv(szv.x)) + + +func set_seczap_color(id: int, color: Color): + var seczap: = get_node('SECZAP%d' % id) + seczap.set_instance_shader_parameter('color', color) func set_view_mode(val: int): diff --git a/scripts/interfer.gd b/scripts/interfer.gd index eae4f65a..f32db08f 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -154,7 +154,6 @@ func on_full_auto() -> void: auto_enabled = true func _ready() -> void: - var ecms: Dictionary = {} ## Словарь помех. for i in ID_INTERFERS_LEN: # Заполняет массив ID целей id_array.append(i + 1) var unit_caps = network.get_unit_instance('уарэп-капсрпб') @@ -162,9 +161,11 @@ func _ready() -> void: var timer_check_state: = Timer.new() add_child(timer_check_state) var resend_timeout = ProjectSettings.get_setting('application/interfer/resend_timeout', 1000.0) + var ecms: Dictionary = {} ## Словарь помех. + var seczaps: Dictionary = {} ## Словарь секторов запрета timer_check_state.connect('timeout', Callable(self, 'on_timer_check_state').bind(unit_caps, ecms, resend_timeout)) timer_check_state.start(resend_timeout / 1000.0) - unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms)) + unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms, seczaps)) unit_5p28.connect('get_interfers', Callable(self, 'on_get_interfers').bind(unit_5p28, ecms)) signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit_caps, ecms)) signaller.connect('interfer_rcv', Callable(self, 'on_interfer_rcv').bind(unit_5p28, ecms)) @@ -238,12 +239,12 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v ## Производит приём состояния помех. [param unit] -> [param ecms]. -func on_data_capsrpb_received(unit_instance: capsrpb.CapsRpb, ecms: Dictionary) -> void: - if not unit_instance.json_dic.has('ts'): return - if not (unit_instance.json_dic['ts'] is float): return - if unit_instance.json_dic['ts'] != 5: return +func on_data_capsrpb_received(unit_instance: capsrpb.CapsRpb, ecms: Dictionary, seczaps: Dictionary) -> void: + if not unit_instance.json_dic.has('ts'): return + if not tools.type_is_num(unit_instance.json_dic['ts']): return + if unit_instance.json_dic['ts'] != 5: return map_msvk_to_ecms(unit_instance, ecms) - map_mpchf_to_view(unit_instance) + map_mpchf_to_seczaps(unit_instance, seczaps) ## Извлекает массив состояний выполнения команды @@ -270,11 +271,16 @@ func map_msvk_to_ecms(unit_instance: unit.Unit, ecms: Dictionary): ## Извлекает массив пространственно-частотных фильтров -func map_mpchf_to_view(unit_instance: unit.Unit): - var json_dic = unit_instance.json_dic - if not json_dic.has('mpchf'): return - var mpchf = json_dic['mpchf'] +func map_mpchf_to_seczaps(unit_instance: unit.Unit, seczaps: Dictionary): + var json_dic: = unit_instance.json_dic as Dictionary + var mpchf = json_dic.get('mpchf', []) if mpchf is not Array: return + for item in mpchf: + if item is not Dictionary: continue + var id = item.get('index', -1) + if id < 0: continue + var freq = item.get('freq', 0) + if freq == 0: continue ## Вызыватся, когда пользователь выбрал помеху и выбраны цели.