From cee75d02cfe3a77b8c084bcd3fae4f7946f6c567 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 13 Nov 2025 13:17:18 +0300 Subject: [PATCH] =?UTF-8?q?[PATCH]=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9A=D0=BE=D0=BB=D0=BE=D0=BD=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD=D0=BA=D1=80=D0=B5=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=86=D0=B5=D0=BB=D0=B8.=20(=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B5=20"=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B8=D1=81=D1=81=D0=B8=D0=B8")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/scroll-ecm-list.gd | 3 +- scenes/frame-threats/emit-led.tscn | 23 +++++ scenes/frame-threats/frame-threats.tscn | 2 +- scenes/frame-threats/scroll-threats.gd | 40 ++++++-- scenes/работа/работа.gd | 2 + scripts/interfer.gd | 119 ++++++++--------------- scripts/threats.gd | 2 + 7 files changed, 104 insertions(+), 87 deletions(-) create mode 100644 scenes/frame-threats/emit-led.tscn diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 23f9d4c..8ad0a9f 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -122,7 +122,8 @@ func on_interfer_new(ecm, table_index): # Будем надеяться, что отложенные вызовы производятся в том же порядке $table.call_deferred('clear_rows_selected') $table.call_deferred('set_row_selected', i_row, true) - signaller.emit_signal('interfer_selected', ecm) + if not interfer.auto_enabled: + signaller.emit_signal('interfer_selected', ecm) func on_interfer_off(ecm, table_index): diff --git a/scenes/frame-threats/emit-led.tscn b/scenes/frame-threats/emit-led.tscn new file mode 100644 index 0000000..da69917 --- /dev/null +++ b/scenes/frame-threats/emit-led.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"] + +[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"] + +[node name="emit-led" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="texture-led" type="TextureButton" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 26.0 +offset_top = 11.0 +offset_right = 3.0 +offset_bottom = -12.0 +grow_horizontal = 2 +grow_vertical = 2 +texture_normal = ExtResource("1_0a4l0") diff --git a/scenes/frame-threats/frame-threats.tscn b/scenes/frame-threats/frame-threats.tscn index e357f45..f3cba68 100644 --- a/scenes/frame-threats/frame-threats.tscn +++ b/scenes/frame-threats/frame-threats.tscn @@ -35,5 +35,5 @@ script = ExtResource("2_empn3") [node name="table" type="GridContainer" parent="scroll"] layout_mode = 2 -columns = 4 +columns = 5 script = ExtResource("3_4bupu") diff --git a/scenes/frame-threats/scroll-threats.gd b/scenes/frame-threats/scroll-threats.gd index 50cf2bd..d20ef2d 100644 --- a/scenes/frame-threats/scroll-threats.gd +++ b/scenes/frame-threats/scroll-threats.gd @@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы. const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. +const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы. +const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. +const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда. +const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице. +const TABLE_HEADERS_TEXT = ['№', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы. +const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок. -const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка. -const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда. -const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице. -const TABLE_HEADERS_TEXT = ['№', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы. -const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок. - +const TABLE_TEXT_ROWS = 4 +const EMIT_STATE_COL = 4 ## Снимает выделение цели. func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() @@ -63,6 +65,17 @@ func on_threat_update(th, table_index: Dictionary): var row = map_th_to_row(th) var i_row = table_index[th.id] $table.set_row_text(i_row, row) + var emit_node = $table.get_node2(EMIT_STATE_COL, i_row) + var emit_txr = emit_node.get_node('texture-led') + if th.emit_state == 0: + emit_txr.visible = false + elif th.emit_state == 1: + emit_txr.visible = true + emit_txr.self_modulate = Color.ORANGE + elif th.emit_state == 2: + emit_txr.visible = true + emit_txr.self_modulate = Color.RED + ## Обрабатывает сигнал [b]threat_lost[/b]. @@ -78,7 +91,7 @@ func on_threat_new(th, table_index): $table.add_row(TABLE_ROW) var row = map_th_to_row(th) $table.set_row_text(i_row, row) - $table.set_row_editable(i_row, false) + disable_edit($table, TABLE_TEXT_ROWS, i_row) $table.set_node_user_data(0, i_row, th) table_index[th.id] = i_row @@ -86,10 +99,11 @@ func on_threat_new(th, table_index): ## Преобразует цель в строку таблицы. func map_th_to_row(th) -> Array: var row: = Array() - row.resize(TABLE_COLUMN_PARAM.size()) + row.resize(TABLE_TEXT_ROWS) var i_col: int = 0 for param_name in TABLE_COLUMN_PARAM: var val = th.get(param_name) + if val == null: continue row[i_col] = '%0.1f' % val if val is float else '%s' % val if not th.fflags[param_name]: row[i_col] = '' @@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl): if node.text.to_int() == th_id: row_pressed(i) break + + +## Отключает возможность редактирования LineEdit в таблице.[br] +## [param tbl] - таблица,[br] +## [param num_col] - номер колонки,[br] +## [param i_row] - номер столбца.[br] +func disable_edit(tbl, num_col: int, i_row: int): + for col in num_col: + var node: LineEdit = tbl.get_node2(col, i_row) + node.editable = false diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 99f62b4..138a110 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -589,6 +589,8 @@ func on_btn_center_toggled(toggled_on: bool) -> void: func on_btn_activate_toggled(toggled_on: bool) -> void: $btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено') signaller.emit_signal('emit_changed', toggled_on) + if not toggled_on: + $btn_activate.self_modulate = Color.WHITE func on_update_coordinates_label(coordinates_label) -> void: diff --git a/scripts/interfer.gd b/scripts/interfer.gd index dde7b84..e9db401 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -257,15 +257,28 @@ func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void: func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void: gos_nmfs.clear() for thr in threats.values(): - if not gos_flag: # Составляется список запретных секторов работы - if (thr.proto in gos_protocols) and thr.fflags.proto: - var fs_arr: Array = [] - var th_aoa = fposmod(thr.aoa - course, 360) - prd.find_fs_index(th_aoa, thr.freq, fs_arr) - if fs_arr.size(): - for item in fs_arr: - var nmfs = prd.FS_PRD[item][1] - gos_nmfs.append(nmfs) + var fs_arr: Array = [] + var th_aoa = fposmod(thr.aoa - course, 360) + prd.find_fs_index(th_aoa, thr.freq, fs_arr) + if fs_arr.size(): + for item in fs_arr: + var nmfs = prd.FS_PRD[item][1] + thr.nmfs = nmfs + if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag): + gos_nmfs.append(nmfs) + + thr.emit_state = 0 + for ecm in ecms.values(): + if thr.nmfs == ecm.nmfs: + set_th_emit(thr, ecm) + var ecm_active = true + if not gos_flag: + if ecm.nmfs in gos_nmfs: + interfer_off(ecm, unit_instance) + ecm_active = false + if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): + interfer_off(ecm, unit_instance) + var th_id = thr.id for ecm_i in thrs.keys(): if thrs[ecm_i] == th_id: @@ -282,19 +295,6 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v signaller.emit_signal('fs_update_color', ecms) prd.update_fs_state(ecms, trenazh_mode) - - for ecm in ecms.values(): - var ecm_active = true - if not gos_flag: - if ecm.nmfs in gos_nmfs: - interfer_off(ecm, unit_instance) - ecm_active = false - if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): - interfer_off(ecm, unit_instance) - - if not auto_enabled: - return - if auto_enabled: for thr in threats.values(): var fs_arr: Array = [] @@ -454,12 +454,12 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf ecm = Interfer.new() ecm.ispp = ispp ecms[ispp] = ecm + ecm.modulation = emit_enable ecm.kni = kni ecm.krp = interfer_name ecm.params = param ecm.powp = power ecm.source_interfer = source_interfer - ecm.modulation = emit_enable ecm.um = param.get('um', 15.0) # Значение по умолчанию call_ecm_proc(ecm) var set_nmfs_ok = set_nmfs(ecm) @@ -477,7 +477,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf func send_ecm(ecm, unit0) -> void: if ecm.krp != INTERFER_OFF: - if not emit_enable: + if not ecm.modulation: ecm.svk = 0 call_deferred('emit_signal', 'interfer_update', ecm) return @@ -512,8 +512,10 @@ func push_id(id: int) -> void: id_array.sort() -func on_emit_changed(state, _ecms) -> void: +func on_emit_changed(state, ecms) -> void: emit_enable = state + for ecm in ecms.values(): + ecm.modulation = state func call_all_diap(ecm, ecm_params: Dictionary): @@ -576,58 +578,8 @@ func on_threats_update(threat, ecms, unit_caps): if ecm.kni < 0: ecm.kni += 360 set_nmfs(ecm) - if threat.tmod != 'fm': - if ecm != null: - send_ecm(ecm, unit_caps) - return - var th_fm_dict: Dictionary - var fs_index_arr: Array - prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr) - if fs_index_arr.size() == 0: - if ecm != null: - send_ecm(ecm, unit_caps) - return - var fs_index = fs_index_arr[0] - var nmfs = prd.FS_PRD[fs_index][1] - if ecm == null: - for ecm_i in ecms.values(): - if nmfs != ecm_i.nmfs: continue - if ecm_i.svk != 1: continue - ecm = ecm_i - if ecm == null: return - - for th_index in thrs_dict: - if thrs_dict[th_index].tmod != 'fm': continue - fs_index_arr = [] - prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr) - if fs_index_arr.size() == 0: continue - if fs_index_arr[0] != fs_index: continue - th_fm_dict[th_index] = thrs_dict[th_index] - if len(th_fm_dict) > 1: - pass - send_ecm(ecm, unit_caps) - - -func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary): - for key_i in th_dict: - var min_range: int = 6000 - var key_min = null - for key_j in th_dict: - if key_i == key_j: continue - var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2) - var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width - if freq_range < min_range: - key_min = key_j - min_range = freq_range - var max_width = 0 - for key in PDCHM_PARAMS['files'].keys(): - if max_width < key: max_width = key - if min_range > max_width: - th_dict.erase(key_i) - continue - else: - if key_min == null: continue - freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range] + if ecm != null: + send_ecm(ecm, unit_caps) func find_threat(freq: int, aoa: float): @@ -713,3 +665,16 @@ func call_ecm_proc(ecm): func on_update_fs_closed(fs_dict): fs_closed = fs_dict + + +func set_th_emit(th: threats.Threat, ecm: Interfer): + var freq_min = ecm.params['freq'] - ecm.params.get('width', settings.WIDTH_MAX)/2 + var freq_max = ecm.params['freq'] + ecm.params.get('width', settings.WIDTH_MAX)/2 + if (th.freq >= freq_min) and (th.freq <= freq_max): + if ecm.svk == 1: + th.emit_state = 2 + elif th.emit_state == 2: + return + else: + th.emit_state = 1 + diff --git a/scripts/threats.gd b/scripts/threats.gd index 28f6dea..5f39f51 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -28,6 +28,8 @@ class Threat: var width: float ## Ширина занимаемого диапазона частот, МГц. var selected: bool ## Флаг, что цель выбрана. var auto_selected: bool = false ## Флаг автомата для целей + var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется + var nmfs:int ## Индекс модуля ФС, в зону действия которого попала цель func _init(): clear_fflags() func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]