Доработка. Добавлена возможность включать помеху по сектору.

This commit is contained in:
MaD_CaT
2024-02-16 13:54:23 +03:00
parent 54e5f1bf37
commit 123abce741
11 changed files with 228 additions and 155 deletions

View File

@@ -23,7 +23,7 @@ func _on_bip_gui_input(event):
if event is InputEventMouseButton and event.pressed:
match event.button_index:
MOUSE_BUTTON_LEFT:
signaller.emit_signal('rto_threat_sel', name.to_int())
signaller.emit_signal('bip_pressed', name.to_int())
MOUSE_BUTTON_RIGHT:
if selected:
signaller.emit_signal('rto_threat_unsel', name.to_int())

View File

@@ -23,10 +23,9 @@ var save_modulate: Color
$button.set_disabled(val)
$back.disabled = val
if val:
save_modulate = $state.modulate
$state.modulate *= Color(1.0, 1.0, 1.0, 0.5)
$state.modulate.a = 0.5
else:
$state.modulate = save_modulate
$state.modulate.a = 1.0
get: return $button.disabled

View File

@@ -63,7 +63,7 @@ editor_description = "Кнопка для принудительного вкл
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
text = "JTIDS"
text = "СПРС"
metadata/rfi_name = "ozp1"
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]

View File

@@ -53,6 +53,8 @@ func on_row_pressed(i_row: int):
if interfer.thrs.has(ecm.ispp):
signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp])
else:
if interfer.fs.has(ecm.ispp):
signaller.emit_signal('fs_selected', ecm)
signaller.emit_signal('interfer_selected', ecm)

View File

@@ -70,7 +70,7 @@ func on_interfer_selected(ecm):
func on_ecm_update():
for item in range(len(TABLE_PARAMS)):
for item in len(TABLE_PARAMS):
$table.set_node_text(1, item, '')
$table.set_node_editable(1, item, false)
if $table.has_meta('ecm') == false: return

View File

@@ -1,17 +0,0 @@
extends NinePatchRect
# Called when the node enters the scene tree for the first time.
func _ready():
$grd_forced/btn_cancel.button_connect('pressed', Callable(self, 'on_btn_cancel_pressed').bind($grd_forced/btn_cancel))
func on_btn_cancel_pressed(btn):
signaller.emit_signal('interfer_off_all')
await get_tree().create_timer(0.1).timeout
btn.pressed = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

View File

@@ -21,28 +21,22 @@ extends Panel
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
var max_zoom: int ## Максимальный уровень детализации
var min_zoom: int ## Минимальный уровень детализации
var shift_pressed: bool ## Кнопка SHIFT нажата
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания
var btn_select: BtnSel = BtnSel.THREAT ## Текущее состояние кнопки выбора цели
var drag_pos_begin: Vector2 ## Точка начала перетаскивания
var max_zoom: int ## Максимальный уровень детализации
var min_zoom: int ## Минимальный уровень детализации
var shift_pressed: bool ## Кнопка SHIFT нажата
var strob_band_begin: float ## Ширина строба в момент начала перетаскивания
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания
signal drag_begin ## Вызывается в момент начала перетаскивания
signal drag_continue ## Вызывается во время продолжения перетаскивания
signal drag_end ## Вызывается в момент завершения перетаскивания
## Границы секторов блоков ФС по пеленгу
const fs_sectors: Dictionary = {
0: [0.0, 90.0],
3: [90.0, 180.0],
2: [180.0, 270.0],
1: [270.0, 360.0] }
## Границы секторов блоков ФС по частоте в режиме РТО
const fs_band_rto: Dictionary = {
0: [200.0, 250.0],
@@ -63,6 +57,12 @@ const fs_band_rls: Dictionary = {
5: [530.0, 540.0],
6: [540.0, 550.0] }
## Границы секторов блоков ФС по пеленгу
const fs_sectors: Dictionary = {
0: [0.0, 90.0],
3: [90.0, 180.0],
2: [180.0, 270.0],
1: [270.0, 360.0] }
const fs_freq: Dictionary = {
0: [400.0, 1200.0],
@@ -73,12 +73,10 @@ const fs_freq: Dictionary = {
5: [4400.0, 5200.0],
6: [5200.0, 6000.0] }
var fs_band = fs_band_rto # Текущий режим блоков ФС по частоте
var fs_default_colors: Array # Цвета по умолчанию для блоков ФС
var fs_colors: Array # Текущие цвета блоков ФС
var fs_selected: Array # Массив выбранных секторов
var th_selected: bool = false # Флаг, того, что выбрана цель.
var fs_selected: Dictionary # Словарь выбранных секторов
var fs_active: Dictionary # Словарь секторов назначенных на подавление
## Состояние перетаскивания
enum DragFSM {
@@ -87,6 +85,12 @@ enum DragFSM {
OFF ## Выключено
}
## Состояние перетаскивания
enum BtnSel {
SECTOR, ## В процессе
THREAT, ## Не активно, ожидание
FS ## Выключено
}
## Обработчик сигнала изменения списка целей
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size()
@@ -139,11 +143,13 @@ func _ready():
threats.connect('threat_update', Callable(self, 'on_threat_update'))
signaller.connect('zoom_complete', Callable(self, '_on_zoom_complete'))
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes))
signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes))
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'interfer_off_all'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
@@ -174,25 +180,28 @@ func on_threat_update(th):
## Обработчик выбора помехи для цели
func on_interfer_new(ecm):
if interfer.thrs.has(ecm.ispp):
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if ecm.krp != interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
if interfer.thrs.has(ecm.ispp):
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if ecm.krp != interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
set_fs_color(ecm)
## Обработчик выключения всех помех
func interfer_off_all():
func on_interfer_off_all():
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for bip in bips:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
fs_active.clear()
update_fs_colors()
## Обработчик сигнала обнаружения цели
@@ -210,31 +219,33 @@ func on_threat_lost(th) -> void:
bip.free()
## обработчик нажатия на цель на экране
func on_bip_pressed(th_id, _ecm_btns):
if btn_select == BtnSel.THREAT:
signaller.emit_signal('rto_threat_sel', th_id)
## Обработчик выбора РТО цели
func on_rto_threat_sel(th_id, ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
if th_id == item.name.to_int():
item.set_sel_visible(true)
unsel_fs_all(false)
else:
item.set_sel_visible(false)
for btn in ecm_btns:
btn.set_disabled(false)
th_selected = true
await get_tree().create_timer(0.2).timeout
th_selected = false
## Обработчик снятия выбора РТО цели
func on_rto_threat_unsel(th_id, ecm_btns):
func on_rto_threat_unsel(th_id, _ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
if th_id == item.name.to_int():
item.set_sel_visible(false)
break
for btn in ecm_btns:
btn.set_pressed(false)
btn.set_disabled(true)
set_ecm_btns_state(true)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба
@@ -246,13 +257,20 @@ func on_button_strobe_pressed() -> void:
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей
func on_button_select(btn_this, btn_others) -> void:
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
btn_select = btn_this.get_meta('state')
on_button_strobe_pressed()
signaller.emit_signal('rto_threat_unsel_all')
unsel_fs_all(true)
set_ecm_btns_state(true)
## Поведение радиокнопок в группе. Управляет состоянием кнопок в радиогруппе
func on_button_pressed(btn_this, btn_others) -> void:
var fs_arr: Array = []
for btn_other in btn_others: btn_other.set_pressed(btn_this == btn_other)
signaller.emit_signal('interfer_init', btn_this)
for key in fs_selected.keys():
fs_arr.append(get_fs_param(key))
signaller.emit_signal('interfer_init', btn_this, fs_arr)
## Управляет состоянием кнопок в радиогруппе при выборе помехи
@@ -329,7 +347,7 @@ func _input(event) -> void:
drag_fsm = DragFSM.DRAG
emit_signal('drag_begin', event)
else:
if (event.button_index == MOUSE_BUTTON_LEFT) and (not $btns_select/btn_strob.pressed):
if btn_select == BtnSel.FS:
sel_fs_sector(event)
drag_fsm = DragFSM.IDLE
emit_signal('drag_end', event)
@@ -351,40 +369,7 @@ func _on_zoom_complete(zoom: int) -> void:
var prefix = $btn_zoom.get_meta('prefix')
$btn_zoom/lbl.text = '%s %d' % [prefix, zoom]
$btn_zoom.set_meta('zoom', zoom)
# Обработчик нажатия по сектору формирователя сигналов
func sel_fs_sector(event):
var center: Vector2 = $tilemap.position
var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25))
var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0
if angle < 0:
angle +=360
var distance: float = event.position.distance_to(center + center_offset)
var sector: int
var band: int
var has_band: bool = false
for sec in fs_sectors.values():
if angle >= sec[0] and angle <= sec[1]:
sector = fs_sectors.find_key(sec)
for diap in fs_band.values():
if distance >= diap[0] and distance <= diap[1]:
band = fs_band.find_key(diap)
has_band = true
if not has_band:
return
var fs_index = band * 4 + sector
var select_color: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0))
if not th_selected:
if len(fs_selected) > 0:
for fs_sector in fs_selected:
fs_colors[fs_sector[0]] = fs_sector[1]
fs_selected.clear()
fs_selected.append([fs_index, fs_colors[fs_index]])
fs_colors[fs_index] = select_color
$canvas.set_band_colors(fs_colors)
signaller.emit_signal('rto_threat_unsel_all')
## Закрашивание по умолчанию блоков ФС цветами из настроек
func set_def_colors():
@@ -397,12 +382,92 @@ func set_def_colors():
fs_default_colors.append(col_arr[int(col)])
col = not col
col = not col
fs_colors = fs_default_colors
$canvas.set_band_colors(fs_default_colors)
# Обработчик нажатия по сектору формирователя сигналов
func sel_fs_sector(event):
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position
var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25))
var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0
if angle < 0:
angle +=360
var distance: float = event.position.distance_to(center + center_offset)
var sector: int
var band: int
var has_band: bool = false
for sec in fs_sectors.values():
if angle >= sec[0] and angle <= sec[1]:
sector = fs_sectors.find_key(sec)
for diap in fs_band.values():
if distance >= diap[0] and distance <= diap[1]:
band = fs_band.find_key(diap)
has_band = true
if not has_band:
return
var fs_index = band * 4 + sector
if event.button_index == MOUSE_BUTTON_LEFT:
fs_selected[fs_index] = null
else:
fs_selected.erase(fs_index)
update_fs_colors()
signaller.emit_signal('rto_threat_unsel_all')
var btn_state = len(fs_selected) == 0
set_ecm_btns_state(btn_state)
func set_fs_color(ecm):
var fs_index = get_fs_index(ecm)
if ecm.krp != interfer.INTERFER_OFF:
fs_active[fs_index] = null
else:
fs_active.erase(fs_index)
update_fs_colors()
func update_fs_colors():
var fs_colors = fs_default_colors.duplicate()
var color_ecm: Vector3 = ProjectSettings.get_setting('application/interfer/interfer_color', Vector3(0.58, 0.47, 0.51))
var color_select: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0))
for key in fs_active.keys():
fs_colors[key] = color_ecm
for key in fs_selected.keys():
fs_colors[key] = color_select
$canvas.set_band_colors(fs_colors)
func unsel_fs_all(need_btns_off: bool):
fs_selected.clear()
update_fs_colors()
if need_btns_off:
set_ecm_btns_state(true)
func set_ecm_btns_state(value: bool):
var btns: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
for btn in btns:
btn.set_pressed(false)
btn.set_disabled(value)
func get_fs_param(index: int) -> Array:
var freq = (fs_freq[index / 4][0] + fs_freq[index / 4][1])/2
var sector = (fs_sectors[index % 4][0] + fs_sectors[index % 4][1])/2 - 45.0
if sector < 0:
sector += 360.0
var width = fs_freq[index / 4][1] - fs_freq[index / 4][0]
return [sector, freq, width, index]
func on_fs_selected(ecm):
var fs_index = get_fs_index(ecm)
fs_selected.clear()
fs_selected[fs_index] = null
update_fs_colors()
func get_fs_index(ecm):
var sector: int
var band: int
var angle: float = ecm.kni + 45.0
@@ -416,10 +481,4 @@ func set_fs_color(ecm):
if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]:
band = fs_freq.find_key(diap)
var fs_index = band * 4 + sector
var fs_is_selected: bool = false
for item in fs_selected:
if fs_index == item[0]:
fs_is_selected = true
if not fs_is_selected:
fs_colors[fs_index] = color_ecm
$canvas.set_band_colors(fs_colors)
return fs_index

View File

@@ -137,6 +137,7 @@ size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Строб"
metadata/state = 0
[node name="btn_threats" parent="btns_select" instance=ExtResource("8_k0iv2")]
layout_mode = 2
@@ -144,6 +145,8 @@ size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Цель"
pressed = true
metadata/state = 1
[node name="btn_fs_sector" parent="btns_select" instance=ExtResource("8_k0iv2")]
layout_mode = 2
@@ -151,6 +154,7 @@ size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
text = "Сектор"
metadata/state = 2
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]

View File

@@ -2,7 +2,6 @@ extends Node
## Представление помехи
## Режимы помехи
const ITERFER_MODE = {
'off': ['Откл', ['freq', 'width']],
@@ -20,26 +19,29 @@ const ITERFER_MODE = {
'k1': ['K1', ['freq', 'width', 'dur', 'period']],
'ozp1': ['ОЗП-1', ['freq', 'width']] }
const TYPE_TH = ['th','fs']
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей
const INTERFER_OFF = 'off'
const STATE_TSMT = 5 ## Значение svk для цели, когда ответ ещё не получен
var msg_ss: int = 0 ## счётчик сообщений
var id_array: Array ## Массив id воздействий
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия
## Сеанс помехи
class Interfer:
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
var kni: = 0.0 ## Курсовой угол направления излучения.
var params: = {} ## Параметры помехи.
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var ss: int = 0 ## Счётчик сообщений.
var ispp: int = 0 ## Индекс сеанса.
var svk: = 0 ## Состояние сеанса. Ответ КАПСРПБ. Возможные значения в [param ITERFER_STATE].
var krp: String = '' ## Тип помехи. Возможные значения в [param INTERFER_MODE].
var powp: float = 0.0 ## Мощность излучения выраженная в процентах.
var kni: = 0.0 ## Курсовой угол направления излучения.
var params: = {} ## Параметры помехи.
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var type_th: String = '' ## Тип объекта по которой поставлена помеха
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -138,46 +140,60 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, ecms: Dictionary):
## Вызыватся, когда пользователь выбрал помеху и выбраны цели
func on_interfer_create(btn, sel_threats, unit, ecms):
func on_interfer_create(btn, sel_threats, fs_arr, _unit, ecms):
for item in sel_threats:
var ispp: int = 0
var interfer_name: String = btn.get_meta('rfi_name')
var param: Dictionary = {}
var kni: float = item.aoa
var id = item.id
param['freq'] = item.freq
param['width'] = item.width
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
var key = thrs.find_key(item.id)
if key != null:
ispp = key
else:
if interfer_name == 'off':
return
ispp = pop_id()
if ispp == 0: return
msg_ss += 1
var ecm: Interfer
if ecms.has(ispp):
ecm = ecms[ispp]
else:
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.svk = STATE_TSMT # Подготовка к передаче сообщения
ecm.ss = msg_ss
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = 100.0 # Необходимо добавить управление мощностью
thrs[ispp] = item.id
signaller.emit_signal('interfer_new', ecm)
interfer_create(btn, ecms, param, kni, id, thrs, item, TYPE_TH[0])
for item in fs_arr:
var param: Dictionary = {}
var kni: float = item[0]
var id = item[3]
param['freq'] = item[1]
param['width'] = item[2]
interfer_create(btn, ecms, param, kni, id, fs, item, TYPE_TH[1])
func interfer_create(btn, ecms, param, kni, id, dict, item, type_th):
var ispp: int = 0
var interfer_name: String = btn.get_meta('rfi_name')
if interfer_name == 'k1':
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
var key = dict.find_key(id)
if key != null:
ispp = key
else:
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
push_id(ecm.ispp)
thrs.erase(ispp)
ecm.tick_tx = Time.get_ticks_msec()
return
ispp = pop_id()
if ispp == 0: return
dict[ispp] = id
msg_ss += 1
var ecm: Interfer
if ecms.has(ispp):
ecm = ecms[ispp]
else:
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.svk = STATE_TSMT # Подготовка к передаче сообщения
ecm.ss = msg_ss
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = 100.0 # Необходимо добавить управление мощностью
ecm.type_th = type_th
signaller.emit_signal('interfer_new', ecm)
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm, ecms, thrs)
push_id(ecm.ispp)
thrs.erase(ispp)
ecm.tick_tx = Time.get_ticks_msec()
func send_ecm(ecm, unit):

View File

@@ -27,6 +27,11 @@ signal full_screen(id: int)
signal rto_threat_sel (th_id: int)
## Вызывается, когда пользователь нажимает на значёк цели
## [param th_id] - Отметка цели на экране
signal bip_pressed (th_id: int)
## Вызывается, когда пользователь снимает выделение с цели
## [param th_id] - Отметка цели на экране
signal rto_threat_unsel (th_id: int)
@@ -38,13 +43,13 @@ signal rto_threat_unsel_all ()
## Вызывается, когда пользователь выбирает помеху
## [param btn] - Нажатая кнопка помехи.
signal interfer_init (btn: PanelContainer)
signal interfer_init (btn: PanelContainer, fs_arr: Array)
## Вызывается, когда выбраны цели для постановки помех
## [param btn] - Нажатая кнопка помехи.[br]
## [param sel_threats] - Cписок целей.
signal interfer_create (btn: PanelContainer, sel_threats: Array)
signal interfer_create (btn: PanelContainer, sel_threats: Array, fs_arr: Array)
## Вызывается, когда создалась новая помеха
@@ -67,6 +72,11 @@ signal interfer_off_all ()
signal interfer_selected (ecm: interfer.Interfer)
## Вызывается, когда отключается выбираем помеху по сектору в таблице
## [param ecm] - Выбранная помеха
signal fs_selected(ecm: interfer.Interfer)
## Вызывается при запросе изменения уровня детализации карты
## [param zoom] - Вновь установленный уровень детализации
signal zoom_changed(zoom: int)

View File

@@ -93,13 +93,13 @@ func on_threat_selected(th, threats):
## Формирует список выбранных целей для включения помехи
func on_interfer_init(btn, threats):
func on_interfer_init(btn, fs_arr, threats):
var sel_threats: Array = []
for threat in threats.values():
if threat.selected:
sel_threats.append(threat)
if len(sel_threats):
signaller.emit_signal('interfer_create', btn, sel_threats)
if len(sel_threats) or (len(fs_arr)):
signaller.emit_signal('interfer_create', btn, sel_threats, fs_arr)
## Производит приём целей