[PATCH] Доработка. Колонка со статусом выполнения помехи для конкретной цели. (замечание "комиссии")

This commit is contained in:
MaD_CaT
2025-11-13 13:17:18 +03:00
committed by sasha80
parent 4f3f4ff7f8
commit cee75d02cf
7 changed files with 104 additions and 87 deletions

View File

@@ -122,7 +122,8 @@ func on_interfer_new(ecm, table_index):
# Будем надеяться, что отложенные вызовы производятся в том же порядке # Будем надеяться, что отложенные вызовы производятся в том же порядке
$table.call_deferred('clear_rows_selected') $table.call_deferred('clear_rows_selected')
$table.call_deferred('set_row_selected', i_row, true) $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): func on_interfer_off(ecm, table_index):

View File

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

View File

@@ -35,5 +35,5 @@ script = ExtResource("2_empn3")
[node name="table" type="GridContainer" parent="scroll"] [node name="table" type="GridContainer" parent="scroll"]
layout_mode = 2 layout_mode = 2
columns = 4 columns = 5
script = ExtResource("3_4bupu") script = ExtResource("3_4bupu")

View File

@@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы. const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.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_TEXT_ROWS = 4
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда. const EMIT_STATE_COL = 4
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок.
## Снимает выделение цели. ## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() 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 row = map_th_to_row(th)
var i_row = table_index[th.id] var i_row = table_index[th.id]
$table.set_row_text(i_row, row) $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]. ## Обрабатывает сигнал [b]threat_lost[/b].
@@ -78,7 +91,7 @@ func on_threat_new(th, table_index):
$table.add_row(TABLE_ROW) $table.add_row(TABLE_ROW)
var row = map_th_to_row(th) var row = map_th_to_row(th)
$table.set_row_text(i_row, row) $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.set_node_user_data(0, i_row, th)
table_index[th.id] = i_row table_index[th.id] = i_row
@@ -86,10 +99,11 @@ func on_threat_new(th, table_index):
## Преобразует цель в строку таблицы. ## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array: func map_th_to_row(th) -> Array:
var row: = Array() var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size()) row.resize(TABLE_TEXT_ROWS)
var i_col: int = 0 var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM: for param_name in TABLE_COLUMN_PARAM:
var val = th.get(param_name) var val = th.get(param_name)
if val == null: continue
row[i_col] = '%0.1f' % val if val is float else '%s' % val row[i_col] = '%0.1f' % val if val is float else '%s' % val
if not th.fflags[param_name]: if not th.fflags[param_name]:
row[i_col] = '' row[i_col] = ''
@@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl):
if node.text.to_int() == th_id: if node.text.to_int() == th_id:
row_pressed(i) row_pressed(i)
break 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

View File

@@ -589,6 +589,8 @@ func on_btn_center_toggled(toggled_on: bool) -> void:
func on_btn_activate_toggled(toggled_on: bool) -> void: func on_btn_activate_toggled(toggled_on: bool) -> void:
$btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено') $btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено')
signaller.emit_signal('emit_changed', toggled_on) 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: func on_update_coordinates_label(coordinates_label) -> void:

View File

@@ -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: func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
gos_nmfs.clear() gos_nmfs.clear()
for thr in threats.values(): for thr in threats.values():
if not gos_flag: # Составляется список запретных секторов работы var fs_arr: Array = []
if (thr.proto in gos_protocols) and thr.fflags.proto: var th_aoa = fposmod(thr.aoa - course, 360)
var fs_arr: Array = [] prd.find_fs_index(th_aoa, thr.freq, fs_arr)
var th_aoa = fposmod(thr.aoa - course, 360) if fs_arr.size():
prd.find_fs_index(th_aoa, thr.freq, fs_arr) for item in fs_arr:
if fs_arr.size(): var nmfs = prd.FS_PRD[item][1]
for item in fs_arr: thr.nmfs = nmfs
var nmfs = prd.FS_PRD[item][1] if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag):
gos_nmfs.append(nmfs) 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 var th_id = thr.id
for ecm_i in thrs.keys(): for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id: 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) signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms, trenazh_mode) 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: if auto_enabled:
for thr in threats.values(): for thr in threats.values():
var fs_arr: Array = [] 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 = Interfer.new()
ecm.ispp = ispp ecm.ispp = ispp
ecms[ispp] = ecm ecms[ispp] = ecm
ecm.modulation = emit_enable
ecm.kni = kni ecm.kni = kni
ecm.krp = interfer_name ecm.krp = interfer_name
ecm.params = param ecm.params = param
ecm.powp = power ecm.powp = power
ecm.source_interfer = source_interfer ecm.source_interfer = source_interfer
ecm.modulation = emit_enable
ecm.um = param.get('um', 15.0) # Значение по умолчанию ecm.um = param.get('um', 15.0) # Значение по умолчанию
call_ecm_proc(ecm) call_ecm_proc(ecm)
var set_nmfs_ok = set_nmfs(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: func send_ecm(ecm, unit0) -> void:
if ecm.krp != INTERFER_OFF: if ecm.krp != INTERFER_OFF:
if not emit_enable: if not ecm.modulation:
ecm.svk = 0 ecm.svk = 0
call_deferred('emit_signal', 'interfer_update', ecm) call_deferred('emit_signal', 'interfer_update', ecm)
return return
@@ -512,8 +512,10 @@ func push_id(id: int) -> void:
id_array.sort() id_array.sort()
func on_emit_changed(state, _ecms) -> void: func on_emit_changed(state, ecms) -> void:
emit_enable = state emit_enable = state
for ecm in ecms.values():
ecm.modulation = state
func call_all_diap(ecm, ecm_params: Dictionary): func call_all_diap(ecm, ecm_params: Dictionary):
@@ -576,58 +578,8 @@ func on_threats_update(threat, ecms, unit_caps):
if ecm.kni < 0: if ecm.kni < 0:
ecm.kni += 360 ecm.kni += 360
set_nmfs(ecm) set_nmfs(ecm)
if threat.tmod != 'fm': if ecm != null:
if ecm != null: send_ecm(ecm, unit_caps)
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]
func find_threat(freq: int, aoa: float): func find_threat(freq: int, aoa: float):
@@ -713,3 +665,16 @@ func call_ecm_proc(ecm):
func on_update_fs_closed(fs_dict): func on_update_fs_closed(fs_dict):
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

View File

@@ -28,6 +28,8 @@ class Threat:
var width: float ## Ширина занимаемого диапазона частот, МГц. var width: float ## Ширина занимаемого диапазона частот, МГц.
var selected: bool ## Флаг, что цель выбрана. var selected: bool ## Флаг, что цель выбрана.
var auto_selected: bool = false ## Флаг автомата для целей var auto_selected: bool = false ## Флаг автомата для целей
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
var nmfs:int ## Индекс модуля ФС, в зону действия которого попала цель
func _init(): clear_fflags() func _init(): clear_fflags()
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]